@camstack/addon-pipeline 1.1.45 → 1.1.47

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist/audio-analyzer/index.js +1 -1
  2. package/dist/audio-analyzer/index.mjs +1 -1
  3. package/dist/detection-pipeline/index.js +78 -231
  4. package/dist/detection-pipeline/index.mjs +78 -231
  5. package/dist/{dist-D04numuO.mjs → dist-BXax-C-g.mjs} +316 -101
  6. package/dist/{dist-CjxqjgEv.js → dist-CSXbgmP-.js} +316 -101
  7. package/dist/motion-wasm/index.js +1 -1
  8. package/dist/motion-wasm/index.mjs +1 -1
  9. package/dist/pipeline-runner/index.js +24 -8
  10. package/dist/pipeline-runner/index.mjs +24 -8
  11. package/dist/recorder/index.js +1 -1
  12. package/dist/recorder/index.mjs +1 -1
  13. package/dist/{remote-source-plane-D31IILFN.mjs → remote-source-plane-D9mX0HiW.mjs} +1 -1
  14. package/dist/{remote-source-plane-CLuxyDV2.js → remote-source-plane-Rbl_xds1.js} +1 -1
  15. package/dist/stream-broker/_stub.js +2 -2
  16. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BGKueo9D.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-Dz7jhO6c.mjs} +3 -3
  17. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-o4tu_xuc.mjs +26 -0
  18. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-8BUVCFIR.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-CK4BmiTK.mjs} +1 -1
  19. package/dist/stream-broker/{hostInit-DazV2RCq.mjs → hostInit-DcMnvklS.mjs} +3 -3
  20. package/dist/stream-broker/index.js +79 -18
  21. package/dist/stream-broker/index.mjs +79 -18
  22. package/dist/stream-broker/remoteEntry.js +1 -1
  23. package/embed-dist/assets/{MaskShapeCanvas-DI4BY7W2-D_F4a_3H.js → MaskShapeCanvas-DI4BY7W2-BSSjCL6j.js} +1 -1
  24. package/embed-dist/assets/{MotionZonesSettings-NcxxQN8r-CfTBrn4G.js → MotionZonesSettings-NcxxQN8r-BDb2ziPs.js} +1 -1
  25. package/embed-dist/assets/{PrivacyMaskSettings-APgPLF7p-BWYkeoRj.js → PrivacyMaskSettings-APgPLF7p-ARYovxqE.js} +1 -1
  26. package/embed-dist/assets/{index-_ccEdNW7.js → index-ByiLuUQZ.js} +10 -10
  27. package/embed-dist/assets/{index-CA4kv43T.css → index-JqUY2p33.css} +1 -1
  28. package/embed-dist/index.html +2 -2
  29. package/package.json +1 -1
  30. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D0sKyXiy.mjs +0 -26
@@ -4627,7 +4627,7 @@ function _instanceof(cls, params = {}) {
4627
4627
  return inst;
4628
4628
  }
4629
4629
  //#endregion
4630
- //#region ../types/dist/sleep-Cc14_yxc.mjs
4630
+ //#region ../types/dist/sleep-DJaTV2D7.mjs
4631
4631
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
4632
4632
  EventCategory["SystemBoot"] = "system.boot";
4633
4633
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -5348,10 +5348,6 @@ function hydrateField(field, values) {
5348
5348
  };
5349
5349
  }
5350
5350
  const rawValue = storedValue !== void 0 ? storedValue : defaultValue !== void 0 ? defaultValue : null;
5351
- if (field.type === "password") return {
5352
- ...field,
5353
- value: ""
5354
- };
5355
5351
  const value = field.type === "textarea" && field.isJson && rawValue !== null && typeof rawValue === "object" ? JSON.stringify(rawValue, null, 2) : rawValue;
5356
5352
  return {
5357
5353
  ...field,
@@ -6839,6 +6835,9 @@ function method(input, output, options) {
6839
6835
  function event(data) {
6840
6836
  return { data };
6841
6837
  }
6838
+ var StaticDirOutputSchema$1 = object({ staticDir: string() });
6839
+ var VersionOutputSchema$1 = object({ version: string() });
6840
+ method(_void(), StaticDirOutputSchema$1), method(_void(), VersionOutputSchema$1);
6842
6841
  var StaticDirOutputSchema = object({ staticDir: string() });
6843
6842
  var VersionOutputSchema = object({ version: string() });
6844
6843
  method(_void(), StaticDirOutputSchema), method(_void(), VersionOutputSchema);
@@ -11221,7 +11220,7 @@ var BoundingBoxSchema = object({
11221
11220
  w: number(),
11222
11221
  h: number()
11223
11222
  });
11224
- var SpatialDetectionSchema = object({
11223
+ object({
11225
11224
  class: string(),
11226
11225
  originalClass: string(),
11227
11226
  score: number(),
@@ -11425,11 +11424,6 @@ var PipelineSchemaSchema = object({
11425
11424
  selectedEngine: PipelineEngineChoiceSchema,
11426
11425
  slots: array(PipelineSlotSchemaSchema).readonly()
11427
11426
  });
11428
- var DetectorOutputSchema = object({
11429
- detections: array(SpatialDetectionSchema).readonly(),
11430
- inferenceMs: number(),
11431
- modelId: string()
11432
- });
11433
11427
  var EngineProvisioningSchema = object({
11434
11428
  runtimeId: _enum([
11435
11429
  "onnx",
@@ -11595,23 +11589,23 @@ var pipelineExecutorCapability = {
11595
11589
  auth: "admin"
11596
11590
  }),
11597
11591
  /**
11598
- * Reset ONE node's detection-pipeline to its factory defaults, forcing
11599
- * regeneration of the (now hardware-aware) default object-detection
11600
- * model. `nodeId` is the ROUTING key — the generated cap-router strips
11601
- * it (default `nodeIdMode: 'routing'`, same as `getSelectedEngine` /
11602
- * `getDefaultSteps`) and dispatches to that node, so the provider method
11603
- * runs ON the target node and receives no `nodeId`.
11592
+ * Clear THIS node's executor-side PER-DEVICE settings stores (the
11593
+ * per-camera step overrides the object-detection root reads via
11594
+ * `applyDeviceOverridesToTree`). `nodeId` is the ROUTING key — the
11595
+ * generated cap-router strips it (default `nodeIdMode: 'routing'`) and
11596
+ * dispatches to that node, so the provider method runs ON the target
11597
+ * node and receives no `nodeId`.
11604
11598
  *
11605
- * Clears the node's persisted global pipeline seed (`pipelineSteps`) +
11606
- * legacy engine blob (`pipelineEngine`) and every device's per-camera
11607
- * step overrides, then re-seeds the hardware-aware default tree. Returns
11608
- * the regenerated object-detection model id (null when the default tree
11609
- * has no detector for this node's engine format) so the caller can
11610
- * verify the reset without a second round-trip.
11599
+ * This is the slimmed executor leg of the orchestrator's
11600
+ * `resetNodePipelineDefaults` flow (which owns the real reset: node
11601
+ * addonDefaults pins + per-camera orchestrator overrides). The legacy
11602
+ * `resetToDefault` which reset a persisted global step-tree seed
11603
+ * nothing in the live per-camera path read was removed together with
11604
+ * that seed.
11611
11605
  */
11612
- resetToDefault: method(object({ nodeId: string() }), object({
11606
+ clearDeviceOverrides: method(object({ nodeId: string() }), object({
11613
11607
  success: literal(true),
11614
- regeneratedModelId: string().nullable()
11608
+ clearedDevices: number()
11615
11609
  }), {
11616
11610
  kind: "mutation",
11617
11611
  auth: "admin"
@@ -11657,11 +11651,6 @@ var pipelineExecutorCapability = {
11657
11651
  modelId: string(),
11658
11652
  format: ModelFormatSchema$1
11659
11653
  }), object({ success: literal(true) }), { kind: "mutation" }),
11660
- detect: method(object({
11661
- addonId: string(),
11662
- frame: FrameInputSchema,
11663
- config: record(string(), unknown()).optional()
11664
- }), DetectorOutputSchema),
11665
11654
  /**
11666
11655
  * Stateless single-frame execution. Callers (runner, benchmark) pass
11667
11656
  * the complete `engine` + `steps` tree; the executor holds no state
@@ -13554,7 +13543,9 @@ var AddonPageDeclarationSchema$1 = object({
13554
13543
  icon: string(),
13555
13544
  path: string(),
13556
13545
  remoteName: string(),
13557
- bundle: string()
13546
+ bundle: string(),
13547
+ section: string().optional(),
13548
+ sectionLabel: string().optional()
13558
13549
  });
13559
13550
  var AddonPageInfoSchema = object({
13560
13551
  addonId: string(),
@@ -13594,7 +13585,18 @@ var AddonPageDeclarationSchema = object({
13594
13585
  * the static-file route can compute an mtime-based cache-buster URL
13595
13586
  * without a separate filesystem stat.
13596
13587
  */
13597
- bundle: string()
13588
+ bundle: string(),
13589
+ /**
13590
+ * Sidebar section this page docks into. Well-known ids: `'detection'`,
13591
+ * `'cluster'`, `'administration'` — the page renders inside that group.
13592
+ * Any OTHER string creates (or joins) a custom section rendered after
13593
+ * the built-in groups; its label comes from `sectionLabel` (first
13594
+ * declaration wins), falling back to the id. Absent → the legacy
13595
+ * "Addon Pages" group.
13596
+ */
13597
+ section: string().optional(),
13598
+ /** Display label for a CUSTOM `section` id (ignored for well-known ids). */
13599
+ sectionLabel: string().optional()
13598
13600
  });
13599
13601
  method(_void(), array(AddonPageDeclarationSchema).readonly());
13600
13602
  var AddonHttpRouteSchema = object({
@@ -13810,6 +13812,17 @@ var WidgetMetadataSchema = object({
13810
13812
  deviceContext: boolean().default(false),
13811
13813
  integrationContext: boolean().default(false)
13812
13814
  }),
13815
+ /**
13816
+ * Loadable BEFORE authentication. The normal widget registry listing
13817
+ * (`addon-widgets.listWidgets`) is auth-gated, so a pre-auth surface
13818
+ * (the login page) cannot discover a widget through it. A widget that
13819
+ * declares `preAuth: true` marks itself as safe to mount on a pre-auth
13820
+ * screen — it is surfaced through the PUBLIC `auth.listLoginMethods`
13821
+ * login-method contribution channel (see `login-method.cap.ts`) rather
13822
+ * than the authenticated registry, and its bundle is served by the
13823
+ * public `/api/addon-widgets/:addonId/*` static route. Defaults false.
13824
+ */
13825
+ preAuth: boolean().optional().default(false),
13813
13826
  /** Dashboard placement HINTS (operator can override per instance). */
13814
13827
  defaultSize: WidgetSizeEnum.default("md"),
13815
13828
  allowedSizes: array(WidgetSizeEnum).readonly().default([
@@ -14202,6 +14215,66 @@ method(object({
14202
14215
  password: string()
14203
14216
  }), AuthResultSchema.nullable(), { kind: "mutation" }), method(object({ state: string() }), string()), method(record(string(), string()), AuthResultSchema, { kind: "mutation" }), method(object({ token: string() }), AuthResultSchema.nullable());
14204
14217
  /**
14218
+ * `login-method` — collection cap through which auth addons contribute
14219
+ * their pre-auth login surfaces to the login page. This is the SINGLE,
14220
+ * generic mechanism that supersedes the dead `auth.listProviders` reader:
14221
+ * every auth addon (OIDC, magic-link, WebAuthn/passkey) registers a
14222
+ * `login-method` provider and the PUBLIC `auth.listLoginMethods`
14223
+ * procedure aggregates them for the unauthenticated login page.
14224
+ *
14225
+ * A contribution is a discriminated union on `kind`:
14226
+ *
14227
+ * - `redirect` — a declarative button. The login page renders a generic
14228
+ * button that navigates to `startUrl` (an addon-owned HTTP route).
14229
+ * Covers OIDC (`/addon/auth-oidc/<id>/start`) and magic-link with
14230
+ * ZERO shell-side JS. A future SSO addon plugs in the same way — the
14231
+ * login page needs NO change.
14232
+ *
14233
+ * - `widget` — a Module-Federation widget the login page mounts (via
14234
+ * `loadRemoteBundle`) for an in-page ceremony. Covers the passkey
14235
+ * login ceremony, which must run `@simplewebauthn/browser` INSIDE the
14236
+ * addon bundle. The referenced widget also declares `preAuth: true` in
14237
+ * its `addon-widgets-source` catalog entry. `auth.listLoginMethods`
14238
+ * stamps a public `bundleUrl` from `addonId` + `bundle`.
14239
+ *
14240
+ * Every contribution carries a `stage`:
14241
+ * - `primary` — shown on the first credentials screen (OIDC /
14242
+ * magic-link buttons; a future usernameless passkey).
14243
+ * - `second-factor` — shown AFTER the password leg, gated on the
14244
+ * returned `factors` (passkey-as-2FA today).
14245
+ *
14246
+ * `mount: skip` — the cap is read server-side by the core auth router
14247
+ * (`registry.getCollection('login-method')`), never mounted as its own
14248
+ * tRPC router.
14249
+ */
14250
+ /** When a login method renders in the two-phase login flow. */
14251
+ var LoginStageEnum = _enum(["primary", "second-factor"]);
14252
+ /** One login-method contribution — redirect button OR pre-auth widget. */
14253
+ var LoginMethodContributionSchema = discriminatedUnion("kind", [object({
14254
+ kind: literal("redirect"),
14255
+ /** Stable id within the login-method set (e.g. `auth-oidc/google`). */
14256
+ id: string(),
14257
+ /** Operator-facing button label. */
14258
+ label: string(),
14259
+ /** lucide-react icon name. */
14260
+ icon: string().optional(),
14261
+ /** Addon-owned HTTP route the button navigates to (GET). */
14262
+ startUrl: string(),
14263
+ stage: LoginStageEnum
14264
+ }), object({
14265
+ kind: literal("widget"),
14266
+ /** Stable id within the login-method set (e.g. `auth-webauthn/passkey-login`). */
14267
+ id: string(),
14268
+ /** Owning addon id — drives the public bundle URL + the MF namespace. */
14269
+ addonId: string(),
14270
+ /** Bundle filename inside the addon's dist dir (`remoteEntry.js`). */
14271
+ bundle: string(),
14272
+ /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
14273
+ remote: WidgetRemoteSchema,
14274
+ stage: LoginStageEnum
14275
+ })]);
14276
+ method(_void(), array(LoginMethodContributionSchema).readonly());
14277
+ /**
14205
14278
  * Orchestrator-side destination metadata. The orchestrator computes
14206
14279
  * `id = <addonId>:<subId>` from its provider lookup so consumers
14207
14280
  * (admin UI, restore flow) see one canonical key.
@@ -16571,7 +16644,12 @@ var AgentPipelineSettingsSchema = object({
16571
16644
  detectWeight: number().positive().optional(),
16572
16645
  /** Node is eligible to run the detection pipeline (decode + inference). */
16573
16646
  detect: boolean().optional(),
16574
- /** Node is eligible to host decoder sessions. */
16647
+ /**
16648
+ * DEPRECATED AND IGNORED. Decode is always co-located with its frame
16649
+ * consumer, so decode eligibility IS detect eligibility. Kept optional in
16650
+ * the schema ONLY so persisted stores written before the removal still
16651
+ * parse — no code reads it and no write path emits it.
16652
+ */
16575
16653
  decode: boolean().optional(),
16576
16654
  /** Node is eligible to run audio-analyzer sessions. */
16577
16655
  audio: boolean().optional(),
@@ -16632,25 +16710,6 @@ var PipelineAssignmentSchema = object({
16632
16710
  assignedAt: number()
16633
16711
  });
16634
16712
  /**
16635
- * Decoder placement record. Symmetric to `PipelineAssignmentSchema` but for
16636
- * the decoder-node placement domain (`balanceDecoder` decision: manual pin
16637
- * → co-located with pipeline → capacity).
16638
- */
16639
- var DecoderAssignmentSchema = object({
16640
- deviceId: number(),
16641
- /** Moleculer node id of the decoder provider currently responsible for this camera. */
16642
- decoderNodeId: string(),
16643
- /** True when the assignment was set manually via `assignDecoder`, false when chosen by the balancer. */
16644
- pinned: boolean(),
16645
- /** Why this assignment was made — useful for debugging the decoder balancer. */
16646
- reason: _enum([
16647
- "manual",
16648
- "co-located",
16649
- "capacity",
16650
- "hardware-affinity"
16651
- ])
16652
- });
16653
- /**
16654
16713
  * Per-agent load summary surfaced to the load balancer + dashboards.
16655
16714
  * Aggregated from each runner's `getLocalLoad` cap call.
16656
16715
  */
@@ -16856,15 +16915,6 @@ method(object({
16856
16915
  }), method(_void(), IngestOwnerSchema), method(object({
16857
16916
  deviceId: number(),
16858
16917
  nodeId: string()
16859
- }), _void(), {
16860
- kind: "mutation",
16861
- auth: "admin"
16862
- }), method(object({ deviceId: number() }), _void(), {
16863
- kind: "mutation",
16864
- auth: "admin"
16865
- }), method(_void(), array(DecoderAssignmentSchema).readonly()), method(object({
16866
- deviceId: number(),
16867
- nodeId: string()
16868
16918
  }), object({ success: literal(true) }), {
16869
16919
  kind: "mutation",
16870
16920
  auth: "admin"
@@ -16883,10 +16933,7 @@ method(object({
16883
16933
  nodeId: string(),
16884
16934
  pinned: boolean(),
16885
16935
  assignedAt: number()
16886
- }))), method(object({
16887
- deviceId: number(),
16888
- pipelineNodeId: string().optional()
16889
- }), DecoderAssignmentSchema), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
16936
+ }))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
16890
16937
  nodeId: string(),
16891
16938
  settings: AgentPipelineSettingsSchema
16892
16939
  })).readonly()), method(object({
@@ -16916,7 +16963,6 @@ method(object({
16916
16963
  }), method(object({
16917
16964
  agentNodeId: string(),
16918
16965
  detect: boolean().nullable().optional(),
16919
- decode: boolean().nullable().optional(),
16920
16966
  audio: boolean().nullable().optional(),
16921
16967
  ingest: boolean().nullable().optional()
16922
16968
  }), object({ success: literal(true) }), {
@@ -16928,6 +16974,15 @@ method(object({
16928
16974
  }), object({ success: literal(true) }), {
16929
16975
  kind: "mutation",
16930
16976
  auth: "admin"
16977
+ }), method(object({ agentNodeId: string() }), object({
16978
+ success: literal(true),
16979
+ /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
16980
+ effectiveModelId: string().nullable(),
16981
+ /** Number of cameras whose node-scoped overrides were cleared. */
16982
+ clearedCameraOverrides: number()
16983
+ }), {
16984
+ kind: "mutation",
16985
+ auth: "admin"
16931
16986
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
16932
16987
  deviceId: number(),
16933
16988
  addonId: string(),
@@ -16973,6 +17028,131 @@ method(object({
16973
17028
  auth: "admin"
16974
17029
  });
16975
17030
  /**
17031
+ * server-management — per-NODE singleton capability for a node's ROOT
17032
+ * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
17033
+ * agents).
17034
+ *
17035
+ * Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
17036
+ * on agents) carries the whole software stack in its npm dep tree, so ONE
17037
+ * version describes the node. Updates install into
17038
+ * `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
17039
+ * starter (probation boot + auto-rollback to N-1).
17040
+ *
17041
+ * Providers:
17042
+ * - HUB: `ServerUpdateService` behind the `server-provided` mount
17043
+ * (`buildServerProviders` in trpc.router.ts) — the default target for
17044
+ * unpinned calls.
17045
+ * - AGENT: `AgentUpdateService` registered by the agent bootstrap under
17046
+ * the synthetic `agent-runtime` addonId and declared in the agent's
17047
+ * `$hub.registerNode` manifest.
17048
+ *
17049
+ * Node routing: singleton caps get the codegen/runtime-builder `nodeId`
17050
+ * injection on every method — `input.nodeId` (or `nodePin(nodeId)` from the
17051
+ * SDK) routes the call to that node's provider via the standard remote
17052
+ * proxy (`createCapabilityProxy` → `$agent-cap-fwd` → the agent's
17053
+ * in-process provider lookup). No `nodeId` → the hub's own provider.
17054
+ *
17055
+ * Spec: docs/superpowers/specs/2026-07-12-runtime-updatable-node-packages-design.md
17056
+ */
17057
+ /**
17058
+ * Where the running hub's code was loaded from:
17059
+ * - `workspace` — dev checkout (tsx / workspace dist); the starter defers to
17060
+ * plain resolution and runtime updates are refused.
17061
+ * - `baked` — the immutable image seed closure (no data-dir root active).
17062
+ * - `data-root` — the runtime-updatable `<dataDir>/server-root` closure.
17063
+ */
17064
+ var ServerBootModeSchema = _enum([
17065
+ "workspace",
17066
+ "baked",
17067
+ "data-root"
17068
+ ]);
17069
+ /**
17070
+ * Update lifecycle state:
17071
+ * - `idle` / `checking` / `staging` — steady / in-flight registry work.
17072
+ * - `pending-restart` — a version is staged and the node has NOT yet
17073
+ * restarted onto it (still running the OLD version).
17074
+ * - `awaiting-confirmation` — the node HAS restarted onto the staged version
17075
+ * (it is the active probation boot) and is waiting to confirm boot-health.
17076
+ * Apply/rollback are refused in this state and the node must NOT be
17077
+ * manually restarted, or the probation boot auto-rolls-back.
17078
+ */
17079
+ var ServerUpdateStateSchema = _enum([
17080
+ "idle",
17081
+ "checking",
17082
+ "staging",
17083
+ "pending-restart",
17084
+ "awaiting-confirmation"
17085
+ ]);
17086
+ var ServerRollbackInfoSchema = object({
17087
+ /** The version that failed (or was manually rolled back). */
17088
+ fromVersion: string(),
17089
+ /** The version rolled back to; null = the baked seed. */
17090
+ toVersion: string().nullable(),
17091
+ atMs: number(),
17092
+ reason: string()
17093
+ });
17094
+ var ServerPackageStatusSchema = object({
17095
+ /** Root package name (`@camstack/server` on the hub). */
17096
+ packageName: string(),
17097
+ /** Version of the code the running process ACTUALLY loaded. */
17098
+ runningVersion: string().nullable(),
17099
+ /** Node.js runtime version the node's process runs on (`process.versions.node`). */
17100
+ nodeRuntimeVersion: string().nullable(),
17101
+ /** Active data-dir root version; null when booted from seed/workspace. */
17102
+ activeVersion: string().nullable(),
17103
+ /** N-1 version kept for rollback; null when no previous version exists. */
17104
+ previousVersion: string().nullable(),
17105
+ /** Version of the immutable baked seed closure (image fallback). */
17106
+ seedVersion: string().nullable(),
17107
+ /** Latest registry version from the most recent check (null = never checked). */
17108
+ latestVersion: string().nullable(),
17109
+ updateAvailable: boolean(),
17110
+ bootMode: ServerBootModeSchema,
17111
+ updateState: ServerUpdateStateSchema,
17112
+ /** Version staged + awaiting its probation boot, when one is pending. */
17113
+ pendingVersion: string().nullable(),
17114
+ /** Set when the last freshly-activated version failed its boot health-check. */
17115
+ rolledBack: ServerRollbackInfoSchema.nullable(),
17116
+ /**
17117
+ * True when `server-root/state.json` EXISTS but is unreadable/corrupt — the
17118
+ * hub is running from the baked seed (or workspace) while installed data-dir
17119
+ * versions are being IGNORED. Surfaced as a warning in the UI.
17120
+ */
17121
+ stateFileCorrupt: boolean(),
17122
+ lastCheckedAtMs: number().nullable()
17123
+ });
17124
+ var ServerUpdateCheckResultSchema = object({
17125
+ packageName: string(),
17126
+ runningVersion: string().nullable(),
17127
+ latestVersion: string().nullable(),
17128
+ updateAvailable: boolean(),
17129
+ checkedAtMs: number(),
17130
+ /** Non-null when the registry lookup failed (offline, bad registry, …). */
17131
+ error: string().nullable()
17132
+ });
17133
+ var ServerUpdateActionResultSchema = object({
17134
+ accepted: boolean(),
17135
+ targetVersion: string().nullable(),
17136
+ /** True when a graceful restart was scheduled to apply the change. */
17137
+ restarting: boolean(),
17138
+ message: string()
17139
+ });
17140
+ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), ServerUpdateCheckResultSchema, {
17141
+ kind: "mutation",
17142
+ auth: "admin"
17143
+ }), method(object({
17144
+ /** Explicit target version; omitted = latest from the registry. */
17145
+ version: string().optional() }), ServerUpdateActionResultSchema, {
17146
+ kind: "mutation",
17147
+ auth: "admin"
17148
+ }), method(_void(), ServerUpdateActionResultSchema, {
17149
+ kind: "mutation",
17150
+ auth: "admin"
17151
+ }), method(_void(), ServerUpdateActionResultSchema, {
17152
+ kind: "mutation",
17153
+ auth: "admin"
17154
+ });
17155
+ /**
16976
17156
  * Query filter for settings-store collections.
16977
17157
  */
16978
17158
  var QueryFilterSchema = object({
@@ -19054,6 +19234,16 @@ var TopologyCategorySchema = object({
19054
19234
  healthy: number(),
19055
19235
  addons: array(TopologyCategoryAddonSchema).readonly()
19056
19236
  });
19237
+ /**
19238
+ * The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
19239
+ * `@camstack/agent` on agents) as reported by its `registerNode` manifest —
19240
+ * version visibility for the Server management surface. Nullable: offline
19241
+ * rows and pre-phase-2 nodes report none.
19242
+ */
19243
+ var TopologyRootPackageSchema = object({
19244
+ name: string(),
19245
+ version: string()
19246
+ });
19057
19247
  var TopologyNodeSchema = object({
19058
19248
  id: string(),
19059
19249
  name: string(),
@@ -19077,7 +19267,8 @@ var TopologyNodeSchema = object({
19077
19267
  status: string()
19078
19268
  })).readonly(),
19079
19269
  processes: array(TopologyProcessSchema).readonly(),
19080
- categories: array(TopologyCategorySchema).readonly()
19270
+ categories: array(TopologyCategorySchema).readonly(),
19271
+ rootPackage: TopologyRootPackageSchema.nullable()
19081
19272
  });
19082
19273
  var CapUsageEdgeSchema = object({
19083
19274
  callerAddonId: string(),
@@ -21910,6 +22101,12 @@ Object.freeze({
21910
22101
  addonId: null,
21911
22102
  access: "create"
21912
22103
  },
22104
+ "loginMethod.getLoginMethods": {
22105
+ capName: "login-method",
22106
+ capScope: "system",
22107
+ addonId: null,
22108
+ access: "view"
22109
+ },
21913
22110
  "mediaPlayer.next": {
21914
22111
  capName: "media-player",
21915
22112
  capScope: "device",
@@ -22540,23 +22737,23 @@ Object.freeze({
22540
22737
  addonId: null,
22541
22738
  access: "create"
22542
22739
  },
22543
- "pipelineExecutor.deleteModel": {
22740
+ "pipelineExecutor.clearDeviceOverrides": {
22544
22741
  capName: "pipeline-executor",
22545
22742
  capScope: "system",
22546
22743
  addonId: null,
22547
22744
  access: "delete"
22548
22745
  },
22549
- "pipelineExecutor.deleteTemplate": {
22746
+ "pipelineExecutor.deleteModel": {
22550
22747
  capName: "pipeline-executor",
22551
22748
  capScope: "system",
22552
22749
  addonId: null,
22553
22750
  access: "delete"
22554
22751
  },
22555
- "pipelineExecutor.detect": {
22752
+ "pipelineExecutor.deleteTemplate": {
22556
22753
  capName: "pipeline-executor",
22557
22754
  capScope: "system",
22558
22755
  addonId: null,
22559
- access: "view"
22756
+ access: "delete"
22560
22757
  },
22561
22758
  "pipelineExecutor.downloadModel": {
22562
22759
  capName: "pipeline-executor",
@@ -22702,12 +22899,6 @@ Object.freeze({
22702
22899
  addonId: null,
22703
22900
  access: "create"
22704
22901
  },
22705
- "pipelineExecutor.resetToDefault": {
22706
- capName: "pipeline-executor",
22707
- capScope: "system",
22708
- addonId: null,
22709
- access: "delete"
22710
- },
22711
22902
  "pipelineExecutor.runAudioTest": {
22712
22903
  capName: "pipeline-executor",
22713
22904
  capScope: "system",
@@ -22768,12 +22959,6 @@ Object.freeze({
22768
22959
  addonId: null,
22769
22960
  access: "create"
22770
22961
  },
22771
- "pipelineOrchestrator.assignDecoder": {
22772
- capName: "pipeline-orchestrator",
22773
- capScope: "system",
22774
- addonId: null,
22775
- access: "create"
22776
- },
22777
22962
  "pipelineOrchestrator.assignPipeline": {
22778
22963
  capName: "pipeline-orchestrator",
22779
22964
  capScope: "system",
@@ -22852,18 +23037,6 @@ Object.freeze({
22852
23037
  addonId: null,
22853
23038
  access: "view"
22854
23039
  },
22855
- "pipelineOrchestrator.getDecoderAssignment": {
22856
- capName: "pipeline-orchestrator",
22857
- capScope: "system",
22858
- addonId: null,
22859
- access: "view"
22860
- },
22861
- "pipelineOrchestrator.getDecoderAssignments": {
22862
- capName: "pipeline-orchestrator",
22863
- capScope: "system",
22864
- addonId: null,
22865
- access: "view"
22866
- },
22867
23040
  "pipelineOrchestrator.getGlobalMetrics": {
22868
23041
  capName: "pipeline-orchestrator",
22869
23042
  capScope: "system",
@@ -22912,6 +23085,12 @@ Object.freeze({
22912
23085
  addonId: null,
22913
23086
  access: "delete"
22914
23087
  },
23088
+ "pipelineOrchestrator.resetNodePipelineDefaults": {
23089
+ capName: "pipeline-orchestrator",
23090
+ capScope: "system",
23091
+ addonId: null,
23092
+ access: "delete"
23093
+ },
22915
23094
  "pipelineOrchestrator.resolvePipeline": {
22916
23095
  capName: "pipeline-orchestrator",
22917
23096
  capScope: "system",
@@ -22984,12 +23163,6 @@ Object.freeze({
22984
23163
  addonId: null,
22985
23164
  access: "create"
22986
23165
  },
22987
- "pipelineOrchestrator.unassignDecoder": {
22988
- capName: "pipeline-orchestrator",
22989
- capScope: "system",
22990
- addonId: null,
22991
- access: "create"
22992
- },
22993
23166
  "pipelineOrchestrator.unassignPipeline": {
22994
23167
  capName: "pipeline-orchestrator",
22995
23168
  capScope: "system",
@@ -23296,6 +23469,36 @@ Object.freeze({
23296
23469
  addonId: null,
23297
23470
  access: "create"
23298
23471
  },
23472
+ "serverManagement.applyServerUpdate": {
23473
+ capName: "server-management",
23474
+ capScope: "system",
23475
+ addonId: null,
23476
+ access: "create"
23477
+ },
23478
+ "serverManagement.checkServerUpdate": {
23479
+ capName: "server-management",
23480
+ capScope: "system",
23481
+ addonId: null,
23482
+ access: "create"
23483
+ },
23484
+ "serverManagement.getServerPackageStatus": {
23485
+ capName: "server-management",
23486
+ capScope: "system",
23487
+ addonId: null,
23488
+ access: "view"
23489
+ },
23490
+ "serverManagement.restartServer": {
23491
+ capName: "server-management",
23492
+ capScope: "system",
23493
+ addonId: null,
23494
+ access: "create"
23495
+ },
23496
+ "serverManagement.rollbackServerUpdate": {
23497
+ capName: "server-management",
23498
+ capScope: "system",
23499
+ addonId: null,
23500
+ access: "create"
23501
+ },
23299
23502
  "settingsStore.count": {
23300
23503
  capName: "settings-store",
23301
23504
  capScope: "system",
@@ -24160,6 +24363,18 @@ Object.freeze({
24160
24363
  addonId: null,
24161
24364
  access: "view"
24162
24365
  },
24366
+ "viewerUi.getStaticDir": {
24367
+ capName: "viewer-ui",
24368
+ capScope: "system",
24369
+ addonId: null,
24370
+ access: "view"
24371
+ },
24372
+ "viewerUi.getVersion": {
24373
+ capName: "viewer-ui",
24374
+ capScope: "system",
24375
+ addonId: null,
24376
+ access: "view"
24377
+ },
24163
24378
  "waterHeater.setAway": {
24164
24379
  capName: "water-heater",
24165
24380
  capScope: "device",