@camstack/addon-mqtt-broker 1.1.28 → 1.2.1

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). */
@@ -11330,7 +11368,21 @@ var NativeCropResultSchema = object({
11330
11368
  /** Packed rgb (24-bit) pixels of the crop. */
11331
11369
  bytes: _instanceof(Uint8Array),
11332
11370
  width: number().int().positive(),
11333
- height: number().int().positive()
11371
+ height: number().int().positive(),
11372
+ /**
11373
+ * Which source served this crop, so a quality-sensitive consumer (the native
11374
+ * `keyFrame`) can reject a degraded fallback:
11375
+ * - `native` — cut from the decode worker's retained NATIVE surface (the
11376
+ * quality path).
11377
+ * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
11378
+ * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
11379
+ * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
11380
+ *
11381
+ * OPTIONAL: a pre-tier runner (version skew) omits it — an ABSENT `tier` MUST be
11382
+ * treated as `native` (accepted) by every consumer so mixed-version clusters
11383
+ * keep the pre-tier behaviour. An ROI miss returns `null` (no tier at all).
11384
+ */
11385
+ tier: _enum(["native", "ram-fullframe"]).optional()
11334
11386
  });
11335
11387
  /** Parent detection context passed to `runDetailSubtree` — the crop's
11336
11388
  * originating detection, in FRAME-space coordinates. Reuses
@@ -11570,7 +11622,14 @@ var RunnerCameraConfigSchema = object({
11570
11622
  * camera's detect node differs from its source-owner (P2d, gated by the
11571
11623
  * `remoteSourcingNodes` rollout setting).
11572
11624
  */
11573
- frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
11625
+ frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" }),
11626
+ /**
11627
+ * Inference-device selector for this camera's sessions (Phase 2 multi-device).
11628
+ * Format `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`);
11629
+ * omitted ⇒ the runner's default device. The engine itself stays node-local —
11630
+ * this only selects WHICH device pool of that node runs the session.
11631
+ */
11632
+ deviceKey: string().optional()
11574
11633
  });
11575
11634
  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
11635
  /**
@@ -11591,6 +11650,19 @@ var RunnerLocalLoadSchema = object({
11591
11650
  avgInferenceTimeMs: number(),
11592
11651
  /** Total queue depth across motion + detection queues. */
11593
11652
  queueDepthTotal: number(),
11653
+ /**
11654
+ * Per-inference-device live load (multi-device C4). One entry per deviceKey
11655
+ * this runner currently has attached cameras on, so the orchestrator's second
11656
+ * `balance()` pass (over a node's devices) weights on real per-pool session
11657
+ * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
11658
+ * per device is 0 until the pool backlog gets a public accessor (follow-up).
11659
+ */
11660
+ devices: array(object({
11661
+ deviceKey: string(),
11662
+ backend: string(),
11663
+ attachedCameras: number(),
11664
+ queueDepthTotal: number()
11665
+ })).default([]),
11594
11666
  /** Hardware capability flags reported by this node. */
11595
11667
  hardware: object({
11596
11668
  hasGpu: boolean(),
@@ -13066,6 +13138,8 @@ method(_void(), _void(), { kind: "mutation" }), method(_void(), _void(), { kind:
13066
13138
  kind: "mutation",
13067
13139
  auth: "admin"
13068
13140
  });
13141
+ 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;
13142
+ new Set(Object.values(DeviceType));
13069
13143
  /**
13070
13144
  * `addon-pages` — system-scoped singleton aggregator cap. Public-facing
13071
13145
  * surface that admin-ui consumes through `useAddonPagesListPages()`.
@@ -14688,7 +14762,8 @@ var LinkedDeviceSchema = object({
14688
14762
  deviceId: number(),
14689
14763
  name: string(),
14690
14764
  location: string().nullable(),
14691
- features: array(string())
14765
+ features: array(string()),
14766
+ producesTrackedEvents: boolean().optional()
14692
14767
  });
14693
14768
  var SavedDeviceRowSchema = object({
14694
14769
  /** Numeric id reserved at allocateDeviceId time. */
@@ -16337,6 +16412,7 @@ var TrackSchema = object({
16337
16412
  deviceId: number(),
16338
16413
  className: string(),
16339
16414
  label: string().optional(),
16415
+ producingDeviceName: string().optional(),
16340
16416
  /** Track provenance. Absent ⇒ `pipeline` (legacy rows). */
16341
16417
  source: TrackSourceSchema.optional(),
16342
16418
  firstSeen: number(),
@@ -16474,7 +16550,8 @@ var MediaFileKindEnum = _enum([
16474
16550
  "fullFrameBoxed",
16475
16551
  "faceCrop",
16476
16552
  "plateCrop",
16477
- "keyFrame"
16553
+ "keyFrame",
16554
+ "keyFrameSmall"
16478
16555
  ]);
16479
16556
  var MediaFileSchema = object({
16480
16557
  key: string(),
@@ -16803,13 +16880,11 @@ var PipelineTemplateSchema = object({
16803
16880
  createdAt: string(),
16804
16881
  updatedAt: string()
16805
16882
  });
16806
- var AgentAddonConfigSchema = object({
16807
- enabled: boolean(),
16883
+ var DeviceStepConfigSchema = object({
16808
16884
  modelId: string().optional(),
16809
- settings: record(string(), unknown()).readonly()
16885
+ settings: record(string(), unknown()).optional()
16810
16886
  });
16811
16887
  var AgentPipelineSettingsSchema = object({
16812
- addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
16813
16888
  maxCameras: number().int().nonnegative().nullable().default(null),
16814
16889
  /** Per-node detection weight (relative share for the quota balancer). */
16815
16890
  detectWeight: number().positive().optional(),
@@ -16833,7 +16908,22 @@ var AgentPipelineSettingsSchema = object({
16833
16908
  * it already uses to reach the hub). Set this only when the auto-detected
16834
16909
  * address is wrong (multi-homed host, NAT, custom interface).
16835
16910
  */
16836
- reachableHost: string().optional()
16911
+ reachableHost: string().optional(),
16912
+ /**
16913
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
16914
+ * weight, steps}. Absent / all-disabled ⇒ the node's single default
16915
+ * accelerator (safe default); two+ enabled ⇒ the dispatcher balances
16916
+ * detection sessions across them so they run CONCURRENTLY. `steps` is the
16917
+ * per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
16918
+ * the default model/settings for every camera landing on that accelerator;
16919
+ * a stepId absent ⇒ the step uses that device's format default.
16920
+ */
16921
+ inferenceDevices: record(string(), object({
16922
+ enabled: boolean(),
16923
+ weight: number().positive().optional(),
16924
+ maxSessions: number().int().positive().optional(),
16925
+ steps: record(string(), DeviceStepConfigSchema).optional()
16926
+ })).optional()
16837
16927
  });
16838
16928
  var CameraPipelineForAgentSchema = object({
16839
16929
  steps: array(PipelineStepInputSchema).readonly(),
@@ -16843,14 +16933,13 @@ var CameraPipelineForAgentSchema = object({
16843
16933
  }).nullable()
16844
16934
  });
16845
16935
  var CameraStepOverridePatchSchema = object({
16846
- enabled: boolean().optional(),
16847
16936
  modelId: string().optional(),
16848
16937
  settings: record(string(), unknown()).readonly().optional()
16849
16938
  });
16850
16939
  var CameraPipelineSettingsSchema = object({
16851
16940
  pinnedAgentNodeId: string().optional(),
16852
16941
  stepToggles: record(string(), boolean()).optional(),
16853
- stepOverridesByAgent: record(string(), record(string(), CameraStepOverridePatchSchema)).optional(),
16942
+ stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
16854
16943
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
16855
16944
  });
16856
16945
  /**
@@ -17064,6 +17153,44 @@ var CameraStatusSchema = object({
17064
17153
  /** Unix timestamp (ms) when this snapshot was composed server-side. */
17065
17154
  fetchedAt: number()
17066
17155
  });
17156
+ var NodeInferenceDeviceSchema = object({
17157
+ /** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
17158
+ key: string(),
17159
+ backend: string(),
17160
+ device: string(),
17161
+ format: _enum(MODEL_FORMATS),
17162
+ /** Whether the node's live probe reports the device as usable right now. */
17163
+ available: boolean(),
17164
+ /**
17165
+ * Whether this device participates in dispatch. AUTO default (spec C2):
17166
+ * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
17167
+ * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
17168
+ * not a balanced target). An explicit stored value always wins; a stored-only
17169
+ * (unavailable) key keeps its stored value.
17170
+ */
17171
+ enabled: boolean(),
17172
+ /** Relative balancer weight for the enabled device (default 1). */
17173
+ weight: number(),
17174
+ /** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
17175
+ maxSessions: number().nullable(),
17176
+ /** Object-detection model the executor defaults to for this deviceKey. */
17177
+ defaultModelId: string(),
17178
+ /**
17179
+ * Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
17180
+ * `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
17181
+ * Absent/empty ⇒ no base (every step uses its device format default). The
17182
+ * UI cross-references `pipelineExecutor.getSchema` for the models actually
17183
+ * available per format; this is the stored selection that becomes the
17184
+ * default for EVERY camera landing on this accelerator.
17185
+ */
17186
+ steps: record(string(), DeviceStepConfigSchema).optional()
17187
+ });
17188
+ var NodeInferenceDevicesSchema = object({
17189
+ nodeId: string(),
17190
+ /** False when the node's platform-probe was unreachable (no live device set). */
17191
+ reachable: boolean(),
17192
+ devices: array(NodeInferenceDeviceSchema).readonly()
17193
+ });
17067
17194
  method(object({
17068
17195
  deviceId: number(),
17069
17196
  agentNodeId: string()
@@ -17073,7 +17200,13 @@ method(object({
17073
17200
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
17074
17201
  kind: "mutation",
17075
17202
  auth: "admin"
17076
- }), method(_void(), object({ migrated: number() }), {
17203
+ }), method(object({
17204
+ deviceId: number(),
17205
+ deviceKey: string()
17206
+ }), object({ success: literal(true) }), {
17207
+ kind: "mutation",
17208
+ auth: "admin"
17209
+ }), method(object({ deviceId: number() }), object({ deviceKey: string().nullable() })), method(_void(), object({ migrated: number() }), {
17077
17210
  kind: "mutation",
17078
17211
  auth: "admin"
17079
17212
  }), 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 +17240,7 @@ method(object({
17107
17240
  }))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
17108
17241
  nodeId: string(),
17109
17242
  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({
17243
+ })).readonly()), method(object({ agentNodeId: string() }), object({
17117
17244
  success: boolean(),
17118
17245
  removed: boolean()
17119
17246
  }), {
@@ -17145,7 +17272,18 @@ method(object({
17145
17272
  }), object({ success: literal(true) }), {
17146
17273
  kind: "mutation",
17147
17274
  auth: "admin"
17148
- }), method(object({ agentNodeId: string() }), object({
17275
+ }), method(object({
17276
+ agentNodeId: string(),
17277
+ inferenceDevices: record(string(), object({
17278
+ enabled: boolean(),
17279
+ weight: number().positive().optional(),
17280
+ maxSessions: number().int().positive().optional(),
17281
+ steps: record(string(), DeviceStepConfigSchema).optional()
17282
+ }))
17283
+ }), object({ success: literal(true) }), {
17284
+ kind: "mutation",
17285
+ auth: "admin"
17286
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
17149
17287
  success: literal(true),
17150
17288
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
17151
17289
  effectiveModelId: string().nullable(),
@@ -17161,9 +17299,10 @@ method(object({
17161
17299
  }), object({ success: literal(true) }), {
17162
17300
  kind: "mutation",
17163
17301
  auth: "admin"
17164
- }), method(object({ deviceId: number() }), record(string(), record(string(), CameraStepOverridePatchSchema)).nullable()), method(object({
17302
+ }), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
17165
17303
  deviceId: number(),
17166
17304
  agentNodeId: string(),
17305
+ deviceKey: string(),
17167
17306
  addonId: string(),
17168
17307
  patch: CameraStepOverridePatchSchema.nullable()
17169
17308
  }), object({ success: literal(true) }), {
@@ -17200,14 +17339,13 @@ method(object({
17200
17339
  });
17201
17340
  /**
17202
17341
  * server-management — per-NODE singleton capability for a node's ROOT
17203
- * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
17204
- * agents).
17342
+ * package lifecycle (runtime-updatable node packages).
17205
17343
  *
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).
17344
+ * Every node role runs the SAME root package (`@camstack/server`), which
17345
+ * carries the whole software stack in its npm dep tree, so ONE version
17346
+ * describes the node. Updates stage into `<dataDir>/server-root/` and apply
17347
+ * on restart via the baked starter (single-copy in-place swap — no probation,
17348
+ * no auto-rollback).
17211
17349
  *
17212
17350
  * Providers:
17213
17351
  * - HUB: `ServerUpdateService` behind the `server-provided` mount
@@ -17315,7 +17453,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
17315
17453
  /** Explicit target version; omitted = latest from the registry. */
17316
17454
  version: string().optional() }), ServerUpdateActionResultSchema, {
17317
17455
  kind: "mutation",
17318
- auth: "admin"
17456
+ auth: "admin",
17457
+ timeoutMs: 16 * 6e4
17319
17458
  }), method(_void(), ServerUpdateActionResultSchema, {
17320
17459
  kind: "mutation",
17321
17460
  auth: "admin"
@@ -18359,22 +18498,6 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
18359
18498
  var RestartAddonResultSchema = unknown();
18360
18499
  var InstallPackageResultSchema = unknown();
18361
18500
  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
18501
  var BulkUpdateItemStatusSchema = _enum([
18379
18502
  "queued",
18380
18503
  "updating",
@@ -18502,13 +18625,6 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
18502
18625
  }), object({ success: literal(true) }), {
18503
18626
  kind: "mutation",
18504
18627
  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
18628
  }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
18513
18629
  kind: "mutation",
18514
18630
  auth: "admin"
@@ -19374,10 +19490,10 @@ var TopologyCategorySchema = object({
19374
19490
  addons: array(TopologyCategoryAddonSchema).readonly()
19375
19491
  });
19376
19492
  /**
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.
19493
+ * The node's runtime-updatable ROOT package (`@camstack/server` the single
19494
+ * root package for every node role) as reported by its `registerNode`
19495
+ * manifest — version visibility for the Server management surface. Nullable:
19496
+ * offline rows and nodes that never reported one.
19381
19497
  */
19382
19498
  var TopologyRootPackageSchema = object({
19383
19499
  name: string(),
@@ -19765,17 +19881,28 @@ var PlatformScoreSchema = object({
19765
19881
  format: _enum([
19766
19882
  "onnx",
19767
19883
  "coreml",
19768
- "openvino"
19884
+ "openvino",
19885
+ "tflite"
19769
19886
  ]),
19770
19887
  score: number(),
19771
19888
  reason: string(),
19772
19889
  available: boolean()
19773
19890
  });
19891
+ var InferenceDeviceDescriptorSchema = object({
19892
+ key: string(),
19893
+ backend: string(),
19894
+ device: string(),
19895
+ format: ModelFormatSchema,
19896
+ runtime: literal("python"),
19897
+ score: number(),
19898
+ available: boolean()
19899
+ });
19774
19900
  var PlatformCapabilitiesSchema = object({
19775
19901
  hardware: HardwareInfoSchema,
19776
19902
  scores: array(PlatformScoreSchema).readonly(),
19777
19903
  bestScore: PlatformScoreSchema,
19778
- pythonPath: string().nullable()
19904
+ pythonPath: string().nullable(),
19905
+ devices: array(InferenceDeviceDescriptorSchema).readonly()
19779
19906
  });
19780
19907
  var ModelRequirementSchema = object({
19781
19908
  modelId: string(),
@@ -20654,12 +20781,6 @@ Object.freeze({
20654
20781
  addonId: null,
20655
20782
  access: "delete"
20656
20783
  },
20657
- "addons.updateFrameworkPackage": {
20658
- capName: "addons",
20659
- capScope: "system",
20660
- addonId: null,
20661
- access: "create"
20662
- },
20663
20784
  "addons.updatePackage": {
20664
20785
  capName: "addons",
20665
20786
  capScope: "system",
@@ -23432,12 +23553,6 @@ Object.freeze({
23432
23553
  addonId: null,
23433
23554
  access: "view"
23434
23555
  },
23435
- "pipelineExecutor.reprobeEngine": {
23436
- capName: "pipeline-executor",
23437
- capScope: "system",
23438
- addonId: null,
23439
- access: "create"
23440
- },
23441
23556
  "pipelineExecutor.runAudioTest": {
23442
23557
  capName: "pipeline-executor",
23443
23558
  capScope: "system",
@@ -23588,6 +23703,12 @@ Object.freeze({
23588
23703
  addonId: null,
23589
23704
  access: "view"
23590
23705
  },
23706
+ "pipelineOrchestrator.getNodeInferenceDevices": {
23707
+ capName: "pipeline-orchestrator",
23708
+ capScope: "system",
23709
+ addonId: null,
23710
+ access: "view"
23711
+ },
23591
23712
  "pipelineOrchestrator.getPipelineAssignment": {
23592
23713
  capName: "pipeline-orchestrator",
23593
23714
  capScope: "system",
@@ -23600,6 +23721,12 @@ Object.freeze({
23600
23721
  addonId: null,
23601
23722
  access: "view"
23602
23723
  },
23724
+ "pipelineOrchestrator.getPipelineDevicePin": {
23725
+ capName: "pipeline-orchestrator",
23726
+ capScope: "system",
23727
+ addonId: null,
23728
+ access: "view"
23729
+ },
23603
23730
  "pipelineOrchestrator.listAgentSettings": {
23604
23731
  capName: "pipeline-orchestrator",
23605
23732
  capScope: "system",
@@ -23642,19 +23769,19 @@ Object.freeze({
23642
23769
  addonId: null,
23643
23770
  access: "create"
23644
23771
  },
23645
- "pipelineOrchestrator.setAgentAddonDefaults": {
23772
+ "pipelineOrchestrator.setAgentCapabilities": {
23646
23773
  capName: "pipeline-orchestrator",
23647
23774
  capScope: "system",
23648
23775
  addonId: null,
23649
23776
  access: "create"
23650
23777
  },
23651
- "pipelineOrchestrator.setAgentCapabilities": {
23778
+ "pipelineOrchestrator.setAgentDetectWeight": {
23652
23779
  capName: "pipeline-orchestrator",
23653
23780
  capScope: "system",
23654
23781
  addonId: null,
23655
23782
  access: "create"
23656
23783
  },
23657
- "pipelineOrchestrator.setAgentDetectWeight": {
23784
+ "pipelineOrchestrator.setAgentInferenceDevices": {
23658
23785
  capName: "pipeline-orchestrator",
23659
23786
  capScope: "system",
23660
23787
  addonId: null,
@@ -23696,6 +23823,12 @@ Object.freeze({
23696
23823
  addonId: null,
23697
23824
  access: "create"
23698
23825
  },
23826
+ "pipelineOrchestrator.setPipelineDevicePin": {
23827
+ capName: "pipeline-orchestrator",
23828
+ capScope: "system",
23829
+ addonId: null,
23830
+ access: "create"
23831
+ },
23699
23832
  "pipelineOrchestrator.unassignAudio": {
23700
23833
  capName: "pipeline-orchestrator",
23701
23834
  capScope: "system",
@@ -25248,32 +25381,6 @@ Object.freeze({
25248
25381
  "network-access": "ingress",
25249
25382
  "smtp-provider": "email"
25250
25383
  });
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
25384
  //#endregion
25278
25385
  //#region ../../node_modules/xtend/immutable.js
25279
25386
  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). */
@@ -11325,7 +11363,21 @@ var NativeCropResultSchema = object({
11325
11363
  /** Packed rgb (24-bit) pixels of the crop. */
11326
11364
  bytes: _instanceof(Uint8Array),
11327
11365
  width: number().int().positive(),
11328
- height: number().int().positive()
11366
+ height: number().int().positive(),
11367
+ /**
11368
+ * Which source served this crop, so a quality-sensitive consumer (the native
11369
+ * `keyFrame`) can reject a degraded fallback:
11370
+ * - `native` — cut from the decode worker's retained NATIVE surface (the
11371
+ * quality path).
11372
+ * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
11373
+ * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
11374
+ * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
11375
+ *
11376
+ * OPTIONAL: a pre-tier runner (version skew) omits it — an ABSENT `tier` MUST be
11377
+ * treated as `native` (accepted) by every consumer so mixed-version clusters
11378
+ * keep the pre-tier behaviour. An ROI miss returns `null` (no tier at all).
11379
+ */
11380
+ tier: _enum(["native", "ram-fullframe"]).optional()
11329
11381
  });
11330
11382
  /** Parent detection context passed to `runDetailSubtree` — the crop's
11331
11383
  * originating detection, in FRAME-space coordinates. Reuses
@@ -11565,7 +11617,14 @@ var RunnerCameraConfigSchema = object({
11565
11617
  * camera's detect node differs from its source-owner (P2d, gated by the
11566
11618
  * `remoteSourcingNodes` rollout setting).
11567
11619
  */
11568
- frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
11620
+ frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" }),
11621
+ /**
11622
+ * Inference-device selector for this camera's sessions (Phase 2 multi-device).
11623
+ * Format `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`);
11624
+ * omitted ⇒ the runner's default device. The engine itself stays node-local —
11625
+ * this only selects WHICH device pool of that node runs the session.
11626
+ */
11627
+ deviceKey: string().optional()
11569
11628
  });
11570
11629
  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
11630
  /**
@@ -11586,6 +11645,19 @@ var RunnerLocalLoadSchema = object({
11586
11645
  avgInferenceTimeMs: number(),
11587
11646
  /** Total queue depth across motion + detection queues. */
11588
11647
  queueDepthTotal: number(),
11648
+ /**
11649
+ * Per-inference-device live load (multi-device C4). One entry per deviceKey
11650
+ * this runner currently has attached cameras on, so the orchestrator's second
11651
+ * `balance()` pass (over a node's devices) weights on real per-pool session
11652
+ * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
11653
+ * per device is 0 until the pool backlog gets a public accessor (follow-up).
11654
+ */
11655
+ devices: array(object({
11656
+ deviceKey: string(),
11657
+ backend: string(),
11658
+ attachedCameras: number(),
11659
+ queueDepthTotal: number()
11660
+ })).default([]),
11589
11661
  /** Hardware capability flags reported by this node. */
11590
11662
  hardware: object({
11591
11663
  hasGpu: boolean(),
@@ -13061,6 +13133,8 @@ method(_void(), _void(), { kind: "mutation" }), method(_void(), _void(), { kind:
13061
13133
  kind: "mutation",
13062
13134
  auth: "admin"
13063
13135
  });
13136
+ 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;
13137
+ new Set(Object.values(DeviceType));
13064
13138
  /**
13065
13139
  * `addon-pages` — system-scoped singleton aggregator cap. Public-facing
13066
13140
  * surface that admin-ui consumes through `useAddonPagesListPages()`.
@@ -14683,7 +14757,8 @@ var LinkedDeviceSchema = object({
14683
14757
  deviceId: number(),
14684
14758
  name: string(),
14685
14759
  location: string().nullable(),
14686
- features: array(string())
14760
+ features: array(string()),
14761
+ producesTrackedEvents: boolean().optional()
14687
14762
  });
14688
14763
  var SavedDeviceRowSchema = object({
14689
14764
  /** Numeric id reserved at allocateDeviceId time. */
@@ -16332,6 +16407,7 @@ var TrackSchema = object({
16332
16407
  deviceId: number(),
16333
16408
  className: string(),
16334
16409
  label: string().optional(),
16410
+ producingDeviceName: string().optional(),
16335
16411
  /** Track provenance. Absent ⇒ `pipeline` (legacy rows). */
16336
16412
  source: TrackSourceSchema.optional(),
16337
16413
  firstSeen: number(),
@@ -16469,7 +16545,8 @@ var MediaFileKindEnum = _enum([
16469
16545
  "fullFrameBoxed",
16470
16546
  "faceCrop",
16471
16547
  "plateCrop",
16472
- "keyFrame"
16548
+ "keyFrame",
16549
+ "keyFrameSmall"
16473
16550
  ]);
16474
16551
  var MediaFileSchema = object({
16475
16552
  key: string(),
@@ -16798,13 +16875,11 @@ var PipelineTemplateSchema = object({
16798
16875
  createdAt: string(),
16799
16876
  updatedAt: string()
16800
16877
  });
16801
- var AgentAddonConfigSchema = object({
16802
- enabled: boolean(),
16878
+ var DeviceStepConfigSchema = object({
16803
16879
  modelId: string().optional(),
16804
- settings: record(string(), unknown()).readonly()
16880
+ settings: record(string(), unknown()).optional()
16805
16881
  });
16806
16882
  var AgentPipelineSettingsSchema = object({
16807
- addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
16808
16883
  maxCameras: number().int().nonnegative().nullable().default(null),
16809
16884
  /** Per-node detection weight (relative share for the quota balancer). */
16810
16885
  detectWeight: number().positive().optional(),
@@ -16828,7 +16903,22 @@ var AgentPipelineSettingsSchema = object({
16828
16903
  * it already uses to reach the hub). Set this only when the auto-detected
16829
16904
  * address is wrong (multi-homed host, NAT, custom interface).
16830
16905
  */
16831
- reachableHost: string().optional()
16906
+ reachableHost: string().optional(),
16907
+ /**
16908
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
16909
+ * weight, steps}. Absent / all-disabled ⇒ the node's single default
16910
+ * accelerator (safe default); two+ enabled ⇒ the dispatcher balances
16911
+ * detection sessions across them so they run CONCURRENTLY. `steps` is the
16912
+ * per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
16913
+ * the default model/settings for every camera landing on that accelerator;
16914
+ * a stepId absent ⇒ the step uses that device's format default.
16915
+ */
16916
+ inferenceDevices: record(string(), object({
16917
+ enabled: boolean(),
16918
+ weight: number().positive().optional(),
16919
+ maxSessions: number().int().positive().optional(),
16920
+ steps: record(string(), DeviceStepConfigSchema).optional()
16921
+ })).optional()
16832
16922
  });
16833
16923
  var CameraPipelineForAgentSchema = object({
16834
16924
  steps: array(PipelineStepInputSchema).readonly(),
@@ -16838,14 +16928,13 @@ var CameraPipelineForAgentSchema = object({
16838
16928
  }).nullable()
16839
16929
  });
16840
16930
  var CameraStepOverridePatchSchema = object({
16841
- enabled: boolean().optional(),
16842
16931
  modelId: string().optional(),
16843
16932
  settings: record(string(), unknown()).readonly().optional()
16844
16933
  });
16845
16934
  var CameraPipelineSettingsSchema = object({
16846
16935
  pinnedAgentNodeId: string().optional(),
16847
16936
  stepToggles: record(string(), boolean()).optional(),
16848
- stepOverridesByAgent: record(string(), record(string(), CameraStepOverridePatchSchema)).optional(),
16937
+ stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
16849
16938
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
16850
16939
  });
16851
16940
  /**
@@ -17059,6 +17148,44 @@ var CameraStatusSchema = object({
17059
17148
  /** Unix timestamp (ms) when this snapshot was composed server-side. */
17060
17149
  fetchedAt: number()
17061
17150
  });
17151
+ var NodeInferenceDeviceSchema = object({
17152
+ /** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
17153
+ key: string(),
17154
+ backend: string(),
17155
+ device: string(),
17156
+ format: _enum(MODEL_FORMATS),
17157
+ /** Whether the node's live probe reports the device as usable right now. */
17158
+ available: boolean(),
17159
+ /**
17160
+ * Whether this device participates in dispatch. AUTO default (spec C2):
17161
+ * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
17162
+ * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
17163
+ * not a balanced target). An explicit stored value always wins; a stored-only
17164
+ * (unavailable) key keeps its stored value.
17165
+ */
17166
+ enabled: boolean(),
17167
+ /** Relative balancer weight for the enabled device (default 1). */
17168
+ weight: number(),
17169
+ /** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
17170
+ maxSessions: number().nullable(),
17171
+ /** Object-detection model the executor defaults to for this deviceKey. */
17172
+ defaultModelId: string(),
17173
+ /**
17174
+ * Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
17175
+ * `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
17176
+ * Absent/empty ⇒ no base (every step uses its device format default). The
17177
+ * UI cross-references `pipelineExecutor.getSchema` for the models actually
17178
+ * available per format; this is the stored selection that becomes the
17179
+ * default for EVERY camera landing on this accelerator.
17180
+ */
17181
+ steps: record(string(), DeviceStepConfigSchema).optional()
17182
+ });
17183
+ var NodeInferenceDevicesSchema = object({
17184
+ nodeId: string(),
17185
+ /** False when the node's platform-probe was unreachable (no live device set). */
17186
+ reachable: boolean(),
17187
+ devices: array(NodeInferenceDeviceSchema).readonly()
17188
+ });
17062
17189
  method(object({
17063
17190
  deviceId: number(),
17064
17191
  agentNodeId: string()
@@ -17068,7 +17195,13 @@ method(object({
17068
17195
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
17069
17196
  kind: "mutation",
17070
17197
  auth: "admin"
17071
- }), method(_void(), object({ migrated: number() }), {
17198
+ }), method(object({
17199
+ deviceId: number(),
17200
+ deviceKey: string()
17201
+ }), object({ success: literal(true) }), {
17202
+ kind: "mutation",
17203
+ auth: "admin"
17204
+ }), method(object({ deviceId: number() }), object({ deviceKey: string().nullable() })), method(_void(), object({ migrated: number() }), {
17072
17205
  kind: "mutation",
17073
17206
  auth: "admin"
17074
17207
  }), 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 +17235,7 @@ method(object({
17102
17235
  }))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
17103
17236
  nodeId: string(),
17104
17237
  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({
17238
+ })).readonly()), method(object({ agentNodeId: string() }), object({
17112
17239
  success: boolean(),
17113
17240
  removed: boolean()
17114
17241
  }), {
@@ -17140,7 +17267,18 @@ method(object({
17140
17267
  }), object({ success: literal(true) }), {
17141
17268
  kind: "mutation",
17142
17269
  auth: "admin"
17143
- }), method(object({ agentNodeId: string() }), object({
17270
+ }), method(object({
17271
+ agentNodeId: string(),
17272
+ inferenceDevices: record(string(), object({
17273
+ enabled: boolean(),
17274
+ weight: number().positive().optional(),
17275
+ maxSessions: number().int().positive().optional(),
17276
+ steps: record(string(), DeviceStepConfigSchema).optional()
17277
+ }))
17278
+ }), object({ success: literal(true) }), {
17279
+ kind: "mutation",
17280
+ auth: "admin"
17281
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
17144
17282
  success: literal(true),
17145
17283
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
17146
17284
  effectiveModelId: string().nullable(),
@@ -17156,9 +17294,10 @@ method(object({
17156
17294
  }), object({ success: literal(true) }), {
17157
17295
  kind: "mutation",
17158
17296
  auth: "admin"
17159
- }), method(object({ deviceId: number() }), record(string(), record(string(), CameraStepOverridePatchSchema)).nullable()), method(object({
17297
+ }), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
17160
17298
  deviceId: number(),
17161
17299
  agentNodeId: string(),
17300
+ deviceKey: string(),
17162
17301
  addonId: string(),
17163
17302
  patch: CameraStepOverridePatchSchema.nullable()
17164
17303
  }), object({ success: literal(true) }), {
@@ -17195,14 +17334,13 @@ method(object({
17195
17334
  });
17196
17335
  /**
17197
17336
  * server-management — per-NODE singleton capability for a node's ROOT
17198
- * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
17199
- * agents).
17337
+ * package lifecycle (runtime-updatable node packages).
17200
17338
  *
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).
17339
+ * Every node role runs the SAME root package (`@camstack/server`), which
17340
+ * carries the whole software stack in its npm dep tree, so ONE version
17341
+ * describes the node. Updates stage into `<dataDir>/server-root/` and apply
17342
+ * on restart via the baked starter (single-copy in-place swap — no probation,
17343
+ * no auto-rollback).
17206
17344
  *
17207
17345
  * Providers:
17208
17346
  * - HUB: `ServerUpdateService` behind the `server-provided` mount
@@ -17310,7 +17448,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
17310
17448
  /** Explicit target version; omitted = latest from the registry. */
17311
17449
  version: string().optional() }), ServerUpdateActionResultSchema, {
17312
17450
  kind: "mutation",
17313
- auth: "admin"
17451
+ auth: "admin",
17452
+ timeoutMs: 16 * 6e4
17314
17453
  }), method(_void(), ServerUpdateActionResultSchema, {
17315
17454
  kind: "mutation",
17316
17455
  auth: "admin"
@@ -18354,22 +18493,6 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
18354
18493
  var RestartAddonResultSchema = unknown();
18355
18494
  var InstallPackageResultSchema = unknown();
18356
18495
  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
18496
  var BulkUpdateItemStatusSchema = _enum([
18374
18497
  "queued",
18375
18498
  "updating",
@@ -18497,13 +18620,6 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
18497
18620
  }), object({ success: literal(true) }), {
18498
18621
  kind: "mutation",
18499
18622
  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
18623
  }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
18508
18624
  kind: "mutation",
18509
18625
  auth: "admin"
@@ -19369,10 +19485,10 @@ var TopologyCategorySchema = object({
19369
19485
  addons: array(TopologyCategoryAddonSchema).readonly()
19370
19486
  });
19371
19487
  /**
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.
19488
+ * The node's runtime-updatable ROOT package (`@camstack/server` the single
19489
+ * root package for every node role) as reported by its `registerNode`
19490
+ * manifest — version visibility for the Server management surface. Nullable:
19491
+ * offline rows and nodes that never reported one.
19376
19492
  */
19377
19493
  var TopologyRootPackageSchema = object({
19378
19494
  name: string(),
@@ -19760,17 +19876,28 @@ var PlatformScoreSchema = object({
19760
19876
  format: _enum([
19761
19877
  "onnx",
19762
19878
  "coreml",
19763
- "openvino"
19879
+ "openvino",
19880
+ "tflite"
19764
19881
  ]),
19765
19882
  score: number(),
19766
19883
  reason: string(),
19767
19884
  available: boolean()
19768
19885
  });
19886
+ var InferenceDeviceDescriptorSchema = object({
19887
+ key: string(),
19888
+ backend: string(),
19889
+ device: string(),
19890
+ format: ModelFormatSchema,
19891
+ runtime: literal("python"),
19892
+ score: number(),
19893
+ available: boolean()
19894
+ });
19769
19895
  var PlatformCapabilitiesSchema = object({
19770
19896
  hardware: HardwareInfoSchema,
19771
19897
  scores: array(PlatformScoreSchema).readonly(),
19772
19898
  bestScore: PlatformScoreSchema,
19773
- pythonPath: string().nullable()
19899
+ pythonPath: string().nullable(),
19900
+ devices: array(InferenceDeviceDescriptorSchema).readonly()
19774
19901
  });
19775
19902
  var ModelRequirementSchema = object({
19776
19903
  modelId: string(),
@@ -20649,12 +20776,6 @@ Object.freeze({
20649
20776
  addonId: null,
20650
20777
  access: "delete"
20651
20778
  },
20652
- "addons.updateFrameworkPackage": {
20653
- capName: "addons",
20654
- capScope: "system",
20655
- addonId: null,
20656
- access: "create"
20657
- },
20658
20779
  "addons.updatePackage": {
20659
20780
  capName: "addons",
20660
20781
  capScope: "system",
@@ -23427,12 +23548,6 @@ Object.freeze({
23427
23548
  addonId: null,
23428
23549
  access: "view"
23429
23550
  },
23430
- "pipelineExecutor.reprobeEngine": {
23431
- capName: "pipeline-executor",
23432
- capScope: "system",
23433
- addonId: null,
23434
- access: "create"
23435
- },
23436
23551
  "pipelineExecutor.runAudioTest": {
23437
23552
  capName: "pipeline-executor",
23438
23553
  capScope: "system",
@@ -23583,6 +23698,12 @@ Object.freeze({
23583
23698
  addonId: null,
23584
23699
  access: "view"
23585
23700
  },
23701
+ "pipelineOrchestrator.getNodeInferenceDevices": {
23702
+ capName: "pipeline-orchestrator",
23703
+ capScope: "system",
23704
+ addonId: null,
23705
+ access: "view"
23706
+ },
23586
23707
  "pipelineOrchestrator.getPipelineAssignment": {
23587
23708
  capName: "pipeline-orchestrator",
23588
23709
  capScope: "system",
@@ -23595,6 +23716,12 @@ Object.freeze({
23595
23716
  addonId: null,
23596
23717
  access: "view"
23597
23718
  },
23719
+ "pipelineOrchestrator.getPipelineDevicePin": {
23720
+ capName: "pipeline-orchestrator",
23721
+ capScope: "system",
23722
+ addonId: null,
23723
+ access: "view"
23724
+ },
23598
23725
  "pipelineOrchestrator.listAgentSettings": {
23599
23726
  capName: "pipeline-orchestrator",
23600
23727
  capScope: "system",
@@ -23637,19 +23764,19 @@ Object.freeze({
23637
23764
  addonId: null,
23638
23765
  access: "create"
23639
23766
  },
23640
- "pipelineOrchestrator.setAgentAddonDefaults": {
23767
+ "pipelineOrchestrator.setAgentCapabilities": {
23641
23768
  capName: "pipeline-orchestrator",
23642
23769
  capScope: "system",
23643
23770
  addonId: null,
23644
23771
  access: "create"
23645
23772
  },
23646
- "pipelineOrchestrator.setAgentCapabilities": {
23773
+ "pipelineOrchestrator.setAgentDetectWeight": {
23647
23774
  capName: "pipeline-orchestrator",
23648
23775
  capScope: "system",
23649
23776
  addonId: null,
23650
23777
  access: "create"
23651
23778
  },
23652
- "pipelineOrchestrator.setAgentDetectWeight": {
23779
+ "pipelineOrchestrator.setAgentInferenceDevices": {
23653
23780
  capName: "pipeline-orchestrator",
23654
23781
  capScope: "system",
23655
23782
  addonId: null,
@@ -23691,6 +23818,12 @@ Object.freeze({
23691
23818
  addonId: null,
23692
23819
  access: "create"
23693
23820
  },
23821
+ "pipelineOrchestrator.setPipelineDevicePin": {
23822
+ capName: "pipeline-orchestrator",
23823
+ capScope: "system",
23824
+ addonId: null,
23825
+ access: "create"
23826
+ },
23694
23827
  "pipelineOrchestrator.unassignAudio": {
23695
23828
  capName: "pipeline-orchestrator",
23696
23829
  capScope: "system",
@@ -25243,32 +25376,6 @@ Object.freeze({
25243
25376
  "network-access": "ingress",
25244
25377
  "smtp-provider": "email"
25245
25378
  });
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
25379
  //#endregion
25273
25380
  //#region ../../node_modules/xtend/immutable.js
25274
25381
  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.1",
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",