@camstack/addon-provider-reolink 1.1.21 → 1.1.22

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 (3) hide show
  1. package/dist/addon.js +487 -282
  2. package/dist/addon.mjs +487 -282
  3. package/package.json +4 -1
package/dist/addon.mjs CHANGED
@@ -4650,7 +4650,7 @@ function _instanceof(cls, params = {}) {
4650
4650
  return inst;
4651
4651
  }
4652
4652
  //#endregion
4653
- //#region ../types/dist/sleep-CZDdRBua.mjs
4653
+ //#region ../types/dist/sleep-DJaTV2D7.mjs
4654
4654
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4655
4655
  EventCategory["SystemBoot"] = "system.boot";
4656
4656
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -4836,6 +4836,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
4836
4836
  */
4837
4837
  EventCategory["PipelineCameraUpdated"] = "pipeline.camera-updated";
4838
4838
  /**
4839
+ * The cluster camera-source OWNER changed (`clusterRoles.ingestNode`).
4840
+ * Emitted by addon-pipeline-orchestrator whenever it (re)derives node
4841
+ * capabilities — at boot, on agent online/offline, and on an ingest-node
4842
+ * flip. Carries the resolved `ownerNodeId`. The stream-broker consumes it to
4843
+ * keep its ingest-owner-gate decision current WITHOUT a per-`ensureBroker`
4844
+ * cross-process `getIngestOwner` query (push the authority's decision instead
4845
+ * of polling it on the hot path). Idempotent state — re-emitted on every
4846
+ * topology change, so a dropped event self-heals on the next one (plus the
4847
+ * broker's long backstop reconcile query).
4848
+ */
4849
+ EventCategory["PipelineIngestOwnerChanged"] = "pipeline.ingest-owner-changed";
4850
+ /**
4839
4851
  * Periodic snapshot of per-node pipeline-runner load
4840
4852
  * (`RunnerLocalLoad`). Emitted ~1Hz by every runner so UI dashboards
4841
4853
  * subscribe instead of polling `pipelineRunner.getLocalLoad`.
@@ -5359,10 +5371,6 @@ function hydrateField(field, values) {
5359
5371
  };
5360
5372
  }
5361
5373
  const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
5362
- if (field.type === "password") return {
5363
- ...field,
5364
- value: ""
5365
- };
5366
5374
  const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
5367
5375
  return {
5368
5376
  ...field,
@@ -6750,6 +6758,9 @@ function method(input, output, options) {
6750
6758
  function event(data) {
6751
6759
  return { data };
6752
6760
  }
6761
+ var StaticDirOutputSchema$1 = object({ staticDir: string() });
6762
+ var VersionOutputSchema$1 = object({ version: string() });
6763
+ method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6753
6764
  var StaticDirOutputSchema = object({ staticDir: string() });
6754
6765
  var VersionOutputSchema = object({ version: string() });
6755
6766
  method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
@@ -6943,6 +6954,36 @@ var ModelFormatsSchema = object({
6943
6954
  tflite: ModelFormatEntrySchema.optional(),
6944
6955
  pt: ModelFormatEntrySchema.optional()
6945
6956
  });
6957
+ /**
6958
+ * Variant-selector grouping axes. Shared by the full `ModelCatalogEntry` and by
6959
+ * the reduced `PipelineModelOption` returned in `pipeline.getSchema()` so the
6960
+ * grouped Family→Tier→Variant picker renders identically in the config UI and
6961
+ * in the pipeline/device steppers. The flat `id` stays the source of truth for
6962
+ * resolution/download/persistence; this is a presentation overlay resolved back
6963
+ * to an `id`.
6964
+ */
6965
+ var ModelVariantGroupSchema = object({
6966
+ /** Top-level family, e.g. `yolo26` (later `d-fine`, `rf-detr`). */
6967
+ family: string(),
6968
+ /** Size within the family, e.g. `n` | `s` | `m` | `l`. */
6969
+ tier: string(),
6970
+ /** Quantization axis. Omit ⇒ the fp32 base build. */
6971
+ precision: _enum(["fp32", "int8"]).optional(),
6972
+ /**
6973
+ * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
6974
+ * latency-optimized export (e.g. ReLU-activation variant) — the slot the
6975
+ * future performance variants plug into.
6976
+ */
6977
+ optimization: _enum(["standard", "fast"]).optional(),
6978
+ /**
6979
+ * Input-resolution axis (square input side, px). Omit ⇒ the family's native
6980
+ * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
6981
+ * cheap latency lever — especially on Apple ANE and the Intel N100 — at a
6982
+ * small-object accuracy cost. Mirrors the model's `inputSize` but lifted onto
6983
+ * the group so the selector can offer it as a variant axis.
6984
+ */
6985
+ resolution: number().int().positive().optional()
6986
+ });
6946
6987
  var ModelCatalogEntrySchema = object({
6947
6988
  id: string(),
6948
6989
  name: string(),
@@ -6972,7 +7013,43 @@ var ModelCatalogEntrySchema = object({
6972
7013
  * Auxiliary files required at runtime (labels JSON, charset dict, etc.).
6973
7014
  * Downloaded into the same modelsDir alongside the model file.
6974
7015
  */
6975
- extraFiles: array(ModelExtraFileSchema).readonly().optional()
7016
+ extraFiles: array(ModelExtraFileSchema).readonly().optional(),
7017
+ /**
7018
+ * LEGACY entry — retained in the catalog so a persisted operator selection
7019
+ * still RESOLVES (and can be re-activated), but hidden from the selectable
7020
+ * model list and excluded from the auto format-default pick. Set on the
7021
+ * superseded / consolidated models (older lineages, redundant fp16 IRs) so
7022
+ * the active lineup stays the coherent curated ladder without deleting a
7023
+ * model anyone may still be pinned to. `resolveModelForFormat` keeps honoring
7024
+ * an explicit legacy id that has a build for the node's format.
7025
+ */
7026
+ legacy: boolean().optional(),
7027
+ /**
7028
+ * Measured quality/latency metadata — populated from the benchmark addon on
7029
+ * the real node classes. Absent = not yet measured (most entries today; the
7030
+ * catalog historically carried only `sizeMB`, a poor cross-architecture
7031
+ * speed proxy). `p95LatencyMs` is keyed by node class (e.g. `n100`, `mac`).
7032
+ */
7033
+ metrics: object({
7034
+ map50: number().optional(),
7035
+ p95LatencyMs: record(string(), number()).optional()
7036
+ }).optional(),
7037
+ /**
7038
+ * SPDX-ish license id of the model weights (e.g. `AGPL-3.0` for Ultralytics
7039
+ * YOLO26, `GPL-3.0` for YOLOv9, `Apache-2.0` for D-FINE/RF-DETR). Matters for
7040
+ * the retraining addon and any future commercial distribution.
7041
+ */
7042
+ license: string().optional(),
7043
+ /**
7044
+ * Variant-selector grouping. The UI groups models by `family` + `tier` and
7045
+ * offers `precision` / `optimization` as variant axes WITHIN a tier — so all
7046
+ * of a family's sizes and quantizations collapse into one grouped picker
7047
+ * instead of a flat list of `yolo26s`, `yolo26s-int8`, … Absent ⇒ ungrouped
7048
+ * (legacy / custom models) — never shown in the grouped selector. The flat
7049
+ * `id` stays the source of truth for resolution/download/persistence; grouping
7050
+ * is a presentation overlay resolved back to an `id`.
7051
+ */
7052
+ group: ModelVariantGroupSchema.optional()
6976
7053
  });
6977
7054
  var ConvertTargetSchema = discriminatedUnion("format", [object({
6978
7055
  format: literal("openvino"),
@@ -7208,8 +7285,8 @@ var RecordingModeSchema = _enum([
7208
7285
  "onAudioThreshold"
7209
7286
  ]);
7210
7287
  /**
7211
- * First-class, authoritative per-camera storage mode — the netta choice the UI
7212
- * reads directly (never inferred from `rules`):
7288
+ * First-class, authoritative per-camera storage mode — the explicit choice the
7289
+ * UI reads directly (never inferred from `rules`):
7213
7290
  * - `off` — not recording.
7214
7291
  * - `events` — record only around triggers (motion / audio threshold),
7215
7292
  * with pre/post-buffer.
@@ -9411,26 +9488,13 @@ onBrightnessChanged: { data: object({
9411
9488
  */
9412
9489
  runtimeState: BrightnessStatusSchema
9413
9490
  };
9491
+ /** Stream delivery format. (Relocated from the retired `streaming-engine` cap.) */
9414
9492
  var StreamFormatSchema = _enum([
9415
9493
  "webrtc",
9416
9494
  "hls",
9417
9495
  "mjpeg",
9418
9496
  "rtsp"
9419
9497
  ]);
9420
- var StreamInfoSchema = object({
9421
- streamId: string(),
9422
- format: StreamFormatSchema,
9423
- url: string().nullable(),
9424
- active: boolean()
9425
- });
9426
- method(object({
9427
- streamId: string(),
9428
- sourceUrl: string(),
9429
- codec: string().optional()
9430
- }), _void(), { kind: "mutation" }), method(object({ streamId: string() }), _void(), { kind: "mutation" }), method(object({
9431
- streamId: string(),
9432
- format: StreamFormatSchema
9433
- }), string().nullable()), method(_void(), array(StreamInfoSchema));
9434
9498
  var RtspRestreamEntrySchema = object({
9435
9499
  brokerId: string(),
9436
9500
  url: string(),
@@ -10298,37 +10362,7 @@ var consumablesCapability = {
10298
10362
  scope: "device",
10299
10363
  deviceNative: true,
10300
10364
  mode: "singleton",
10301
- deviceTypes: [
10302
- DeviceType.Camera,
10303
- DeviceType.Hub,
10304
- DeviceType.Light,
10305
- DeviceType.Siren,
10306
- DeviceType.Switch,
10307
- DeviceType.Sensor,
10308
- DeviceType.Thermostat,
10309
- DeviceType.Button,
10310
- DeviceType.EventEmitter,
10311
- DeviceType.Update,
10312
- DeviceType.Generic,
10313
- DeviceType.Notifier,
10314
- DeviceType.Script,
10315
- DeviceType.Automation,
10316
- DeviceType.Lock,
10317
- DeviceType.Cover,
10318
- DeviceType.Valve,
10319
- DeviceType.Humidifier,
10320
- DeviceType.WaterHeater,
10321
- DeviceType.Fan,
10322
- DeviceType.MediaPlayer,
10323
- DeviceType.AlarmPanel,
10324
- DeviceType.Control,
10325
- DeviceType.Presence,
10326
- DeviceType.Weather,
10327
- DeviceType.Vacuum,
10328
- DeviceType.LawnMower,
10329
- DeviceType.Container,
10330
- DeviceType.Image
10331
- ],
10365
+ deviceTypes: Object.values(DeviceType),
10332
10366
  deviceConfig: { ui: {
10333
10367
  kind: "widget",
10334
10368
  widgetId: "host/consumables-panel",
@@ -11786,7 +11820,7 @@ var BoundingBoxSchema = object({
11786
11820
  w: number(),
11787
11821
  h: number()
11788
11822
  });
11789
- var SpatialDetectionSchema = object({
11823
+ object({
11790
11824
  class: string(),
11791
11825
  originalClass: string(),
11792
11826
  score: number(),
@@ -11921,7 +11955,6 @@ var PipelineDefaultStepSchema = lazy(() => object({
11921
11955
  enabled: boolean(),
11922
11956
  modelId: string(),
11923
11957
  children: array(PipelineDefaultStepSchema).readonly(),
11924
- engine: PipelineEngineChoiceSchema.optional(),
11925
11958
  group: string().optional(),
11926
11959
  settings: record(string(), unknown()).optional()
11927
11960
  }));
@@ -11946,7 +11979,9 @@ var PipelineModelOptionSchema = object({
11946
11979
  formats: record(string(), object({
11947
11980
  downloaded: boolean(),
11948
11981
  sizeMB: number()
11949
- }))
11982
+ })),
11983
+ group: ModelVariantGroupSchema.optional(),
11984
+ legacy: boolean().optional()
11950
11985
  });
11951
11986
  var ConfigFieldBridge = custom$2();
11952
11987
  var PipelineAddonSchemaSchema = object({
@@ -11976,11 +12011,6 @@ var PipelineSchemaSchema = object({
11976
12011
  selectedEngine: PipelineEngineChoiceSchema,
11977
12012
  slots: array(PipelineSlotSchemaSchema).readonly()
11978
12013
  });
11979
- var DetectorOutputSchema = object({
11980
- detections: array(SpatialDetectionSchema).readonly(),
11981
- inferenceMs: number(),
11982
- modelId: string()
11983
- });
11984
12014
  var EngineProvisioningSchema = object({
11985
12015
  runtimeId: _enum([
11986
12016
  "onnx",
@@ -11997,15 +12027,42 @@ var EngineProvisioningSchema = object({
11997
12027
  ]),
11998
12028
  progress: number().optional(),
11999
12029
  error: string().optional(),
12000
- nextRetryAt: number().optional()
12030
+ nextRetryAt: number().optional(),
12031
+ /**
12032
+ * Gate A (config-correctness gate at engine change): human-readable
12033
+ * config issues surfaced EAGERLY when the node's engine changes — model
12034
+ * substitutions ("chose X, running Y") and zero-build steps ("no model
12035
+ * has a <format> build"). Additive/optional: informational only, never
12036
+ * enforced here — `assertEngineReady` (readiness) still gates inference.
12037
+ * Absent/empty when the node-default tree resolves cleanly.
12038
+ */
12039
+ configIssues: array(string()).optional()
12001
12040
  });
12002
12041
  var PipelineStepInputSchema = lazy(() => object({
12003
12042
  addonId: string(),
12004
- modelId: string(),
12043
+ modelId: string().optional(),
12005
12044
  enabled: boolean().default(true),
12006
12045
  children: array(PipelineStepInputSchema).optional(),
12007
12046
  settings: record(string(), unknown()).optional()
12008
12047
  }));
12048
+ var ModelSubstitutionSchema = object({
12049
+ addonId: string(),
12050
+ chosen: string(),
12051
+ running: string(),
12052
+ format: string()
12053
+ });
12054
+ var PipelineValidationIssueSchema = object({
12055
+ addonId: string(),
12056
+ kind: _enum(["unknown-addon", "no-format-build"]),
12057
+ detail: string()
12058
+ });
12059
+ var PipelineValidationResultSchema = object({
12060
+ ok: boolean(),
12061
+ issues: array(PipelineValidationIssueSchema).readonly(),
12062
+ substitutions: array(ModelSubstitutionSchema).readonly(),
12063
+ /** The node's `currentEngine.format` this validation ran against. */
12064
+ format: string()
12065
+ });
12009
12066
  var ReferenceImageEntrySchema = object({
12010
12067
  filename: string(),
12011
12068
  stepIds: array(string()).readonly().optional()
@@ -12076,7 +12133,13 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
12076
12133
  })) }), object({ success: literal(true) }), {
12077
12134
  kind: "mutation",
12078
12135
  auth: "admin"
12079
- }), method(_void(), PipelineSchemaSchema), method(_void(), array(PipelineDefaultStepSchema).readonly().nullable()), method(_void(), PipelineConfigBridge), method(_void(), ConfigUISchemaBridge), method(_void(), array(PipelineTemplateSchema$1).readonly()), method(object({
12136
+ }), method(object({ nodeId: string() }), object({
12137
+ success: literal(true),
12138
+ clearedDevices: number()
12139
+ }), {
12140
+ kind: "mutation",
12141
+ auth: "admin"
12142
+ }), method(_void(), PipelineSchemaSchema), method(_void(), array(PipelineDefaultStepSchema).readonly().nullable()), method(_void(), PipelineConfigBridge), method(_void(), ConfigUISchemaBridge), method(object({ steps: array(PipelineStepInputSchema) }), PipelineValidationResultSchema), method(_void(), array(PipelineTemplateSchema$1).readonly()), method(object({
12080
12143
  name: string(),
12081
12144
  steps: array(PipelineTemplateStepSchema).readonly(),
12082
12145
  engine: PipelineEngineChoiceSchema
@@ -12093,10 +12156,6 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
12093
12156
  modelId: string(),
12094
12157
  format: ModelFormatSchema$1
12095
12158
  }), object({ success: literal(true) }), { kind: "mutation" }), method(object({
12096
- addonId: string(),
12097
- frame: FrameInputSchema,
12098
- config: record(string(), unknown()).optional()
12099
- }), DetectorOutputSchema), method(object({
12100
12159
  engine: PipelineEngineChoiceSchema.optional(),
12101
12160
  steps: array(PipelineStepInputSchema).min(1),
12102
12161
  frame: FrameInputSchema.optional(),
@@ -12369,6 +12428,13 @@ var RunnerFrameSourceSchema = discriminatedUnion("kind", [object({ kind: literal
12369
12428
  kind: literal("remote-restream"),
12370
12429
  /** The camera's source-owner node (slice 1: always the hub). */
12371
12430
  ownerNodeId: string(),
12431
+ /**
12432
+ * The owner's LAN-reachable host, resolved by the orchestrator from the
12433
+ * per-node `reachableHost` override (Cluster UI). When present the runner
12434
+ * dials THIS host for the owner's restream, in preference to the
12435
+ * `CAMSTACK_HUB_URL`-derived default. Absent → auto-detect fallback.
12436
+ */
12437
+ ownerReachableHost: string().optional(),
12372
12438
  /** Operator override for the owner host the runner dials. */
12373
12439
  hubHostnameOverride: string().optional()
12374
12440
  })]).describe("Per-camera frame-source mode for the runner (P2c)");
@@ -12377,13 +12443,11 @@ var RunnerFrameSourceSchema = discriminatedUnion("kind", [object({ kind: literal
12377
12443
  * specific runner instance via `attachCamera`. Carries everything the
12378
12444
  * runner needs to subscribe to the local broker and execute inference.
12379
12445
  *
12380
- * Stateless-pipeline model: the full pipeline content (`engine`, `steps`,
12381
- * optional `audio`) travels with the attach payload. The runner keeps it
12382
- * in RAM for the lifetime of the attach — on rebalance, edit, or
12383
- * restart the orchestrator re-sends the latest snapshot.
12384
- *
12385
- * `engine`/`steps`/`audio` are optional during the additive migration
12386
- * window; once orchestrator + UI are migrated they become required.
12446
+ * Stateless-pipeline model: the pipeline content (`steps`, optional
12447
+ * `audio`) travels with the attach payload. The runner keeps it in RAM
12448
+ * for the lifetime of the attach — on rebalance, edit, or restart the
12449
+ * orchestrator re-sends the latest snapshot. Engine is NOT carried: it is
12450
+ * node-local, resolved by the executing runner at dispatch time.
12387
12451
  */
12388
12452
  var RunnerCameraConfigSchema = object({
12389
12453
  deviceId: number(),
@@ -12434,14 +12498,11 @@ var RunnerCameraConfigSchema = object({
12434
12498
  */
12435
12499
  motionSources: MotionSourcesSchema.default(["analyzer"]),
12436
12500
  pipelineEnabled: boolean().default(true),
12437
- /** Engine choice for video steps (runtime+backend+format). */
12438
- engine: PipelineEngineChoiceSchema.optional(),
12439
12501
  /** Ordered tree of video steps. Absent → runner skips video detection. */
12440
12502
  steps: array(PipelineStepInputSchema).readonly().optional(),
12441
12503
  /** Audio classification branch. `enabled:false` disables, null skips. */
12442
12504
  audio: object({
12443
- engine: PipelineEngineChoiceSchema,
12444
- modelId: string(),
12505
+ modelId: string().optional(),
12445
12506
  enabled: boolean()
12446
12507
  }).nullable().optional(),
12447
12508
  /**
@@ -15459,7 +15520,9 @@ var AddonPageDeclarationSchema$1 = object({
15459
15520
  icon: string(),
15460
15521
  path: string(),
15461
15522
  remoteName: string(),
15462
- bundle: string()
15523
+ bundle: string(),
15524
+ section: string().optional(),
15525
+ sectionLabel: string().optional()
15463
15526
  });
15464
15527
  var AddonPageInfoSchema = object({
15465
15528
  addonId: string(),
@@ -15499,7 +15562,18 @@ var AddonPageDeclarationSchema = object({
15499
15562
  * the static-file route can compute an mtime-based cache-buster URL
15500
15563
  * without a separate filesystem stat.
15501
15564
  */
15502
- bundle: string()
15565
+ bundle: string(),
15566
+ /**
15567
+ * Sidebar section this page docks into. Well-known ids: `'detection'`,
15568
+ * `'cluster'`, `'administration'` — the page renders inside that group.
15569
+ * Any OTHER string creates (or joins) a custom section rendered after
15570
+ * the built-in groups; its label comes from `sectionLabel` (first
15571
+ * declaration wins), falling back to the id. Absent → the legacy
15572
+ * "Addon Pages" group.
15573
+ */
15574
+ section: string().optional(),
15575
+ /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
15576
+ sectionLabel: string().optional()
15503
15577
  });
15504
15578
  method(_void(), array(AddonPageDeclarationSchema).readonly());
15505
15579
  var AddonHttpRouteSchema = object({
@@ -15715,6 +15789,17 @@ var WidgetMetadataSchema = object({
15715
15789
  deviceContext: boolean().default(false),
15716
15790
  integrationContext: boolean().default(false)
15717
15791
  }),
15792
+ /**
15793
+ * Loadable BEFORE authentication. The normal widget registry listing
15794
+ * (`addon-widgets.listWidgets`) is auth-gated, so a pre-auth surface
15795
+ * (the login page) cannot discover a widget through it. A widget that
15796
+ * declares `preAuth: true` marks itself as safe to mount on a pre-auth
15797
+ * screen — it is surfaced through the PUBLIC `auth.listLoginMethods`
15798
+ * login-method contribution channel (see `login-method.cap.ts`) rather
15799
+ * than the authenticated registry, and its bundle is served by the
15800
+ * public `/api/addon-widgets/:addonId/*` static route. Defaults false.
15801
+ */
15802
+ preAuth: boolean().optional().default(false),
15718
15803
  /** Dashboard placement HINTS (operator can override per instance). */
15719
15804
  defaultSize: WidgetSizeEnum.default("md"),
15720
15805
  allowedSizes: array(WidgetSizeEnum).readonly().default([
@@ -16016,6 +16101,66 @@ method(object({
16016
16101
  password: string()
16017
16102
  }), AuthResultSchema.nullable(), { kind: "mutation" }), method(object({ state: string() }), string()), method(record(string(), string()), AuthResultSchema, { kind: "mutation" }), method(object({ token: string() }), AuthResultSchema.nullable());
16018
16103
  /**
16104
+ * `login-method` — collection cap through which auth addons contribute
16105
+ * their pre-auth login surfaces to the login page. This is the SINGLE,
16106
+ * generic mechanism that supersedes the dead `auth.listProviders` reader:
16107
+ * every auth addon (OIDC, magic-link, WebAuthn/passkey) registers a
16108
+ * `login-method` provider and the PUBLIC `auth.listLoginMethods`
16109
+ * procedure aggregates them for the unauthenticated login page.
16110
+ *
16111
+ * A contribution is a discriminated union on `kind`:
16112
+ *
16113
+ * - `redirect` — a declarative button. The login page renders a generic
16114
+ * button that navigates to `startUrl` (an addon-owned HTTP route).
16115
+ * Covers OIDC (`/addon/auth-oidc/<id>/start`) and magic-link with
16116
+ * ZERO shell-side JS. A future SSO addon plugs in the same way — the
16117
+ * login page needs NO change.
16118
+ *
16119
+ * - `widget` — a Module-Federation widget the login page mounts (via
16120
+ * `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
16121
+ * login ceremony, which must run `@simplewebauthn/browser` INSIDE the
16122
+ * addon bundle. The referenced widget also declares `preAuth: true` in
16123
+ * its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
16124
+ * stamps a public `bundleUrl` from `addonId` + `bundle`.
16125
+ *
16126
+ * Every contribution carries a `stage`:
16127
+ * - `primary` — shown on the first credentials screen (OIDC /
16128
+ * magic-link buttons; a future usernameless passkey).
16129
+ * - `second-factor` — shown AFTER the password leg, gated on the
16130
+ * returned `factors` (passkey-as-2FA today).
16131
+ *
16132
+ * `mount: skip` — the cap is read server-side by the core auth router
16133
+ * (`registry.getCollection('login-method')`), never mounted as its own
16134
+ * tRPC router.
16135
+ */
16136
+ /** When a login method renders in the two-phase login flow. */
16137
+ var LoginStageEnum = _enum(["primary", "second-factor"]);
16138
+ /** One login-method contribution — redirect button OR pre-auth widget. */
16139
+ var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
16140
+ kind: literal("redirect"),
16141
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
16142
+ id: string(),
16143
+ /** Operator-facing button label. */
16144
+ label: string(),
16145
+ /** lucide-react icon name. */
16146
+ icon: string().optional(),
16147
+ /** Addon-owned HTTP route the button navigates to (GET). */
16148
+ startUrl: string(),
16149
+ stage: LoginStageEnum
16150
+ }), object({
16151
+ kind: literal("widget"),
16152
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
16153
+ id: string(),
16154
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
16155
+ addonId: string(),
16156
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
16157
+ bundle: string(),
16158
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
16159
+ remote: WidgetRemoteSchema,
16160
+ stage: LoginStageEnum
16161
+ })]);
16162
+ method(_void(), array(LoginMethodContributionSchema).readonly());
16163
+ /**
16019
16164
  * Orchestrator-side destination metadata. The orchestrator computes
16020
16165
  * `id = <addonId>:<subId>` from its provider lookup so consumers
16021
16166
  * (admin UI, restore flow) see one canonical key.
@@ -18316,11 +18461,11 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18316
18461
  timestamp: number()
18317
18462
  });
18318
18463
  var CameraPipelineConfigSchema = object({
18319
- engine: PipelineEngineChoiceSchema,
18464
+ engine: PipelineEngineChoiceSchema.optional(),
18320
18465
  steps: array(PipelineStepInputSchema).readonly(),
18321
18466
  audio: object({
18322
- engine: PipelineEngineChoiceSchema,
18323
- modelId: string(),
18467
+ engine: PipelineEngineChoiceSchema.optional(),
18468
+ modelId: string().optional(),
18324
18469
  enabled: boolean(),
18325
18470
  settings: record(string(), unknown()).readonly().optional()
18326
18471
  }).nullable().optional()
@@ -18335,7 +18480,7 @@ var PipelineTemplateSchema = object({
18335
18480
  });
18336
18481
  var AgentAddonConfigSchema = object({
18337
18482
  enabled: boolean(),
18338
- modelId: string(),
18483
+ modelId: string().optional(),
18339
18484
  settings: record(string(), unknown()).readonly()
18340
18485
  });
18341
18486
  var AgentPipelineSettingsSchema = object({
@@ -18345,12 +18490,25 @@ var AgentPipelineSettingsSchema = object({
18345
18490
  detectWeight: number().positive().optional(),
18346
18491
  /** Node is eligible to run the detection pipeline (decode + inference). */
18347
18492
  detect: boolean().optional(),
18348
- /** Node is eligible to host decoder sessions. */
18493
+ /**
18494
+ * DEPRECATED AND IGNORED. Decode is always co-located with its frame
18495
+ * consumer, so decode eligibility IS detect eligibility. Kept optional in
18496
+ * the schema ONLY so persisted stores written before the removal still
18497
+ * parse — no code reads it and no write path emits it.
18498
+ */
18349
18499
  decode: boolean().optional(),
18350
18500
  /** Node is eligible to run audio-analyzer sessions. */
18351
18501
  audio: boolean().optional(),
18352
18502
  /** Node is eligible to be the ingest / source-owner (serve the restream). */
18353
- ingest: boolean().optional()
18503
+ ingest: boolean().optional(),
18504
+ /**
18505
+ * Operator override for the LAN host a cross-node decoder dials to reach
18506
+ * THIS node's restream (Cluster UI). Absent → auto-detect: a remote runner
18507
+ * falls back to its `CAMSTACK_HUB_URL`-derived host (the Moleculer address
18508
+ * it already uses to reach the hub). Set this only when the auto-detected
18509
+ * address is wrong (multi-homed host, NAT, custom interface).
18510
+ */
18511
+ reachableHost: string().optional()
18354
18512
  });
18355
18513
  var CameraPipelineForAgentSchema = object({
18356
18514
  steps: array(PipelineStepInputSchema).readonly(),
@@ -18398,25 +18556,6 @@ var PipelineAssignmentSchema = object({
18398
18556
  assignedAt: number()
18399
18557
  });
18400
18558
  /**
18401
- * Decoder placement record. Symmetric to `PipelineAssignmentSchema` but for
18402
- * the decoder-node placement domain (`balanceDecoder` decision: manual pin
18403
- * → co-located with pipeline → capacity).
18404
- */
18405
- var DecoderAssignmentSchema = object({
18406
- deviceId: number(),
18407
- /** Moleculer node id of the decoder provider currently responsible for this camera. */
18408
- decoderNodeId: string(),
18409
- /** True when the assignment was set manually via `assignDecoder`, false when chosen by the balancer. */
18410
- pinned: boolean(),
18411
- /** Why this assignment was made — useful for debugging the decoder balancer. */
18412
- reason: _enum([
18413
- "manual",
18414
- "co-located",
18415
- "capacity",
18416
- "hardware-affinity"
18417
- ])
18418
- });
18419
- /**
18420
18559
  * Per-agent load summary surfaced to the load balancer + dashboards.
18421
18560
  * Aggregated from each runner's `getLocalLoad` cap call.
18422
18561
  */
@@ -18456,6 +18595,15 @@ var GlobalMetricsSchema = object({
18456
18595
  * capability providers.
18457
18596
  */
18458
18597
  var CapabilityBindingsSchema = record(string(), string());
18598
+ /**
18599
+ * The cluster's single camera-source owner (`clusterRoles.ingestNode`) plus
18600
+ * its LAN-reachable host, if one is registered. See `getIngestOwner`.
18601
+ */
18602
+ var IngestOwnerSchema = object({
18603
+ ownerNodeId: string(),
18604
+ reachableHost: string().optional(),
18605
+ configIssue: string().optional()
18606
+ });
18459
18607
  /** Source block — always present; derives from the stream catalog. */
18460
18608
  var CameraSourceStatusSchema = object({ streams: array(object({
18461
18609
  camStreamId: string(),
@@ -18470,6 +18618,14 @@ var CameraAssignmentStatusSchema = object({
18470
18618
  detectionNodeId: string().nullable(),
18471
18619
  decoderNodeId: string().nullable(),
18472
18620
  audioNodeId: string().nullable(),
18621
+ /**
18622
+ * The node that OWNS this camera's physical source pull (dials the RTSP and
18623
+ * hosts the broker/restream) — the cluster ingest owner today
18624
+ * (`clusterRoles.ingestNode`), per-camera once source assignment lands. Lets
18625
+ * the UI show WHERE a camera is sourced without SSH/logs, and is the node the
18626
+ * broker block below was read from (pinned). Nullable only pre-wiring.
18627
+ */
18628
+ sourceNodeId: string().nullable(),
18473
18629
  pinned: object({
18474
18630
  detection: boolean(),
18475
18631
  decoder: boolean(),
@@ -18602,16 +18758,7 @@ method(object({
18602
18758
  }), object({ success: literal(true) }), {
18603
18759
  kind: "mutation",
18604
18760
  auth: "admin"
18605
- }), method(object({
18606
- deviceId: number(),
18607
- nodeId: string()
18608
- }), _void(), {
18609
- kind: "mutation",
18610
- auth: "admin"
18611
- }), method(object({ deviceId: number() }), _void(), {
18612
- kind: "mutation",
18613
- auth: "admin"
18614
- }), method(_void(), array(DecoderAssignmentSchema).readonly()), method(object({
18761
+ }), method(_void(), IngestOwnerSchema), method(object({
18615
18762
  deviceId: number(),
18616
18763
  nodeId: string()
18617
18764
  }), object({ success: literal(true) }), {
@@ -18632,10 +18779,7 @@ method(object({
18632
18779
  nodeId: string(),
18633
18780
  pinned: boolean(),
18634
18781
  assignedAt: number()
18635
- }))), method(object({
18636
- deviceId: number(),
18637
- pipelineNodeId: string().optional()
18638
- }), DecoderAssignmentSchema), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
18782
+ }))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
18639
18783
  nodeId: string(),
18640
18784
  settings: AgentPipelineSettingsSchema
18641
18785
  })).readonly()), method(object({
@@ -18665,12 +18809,26 @@ method(object({
18665
18809
  }), method(object({
18666
18810
  agentNodeId: string(),
18667
18811
  detect: boolean().nullable().optional(),
18668
- decode: boolean().nullable().optional(),
18669
18812
  audio: boolean().nullable().optional(),
18670
18813
  ingest: boolean().nullable().optional()
18671
18814
  }), object({ success: literal(true) }), {
18672
18815
  kind: "mutation",
18673
18816
  auth: "admin"
18817
+ }), method(object({
18818
+ agentNodeId: string(),
18819
+ reachableHost: string().nullable()
18820
+ }), object({ success: literal(true) }), {
18821
+ kind: "mutation",
18822
+ auth: "admin"
18823
+ }), method(object({ agentNodeId: string() }), object({
18824
+ success: literal(true),
18825
+ /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
18826
+ effectiveModelId: string().nullable(),
18827
+ /** Number of cameras whose node-scoped overrides were cleared. */
18828
+ clearedCameraOverrides: number()
18829
+ }), {
18830
+ kind: "mutation",
18831
+ auth: "admin"
18674
18832
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
18675
18833
  deviceId: number(),
18676
18834
  addonId: string(),
@@ -18715,22 +18873,131 @@ method(object({
18715
18873
  kind: "mutation",
18716
18874
  auth: "admin"
18717
18875
  });
18718
- var RegisteredStreamSchema = object({
18719
- streamId: string(),
18720
- label: string().optional(),
18721
- codec: string(),
18722
- type: _enum(["video", "audio"]),
18723
- sourceUrl: string()
18876
+ /**
18877
+ * server-management — per-NODE singleton capability for a node's ROOT
18878
+ * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
18879
+ * agents).
18880
+ *
18881
+ * Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
18882
+ * on agents) carries the whole software stack in its npm dep tree, so ONE
18883
+ * version describes the node. Updates install into
18884
+ * `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
18885
+ * starter (probation boot + auto-rollback to N-1).
18886
+ *
18887
+ * Providers:
18888
+ * - HUB: `ServerUpdateService` behind the `server-provided` mount
18889
+ * (`buildServerProviders` in trpc.router.ts) — the default target for
18890
+ * unpinned calls.
18891
+ * - AGENT: `AgentUpdateService` registered by the agent bootstrap under
18892
+ * the synthetic `agent-runtime` addonId and declared in the agent's
18893
+ * `$hub.registerNode` manifest.
18894
+ *
18895
+ * Node routing: singleton caps get the codegen/runtime-builder `nodeId`
18896
+ * injection on every method — `input.nodeId` (or `nodePin(nodeId)` from the
18897
+ * SDK) routes the call to that node's provider via the standard remote
18898
+ * proxy (`createCapabilityProxy` → `$agent-cap-fwd` → the agent's
18899
+ * in-process provider lookup). No `nodeId` → the hub's own provider.
18900
+ *
18901
+ * Spec: docs/superpowers/specs/2026-07-12-runtime-updatable-node-packages-design.md
18902
+ */
18903
+ /**
18904
+ * Where the running hub's code was loaded from:
18905
+ * - `workspace` — dev checkout (tsx / workspace dist); the starter defers to
18906
+ * plain resolution and runtime updates are refused.
18907
+ * - `baked` — the immutable image seed closure (no data-dir root active).
18908
+ * - `data-root` — the runtime-updatable `<dataDir>/server-root` closure.
18909
+ */
18910
+ var ServerBootModeSchema = _enum([
18911
+ "workspace",
18912
+ "baked",
18913
+ "data-root"
18914
+ ]);
18915
+ /**
18916
+ * Update lifecycle state:
18917
+ * - `idle` / `checking` / `staging` — steady / in-flight registry work.
18918
+ * - `pending-restart` — a version is staged and the node has NOT yet
18919
+ * restarted onto it (still running the OLD version).
18920
+ * - `awaiting-confirmation` — the node HAS restarted onto the staged version
18921
+ * (it is the active probation boot) and is waiting to confirm boot-health.
18922
+ * Apply/rollback are refused in this state and the node must NOT be
18923
+ * manually restarted, or the probation boot auto-rolls-back.
18924
+ */
18925
+ var ServerUpdateStateSchema = _enum([
18926
+ "idle",
18927
+ "checking",
18928
+ "staging",
18929
+ "pending-restart",
18930
+ "awaiting-confirmation"
18931
+ ]);
18932
+ var ServerRollbackInfoSchema = object({
18933
+ /** The version that failed (or was manually rolled back). */
18934
+ fromVersion: string(),
18935
+ /** The version rolled back to; null = the baked seed. */
18936
+ toVersion: string().nullable(),
18937
+ atMs: number(),
18938
+ reason: string()
18724
18939
  });
18725
- var ExposedResourceSchema = object({
18726
- streamId: string(),
18727
- format: string(),
18728
- value: string()
18940
+ var ServerPackageStatusSchema = object({
18941
+ /** Root package name (`@camstack/server` on the hub). */
18942
+ packageName: string(),
18943
+ /** Version of the code the running process ACTUALLY loaded. */
18944
+ runningVersion: string().nullable(),
18945
+ /** Node.js runtime version the node's process runs on (`process.versions.node`). */
18946
+ nodeRuntimeVersion: string().nullable(),
18947
+ /** Active data-dir root version; null when booted from seed/workspace. */
18948
+ activeVersion: string().nullable(),
18949
+ /** N-1 version kept for rollback; null when no previous version exists. */
18950
+ previousVersion: string().nullable(),
18951
+ /** Version of the immutable baked seed closure (image fallback). */
18952
+ seedVersion: string().nullable(),
18953
+ /** Latest registry version from the most recent check (null = never checked). */
18954
+ latestVersion: string().nullable(),
18955
+ updateAvailable: boolean(),
18956
+ bootMode: ServerBootModeSchema,
18957
+ updateState: ServerUpdateStateSchema,
18958
+ /** Version staged + awaiting its probation boot, when one is pending. */
18959
+ pendingVersion: string().nullable(),
18960
+ /** Set when the last freshly-activated version failed its boot health-check. */
18961
+ rolledBack: ServerRollbackInfoSchema.nullable(),
18962
+ /**
18963
+ * True when `server-root/state.json` EXISTS but is unreadable/corrupt — the
18964
+ * hub is running from the baked seed (or workspace) while installed data-dir
18965
+ * versions are being IGNORED. Surfaced as a warning in the UI.
18966
+ */
18967
+ stateFileCorrupt: boolean(),
18968
+ lastCheckedAtMs: number().nullable()
18969
+ });
18970
+ var ServerUpdateCheckResultSchema = object({
18971
+ packageName: string(),
18972
+ runningVersion: string().nullable(),
18973
+ latestVersion: string().nullable(),
18974
+ updateAvailable: boolean(),
18975
+ checkedAtMs: number(),
18976
+ /** Non-null when the registry lookup failed (offline, bad registry, …). */
18977
+ error: string().nullable()
18978
+ });
18979
+ var ServerUpdateActionResultSchema = object({
18980
+ accepted: boolean(),
18981
+ targetVersion: string().nullable(),
18982
+ /** True when a graceful restart was scheduled to apply the change. */
18983
+ restarting: boolean(),
18984
+ message: string()
18985
+ });
18986
+ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), ServerUpdateCheckResultSchema, {
18987
+ kind: "mutation",
18988
+ auth: "admin"
18989
+ }), method(object({
18990
+ /** Explicit target version; omitted = latest from the registry. */
18991
+ version: string().optional() }), ServerUpdateActionResultSchema, {
18992
+ kind: "mutation",
18993
+ auth: "admin"
18994
+ }), method(_void(), ServerUpdateActionResultSchema, {
18995
+ kind: "mutation",
18996
+ auth: "admin"
18997
+ }), method(_void(), ServerUpdateActionResultSchema, {
18998
+ kind: "mutation",
18999
+ auth: "admin"
18729
19000
  });
18730
- method(object({
18731
- deviceId: number(),
18732
- streams: array(RegisteredStreamSchema).readonly()
18733
- }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), array(ExposedResourceSchema).readonly());
18734
19001
  /**
18735
19002
  * Query filter for settings-store collections.
18736
19003
  */
@@ -18883,9 +19150,9 @@ method(SendEmailInputSchema, SendEmailResultSchema, {
18883
19150
  /**
18884
19151
  * A single device snapshot returned as base64 JPEG/PNG.
18885
19152
  *
18886
- * Shared with the `snapshot-provider` collection cap the orchestrator
18887
- * receives the same shape from each native provider and from the
18888
- * broker-based fallback.
19153
+ * The `SnapshotAddon` wrapper returns this shape whether the frame came from
19154
+ * the device-native provider (onboard capture) or from the stream-broker
19155
+ * prebuffer fallback.
18889
19156
  */
18890
19157
  var SnapshotImageSchema = object({
18891
19158
  base64: string(),
@@ -18960,10 +19227,6 @@ var snapshotCapability = {
18960
19227
  kind: "poll"
18961
19228
  }
18962
19229
  };
18963
- method(object({ deviceId: number() }), boolean()), method(object({
18964
- deviceId: number(),
18965
- streamId: string().optional()
18966
- }), SnapshotImageSchema.nullable());
18967
19230
  /**
18968
19231
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
18969
19232
  * providers (OIDC, SAML, magic-link, …) mint an HMAC-signed token
@@ -19324,9 +19587,10 @@ method(object({
19324
19587
  auth: "admin"
19325
19588
  });
19326
19589
  /**
19327
- * Optional client-side hints sent at session creation to help the
19328
- * provider pick the best native source. All fields are optional —
19329
- * a viewer that knows nothing still gets a sane default.
19590
+ * Optional client-side hints sent at session creation to help the provider
19591
+ * pick the best native source. All fields optional — a viewer that knows
19592
+ * nothing still gets a sane default. (Relocated from the retired `webrtc`
19593
+ * collection cap; this `webrtc-session` cap is the live signaling surface.)
19330
19594
  */
19331
19595
  var webrtcClientHintsSchema = object({
19332
19596
  viewportWidth: number().int().positive().optional(),
@@ -19337,22 +19601,6 @@ var webrtcClientHintsSchema = object({
19337
19601
  /** Hard tier override; takes precedence over scoring when registered. */
19338
19602
  prefersTier: string().optional()
19339
19603
  }).partial();
19340
- method(object({
19341
- streamId: string(),
19342
- sdpOffer: string()
19343
- }), string(), { kind: "mutation" }), method(object({ streamId: string() }), boolean()), method(object({
19344
- streamId: string(),
19345
- codec: string()
19346
- }), _void(), { kind: "mutation" }), method(object({ streamId: string() }), _void(), { kind: "mutation" }), method(object({
19347
- streamId: string(),
19348
- hints: webrtcClientHintsSchema.optional()
19349
- }), object({
19350
- sessionId: string(),
19351
- sdpOffer: string()
19352
- }), { kind: "mutation" }), method(object({
19353
- sessionId: string(),
19354
- sdpAnswer: string()
19355
- }), _void(), { kind: "mutation" }), method(object({ sessionId: string() }), _void(), { kind: "mutation" }), method(object({ streamId: string() }), boolean());
19356
19604
  /**
19357
19605
  * Discriminated target for a WebRTC session. The client sends this
19358
19606
  * structured object instead of building / parsing brokerId strings;
@@ -20831,6 +21079,16 @@ var TopologyCategorySchema = object({
20831
21079
  healthy: number(),
20832
21080
  addons: array(TopologyCategoryAddonSchema).readonly()
20833
21081
  });
21082
+ /**
21083
+ * The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
21084
+ * `@camstack/agent` on agents) as reported by its `registerNode` manifest —
21085
+ * version visibility for the Server management surface. Nullable: offline
21086
+ * rows and pre-phase-2 nodes report none.
21087
+ */
21088
+ var TopologyRootPackageSchema = object({
21089
+ name: string(),
21090
+ version: string()
21091
+ });
20834
21092
  var TopologyNodeSchema = object({
20835
21093
  id: string(),
20836
21094
  name: string(),
@@ -20854,7 +21112,8 @@ var TopologyNodeSchema = object({
20854
21112
  status: string()
20855
21113
  })).readonly(),
20856
21114
  processes: array(TopologyProcessSchema).readonly(),
20857
- categories: array(TopologyCategorySchema).readonly()
21115
+ categories: array(TopologyCategorySchema).readonly(),
21116
+ rootPackage: TopologyRootPackageSchema.nullable()
20858
21117
  });
20859
21118
  var CapUsageEdgeSchema = object({
20860
21119
  callerAddonId: string(),
@@ -23932,6 +24191,12 @@ Object.freeze({
23932
24191
  addonId: null,
23933
24192
  access: "create"
23934
24193
  },
24194
+ "loginMethod.getLoginMethods": {
24195
+ capName: "login-method",
24196
+ capScope: "system",
24197
+ addonId: null,
24198
+ access: "view"
24199
+ },
23935
24200
  "mediaPlayer.next": {
23936
24201
  capName: "media-player",
23937
24202
  capScope: "device",
@@ -24562,23 +24827,23 @@ Object.freeze({
24562
24827
  addonId: null,
24563
24828
  access: "create"
24564
24829
  },
24565
- "pipelineExecutor.deleteModel": {
24830
+ "pipelineExecutor.clearDeviceOverrides": {
24566
24831
  capName: "pipeline-executor",
24567
24832
  capScope: "system",
24568
24833
  addonId: null,
24569
24834
  access: "delete"
24570
24835
  },
24571
- "pipelineExecutor.deleteTemplate": {
24836
+ "pipelineExecutor.deleteModel": {
24572
24837
  capName: "pipeline-executor",
24573
24838
  capScope: "system",
24574
24839
  addonId: null,
24575
24840
  access: "delete"
24576
24841
  },
24577
- "pipelineExecutor.detect": {
24842
+ "pipelineExecutor.deleteTemplate": {
24578
24843
  capName: "pipeline-executor",
24579
24844
  capScope: "system",
24580
24845
  addonId: null,
24581
- access: "view"
24846
+ access: "delete"
24582
24847
  },
24583
24848
  "pipelineExecutor.downloadModel": {
24584
24849
  capName: "pipeline-executor",
@@ -24772,13 +25037,13 @@ Object.freeze({
24772
25037
  addonId: null,
24773
25038
  access: "create"
24774
25039
  },
24775
- "pipelineOrchestrator.assignAudio": {
24776
- capName: "pipeline-orchestrator",
25040
+ "pipelineExecutor.validatePipeline": {
25041
+ capName: "pipeline-executor",
24777
25042
  capScope: "system",
24778
25043
  addonId: null,
24779
- access: "create"
25044
+ access: "view"
24780
25045
  },
24781
- "pipelineOrchestrator.assignDecoder": {
25046
+ "pipelineOrchestrator.assignAudio": {
24782
25047
  capName: "pipeline-orchestrator",
24783
25048
  capScope: "system",
24784
25049
  addonId: null,
@@ -24862,19 +25127,13 @@ Object.freeze({
24862
25127
  addonId: null,
24863
25128
  access: "view"
24864
25129
  },
24865
- "pipelineOrchestrator.getDecoderAssignment": {
24866
- capName: "pipeline-orchestrator",
24867
- capScope: "system",
24868
- addonId: null,
24869
- access: "view"
24870
- },
24871
- "pipelineOrchestrator.getDecoderAssignments": {
25130
+ "pipelineOrchestrator.getGlobalMetrics": {
24872
25131
  capName: "pipeline-orchestrator",
24873
25132
  capScope: "system",
24874
25133
  addonId: null,
24875
25134
  access: "view"
24876
25135
  },
24877
- "pipelineOrchestrator.getGlobalMetrics": {
25136
+ "pipelineOrchestrator.getIngestOwner": {
24878
25137
  capName: "pipeline-orchestrator",
24879
25138
  capScope: "system",
24880
25139
  addonId: null,
@@ -24916,6 +25175,12 @@ Object.freeze({
24916
25175
  addonId: null,
24917
25176
  access: "delete"
24918
25177
  },
25178
+ "pipelineOrchestrator.resetNodePipelineDefaults": {
25179
+ capName: "pipeline-orchestrator",
25180
+ capScope: "system",
25181
+ addonId: null,
25182
+ access: "delete"
25183
+ },
24919
25184
  "pipelineOrchestrator.resolvePipeline": {
24920
25185
  capName: "pipeline-orchestrator",
24921
25186
  capScope: "system",
@@ -24952,37 +25217,37 @@ Object.freeze({
24952
25217
  addonId: null,
24953
25218
  access: "create"
24954
25219
  },
24955
- "pipelineOrchestrator.setCameraPipelineForAgent": {
25220
+ "pipelineOrchestrator.setAgentReachableHost": {
24956
25221
  capName: "pipeline-orchestrator",
24957
25222
  capScope: "system",
24958
25223
  addonId: null,
24959
25224
  access: "create"
24960
25225
  },
24961
- "pipelineOrchestrator.setCameraStepOverride": {
25226
+ "pipelineOrchestrator.setCameraPipelineForAgent": {
24962
25227
  capName: "pipeline-orchestrator",
24963
25228
  capScope: "system",
24964
25229
  addonId: null,
24965
25230
  access: "create"
24966
25231
  },
24967
- "pipelineOrchestrator.setCameraStepToggle": {
25232
+ "pipelineOrchestrator.setCameraStepOverride": {
24968
25233
  capName: "pipeline-orchestrator",
24969
25234
  capScope: "system",
24970
25235
  addonId: null,
24971
25236
  access: "create"
24972
25237
  },
24973
- "pipelineOrchestrator.setCapabilityBinding": {
25238
+ "pipelineOrchestrator.setCameraStepToggle": {
24974
25239
  capName: "pipeline-orchestrator",
24975
25240
  capScope: "system",
24976
25241
  addonId: null,
24977
25242
  access: "create"
24978
25243
  },
24979
- "pipelineOrchestrator.unassignAudio": {
25244
+ "pipelineOrchestrator.setCapabilityBinding": {
24980
25245
  capName: "pipeline-orchestrator",
24981
25246
  capScope: "system",
24982
25247
  addonId: null,
24983
25248
  access: "create"
24984
25249
  },
24985
- "pipelineOrchestrator.unassignDecoder": {
25250
+ "pipelineOrchestrator.unassignAudio": {
24986
25251
  capName: "pipeline-orchestrator",
24987
25252
  capScope: "system",
24988
25253
  addonId: null,
@@ -25282,33 +25547,45 @@ Object.freeze({
25282
25547
  addonId: null,
25283
25548
  access: "create"
25284
25549
  },
25285
- "restreamer.getExposedResources": {
25286
- capName: "restreamer",
25550
+ "scriptRunner.run": {
25551
+ capName: "script-runner",
25552
+ capScope: "device",
25553
+ addonId: null,
25554
+ access: "create"
25555
+ },
25556
+ "scriptRunner.stop": {
25557
+ capName: "script-runner",
25558
+ capScope: "device",
25559
+ addonId: null,
25560
+ access: "create"
25561
+ },
25562
+ "serverManagement.applyServerUpdate": {
25563
+ capName: "server-management",
25287
25564
  capScope: "system",
25288
25565
  addonId: null,
25289
- access: "view"
25566
+ access: "create"
25290
25567
  },
25291
- "restreamer.registerDevice": {
25292
- capName: "restreamer",
25568
+ "serverManagement.checkServerUpdate": {
25569
+ capName: "server-management",
25293
25570
  capScope: "system",
25294
25571
  addonId: null,
25295
25572
  access: "create"
25296
25573
  },
25297
- "restreamer.unregisterDevice": {
25298
- capName: "restreamer",
25574
+ "serverManagement.getServerPackageStatus": {
25575
+ capName: "server-management",
25299
25576
  capScope: "system",
25300
25577
  addonId: null,
25301
- access: "delete"
25578
+ access: "view"
25302
25579
  },
25303
- "scriptRunner.run": {
25304
- capName: "script-runner",
25305
- capScope: "device",
25580
+ "serverManagement.restartServer": {
25581
+ capName: "server-management",
25582
+ capScope: "system",
25306
25583
  addonId: null,
25307
25584
  access: "create"
25308
25585
  },
25309
- "scriptRunner.stop": {
25310
- capName: "script-runner",
25311
- capScope: "device",
25586
+ "serverManagement.rollbackServerUpdate": {
25587
+ capName: "server-management",
25588
+ capScope: "system",
25312
25589
  addonId: null,
25313
25590
  access: "create"
25314
25591
  },
@@ -25402,18 +25679,6 @@ Object.freeze({
25402
25679
  addonId: null,
25403
25680
  access: "create"
25404
25681
  },
25405
- "snapshotProvider.getSnapshot": {
25406
- capName: "snapshot-provider",
25407
- capScope: "system",
25408
- addonId: null,
25409
- access: "view"
25410
- },
25411
- "snapshotProvider.supportsDevice": {
25412
- capName: "snapshot-provider",
25413
- capScope: "system",
25414
- addonId: null,
25415
- access: "view"
25416
- },
25417
25682
  "ssoBridge.signBridgeToken": {
25418
25683
  capName: "sso-bridge",
25419
25684
  capScope: "system",
@@ -25840,30 +26105,6 @@ Object.freeze({
25840
26105
  addonId: null,
25841
26106
  access: "view"
25842
26107
  },
25843
- "streamingEngine.getStreamUrl": {
25844
- capName: "streaming-engine",
25845
- capScope: "system",
25846
- addonId: null,
25847
- access: "view"
25848
- },
25849
- "streamingEngine.listStreams": {
25850
- capName: "streaming-engine",
25851
- capScope: "system",
25852
- addonId: null,
25853
- access: "view"
25854
- },
25855
- "streamingEngine.registerStream": {
25856
- capName: "streaming-engine",
25857
- capScope: "system",
25858
- addonId: null,
25859
- access: "create"
25860
- },
25861
- "streamingEngine.unregisterStream": {
25862
- capName: "streaming-engine",
25863
- capScope: "system",
25864
- addonId: null,
25865
- access: "delete"
25866
- },
25867
26108
  "streamParams.getConfigSchema": {
25868
26109
  capName: "stream-params",
25869
26110
  capScope: "device",
@@ -26212,6 +26453,18 @@ Object.freeze({
26212
26453
  addonId: null,
26213
26454
  access: "view"
26214
26455
  },
26456
+ "viewerUi.getStaticDir": {
26457
+ capName: "viewer-ui",
26458
+ capScope: "system",
26459
+ addonId: null,
26460
+ access: "view"
26461
+ },
26462
+ "viewerUi.getVersion": {
26463
+ capName: "viewer-ui",
26464
+ capScope: "system",
26465
+ addonId: null,
26466
+ access: "view"
26467
+ },
26215
26468
  "waterHeater.setAway": {
26216
26469
  capName: "water-heater",
26217
26470
  capScope: "device",
@@ -26230,54 +26483,6 @@ Object.freeze({
26230
26483
  addonId: null,
26231
26484
  access: "create"
26232
26485
  },
26233
- "webrtc.closeSession": {
26234
- capName: "webrtc",
26235
- capScope: "system",
26236
- addonId: null,
26237
- access: "create"
26238
- },
26239
- "webrtc.createSession": {
26240
- capName: "webrtc",
26241
- capScope: "system",
26242
- addonId: null,
26243
- access: "create"
26244
- },
26245
- "webrtc.handleAnswer": {
26246
- capName: "webrtc",
26247
- capScope: "system",
26248
- addonId: null,
26249
- access: "create"
26250
- },
26251
- "webrtc.handleOffer": {
26252
- capName: "webrtc",
26253
- capScope: "system",
26254
- addonId: null,
26255
- access: "create"
26256
- },
26257
- "webrtc.hasAdaptiveBitrate": {
26258
- capName: "webrtc",
26259
- capScope: "system",
26260
- addonId: null,
26261
- access: "view"
26262
- },
26263
- "webrtc.registerStream": {
26264
- capName: "webrtc",
26265
- capScope: "system",
26266
- addonId: null,
26267
- access: "create"
26268
- },
26269
- "webrtc.supportsStream": {
26270
- capName: "webrtc",
26271
- capScope: "system",
26272
- addonId: null,
26273
- access: "view"
26274
- },
26275
- "webrtc.unregisterStream": {
26276
- capName: "webrtc",
26277
- capScope: "system",
26278
- addonId: null,
26279
- access: "delete"
26280
- },
26281
26486
  "webrtcSession.addIceCandidate": {
26282
26487
  capName: "webrtc-session",
26283
26488
  capScope: "device",