camstack 1.1.22 → 1.1.24

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.
@@ -14522,7 +14522,7 @@ function date4(params) {
14522
14522
  // ../../node_modules/zod/v4/classic/external.js
14523
14523
  config(en_default());
14524
14524
 
14525
- // ../types/dist/sleep-CZDdRBua.mjs
14525
+ // ../types/dist/sleep-BC9Yqte7.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
@@ -15132,16 +15132,34 @@ function method(input, output, options) {
15132
15132
  timeoutMs: options?.timeoutMs
15133
15133
  };
15134
15134
  }
15135
+ function systemMethod(input, output, options) {
15136
+ return {
15137
+ ...method(input, output, options),
15138
+ systemOnly: true
15139
+ };
15140
+ }
15135
15141
  function event(data) {
15136
15142
  return { data };
15137
15143
  }
15138
- var StaticDirOutputSchema = external_exports.object({ staticDir: external_exports.string() });
15139
- var VersionOutputSchema = external_exports.object({ version: external_exports.string() });
15144
+ var StaticDirOutputSchema$1 = external_exports.object({ staticDir: external_exports.string() });
15145
+ var VersionOutputSchema$1 = external_exports.object({ version: external_exports.string() });
15140
15146
  var adminUiCapability = {
15141
15147
  name: "admin-ui",
15142
15148
  scope: "system",
15143
15149
  mode: "singleton",
15144
15150
  internal: true,
15151
+ methods: {
15152
+ getStaticDir: method(external_exports.void(), StaticDirOutputSchema$1),
15153
+ getVersion: method(external_exports.void(), VersionOutputSchema$1)
15154
+ }
15155
+ };
15156
+ var StaticDirOutputSchema = external_exports.object({ staticDir: external_exports.string() });
15157
+ var VersionOutputSchema = external_exports.object({ version: external_exports.string() });
15158
+ var viewerUiCapability = {
15159
+ name: "viewer-ui",
15160
+ scope: "system",
15161
+ mode: "singleton",
15162
+ internal: true,
15145
15163
  methods: {
15146
15164
  getStaticDir: method(external_exports.void(), StaticDirOutputSchema),
15147
15165
  getVersion: method(external_exports.void(), VersionOutputSchema)
@@ -15322,6 +15340,28 @@ var ModelFormatsSchema = external_exports.object({
15322
15340
  tflite: ModelFormatEntrySchema.optional(),
15323
15341
  pt: ModelFormatEntrySchema.optional()
15324
15342
  });
15343
+ var ModelVariantGroupSchema = external_exports.object({
15344
+ /** Top-level family, e.g. `yolo26` (later `d-fine`, `rf-detr`). */
15345
+ family: external_exports.string(),
15346
+ /** Size within the family, e.g. `n` | `s` | `m` | `l`. */
15347
+ tier: external_exports.string(),
15348
+ /** Quantization axis. Omit ⇒ the fp32 base build. */
15349
+ precision: external_exports.enum(["fp32", "int8"]).optional(),
15350
+ /**
15351
+ * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
15352
+ * latency-optimized export (e.g. ReLU-activation variant) — the slot the
15353
+ * future performance variants plug into.
15354
+ */
15355
+ optimization: external_exports.enum(["standard", "fast"]).optional(),
15356
+ /**
15357
+ * Input-resolution axis (square input side, px). Omit ⇒ the family's native
15358
+ * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
15359
+ * cheap latency lever — especially on Apple ANE and the Intel N100 — at a
15360
+ * small-object accuracy cost. Mirrors the model's `inputSize` but lifted onto
15361
+ * the group so the selector can offer it as a variant axis.
15362
+ */
15363
+ resolution: external_exports.number().int().positive().optional()
15364
+ });
15325
15365
  var ModelCatalogEntrySchema = external_exports.object({
15326
15366
  id: external_exports.string(),
15327
15367
  name: external_exports.string(),
@@ -15351,7 +15391,43 @@ var ModelCatalogEntrySchema = external_exports.object({
15351
15391
  * Auxiliary files required at runtime (labels JSON, charset dict, etc.).
15352
15392
  * Downloaded into the same modelsDir alongside the model file.
15353
15393
  */
15354
- extraFiles: external_exports.array(ModelExtraFileSchema).readonly().optional()
15394
+ extraFiles: external_exports.array(ModelExtraFileSchema).readonly().optional(),
15395
+ /**
15396
+ * LEGACY entry — retained in the catalog so a persisted operator selection
15397
+ * still RESOLVES (and can be re-activated), but hidden from the selectable
15398
+ * model list and excluded from the auto format-default pick. Set on the
15399
+ * superseded / consolidated models (older lineages, redundant fp16 IRs) so
15400
+ * the active lineup stays the coherent curated ladder without deleting a
15401
+ * model anyone may still be pinned to. `resolveModelForFormat` keeps honoring
15402
+ * an explicit legacy id that has a build for the node's format.
15403
+ */
15404
+ legacy: external_exports.boolean().optional(),
15405
+ /**
15406
+ * Measured quality/latency metadata — populated from the benchmark addon on
15407
+ * the real node classes. Absent = not yet measured (most entries today; the
15408
+ * catalog historically carried only `sizeMB`, a poor cross-architecture
15409
+ * speed proxy). `p95LatencyMs` is keyed by node class (e.g. `n100`, `mac`).
15410
+ */
15411
+ metrics: external_exports.object({
15412
+ map50: external_exports.number().optional(),
15413
+ p95LatencyMs: external_exports.record(external_exports.string(), external_exports.number()).optional()
15414
+ }).optional(),
15415
+ /**
15416
+ * SPDX-ish license id of the model weights (e.g. `AGPL-3.0` for Ultralytics
15417
+ * YOLO26, `GPL-3.0` for YOLOv9, `Apache-2.0` for D-FINE/RF-DETR). Matters for
15418
+ * the retraining addon and any future commercial distribution.
15419
+ */
15420
+ license: external_exports.string().optional(),
15421
+ /**
15422
+ * Variant-selector grouping. The UI groups models by `family` + `tier` and
15423
+ * offers `precision` / `optimization` as variant axes WITHIN a tier — so all
15424
+ * of a family's sizes and quantizations collapse into one grouped picker
15425
+ * instead of a flat list of `yolo26s`, `yolo26s-int8`, … Absent ⇒ ungrouped
15426
+ * (legacy / custom models) — never shown in the grouped selector. The flat
15427
+ * `id` stays the source of truth for resolution/download/persistence; grouping
15428
+ * is a presentation overlay resolved back to an `id`.
15429
+ */
15430
+ group: ModelVariantGroupSchema.optional()
15355
15431
  });
15356
15432
  var ConvertTargetSchema = external_exports.discriminatedUnion("format", [external_exports.object({
15357
15433
  format: external_exports.literal("openvino"),
@@ -17009,33 +17085,6 @@ var StreamFormatSchema = external_exports.enum([
17009
17085
  "mjpeg",
17010
17086
  "rtsp"
17011
17087
  ]);
17012
- var StreamInfoSchema = external_exports.object({
17013
- streamId: external_exports.string(),
17014
- format: StreamFormatSchema,
17015
- url: external_exports.string().nullable(),
17016
- active: external_exports.boolean()
17017
- });
17018
- var streamingEngineCapability = {
17019
- name: "streaming-engine",
17020
- scope: "system",
17021
- mode: "singleton",
17022
- internal: true,
17023
- methods: {
17024
- registerStream: method(external_exports.object({
17025
- streamId: external_exports.string(),
17026
- sourceUrl: external_exports.string(),
17027
- codec: external_exports.string().optional()
17028
- }), external_exports.void(), { kind: "mutation" }),
17029
- unregisterStream: method(external_exports.object({ streamId: external_exports.string() }), external_exports.void(), { kind: "mutation" }),
17030
- getStreamUrl: method(external_exports.object({
17031
- streamId: external_exports.string(),
17032
- format: StreamFormatSchema
17033
- }), external_exports.string().nullable()),
17034
- listStreams: method(external_exports.void(), external_exports.array(StreamInfoSchema))
17035
- },
17036
- /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
17037
- mount: { kind: "skip" }
17038
- };
17039
17088
  var RtspRestreamEntrySchema = external_exports.object({
17040
17089
  brokerId: external_exports.string(),
17041
17090
  url: external_exports.string(),
@@ -17912,37 +17961,7 @@ var consumablesCapability = {
17912
17961
  scope: "device",
17913
17962
  deviceNative: true,
17914
17963
  mode: "singleton",
17915
- deviceTypes: [
17916
- DeviceType.Camera,
17917
- DeviceType.Hub,
17918
- DeviceType.Light,
17919
- DeviceType.Siren,
17920
- DeviceType.Switch,
17921
- DeviceType.Sensor,
17922
- DeviceType.Thermostat,
17923
- DeviceType.Button,
17924
- DeviceType.EventEmitter,
17925
- DeviceType.Update,
17926
- DeviceType.Generic,
17927
- DeviceType.Notifier,
17928
- DeviceType.Script,
17929
- DeviceType.Automation,
17930
- DeviceType.Lock,
17931
- DeviceType.Cover,
17932
- DeviceType.Valve,
17933
- DeviceType.Humidifier,
17934
- DeviceType.WaterHeater,
17935
- DeviceType.Fan,
17936
- DeviceType.MediaPlayer,
17937
- DeviceType.AlarmPanel,
17938
- DeviceType.Control,
17939
- DeviceType.Presence,
17940
- DeviceType.Weather,
17941
- DeviceType.Vacuum,
17942
- DeviceType.LawnMower,
17943
- DeviceType.Container,
17944
- DeviceType.Image
17945
- ],
17964
+ deviceTypes: Object.values(DeviceType),
17946
17965
  deviceConfig: { ui: {
17947
17966
  kind: "widget",
17948
17967
  widgetId: "host/consumables-panel",
@@ -19179,7 +19198,6 @@ var PipelineDefaultStepSchema = external_exports.lazy(() => external_exports.obj
19179
19198
  enabled: external_exports.boolean(),
19180
19199
  modelId: external_exports.string(),
19181
19200
  children: external_exports.array(PipelineDefaultStepSchema).readonly(),
19182
- engine: PipelineEngineChoiceSchema.optional(),
19183
19201
  group: external_exports.string().optional(),
19184
19202
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
19185
19203
  }));
@@ -19204,7 +19222,9 @@ var PipelineModelOptionSchema = external_exports.object({
19204
19222
  formats: external_exports.record(external_exports.string(), external_exports.object({
19205
19223
  downloaded: external_exports.boolean(),
19206
19224
  sizeMB: external_exports.number()
19207
- }))
19225
+ })),
19226
+ group: ModelVariantGroupSchema.optional(),
19227
+ legacy: external_exports.boolean().optional()
19208
19228
  });
19209
19229
  var ConfigFieldBridge = external_exports.custom();
19210
19230
  var PipelineAddonSchemaSchema = external_exports.object({
@@ -19218,6 +19238,7 @@ var PipelineAddonSchemaSchema = external_exports.object({
19218
19238
  defaultModelId: external_exports.string(),
19219
19239
  defaultModelIdByFormat: external_exports.record(external_exports.string(), external_exports.string()).optional(),
19220
19240
  enabledByDefault: external_exports.boolean().optional(),
19241
+ backfillIntoExistingOverrides: external_exports.boolean().optional(),
19221
19242
  defaultConfidence: external_exports.number(),
19222
19243
  group: external_exports.string().optional(),
19223
19244
  configSchema: external_exports.array(ConfigFieldBridge).readonly().optional()
@@ -19234,11 +19255,6 @@ var PipelineSchemaSchema = external_exports.object({
19234
19255
  selectedEngine: PipelineEngineChoiceSchema,
19235
19256
  slots: external_exports.array(PipelineSlotSchemaSchema).readonly()
19236
19257
  });
19237
- var DetectorOutputSchema = external_exports.object({
19238
- detections: external_exports.array(SpatialDetectionSchema).readonly(),
19239
- inferenceMs: external_exports.number(),
19240
- modelId: external_exports.string()
19241
- });
19242
19258
  var EngineProvisioningSchema = external_exports.object({
19243
19259
  runtimeId: external_exports.enum([
19244
19260
  "onnx",
@@ -19255,15 +19271,42 @@ var EngineProvisioningSchema = external_exports.object({
19255
19271
  ]),
19256
19272
  progress: external_exports.number().optional(),
19257
19273
  error: external_exports.string().optional(),
19258
- nextRetryAt: external_exports.number().optional()
19274
+ nextRetryAt: external_exports.number().optional(),
19275
+ /**
19276
+ * Gate A (config-correctness gate at engine change): human-readable
19277
+ * config issues surfaced EAGERLY when the node's engine changes — model
19278
+ * substitutions ("chose X, running Y") and zero-build steps ("no model
19279
+ * has a <format> build"). Additive/optional: informational only, never
19280
+ * enforced here — `assertEngineReady` (readiness) still gates inference.
19281
+ * Absent/empty when the node-default tree resolves cleanly.
19282
+ */
19283
+ configIssues: external_exports.array(external_exports.string()).optional()
19259
19284
  });
19260
19285
  var PipelineStepInputSchema = external_exports.lazy(() => external_exports.object({
19261
19286
  addonId: external_exports.string(),
19262
- modelId: external_exports.string(),
19287
+ modelId: external_exports.string().optional(),
19263
19288
  enabled: external_exports.boolean().default(true),
19264
19289
  children: external_exports.array(PipelineStepInputSchema).optional(),
19265
19290
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
19266
19291
  }));
19292
+ var ModelSubstitutionSchema = external_exports.object({
19293
+ addonId: external_exports.string(),
19294
+ chosen: external_exports.string(),
19295
+ running: external_exports.string(),
19296
+ format: external_exports.string()
19297
+ });
19298
+ var PipelineValidationIssueSchema = external_exports.object({
19299
+ addonId: external_exports.string(),
19300
+ kind: external_exports.enum(["unknown-addon", "no-format-build"]),
19301
+ detail: external_exports.string()
19302
+ });
19303
+ var PipelineValidationResultSchema = external_exports.object({
19304
+ ok: external_exports.boolean(),
19305
+ issues: external_exports.array(PipelineValidationIssueSchema).readonly(),
19306
+ substitutions: external_exports.array(ModelSubstitutionSchema).readonly(),
19307
+ /** The node's `currentEngine.format` this validation ran against. */
19308
+ format: external_exports.string()
19309
+ });
19267
19310
  var ReferenceImageEntrySchema = external_exports.object({
19268
19311
  filename: external_exports.string(),
19269
19312
  stepIds: external_exports.array(external_exports.string()).readonly().optional()
@@ -19354,10 +19397,45 @@ var pipelineExecutorCapability = {
19354
19397
  kind: "mutation",
19355
19398
  auth: "admin"
19356
19399
  }),
19400
+ /**
19401
+ * Clear THIS node's executor-side PER-DEVICE settings stores (the
19402
+ * per-camera step overrides the object-detection root reads via
19403
+ * `applyDeviceOverridesToTree`). `nodeId` is the ROUTING key — the
19404
+ * generated cap-router strips it (default `nodeIdMode: 'routing'`) and
19405
+ * dispatches to that node, so the provider method runs ON the target
19406
+ * node and receives no `nodeId`.
19407
+ *
19408
+ * This is the slimmed executor leg of the orchestrator's
19409
+ * `resetNodePipelineDefaults` flow (which owns the real reset: node
19410
+ * addonDefaults pins + per-camera orchestrator overrides). The legacy
19411
+ * `resetToDefault` — which reset a persisted global step-tree seed
19412
+ * nothing in the live per-camera path read — was removed together with
19413
+ * that seed.
19414
+ */
19415
+ clearDeviceOverrides: method(external_exports.object({ nodeId: external_exports.string() }), external_exports.object({
19416
+ success: external_exports.literal(true),
19417
+ clearedDevices: external_exports.number()
19418
+ }), {
19419
+ kind: "mutation",
19420
+ auth: "admin"
19421
+ }),
19357
19422
  getSchema: method(external_exports.void(), PipelineSchemaSchema),
19358
19423
  getGlobalSteps: method(external_exports.void(), external_exports.array(PipelineDefaultStepSchema).readonly().nullable()),
19359
19424
  getGlobalPipelineConfig: method(external_exports.void(), PipelineConfigBridge),
19360
19425
  getOrchestratorConfigSchema: method(external_exports.void(), ConfigUISchemaBridge),
19426
+ /**
19427
+ * Gate B (pre-init config-correctness gate). PURE COMPUTE against this
19428
+ * node's `currentEngine.format` — resolves `steps` the same way the
19429
+ * runtime dispatch path would, and reports what WOULD happen without
19430
+ * touching any node-global state. Called by the orchestrator at attach
19431
+ * time (`attachOn`), node-pinned to the TARGET node, so config problems
19432
+ * surface BEFORE `pipelineRunner.attachCamera` rather than at the first
19433
+ * per-frame resolve. `ok` is false iff `issues` is non-empty (both
19434
+ * `unknown-addon` and `no-format-build` are HARD issues); `substitutions`
19435
+ * is informational (a degraded-but-loadable model swap) and never
19436
+ * affects `ok`. Never throws.
19437
+ */
19438
+ validatePipeline: method(external_exports.object({ steps: external_exports.array(PipelineStepInputSchema) }), PipelineValidationResultSchema),
19361
19439
  listTemplates: method(external_exports.void(), external_exports.array(PipelineTemplateSchema$1).readonly()),
19362
19440
  saveTemplate: method(external_exports.object({
19363
19441
  name: external_exports.string(),
@@ -19382,11 +19460,6 @@ var pipelineExecutorCapability = {
19382
19460
  modelId: external_exports.string(),
19383
19461
  format: ModelFormatSchema$1
19384
19462
  }), external_exports.object({ success: external_exports.literal(true) }), { kind: "mutation" }),
19385
- detect: method(external_exports.object({
19386
- addonId: external_exports.string(),
19387
- frame: FrameInputSchema,
19388
- config: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
19389
- }), DetectorOutputSchema),
19390
19463
  /**
19391
19464
  * Stateless single-frame execution. Callers (runner, benchmark) pass
19392
19465
  * the complete `engine` + `steps` tree; the executor holds no state
@@ -19605,6 +19678,18 @@ var zonesCapability = {
19605
19678
  */
19606
19679
  runtimeState: external_exports.object({ zones: external_exports.array(ZoneSchema).readonly() })
19607
19680
  };
19681
+ var NativeCropBboxSchema = external_exports.object({
19682
+ x: external_exports.number(),
19683
+ y: external_exports.number(),
19684
+ w: external_exports.number(),
19685
+ h: external_exports.number()
19686
+ });
19687
+ var NativeCropResultSchema = external_exports.object({
19688
+ /** Packed rgb (24-bit) pixels of the crop. */
19689
+ bytes: external_exports.instanceof(Uint8Array),
19690
+ width: external_exports.number().int().positive(),
19691
+ height: external_exports.number().int().positive()
19692
+ });
19608
19693
  var motionCooldownMsField = {
19609
19694
  min: 0,
19610
19695
  max: 6e4,
@@ -19647,6 +19732,13 @@ var RunnerFrameSourceSchema = external_exports.discriminatedUnion("kind", [exter
19647
19732
  kind: external_exports.literal("remote-restream"),
19648
19733
  /** The camera's source-owner node (slice 1: always the hub). */
19649
19734
  ownerNodeId: external_exports.string(),
19735
+ /**
19736
+ * The owner's LAN-reachable host, resolved by the orchestrator from the
19737
+ * per-node `reachableHost` override (Cluster UI). When present the runner
19738
+ * dials THIS host for the owner's restream, in preference to the
19739
+ * `CAMSTACK_HUB_URL`-derived default. Absent → auto-detect fallback.
19740
+ */
19741
+ ownerReachableHost: external_exports.string().optional(),
19650
19742
  /** Operator override for the owner host the runner dials. */
19651
19743
  hubHostnameOverride: external_exports.string().optional()
19652
19744
  })]).describe("Per-camera frame-source mode for the runner (P2c)");
@@ -19699,14 +19791,11 @@ var RunnerCameraConfigSchema = external_exports.object({
19699
19791
  */
19700
19792
  motionSources: MotionSourcesSchema.default(["analyzer"]),
19701
19793
  pipelineEnabled: external_exports.boolean().default(true),
19702
- /** Engine choice for video steps (runtime+backend+format). */
19703
- engine: PipelineEngineChoiceSchema.optional(),
19704
19794
  /** Ordered tree of video steps. Absent → runner skips video detection. */
19705
19795
  steps: external_exports.array(PipelineStepInputSchema).readonly().optional(),
19706
19796
  /** Audio classification branch. `enabled:false` disables, null skips. */
19707
19797
  audio: external_exports.object({
19708
- engine: PipelineEngineChoiceSchema,
19709
- modelId: external_exports.string(),
19798
+ modelId: external_exports.string().optional(),
19710
19799
  enabled: external_exports.boolean()
19711
19800
  }).nullable().optional(),
19712
19801
  /**
@@ -19926,7 +20015,22 @@ var pipelineRunnerCapability = {
19926
20015
  /** All per-camera metrics in one round-trip. */
19927
20016
  getAllCameraMetrics: method(external_exports.void(), external_exports.array(CameraMetricsWithDeviceIdSchema).readonly()),
19928
20017
  /** List the deviceIds currently attached to this runner. */
19929
- getLocalCameras: method(external_exports.void(), external_exports.array(external_exports.number()).readonly())
20018
+ getLocalCameras: method(external_exports.void(), external_exports.array(external_exports.number()).readonly()),
20019
+ /**
20020
+ * Best-effort NATIVE-resolution crop of a retention-ring frame. Given the
20021
+ * `FrameHandle` that rode an inference-result event and a normalized `bbox`,
20022
+ * the runner asks the decode worker still holding that frame's NATIVE
20023
+ * surface to GPU/CPU-crop ONLY the ROI at native res and download just the
20024
+ * crop. Returns `null` on a miss (handle not registered, or the worker's
20025
+ * tiny native-retention ring already evicted the frame) — the caller falls
20026
+ * back to a detection-frame crop. Routed to the frame's owning node by
20027
+ * `handle.nodeId`; NEVER ships a full native frame.
20028
+ */
20029
+ getNativeCrop: method(external_exports.object({
20030
+ handle: FrameHandleSchema,
20031
+ bbox: NativeCropBboxSchema,
20032
+ maxWidth: external_exports.number().int().positive().optional()
20033
+ }), NativeCropResultSchema.nullable())
19930
20034
  }
19931
20035
  };
19932
20036
  var MotionStatusSchema = external_exports.object({
@@ -21849,7 +21953,9 @@ var AddonPageDeclarationSchema$1 = external_exports.object({
21849
21953
  icon: external_exports.string(),
21850
21954
  path: external_exports.string(),
21851
21955
  remoteName: external_exports.string(),
21852
- bundle: external_exports.string()
21956
+ bundle: external_exports.string(),
21957
+ section: external_exports.string().optional(),
21958
+ sectionLabel: external_exports.string().optional()
21853
21959
  });
21854
21960
  var AddonPageInfoSchema = external_exports.object({
21855
21961
  addonId: external_exports.string(),
@@ -21882,7 +21988,18 @@ var AddonPageDeclarationSchema = external_exports.object({
21882
21988
  * the static-file route can compute an mtime-based cache-buster URL
21883
21989
  * without a separate filesystem stat.
21884
21990
  */
21885
- bundle: external_exports.string()
21991
+ bundle: external_exports.string(),
21992
+ /**
21993
+ * Sidebar section this page docks into. Well-known ids: `'detection'`,
21994
+ * `'cluster'`, `'administration'` — the page renders inside that group.
21995
+ * Any OTHER string creates (or joins) a custom section rendered after
21996
+ * the built-in groups; its label comes from `sectionLabel` (first
21997
+ * declaration wins), falling back to the id. Absent → the legacy
21998
+ * "Addon Pages" group.
21999
+ */
22000
+ section: external_exports.string().optional(),
22001
+ /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
22002
+ sectionLabel: external_exports.string().optional()
21886
22003
  });
21887
22004
  var addonPagesSourceCapability = {
21888
22005
  name: "addon-pages-source",
@@ -22067,6 +22184,17 @@ var WidgetMetadataSchema = external_exports.object({
22067
22184
  deviceContext: external_exports.boolean().default(false),
22068
22185
  integrationContext: external_exports.boolean().default(false)
22069
22186
  }),
22187
+ /**
22188
+ * Loadable BEFORE authentication. The normal widget registry listing
22189
+ * (`addon-widgets.listWidgets`) is auth-gated, so a pre-auth surface
22190
+ * (the login page) cannot discover a widget through it. A widget that
22191
+ * declares `preAuth: true` marks itself as safe to mount on a pre-auth
22192
+ * screen — it is surfaced through the PUBLIC `auth.listLoginMethods`
22193
+ * login-method contribution channel (see `login-method.cap.ts`) rather
22194
+ * than the authenticated registry, and its bundle is served by the
22195
+ * public `/api/addon-widgets/:addonId/*` static route. Defaults false.
22196
+ */
22197
+ preAuth: external_exports.boolean().optional().default(false),
22070
22198
  /** Dashboard placement HINTS (operator can override per instance). */
22071
22199
  defaultSize: WidgetSizeEnum.default("md"),
22072
22200
  allowedSizes: external_exports.array(WidgetSizeEnum).readonly().default([
@@ -22454,6 +22582,41 @@ var authProviderCapability = {
22454
22582
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
22455
22583
  mount: { kind: "skip" }
22456
22584
  };
22585
+ var LoginStageEnum = external_exports.enum(["primary", "second-factor"]);
22586
+ var RedirectLoginMethodSchema = external_exports.object({
22587
+ kind: external_exports.literal("redirect"),
22588
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
22589
+ id: external_exports.string(),
22590
+ /** Operator-facing button label. */
22591
+ label: external_exports.string(),
22592
+ /** lucide-react icon name. */
22593
+ icon: external_exports.string().optional(),
22594
+ /** Addon-owned HTTP route the button navigates to (GET). */
22595
+ startUrl: external_exports.string(),
22596
+ stage: LoginStageEnum
22597
+ });
22598
+ var WidgetLoginMethodSchema = external_exports.object({
22599
+ kind: external_exports.literal("widget"),
22600
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
22601
+ id: external_exports.string(),
22602
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
22603
+ addonId: external_exports.string(),
22604
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
22605
+ bundle: external_exports.string(),
22606
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
22607
+ remote: WidgetRemoteSchema,
22608
+ stage: LoginStageEnum
22609
+ });
22610
+ var LoginMethodContributionSchema = external_exports.discriminatedUnion("kind", [RedirectLoginMethodSchema, WidgetLoginMethodSchema]);
22611
+ var loginMethodCapability = {
22612
+ name: "login-method",
22613
+ scope: "system",
22614
+ mode: "collection",
22615
+ internal: true,
22616
+ methods: { getLoginMethods: method(external_exports.void(), external_exports.array(LoginMethodContributionSchema).readonly()) },
22617
+ /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
22618
+ mount: { kind: "skip" }
22619
+ };
22457
22620
  var BackupDestinationInfoSchema = external_exports.object({
22458
22621
  /**
22459
22622
  * Sub-id within this addon. Convention `default` for single-
@@ -24856,7 +25019,17 @@ var TrackSchema = external_exports.object({
24856
25019
  /** Cumulative normalized distance travelled (0..1 units = full frame width). */
24857
25020
  totalDistance: external_exports.number(),
24858
25021
  state: TrackStateSchema,
24859
- active: external_exports.boolean()
25022
+ active: external_exports.boolean(),
25023
+ /** Deterministic key-event importance score in [0,1] (server-computed at
25024
+ * track expiry, recomputed on late label). Absent on legacy rows written
25025
+ * before scoring shipped — consumers degrade to absence / compute-on-read. */
25026
+ importance: external_exports.number().optional(),
25027
+ /** Id of the track's highest-confidence ObjectEvent (its representative
25028
+ * "best" frame). Absent when the track produced no object events. */
25029
+ bestEventId: external_exports.string().optional(),
25030
+ /** Tag of the importance sub-signal that dominated the score
25031
+ * (identity|dwell|proximity|class|confidence|travel|zone). */
25032
+ importanceReason: external_exports.string().optional()
24860
25033
  });
24861
25034
  var BaseEventFields = {
24862
25035
  id: external_exports.string(),
@@ -24913,8 +25086,18 @@ var ObjectEventSchema = external_exports.object({
24913
25086
  frameHeight: external_exports.number().optional(),
24914
25087
  /** MediaStore key for the crop attached to this event (if any). */
24915
25088
  mediaKey: external_exports.string().optional(),
25089
+ /** Design B: MediaStore key of the track's native-resolution key frame (the
25090
+ * best-detection full frame). Resolve via the event-media data-plane
25091
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`) for a detail view that
25092
+ * draws `bbox` over the native frame. Absent on legacy rows / non-decoded
25093
+ * sources — consumers fall back to `mediaKey` (the tight crop). */
25094
+ keyFrameMediaKey: external_exports.string().optional(),
24916
25095
  /** Populated by B5 (recording playback URL for this event). */
24917
- mediaUrl: external_exports.string().optional()
25096
+ mediaUrl: external_exports.string().optional(),
25097
+ /** The parent track's key-event importance [0,1], propagated to every object
25098
+ * event of the track (so an event row can be sorted by importance without a
25099
+ * track join). Absent on legacy rows / before the track was scored. */
25100
+ importance: external_exports.number().optional()
24918
25101
  });
24919
25102
  var AudioEventSchema = external_exports.object({
24920
25103
  ...BaseEventFields,
@@ -24938,7 +25121,8 @@ var MediaFileKindEnum = external_exports.enum([
24938
25121
  "fullFrame",
24939
25122
  "fullFrameBoxed",
24940
25123
  "faceCrop",
24941
- "plateCrop"
25124
+ "plateCrop",
25125
+ "keyFrame"
24942
25126
  ]);
24943
25127
  var MediaFileSchema = external_exports.object({
24944
25128
  key: external_exports.string(),
@@ -24959,6 +25143,32 @@ var DeviceEventQueryInput = external_exports.object({
24959
25143
  projection: external_exports.enum(["full", "slim"]).optional()
24960
25144
  });
24961
25145
  var ObjectEventQueryInput = DeviceEventQueryInput.extend({ classFilter: external_exports.string().optional() });
25146
+ var KeyEventQueryInput = external_exports.object({
25147
+ deviceId: external_exports.number(),
25148
+ /** Window lower bound (track firstSeen ≥ since). */
25149
+ since: external_exports.number(),
25150
+ /** Window upper bound (track firstSeen ≤ until). */
25151
+ until: external_exports.number(),
25152
+ limit: external_exports.number().int().min(1).max(200).default(50),
25153
+ /** Drop tracks scoring below this importance. */
25154
+ minImportance: external_exports.number().min(0).max(1).optional(),
25155
+ /** Restrict to a single class (e.g. 'person'). */
25156
+ classFilter: external_exports.string().optional()
25157
+ });
25158
+ var KeyEventSchema = external_exports.object({
25159
+ /** The representative event id (the track's best ObjectEvent, else its trackId). */
25160
+ id: external_exports.string(),
25161
+ trackId: external_exports.string(),
25162
+ /** Track start time (firstSeen). */
25163
+ timestamp: external_exports.number(),
25164
+ className: external_exports.string(),
25165
+ label: external_exports.string().optional(),
25166
+ importance: external_exports.number(),
25167
+ /** Highest-confidence ObjectEvent id for the track (empty when none). */
25168
+ bestEventId: external_exports.string(),
25169
+ /** Track lifetime in ms (lastSeen - firstSeen). */
25170
+ windowMs: external_exports.number().optional()
25171
+ });
24962
25172
  var TrackedDetectionSchema = external_exports.object({
24963
25173
  trackId: external_exports.string(),
24964
25174
  className: external_exports.string(),
@@ -25007,6 +25217,15 @@ var pipelineAnalyticsCapability = {
25007
25217
  getMotionEvents: method(DeviceEventQueryInput, external_exports.array(MotionEventSchema).readonly()),
25008
25218
  getObjectEvents: method(ObjectEventQueryInput, external_exports.array(ObjectEventSchema).readonly()),
25009
25219
  getAudioEvents: method(DeviceEventQueryInput, external_exports.array(AudioEventSchema).readonly()),
25220
+ /**
25221
+ * Importance-ranked highlights for a device+window. Queries completed
25222
+ * tracks by (deviceId, firstSeen ∈ [since,until]), scores each (or reuses
25223
+ * the persisted score), filters by minImportance/classFilter, orders by
25224
+ * importance desc, and returns up to `limit` compact key events mapped to
25225
+ * each track's best event. Legacy tracks lacking a persisted score are
25226
+ * scored on-read (no write). Degrades to `[]` on error.
25227
+ */
25228
+ getKeyEvents: method(KeyEventQueryInput, external_exports.array(KeyEventSchema).readonly()),
25010
25229
  /** Server-side bucketed event counts for the 24-hour timeline.
25011
25230
  * Returns one entry per non-empty bucket; empty buckets are omitted. */
25012
25231
  getEventDensity: method(external_exports.object({
@@ -25091,11 +25310,11 @@ var pipelineAnalyticsCapability = {
25091
25310
  }
25092
25311
  };
25093
25312
  var CameraPipelineConfigSchema = external_exports.object({
25094
- engine: PipelineEngineChoiceSchema,
25313
+ engine: PipelineEngineChoiceSchema.optional(),
25095
25314
  steps: external_exports.array(PipelineStepInputSchema).readonly(),
25096
25315
  audio: external_exports.object({
25097
- engine: PipelineEngineChoiceSchema,
25098
- modelId: external_exports.string(),
25316
+ engine: PipelineEngineChoiceSchema.optional(),
25317
+ modelId: external_exports.string().optional(),
25099
25318
  enabled: external_exports.boolean(),
25100
25319
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).readonly().optional()
25101
25320
  }).nullable().optional()
@@ -25110,7 +25329,7 @@ var PipelineTemplateSchema = external_exports.object({
25110
25329
  });
25111
25330
  var AgentAddonConfigSchema = external_exports.object({
25112
25331
  enabled: external_exports.boolean(),
25113
- modelId: external_exports.string(),
25332
+ modelId: external_exports.string().optional(),
25114
25333
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).readonly()
25115
25334
  });
25116
25335
  var AgentPipelineSettingsSchema = external_exports.object({
@@ -25120,12 +25339,25 @@ var AgentPipelineSettingsSchema = external_exports.object({
25120
25339
  detectWeight: external_exports.number().positive().optional(),
25121
25340
  /** Node is eligible to run the detection pipeline (decode + inference). */
25122
25341
  detect: external_exports.boolean().optional(),
25123
- /** Node is eligible to host decoder sessions. */
25342
+ /**
25343
+ * DEPRECATED AND IGNORED. Decode is always co-located with its frame
25344
+ * consumer, so decode eligibility IS detect eligibility. Kept optional in
25345
+ * the schema ONLY so persisted stores written before the removal still
25346
+ * parse — no code reads it and no write path emits it.
25347
+ */
25124
25348
  decode: external_exports.boolean().optional(),
25125
25349
  /** Node is eligible to run audio-analyzer sessions. */
25126
25350
  audio: external_exports.boolean().optional(),
25127
25351
  /** Node is eligible to be the ingest / source-owner (serve the restream). */
25128
- ingest: external_exports.boolean().optional()
25352
+ ingest: external_exports.boolean().optional(),
25353
+ /**
25354
+ * Operator override for the LAN host a cross-node decoder dials to reach
25355
+ * THIS node's restream (Cluster UI). Absent → auto-detect: a remote runner
25356
+ * falls back to its `CAMSTACK_HUB_URL`-derived host (the Moleculer address
25357
+ * it already uses to reach the hub). Set this only when the auto-detected
25358
+ * address is wrong (multi-homed host, NAT, custom interface).
25359
+ */
25360
+ reachableHost: external_exports.string().optional()
25129
25361
  });
25130
25362
  var CameraPipelineForAgentSchema = external_exports.object({
25131
25363
  steps: external_exports.array(PipelineStepInputSchema).readonly(),
@@ -25162,20 +25394,6 @@ var PipelineAssignmentSchema = external_exports.object({
25162
25394
  /** Unix timestamp (ms) when the assignment was last updated. */
25163
25395
  assignedAt: external_exports.number()
25164
25396
  });
25165
- var DecoderAssignmentSchema = external_exports.object({
25166
- deviceId: external_exports.number(),
25167
- /** Moleculer node id of the decoder provider currently responsible for this camera. */
25168
- decoderNodeId: external_exports.string(),
25169
- /** True when the assignment was set manually via `assignDecoder`, false when chosen by the balancer. */
25170
- pinned: external_exports.boolean(),
25171
- /** Why this assignment was made — useful for debugging the decoder balancer. */
25172
- reason: external_exports.enum([
25173
- "manual",
25174
- "co-located",
25175
- "capacity",
25176
- "hardware-affinity"
25177
- ])
25178
- });
25179
25397
  var AgentLoadSummarySchema = external_exports.object({
25180
25398
  nodeId: external_exports.string(),
25181
25399
  online: external_exports.boolean(),
@@ -25198,6 +25416,11 @@ var GlobalMetricsSchema = external_exports.object({
25198
25416
  queueDepth: external_exports.number()
25199
25417
  });
25200
25418
  var CapabilityBindingsSchema = external_exports.record(external_exports.string(), external_exports.string());
25419
+ var IngestOwnerSchema = external_exports.object({
25420
+ ownerNodeId: external_exports.string(),
25421
+ reachableHost: external_exports.string().optional(),
25422
+ configIssue: external_exports.string().optional()
25423
+ });
25201
25424
  var CameraSourceStreamSchema = external_exports.object({
25202
25425
  camStreamId: external_exports.string(),
25203
25426
  codec: external_exports.string(),
@@ -25211,6 +25434,14 @@ var CameraAssignmentStatusSchema = external_exports.object({
25211
25434
  detectionNodeId: external_exports.string().nullable(),
25212
25435
  decoderNodeId: external_exports.string().nullable(),
25213
25436
  audioNodeId: external_exports.string().nullable(),
25437
+ /**
25438
+ * The node that OWNS this camera's physical source pull (dials the RTSP and
25439
+ * hosts the broker/restream) — the cluster ingest owner today
25440
+ * (`clusterRoles.ingestNode`), per-camera once source assignment lands. Lets
25441
+ * the UI show WHERE a camera is sourced without SSH/logs, and is the node the
25442
+ * broker block below was read from (pinned). Nullable only pre-wiring.
25443
+ */
25444
+ sourceNodeId: external_exports.string().nullable(),
25214
25445
  pinned: external_exports.object({
25215
25446
  detection: external_exports.boolean(),
25216
25447
  decoder: external_exports.boolean(),
@@ -25384,21 +25615,14 @@ var pipelineOrchestratorCapability = {
25384
25615
  kind: "mutation",
25385
25616
  auth: "admin"
25386
25617
  }),
25387
- /** Pin a device's decoder to a specific node. */
25388
- assignDecoder: method(external_exports.object({
25389
- deviceId: external_exports.number(),
25390
- nodeId: external_exports.string()
25391
- }), external_exports.void(), {
25392
- kind: "mutation",
25393
- auth: "admin"
25394
- }),
25395
- /** Clear a device's decoder pin (revert to auto). */
25396
- unassignDecoder: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.void(), {
25397
- kind: "mutation",
25398
- auth: "admin"
25399
- }),
25400
- /** Get every camera's decoder placement. */
25401
- getDecoderAssignments: method(external_exports.void(), external_exports.array(DecoderAssignmentSchema).readonly()),
25618
+ /**
25619
+ * The cluster's single camera-source owner — resolved UNCONDITIONALLY
25620
+ * from `clusterRoles.ingestNode` (NOT the detection-decode
25621
+ * `remoteSourcingNodes` knob). Consumers (recorder/snapshot/audio) pin
25622
+ * their broker calls to `ownerNodeId` and dial `reachableHost` when
25623
+ * present. Defaults to `{ ownerNodeId: 'hub' }`.
25624
+ */
25625
+ getIngestOwner: method(external_exports.void(), IngestOwnerSchema),
25402
25626
  /** Pin a device's audio analysis to a specific cluster node. */
25403
25627
  assignAudio: method(external_exports.object({
25404
25628
  deviceId: external_exports.number(),
@@ -25430,23 +25654,6 @@ var pipelineOrchestratorCapability = {
25430
25654
  pinned: external_exports.boolean(),
25431
25655
  assignedAt: external_exports.number()
25432
25656
  }))),
25433
- /**
25434
- * Get one camera's decoder placement (computed if not yet pinned).
25435
- *
25436
- * ADVISORY today: reports the orchestrator's decoder preference only.
25437
- * Actual decode placement is broker-owned (local-node pin + frame-plane
25438
- * co-location guard). Reserved to become the binding source/decoder-owner
25439
- * control in the stream-LB epic (Phase 2).
25440
- *
25441
- * `pipelineNodeId` is the node already chosen to run inference for
25442
- * this camera. When provided, the balancer prefers co-location with
25443
- * it; omitted → falls back to the last known assignment in the
25444
- * `assignments` map and finally to 'hub'.
25445
- */
25446
- getDecoderAssignment: method(external_exports.object({
25447
- deviceId: external_exports.number(),
25448
- pipelineNodeId: external_exports.string().optional()
25449
- }), DecoderAssignmentSchema),
25450
25657
  /** Read one agent's settings. Null when not yet seeded. */
25451
25658
  getAgentSettings: method(external_exports.object({ agentNodeId: external_exports.string() }), AgentPipelineSettingsSchema.nullable()),
25452
25659
  /** Enumerate every agent's settings (hub + remote runners). */
@@ -25516,20 +25723,65 @@ var pipelineOrchestratorCapability = {
25516
25723
  * `enabledDecoderNodes`, `enabledAudioNodes`, `remoteSourcingNodes`).
25517
25724
  * Each flag is optional in the patch: omit a flag to leave it unchanged,
25518
25725
  * pass `null` to reset it to the node default (`hub` → capable, every
25519
- * other node → not). Detection/decode/audio eligibility is derived from
25520
- * these flags across the cluster; changing them re-derives the enabled
25521
- * sets and reconciles dispatch immediately.
25726
+ * other node → not). Detection/audio eligibility is derived from these
25727
+ * flags across the cluster; changing them re-derives the enabled sets
25728
+ * and reconciles dispatch immediately. There is NO separate decode flag:
25729
+ * decode is always co-located with its frame consumer, so decode
25730
+ * eligibility IS detect eligibility.
25522
25731
  */
25523
25732
  setAgentCapabilities: method(external_exports.object({
25524
25733
  agentNodeId: external_exports.string(),
25525
25734
  detect: external_exports.boolean().nullable().optional(),
25526
- decode: external_exports.boolean().nullable().optional(),
25527
25735
  audio: external_exports.boolean().nullable().optional(),
25528
25736
  ingest: external_exports.boolean().nullable().optional()
25529
25737
  }), external_exports.object({ success: external_exports.literal(true) }), {
25530
25738
  kind: "mutation",
25531
25739
  auth: "admin"
25532
25740
  }),
25741
+ /**
25742
+ * Set (or clear) the operator override for the LAN host a cross-node
25743
+ * decoder dials to reach this node's restream. Pass a non-empty string to
25744
+ * override the auto-detected address (the runner's `CAMSTACK_HUB_URL`
25745
+ * default); pass `null` or an empty string to clear it and revert to
25746
+ * auto-detect. Applied on the next dispatch cycle — takes effect for new
25747
+ * cross-node attaches; existing attaches keep their current host until
25748
+ * re-dispatched.
25749
+ */
25750
+ setAgentReachableHost: method(external_exports.object({
25751
+ agentNodeId: external_exports.string(),
25752
+ reachableHost: external_exports.string().nullable()
25753
+ }), external_exports.object({ success: external_exports.literal(true) }), {
25754
+ kind: "mutation",
25755
+ auth: "admin"
25756
+ }),
25757
+ /**
25758
+ * Reset one node's pipeline to its hardware-aware defaults — the HONEST
25759
+ * reset (replaces the executor's legacy `resetToDefault`, which cleared a
25760
+ * dead persisted step-tree seed nothing in the live path read):
25761
+ * (a) strips every `modelId` pin from that node's
25762
+ * `agentSettings.addonDefaults` (cells revert to Auto — the node
25763
+ * resolves its own hardware-aware format default at runtime);
25764
+ * (b) clears per-camera step overrides scoped to that node
25765
+ * (`stepOverridesByAgent[node]` + the wholesale
25766
+ * `pipelineByAgent[node]` escape hatch);
25767
+ * (c) clears the executor-side per-device settings stores on that node
25768
+ * (`pipelineExecutor.clearDeviceOverrides`);
25769
+ * (d) hot-reloads every camera assigned to the node.
25770
+ *
25771
+ * Returns the EFFECTIVE post-reset object-detection model for the node
25772
+ * (the executor's pure hardware-aware default) so the UI can report what
25773
+ * will actually run — not a value that never reaches the live path.
25774
+ */
25775
+ resetNodePipelineDefaults: method(external_exports.object({ agentNodeId: external_exports.string() }), external_exports.object({
25776
+ success: external_exports.literal(true),
25777
+ /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
25778
+ effectiveModelId: external_exports.string().nullable(),
25779
+ /** Number of cameras whose node-scoped overrides were cleared. */
25780
+ clearedCameraOverrides: external_exports.number()
25781
+ }), {
25782
+ kind: "mutation",
25783
+ auth: "admin"
25784
+ }),
25533
25785
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
25534
25786
  getCameraSettings: method(external_exports.object({ deviceId: external_exports.number() }), CameraPipelineSettingsSchema.nullable()),
25535
25787
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -25621,33 +25873,107 @@ var pipelineOrchestratorCapability = {
25621
25873
  })
25622
25874
  }
25623
25875
  };
25624
- var RegisteredStreamSchema = external_exports.object({
25625
- streamId: external_exports.string(),
25626
- label: external_exports.string().optional(),
25627
- codec: external_exports.string(),
25628
- type: external_exports.enum(["video", "audio"]),
25629
- sourceUrl: external_exports.string()
25876
+ var ServerBootModeSchema = external_exports.enum([
25877
+ "workspace",
25878
+ "baked",
25879
+ "data-root"
25880
+ ]);
25881
+ var ServerUpdateStateSchema = external_exports.enum([
25882
+ "idle",
25883
+ "checking",
25884
+ "staging",
25885
+ "pending-restart",
25886
+ "awaiting-confirmation"
25887
+ ]);
25888
+ var ServerRollbackInfoSchema = external_exports.object({
25889
+ /** The version that failed (or was manually rolled back). */
25890
+ fromVersion: external_exports.string(),
25891
+ /** The version rolled back to; null = the baked seed. */
25892
+ toVersion: external_exports.string().nullable(),
25893
+ atMs: external_exports.number(),
25894
+ reason: external_exports.string()
25630
25895
  });
25631
- var ExposedResourceSchema = external_exports.object({
25632
- streamId: external_exports.string(),
25633
- format: external_exports.string(),
25634
- value: external_exports.string()
25896
+ var ServerPackageStatusSchema = external_exports.object({
25897
+ /** Root package name (`@camstack/server` on the hub). */
25898
+ packageName: external_exports.string(),
25899
+ /** Version of the code the running process ACTUALLY loaded. */
25900
+ runningVersion: external_exports.string().nullable(),
25901
+ /** Node.js runtime version the node's process runs on (`process.versions.node`). */
25902
+ nodeRuntimeVersion: external_exports.string().nullable(),
25903
+ /** Active data-dir root version; null when booted from seed/workspace. */
25904
+ activeVersion: external_exports.string().nullable(),
25905
+ /** N-1 version kept for rollback; null when no previous version exists. */
25906
+ previousVersion: external_exports.string().nullable(),
25907
+ /** Version of the immutable baked seed closure (image fallback). */
25908
+ seedVersion: external_exports.string().nullable(),
25909
+ /** Latest registry version from the most recent check (null = never checked). */
25910
+ latestVersion: external_exports.string().nullable(),
25911
+ updateAvailable: external_exports.boolean(),
25912
+ bootMode: ServerBootModeSchema,
25913
+ updateState: ServerUpdateStateSchema,
25914
+ /** Version staged + awaiting its probation boot, when one is pending. */
25915
+ pendingVersion: external_exports.string().nullable(),
25916
+ /** Set when the last freshly-activated version failed its boot health-check. */
25917
+ rolledBack: ServerRollbackInfoSchema.nullable(),
25918
+ /**
25919
+ * True when `server-root/state.json` EXISTS but is unreadable/corrupt — the
25920
+ * hub is running from the baked seed (or workspace) while installed data-dir
25921
+ * versions are being IGNORED. Surfaced as a warning in the UI.
25922
+ */
25923
+ stateFileCorrupt: external_exports.boolean(),
25924
+ lastCheckedAtMs: external_exports.number().nullable()
25925
+ });
25926
+ var ServerUpdateCheckResultSchema = external_exports.object({
25927
+ packageName: external_exports.string(),
25928
+ runningVersion: external_exports.string().nullable(),
25929
+ latestVersion: external_exports.string().nullable(),
25930
+ updateAvailable: external_exports.boolean(),
25931
+ checkedAtMs: external_exports.number(),
25932
+ /** Non-null when the registry lookup failed (offline, bad registry, …). */
25933
+ error: external_exports.string().nullable()
25934
+ });
25935
+ var ServerUpdateActionResultSchema = external_exports.object({
25936
+ accepted: external_exports.boolean(),
25937
+ targetVersion: external_exports.string().nullable(),
25938
+ /** True when a graceful restart was scheduled to apply the change. */
25939
+ restarting: external_exports.boolean(),
25940
+ message: external_exports.string()
25635
25941
  });
25636
- var restreamerCapability = {
25637
- name: "restreamer",
25942
+ var serverManagementCapability = {
25943
+ name: "server-management",
25638
25944
  scope: "system",
25639
- mode: "collection",
25640
- internal: true,
25945
+ mode: "singleton",
25641
25946
  methods: {
25642
- registerDevice: method(external_exports.object({
25643
- deviceId: external_exports.number(),
25644
- streams: external_exports.array(RegisteredStreamSchema).readonly()
25645
- }), external_exports.void(), { kind: "mutation" }),
25646
- unregisterDevice: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.void(), { kind: "mutation" }),
25647
- getExposedResources: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.array(ExposedResourceSchema).readonly())
25947
+ getServerPackageStatus: method(external_exports.void(), ServerPackageStatusSchema, { auth: "admin" }),
25948
+ checkServerUpdate: method(external_exports.void(), ServerUpdateCheckResultSchema, {
25949
+ kind: "mutation",
25950
+ auth: "admin"
25951
+ }),
25952
+ applyServerUpdate: method(external_exports.object({
25953
+ /** Explicit target version; omitted = latest from the registry. */
25954
+ version: external_exports.string().optional()
25955
+ }), ServerUpdateActionResultSchema, {
25956
+ kind: "mutation",
25957
+ auth: "admin"
25958
+ }),
25959
+ rollbackServerUpdate: method(external_exports.void(), ServerUpdateActionResultSchema, {
25960
+ kind: "mutation",
25961
+ auth: "admin"
25962
+ }),
25963
+ /**
25964
+ * Plain process restart of the node's root process — no version change.
25965
+ * The supervisor (docker restart policy / launchd / Electron main)
25966
+ * relaunches and the starter loads the SAME active version. Refused while
25967
+ * a stage is in flight or a version is already staged awaiting restart
25968
+ * (use apply/rollback instead, so the pending version is not skipped).
25969
+ */
25970
+ restartServer: method(external_exports.void(), ServerUpdateActionResultSchema, {
25971
+ kind: "mutation",
25972
+ auth: "admin"
25973
+ })
25648
25974
  },
25649
25975
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
25650
- mount: { kind: "skip" }
25976
+ mount: { kind: "server-provided" }
25651
25977
  };
25652
25978
  var QueryFilterSchema = external_exports.object({
25653
25979
  where: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
@@ -25866,27 +26192,26 @@ var snapshotCapability = {
25866
26192
  invalidateCache: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.void(), {
25867
26193
  kind: "mutation",
25868
26194
  auth: "admin"
25869
- })
26195
+ }),
26196
+ /**
26197
+ * Cache-only batch overview — answers from the wrapper's in-memory cache in
26198
+ * O(n) and NEVER triggers a capture. Lets a grid skip requesting images for
26199
+ * devices that never produced a frame, and gives it an ETag per device for
26200
+ * conditional (304-able) image fetches. `lastCapturedAt`/`cacheAgeMs`/`etag`
26201
+ * are null for a device with no cached frame.
26202
+ */
26203
+ getSnapshotOverview: systemMethod(external_exports.object({ deviceIds: external_exports.array(external_exports.number()).min(1).max(200) }), external_exports.array(external_exports.object({
26204
+ deviceId: external_exports.number(),
26205
+ lastCapturedAt: external_exports.number().nullable(),
26206
+ cacheAgeMs: external_exports.number().nullable(),
26207
+ etag: external_exports.string().nullable()
26208
+ })))
25870
26209
  },
25871
26210
  status: {
25872
26211
  schema: SnapshotStatusSchema,
25873
26212
  kind: "poll"
25874
26213
  }
25875
26214
  };
25876
- var snapshotProviderCapability = {
25877
- name: "snapshot-provider",
25878
- scope: "system",
25879
- mode: "collection",
25880
- methods: {
25881
- supportsDevice: method(external_exports.object({ deviceId: external_exports.number() }), external_exports.boolean()),
25882
- getSnapshot: method(external_exports.object({
25883
- deviceId: external_exports.number(),
25884
- streamId: external_exports.string().optional()
25885
- }), SnapshotImageSchema.nullable())
25886
- },
25887
- /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
25888
- mount: { kind: "custom" }
25889
- };
25890
26215
  var SsoBridgeClaimsSchema = external_exports.object({
25891
26216
  userId: external_exports.string(),
25892
26217
  username: external_exports.string(),
@@ -26220,6 +26545,20 @@ var userPasskeysCapability = {
26220
26545
  kind: "mutation",
26221
26546
  access: "view"
26222
26547
  }),
26548
+ beginDiscoverableAuthentication: method(external_exports.object({}), external_exports.object({ optionsJSON: external_exports.record(external_exports.string(), external_exports.unknown()) }), {
26549
+ kind: "mutation",
26550
+ access: "view"
26551
+ }),
26552
+ finishDiscoverableAuthentication: method(external_exports.object({
26553
+ /** AuthenticationResponseJSON from the browser. */
26554
+ response: external_exports.record(external_exports.string(), external_exports.unknown())
26555
+ }), external_exports.object({
26556
+ verified: external_exports.boolean(),
26557
+ userId: external_exports.string().nullable()
26558
+ }), {
26559
+ kind: "mutation",
26560
+ access: "view"
26561
+ }),
26223
26562
  listPasskeys: method(external_exports.object({ userId: external_exports.string() }), external_exports.array(PasskeySummarySchema), { auth: "admin" }),
26224
26563
  removePasskey: method(external_exports.object({
26225
26564
  userId: external_exports.string(),
@@ -26228,6 +26567,15 @@ var userPasskeysCapability = {
26228
26567
  kind: "mutation",
26229
26568
  auth: "admin",
26230
26569
  access: "delete"
26570
+ }),
26571
+ getSecondFactorPreference: method(external_exports.object({ userId: external_exports.string() }), external_exports.object({ enabled: external_exports.boolean() }), { auth: "admin" }),
26572
+ setSecondFactorPreference: method(external_exports.object({
26573
+ userId: external_exports.string(),
26574
+ enabled: external_exports.boolean()
26575
+ }), external_exports.object({ success: external_exports.literal(true) }), {
26576
+ kind: "mutation",
26577
+ auth: "admin",
26578
+ access: "create"
26231
26579
  })
26232
26580
  }
26233
26581
  };
@@ -26291,49 +26639,6 @@ var webrtcClientHintsSchema = external_exports.object({
26291
26639
  /** Hard tier override; takes precedence over scoring when registered. */
26292
26640
  prefersTier: external_exports.string().optional()
26293
26641
  }).partial();
26294
- var webrtcCapability = {
26295
- name: "webrtc",
26296
- scope: "system",
26297
- mode: "collection",
26298
- internal: true,
26299
- methods: {
26300
- handleOffer: method(external_exports.object({
26301
- streamId: external_exports.string(),
26302
- sdpOffer: external_exports.string()
26303
- }), external_exports.string(), { kind: "mutation" }),
26304
- supportsStream: method(external_exports.object({ streamId: external_exports.string() }), external_exports.boolean()),
26305
- registerStream: method(external_exports.object({
26306
- streamId: external_exports.string(),
26307
- codec: external_exports.string()
26308
- }), external_exports.void(), { kind: "mutation" }),
26309
- unregisterStream: method(external_exports.object({ streamId: external_exports.string() }), external_exports.void(), { kind: "mutation" }),
26310
- /**
26311
- * Two-step server-offer signaling. `hints` is optional — providers
26312
- * that don't care about adaptive source selection ignore it.
26313
- */
26314
- createSession: method(external_exports.object({
26315
- streamId: external_exports.string(),
26316
- hints: webrtcClientHintsSchema.optional()
26317
- }), external_exports.object({
26318
- sessionId: external_exports.string(),
26319
- sdpOffer: external_exports.string()
26320
- }), { kind: "mutation" }),
26321
- handleAnswer: method(external_exports.object({
26322
- sessionId: external_exports.string(),
26323
- sdpAnswer: external_exports.string()
26324
- }), external_exports.void(), { kind: "mutation" }),
26325
- closeSession: method(external_exports.object({ sessionId: external_exports.string() }), external_exports.void(), { kind: "mutation" }),
26326
- /**
26327
- * Whether this provider supports adaptive bitrate for the given stream.
26328
- * Currently always false — adaptive selection is one-shot at session
26329
- * start, not in-session encoder switching. Phase 5 plans to layer
26330
- * encoder-driven adaptation on top.
26331
- */
26332
- hasAdaptiveBitrate: method(external_exports.object({ streamId: external_exports.string() }), external_exports.boolean())
26333
- },
26334
- /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
26335
- mount: { kind: "skip" }
26336
- };
26337
26642
  var WebrtcStreamTargetSchema = external_exports.discriminatedUnion("kind", [
26338
26643
  external_exports.object({ kind: external_exports.literal("adaptive") }),
26339
26644
  external_exports.object({
@@ -26576,7 +26881,7 @@ var webrtcSessionCapability = {
26576
26881
  }).nullable() }))
26577
26882
  },
26578
26883
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
26579
- mount: { kind: "custom" }
26884
+ mount: { kind: "server-provided" }
26580
26885
  };
26581
26886
  var AccessoriesStatusSchema = external_exports.object({
26582
26887
  /** All accessory children of the parent. */
@@ -27176,7 +27481,7 @@ var addonsCapability = {
27176
27481
  }), LogStreamEntrySchema, { kind: "subscription" })
27177
27482
  },
27178
27483
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
27179
- mount: { kind: "service-backed" }
27484
+ mount: { kind: "server-provided" }
27180
27485
  };
27181
27486
  var buttonCapability = {
27182
27487
  name: "button",
@@ -27298,7 +27603,17 @@ var FaceInfoSchema = external_exports.object({
27298
27603
  recognizedIdentityId: external_exports.string().optional(),
27299
27604
  identityName: external_exports.string().optional(),
27300
27605
  assigned: external_exports.boolean(),
27301
- base64: external_exports.string().optional()
27606
+ base64: external_exports.string().optional(),
27607
+ /** Design B: the face bbox (pixel space) on the key frame — lets a detail
27608
+ * view draw the box over the native `keyFrameMediaKey` frame. Absent on
27609
+ * legacy rows written before design B. */
27610
+ faceBbox: BoundingBoxSchema.optional(),
27611
+ /** Design B: MediaStore key of the track's native-resolution key frame.
27612
+ * Fetch the native JPEG via the event-media data-plane
27613
+ * (`/addon/<addonId>/event-media/<keyFrameMediaKey>`). Absent when the
27614
+ * track produced no key frame (e.g. native/onboard source) — the UI falls
27615
+ * back to the inline `base64` face crop. */
27616
+ keyFrameMediaKey: external_exports.string().optional()
27302
27617
  });
27303
27618
  var FaceFilterEnum = external_exports.enum([
27304
27619
  "unassigned",
@@ -27521,7 +27836,7 @@ var integrationsCapability = {
27521
27836
  })
27522
27837
  },
27523
27838
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
27524
- mount: { kind: "service-backed" }
27839
+ mount: { kind: "server-provided" }
27525
27840
  };
27526
27841
  var IntercomAbilitySchema = external_exports.object({
27527
27842
  /** Codecs accepted by firmware, in preference order. Driver-authored strings. */
@@ -28061,7 +28376,7 @@ var networkQualityCapability = {
28061
28376
  }), external_exports.void(), { kind: "mutation" })
28062
28377
  },
28063
28378
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
28064
- mount: { kind: "service-backed" }
28379
+ mount: { kind: "server-provided" }
28065
28380
  };
28066
28381
  var TopologyServiceSchema = external_exports.object({
28067
28382
  addonId: external_exports.string(),
@@ -28090,6 +28405,10 @@ var TopologyCategorySchema = external_exports.object({
28090
28405
  healthy: external_exports.number(),
28091
28406
  addons: external_exports.array(TopologyCategoryAddonSchema).readonly()
28092
28407
  });
28408
+ var TopologyRootPackageSchema = external_exports.object({
28409
+ name: external_exports.string(),
28410
+ version: external_exports.string()
28411
+ });
28093
28412
  var TopologyNodeSchema = external_exports.object({
28094
28413
  id: external_exports.string(),
28095
28414
  name: external_exports.string(),
@@ -28113,7 +28432,8 @@ var TopologyNodeSchema = external_exports.object({
28113
28432
  status: external_exports.string()
28114
28433
  })).readonly(),
28115
28434
  processes: external_exports.array(TopologyProcessSchema).readonly(),
28116
- categories: external_exports.array(TopologyCategorySchema).readonly()
28435
+ categories: external_exports.array(TopologyCategorySchema).readonly(),
28436
+ rootPackage: TopologyRootPackageSchema.nullable()
28117
28437
  });
28118
28438
  var CapUsageEdgeSchema = external_exports.object({
28119
28439
  callerAddonId: external_exports.string(),
@@ -28226,7 +28546,7 @@ var nodesCapability = {
28226
28546
  })
28227
28547
  },
28228
28548
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
28229
- mount: { kind: "service-backed" }
28549
+ mount: { kind: "server-provided" }
28230
28550
  };
28231
28551
  var OsdOverlayKindEnum = external_exports.enum([
28232
28552
  "text",
@@ -28849,7 +29169,7 @@ var systemCapability = {
28849
29169
  })
28850
29170
  },
28851
29171
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
28852
- mount: { kind: "service-backed" }
29172
+ mount: { kind: "server-provided" }
28853
29173
  };
28854
29174
  var ToastSchema = external_exports.object({
28855
29175
  title: external_exports.string(),
@@ -28871,7 +29191,7 @@ var toastCapability = {
28871
29191
  mode: "singleton",
28872
29192
  methods: { onToast: method(external_exports.void(), ToastSchema, { kind: "subscription" }) },
28873
29193
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
28874
- mount: { kind: "service-backed" }
29194
+ mount: { kind: "server-provided" }
28875
29195
  };
28876
29196
  var UserSummarySchema = external_exports.object({
28877
29197
  id: external_exports.string(),
@@ -31093,6 +31413,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
31093
31413
  addonId: null,
31094
31414
  access: "create"
31095
31415
  },
31416
+ "loginMethod.getLoginMethods": {
31417
+ capName: "login-method",
31418
+ capScope: "system",
31419
+ addonId: null,
31420
+ access: "view"
31421
+ },
31096
31422
  "mediaPlayer.next": {
31097
31423
  capName: "media-player",
31098
31424
  capScope: "device",
@@ -31675,6 +32001,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
31675
32001
  addonId: null,
31676
32002
  access: "view"
31677
32003
  },
32004
+ "pipelineAnalytics.getKeyEvents": {
32005
+ capName: "pipeline-analytics",
32006
+ capScope: "device",
32007
+ addonId: null,
32008
+ access: "view"
32009
+ },
31678
32010
  "pipelineAnalytics.getMotionEvents": {
31679
32011
  capName: "pipeline-analytics",
31680
32012
  capScope: "device",
@@ -31723,23 +32055,23 @@ var METHOD_ACCESS_MAP = Object.freeze({
31723
32055
  addonId: null,
31724
32056
  access: "create"
31725
32057
  },
31726
- "pipelineExecutor.deleteModel": {
32058
+ "pipelineExecutor.clearDeviceOverrides": {
31727
32059
  capName: "pipeline-executor",
31728
32060
  capScope: "system",
31729
32061
  addonId: null,
31730
32062
  access: "delete"
31731
32063
  },
31732
- "pipelineExecutor.deleteTemplate": {
32064
+ "pipelineExecutor.deleteModel": {
31733
32065
  capName: "pipeline-executor",
31734
32066
  capScope: "system",
31735
32067
  addonId: null,
31736
32068
  access: "delete"
31737
32069
  },
31738
- "pipelineExecutor.detect": {
32070
+ "pipelineExecutor.deleteTemplate": {
31739
32071
  capName: "pipeline-executor",
31740
32072
  capScope: "system",
31741
32073
  addonId: null,
31742
- access: "view"
32074
+ access: "delete"
31743
32075
  },
31744
32076
  "pipelineExecutor.downloadModel": {
31745
32077
  capName: "pipeline-executor",
@@ -31933,13 +32265,13 @@ var METHOD_ACCESS_MAP = Object.freeze({
31933
32265
  addonId: null,
31934
32266
  access: "create"
31935
32267
  },
31936
- "pipelineOrchestrator.assignAudio": {
31937
- capName: "pipeline-orchestrator",
32268
+ "pipelineExecutor.validatePipeline": {
32269
+ capName: "pipeline-executor",
31938
32270
  capScope: "system",
31939
32271
  addonId: null,
31940
- access: "create"
32272
+ access: "view"
31941
32273
  },
31942
- "pipelineOrchestrator.assignDecoder": {
32274
+ "pipelineOrchestrator.assignAudio": {
31943
32275
  capName: "pipeline-orchestrator",
31944
32276
  capScope: "system",
31945
32277
  addonId: null,
@@ -32023,19 +32355,13 @@ var METHOD_ACCESS_MAP = Object.freeze({
32023
32355
  addonId: null,
32024
32356
  access: "view"
32025
32357
  },
32026
- "pipelineOrchestrator.getDecoderAssignment": {
32027
- capName: "pipeline-orchestrator",
32028
- capScope: "system",
32029
- addonId: null,
32030
- access: "view"
32031
- },
32032
- "pipelineOrchestrator.getDecoderAssignments": {
32358
+ "pipelineOrchestrator.getGlobalMetrics": {
32033
32359
  capName: "pipeline-orchestrator",
32034
32360
  capScope: "system",
32035
32361
  addonId: null,
32036
32362
  access: "view"
32037
32363
  },
32038
- "pipelineOrchestrator.getGlobalMetrics": {
32364
+ "pipelineOrchestrator.getIngestOwner": {
32039
32365
  capName: "pipeline-orchestrator",
32040
32366
  capScope: "system",
32041
32367
  addonId: null,
@@ -32077,6 +32403,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
32077
32403
  addonId: null,
32078
32404
  access: "delete"
32079
32405
  },
32406
+ "pipelineOrchestrator.resetNodePipelineDefaults": {
32407
+ capName: "pipeline-orchestrator",
32408
+ capScope: "system",
32409
+ addonId: null,
32410
+ access: "delete"
32411
+ },
32080
32412
  "pipelineOrchestrator.resolvePipeline": {
32081
32413
  capName: "pipeline-orchestrator",
32082
32414
  capScope: "system",
@@ -32113,37 +32445,37 @@ var METHOD_ACCESS_MAP = Object.freeze({
32113
32445
  addonId: null,
32114
32446
  access: "create"
32115
32447
  },
32116
- "pipelineOrchestrator.setCameraPipelineForAgent": {
32448
+ "pipelineOrchestrator.setAgentReachableHost": {
32117
32449
  capName: "pipeline-orchestrator",
32118
32450
  capScope: "system",
32119
32451
  addonId: null,
32120
32452
  access: "create"
32121
32453
  },
32122
- "pipelineOrchestrator.setCameraStepOverride": {
32454
+ "pipelineOrchestrator.setCameraPipelineForAgent": {
32123
32455
  capName: "pipeline-orchestrator",
32124
32456
  capScope: "system",
32125
32457
  addonId: null,
32126
32458
  access: "create"
32127
32459
  },
32128
- "pipelineOrchestrator.setCameraStepToggle": {
32460
+ "pipelineOrchestrator.setCameraStepOverride": {
32129
32461
  capName: "pipeline-orchestrator",
32130
32462
  capScope: "system",
32131
32463
  addonId: null,
32132
32464
  access: "create"
32133
32465
  },
32134
- "pipelineOrchestrator.setCapabilityBinding": {
32466
+ "pipelineOrchestrator.setCameraStepToggle": {
32135
32467
  capName: "pipeline-orchestrator",
32136
32468
  capScope: "system",
32137
32469
  addonId: null,
32138
32470
  access: "create"
32139
32471
  },
32140
- "pipelineOrchestrator.unassignAudio": {
32472
+ "pipelineOrchestrator.setCapabilityBinding": {
32141
32473
  capName: "pipeline-orchestrator",
32142
32474
  capScope: "system",
32143
32475
  addonId: null,
32144
32476
  access: "create"
32145
32477
  },
32146
- "pipelineOrchestrator.unassignDecoder": {
32478
+ "pipelineOrchestrator.unassignAudio": {
32147
32479
  capName: "pipeline-orchestrator",
32148
32480
  capScope: "system",
32149
32481
  addonId: null,
@@ -32203,6 +32535,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
32203
32535
  addonId: null,
32204
32536
  access: "view"
32205
32537
  },
32538
+ "pipelineRunner.getNativeCrop": {
32539
+ capName: "pipeline-runner",
32540
+ capScope: "system",
32541
+ addonId: null,
32542
+ access: "view"
32543
+ },
32206
32544
  "pipelineRunner.reportMotion": {
32207
32545
  capName: "pipeline-runner",
32208
32546
  capScope: "system",
@@ -32443,33 +32781,45 @@ var METHOD_ACCESS_MAP = Object.freeze({
32443
32781
  addonId: null,
32444
32782
  access: "create"
32445
32783
  },
32446
- "restreamer.getExposedResources": {
32447
- capName: "restreamer",
32784
+ "scriptRunner.run": {
32785
+ capName: "script-runner",
32786
+ capScope: "device",
32787
+ addonId: null,
32788
+ access: "create"
32789
+ },
32790
+ "scriptRunner.stop": {
32791
+ capName: "script-runner",
32792
+ capScope: "device",
32793
+ addonId: null,
32794
+ access: "create"
32795
+ },
32796
+ "serverManagement.applyServerUpdate": {
32797
+ capName: "server-management",
32448
32798
  capScope: "system",
32449
32799
  addonId: null,
32450
- access: "view"
32800
+ access: "create"
32451
32801
  },
32452
- "restreamer.registerDevice": {
32453
- capName: "restreamer",
32802
+ "serverManagement.checkServerUpdate": {
32803
+ capName: "server-management",
32454
32804
  capScope: "system",
32455
32805
  addonId: null,
32456
32806
  access: "create"
32457
32807
  },
32458
- "restreamer.unregisterDevice": {
32459
- capName: "restreamer",
32808
+ "serverManagement.getServerPackageStatus": {
32809
+ capName: "server-management",
32460
32810
  capScope: "system",
32461
32811
  addonId: null,
32462
- access: "delete"
32812
+ access: "view"
32463
32813
  },
32464
- "scriptRunner.run": {
32465
- capName: "script-runner",
32466
- capScope: "device",
32814
+ "serverManagement.restartServer": {
32815
+ capName: "server-management",
32816
+ capScope: "system",
32467
32817
  addonId: null,
32468
32818
  access: "create"
32469
32819
  },
32470
- "scriptRunner.stop": {
32471
- capName: "script-runner",
32472
- capScope: "device",
32820
+ "serverManagement.rollbackServerUpdate": {
32821
+ capName: "server-management",
32822
+ capScope: "system",
32473
32823
  addonId: null,
32474
32824
  access: "create"
32475
32825
  },
@@ -32557,23 +32907,17 @@ var METHOD_ACCESS_MAP = Object.freeze({
32557
32907
  addonId: null,
32558
32908
  access: "view"
32559
32909
  },
32560
- "snapshot.invalidateCache": {
32910
+ "snapshot.getSnapshotOverview": {
32561
32911
  capName: "snapshot",
32562
32912
  capScope: "device",
32563
32913
  addonId: null,
32564
- access: "create"
32565
- },
32566
- "snapshotProvider.getSnapshot": {
32567
- capName: "snapshot-provider",
32568
- capScope: "system",
32569
- addonId: null,
32570
32914
  access: "view"
32571
32915
  },
32572
- "snapshotProvider.supportsDevice": {
32573
- capName: "snapshot-provider",
32574
- capScope: "system",
32916
+ "snapshot.invalidateCache": {
32917
+ capName: "snapshot",
32918
+ capScope: "device",
32575
32919
  addonId: null,
32576
- access: "view"
32920
+ access: "create"
32577
32921
  },
32578
32922
  "ssoBridge.signBridgeToken": {
32579
32923
  capName: "sso-bridge",
@@ -33001,30 +33345,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
33001
33345
  addonId: null,
33002
33346
  access: "view"
33003
33347
  },
33004
- "streamingEngine.getStreamUrl": {
33005
- capName: "streaming-engine",
33006
- capScope: "system",
33007
- addonId: null,
33008
- access: "view"
33009
- },
33010
- "streamingEngine.listStreams": {
33011
- capName: "streaming-engine",
33012
- capScope: "system",
33013
- addonId: null,
33014
- access: "view"
33015
- },
33016
- "streamingEngine.registerStream": {
33017
- capName: "streaming-engine",
33018
- capScope: "system",
33019
- addonId: null,
33020
- access: "create"
33021
- },
33022
- "streamingEngine.unregisterStream": {
33023
- capName: "streaming-engine",
33024
- capScope: "system",
33025
- addonId: null,
33026
- access: "delete"
33027
- },
33028
33348
  "streamParams.getConfigSchema": {
33029
33349
  capName: "stream-params",
33030
33350
  capScope: "device",
@@ -33271,6 +33591,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
33271
33591
  addonId: null,
33272
33592
  access: "view"
33273
33593
  },
33594
+ "userPasskeys.beginDiscoverableAuthentication": {
33595
+ capName: "user-passkeys",
33596
+ capScope: "system",
33597
+ addonId: null,
33598
+ access: "view"
33599
+ },
33274
33600
  "userPasskeys.beginRegistration": {
33275
33601
  capName: "user-passkeys",
33276
33602
  capScope: "system",
@@ -33283,12 +33609,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
33283
33609
  addonId: null,
33284
33610
  access: "view"
33285
33611
  },
33612
+ "userPasskeys.finishDiscoverableAuthentication": {
33613
+ capName: "user-passkeys",
33614
+ capScope: "system",
33615
+ addonId: null,
33616
+ access: "view"
33617
+ },
33286
33618
  "userPasskeys.finishRegistration": {
33287
33619
  capName: "user-passkeys",
33288
33620
  capScope: "system",
33289
33621
  addonId: null,
33290
33622
  access: "create"
33291
33623
  },
33624
+ "userPasskeys.getSecondFactorPreference": {
33625
+ capName: "user-passkeys",
33626
+ capScope: "system",
33627
+ addonId: null,
33628
+ access: "view"
33629
+ },
33292
33630
  "userPasskeys.listPasskeys": {
33293
33631
  capName: "user-passkeys",
33294
33632
  capScope: "system",
@@ -33301,6 +33639,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
33301
33639
  addonId: null,
33302
33640
  access: "delete"
33303
33641
  },
33642
+ "userPasskeys.setSecondFactorPreference": {
33643
+ capName: "user-passkeys",
33644
+ capScope: "system",
33645
+ addonId: null,
33646
+ access: "create"
33647
+ },
33304
33648
  "vacuumControl.locate": {
33305
33649
  capName: "vacuum-control",
33306
33650
  capScope: "device",
@@ -33373,6 +33717,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
33373
33717
  addonId: null,
33374
33718
  access: "view"
33375
33719
  },
33720
+ "viewerUi.getStaticDir": {
33721
+ capName: "viewer-ui",
33722
+ capScope: "system",
33723
+ addonId: null,
33724
+ access: "view"
33725
+ },
33726
+ "viewerUi.getVersion": {
33727
+ capName: "viewer-ui",
33728
+ capScope: "system",
33729
+ addonId: null,
33730
+ access: "view"
33731
+ },
33376
33732
  "waterHeater.setAway": {
33377
33733
  capName: "water-heater",
33378
33734
  capScope: "device",
@@ -33391,54 +33747,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
33391
33747
  addonId: null,
33392
33748
  access: "create"
33393
33749
  },
33394
- "webrtc.closeSession": {
33395
- capName: "webrtc",
33396
- capScope: "system",
33397
- addonId: null,
33398
- access: "create"
33399
- },
33400
- "webrtc.createSession": {
33401
- capName: "webrtc",
33402
- capScope: "system",
33403
- addonId: null,
33404
- access: "create"
33405
- },
33406
- "webrtc.handleAnswer": {
33407
- capName: "webrtc",
33408
- capScope: "system",
33409
- addonId: null,
33410
- access: "create"
33411
- },
33412
- "webrtc.handleOffer": {
33413
- capName: "webrtc",
33414
- capScope: "system",
33415
- addonId: null,
33416
- access: "create"
33417
- },
33418
- "webrtc.hasAdaptiveBitrate": {
33419
- capName: "webrtc",
33420
- capScope: "system",
33421
- addonId: null,
33422
- access: "view"
33423
- },
33424
- "webrtc.registerStream": {
33425
- capName: "webrtc",
33426
- capScope: "system",
33427
- addonId: null,
33428
- access: "create"
33429
- },
33430
- "webrtc.supportsStream": {
33431
- capName: "webrtc",
33432
- capScope: "system",
33433
- addonId: null,
33434
- access: "view"
33435
- },
33436
- "webrtc.unregisterStream": {
33437
- capName: "webrtc",
33438
- capScope: "system",
33439
- addonId: null,
33440
- access: "delete"
33441
- },
33442
33750
  "webrtcSession.addIceCandidate": {
33443
33751
  capName: "webrtc-session",
33444
33752
  capScope: "device",