camstack 1.1.22 → 1.1.23

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-DJaTV2D7.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
@@ -15135,13 +15135,25 @@ function method(input, output, options) {
15135
15135
  function event(data) {
15136
15136
  return { data };
15137
15137
  }
15138
- var StaticDirOutputSchema = external_exports.object({ staticDir: external_exports.string() });
15139
- var VersionOutputSchema = external_exports.object({ version: external_exports.string() });
15138
+ var StaticDirOutputSchema$1 = external_exports.object({ staticDir: external_exports.string() });
15139
+ var VersionOutputSchema$1 = external_exports.object({ version: external_exports.string() });
15140
15140
  var adminUiCapability = {
15141
15141
  name: "admin-ui",
15142
15142
  scope: "system",
15143
15143
  mode: "singleton",
15144
15144
  internal: true,
15145
+ methods: {
15146
+ getStaticDir: method(external_exports.void(), StaticDirOutputSchema$1),
15147
+ getVersion: method(external_exports.void(), VersionOutputSchema$1)
15148
+ }
15149
+ };
15150
+ var StaticDirOutputSchema = external_exports.object({ staticDir: external_exports.string() });
15151
+ var VersionOutputSchema = external_exports.object({ version: external_exports.string() });
15152
+ var viewerUiCapability = {
15153
+ name: "viewer-ui",
15154
+ scope: "system",
15155
+ mode: "singleton",
15156
+ internal: true,
15145
15157
  methods: {
15146
15158
  getStaticDir: method(external_exports.void(), StaticDirOutputSchema),
15147
15159
  getVersion: method(external_exports.void(), VersionOutputSchema)
@@ -15322,6 +15334,28 @@ var ModelFormatsSchema = external_exports.object({
15322
15334
  tflite: ModelFormatEntrySchema.optional(),
15323
15335
  pt: ModelFormatEntrySchema.optional()
15324
15336
  });
15337
+ var ModelVariantGroupSchema = external_exports.object({
15338
+ /** Top-level family, e.g. `yolo26` (later `d-fine`, `rf-detr`). */
15339
+ family: external_exports.string(),
15340
+ /** Size within the family, e.g. `n` | `s` | `m` | `l`. */
15341
+ tier: external_exports.string(),
15342
+ /** Quantization axis. Omit ⇒ the fp32 base build. */
15343
+ precision: external_exports.enum(["fp32", "int8"]).optional(),
15344
+ /**
15345
+ * Speed-optimization axis. Omit ⇒ the standard build. `fast` marks a
15346
+ * latency-optimized export (e.g. ReLU-activation variant) — the slot the
15347
+ * future performance variants plug into.
15348
+ */
15349
+ optimization: external_exports.enum(["standard", "fast"]).optional(),
15350
+ /**
15351
+ * Input-resolution axis (square input side, px). Omit ⇒ the family's native
15352
+ * resolution (640 for yolo26). Reduced-input builds (320 / 256) are a big,
15353
+ * cheap latency lever — especially on Apple ANE and the Intel N100 — at a
15354
+ * small-object accuracy cost. Mirrors the model's `inputSize` but lifted onto
15355
+ * the group so the selector can offer it as a variant axis.
15356
+ */
15357
+ resolution: external_exports.number().int().positive().optional()
15358
+ });
15325
15359
  var ModelCatalogEntrySchema = external_exports.object({
15326
15360
  id: external_exports.string(),
15327
15361
  name: external_exports.string(),
@@ -15351,7 +15385,43 @@ var ModelCatalogEntrySchema = external_exports.object({
15351
15385
  * Auxiliary files required at runtime (labels JSON, charset dict, etc.).
15352
15386
  * Downloaded into the same modelsDir alongside the model file.
15353
15387
  */
15354
- extraFiles: external_exports.array(ModelExtraFileSchema).readonly().optional()
15388
+ extraFiles: external_exports.array(ModelExtraFileSchema).readonly().optional(),
15389
+ /**
15390
+ * LEGACY entry — retained in the catalog so a persisted operator selection
15391
+ * still RESOLVES (and can be re-activated), but hidden from the selectable
15392
+ * model list and excluded from the auto format-default pick. Set on the
15393
+ * superseded / consolidated models (older lineages, redundant fp16 IRs) so
15394
+ * the active lineup stays the coherent curated ladder without deleting a
15395
+ * model anyone may still be pinned to. `resolveModelForFormat` keeps honoring
15396
+ * an explicit legacy id that has a build for the node's format.
15397
+ */
15398
+ legacy: external_exports.boolean().optional(),
15399
+ /**
15400
+ * Measured quality/latency metadata — populated from the benchmark addon on
15401
+ * the real node classes. Absent = not yet measured (most entries today; the
15402
+ * catalog historically carried only `sizeMB`, a poor cross-architecture
15403
+ * speed proxy). `p95LatencyMs` is keyed by node class (e.g. `n100`, `mac`).
15404
+ */
15405
+ metrics: external_exports.object({
15406
+ map50: external_exports.number().optional(),
15407
+ p95LatencyMs: external_exports.record(external_exports.string(), external_exports.number()).optional()
15408
+ }).optional(),
15409
+ /**
15410
+ * SPDX-ish license id of the model weights (e.g. `AGPL-3.0` for Ultralytics
15411
+ * YOLO26, `GPL-3.0` for YOLOv9, `Apache-2.0` for D-FINE/RF-DETR). Matters for
15412
+ * the retraining addon and any future commercial distribution.
15413
+ */
15414
+ license: external_exports.string().optional(),
15415
+ /**
15416
+ * Variant-selector grouping. The UI groups models by `family` + `tier` and
15417
+ * offers `precision` / `optimization` as variant axes WITHIN a tier — so all
15418
+ * of a family's sizes and quantizations collapse into one grouped picker
15419
+ * instead of a flat list of `yolo26s`, `yolo26s-int8`, … Absent ⇒ ungrouped
15420
+ * (legacy / custom models) — never shown in the grouped selector. The flat
15421
+ * `id` stays the source of truth for resolution/download/persistence; grouping
15422
+ * is a presentation overlay resolved back to an `id`.
15423
+ */
15424
+ group: ModelVariantGroupSchema.optional()
15355
15425
  });
15356
15426
  var ConvertTargetSchema = external_exports.discriminatedUnion("format", [external_exports.object({
15357
15427
  format: external_exports.literal("openvino"),
@@ -17009,33 +17079,6 @@ var StreamFormatSchema = external_exports.enum([
17009
17079
  "mjpeg",
17010
17080
  "rtsp"
17011
17081
  ]);
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
17082
  var RtspRestreamEntrySchema = external_exports.object({
17040
17083
  brokerId: external_exports.string(),
17041
17084
  url: external_exports.string(),
@@ -17912,37 +17955,7 @@ var consumablesCapability = {
17912
17955
  scope: "device",
17913
17956
  deviceNative: true,
17914
17957
  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
- ],
17958
+ deviceTypes: Object.values(DeviceType),
17946
17959
  deviceConfig: { ui: {
17947
17960
  kind: "widget",
17948
17961
  widgetId: "host/consumables-panel",
@@ -19179,7 +19192,6 @@ var PipelineDefaultStepSchema = external_exports.lazy(() => external_exports.obj
19179
19192
  enabled: external_exports.boolean(),
19180
19193
  modelId: external_exports.string(),
19181
19194
  children: external_exports.array(PipelineDefaultStepSchema).readonly(),
19182
- engine: PipelineEngineChoiceSchema.optional(),
19183
19195
  group: external_exports.string().optional(),
19184
19196
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
19185
19197
  }));
@@ -19204,7 +19216,9 @@ var PipelineModelOptionSchema = external_exports.object({
19204
19216
  formats: external_exports.record(external_exports.string(), external_exports.object({
19205
19217
  downloaded: external_exports.boolean(),
19206
19218
  sizeMB: external_exports.number()
19207
- }))
19219
+ })),
19220
+ group: ModelVariantGroupSchema.optional(),
19221
+ legacy: external_exports.boolean().optional()
19208
19222
  });
19209
19223
  var ConfigFieldBridge = external_exports.custom();
19210
19224
  var PipelineAddonSchemaSchema = external_exports.object({
@@ -19234,11 +19248,6 @@ var PipelineSchemaSchema = external_exports.object({
19234
19248
  selectedEngine: PipelineEngineChoiceSchema,
19235
19249
  slots: external_exports.array(PipelineSlotSchemaSchema).readonly()
19236
19250
  });
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
19251
  var EngineProvisioningSchema = external_exports.object({
19243
19252
  runtimeId: external_exports.enum([
19244
19253
  "onnx",
@@ -19255,15 +19264,42 @@ var EngineProvisioningSchema = external_exports.object({
19255
19264
  ]),
19256
19265
  progress: external_exports.number().optional(),
19257
19266
  error: external_exports.string().optional(),
19258
- nextRetryAt: external_exports.number().optional()
19267
+ nextRetryAt: external_exports.number().optional(),
19268
+ /**
19269
+ * Gate A (config-correctness gate at engine change): human-readable
19270
+ * config issues surfaced EAGERLY when the node's engine changes — model
19271
+ * substitutions ("chose X, running Y") and zero-build steps ("no model
19272
+ * has a <format> build"). Additive/optional: informational only, never
19273
+ * enforced here — `assertEngineReady` (readiness) still gates inference.
19274
+ * Absent/empty when the node-default tree resolves cleanly.
19275
+ */
19276
+ configIssues: external_exports.array(external_exports.string()).optional()
19259
19277
  });
19260
19278
  var PipelineStepInputSchema = external_exports.lazy(() => external_exports.object({
19261
19279
  addonId: external_exports.string(),
19262
- modelId: external_exports.string(),
19280
+ modelId: external_exports.string().optional(),
19263
19281
  enabled: external_exports.boolean().default(true),
19264
19282
  children: external_exports.array(PipelineStepInputSchema).optional(),
19265
19283
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).optional()
19266
19284
  }));
19285
+ var ModelSubstitutionSchema = external_exports.object({
19286
+ addonId: external_exports.string(),
19287
+ chosen: external_exports.string(),
19288
+ running: external_exports.string(),
19289
+ format: external_exports.string()
19290
+ });
19291
+ var PipelineValidationIssueSchema = external_exports.object({
19292
+ addonId: external_exports.string(),
19293
+ kind: external_exports.enum(["unknown-addon", "no-format-build"]),
19294
+ detail: external_exports.string()
19295
+ });
19296
+ var PipelineValidationResultSchema = external_exports.object({
19297
+ ok: external_exports.boolean(),
19298
+ issues: external_exports.array(PipelineValidationIssueSchema).readonly(),
19299
+ substitutions: external_exports.array(ModelSubstitutionSchema).readonly(),
19300
+ /** The node's `currentEngine.format` this validation ran against. */
19301
+ format: external_exports.string()
19302
+ });
19267
19303
  var ReferenceImageEntrySchema = external_exports.object({
19268
19304
  filename: external_exports.string(),
19269
19305
  stepIds: external_exports.array(external_exports.string()).readonly().optional()
@@ -19354,10 +19390,45 @@ var pipelineExecutorCapability = {
19354
19390
  kind: "mutation",
19355
19391
  auth: "admin"
19356
19392
  }),
19393
+ /**
19394
+ * Clear THIS node's executor-side PER-DEVICE settings stores (the
19395
+ * per-camera step overrides the object-detection root reads via
19396
+ * `applyDeviceOverridesToTree`). `nodeId` is the ROUTING key — the
19397
+ * generated cap-router strips it (default `nodeIdMode: 'routing'`) and
19398
+ * dispatches to that node, so the provider method runs ON the target
19399
+ * node and receives no `nodeId`.
19400
+ *
19401
+ * This is the slimmed executor leg of the orchestrator's
19402
+ * `resetNodePipelineDefaults` flow (which owns the real reset: node
19403
+ * addonDefaults pins + per-camera orchestrator overrides). The legacy
19404
+ * `resetToDefault` — which reset a persisted global step-tree seed
19405
+ * nothing in the live per-camera path read — was removed together with
19406
+ * that seed.
19407
+ */
19408
+ clearDeviceOverrides: method(external_exports.object({ nodeId: external_exports.string() }), external_exports.object({
19409
+ success: external_exports.literal(true),
19410
+ clearedDevices: external_exports.number()
19411
+ }), {
19412
+ kind: "mutation",
19413
+ auth: "admin"
19414
+ }),
19357
19415
  getSchema: method(external_exports.void(), PipelineSchemaSchema),
19358
19416
  getGlobalSteps: method(external_exports.void(), external_exports.array(PipelineDefaultStepSchema).readonly().nullable()),
19359
19417
  getGlobalPipelineConfig: method(external_exports.void(), PipelineConfigBridge),
19360
19418
  getOrchestratorConfigSchema: method(external_exports.void(), ConfigUISchemaBridge),
19419
+ /**
19420
+ * Gate B (pre-init config-correctness gate). PURE COMPUTE against this
19421
+ * node's `currentEngine.format` — resolves `steps` the same way the
19422
+ * runtime dispatch path would, and reports what WOULD happen without
19423
+ * touching any node-global state. Called by the orchestrator at attach
19424
+ * time (`attachOn`), node-pinned to the TARGET node, so config problems
19425
+ * surface BEFORE `pipelineRunner.attachCamera` rather than at the first
19426
+ * per-frame resolve. `ok` is false iff `issues` is non-empty (both
19427
+ * `unknown-addon` and `no-format-build` are HARD issues); `substitutions`
19428
+ * is informational (a degraded-but-loadable model swap) and never
19429
+ * affects `ok`. Never throws.
19430
+ */
19431
+ validatePipeline: method(external_exports.object({ steps: external_exports.array(PipelineStepInputSchema) }), PipelineValidationResultSchema),
19361
19432
  listTemplates: method(external_exports.void(), external_exports.array(PipelineTemplateSchema$1).readonly()),
19362
19433
  saveTemplate: method(external_exports.object({
19363
19434
  name: external_exports.string(),
@@ -19382,11 +19453,6 @@ var pipelineExecutorCapability = {
19382
19453
  modelId: external_exports.string(),
19383
19454
  format: ModelFormatSchema$1
19384
19455
  }), 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
19456
  /**
19391
19457
  * Stateless single-frame execution. Callers (runner, benchmark) pass
19392
19458
  * the complete `engine` + `steps` tree; the executor holds no state
@@ -19647,6 +19713,13 @@ var RunnerFrameSourceSchema = external_exports.discriminatedUnion("kind", [exter
19647
19713
  kind: external_exports.literal("remote-restream"),
19648
19714
  /** The camera's source-owner node (slice 1: always the hub). */
19649
19715
  ownerNodeId: external_exports.string(),
19716
+ /**
19717
+ * The owner's LAN-reachable host, resolved by the orchestrator from the
19718
+ * per-node `reachableHost` override (Cluster UI). When present the runner
19719
+ * dials THIS host for the owner's restream, in preference to the
19720
+ * `CAMSTACK_HUB_URL`-derived default. Absent → auto-detect fallback.
19721
+ */
19722
+ ownerReachableHost: external_exports.string().optional(),
19650
19723
  /** Operator override for the owner host the runner dials. */
19651
19724
  hubHostnameOverride: external_exports.string().optional()
19652
19725
  })]).describe("Per-camera frame-source mode for the runner (P2c)");
@@ -19699,14 +19772,11 @@ var RunnerCameraConfigSchema = external_exports.object({
19699
19772
  */
19700
19773
  motionSources: MotionSourcesSchema.default(["analyzer"]),
19701
19774
  pipelineEnabled: external_exports.boolean().default(true),
19702
- /** Engine choice for video steps (runtime+backend+format). */
19703
- engine: PipelineEngineChoiceSchema.optional(),
19704
19775
  /** Ordered tree of video steps. Absent → runner skips video detection. */
19705
19776
  steps: external_exports.array(PipelineStepInputSchema).readonly().optional(),
19706
19777
  /** Audio classification branch. `enabled:false` disables, null skips. */
19707
19778
  audio: external_exports.object({
19708
- engine: PipelineEngineChoiceSchema,
19709
- modelId: external_exports.string(),
19779
+ modelId: external_exports.string().optional(),
19710
19780
  enabled: external_exports.boolean()
19711
19781
  }).nullable().optional(),
19712
19782
  /**
@@ -21849,7 +21919,9 @@ var AddonPageDeclarationSchema$1 = external_exports.object({
21849
21919
  icon: external_exports.string(),
21850
21920
  path: external_exports.string(),
21851
21921
  remoteName: external_exports.string(),
21852
- bundle: external_exports.string()
21922
+ bundle: external_exports.string(),
21923
+ section: external_exports.string().optional(),
21924
+ sectionLabel: external_exports.string().optional()
21853
21925
  });
21854
21926
  var AddonPageInfoSchema = external_exports.object({
21855
21927
  addonId: external_exports.string(),
@@ -21882,7 +21954,18 @@ var AddonPageDeclarationSchema = external_exports.object({
21882
21954
  * the static-file route can compute an mtime-based cache-buster URL
21883
21955
  * without a separate filesystem stat.
21884
21956
  */
21885
- bundle: external_exports.string()
21957
+ bundle: external_exports.string(),
21958
+ /**
21959
+ * Sidebar section this page docks into. Well-known ids: `'detection'`,
21960
+ * `'cluster'`, `'administration'` — the page renders inside that group.
21961
+ * Any OTHER string creates (or joins) a custom section rendered after
21962
+ * the built-in groups; its label comes from `sectionLabel` (first
21963
+ * declaration wins), falling back to the id. Absent → the legacy
21964
+ * "Addon Pages" group.
21965
+ */
21966
+ section: external_exports.string().optional(),
21967
+ /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
21968
+ sectionLabel: external_exports.string().optional()
21886
21969
  });
21887
21970
  var addonPagesSourceCapability = {
21888
21971
  name: "addon-pages-source",
@@ -22067,6 +22150,17 @@ var WidgetMetadataSchema = external_exports.object({
22067
22150
  deviceContext: external_exports.boolean().default(false),
22068
22151
  integrationContext: external_exports.boolean().default(false)
22069
22152
  }),
22153
+ /**
22154
+ * Loadable BEFORE authentication. The normal widget registry listing
22155
+ * (`addon-widgets.listWidgets`) is auth-gated, so a pre-auth surface
22156
+ * (the login page) cannot discover a widget through it. A widget that
22157
+ * declares `preAuth: true` marks itself as safe to mount on a pre-auth
22158
+ * screen — it is surfaced through the PUBLIC `auth.listLoginMethods`
22159
+ * login-method contribution channel (see `login-method.cap.ts`) rather
22160
+ * than the authenticated registry, and its bundle is served by the
22161
+ * public `/api/addon-widgets/:addonId/*` static route. Defaults false.
22162
+ */
22163
+ preAuth: external_exports.boolean().optional().default(false),
22070
22164
  /** Dashboard placement HINTS (operator can override per instance). */
22071
22165
  defaultSize: WidgetSizeEnum.default("md"),
22072
22166
  allowedSizes: external_exports.array(WidgetSizeEnum).readonly().default([
@@ -22454,6 +22548,41 @@ var authProviderCapability = {
22454
22548
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
22455
22549
  mount: { kind: "skip" }
22456
22550
  };
22551
+ var LoginStageEnum = external_exports.enum(["primary", "second-factor"]);
22552
+ var RedirectLoginMethodSchema = external_exports.object({
22553
+ kind: external_exports.literal("redirect"),
22554
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
22555
+ id: external_exports.string(),
22556
+ /** Operator-facing button label. */
22557
+ label: external_exports.string(),
22558
+ /** lucide-react icon name. */
22559
+ icon: external_exports.string().optional(),
22560
+ /** Addon-owned HTTP route the button navigates to (GET). */
22561
+ startUrl: external_exports.string(),
22562
+ stage: LoginStageEnum
22563
+ });
22564
+ var WidgetLoginMethodSchema = external_exports.object({
22565
+ kind: external_exports.literal("widget"),
22566
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
22567
+ id: external_exports.string(),
22568
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
22569
+ addonId: external_exports.string(),
22570
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
22571
+ bundle: external_exports.string(),
22572
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
22573
+ remote: WidgetRemoteSchema,
22574
+ stage: LoginStageEnum
22575
+ });
22576
+ var LoginMethodContributionSchema = external_exports.discriminatedUnion("kind", [RedirectLoginMethodSchema, WidgetLoginMethodSchema]);
22577
+ var loginMethodCapability = {
22578
+ name: "login-method",
22579
+ scope: "system",
22580
+ mode: "collection",
22581
+ internal: true,
22582
+ methods: { getLoginMethods: method(external_exports.void(), external_exports.array(LoginMethodContributionSchema).readonly()) },
22583
+ /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
22584
+ mount: { kind: "skip" }
22585
+ };
22457
22586
  var BackupDestinationInfoSchema = external_exports.object({
22458
22587
  /**
22459
22588
  * Sub-id within this addon. Convention `default` for single-
@@ -25091,11 +25220,11 @@ var pipelineAnalyticsCapability = {
25091
25220
  }
25092
25221
  };
25093
25222
  var CameraPipelineConfigSchema = external_exports.object({
25094
- engine: PipelineEngineChoiceSchema,
25223
+ engine: PipelineEngineChoiceSchema.optional(),
25095
25224
  steps: external_exports.array(PipelineStepInputSchema).readonly(),
25096
25225
  audio: external_exports.object({
25097
- engine: PipelineEngineChoiceSchema,
25098
- modelId: external_exports.string(),
25226
+ engine: PipelineEngineChoiceSchema.optional(),
25227
+ modelId: external_exports.string().optional(),
25099
25228
  enabled: external_exports.boolean(),
25100
25229
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).readonly().optional()
25101
25230
  }).nullable().optional()
@@ -25110,7 +25239,7 @@ var PipelineTemplateSchema = external_exports.object({
25110
25239
  });
25111
25240
  var AgentAddonConfigSchema = external_exports.object({
25112
25241
  enabled: external_exports.boolean(),
25113
- modelId: external_exports.string(),
25242
+ modelId: external_exports.string().optional(),
25114
25243
  settings: external_exports.record(external_exports.string(), external_exports.unknown()).readonly()
25115
25244
  });
25116
25245
  var AgentPipelineSettingsSchema = external_exports.object({
@@ -25120,12 +25249,25 @@ var AgentPipelineSettingsSchema = external_exports.object({
25120
25249
  detectWeight: external_exports.number().positive().optional(),
25121
25250
  /** Node is eligible to run the detection pipeline (decode + inference). */
25122
25251
  detect: external_exports.boolean().optional(),
25123
- /** Node is eligible to host decoder sessions. */
25252
+ /**
25253
+ * DEPRECATED AND IGNORED. Decode is always co-located with its frame
25254
+ * consumer, so decode eligibility IS detect eligibility. Kept optional in
25255
+ * the schema ONLY so persisted stores written before the removal still
25256
+ * parse — no code reads it and no write path emits it.
25257
+ */
25124
25258
  decode: external_exports.boolean().optional(),
25125
25259
  /** Node is eligible to run audio-analyzer sessions. */
25126
25260
  audio: external_exports.boolean().optional(),
25127
25261
  /** Node is eligible to be the ingest / source-owner (serve the restream). */
25128
- ingest: external_exports.boolean().optional()
25262
+ ingest: external_exports.boolean().optional(),
25263
+ /**
25264
+ * Operator override for the LAN host a cross-node decoder dials to reach
25265
+ * THIS node's restream (Cluster UI). Absent → auto-detect: a remote runner
25266
+ * falls back to its `CAMSTACK_HUB_URL`-derived host (the Moleculer address
25267
+ * it already uses to reach the hub). Set this only when the auto-detected
25268
+ * address is wrong (multi-homed host, NAT, custom interface).
25269
+ */
25270
+ reachableHost: external_exports.string().optional()
25129
25271
  });
25130
25272
  var CameraPipelineForAgentSchema = external_exports.object({
25131
25273
  steps: external_exports.array(PipelineStepInputSchema).readonly(),
@@ -25162,20 +25304,6 @@ var PipelineAssignmentSchema = external_exports.object({
25162
25304
  /** Unix timestamp (ms) when the assignment was last updated. */
25163
25305
  assignedAt: external_exports.number()
25164
25306
  });
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
25307
  var AgentLoadSummarySchema = external_exports.object({
25180
25308
  nodeId: external_exports.string(),
25181
25309
  online: external_exports.boolean(),
@@ -25198,6 +25326,11 @@ var GlobalMetricsSchema = external_exports.object({
25198
25326
  queueDepth: external_exports.number()
25199
25327
  });
25200
25328
  var CapabilityBindingsSchema = external_exports.record(external_exports.string(), external_exports.string());
25329
+ var IngestOwnerSchema = external_exports.object({
25330
+ ownerNodeId: external_exports.string(),
25331
+ reachableHost: external_exports.string().optional(),
25332
+ configIssue: external_exports.string().optional()
25333
+ });
25201
25334
  var CameraSourceStreamSchema = external_exports.object({
25202
25335
  camStreamId: external_exports.string(),
25203
25336
  codec: external_exports.string(),
@@ -25211,6 +25344,14 @@ var CameraAssignmentStatusSchema = external_exports.object({
25211
25344
  detectionNodeId: external_exports.string().nullable(),
25212
25345
  decoderNodeId: external_exports.string().nullable(),
25213
25346
  audioNodeId: external_exports.string().nullable(),
25347
+ /**
25348
+ * The node that OWNS this camera's physical source pull (dials the RTSP and
25349
+ * hosts the broker/restream) — the cluster ingest owner today
25350
+ * (`clusterRoles.ingestNode`), per-camera once source assignment lands. Lets
25351
+ * the UI show WHERE a camera is sourced without SSH/logs, and is the node the
25352
+ * broker block below was read from (pinned). Nullable only pre-wiring.
25353
+ */
25354
+ sourceNodeId: external_exports.string().nullable(),
25214
25355
  pinned: external_exports.object({
25215
25356
  detection: external_exports.boolean(),
25216
25357
  decoder: external_exports.boolean(),
@@ -25384,21 +25525,14 @@ var pipelineOrchestratorCapability = {
25384
25525
  kind: "mutation",
25385
25526
  auth: "admin"
25386
25527
  }),
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()),
25528
+ /**
25529
+ * The cluster's single camera-source owner — resolved UNCONDITIONALLY
25530
+ * from `clusterRoles.ingestNode` (NOT the detection-decode
25531
+ * `remoteSourcingNodes` knob). Consumers (recorder/snapshot/audio) pin
25532
+ * their broker calls to `ownerNodeId` and dial `reachableHost` when
25533
+ * present. Defaults to `{ ownerNodeId: 'hub' }`.
25534
+ */
25535
+ getIngestOwner: method(external_exports.void(), IngestOwnerSchema),
25402
25536
  /** Pin a device's audio analysis to a specific cluster node. */
25403
25537
  assignAudio: method(external_exports.object({
25404
25538
  deviceId: external_exports.number(),
@@ -25430,23 +25564,6 @@ var pipelineOrchestratorCapability = {
25430
25564
  pinned: external_exports.boolean(),
25431
25565
  assignedAt: external_exports.number()
25432
25566
  }))),
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
25567
  /** Read one agent's settings. Null when not yet seeded. */
25451
25568
  getAgentSettings: method(external_exports.object({ agentNodeId: external_exports.string() }), AgentPipelineSettingsSchema.nullable()),
25452
25569
  /** Enumerate every agent's settings (hub + remote runners). */
@@ -25516,20 +25633,65 @@ var pipelineOrchestratorCapability = {
25516
25633
  * `enabledDecoderNodes`, `enabledAudioNodes`, `remoteSourcingNodes`).
25517
25634
  * Each flag is optional in the patch: omit a flag to leave it unchanged,
25518
25635
  * 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.
25636
+ * other node → not). Detection/audio eligibility is derived from these
25637
+ * flags across the cluster; changing them re-derives the enabled sets
25638
+ * and reconciles dispatch immediately. There is NO separate decode flag:
25639
+ * decode is always co-located with its frame consumer, so decode
25640
+ * eligibility IS detect eligibility.
25522
25641
  */
25523
25642
  setAgentCapabilities: method(external_exports.object({
25524
25643
  agentNodeId: external_exports.string(),
25525
25644
  detect: external_exports.boolean().nullable().optional(),
25526
- decode: external_exports.boolean().nullable().optional(),
25527
25645
  audio: external_exports.boolean().nullable().optional(),
25528
25646
  ingest: external_exports.boolean().nullable().optional()
25529
25647
  }), external_exports.object({ success: external_exports.literal(true) }), {
25530
25648
  kind: "mutation",
25531
25649
  auth: "admin"
25532
25650
  }),
25651
+ /**
25652
+ * Set (or clear) the operator override for the LAN host a cross-node
25653
+ * decoder dials to reach this node's restream. Pass a non-empty string to
25654
+ * override the auto-detected address (the runner's `CAMSTACK_HUB_URL`
25655
+ * default); pass `null` or an empty string to clear it and revert to
25656
+ * auto-detect. Applied on the next dispatch cycle — takes effect for new
25657
+ * cross-node attaches; existing attaches keep their current host until
25658
+ * re-dispatched.
25659
+ */
25660
+ setAgentReachableHost: method(external_exports.object({
25661
+ agentNodeId: external_exports.string(),
25662
+ reachableHost: external_exports.string().nullable()
25663
+ }), external_exports.object({ success: external_exports.literal(true) }), {
25664
+ kind: "mutation",
25665
+ auth: "admin"
25666
+ }),
25667
+ /**
25668
+ * Reset one node's pipeline to its hardware-aware defaults — the HONEST
25669
+ * reset (replaces the executor's legacy `resetToDefault`, which cleared a
25670
+ * dead persisted step-tree seed nothing in the live path read):
25671
+ * (a) strips every `modelId` pin from that node's
25672
+ * `agentSettings.addonDefaults` (cells revert to Auto — the node
25673
+ * resolves its own hardware-aware format default at runtime);
25674
+ * (b) clears per-camera step overrides scoped to that node
25675
+ * (`stepOverridesByAgent[node]` + the wholesale
25676
+ * `pipelineByAgent[node]` escape hatch);
25677
+ * (c) clears the executor-side per-device settings stores on that node
25678
+ * (`pipelineExecutor.clearDeviceOverrides`);
25679
+ * (d) hot-reloads every camera assigned to the node.
25680
+ *
25681
+ * Returns the EFFECTIVE post-reset object-detection model for the node
25682
+ * (the executor's pure hardware-aware default) so the UI can report what
25683
+ * will actually run — not a value that never reaches the live path.
25684
+ */
25685
+ resetNodePipelineDefaults: method(external_exports.object({ agentNodeId: external_exports.string() }), external_exports.object({
25686
+ success: external_exports.literal(true),
25687
+ /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
25688
+ effectiveModelId: external_exports.string().nullable(),
25689
+ /** Number of cameras whose node-scoped overrides were cleared. */
25690
+ clearedCameraOverrides: external_exports.number()
25691
+ }), {
25692
+ kind: "mutation",
25693
+ auth: "admin"
25694
+ }),
25533
25695
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
25534
25696
  getCameraSettings: method(external_exports.object({ deviceId: external_exports.number() }), CameraPipelineSettingsSchema.nullable()),
25535
25697
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -25621,33 +25783,107 @@ var pipelineOrchestratorCapability = {
25621
25783
  })
25622
25784
  }
25623
25785
  };
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()
25786
+ var ServerBootModeSchema = external_exports.enum([
25787
+ "workspace",
25788
+ "baked",
25789
+ "data-root"
25790
+ ]);
25791
+ var ServerUpdateStateSchema = external_exports.enum([
25792
+ "idle",
25793
+ "checking",
25794
+ "staging",
25795
+ "pending-restart",
25796
+ "awaiting-confirmation"
25797
+ ]);
25798
+ var ServerRollbackInfoSchema = external_exports.object({
25799
+ /** The version that failed (or was manually rolled back). */
25800
+ fromVersion: external_exports.string(),
25801
+ /** The version rolled back to; null = the baked seed. */
25802
+ toVersion: external_exports.string().nullable(),
25803
+ atMs: external_exports.number(),
25804
+ reason: external_exports.string()
25630
25805
  });
25631
- var ExposedResourceSchema = external_exports.object({
25632
- streamId: external_exports.string(),
25633
- format: external_exports.string(),
25634
- value: external_exports.string()
25806
+ var ServerPackageStatusSchema = external_exports.object({
25807
+ /** Root package name (`@camstack/server` on the hub). */
25808
+ packageName: external_exports.string(),
25809
+ /** Version of the code the running process ACTUALLY loaded. */
25810
+ runningVersion: external_exports.string().nullable(),
25811
+ /** Node.js runtime version the node's process runs on (`process.versions.node`). */
25812
+ nodeRuntimeVersion: external_exports.string().nullable(),
25813
+ /** Active data-dir root version; null when booted from seed/workspace. */
25814
+ activeVersion: external_exports.string().nullable(),
25815
+ /** N-1 version kept for rollback; null when no previous version exists. */
25816
+ previousVersion: external_exports.string().nullable(),
25817
+ /** Version of the immutable baked seed closure (image fallback). */
25818
+ seedVersion: external_exports.string().nullable(),
25819
+ /** Latest registry version from the most recent check (null = never checked). */
25820
+ latestVersion: external_exports.string().nullable(),
25821
+ updateAvailable: external_exports.boolean(),
25822
+ bootMode: ServerBootModeSchema,
25823
+ updateState: ServerUpdateStateSchema,
25824
+ /** Version staged + awaiting its probation boot, when one is pending. */
25825
+ pendingVersion: external_exports.string().nullable(),
25826
+ /** Set when the last freshly-activated version failed its boot health-check. */
25827
+ rolledBack: ServerRollbackInfoSchema.nullable(),
25828
+ /**
25829
+ * True when `server-root/state.json` EXISTS but is unreadable/corrupt — the
25830
+ * hub is running from the baked seed (or workspace) while installed data-dir
25831
+ * versions are being IGNORED. Surfaced as a warning in the UI.
25832
+ */
25833
+ stateFileCorrupt: external_exports.boolean(),
25834
+ lastCheckedAtMs: external_exports.number().nullable()
25835
+ });
25836
+ var ServerUpdateCheckResultSchema = external_exports.object({
25837
+ packageName: external_exports.string(),
25838
+ runningVersion: external_exports.string().nullable(),
25839
+ latestVersion: external_exports.string().nullable(),
25840
+ updateAvailable: external_exports.boolean(),
25841
+ checkedAtMs: external_exports.number(),
25842
+ /** Non-null when the registry lookup failed (offline, bad registry, …). */
25843
+ error: external_exports.string().nullable()
25844
+ });
25845
+ var ServerUpdateActionResultSchema = external_exports.object({
25846
+ accepted: external_exports.boolean(),
25847
+ targetVersion: external_exports.string().nullable(),
25848
+ /** True when a graceful restart was scheduled to apply the change. */
25849
+ restarting: external_exports.boolean(),
25850
+ message: external_exports.string()
25635
25851
  });
25636
- var restreamerCapability = {
25637
- name: "restreamer",
25852
+ var serverManagementCapability = {
25853
+ name: "server-management",
25638
25854
  scope: "system",
25639
- mode: "collection",
25640
- internal: true,
25855
+ mode: "singleton",
25641
25856
  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())
25857
+ getServerPackageStatus: method(external_exports.void(), ServerPackageStatusSchema, { auth: "admin" }),
25858
+ checkServerUpdate: method(external_exports.void(), ServerUpdateCheckResultSchema, {
25859
+ kind: "mutation",
25860
+ auth: "admin"
25861
+ }),
25862
+ applyServerUpdate: method(external_exports.object({
25863
+ /** Explicit target version; omitted = latest from the registry. */
25864
+ version: external_exports.string().optional()
25865
+ }), ServerUpdateActionResultSchema, {
25866
+ kind: "mutation",
25867
+ auth: "admin"
25868
+ }),
25869
+ rollbackServerUpdate: method(external_exports.void(), ServerUpdateActionResultSchema, {
25870
+ kind: "mutation",
25871
+ auth: "admin"
25872
+ }),
25873
+ /**
25874
+ * Plain process restart of the node's root process — no version change.
25875
+ * The supervisor (docker restart policy / launchd / Electron main)
25876
+ * relaunches and the starter loads the SAME active version. Refused while
25877
+ * a stage is in flight or a version is already staged awaiting restart
25878
+ * (use apply/rollback instead, so the pending version is not skipped).
25879
+ */
25880
+ restartServer: method(external_exports.void(), ServerUpdateActionResultSchema, {
25881
+ kind: "mutation",
25882
+ auth: "admin"
25883
+ })
25648
25884
  },
25649
25885
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
25650
- mount: { kind: "skip" }
25886
+ mount: { kind: "server-provided" }
25651
25887
  };
25652
25888
  var QueryFilterSchema = external_exports.object({
25653
25889
  where: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
@@ -25873,20 +26109,6 @@ var snapshotCapability = {
25873
26109
  kind: "poll"
25874
26110
  }
25875
26111
  };
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
26112
  var SsoBridgeClaimsSchema = external_exports.object({
25891
26113
  userId: external_exports.string(),
25892
26114
  username: external_exports.string(),
@@ -26220,6 +26442,20 @@ var userPasskeysCapability = {
26220
26442
  kind: "mutation",
26221
26443
  access: "view"
26222
26444
  }),
26445
+ beginDiscoverableAuthentication: method(external_exports.object({}), external_exports.object({ optionsJSON: external_exports.record(external_exports.string(), external_exports.unknown()) }), {
26446
+ kind: "mutation",
26447
+ access: "view"
26448
+ }),
26449
+ finishDiscoverableAuthentication: method(external_exports.object({
26450
+ /** AuthenticationResponseJSON from the browser. */
26451
+ response: external_exports.record(external_exports.string(), external_exports.unknown())
26452
+ }), external_exports.object({
26453
+ verified: external_exports.boolean(),
26454
+ userId: external_exports.string().nullable()
26455
+ }), {
26456
+ kind: "mutation",
26457
+ access: "view"
26458
+ }),
26223
26459
  listPasskeys: method(external_exports.object({ userId: external_exports.string() }), external_exports.array(PasskeySummarySchema), { auth: "admin" }),
26224
26460
  removePasskey: method(external_exports.object({
26225
26461
  userId: external_exports.string(),
@@ -26228,6 +26464,15 @@ var userPasskeysCapability = {
26228
26464
  kind: "mutation",
26229
26465
  auth: "admin",
26230
26466
  access: "delete"
26467
+ }),
26468
+ getSecondFactorPreference: method(external_exports.object({ userId: external_exports.string() }), external_exports.object({ enabled: external_exports.boolean() }), { auth: "admin" }),
26469
+ setSecondFactorPreference: method(external_exports.object({
26470
+ userId: external_exports.string(),
26471
+ enabled: external_exports.boolean()
26472
+ }), external_exports.object({ success: external_exports.literal(true) }), {
26473
+ kind: "mutation",
26474
+ auth: "admin",
26475
+ access: "create"
26231
26476
  })
26232
26477
  }
26233
26478
  };
@@ -26291,49 +26536,6 @@ var webrtcClientHintsSchema = external_exports.object({
26291
26536
  /** Hard tier override; takes precedence over scoring when registered. */
26292
26537
  prefersTier: external_exports.string().optional()
26293
26538
  }).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
26539
  var WebrtcStreamTargetSchema = external_exports.discriminatedUnion("kind", [
26338
26540
  external_exports.object({ kind: external_exports.literal("adaptive") }),
26339
26541
  external_exports.object({
@@ -26576,7 +26778,7 @@ var webrtcSessionCapability = {
26576
26778
  }).nullable() }))
26577
26779
  },
26578
26780
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
26579
- mount: { kind: "custom" }
26781
+ mount: { kind: "server-provided" }
26580
26782
  };
26581
26783
  var AccessoriesStatusSchema = external_exports.object({
26582
26784
  /** All accessory children of the parent. */
@@ -27176,7 +27378,7 @@ var addonsCapability = {
27176
27378
  }), LogStreamEntrySchema, { kind: "subscription" })
27177
27379
  },
27178
27380
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
27179
- mount: { kind: "service-backed" }
27381
+ mount: { kind: "server-provided" }
27180
27382
  };
27181
27383
  var buttonCapability = {
27182
27384
  name: "button",
@@ -27521,7 +27723,7 @@ var integrationsCapability = {
27521
27723
  })
27522
27724
  },
27523
27725
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
27524
- mount: { kind: "service-backed" }
27726
+ mount: { kind: "server-provided" }
27525
27727
  };
27526
27728
  var IntercomAbilitySchema = external_exports.object({
27527
27729
  /** Codecs accepted by firmware, in preference order. Driver-authored strings. */
@@ -28061,7 +28263,7 @@ var networkQualityCapability = {
28061
28263
  }), external_exports.void(), { kind: "mutation" })
28062
28264
  },
28063
28265
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
28064
- mount: { kind: "service-backed" }
28266
+ mount: { kind: "server-provided" }
28065
28267
  };
28066
28268
  var TopologyServiceSchema = external_exports.object({
28067
28269
  addonId: external_exports.string(),
@@ -28090,6 +28292,10 @@ var TopologyCategorySchema = external_exports.object({
28090
28292
  healthy: external_exports.number(),
28091
28293
  addons: external_exports.array(TopologyCategoryAddonSchema).readonly()
28092
28294
  });
28295
+ var TopologyRootPackageSchema = external_exports.object({
28296
+ name: external_exports.string(),
28297
+ version: external_exports.string()
28298
+ });
28093
28299
  var TopologyNodeSchema = external_exports.object({
28094
28300
  id: external_exports.string(),
28095
28301
  name: external_exports.string(),
@@ -28113,7 +28319,8 @@ var TopologyNodeSchema = external_exports.object({
28113
28319
  status: external_exports.string()
28114
28320
  })).readonly(),
28115
28321
  processes: external_exports.array(TopologyProcessSchema).readonly(),
28116
- categories: external_exports.array(TopologyCategorySchema).readonly()
28322
+ categories: external_exports.array(TopologyCategorySchema).readonly(),
28323
+ rootPackage: TopologyRootPackageSchema.nullable()
28117
28324
  });
28118
28325
  var CapUsageEdgeSchema = external_exports.object({
28119
28326
  callerAddonId: external_exports.string(),
@@ -28226,7 +28433,7 @@ var nodesCapability = {
28226
28433
  })
28227
28434
  },
28228
28435
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
28229
- mount: { kind: "service-backed" }
28436
+ mount: { kind: "server-provided" }
28230
28437
  };
28231
28438
  var OsdOverlayKindEnum = external_exports.enum([
28232
28439
  "text",
@@ -28849,7 +29056,7 @@ var systemCapability = {
28849
29056
  })
28850
29057
  },
28851
29058
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
28852
- mount: { kind: "service-backed" }
29059
+ mount: { kind: "server-provided" }
28853
29060
  };
28854
29061
  var ToastSchema = external_exports.object({
28855
29062
  title: external_exports.string(),
@@ -28871,7 +29078,7 @@ var toastCapability = {
28871
29078
  mode: "singleton",
28872
29079
  methods: { onToast: method(external_exports.void(), ToastSchema, { kind: "subscription" }) },
28873
29080
  /** BIG PLAN 2: declarative mount hint — read by `@camstack/system` `buildCapRouters`. */
28874
- mount: { kind: "service-backed" }
29081
+ mount: { kind: "server-provided" }
28875
29082
  };
28876
29083
  var UserSummarySchema = external_exports.object({
28877
29084
  id: external_exports.string(),
@@ -31093,6 +31300,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
31093
31300
  addonId: null,
31094
31301
  access: "create"
31095
31302
  },
31303
+ "loginMethod.getLoginMethods": {
31304
+ capName: "login-method",
31305
+ capScope: "system",
31306
+ addonId: null,
31307
+ access: "view"
31308
+ },
31096
31309
  "mediaPlayer.next": {
31097
31310
  capName: "media-player",
31098
31311
  capScope: "device",
@@ -31723,23 +31936,23 @@ var METHOD_ACCESS_MAP = Object.freeze({
31723
31936
  addonId: null,
31724
31937
  access: "create"
31725
31938
  },
31726
- "pipelineExecutor.deleteModel": {
31939
+ "pipelineExecutor.clearDeviceOverrides": {
31727
31940
  capName: "pipeline-executor",
31728
31941
  capScope: "system",
31729
31942
  addonId: null,
31730
31943
  access: "delete"
31731
31944
  },
31732
- "pipelineExecutor.deleteTemplate": {
31945
+ "pipelineExecutor.deleteModel": {
31733
31946
  capName: "pipeline-executor",
31734
31947
  capScope: "system",
31735
31948
  addonId: null,
31736
31949
  access: "delete"
31737
31950
  },
31738
- "pipelineExecutor.detect": {
31951
+ "pipelineExecutor.deleteTemplate": {
31739
31952
  capName: "pipeline-executor",
31740
31953
  capScope: "system",
31741
31954
  addonId: null,
31742
- access: "view"
31955
+ access: "delete"
31743
31956
  },
31744
31957
  "pipelineExecutor.downloadModel": {
31745
31958
  capName: "pipeline-executor",
@@ -31933,13 +32146,13 @@ var METHOD_ACCESS_MAP = Object.freeze({
31933
32146
  addonId: null,
31934
32147
  access: "create"
31935
32148
  },
31936
- "pipelineOrchestrator.assignAudio": {
31937
- capName: "pipeline-orchestrator",
32149
+ "pipelineExecutor.validatePipeline": {
32150
+ capName: "pipeline-executor",
31938
32151
  capScope: "system",
31939
32152
  addonId: null,
31940
- access: "create"
32153
+ access: "view"
31941
32154
  },
31942
- "pipelineOrchestrator.assignDecoder": {
32155
+ "pipelineOrchestrator.assignAudio": {
31943
32156
  capName: "pipeline-orchestrator",
31944
32157
  capScope: "system",
31945
32158
  addonId: null,
@@ -32023,19 +32236,13 @@ var METHOD_ACCESS_MAP = Object.freeze({
32023
32236
  addonId: null,
32024
32237
  access: "view"
32025
32238
  },
32026
- "pipelineOrchestrator.getDecoderAssignment": {
32027
- capName: "pipeline-orchestrator",
32028
- capScope: "system",
32029
- addonId: null,
32030
- access: "view"
32031
- },
32032
- "pipelineOrchestrator.getDecoderAssignments": {
32239
+ "pipelineOrchestrator.getGlobalMetrics": {
32033
32240
  capName: "pipeline-orchestrator",
32034
32241
  capScope: "system",
32035
32242
  addonId: null,
32036
32243
  access: "view"
32037
32244
  },
32038
- "pipelineOrchestrator.getGlobalMetrics": {
32245
+ "pipelineOrchestrator.getIngestOwner": {
32039
32246
  capName: "pipeline-orchestrator",
32040
32247
  capScope: "system",
32041
32248
  addonId: null,
@@ -32077,6 +32284,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
32077
32284
  addonId: null,
32078
32285
  access: "delete"
32079
32286
  },
32287
+ "pipelineOrchestrator.resetNodePipelineDefaults": {
32288
+ capName: "pipeline-orchestrator",
32289
+ capScope: "system",
32290
+ addonId: null,
32291
+ access: "delete"
32292
+ },
32080
32293
  "pipelineOrchestrator.resolvePipeline": {
32081
32294
  capName: "pipeline-orchestrator",
32082
32295
  capScope: "system",
@@ -32113,37 +32326,37 @@ var METHOD_ACCESS_MAP = Object.freeze({
32113
32326
  addonId: null,
32114
32327
  access: "create"
32115
32328
  },
32116
- "pipelineOrchestrator.setCameraPipelineForAgent": {
32329
+ "pipelineOrchestrator.setAgentReachableHost": {
32117
32330
  capName: "pipeline-orchestrator",
32118
32331
  capScope: "system",
32119
32332
  addonId: null,
32120
32333
  access: "create"
32121
32334
  },
32122
- "pipelineOrchestrator.setCameraStepOverride": {
32335
+ "pipelineOrchestrator.setCameraPipelineForAgent": {
32123
32336
  capName: "pipeline-orchestrator",
32124
32337
  capScope: "system",
32125
32338
  addonId: null,
32126
32339
  access: "create"
32127
32340
  },
32128
- "pipelineOrchestrator.setCameraStepToggle": {
32341
+ "pipelineOrchestrator.setCameraStepOverride": {
32129
32342
  capName: "pipeline-orchestrator",
32130
32343
  capScope: "system",
32131
32344
  addonId: null,
32132
32345
  access: "create"
32133
32346
  },
32134
- "pipelineOrchestrator.setCapabilityBinding": {
32347
+ "pipelineOrchestrator.setCameraStepToggle": {
32135
32348
  capName: "pipeline-orchestrator",
32136
32349
  capScope: "system",
32137
32350
  addonId: null,
32138
32351
  access: "create"
32139
32352
  },
32140
- "pipelineOrchestrator.unassignAudio": {
32353
+ "pipelineOrchestrator.setCapabilityBinding": {
32141
32354
  capName: "pipeline-orchestrator",
32142
32355
  capScope: "system",
32143
32356
  addonId: null,
32144
32357
  access: "create"
32145
32358
  },
32146
- "pipelineOrchestrator.unassignDecoder": {
32359
+ "pipelineOrchestrator.unassignAudio": {
32147
32360
  capName: "pipeline-orchestrator",
32148
32361
  capScope: "system",
32149
32362
  addonId: null,
@@ -32443,33 +32656,45 @@ var METHOD_ACCESS_MAP = Object.freeze({
32443
32656
  addonId: null,
32444
32657
  access: "create"
32445
32658
  },
32446
- "restreamer.getExposedResources": {
32447
- capName: "restreamer",
32659
+ "scriptRunner.run": {
32660
+ capName: "script-runner",
32661
+ capScope: "device",
32662
+ addonId: null,
32663
+ access: "create"
32664
+ },
32665
+ "scriptRunner.stop": {
32666
+ capName: "script-runner",
32667
+ capScope: "device",
32668
+ addonId: null,
32669
+ access: "create"
32670
+ },
32671
+ "serverManagement.applyServerUpdate": {
32672
+ capName: "server-management",
32448
32673
  capScope: "system",
32449
32674
  addonId: null,
32450
- access: "view"
32675
+ access: "create"
32451
32676
  },
32452
- "restreamer.registerDevice": {
32453
- capName: "restreamer",
32677
+ "serverManagement.checkServerUpdate": {
32678
+ capName: "server-management",
32454
32679
  capScope: "system",
32455
32680
  addonId: null,
32456
32681
  access: "create"
32457
32682
  },
32458
- "restreamer.unregisterDevice": {
32459
- capName: "restreamer",
32683
+ "serverManagement.getServerPackageStatus": {
32684
+ capName: "server-management",
32460
32685
  capScope: "system",
32461
32686
  addonId: null,
32462
- access: "delete"
32687
+ access: "view"
32463
32688
  },
32464
- "scriptRunner.run": {
32465
- capName: "script-runner",
32466
- capScope: "device",
32689
+ "serverManagement.restartServer": {
32690
+ capName: "server-management",
32691
+ capScope: "system",
32467
32692
  addonId: null,
32468
32693
  access: "create"
32469
32694
  },
32470
- "scriptRunner.stop": {
32471
- capName: "script-runner",
32472
- capScope: "device",
32695
+ "serverManagement.rollbackServerUpdate": {
32696
+ capName: "server-management",
32697
+ capScope: "system",
32473
32698
  addonId: null,
32474
32699
  access: "create"
32475
32700
  },
@@ -32563,18 +32788,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
32563
32788
  addonId: null,
32564
32789
  access: "create"
32565
32790
  },
32566
- "snapshotProvider.getSnapshot": {
32567
- capName: "snapshot-provider",
32568
- capScope: "system",
32569
- addonId: null,
32570
- access: "view"
32571
- },
32572
- "snapshotProvider.supportsDevice": {
32573
- capName: "snapshot-provider",
32574
- capScope: "system",
32575
- addonId: null,
32576
- access: "view"
32577
- },
32578
32791
  "ssoBridge.signBridgeToken": {
32579
32792
  capName: "sso-bridge",
32580
32793
  capScope: "system",
@@ -33001,30 +33214,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
33001
33214
  addonId: null,
33002
33215
  access: "view"
33003
33216
  },
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
33217
  "streamParams.getConfigSchema": {
33029
33218
  capName: "stream-params",
33030
33219
  capScope: "device",
@@ -33271,6 +33460,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
33271
33460
  addonId: null,
33272
33461
  access: "view"
33273
33462
  },
33463
+ "userPasskeys.beginDiscoverableAuthentication": {
33464
+ capName: "user-passkeys",
33465
+ capScope: "system",
33466
+ addonId: null,
33467
+ access: "view"
33468
+ },
33274
33469
  "userPasskeys.beginRegistration": {
33275
33470
  capName: "user-passkeys",
33276
33471
  capScope: "system",
@@ -33283,12 +33478,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
33283
33478
  addonId: null,
33284
33479
  access: "view"
33285
33480
  },
33481
+ "userPasskeys.finishDiscoverableAuthentication": {
33482
+ capName: "user-passkeys",
33483
+ capScope: "system",
33484
+ addonId: null,
33485
+ access: "view"
33486
+ },
33286
33487
  "userPasskeys.finishRegistration": {
33287
33488
  capName: "user-passkeys",
33288
33489
  capScope: "system",
33289
33490
  addonId: null,
33290
33491
  access: "create"
33291
33492
  },
33493
+ "userPasskeys.getSecondFactorPreference": {
33494
+ capName: "user-passkeys",
33495
+ capScope: "system",
33496
+ addonId: null,
33497
+ access: "view"
33498
+ },
33292
33499
  "userPasskeys.listPasskeys": {
33293
33500
  capName: "user-passkeys",
33294
33501
  capScope: "system",
@@ -33301,6 +33508,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
33301
33508
  addonId: null,
33302
33509
  access: "delete"
33303
33510
  },
33511
+ "userPasskeys.setSecondFactorPreference": {
33512
+ capName: "user-passkeys",
33513
+ capScope: "system",
33514
+ addonId: null,
33515
+ access: "create"
33516
+ },
33304
33517
  "vacuumControl.locate": {
33305
33518
  capName: "vacuum-control",
33306
33519
  capScope: "device",
@@ -33373,6 +33586,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
33373
33586
  addonId: null,
33374
33587
  access: "view"
33375
33588
  },
33589
+ "viewerUi.getStaticDir": {
33590
+ capName: "viewer-ui",
33591
+ capScope: "system",
33592
+ addonId: null,
33593
+ access: "view"
33594
+ },
33595
+ "viewerUi.getVersion": {
33596
+ capName: "viewer-ui",
33597
+ capScope: "system",
33598
+ addonId: null,
33599
+ access: "view"
33600
+ },
33376
33601
  "waterHeater.setAway": {
33377
33602
  capName: "water-heater",
33378
33603
  capScope: "device",
@@ -33391,54 +33616,6 @@ var METHOD_ACCESS_MAP = Object.freeze({
33391
33616
  addonId: null,
33392
33617
  access: "create"
33393
33618
  },
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
33619
  "webrtcSession.addIceCandidate": {
33443
33620
  capName: "webrtc-session",
33444
33621
  capScope: "device",