Commit graph

4191 commits

Author SHA1 Message Date
anthropic-code-agent[bot]
f7a44df69f Initial plan 2026-07-27 13:47:43 -05:00
Andrew Knous
e23c987516
Merge pull request #1448 from PepperDash/fix-cecportcontroller-null-streamcec-guard
Fix cecportcontroller null streamcec guard
2026-07-16 09:40:19 -04:00
copilot-swe-agent[bot]
14cd082076
Remove redundant IRoutingInputsOutputs filtering in route mapping loops 2026-07-16 13:26:25 +00:00
copilot-swe-agent[bot]
36c15b8d95
Clarify CecPortController subscription XML comment 2026-07-16 13:25:25 +00:00
erikdred
fbf4c56403
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-16 09:23:18 -04:00
erikdred
f4cb17314d
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-16 09:21:45 -04:00
Erik Meyer
aa76551500 fix: guard CecPortController against null StreamCec and lazily subscribe 2026-07-16 08:40:33 -04:00
Neil Dorin
12828e8dd4
Merge pull request #1446 from PepperDash/feature-add-iHasDspPresetSave
feat: add IHasDspPresetSave interface for DSP preset management
2026-07-14 11:29:44 -06:00
Jonathan Arndt
4dca16e9bd
fix: Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-13 16:09:45 -07:00
Jonathan Arndt
d4284bd59f
fix: Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-13 16:08:10 -07:00
Jonathan Arndt
a8ec831064 feat: add IHasDspPresetSave interface for DSP preset management 2026-07-13 12:58:52 -07:00
Jason DeVito
6ceddcf571
Merge pull request #1439 from PepperDash/feature/version-data-touchpanel-ui-schema
fix(config): version data, packageManifest API, and v1/v2 config detection
2026-07-08 10:25:55 -05:00
jkdevito
02f507ccb1 fix(mobile-control): address PR review feedback on version tracking
- ConnectedClientVersions now deep-copies each ConnectedClientVersionInfo
  when snapshotting, so external callers can't mutate the internally
  tracked, lock-protected instances (Copilot review).
- ShowInfo now prints "(not configured)" for an empty ExpectedAppVersion,
  matching the match/mismatch calculation which already treats empty the
  same as not-configured (Copilot review).
- GetPackageManifestRequestHandler.PopulatePackages filters out null
  entries from the config-supplied packages list before processing, so a
  malformed "packages": [null, ...] in user-edited config JSON degrades
  gracefully instead of throwing (Copilot review).
2026-07-08 10:07:20 -05:00
Jason DeVito
22ef9cf7c2
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-07-08 09:54:14 -05:00
jkdevito
02216372bc feat(mobile-control): track and validate UI client app versions
Extend the /system/clientJoined handler to accept an optional
`appVersion` field reported by connecting UI clients (e.g. the
React app's build-time APP_VERSION), so Essentials can record and
validate what's actually running against the configured
versions.touchpanelWrapperApp version.

- Add ConnectedClientVersionInfo to capture clientId, roomKey,
  touchpanelKey, reported/expected app version, and last-seen time.
- Add MobileControlSystemController.TrackClientAppVersion(), storing
  results in a new thread-safe ConnectedClientVersions dictionary and
  logging a warning on version mismatch.
- Expose ConnectedClientVersions as a public read-only property for
  diagnostics.
- Surface reported vs. expected versions per client in the
  `mobileinfo` console command output.

No wire protocol changes required; content is passed as-is over the
existing clientJoined message.
2026-07-07 17:41:04 -05:00
jkdevito
c323c872fc fix: match main assembly by PackageId metadata instead of AssemblyName 2026-07-07 17:20:22 -05:00
jkdevito
1e63b10aa4 fix: report main assembly's PackageId (PepperDashEssentials) in packageManifest API 2026-07-07 17:14:34 -05:00
jkdevito
47e186d8f4 fix(config): correctly detect v1 vs v2 config and preserve versions node
- Determine config version by presence of "system" and "template" nodes
  instead of "versions", since a v2 config can also include "versions"
  and was previously being skipped from merging as a result.
- Preserve the "versions" node after merging a v1 config, since
  PortalConfigReader.MergeConfigs does not carry it forward.
2026-07-07 16:55:43 -05:00
jkdevito
2f7789b374 fix: prefer embedded PackageId assembly metadata in packageManifest API
WHAT / WHY
----------
GetPackageManifestRequestHandler previously identified a loaded plugin's
NuGet PackageId by fuzzy-matching AssemblyTitle/AssemblyName against the
config's packageId - a chain that silently fails for any plugin whose
AssemblyTitle/AssemblyName doesn't happen to match its PackageId (verified
against real shipped plugin DLLs; see FINDINGS-nuget-packageid-gaps.md).

epi-symetrix-dsp and epi-shure-mxa have already backported a
Directory.Build.props change that embeds
`<AssemblyMetadata Include="PackageId" Value="$(PackageId)" />`, giving
Essentials an unambiguous, authoritative PackageId via
AssemblyMetadataAttribute("PackageId", ...) instead of guessing. Validated
by building both plugins and inspecting the generated AssemblyInfo.cs.

Changes:
- src/Directory.Build.props: add the same AssemblyMetadata PackageId item,
  so every Essentials-owned assembly (Core, Essentials, Devices.Common,
  MobileControl, MobileControl.Messengers) now embeds its real PackageId
  too - previously none of them did.
- GetPackageManifestRequestHandler.cs:
  - PopulatePackages: read AssemblyMetadataAttribute("PackageId", ...) from
    loaded plugin assemblies and use it as the first-priority match/identity
    signal, ahead of the AssemblyTitle -> AssemblyName -> AssemblyName-minus-
    ".4Series" fallback chain. Loaded-but-unconfigured plugins that carry
    this metadata now report a PackageId in the manifest instead of null.
  - PopulateEssentials: replace the hardcoded "PepperDash.Essentials"
    fallback (which matched none of the real PackageIds) with the reflected
    value from PepperDash.Essentials.Core's own assembly metadata.

Fully backward compatible: plugins without the updated Directory.Build.props
(most existing epi-* repos today) fall through to the prior fallback chain
unchanged.

RECOMMENDATIONS - Essentials & sub-projects (this repo)
--------------------------------------------------------
- AssemblyName/AssemblyTitle drift from PackageId across sub-projects
  (confirmed via generated AssemblyInfo.cs, not assumed):
    PepperDash.Essentials.Core:                 PackageId "PepperDash.Essentials.Core"
                                                 vs AssemblyName "PepperDash_Essentials_Core"
    PepperDash.Essentials.Devices.Common:        PackageId "PepperDash.Essentials.Devices.Common"
                                                 vs AssemblyName "Essentials Devices Common"
    PepperDash.Essentials.MobileControl:         PackageId "PepperDash.Essentials.MobileControl"
                                                 vs AssemblyName "epi-essentials-mobile-control"
    PepperDash.Essentials.MobileControl.Messengers: PackageId "...Messengers"
                                                 vs AssemblyName "mobile-control-messengers"
  Only PepperDash.Essentials and PepperDash.Core happen to agree. Fixing
  AssemblyName changes the physical .dll filename for existing consumers,
  so this needs a deliberate, versioned decision - not bundled here.
- Once this ships and bakes for a release or two, consider deleting the
  now-redundant "PepperDash.Essentials" hardcoded string entirely and the
  Product/AssemblyTitle-based Name fallback, since AssemblyMetadata PackageId
  supersedes both for any assembly built after this change.

RECOMMENDATIONS - EPI plugin repos (epi-*)
-------------------------------------------
- Backport `<AssemblyMetadata Include="PackageId" Value="$(PackageId)" />`
  into every existing epi-* repo's src/Directory.Build.props (recommendation
  E from FINDINGS-nuget-packageid-gaps.md). This is opt-in and additive -
  repos that skip it keep working via the existing fallback chain, but gain
  nothing until they backport it and cut a new release.
- Land the corresponding fix in EssentialsPluginTemplate
  (src/Directory.Build.props + src/epi-make-model.4Series.csproj) so all
  *new* plugin repos get this by default, and fix the template's own
  AssemblyTitle/PackageId drift ("Plugin" vs "Plugins") while there.
- Already-published plugin versions can't be retroactively fixed - this only
  takes effect on a plugin's next release after adopting the template change.

WORKFLOW RECOMMENDATIONS
-------------------------
- Extend workflow-templates' essentialsplugins-4Series-builds.yml "Check
  Package Name" step to validate the built DLL's embedded
  AssemblyMetadataAttribute("PackageId", ...) (and/or AssemblyTitle as a
  fallback) against the repo-derived expected package name - today it only
  compares the .nupkg filename, which would not have caught drift like
  epi-display-samsung-mdc's AssemblyTitle mismatch.
- Sequence this after the template + per-repo backports have landed and
  baked for a release cycle, otherwise it will fail CI for every epi-*
  repo that hasn't picked up the Directory.Build.props change yet. Gate it
  behind the existing bypassPackageCheck input for repos not yet ready.
2026-07-07 16:22:23 -05:00
jkdevito
588057f3ba feat: add packageManifest CWS API route
New GET https://{ip}/cws/app{xx}/api/packageManifest route returning a JSON
package manifest (Essentials + plugins + user interfaces) shaped to hydrate
the vsce-essentials-version-manager extension's VersionsSnapshot object.

- EssentialsConfig.cs: add [JsonProperty("versions")] to EssentialsConfig.Versions
  (was attribute-less); add NugetVersion.Name; NullValueHandling.Ignore on
  PackageId/RepoUrl/Name.
- New GetPackageManifestRequestHandler: deep-copies the config's VersionData
  (never mutates the live config object), then enriches it via reflection:
  - essentials: version from Global.AssemblyVersion, repoUrl/name from the
    RepositoryUrl AssemblyMetadata + AssemblyProduct of
    PepperDash.Essentials.Core's own assembly (PluginLoader.EssentialsAssembly.Assembly
    is null at runtime due to a pre-existing name-matching bug, so this route
    reads its own loaded assembly instead), packageId from config or a constant.
  - packages[]: merges PluginLoader.EssentialsPluginAssemblies (matched to config
    packages by packageId via AssemblyTitle -> AssemblyName -> AssemblyName minus
    a trailing .4Series suffix) with reflection supplying version and filling
    missing repoUrl/name; unmatched loaded assemblies are emitted without a
    packageId; configured-but-not-loaded packages pass through unchanged.
  - userInterfaces/touchpanelWrapperApp are passed through from config as-is.
  - Entries with no resolvable version are skipped (the extension's parser drops
    entries whose version isn't a string).
- EssentialsWebApi.cs: register the new packageManifest route next to versions.

Build verified clean (Core + Essentials program, 0 errors). Not yet tested on
hardware.
2026-07-05 20:57:05 -05:00
jkdevito
64d60dacc2 feat: update version object
Add touchpanelWrapperApp, userInterfaces, and repoUrl to VersionData config schema

VersionData/NugetVersion previously only modeled the essentials and
packages entries under the versions node. This adds support for the
touchpanelWrapperApp (single object) and userInterfaces (array) nodes,
plus a repoUrl property on NugetVersion so it round-trips instead of
being silently dropped, matching the schema produced by the
vsce-essentials-version-manager extension.
2026-07-02 17:13:26 -05:00
Neil Dorin
f34d7223e0
Merge pull request #1438 from PepperDash/set-secrets-formatting 2026-07-02 14:08:32 -06:00
Andrew Welker
68c44e46ae fix: string formatting for console responses was incorrect in some cases and causing exceptions 2026-07-02 15:06:51 -05:00
Neil Dorin
4f1eb979d3
Merge pull request #1436 from PepperDash/claude/deprecate-imobilecontrolmessengerwithsubscriptions 2026-06-26 18:11:17 -06:00
anthropic-code-agent[bot]
8ac4eb7584
refactor: marked mobile control subscription items as obsolete
Co-authored-by: ndorin <18535240+ndorin@users.noreply.github.com>
2026-06-26 22:32:56 +00:00
Neil Dorin
0240887d93
Clarify summary for EnableMessengerSubscriptions property
Updated the summary comment for EnableMessengerSubscriptions property to clarify its purpose.
2026-06-26 15:57:52 -06:00
copilot-swe-agent[bot]
640bd7a8a7
Update XML summary for EnableMessengerSubscriptions to reflect obsolete status 2026-06-26 21:55:49 +00:00
Neil Dorin
2fac0ca926
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-06-26 14:32:22 -06:00
anthropic-code-agent[bot]
af5611e403
Mark IMobileControlMessengerWithSubscriptions and EnableMessengerSubscriptions as obsolete
All messengers are now subscription based in v3.x, making these
constructs no longer necessary.

Closes #1435

Agent-Logs-Url: https://github.com/PepperDash/Essentials/sessions/bda64c9c-5343-412b-801f-5e60816bc38d

Co-authored-by: ndorin <18535240+ndorin@users.noreply.github.com>
2026-06-26 20:11:48 +00:00
anthropic-code-agent[bot]
3286d27898
Initial plan 2026-06-26 20:09:32 +00:00
aknous
8d3edde28c feat: adds config props to disable power on/off automation 2026-06-17 10:06:00 -04:00
equinoy
a220474101
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-06-15 10:05:50 -05:00
equinoy
b982219e2f
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-06-15 10:05:36 -05:00
equinoy
e03e45ccf5
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-06-15 10:05:25 -05:00
equinoy
a7b839296e
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-06-15 10:05:14 -05:00
erikdred
a63da82cc3
Merge pull request #1432 from PepperDash/fix/web-debug-url
Fix/web debug url
2026-06-12 17:15:05 -04:00
Neil Dorin
3974455337 fix: add port forward timeout handling in DebugSessionRequestHandler 2026-06-12 15:08:34 -06:00
Neil Dorin
782bb6c057 fix: improve CS LAN IP handling and update fallback debug session URL in DebugSessionRequestHandler 2026-06-12 14:52:35 -06:00
Neil Dorin
907eb2f397 fix: add csIp handling and update debug session URL in DebugSessionRequestHandler 2026-06-12 14:29:49 -06:00
Neil Dorin
72a4c63a06
Merge pull request #1430 from PepperDash/feature/add-escape-handling-for-devjson
Feature/add escape handling for devjson
2026-06-12 11:31:24 -06:00
Neil Dorin
5f26cb98fd
Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
2026-06-12 11:28:39 -06:00
jkdevito
6a4e3d5be2 feat: add port forwarding functionality for debug websocket in DebugSessionRequestHandler 2026-06-12 11:26:56 -05:00
Neil Dorin
d18fca8a98 fix: handle null properties in DeviceMessageBase and DeviceStateMessageBase 2026-06-11 17:36:30 -04:00
aknous
162a06f9e9 feat: adds interface for wireless sharing 2026-06-11 09:41:39 -04:00
Neil Dorin
75587c361f
Merge pull request #1428 from PepperDash/tieline-mapping
Fix cache clearing for impossibleRoutes
2026-06-09 09:25:42 -06:00
Andrew Welker
c3511cd1a6 fix: remove impossibleRoutes cache
The cache wasn't being cleared correctly, and was an unnecessary
add.
2026-06-09 10:18:25 -05:00
Andrew Welker
b32bab0d33 fix: remove impossibleRoutes cache
The cache wasn't being cleared correctly, and was an unnecessary
add.
2026-06-09 09:32:59 -05:00
Neil Dorin
1ce86dab29 fix: add escape handling for port forwarding in DebugSessionRequestHandler 2026-06-02 14:10:33 -06:00
Neil Dorin
77c700c565 fix: add escape handling for byte arrays and strings in DeviceJsonApi 2026-06-02 11:25:48 -06:00
Neil Dorin
aa050121ae
Merge pull request #1424 from PepperDash/fix/videoCodec-routing-issues
fix: update routing logic
2026-05-22 10:18:53 -06:00