@camstack/addon-mqtt-broker 1.1.28 → 1.2.0

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.
@@ -7113,6 +7113,17 @@ var ModelCatalogEntrySchema = object({
7113
7113
  "imagenet",
7114
7114
  "none"
7115
7115
  ]).optional(),
7116
+ /**
7117
+ * The model already applies softmax IN-GRAPH — its raw output is a
7118
+ * probability distribution, not logits. When set, the `softmax`
7119
+ * postprocessor must NOT re-apply softmax: re-softmaxing an already-normalised
7120
+ * probability vector collapses it toward uniform (top-1 score craters far
7121
+ * below its true value, making every confidence gate meaningless). Absent ⇒
7122
+ * the output is raw logits and the postprocessor applies softmax (the normal
7123
+ * case). Set on the Google AIY Birds `bird-classifier` (softmax baked into the
7124
+ * TF graph). Threaded to the Python pool via `PoolModelConfig.outputProbabilities`.
7125
+ */
7126
+ outputProbabilities: boolean().optional(),
7116
7127
  preprocessMode: _enum(["letterbox", "resize"]).optional(),
7117
7128
  /**
7118
7129
  * Per-MODEL postprocessor override. Absent ⇒ the step's own
@@ -11126,10 +11137,7 @@ var ConfigUISchemaNullableBridge = custom();
11126
11137
  var InferenceCapabilitiesBridge = custom();
11127
11138
  var ModelAvailabilityListBridge = custom();
11128
11139
  var PipelineRunResultBridge = custom();
11129
- method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
11130
- kind: "mutation",
11131
- auth: "admin"
11132
- }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
11140
+ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
11133
11141
  modelId: string(),
11134
11142
  settings: record(string(), unknown()).readonly()
11135
11143
  }))), method(object({ steps: record(string(), object({
@@ -11189,13 +11197,33 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
11189
11197
  * (inputClasses ≠ null) are skipped and served per-track via
11190
11198
  * pipelineRunner.runDetailSubtree (two-plane design).
11191
11199
  */
11192
- plane: _enum(["full", "frame"]).optional()
11200
+ plane: _enum(["full", "frame"]).optional(),
11201
+ /**
11202
+ * Inference-device selector (Phase 2 multi-device). Format
11203
+ * `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`).
11204
+ * Omitted ⇒ the runner's default device (current single-engine
11205
+ * behaviour). Selects WHICH device pool of the node runs the call.
11206
+ */
11207
+ deviceKey: string().optional()
11193
11208
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
11194
11209
  engine: PipelineEngineChoiceSchema.optional(),
11195
11210
  steps: array(PipelineStepInputSchema).min(1),
11196
11211
  frames: array(FrameInputSchema).min(1).max(255),
11197
11212
  deviceId: number().optional(),
11198
- sessionId: string().optional()
11213
+ sessionId: string().optional(),
11214
+ /**
11215
+ * Pure-inference benchmark hint. A NONZERO uint32 pins every frame in
11216
+ * the batch to the Python pool's bench preprocess cache
11217
+ * (`_bench_frame_id`) so a REPEATED benchmark frame is decoded +
11218
+ * preprocessed ONCE and every later inference is a pure-inference cache
11219
+ * hit — the sustained-throughput run measures inference, not
11220
+ * decode+preprocess+infer. Omitted/0 for live frames (all different →
11221
+ * full preprocess every call, correct). Fresh per sustained run;
11222
+ * released via `uncacheFrame`.
11223
+ */
11224
+ frameId: number().int().nonnegative().optional(),
11225
+ /** Inference-device selector (Phase 2 multi-device); see runPipeline. */
11226
+ deviceKey: string().optional()
11199
11227
  }), object({ results: array(PipelineRunResultBridge).readonly() }), { kind: "mutation" }), method(object({
11200
11228
  data: _instanceof(Uint8Array),
11201
11229
  width: number().int().positive(),
@@ -11227,8 +11255,18 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
11227
11255
  * - `runtime` — main camera-serving engine (no idle TTL).
11228
11256
  * - `warm-override` — benchmark/test override held in the warm
11229
11257
  * cache; auto-disposed after the idle TTL.
11258
+ * - `device-pool` — a concurrent per-device pool (Phase 2
11259
+ * multi-device, keyed by `deviceKey`) resolved
11260
+ * via `resolveDeviceFactory`. Runs alongside the
11261
+ * `runtime` engine on a DIFFERENT accelerator
11262
+ * (NPU / iGPU / Coral) — this is how the
11263
+ * Engines tab shows all pools running at once.
11230
11264
  */
11231
- kind: _enum(["runtime", "warm-override"]),
11265
+ kind: _enum([
11266
+ "runtime",
11267
+ "warm-override",
11268
+ "device-pool"
11269
+ ]),
11232
11270
  /** Native pid of the underlying Python pool (null when no pool). */
11233
11271
  poolPid: number().nullable(),
11234
11272
  /** ms since this factory was last used (null when not warm-tracked). */
@@ -11570,7 +11608,14 @@ var RunnerCameraConfigSchema = object({
11570
11608
  * camera's detect node differs from its source-owner (P2d, gated by the
11571
11609
  * `remoteSourcingNodes` rollout setting).
11572
11610
  */
11573
- frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
11611
+ frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" }),
11612
+ /**
11613
+ * Inference-device selector for this camera's sessions (Phase 2 multi-device).
11614
+ * Format `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`);
11615
+ * omitted ⇒ the runner's default device. The engine itself stays node-local —
11616
+ * this only selects WHICH device pool of that node runs the session.
11617
+ */
11618
+ deviceKey: string().optional()
11574
11619
  });
11575
11620
  motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
11576
11621
  /**
@@ -11591,6 +11636,19 @@ var RunnerLocalLoadSchema = object({
11591
11636
  avgInferenceTimeMs: number(),
11592
11637
  /** Total queue depth across motion + detection queues. */
11593
11638
  queueDepthTotal: number(),
11639
+ /**
11640
+ * Per-inference-device live load (multi-device C4). One entry per deviceKey
11641
+ * this runner currently has attached cameras on, so the orchestrator's second
11642
+ * `balance()` pass (over a node's devices) weights on real per-pool session
11643
+ * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
11644
+ * per device is 0 until the pool backlog gets a public accessor (follow-up).
11645
+ */
11646
+ devices: array(object({
11647
+ deviceKey: string(),
11648
+ backend: string(),
11649
+ attachedCameras: number(),
11650
+ queueDepthTotal: number()
11651
+ })).default([]),
11594
11652
  /** Hardware capability flags reported by this node. */
11595
11653
  hardware: object({
11596
11654
  hasGpu: boolean(),
@@ -13066,6 +13124,8 @@ method(_void(), _void(), { kind: "mutation" }), method(_void(), _void(), { kind:
13066
13124
  kind: "mutation",
13067
13125
  auth: "admin"
13068
13126
  });
13127
+ DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
13128
+ new Set(Object.values(DeviceType));
13069
13129
  /**
13070
13130
  * `addon-pages` — system-scoped singleton aggregator cap. Public-facing
13071
13131
  * surface that admin-ui consumes through `useAddonPagesListPages()`.
@@ -16803,13 +16863,11 @@ var PipelineTemplateSchema = object({
16803
16863
  createdAt: string(),
16804
16864
  updatedAt: string()
16805
16865
  });
16806
- var AgentAddonConfigSchema = object({
16807
- enabled: boolean(),
16866
+ var DeviceStepConfigSchema = object({
16808
16867
  modelId: string().optional(),
16809
- settings: record(string(), unknown()).readonly()
16868
+ settings: record(string(), unknown()).optional()
16810
16869
  });
16811
16870
  var AgentPipelineSettingsSchema = object({
16812
- addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
16813
16871
  maxCameras: number().int().nonnegative().nullable().default(null),
16814
16872
  /** Per-node detection weight (relative share for the quota balancer). */
16815
16873
  detectWeight: number().positive().optional(),
@@ -16833,7 +16891,22 @@ var AgentPipelineSettingsSchema = object({
16833
16891
  * it already uses to reach the hub). Set this only when the auto-detected
16834
16892
  * address is wrong (multi-homed host, NAT, custom interface).
16835
16893
  */
16836
- reachableHost: string().optional()
16894
+ reachableHost: string().optional(),
16895
+ /**
16896
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
16897
+ * weight, steps}. Absent / all-disabled ⇒ the node's single default
16898
+ * accelerator (safe default); two+ enabled ⇒ the dispatcher balances
16899
+ * detection sessions across them so they run CONCURRENTLY. `steps` is the
16900
+ * per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
16901
+ * the default model/settings for every camera landing on that accelerator;
16902
+ * a stepId absent ⇒ the step uses that device's format default.
16903
+ */
16904
+ inferenceDevices: record(string(), object({
16905
+ enabled: boolean(),
16906
+ weight: number().positive().optional(),
16907
+ maxSessions: number().int().positive().optional(),
16908
+ steps: record(string(), DeviceStepConfigSchema).optional()
16909
+ })).optional()
16837
16910
  });
16838
16911
  var CameraPipelineForAgentSchema = object({
16839
16912
  steps: array(PipelineStepInputSchema).readonly(),
@@ -16843,14 +16916,13 @@ var CameraPipelineForAgentSchema = object({
16843
16916
  }).nullable()
16844
16917
  });
16845
16918
  var CameraStepOverridePatchSchema = object({
16846
- enabled: boolean().optional(),
16847
16919
  modelId: string().optional(),
16848
16920
  settings: record(string(), unknown()).readonly().optional()
16849
16921
  });
16850
16922
  var CameraPipelineSettingsSchema = object({
16851
16923
  pinnedAgentNodeId: string().optional(),
16852
16924
  stepToggles: record(string(), boolean()).optional(),
16853
- stepOverridesByAgent: record(string(), record(string(), CameraStepOverridePatchSchema)).optional(),
16925
+ stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
16854
16926
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
16855
16927
  });
16856
16928
  /**
@@ -17064,6 +17136,44 @@ var CameraStatusSchema = object({
17064
17136
  /** Unix timestamp (ms) when this snapshot was composed server-side. */
17065
17137
  fetchedAt: number()
17066
17138
  });
17139
+ var NodeInferenceDeviceSchema = object({
17140
+ /** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
17141
+ key: string(),
17142
+ backend: string(),
17143
+ device: string(),
17144
+ format: _enum(MODEL_FORMATS),
17145
+ /** Whether the node's live probe reports the device as usable right now. */
17146
+ available: boolean(),
17147
+ /**
17148
+ * Whether this device participates in dispatch. AUTO default (spec C2):
17149
+ * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
17150
+ * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
17151
+ * not a balanced target). An explicit stored value always wins; a stored-only
17152
+ * (unavailable) key keeps its stored value.
17153
+ */
17154
+ enabled: boolean(),
17155
+ /** Relative balancer weight for the enabled device (default 1). */
17156
+ weight: number(),
17157
+ /** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
17158
+ maxSessions: number().nullable(),
17159
+ /** Object-detection model the executor defaults to for this deviceKey. */
17160
+ defaultModelId: string(),
17161
+ /**
17162
+ * Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
17163
+ * `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
17164
+ * Absent/empty ⇒ no base (every step uses its device format default). The
17165
+ * UI cross-references `pipelineExecutor.getSchema` for the models actually
17166
+ * available per format; this is the stored selection that becomes the
17167
+ * default for EVERY camera landing on this accelerator.
17168
+ */
17169
+ steps: record(string(), DeviceStepConfigSchema).optional()
17170
+ });
17171
+ var NodeInferenceDevicesSchema = object({
17172
+ nodeId: string(),
17173
+ /** False when the node's platform-probe was unreachable (no live device set). */
17174
+ reachable: boolean(),
17175
+ devices: array(NodeInferenceDeviceSchema).readonly()
17176
+ });
17067
17177
  method(object({
17068
17178
  deviceId: number(),
17069
17179
  agentNodeId: string()
@@ -17073,7 +17183,13 @@ method(object({
17073
17183
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
17074
17184
  kind: "mutation",
17075
17185
  auth: "admin"
17076
- }), method(_void(), object({ migrated: number() }), {
17186
+ }), method(object({
17187
+ deviceId: number(),
17188
+ deviceKey: string()
17189
+ }), object({ success: literal(true) }), {
17190
+ kind: "mutation",
17191
+ auth: "admin"
17192
+ }), method(object({ deviceId: number() }), object({ deviceKey: string().nullable() })), method(_void(), object({ migrated: number() }), {
17077
17193
  kind: "mutation",
17078
17194
  auth: "admin"
17079
17195
  }), method(_void(), array(PipelineAssignmentSchema).readonly()), method(object({ deviceId: number() }), PipelineAssignmentSchema.nullable()), method(_void(), array(AgentLoadSummarySchema).readonly()), method(_void(), GlobalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(object({ nodeId: string() }), CapabilityBindingsSchema), method(object({
@@ -17107,13 +17223,7 @@ method(object({
17107
17223
  }))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
17108
17224
  nodeId: string(),
17109
17225
  settings: AgentPipelineSettingsSchema
17110
- })).readonly()), method(object({
17111
- agentNodeId: string(),
17112
- defaults: record(string(), AgentAddonConfigSchema)
17113
- }), object({ success: literal(true) }), {
17114
- kind: "mutation",
17115
- auth: "admin"
17116
- }), method(object({ agentNodeId: string() }), object({
17226
+ })).readonly()), method(object({ agentNodeId: string() }), object({
17117
17227
  success: boolean(),
17118
17228
  removed: boolean()
17119
17229
  }), {
@@ -17145,7 +17255,18 @@ method(object({
17145
17255
  }), object({ success: literal(true) }), {
17146
17256
  kind: "mutation",
17147
17257
  auth: "admin"
17148
- }), method(object({ agentNodeId: string() }), object({
17258
+ }), method(object({
17259
+ agentNodeId: string(),
17260
+ inferenceDevices: record(string(), object({
17261
+ enabled: boolean(),
17262
+ weight: number().positive().optional(),
17263
+ maxSessions: number().int().positive().optional(),
17264
+ steps: record(string(), DeviceStepConfigSchema).optional()
17265
+ }))
17266
+ }), object({ success: literal(true) }), {
17267
+ kind: "mutation",
17268
+ auth: "admin"
17269
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
17149
17270
  success: literal(true),
17150
17271
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
17151
17272
  effectiveModelId: string().nullable(),
@@ -17161,9 +17282,10 @@ method(object({
17161
17282
  }), object({ success: literal(true) }), {
17162
17283
  kind: "mutation",
17163
17284
  auth: "admin"
17164
- }), method(object({ deviceId: number() }), record(string(), record(string(), CameraStepOverridePatchSchema)).nullable()), method(object({
17285
+ }), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
17165
17286
  deviceId: number(),
17166
17287
  agentNodeId: string(),
17288
+ deviceKey: string(),
17167
17289
  addonId: string(),
17168
17290
  patch: CameraStepOverridePatchSchema.nullable()
17169
17291
  }), object({ success: literal(true) }), {
@@ -17200,14 +17322,13 @@ method(object({
17200
17322
  });
17201
17323
  /**
17202
17324
  * server-management — per-NODE singleton capability for a node's ROOT
17203
- * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
17204
- * agents).
17325
+ * package lifecycle (runtime-updatable node packages).
17205
17326
  *
17206
- * Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
17207
- * on agents) carries the whole software stack in its npm dep tree, so ONE
17208
- * version describes the node. Updates install into
17209
- * `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
17210
- * starter (probation boot + auto-rollback to N-1).
17327
+ * Every node role runs the SAME root package (`@camstack/server`), which
17328
+ * carries the whole software stack in its npm dep tree, so ONE version
17329
+ * describes the node. Updates stage into `<dataDir>/server-root/` and apply
17330
+ * on restart via the baked starter (single-copy in-place swap — no probation,
17331
+ * no auto-rollback).
17211
17332
  *
17212
17333
  * Providers:
17213
17334
  * - HUB: `ServerUpdateService` behind the `server-provided` mount
@@ -17315,7 +17436,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
17315
17436
  /** Explicit target version; omitted = latest from the registry. */
17316
17437
  version: string().optional() }), ServerUpdateActionResultSchema, {
17317
17438
  kind: "mutation",
17318
- auth: "admin"
17439
+ auth: "admin",
17440
+ timeoutMs: 16 * 6e4
17319
17441
  }), method(_void(), ServerUpdateActionResultSchema, {
17320
17442
  kind: "mutation",
17321
17443
  auth: "admin"
@@ -18359,22 +18481,6 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
18359
18481
  var RestartAddonResultSchema = unknown();
18360
18482
  var InstallPackageResultSchema = unknown();
18361
18483
  var ReloadPackagesResultSchema = unknown();
18362
- /**
18363
- * Result of `updateFrameworkPackage`. The cap method returns BEFORE the
18364
- * server restarts so the admin UI can react to the `restartingAt`
18365
- * timestamp (shows reconnect overlay). The transition from
18366
- * `fromVersion` to `toVersion` will be confirmed by a subsequent
18367
- * `system.restart-completed` event after the new process boots.
18368
- *
18369
- * Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
18370
- */
18371
- var UpdateFrameworkPackageResultSchema = object({
18372
- packageName: string(),
18373
- fromVersion: string(),
18374
- toVersion: string(),
18375
- /** Ms-epoch the server scheduled its self-restart. */
18376
- restartingAt: number()
18377
- });
18378
18484
  var BulkUpdateItemStatusSchema = _enum([
18379
18485
  "queued",
18380
18486
  "updating",
@@ -18502,13 +18608,6 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
18502
18608
  }), object({ success: literal(true) }), {
18503
18609
  kind: "mutation",
18504
18610
  auth: "admin"
18505
- }), method(object({
18506
- packageName: string().min(1),
18507
- version: string().optional(),
18508
- deferRestart: boolean().optional()
18509
- }), UpdateFrameworkPackageResultSchema, {
18510
- kind: "mutation",
18511
- auth: "admin"
18512
18611
  }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
18513
18612
  kind: "mutation",
18514
18613
  auth: "admin"
@@ -19374,10 +19473,10 @@ var TopologyCategorySchema = object({
19374
19473
  addons: array(TopologyCategoryAddonSchema).readonly()
19375
19474
  });
19376
19475
  /**
19377
- * The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
19378
- * `@camstack/agent` on agents) as reported by its `registerNode` manifest —
19379
- * version visibility for the Server management surface. Nullable: offline
19380
- * rows and pre-phase-2 nodes report none.
19476
+ * The node's runtime-updatable ROOT package (`@camstack/server` the single
19477
+ * root package for every node role) as reported by its `registerNode`
19478
+ * manifest — version visibility for the Server management surface. Nullable:
19479
+ * offline rows and nodes that never reported one.
19381
19480
  */
19382
19481
  var TopologyRootPackageSchema = object({
19383
19482
  name: string(),
@@ -19765,17 +19864,28 @@ var PlatformScoreSchema = object({
19765
19864
  format: _enum([
19766
19865
  "onnx",
19767
19866
  "coreml",
19768
- "openvino"
19867
+ "openvino",
19868
+ "tflite"
19769
19869
  ]),
19770
19870
  score: number(),
19771
19871
  reason: string(),
19772
19872
  available: boolean()
19773
19873
  });
19874
+ var InferenceDeviceDescriptorSchema = object({
19875
+ key: string(),
19876
+ backend: string(),
19877
+ device: string(),
19878
+ format: ModelFormatSchema,
19879
+ runtime: literal("python"),
19880
+ score: number(),
19881
+ available: boolean()
19882
+ });
19774
19883
  var PlatformCapabilitiesSchema = object({
19775
19884
  hardware: HardwareInfoSchema,
19776
19885
  scores: array(PlatformScoreSchema).readonly(),
19777
19886
  bestScore: PlatformScoreSchema,
19778
- pythonPath: string().nullable()
19887
+ pythonPath: string().nullable(),
19888
+ devices: array(InferenceDeviceDescriptorSchema).readonly()
19779
19889
  });
19780
19890
  var ModelRequirementSchema = object({
19781
19891
  modelId: string(),
@@ -20654,12 +20764,6 @@ Object.freeze({
20654
20764
  addonId: null,
20655
20765
  access: "delete"
20656
20766
  },
20657
- "addons.updateFrameworkPackage": {
20658
- capName: "addons",
20659
- capScope: "system",
20660
- addonId: null,
20661
- access: "create"
20662
- },
20663
20767
  "addons.updatePackage": {
20664
20768
  capName: "addons",
20665
20769
  capScope: "system",
@@ -23432,12 +23536,6 @@ Object.freeze({
23432
23536
  addonId: null,
23433
23537
  access: "view"
23434
23538
  },
23435
- "pipelineExecutor.reprobeEngine": {
23436
- capName: "pipeline-executor",
23437
- capScope: "system",
23438
- addonId: null,
23439
- access: "create"
23440
- },
23441
23539
  "pipelineExecutor.runAudioTest": {
23442
23540
  capName: "pipeline-executor",
23443
23541
  capScope: "system",
@@ -23588,6 +23686,12 @@ Object.freeze({
23588
23686
  addonId: null,
23589
23687
  access: "view"
23590
23688
  },
23689
+ "pipelineOrchestrator.getNodeInferenceDevices": {
23690
+ capName: "pipeline-orchestrator",
23691
+ capScope: "system",
23692
+ addonId: null,
23693
+ access: "view"
23694
+ },
23591
23695
  "pipelineOrchestrator.getPipelineAssignment": {
23592
23696
  capName: "pipeline-orchestrator",
23593
23697
  capScope: "system",
@@ -23600,6 +23704,12 @@ Object.freeze({
23600
23704
  addonId: null,
23601
23705
  access: "view"
23602
23706
  },
23707
+ "pipelineOrchestrator.getPipelineDevicePin": {
23708
+ capName: "pipeline-orchestrator",
23709
+ capScope: "system",
23710
+ addonId: null,
23711
+ access: "view"
23712
+ },
23603
23713
  "pipelineOrchestrator.listAgentSettings": {
23604
23714
  capName: "pipeline-orchestrator",
23605
23715
  capScope: "system",
@@ -23642,19 +23752,19 @@ Object.freeze({
23642
23752
  addonId: null,
23643
23753
  access: "create"
23644
23754
  },
23645
- "pipelineOrchestrator.setAgentAddonDefaults": {
23755
+ "pipelineOrchestrator.setAgentCapabilities": {
23646
23756
  capName: "pipeline-orchestrator",
23647
23757
  capScope: "system",
23648
23758
  addonId: null,
23649
23759
  access: "create"
23650
23760
  },
23651
- "pipelineOrchestrator.setAgentCapabilities": {
23761
+ "pipelineOrchestrator.setAgentDetectWeight": {
23652
23762
  capName: "pipeline-orchestrator",
23653
23763
  capScope: "system",
23654
23764
  addonId: null,
23655
23765
  access: "create"
23656
23766
  },
23657
- "pipelineOrchestrator.setAgentDetectWeight": {
23767
+ "pipelineOrchestrator.setAgentInferenceDevices": {
23658
23768
  capName: "pipeline-orchestrator",
23659
23769
  capScope: "system",
23660
23770
  addonId: null,
@@ -23696,6 +23806,12 @@ Object.freeze({
23696
23806
  addonId: null,
23697
23807
  access: "create"
23698
23808
  },
23809
+ "pipelineOrchestrator.setPipelineDevicePin": {
23810
+ capName: "pipeline-orchestrator",
23811
+ capScope: "system",
23812
+ addonId: null,
23813
+ access: "create"
23814
+ },
23699
23815
  "pipelineOrchestrator.unassignAudio": {
23700
23816
  capName: "pipeline-orchestrator",
23701
23817
  capScope: "system",
@@ -25248,32 +25364,6 @@ Object.freeze({
25248
25364
  "network-access": "ingress",
25249
25365
  "smtp-provider": "email"
25250
25366
  });
25251
- var frameworkSwapPackageSchema = object({
25252
- name: string(),
25253
- stagedPath: string(),
25254
- backupPath: string(),
25255
- toVersion: string(),
25256
- fromVersion: string().nullable()
25257
- });
25258
- object({
25259
- jobId: string(),
25260
- taskId: string(),
25261
- packages: array(frameworkSwapPackageSchema),
25262
- requestedAtMs: number(),
25263
- schemaVersion: literal(1)
25264
- });
25265
- object({
25266
- jobId: string(),
25267
- taskId: string(),
25268
- backups: array(object({
25269
- name: string(),
25270
- backupPath: string(),
25271
- livePath: string()
25272
- })),
25273
- appliedAtMs: number(),
25274
- bootAttempts: number(),
25275
- schemaVersion: literal(1)
25276
- });
25277
25367
  //#endregion
25278
25368
  //#region ../../node_modules/xtend/immutable.js
25279
25369
  var require_immutable = /* @__PURE__ */ __commonJSMin(((exports, module) => {
@@ -7108,6 +7108,17 @@ var ModelCatalogEntrySchema = object({
7108
7108
  "imagenet",
7109
7109
  "none"
7110
7110
  ]).optional(),
7111
+ /**
7112
+ * The model already applies softmax IN-GRAPH — its raw output is a
7113
+ * probability distribution, not logits. When set, the `softmax`
7114
+ * postprocessor must NOT re-apply softmax: re-softmaxing an already-normalised
7115
+ * probability vector collapses it toward uniform (top-1 score craters far
7116
+ * below its true value, making every confidence gate meaningless). Absent ⇒
7117
+ * the output is raw logits and the postprocessor applies softmax (the normal
7118
+ * case). Set on the Google AIY Birds `bird-classifier` (softmax baked into the
7119
+ * TF graph). Threaded to the Python pool via `PoolModelConfig.outputProbabilities`.
7120
+ */
7121
+ outputProbabilities: boolean().optional(),
7111
7122
  preprocessMode: _enum(["letterbox", "resize"]).optional(),
7112
7123
  /**
7113
7124
  * Per-MODEL postprocessor override. Absent ⇒ the step's own
@@ -11121,10 +11132,7 @@ var ConfigUISchemaNullableBridge = custom();
11121
11132
  var InferenceCapabilitiesBridge = custom();
11122
11133
  var ModelAvailabilityListBridge = custom();
11123
11134
  var PipelineRunResultBridge = custom();
11124
- method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
11125
- kind: "mutation",
11126
- auth: "admin"
11127
- }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
11135
+ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
11128
11136
  modelId: string(),
11129
11137
  settings: record(string(), unknown()).readonly()
11130
11138
  }))), method(object({ steps: record(string(), object({
@@ -11184,13 +11192,33 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
11184
11192
  * (inputClasses ≠ null) are skipped and served per-track via
11185
11193
  * pipelineRunner.runDetailSubtree (two-plane design).
11186
11194
  */
11187
- plane: _enum(["full", "frame"]).optional()
11195
+ plane: _enum(["full", "frame"]).optional(),
11196
+ /**
11197
+ * Inference-device selector (Phase 2 multi-device). Format
11198
+ * `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`).
11199
+ * Omitted ⇒ the runner's default device (current single-engine
11200
+ * behaviour). Selects WHICH device pool of the node runs the call.
11201
+ */
11202
+ deviceKey: string().optional()
11188
11203
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
11189
11204
  engine: PipelineEngineChoiceSchema.optional(),
11190
11205
  steps: array(PipelineStepInputSchema).min(1),
11191
11206
  frames: array(FrameInputSchema).min(1).max(255),
11192
11207
  deviceId: number().optional(),
11193
- sessionId: string().optional()
11208
+ sessionId: string().optional(),
11209
+ /**
11210
+ * Pure-inference benchmark hint. A NONZERO uint32 pins every frame in
11211
+ * the batch to the Python pool's bench preprocess cache
11212
+ * (`_bench_frame_id`) so a REPEATED benchmark frame is decoded +
11213
+ * preprocessed ONCE and every later inference is a pure-inference cache
11214
+ * hit — the sustained-throughput run measures inference, not
11215
+ * decode+preprocess+infer. Omitted/0 for live frames (all different →
11216
+ * full preprocess every call, correct). Fresh per sustained run;
11217
+ * released via `uncacheFrame`.
11218
+ */
11219
+ frameId: number().int().nonnegative().optional(),
11220
+ /** Inference-device selector (Phase 2 multi-device); see runPipeline. */
11221
+ deviceKey: string().optional()
11194
11222
  }), object({ results: array(PipelineRunResultBridge).readonly() }), { kind: "mutation" }), method(object({
11195
11223
  data: _instanceof(Uint8Array),
11196
11224
  width: number().int().positive(),
@@ -11222,8 +11250,18 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
11222
11250
  * - `runtime` — main camera-serving engine (no idle TTL).
11223
11251
  * - `warm-override` — benchmark/test override held in the warm
11224
11252
  * cache; auto-disposed after the idle TTL.
11253
+ * - `device-pool` — a concurrent per-device pool (Phase 2
11254
+ * multi-device, keyed by `deviceKey`) resolved
11255
+ * via `resolveDeviceFactory`. Runs alongside the
11256
+ * `runtime` engine on a DIFFERENT accelerator
11257
+ * (NPU / iGPU / Coral) — this is how the
11258
+ * Engines tab shows all pools running at once.
11225
11259
  */
11226
- kind: _enum(["runtime", "warm-override"]),
11260
+ kind: _enum([
11261
+ "runtime",
11262
+ "warm-override",
11263
+ "device-pool"
11264
+ ]),
11227
11265
  /** Native pid of the underlying Python pool (null when no pool). */
11228
11266
  poolPid: number().nullable(),
11229
11267
  /** ms since this factory was last used (null when not warm-tracked). */
@@ -11565,7 +11603,14 @@ var RunnerCameraConfigSchema = object({
11565
11603
  * camera's detect node differs from its source-owner (P2d, gated by the
11566
11604
  * `remoteSourcingNodes` rollout setting).
11567
11605
  */
11568
- frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
11606
+ frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" }),
11607
+ /**
11608
+ * Inference-device selector for this camera's sessions (Phase 2 multi-device).
11609
+ * Format `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`);
11610
+ * omitted ⇒ the runner's default device. The engine itself stays node-local —
11611
+ * this only selects WHICH device pool of that node runs the session.
11612
+ */
11613
+ deviceKey: string().optional()
11569
11614
  });
11570
11615
  motionFpsField.min, motionFpsField.max, motionFpsField.step, motionFpsField.default, detectionFpsField.min, detectionFpsField.max, detectionFpsField.step, detectionFpsField.default, motionCooldownMsField.min, motionCooldownMsField.max, motionCooldownMsField.step, motionCooldownMsField.default, occupancyRecheckSecField.min, occupancyRecheckSecField.max, occupancyRecheckSecField.step, occupancyRecheckSecField.default, occupancyRecheckFramesField.min, occupancyRecheckFramesField.max, occupancyRecheckFramesField.step, occupancyRecheckFramesField.default;
11571
11616
  /**
@@ -11586,6 +11631,19 @@ var RunnerLocalLoadSchema = object({
11586
11631
  avgInferenceTimeMs: number(),
11587
11632
  /** Total queue depth across motion + detection queues. */
11588
11633
  queueDepthTotal: number(),
11634
+ /**
11635
+ * Per-inference-device live load (multi-device C4). One entry per deviceKey
11636
+ * this runner currently has attached cameras on, so the orchestrator's second
11637
+ * `balance()` pass (over a node's devices) weights on real per-pool session
11638
+ * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
11639
+ * per device is 0 until the pool backlog gets a public accessor (follow-up).
11640
+ */
11641
+ devices: array(object({
11642
+ deviceKey: string(),
11643
+ backend: string(),
11644
+ attachedCameras: number(),
11645
+ queueDepthTotal: number()
11646
+ })).default([]),
11589
11647
  /** Hardware capability flags reported by this node. */
11590
11648
  hardware: object({
11591
11649
  hasGpu: boolean(),
@@ -13061,6 +13119,8 @@ method(_void(), _void(), { kind: "mutation" }), method(_void(), _void(), { kind:
13061
13119
  kind: "mutation",
13062
13120
  auth: "admin"
13063
13121
  });
13122
+ DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
13123
+ new Set(Object.values(DeviceType));
13064
13124
  /**
13065
13125
  * `addon-pages` — system-scoped singleton aggregator cap. Public-facing
13066
13126
  * surface that admin-ui consumes through `useAddonPagesListPages()`.
@@ -16798,13 +16858,11 @@ var PipelineTemplateSchema = object({
16798
16858
  createdAt: string(),
16799
16859
  updatedAt: string()
16800
16860
  });
16801
- var AgentAddonConfigSchema = object({
16802
- enabled: boolean(),
16861
+ var DeviceStepConfigSchema = object({
16803
16862
  modelId: string().optional(),
16804
- settings: record(string(), unknown()).readonly()
16863
+ settings: record(string(), unknown()).optional()
16805
16864
  });
16806
16865
  var AgentPipelineSettingsSchema = object({
16807
- addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
16808
16866
  maxCameras: number().int().nonnegative().nullable().default(null),
16809
16867
  /** Per-node detection weight (relative share for the quota balancer). */
16810
16868
  detectWeight: number().positive().optional(),
@@ -16828,7 +16886,22 @@ var AgentPipelineSettingsSchema = object({
16828
16886
  * it already uses to reach the hub). Set this only when the auto-detected
16829
16887
  * address is wrong (multi-homed host, NAT, custom interface).
16830
16888
  */
16831
- reachableHost: string().optional()
16889
+ reachableHost: string().optional(),
16890
+ /**
16891
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
16892
+ * weight, steps}. Absent / all-disabled ⇒ the node's single default
16893
+ * accelerator (safe default); two+ enabled ⇒ the dispatcher balances
16894
+ * detection sessions across them so they run CONCURRENTLY. `steps` is the
16895
+ * per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
16896
+ * the default model/settings for every camera landing on that accelerator;
16897
+ * a stepId absent ⇒ the step uses that device's format default.
16898
+ */
16899
+ inferenceDevices: record(string(), object({
16900
+ enabled: boolean(),
16901
+ weight: number().positive().optional(),
16902
+ maxSessions: number().int().positive().optional(),
16903
+ steps: record(string(), DeviceStepConfigSchema).optional()
16904
+ })).optional()
16832
16905
  });
16833
16906
  var CameraPipelineForAgentSchema = object({
16834
16907
  steps: array(PipelineStepInputSchema).readonly(),
@@ -16838,14 +16911,13 @@ var CameraPipelineForAgentSchema = object({
16838
16911
  }).nullable()
16839
16912
  });
16840
16913
  var CameraStepOverridePatchSchema = object({
16841
- enabled: boolean().optional(),
16842
16914
  modelId: string().optional(),
16843
16915
  settings: record(string(), unknown()).readonly().optional()
16844
16916
  });
16845
16917
  var CameraPipelineSettingsSchema = object({
16846
16918
  pinnedAgentNodeId: string().optional(),
16847
16919
  stepToggles: record(string(), boolean()).optional(),
16848
- stepOverridesByAgent: record(string(), record(string(), CameraStepOverridePatchSchema)).optional(),
16920
+ stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
16849
16921
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
16850
16922
  });
16851
16923
  /**
@@ -17059,6 +17131,44 @@ var CameraStatusSchema = object({
17059
17131
  /** Unix timestamp (ms) when this snapshot was composed server-side. */
17060
17132
  fetchedAt: number()
17061
17133
  });
17134
+ var NodeInferenceDeviceSchema = object({
17135
+ /** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
17136
+ key: string(),
17137
+ backend: string(),
17138
+ device: string(),
17139
+ format: _enum(MODEL_FORMATS),
17140
+ /** Whether the node's live probe reports the device as usable right now. */
17141
+ available: boolean(),
17142
+ /**
17143
+ * Whether this device participates in dispatch. AUTO default (spec C2):
17144
+ * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
17145
+ * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
17146
+ * not a balanced target). An explicit stored value always wins; a stored-only
17147
+ * (unavailable) key keeps its stored value.
17148
+ */
17149
+ enabled: boolean(),
17150
+ /** Relative balancer weight for the enabled device (default 1). */
17151
+ weight: number(),
17152
+ /** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
17153
+ maxSessions: number().nullable(),
17154
+ /** Object-detection model the executor defaults to for this deviceKey. */
17155
+ defaultModelId: string(),
17156
+ /**
17157
+ * Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
17158
+ * `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
17159
+ * Absent/empty ⇒ no base (every step uses its device format default). The
17160
+ * UI cross-references `pipelineExecutor.getSchema` for the models actually
17161
+ * available per format; this is the stored selection that becomes the
17162
+ * default for EVERY camera landing on this accelerator.
17163
+ */
17164
+ steps: record(string(), DeviceStepConfigSchema).optional()
17165
+ });
17166
+ var NodeInferenceDevicesSchema = object({
17167
+ nodeId: string(),
17168
+ /** False when the node's platform-probe was unreachable (no live device set). */
17169
+ reachable: boolean(),
17170
+ devices: array(NodeInferenceDeviceSchema).readonly()
17171
+ });
17062
17172
  method(object({
17063
17173
  deviceId: number(),
17064
17174
  agentNodeId: string()
@@ -17068,7 +17178,13 @@ method(object({
17068
17178
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
17069
17179
  kind: "mutation",
17070
17180
  auth: "admin"
17071
- }), method(_void(), object({ migrated: number() }), {
17181
+ }), method(object({
17182
+ deviceId: number(),
17183
+ deviceKey: string()
17184
+ }), object({ success: literal(true) }), {
17185
+ kind: "mutation",
17186
+ auth: "admin"
17187
+ }), method(object({ deviceId: number() }), object({ deviceKey: string().nullable() })), method(_void(), object({ migrated: number() }), {
17072
17188
  kind: "mutation",
17073
17189
  auth: "admin"
17074
17190
  }), method(_void(), array(PipelineAssignmentSchema).readonly()), method(object({ deviceId: number() }), PipelineAssignmentSchema.nullable()), method(_void(), array(AgentLoadSummarySchema).readonly()), method(_void(), GlobalMetricsSchema), method(object({ deviceId: number() }), CameraMetricsSchema.nullable()), method(object({ nodeId: string() }), CapabilityBindingsSchema), method(object({
@@ -17102,13 +17218,7 @@ method(object({
17102
17218
  }))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
17103
17219
  nodeId: string(),
17104
17220
  settings: AgentPipelineSettingsSchema
17105
- })).readonly()), method(object({
17106
- agentNodeId: string(),
17107
- defaults: record(string(), AgentAddonConfigSchema)
17108
- }), object({ success: literal(true) }), {
17109
- kind: "mutation",
17110
- auth: "admin"
17111
- }), method(object({ agentNodeId: string() }), object({
17221
+ })).readonly()), method(object({ agentNodeId: string() }), object({
17112
17222
  success: boolean(),
17113
17223
  removed: boolean()
17114
17224
  }), {
@@ -17140,7 +17250,18 @@ method(object({
17140
17250
  }), object({ success: literal(true) }), {
17141
17251
  kind: "mutation",
17142
17252
  auth: "admin"
17143
- }), method(object({ agentNodeId: string() }), object({
17253
+ }), method(object({
17254
+ agentNodeId: string(),
17255
+ inferenceDevices: record(string(), object({
17256
+ enabled: boolean(),
17257
+ weight: number().positive().optional(),
17258
+ maxSessions: number().int().positive().optional(),
17259
+ steps: record(string(), DeviceStepConfigSchema).optional()
17260
+ }))
17261
+ }), object({ success: literal(true) }), {
17262
+ kind: "mutation",
17263
+ auth: "admin"
17264
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
17144
17265
  success: literal(true),
17145
17266
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
17146
17267
  effectiveModelId: string().nullable(),
@@ -17156,9 +17277,10 @@ method(object({
17156
17277
  }), object({ success: literal(true) }), {
17157
17278
  kind: "mutation",
17158
17279
  auth: "admin"
17159
- }), method(object({ deviceId: number() }), record(string(), record(string(), CameraStepOverridePatchSchema)).nullable()), method(object({
17280
+ }), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
17160
17281
  deviceId: number(),
17161
17282
  agentNodeId: string(),
17283
+ deviceKey: string(),
17162
17284
  addonId: string(),
17163
17285
  patch: CameraStepOverridePatchSchema.nullable()
17164
17286
  }), object({ success: literal(true) }), {
@@ -17195,14 +17317,13 @@ method(object({
17195
17317
  });
17196
17318
  /**
17197
17319
  * server-management — per-NODE singleton capability for a node's ROOT
17198
- * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
17199
- * agents).
17320
+ * package lifecycle (runtime-updatable node packages).
17200
17321
  *
17201
- * Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
17202
- * on agents) carries the whole software stack in its npm dep tree, so ONE
17203
- * version describes the node. Updates install into
17204
- * `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
17205
- * starter (probation boot + auto-rollback to N-1).
17322
+ * Every node role runs the SAME root package (`@camstack/server`), which
17323
+ * carries the whole software stack in its npm dep tree, so ONE version
17324
+ * describes the node. Updates stage into `<dataDir>/server-root/` and apply
17325
+ * on restart via the baked starter (single-copy in-place swap — no probation,
17326
+ * no auto-rollback).
17206
17327
  *
17207
17328
  * Providers:
17208
17329
  * - HUB: `ServerUpdateService` behind the `server-provided` mount
@@ -17310,7 +17431,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
17310
17431
  /** Explicit target version; omitted = latest from the registry. */
17311
17432
  version: string().optional() }), ServerUpdateActionResultSchema, {
17312
17433
  kind: "mutation",
17313
- auth: "admin"
17434
+ auth: "admin",
17435
+ timeoutMs: 16 * 6e4
17314
17436
  }), method(_void(), ServerUpdateActionResultSchema, {
17315
17437
  kind: "mutation",
17316
17438
  auth: "admin"
@@ -18354,22 +18476,6 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
18354
18476
  var RestartAddonResultSchema = unknown();
18355
18477
  var InstallPackageResultSchema = unknown();
18356
18478
  var ReloadPackagesResultSchema = unknown();
18357
- /**
18358
- * Result of `updateFrameworkPackage`. The cap method returns BEFORE the
18359
- * server restarts so the admin UI can react to the `restartingAt`
18360
- * timestamp (shows reconnect overlay). The transition from
18361
- * `fromVersion` to `toVersion` will be confirmed by a subsequent
18362
- * `system.restart-completed` event after the new process boots.
18363
- *
18364
- * Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
18365
- */
18366
- var UpdateFrameworkPackageResultSchema = object({
18367
- packageName: string(),
18368
- fromVersion: string(),
18369
- toVersion: string(),
18370
- /** Ms-epoch the server scheduled its self-restart. */
18371
- restartingAt: number()
18372
- });
18373
18479
  var BulkUpdateItemStatusSchema = _enum([
18374
18480
  "queued",
18375
18481
  "updating",
@@ -18497,13 +18603,6 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
18497
18603
  }), object({ success: literal(true) }), {
18498
18604
  kind: "mutation",
18499
18605
  auth: "admin"
18500
- }), method(object({
18501
- packageName: string().min(1),
18502
- version: string().optional(),
18503
- deferRestart: boolean().optional()
18504
- }), UpdateFrameworkPackageResultSchema, {
18505
- kind: "mutation",
18506
- auth: "admin"
18507
18606
  }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
18508
18607
  kind: "mutation",
18509
18608
  auth: "admin"
@@ -19369,10 +19468,10 @@ var TopologyCategorySchema = object({
19369
19468
  addons: array(TopologyCategoryAddonSchema).readonly()
19370
19469
  });
19371
19470
  /**
19372
- * The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
19373
- * `@camstack/agent` on agents) as reported by its `registerNode` manifest —
19374
- * version visibility for the Server management surface. Nullable: offline
19375
- * rows and pre-phase-2 nodes report none.
19471
+ * The node's runtime-updatable ROOT package (`@camstack/server` the single
19472
+ * root package for every node role) as reported by its `registerNode`
19473
+ * manifest — version visibility for the Server management surface. Nullable:
19474
+ * offline rows and nodes that never reported one.
19376
19475
  */
19377
19476
  var TopologyRootPackageSchema = object({
19378
19477
  name: string(),
@@ -19760,17 +19859,28 @@ var PlatformScoreSchema = object({
19760
19859
  format: _enum([
19761
19860
  "onnx",
19762
19861
  "coreml",
19763
- "openvino"
19862
+ "openvino",
19863
+ "tflite"
19764
19864
  ]),
19765
19865
  score: number(),
19766
19866
  reason: string(),
19767
19867
  available: boolean()
19768
19868
  });
19869
+ var InferenceDeviceDescriptorSchema = object({
19870
+ key: string(),
19871
+ backend: string(),
19872
+ device: string(),
19873
+ format: ModelFormatSchema,
19874
+ runtime: literal("python"),
19875
+ score: number(),
19876
+ available: boolean()
19877
+ });
19769
19878
  var PlatformCapabilitiesSchema = object({
19770
19879
  hardware: HardwareInfoSchema,
19771
19880
  scores: array(PlatformScoreSchema).readonly(),
19772
19881
  bestScore: PlatformScoreSchema,
19773
- pythonPath: string().nullable()
19882
+ pythonPath: string().nullable(),
19883
+ devices: array(InferenceDeviceDescriptorSchema).readonly()
19774
19884
  });
19775
19885
  var ModelRequirementSchema = object({
19776
19886
  modelId: string(),
@@ -20649,12 +20759,6 @@ Object.freeze({
20649
20759
  addonId: null,
20650
20760
  access: "delete"
20651
20761
  },
20652
- "addons.updateFrameworkPackage": {
20653
- capName: "addons",
20654
- capScope: "system",
20655
- addonId: null,
20656
- access: "create"
20657
- },
20658
20762
  "addons.updatePackage": {
20659
20763
  capName: "addons",
20660
20764
  capScope: "system",
@@ -23427,12 +23531,6 @@ Object.freeze({
23427
23531
  addonId: null,
23428
23532
  access: "view"
23429
23533
  },
23430
- "pipelineExecutor.reprobeEngine": {
23431
- capName: "pipeline-executor",
23432
- capScope: "system",
23433
- addonId: null,
23434
- access: "create"
23435
- },
23436
23534
  "pipelineExecutor.runAudioTest": {
23437
23535
  capName: "pipeline-executor",
23438
23536
  capScope: "system",
@@ -23583,6 +23681,12 @@ Object.freeze({
23583
23681
  addonId: null,
23584
23682
  access: "view"
23585
23683
  },
23684
+ "pipelineOrchestrator.getNodeInferenceDevices": {
23685
+ capName: "pipeline-orchestrator",
23686
+ capScope: "system",
23687
+ addonId: null,
23688
+ access: "view"
23689
+ },
23586
23690
  "pipelineOrchestrator.getPipelineAssignment": {
23587
23691
  capName: "pipeline-orchestrator",
23588
23692
  capScope: "system",
@@ -23595,6 +23699,12 @@ Object.freeze({
23595
23699
  addonId: null,
23596
23700
  access: "view"
23597
23701
  },
23702
+ "pipelineOrchestrator.getPipelineDevicePin": {
23703
+ capName: "pipeline-orchestrator",
23704
+ capScope: "system",
23705
+ addonId: null,
23706
+ access: "view"
23707
+ },
23598
23708
  "pipelineOrchestrator.listAgentSettings": {
23599
23709
  capName: "pipeline-orchestrator",
23600
23710
  capScope: "system",
@@ -23637,19 +23747,19 @@ Object.freeze({
23637
23747
  addonId: null,
23638
23748
  access: "create"
23639
23749
  },
23640
- "pipelineOrchestrator.setAgentAddonDefaults": {
23750
+ "pipelineOrchestrator.setAgentCapabilities": {
23641
23751
  capName: "pipeline-orchestrator",
23642
23752
  capScope: "system",
23643
23753
  addonId: null,
23644
23754
  access: "create"
23645
23755
  },
23646
- "pipelineOrchestrator.setAgentCapabilities": {
23756
+ "pipelineOrchestrator.setAgentDetectWeight": {
23647
23757
  capName: "pipeline-orchestrator",
23648
23758
  capScope: "system",
23649
23759
  addonId: null,
23650
23760
  access: "create"
23651
23761
  },
23652
- "pipelineOrchestrator.setAgentDetectWeight": {
23762
+ "pipelineOrchestrator.setAgentInferenceDevices": {
23653
23763
  capName: "pipeline-orchestrator",
23654
23764
  capScope: "system",
23655
23765
  addonId: null,
@@ -23691,6 +23801,12 @@ Object.freeze({
23691
23801
  addonId: null,
23692
23802
  access: "create"
23693
23803
  },
23804
+ "pipelineOrchestrator.setPipelineDevicePin": {
23805
+ capName: "pipeline-orchestrator",
23806
+ capScope: "system",
23807
+ addonId: null,
23808
+ access: "create"
23809
+ },
23694
23810
  "pipelineOrchestrator.unassignAudio": {
23695
23811
  capName: "pipeline-orchestrator",
23696
23812
  capScope: "system",
@@ -25243,32 +25359,6 @@ Object.freeze({
25243
25359
  "network-access": "ingress",
25244
25360
  "smtp-provider": "email"
25245
25361
  });
25246
- var frameworkSwapPackageSchema = object({
25247
- name: string(),
25248
- stagedPath: string(),
25249
- backupPath: string(),
25250
- toVersion: string(),
25251
- fromVersion: string().nullable()
25252
- });
25253
- object({
25254
- jobId: string(),
25255
- taskId: string(),
25256
- packages: array(frameworkSwapPackageSchema),
25257
- requestedAtMs: number(),
25258
- schemaVersion: literal(1)
25259
- });
25260
- object({
25261
- jobId: string(),
25262
- taskId: string(),
25263
- backups: array(object({
25264
- name: string(),
25265
- backupPath: string(),
25266
- livePath: string()
25267
- })),
25268
- appliedAtMs: number(),
25269
- bootAttempts: number(),
25270
- schemaVersion: literal(1)
25271
- });
25272
25362
  //#endregion
25273
25363
  //#region ../../node_modules/xtend/immutable.js
25274
25364
  var require_immutable = /* @__PURE__ */ __commonJSMin(((exports, module) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-mqtt-broker",
3
- "version": "1.1.28",
3
+ "version": "1.2.0",
4
4
  "description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
5
5
  "keywords": [
6
6
  "camstack",