@camstack/addon-pipeline 1.1.46 → 1.1.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/audio-analyzer/index.js +1 -1
  2. package/dist/audio-analyzer/index.mjs +1 -1
  3. package/dist/detection-pipeline/index.js +1 -1
  4. package/dist/detection-pipeline/index.mjs +1 -1
  5. package/dist/{dist-Bglbcd7H.mjs → dist-BXax-C-g.mjs} +260 -6
  6. package/dist/{dist-C3CWl8fV.js → dist-CSXbgmP-.js} +260 -6
  7. package/dist/motion-wasm/index.js +1 -1
  8. package/dist/motion-wasm/index.mjs +1 -1
  9. package/dist/pipeline-runner/index.js +24 -8
  10. package/dist/pipeline-runner/index.mjs +24 -8
  11. package/dist/recorder/index.js +1 -1
  12. package/dist/recorder/index.mjs +1 -1
  13. package/dist/{remote-source-plane-BrFvA0nx.mjs → remote-source-plane-D9mX0HiW.mjs} +1 -1
  14. package/dist/{remote-source-plane-C05A2DHs.js → remote-source-plane-Rbl_xds1.js} +1 -1
  15. package/dist/stream-broker/_stub.js +2 -2
  16. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BGyNZqVy.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-Dz7jhO6c.mjs} +3 -3
  17. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-o4tu_xuc.mjs +26 -0
  18. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-iB6N_WVh.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CK4BmiTK.mjs} +1 -1
  19. package/dist/stream-broker/{hostInit-uMl2Tcss.mjs → hostInit-DcMnvklS.mjs} +3 -3
  20. package/dist/stream-broker/index.js +32 -17
  21. package/dist/stream-broker/index.mjs +32 -17
  22. package/dist/stream-broker/remoteEntry.js +1 -1
  23. package/embed-dist/assets/{MaskShapeCanvas-DI4BY7W2-DvRngVr4.js → MaskShapeCanvas-DI4BY7W2-BSSjCL6j.js} +1 -1
  24. package/embed-dist/assets/{MotionZonesSettings-NcxxQN8r-ByQeOu3_.js → MotionZonesSettings-NcxxQN8r-BDb2ziPs.js} +1 -1
  25. package/embed-dist/assets/{PrivacyMaskSettings-APgPLF7p-Cs5XlrlU.js → PrivacyMaskSettings-APgPLF7p-ARYovxqE.js} +1 -1
  26. package/embed-dist/assets/{index-RqzZkNA8.js → index-ByiLuUQZ.js} +10 -10
  27. package/embed-dist/index.html +1 -1
  28. package/package.json +1 -1
  29. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-UM9hXKco.mjs +0 -26
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-D6vf50IK.js");
6
- const require_dist = require("../dist-C3CWl8fV.js");
6
+ const require_dist = require("../dist-CSXbgmP-.js");
7
7
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
8
8
  const require_model_download_service_C_IHWnXx = require("../model-download-service-C-IHWnXx-BLXzxpRB.js");
9
9
  let node_fs = require("node:fs");
@@ -1,5 +1,5 @@
1
1
  import { t as __require } from "../chunk-BdkLduGY.mjs";
2
- import { C as mapAudioLabelToMacro, I as errMsg, L as BaseAddon, U as hydrateSchema, h as audioAnalyzerCapability, l as HF_BASE_URL, m as audioAnalysisCapability, n as AUDIO_BACKEND_CHOICES, o as DEFAULT_AUDIO_ANALYZER_CONFIG } from "../dist-Bglbcd7H.mjs";
2
+ import { C as mapAudioLabelToMacro, I as errMsg, L as BaseAddon, U as hydrateSchema, h as audioAnalyzerCapability, l as HF_BASE_URL, m as audioAnalysisCapability, n as AUDIO_BACKEND_CHOICES, o as DEFAULT_AUDIO_ANALYZER_CONFIG } from "../dist-BXax-C-g.mjs";
3
3
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
4
4
  import { r as downloadFile } from "../model-download-service-C-IHWnXx-BPy6aoAx.mjs";
5
5
  import * as fs from "node:fs";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, {
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
5
  const require_chunk = require("../chunk-D6vf50IK.js");
6
- const require_dist = require("../dist-C3CWl8fV.js");
6
+ const require_dist = require("../dist-CSXbgmP-.js");
7
7
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
8
8
  const require_model_download_service_C_IHWnXx = require("../model-download-service-C-IHWnXx-BLXzxpRB.js");
9
9
  let _camstack_shm_ring = require("@camstack/shm-ring");
@@ -1,5 +1,5 @@
1
1
  import { t as __require } from "../chunk-BdkLduGY.mjs";
2
- import { H as createEvent, I as errMsg, L as BaseAddon, O as pipelineExecutorCapability, P as supportedRuntimes$1, S as hfModelUrl, U as hydrateSchema, V as EventCategory, X as sleep, a as COCO_TO_MACRO, b as detectionPipelineCapability, f as YAMNET_TO_MACRO, i as COCO_80_LABELS, j as runtimeDevices$1, q as parseJsonUnknown, r as AUDIO_MACRO_LABELS, t as APPLE_SA_TO_MACRO, v as defaultDeviceFor$1, x as evaluateZoneRules } from "../dist-Bglbcd7H.mjs";
2
+ import { H as createEvent, I as errMsg, L as BaseAddon, O as pipelineExecutorCapability, P as supportedRuntimes$1, S as hfModelUrl, U as hydrateSchema, V as EventCategory, X as sleep, a as COCO_TO_MACRO, b as detectionPipelineCapability, f as YAMNET_TO_MACRO, i as COCO_80_LABELS, j as runtimeDevices$1, q as parseJsonUnknown, r as AUDIO_MACRO_LABELS, t as APPLE_SA_TO_MACRO, v as defaultDeviceFor$1, x as evaluateZoneRules } from "../dist-BXax-C-g.mjs";
3
3
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
4
4
  import { a as isModelDownloaded, i as ensureModel, n as deleteModelFromDisk } from "../model-download-service-C-IHWnXx-BPy6aoAx.mjs";
5
5
  import { FrameRingReaderCache } from "@camstack/shm-ring";
@@ -4627,7 +4627,7 @@ function _instanceof(cls, params = {}) {
4627
4627
  return inst;
4628
4628
  }
4629
4629
  //#endregion
4630
- //#region ../types/dist/sleep-DiQ8xW1M.mjs
4630
+ //#region ../types/dist/sleep-DJaTV2D7.mjs
4631
4631
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4632
4632
  EventCategory["SystemBoot"] = "system.boot";
4633
4633
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5348,10 +5348,6 @@ function hydrateField(field, values) {
5348
5348
  };
5349
5349
  }
5350
5350
  const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
5351
- if (field.type === "password") return {
5352
- ...field,
5353
- value: ""
5354
- };
5355
5351
  const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
5356
5352
  return {
5357
5353
  ...field,
@@ -6839,6 +6835,9 @@ function method(input, output, options) {
6839
6835
  function event(data) {
6840
6836
  return { data };
6841
6837
  }
6838
+ var StaticDirOutputSchema$1 = object({ staticDir: string() });
6839
+ var VersionOutputSchema$1 = object({ version: string() });
6840
+ method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6842
6841
  var StaticDirOutputSchema = object({ staticDir: string() });
6843
6842
  var VersionOutputSchema = object({ version: string() });
6844
6843
  method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
@@ -13813,6 +13812,17 @@ var WidgetMetadataSchema = object({
13813
13812
  deviceContext: boolean().default(false),
13814
13813
  integrationContext: boolean().default(false)
13815
13814
  }),
13815
+ /**
13816
+ * Loadable BEFORE authentication. The normal widget registry listing
13817
+ * (`addon-widgets.listWidgets`) is auth-gated, so a pre-auth surface
13818
+ * (the login page) cannot discover a widget through it. A widget that
13819
+ * declares `preAuth: true` marks itself as safe to mount on a pre-auth
13820
+ * screen — it is surfaced through the PUBLIC `auth.listLoginMethods`
13821
+ * login-method contribution channel (see `login-method.cap.ts`) rather
13822
+ * than the authenticated registry, and its bundle is served by the
13823
+ * public `/api/addon-widgets/:addonId/*` static route. Defaults false.
13824
+ */
13825
+ preAuth: boolean().optional().default(false),
13816
13826
  /** Dashboard placement HINTS (operator can override per instance). */
13817
13827
  defaultSize: WidgetSizeEnum.default("md"),
13818
13828
  allowedSizes: array(WidgetSizeEnum).readonly().default([
@@ -14205,6 +14215,66 @@ method(object({
14205
14215
  password: string()
14206
14216
  }), AuthResultSchema.nullable(), { kind: "mutation" }), method(object({ state: string() }), string()), method(record(string(), string()), AuthResultSchema, { kind: "mutation" }), method(object({ token: string() }), AuthResultSchema.nullable());
14207
14217
  /**
14218
+ * `login-method` — collection cap through which auth addons contribute
14219
+ * their pre-auth login surfaces to the login page. This is the SINGLE,
14220
+ * generic mechanism that supersedes the dead `auth.listProviders` reader:
14221
+ * every auth addon (OIDC, magic-link, WebAuthn/passkey) registers a
14222
+ * `login-method` provider and the PUBLIC `auth.listLoginMethods`
14223
+ * procedure aggregates them for the unauthenticated login page.
14224
+ *
14225
+ * A contribution is a discriminated union on `kind`:
14226
+ *
14227
+ * - `redirect` — a declarative button. The login page renders a generic
14228
+ * button that navigates to `startUrl` (an addon-owned HTTP route).
14229
+ * Covers OIDC (`/addon/auth-oidc/<id>/start`) and magic-link with
14230
+ * ZERO shell-side JS. A future SSO addon plugs in the same way — the
14231
+ * login page needs NO change.
14232
+ *
14233
+ * - `widget` — a Module-Federation widget the login page mounts (via
14234
+ * `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
14235
+ * login ceremony, which must run `@simplewebauthn/browser` INSIDE the
14236
+ * addon bundle. The referenced widget also declares `preAuth: true` in
14237
+ * its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
14238
+ * stamps a public `bundleUrl` from `addonId` + `bundle`.
14239
+ *
14240
+ * Every contribution carries a `stage`:
14241
+ * - `primary` — shown on the first credentials screen (OIDC /
14242
+ * magic-link buttons; a future usernameless passkey).
14243
+ * - `second-factor` — shown AFTER the password leg, gated on the
14244
+ * returned `factors` (passkey-as-2FA today).
14245
+ *
14246
+ * `mount: skip` — the cap is read server-side by the core auth router
14247
+ * (`registry.getCollection('login-method')`), never mounted as its own
14248
+ * tRPC router.
14249
+ */
14250
+ /** When a login method renders in the two-phase login flow. */
14251
+ var LoginStageEnum = _enum(["primary", "second-factor"]);
14252
+ /** One login-method contribution — redirect button OR pre-auth widget. */
14253
+ var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
14254
+ kind: literal("redirect"),
14255
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
14256
+ id: string(),
14257
+ /** Operator-facing button label. */
14258
+ label: string(),
14259
+ /** lucide-react icon name. */
14260
+ icon: string().optional(),
14261
+ /** Addon-owned HTTP route the button navigates to (GET). */
14262
+ startUrl: string(),
14263
+ stage: LoginStageEnum
14264
+ }), object({
14265
+ kind: literal("widget"),
14266
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
14267
+ id: string(),
14268
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
14269
+ addonId: string(),
14270
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
14271
+ bundle: string(),
14272
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
14273
+ remote: WidgetRemoteSchema,
14274
+ stage: LoginStageEnum
14275
+ })]);
14276
+ method(_void(), array(LoginMethodContributionSchema).readonly());
14277
+ /**
14208
14278
  * Orchestrator-side destination metadata. The orchestrator computes
14209
14279
  * `id = <addonId>:<subId>` from its provider lookup so consumers
14210
14280
  * (admin UI, restore flow) see one canonical key.
@@ -16958,6 +17028,131 @@ method(object({
16958
17028
  auth: "admin"
16959
17029
  });
16960
17030
  /**
17031
+ * server-management — per-NODE singleton capability for a node's ROOT
17032
+ * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
17033
+ * agents).
17034
+ *
17035
+ * Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
17036
+ * on agents) carries the whole software stack in its npm dep tree, so ONE
17037
+ * version describes the node. Updates install into
17038
+ * `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
17039
+ * starter (probation boot + auto-rollback to N-1).
17040
+ *
17041
+ * Providers:
17042
+ * - HUB: `ServerUpdateService` behind the `server-provided` mount
17043
+ * (`buildServerProviders` in trpc.router.ts) — the default target for
17044
+ * unpinned calls.
17045
+ * - AGENT: `AgentUpdateService` registered by the agent bootstrap under
17046
+ * the synthetic `agent-runtime` addonId and declared in the agent's
17047
+ * `$hub.registerNode` manifest.
17048
+ *
17049
+ * Node routing: singleton caps get the codegen/runtime-builder `nodeId`
17050
+ * injection on every method — `input.nodeId` (or `nodePin(nodeId)` from the
17051
+ * SDK) routes the call to that node's provider via the standard remote
17052
+ * proxy (`createCapabilityProxy` → `$agent-cap-fwd` → the agent's
17053
+ * in-process provider lookup). No `nodeId` → the hub's own provider.
17054
+ *
17055
+ * Spec: docs/superpowers/specs/2026-07-12-runtime-updatable-node-packages-design.md
17056
+ */
17057
+ /**
17058
+ * Where the running hub's code was loaded from:
17059
+ * - `workspace` — dev checkout (tsx / workspace dist); the starter defers to
17060
+ * plain resolution and runtime updates are refused.
17061
+ * - `baked` — the immutable image seed closure (no data-dir root active).
17062
+ * - `data-root` — the runtime-updatable `<dataDir>/server-root` closure.
17063
+ */
17064
+ var ServerBootModeSchema = _enum([
17065
+ "workspace",
17066
+ "baked",
17067
+ "data-root"
17068
+ ]);
17069
+ /**
17070
+ * Update lifecycle state:
17071
+ * - `idle` / `checking` / `staging` — steady / in-flight registry work.
17072
+ * - `pending-restart` — a version is staged and the node has NOT yet
17073
+ * restarted onto it (still running the OLD version).
17074
+ * - `awaiting-confirmation` — the node HAS restarted onto the staged version
17075
+ * (it is the active probation boot) and is waiting to confirm boot-health.
17076
+ * Apply/rollback are refused in this state and the node must NOT be
17077
+ * manually restarted, or the probation boot auto-rolls-back.
17078
+ */
17079
+ var ServerUpdateStateSchema = _enum([
17080
+ "idle",
17081
+ "checking",
17082
+ "staging",
17083
+ "pending-restart",
17084
+ "awaiting-confirmation"
17085
+ ]);
17086
+ var ServerRollbackInfoSchema = object({
17087
+ /** The version that failed (or was manually rolled back). */
17088
+ fromVersion: string(),
17089
+ /** The version rolled back to; null = the baked seed. */
17090
+ toVersion: string().nullable(),
17091
+ atMs: number(),
17092
+ reason: string()
17093
+ });
17094
+ var ServerPackageStatusSchema = object({
17095
+ /** Root package name (`@camstack/server` on the hub). */
17096
+ packageName: string(),
17097
+ /** Version of the code the running process ACTUALLY loaded. */
17098
+ runningVersion: string().nullable(),
17099
+ /** Node.js runtime version the node's process runs on (`process.versions.node`). */
17100
+ nodeRuntimeVersion: string().nullable(),
17101
+ /** Active data-dir root version; null when booted from seed/workspace. */
17102
+ activeVersion: string().nullable(),
17103
+ /** N-1 version kept for rollback; null when no previous version exists. */
17104
+ previousVersion: string().nullable(),
17105
+ /** Version of the immutable baked seed closure (image fallback). */
17106
+ seedVersion: string().nullable(),
17107
+ /** Latest registry version from the most recent check (null = never checked). */
17108
+ latestVersion: string().nullable(),
17109
+ updateAvailable: boolean(),
17110
+ bootMode: ServerBootModeSchema,
17111
+ updateState: ServerUpdateStateSchema,
17112
+ /** Version staged + awaiting its probation boot, when one is pending. */
17113
+ pendingVersion: string().nullable(),
17114
+ /** Set when the last freshly-activated version failed its boot health-check. */
17115
+ rolledBack: ServerRollbackInfoSchema.nullable(),
17116
+ /**
17117
+ * True when `server-root/state.json` EXISTS but is unreadable/corrupt — the
17118
+ * hub is running from the baked seed (or workspace) while installed data-dir
17119
+ * versions are being IGNORED. Surfaced as a warning in the UI.
17120
+ */
17121
+ stateFileCorrupt: boolean(),
17122
+ lastCheckedAtMs: number().nullable()
17123
+ });
17124
+ var ServerUpdateCheckResultSchema = object({
17125
+ packageName: string(),
17126
+ runningVersion: string().nullable(),
17127
+ latestVersion: string().nullable(),
17128
+ updateAvailable: boolean(),
17129
+ checkedAtMs: number(),
17130
+ /** Non-null when the registry lookup failed (offline, bad registry, …). */
17131
+ error: string().nullable()
17132
+ });
17133
+ var ServerUpdateActionResultSchema = object({
17134
+ accepted: boolean(),
17135
+ targetVersion: string().nullable(),
17136
+ /** True when a graceful restart was scheduled to apply the change. */
17137
+ restarting: boolean(),
17138
+ message: string()
17139
+ });
17140
+ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), ServerUpdateCheckResultSchema, {
17141
+ kind: "mutation",
17142
+ auth: "admin"
17143
+ }), method(object({
17144
+ /** Explicit target version; omitted = latest from the registry. */
17145
+ version: string().optional() }), ServerUpdateActionResultSchema, {
17146
+ kind: "mutation",
17147
+ auth: "admin"
17148
+ }), method(_void(), ServerUpdateActionResultSchema, {
17149
+ kind: "mutation",
17150
+ auth: "admin"
17151
+ }), method(_void(), ServerUpdateActionResultSchema, {
17152
+ kind: "mutation",
17153
+ auth: "admin"
17154
+ });
17155
+ /**
16961
17156
  * Query filter for settings-store collections.
16962
17157
  */
16963
17158
  var QueryFilterSchema = object({
@@ -19039,6 +19234,16 @@ var TopologyCategorySchema = object({
19039
19234
  healthy: number(),
19040
19235
  addons: array(TopologyCategoryAddonSchema).readonly()
19041
19236
  });
19237
+ /**
19238
+ * The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
19239
+ * `@camstack/agent` on agents) as reported by its `registerNode` manifest —
19240
+ * version visibility for the Server management surface. Nullable: offline
19241
+ * rows and pre-phase-2 nodes report none.
19242
+ */
19243
+ var TopologyRootPackageSchema = object({
19244
+ name: string(),
19245
+ version: string()
19246
+ });
19042
19247
  var TopologyNodeSchema = object({
19043
19248
  id: string(),
19044
19249
  name: string(),
@@ -19062,7 +19267,8 @@ var TopologyNodeSchema = object({
19062
19267
  status: string()
19063
19268
  })).readonly(),
19064
19269
  processes: array(TopologyProcessSchema).readonly(),
19065
- categories: array(TopologyCategorySchema).readonly()
19270
+ categories: array(TopologyCategorySchema).readonly(),
19271
+ rootPackage: TopologyRootPackageSchema.nullable()
19066
19272
  });
19067
19273
  var CapUsageEdgeSchema = object({
19068
19274
  callerAddonId: string(),
@@ -21895,6 +22101,12 @@ Object.freeze({
21895
22101
  addonId: null,
21896
22102
  access: "create"
21897
22103
  },
22104
+ "loginMethod.getLoginMethods": {
22105
+ capName: "login-method",
22106
+ capScope: "system",
22107
+ addonId: null,
22108
+ access: "view"
22109
+ },
21898
22110
  "mediaPlayer.next": {
21899
22111
  capName: "media-player",
21900
22112
  capScope: "device",
@@ -23257,6 +23469,36 @@ Object.freeze({
23257
23469
  addonId: null,
23258
23470
  access: "create"
23259
23471
  },
23472
+ "serverManagement.applyServerUpdate": {
23473
+ capName: "server-management",
23474
+ capScope: "system",
23475
+ addonId: null,
23476
+ access: "create"
23477
+ },
23478
+ "serverManagement.checkServerUpdate": {
23479
+ capName: "server-management",
23480
+ capScope: "system",
23481
+ addonId: null,
23482
+ access: "create"
23483
+ },
23484
+ "serverManagement.getServerPackageStatus": {
23485
+ capName: "server-management",
23486
+ capScope: "system",
23487
+ addonId: null,
23488
+ access: "view"
23489
+ },
23490
+ "serverManagement.restartServer": {
23491
+ capName: "server-management",
23492
+ capScope: "system",
23493
+ addonId: null,
23494
+ access: "create"
23495
+ },
23496
+ "serverManagement.rollbackServerUpdate": {
23497
+ capName: "server-management",
23498
+ capScope: "system",
23499
+ addonId: null,
23500
+ access: "create"
23501
+ },
23260
23502
  "settingsStore.count": {
23261
23503
  capName: "settings-store",
23262
23504
  capScope: "system",
@@ -24121,6 +24363,18 @@ Object.freeze({
24121
24363
  addonId: null,
24122
24364
  access: "view"
24123
24365
  },
24366
+ "viewerUi.getStaticDir": {
24367
+ capName: "viewer-ui",
24368
+ capScope: "system",
24369
+ addonId: null,
24370
+ access: "view"
24371
+ },
24372
+ "viewerUi.getVersion": {
24373
+ capName: "viewer-ui",
24374
+ capScope: "system",
24375
+ addonId: null,
24376
+ access: "view"
24377
+ },
24124
24378
  "waterHeater.setAway": {
24125
24379
  capName: "water-heater",
24126
24380
  capScope: "device",