@camstack/addon-matter-broker 0.1.25 → 0.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.
Files changed (3) hide show
  1. package/dist/addon.js +193 -103
  2. package/dist/addon.mjs +193 -103
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -7112,6 +7112,17 @@ var ModelCatalogEntrySchema = object({
7112
7112
  "imagenet",
7113
7113
  "none"
7114
7114
  ]).optional(),
7115
+ /**
7116
+ * The model already applies softmax IN-GRAPH — its raw output is a
7117
+ * probability distribution, not logits. When set, the `softmax`
7118
+ * postprocessor must NOT re-apply softmax: re-softmaxing an already-normalised
7119
+ * probability vector collapses it toward uniform (top-1 score craters far
7120
+ * below its true value, making every confidence gate meaningless). Absent ⇒
7121
+ * the output is raw logits and the postprocessor applies softmax (the normal
7122
+ * case). Set on the Google AIY Birds `bird-classifier` (softmax baked into the
7123
+ * TF graph). Threaded to the Python pool via `PoolModelConfig.outputProbabilities`.
7124
+ */
7125
+ outputProbabilities: boolean().optional(),
7115
7126
  preprocessMode: _enum(["letterbox", "resize"]).optional(),
7116
7127
  /**
7117
7128
  * Per-MODEL postprocessor override. Absent ⇒ the step's own
@@ -12402,10 +12413,7 @@ var ConfigUISchemaNullableBridge = custom();
12402
12413
  var InferenceCapabilitiesBridge = custom();
12403
12414
  var ModelAvailabilityListBridge = custom();
12404
12415
  var PipelineRunResultBridge = custom();
12405
- method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
12406
- kind: "mutation",
12407
- auth: "admin"
12408
- }), method(object({ nodeId: string$2() }), EngineProvisioningSchema), method(_void(), record(string$2(), object({
12416
+ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(object({ nodeId: string$2() }), EngineProvisioningSchema), method(_void(), record(string$2(), object({
12409
12417
  modelId: string$2(),
12410
12418
  settings: record(string$2(), unknown()).readonly()
12411
12419
  }))), method(object({ steps: record(string$2(), object({
@@ -12465,13 +12473,33 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
12465
12473
  * (inputClasses ≠ null) are skipped and served per-track via
12466
12474
  * pipelineRunner.runDetailSubtree (two-plane design).
12467
12475
  */
12468
- plane: _enum(["full", "frame"]).optional()
12476
+ plane: _enum(["full", "frame"]).optional(),
12477
+ /**
12478
+ * Inference-device selector (Phase 2 multi-device). Format
12479
+ * `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`).
12480
+ * Omitted ⇒ the runner's default device (current single-engine
12481
+ * behaviour). Selects WHICH device pool of the node runs the call.
12482
+ */
12483
+ deviceKey: string$2().optional()
12469
12484
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
12470
12485
  engine: PipelineEngineChoiceSchema.optional(),
12471
12486
  steps: array(PipelineStepInputSchema).min(1),
12472
12487
  frames: array(FrameInputSchema).min(1).max(255),
12473
12488
  deviceId: number().optional(),
12474
- sessionId: string$2().optional()
12489
+ sessionId: string$2().optional(),
12490
+ /**
12491
+ * Pure-inference benchmark hint. A NONZERO uint32 pins every frame in
12492
+ * the batch to the Python pool's bench preprocess cache
12493
+ * (`_bench_frame_id`) so a REPEATED benchmark frame is decoded +
12494
+ * preprocessed ONCE and every later inference is a pure-inference cache
12495
+ * hit — the sustained-throughput run measures inference, not
12496
+ * decode+preprocess+infer. Omitted/0 for live frames (all different →
12497
+ * full preprocess every call, correct). Fresh per sustained run;
12498
+ * released via `uncacheFrame`.
12499
+ */
12500
+ frameId: number().int().nonnegative().optional(),
12501
+ /** Inference-device selector (Phase 2 multi-device); see runPipeline. */
12502
+ deviceKey: string$2().optional()
12475
12503
  }), object({ results: array(PipelineRunResultBridge).readonly() }), { kind: "mutation" }), method(object({
12476
12504
  data: _instanceof(Uint8Array),
12477
12505
  width: number().int().positive(),
@@ -12503,8 +12531,18 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
12503
12531
  * - `runtime` — main camera-serving engine (no idle TTL).
12504
12532
  * - `warm-override` — benchmark/test override held in the warm
12505
12533
  * cache; auto-disposed after the idle TTL.
12534
+ * - `device-pool` — a concurrent per-device pool (Phase 2
12535
+ * multi-device, keyed by `deviceKey`) resolved
12536
+ * via `resolveDeviceFactory`. Runs alongside the
12537
+ * `runtime` engine on a DIFFERENT accelerator
12538
+ * (NPU / iGPU / Coral) — this is how the
12539
+ * Engines tab shows all pools running at once.
12506
12540
  */
12507
- kind: _enum(["runtime", "warm-override"]),
12541
+ kind: _enum([
12542
+ "runtime",
12543
+ "warm-override",
12544
+ "device-pool"
12545
+ ]),
12508
12546
  /** Native pid of the underlying Python pool (null when no pool). */
12509
12547
  poolPid: number().nullable(),
12510
12548
  /** ms since this factory was last used (null when not warm-tracked). */
@@ -12879,7 +12917,14 @@ var RunnerCameraConfigSchema = object({
12879
12917
  * camera's detect node differs from its source-owner (P2d, gated by the
12880
12918
  * `remoteSourcingNodes` rollout setting).
12881
12919
  */
12882
- frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
12920
+ frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" }),
12921
+ /**
12922
+ * Inference-device selector for this camera's sessions (Phase 2 multi-device).
12923
+ * Format `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`);
12924
+ * omitted ⇒ the runner's default device. The engine itself stays node-local —
12925
+ * this only selects WHICH device pool of that node runs the session.
12926
+ */
12927
+ deviceKey: string$2().optional()
12883
12928
  });
12884
12929
  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;
12885
12930
  /**
@@ -12900,6 +12945,19 @@ var RunnerLocalLoadSchema = object({
12900
12945
  avgInferenceTimeMs: number(),
12901
12946
  /** Total queue depth across motion + detection queues. */
12902
12947
  queueDepthTotal: number(),
12948
+ /**
12949
+ * Per-inference-device live load (multi-device C4). One entry per deviceKey
12950
+ * this runner currently has attached cameras on, so the orchestrator's second
12951
+ * `balance()` pass (over a node's devices) weights on real per-pool session
12952
+ * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
12953
+ * per device is 0 until the pool backlog gets a public accessor (follow-up).
12954
+ */
12955
+ devices: array(object({
12956
+ deviceKey: string$2(),
12957
+ backend: string$2(),
12958
+ attachedCameras: number(),
12959
+ queueDepthTotal: number()
12960
+ })).default([]),
12903
12961
  /** Hardware capability flags reported by this node. */
12904
12962
  hardware: object({
12905
12963
  hasGpu: boolean(),
@@ -16048,6 +16106,8 @@ var BaseDeviceProvider = class extends BaseAddon {
16048
16106
  return toDeviceSummary(device, this.addonId);
16049
16107
  }
16050
16108
  };
16109
+ 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;
16110
+ new Set(Object.values(DeviceType));
16051
16111
  /**
16052
16112
  * `addon-pages` — system-scoped singleton aggregator cap. Public-facing
16053
16113
  * surface that admin-ui consumes through `useAddonPagesListPages()`.
@@ -19783,13 +19843,11 @@ var PipelineTemplateSchema = object({
19783
19843
  createdAt: string$2(),
19784
19844
  updatedAt: string$2()
19785
19845
  });
19786
- var AgentAddonConfigSchema = object({
19787
- enabled: boolean(),
19846
+ var DeviceStepConfigSchema = object({
19788
19847
  modelId: string$2().optional(),
19789
- settings: record(string$2(), unknown()).readonly()
19848
+ settings: record(string$2(), unknown()).optional()
19790
19849
  });
19791
19850
  var AgentPipelineSettingsSchema = object({
19792
- addonDefaults: record(string$2(), AgentAddonConfigSchema).readonly(),
19793
19851
  maxCameras: number().int().nonnegative().nullable().default(null),
19794
19852
  /** Per-node detection weight (relative share for the quota balancer). */
19795
19853
  detectWeight: number().positive().optional(),
@@ -19813,7 +19871,22 @@ var AgentPipelineSettingsSchema = object({
19813
19871
  * it already uses to reach the hub). Set this only when the auto-detected
19814
19872
  * address is wrong (multi-homed host, NAT, custom interface).
19815
19873
  */
19816
- reachableHost: string$2().optional()
19874
+ reachableHost: string$2().optional(),
19875
+ /**
19876
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
19877
+ * weight, steps}. Absent / all-disabled ⇒ the node's single default
19878
+ * accelerator (safe default); two+ enabled ⇒ the dispatcher balances
19879
+ * detection sessions across them so they run CONCURRENTLY. `steps` is the
19880
+ * per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
19881
+ * the default model/settings for every camera landing on that accelerator;
19882
+ * a stepId absent ⇒ the step uses that device's format default.
19883
+ */
19884
+ inferenceDevices: record(string$2(), object({
19885
+ enabled: boolean(),
19886
+ weight: number().positive().optional(),
19887
+ maxSessions: number().int().positive().optional(),
19888
+ steps: record(string$2(), DeviceStepConfigSchema).optional()
19889
+ })).optional()
19817
19890
  });
19818
19891
  var CameraPipelineForAgentSchema = object({
19819
19892
  steps: array(PipelineStepInputSchema).readonly(),
@@ -19823,14 +19896,13 @@ var CameraPipelineForAgentSchema = object({
19823
19896
  }).nullable()
19824
19897
  });
19825
19898
  var CameraStepOverridePatchSchema = object({
19826
- enabled: boolean().optional(),
19827
19899
  modelId: string$2().optional(),
19828
19900
  settings: record(string$2(), unknown()).readonly().optional()
19829
19901
  });
19830
19902
  var CameraPipelineSettingsSchema = object({
19831
19903
  pinnedAgentNodeId: string$2().optional(),
19832
19904
  stepToggles: record(string$2(), boolean()).optional(),
19833
- stepOverridesByAgent: record(string$2(), record(string$2(), CameraStepOverridePatchSchema)).optional(),
19905
+ stepOverridesByDevice: record(string$2(), record(string$2(), record(string$2(), CameraStepOverridePatchSchema))).optional(),
19834
19906
  pipelineByAgent: record(string$2(), CameraPipelineForAgentSchema).optional()
19835
19907
  });
19836
19908
  /**
@@ -20044,6 +20116,44 @@ var CameraStatusSchema = object({
20044
20116
  /** Unix timestamp (ms) when this snapshot was composed server-side. */
20045
20117
  fetchedAt: number()
20046
20118
  });
20119
+ var NodeInferenceDeviceSchema = object({
20120
+ /** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
20121
+ key: string$2(),
20122
+ backend: string$2(),
20123
+ device: string$2(),
20124
+ format: _enum(MODEL_FORMATS),
20125
+ /** Whether the node's live probe reports the device as usable right now. */
20126
+ available: boolean(),
20127
+ /**
20128
+ * Whether this device participates in dispatch. AUTO default (spec C2):
20129
+ * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
20130
+ * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
20131
+ * not a balanced target). An explicit stored value always wins; a stored-only
20132
+ * (unavailable) key keeps its stored value.
20133
+ */
20134
+ enabled: boolean(),
20135
+ /** Relative balancer weight for the enabled device (default 1). */
20136
+ weight: number(),
20137
+ /** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
20138
+ maxSessions: number().nullable(),
20139
+ /** Object-detection model the executor defaults to for this deviceKey. */
20140
+ defaultModelId: string$2(),
20141
+ /**
20142
+ * Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
20143
+ * `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
20144
+ * Absent/empty ⇒ no base (every step uses its device format default). The
20145
+ * UI cross-references `pipelineExecutor.getSchema` for the models actually
20146
+ * available per format; this is the stored selection that becomes the
20147
+ * default for EVERY camera landing on this accelerator.
20148
+ */
20149
+ steps: record(string$2(), DeviceStepConfigSchema).optional()
20150
+ });
20151
+ var NodeInferenceDevicesSchema = object({
20152
+ nodeId: string$2(),
20153
+ /** False when the node's platform-probe was unreachable (no live device set). */
20154
+ reachable: boolean(),
20155
+ devices: array(NodeInferenceDeviceSchema).readonly()
20156
+ });
20047
20157
  method(object({
20048
20158
  deviceId: number(),
20049
20159
  agentNodeId: string$2()
@@ -20053,7 +20163,13 @@ method(object({
20053
20163
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
20054
20164
  kind: "mutation",
20055
20165
  auth: "admin"
20056
- }), method(_void(), object({ migrated: number() }), {
20166
+ }), method(object({
20167
+ deviceId: number(),
20168
+ deviceKey: string$2()
20169
+ }), object({ success: literal(true) }), {
20170
+ kind: "mutation",
20171
+ auth: "admin"
20172
+ }), method(object({ deviceId: number() }), object({ deviceKey: string$2().nullable() })), method(_void(), object({ migrated: number() }), {
20057
20173
  kind: "mutation",
20058
20174
  auth: "admin"
20059
20175
  }), 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$2() }), CapabilityBindingsSchema), method(object({
@@ -20087,13 +20203,7 @@ method(object({
20087
20203
  }))), method(object({ agentNodeId: string$2() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
20088
20204
  nodeId: string$2(),
20089
20205
  settings: AgentPipelineSettingsSchema
20090
- })).readonly()), method(object({
20091
- agentNodeId: string$2(),
20092
- defaults: record(string$2(), AgentAddonConfigSchema)
20093
- }), object({ success: literal(true) }), {
20094
- kind: "mutation",
20095
- auth: "admin"
20096
- }), method(object({ agentNodeId: string$2() }), object({
20206
+ })).readonly()), method(object({ agentNodeId: string$2() }), object({
20097
20207
  success: boolean(),
20098
20208
  removed: boolean()
20099
20209
  }), {
@@ -20125,7 +20235,18 @@ method(object({
20125
20235
  }), object({ success: literal(true) }), {
20126
20236
  kind: "mutation",
20127
20237
  auth: "admin"
20128
- }), method(object({ agentNodeId: string$2() }), object({
20238
+ }), method(object({
20239
+ agentNodeId: string$2(),
20240
+ inferenceDevices: record(string$2(), object({
20241
+ enabled: boolean(),
20242
+ weight: number().positive().optional(),
20243
+ maxSessions: number().int().positive().optional(),
20244
+ steps: record(string$2(), DeviceStepConfigSchema).optional()
20245
+ }))
20246
+ }), object({ success: literal(true) }), {
20247
+ kind: "mutation",
20248
+ auth: "admin"
20249
+ }), method(object({ nodeId: string$2() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string$2() }), object({
20129
20250
  success: literal(true),
20130
20251
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
20131
20252
  effectiveModelId: string$2().nullable(),
@@ -20141,9 +20262,10 @@ method(object({
20141
20262
  }), object({ success: literal(true) }), {
20142
20263
  kind: "mutation",
20143
20264
  auth: "admin"
20144
- }), method(object({ deviceId: number() }), record(string$2(), record(string$2(), CameraStepOverridePatchSchema)).nullable()), method(object({
20265
+ }), method(object({ deviceId: number() }), record(string$2(), record(string$2(), record(string$2(), CameraStepOverridePatchSchema))).nullable()), method(object({
20145
20266
  deviceId: number(),
20146
20267
  agentNodeId: string$2(),
20268
+ deviceKey: string$2(),
20147
20269
  addonId: string$2(),
20148
20270
  patch: CameraStepOverridePatchSchema.nullable()
20149
20271
  }), object({ success: literal(true) }), {
@@ -20180,14 +20302,13 @@ method(object({
20180
20302
  });
20181
20303
  /**
20182
20304
  * server-management — per-NODE singleton capability for a node's ROOT
20183
- * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
20184
- * agents).
20305
+ * package lifecycle (runtime-updatable node packages).
20185
20306
  *
20186
- * Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
20187
- * on agents) carries the whole software stack in its npm dep tree, so ONE
20188
- * version describes the node. Updates install into
20189
- * `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
20190
- * starter (probation boot + auto-rollback to N-1).
20307
+ * Every node role runs the SAME root package (`@camstack/server`), which
20308
+ * carries the whole software stack in its npm dep tree, so ONE version
20309
+ * describes the node. Updates stage into `<dataDir>/server-root/` and apply
20310
+ * on restart via the baked starter (single-copy in-place swap — no probation,
20311
+ * no auto-rollback).
20191
20312
  *
20192
20313
  * Providers:
20193
20314
  * - HUB: `ServerUpdateService` behind the `server-provided` mount
@@ -20295,7 +20416,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
20295
20416
  /** Explicit target version; omitted = latest from the registry. */
20296
20417
  version: string$2().optional() }), ServerUpdateActionResultSchema, {
20297
20418
  kind: "mutation",
20298
- auth: "admin"
20419
+ auth: "admin",
20420
+ timeoutMs: 16 * 6e4
20299
20421
  }), method(_void(), ServerUpdateActionResultSchema, {
20300
20422
  kind: "mutation",
20301
20423
  auth: "admin"
@@ -21339,22 +21461,6 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
21339
21461
  var RestartAddonResultSchema = unknown();
21340
21462
  var InstallPackageResultSchema = unknown();
21341
21463
  var ReloadPackagesResultSchema = unknown();
21342
- /**
21343
- * Result of `updateFrameworkPackage`. The cap method returns BEFORE the
21344
- * server restarts so the admin UI can react to the `restartingAt`
21345
- * timestamp (shows reconnect overlay). The transition from
21346
- * `fromVersion` to `toVersion` will be confirmed by a subsequent
21347
- * `system.restart-completed` event after the new process boots.
21348
- *
21349
- * Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
21350
- */
21351
- var UpdateFrameworkPackageResultSchema = object({
21352
- packageName: string$2(),
21353
- fromVersion: string$2(),
21354
- toVersion: string$2(),
21355
- /** Ms-epoch the server scheduled its self-restart. */
21356
- restartingAt: number()
21357
- });
21358
21464
  var BulkUpdateItemStatusSchema = _enum([
21359
21465
  "queued",
21360
21466
  "updating",
@@ -21482,13 +21588,6 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
21482
21588
  }), object({ success: literal(true) }), {
21483
21589
  kind: "mutation",
21484
21590
  auth: "admin"
21485
- }), method(object({
21486
- packageName: string$2().min(1),
21487
- version: string$2().optional(),
21488
- deferRestart: boolean().optional()
21489
- }), UpdateFrameworkPackageResultSchema, {
21490
- kind: "mutation",
21491
- auth: "admin"
21492
21591
  }), method(object({ name: string$2() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string$2() }), RestartAddonResultSchema, {
21493
21592
  kind: "mutation",
21494
21593
  auth: "admin"
@@ -22371,10 +22470,10 @@ var TopologyCategorySchema = object({
22371
22470
  addons: array(TopologyCategoryAddonSchema).readonly()
22372
22471
  });
22373
22472
  /**
22374
- * The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
22375
- * `@camstack/agent` on agents) as reported by its `registerNode` manifest —
22376
- * version visibility for the Server management surface. Nullable: offline
22377
- * rows and pre-phase-2 nodes report none.
22473
+ * The node's runtime-updatable ROOT package (`@camstack/server` the single
22474
+ * root package for every node role) as reported by its `registerNode`
22475
+ * manifest — version visibility for the Server management surface. Nullable:
22476
+ * offline rows and nodes that never reported one.
22378
22477
  */
22379
22478
  var TopologyRootPackageSchema = object({
22380
22479
  name: string$2(),
@@ -22762,17 +22861,28 @@ var PlatformScoreSchema = object({
22762
22861
  format: _enum([
22763
22862
  "onnx",
22764
22863
  "coreml",
22765
- "openvino"
22864
+ "openvino",
22865
+ "tflite"
22766
22866
  ]),
22767
22867
  score: number(),
22768
22868
  reason: string$2(),
22769
22869
  available: boolean()
22770
22870
  });
22871
+ var InferenceDeviceDescriptorSchema = object({
22872
+ key: string$2(),
22873
+ backend: string$2(),
22874
+ device: string$2(),
22875
+ format: ModelFormatSchema,
22876
+ runtime: literal("python"),
22877
+ score: number(),
22878
+ available: boolean()
22879
+ });
22771
22880
  var PlatformCapabilitiesSchema = object({
22772
22881
  hardware: HardwareInfoSchema,
22773
22882
  scores: array(PlatformScoreSchema).readonly(),
22774
22883
  bestScore: PlatformScoreSchema,
22775
- pythonPath: string$2().nullable()
22884
+ pythonPath: string$2().nullable(),
22885
+ devices: array(InferenceDeviceDescriptorSchema).readonly()
22776
22886
  });
22777
22887
  var ModelRequirementSchema = object({
22778
22888
  modelId: string$2(),
@@ -23651,12 +23761,6 @@ Object.freeze({
23651
23761
  addonId: null,
23652
23762
  access: "delete"
23653
23763
  },
23654
- "addons.updateFrameworkPackage": {
23655
- capName: "addons",
23656
- capScope: "system",
23657
- addonId: null,
23658
- access: "create"
23659
- },
23660
23764
  "addons.updatePackage": {
23661
23765
  capName: "addons",
23662
23766
  capScope: "system",
@@ -26429,12 +26533,6 @@ Object.freeze({
26429
26533
  addonId: null,
26430
26534
  access: "view"
26431
26535
  },
26432
- "pipelineExecutor.reprobeEngine": {
26433
- capName: "pipeline-executor",
26434
- capScope: "system",
26435
- addonId: null,
26436
- access: "create"
26437
- },
26438
26536
  "pipelineExecutor.runAudioTest": {
26439
26537
  capName: "pipeline-executor",
26440
26538
  capScope: "system",
@@ -26585,6 +26683,12 @@ Object.freeze({
26585
26683
  addonId: null,
26586
26684
  access: "view"
26587
26685
  },
26686
+ "pipelineOrchestrator.getNodeInferenceDevices": {
26687
+ capName: "pipeline-orchestrator",
26688
+ capScope: "system",
26689
+ addonId: null,
26690
+ access: "view"
26691
+ },
26588
26692
  "pipelineOrchestrator.getPipelineAssignment": {
26589
26693
  capName: "pipeline-orchestrator",
26590
26694
  capScope: "system",
@@ -26597,6 +26701,12 @@ Object.freeze({
26597
26701
  addonId: null,
26598
26702
  access: "view"
26599
26703
  },
26704
+ "pipelineOrchestrator.getPipelineDevicePin": {
26705
+ capName: "pipeline-orchestrator",
26706
+ capScope: "system",
26707
+ addonId: null,
26708
+ access: "view"
26709
+ },
26600
26710
  "pipelineOrchestrator.listAgentSettings": {
26601
26711
  capName: "pipeline-orchestrator",
26602
26712
  capScope: "system",
@@ -26639,19 +26749,19 @@ Object.freeze({
26639
26749
  addonId: null,
26640
26750
  access: "create"
26641
26751
  },
26642
- "pipelineOrchestrator.setAgentAddonDefaults": {
26752
+ "pipelineOrchestrator.setAgentCapabilities": {
26643
26753
  capName: "pipeline-orchestrator",
26644
26754
  capScope: "system",
26645
26755
  addonId: null,
26646
26756
  access: "create"
26647
26757
  },
26648
- "pipelineOrchestrator.setAgentCapabilities": {
26758
+ "pipelineOrchestrator.setAgentDetectWeight": {
26649
26759
  capName: "pipeline-orchestrator",
26650
26760
  capScope: "system",
26651
26761
  addonId: null,
26652
26762
  access: "create"
26653
26763
  },
26654
- "pipelineOrchestrator.setAgentDetectWeight": {
26764
+ "pipelineOrchestrator.setAgentInferenceDevices": {
26655
26765
  capName: "pipeline-orchestrator",
26656
26766
  capScope: "system",
26657
26767
  addonId: null,
@@ -26693,6 +26803,12 @@ Object.freeze({
26693
26803
  addonId: null,
26694
26804
  access: "create"
26695
26805
  },
26806
+ "pipelineOrchestrator.setPipelineDevicePin": {
26807
+ capName: "pipeline-orchestrator",
26808
+ capScope: "system",
26809
+ addonId: null,
26810
+ access: "create"
26811
+ },
26696
26812
  "pipelineOrchestrator.unassignAudio": {
26697
26813
  capName: "pipeline-orchestrator",
26698
26814
  capScope: "system",
@@ -28245,32 +28361,6 @@ Object.freeze({
28245
28361
  "network-access": "ingress",
28246
28362
  "smtp-provider": "email"
28247
28363
  });
28248
- var frameworkSwapPackageSchema = object({
28249
- name: string$2(),
28250
- stagedPath: string$2(),
28251
- backupPath: string$2(),
28252
- toVersion: string$2(),
28253
- fromVersion: string$2().nullable()
28254
- });
28255
- object({
28256
- jobId: string$2(),
28257
- taskId: string$2(),
28258
- packages: array(frameworkSwapPackageSchema),
28259
- requestedAtMs: number(),
28260
- schemaVersion: literal(1)
28261
- });
28262
- object({
28263
- jobId: string$2(),
28264
- taskId: string$2(),
28265
- backups: array(object({
28266
- name: string$2(),
28267
- backupPath: string$2(),
28268
- livePath: string$2()
28269
- })),
28270
- appliedAtMs: number(),
28271
- bootAttempts: number(),
28272
- schemaVersion: literal(1)
28273
- });
28274
28364
  //#endregion
28275
28365
  //#region ../../node_modules/@matter/general/dist/esm/net/tcp/TcpConnection.js
28276
28366
  /**
package/dist/addon.mjs CHANGED
@@ -7110,6 +7110,17 @@ var ModelCatalogEntrySchema = object({
7110
7110
  "imagenet",
7111
7111
  "none"
7112
7112
  ]).optional(),
7113
+ /**
7114
+ * The model already applies softmax IN-GRAPH — its raw output is a
7115
+ * probability distribution, not logits. When set, the `softmax`
7116
+ * postprocessor must NOT re-apply softmax: re-softmaxing an already-normalised
7117
+ * probability vector collapses it toward uniform (top-1 score craters far
7118
+ * below its true value, making every confidence gate meaningless). Absent ⇒
7119
+ * the output is raw logits and the postprocessor applies softmax (the normal
7120
+ * case). Set on the Google AIY Birds `bird-classifier` (softmax baked into the
7121
+ * TF graph). Threaded to the Python pool via `PoolModelConfig.outputProbabilities`.
7122
+ */
7123
+ outputProbabilities: boolean().optional(),
7113
7124
  preprocessMode: _enum(["letterbox", "resize"]).optional(),
7114
7125
  /**
7115
7126
  * Per-MODEL postprocessor override. Absent ⇒ the step's own
@@ -12400,10 +12411,7 @@ var ConfigUISchemaNullableBridge = custom();
12400
12411
  var InferenceCapabilitiesBridge = custom();
12401
12412
  var ModelAvailabilityListBridge = custom();
12402
12413
  var PipelineRunResultBridge = custom();
12403
- method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
12404
- kind: "mutation",
12405
- auth: "admin"
12406
- }), method(object({ nodeId: string$2() }), EngineProvisioningSchema), method(_void(), record(string$2(), object({
12414
+ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(object({ nodeId: string$2() }), EngineProvisioningSchema), method(_void(), record(string$2(), object({
12407
12415
  modelId: string$2(),
12408
12416
  settings: record(string$2(), unknown()).readonly()
12409
12417
  }))), method(object({ steps: record(string$2(), object({
@@ -12463,13 +12471,33 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
12463
12471
  * (inputClasses ≠ null) are skipped and served per-track via
12464
12472
  * pipelineRunner.runDetailSubtree (two-plane design).
12465
12473
  */
12466
- plane: _enum(["full", "frame"]).optional()
12474
+ plane: _enum(["full", "frame"]).optional(),
12475
+ /**
12476
+ * Inference-device selector (Phase 2 multi-device). Format
12477
+ * `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`).
12478
+ * Omitted ⇒ the runner's default device (current single-engine
12479
+ * behaviour). Selects WHICH device pool of the node runs the call.
12480
+ */
12481
+ deviceKey: string$2().optional()
12467
12482
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
12468
12483
  engine: PipelineEngineChoiceSchema.optional(),
12469
12484
  steps: array(PipelineStepInputSchema).min(1),
12470
12485
  frames: array(FrameInputSchema).min(1).max(255),
12471
12486
  deviceId: number().optional(),
12472
- sessionId: string$2().optional()
12487
+ sessionId: string$2().optional(),
12488
+ /**
12489
+ * Pure-inference benchmark hint. A NONZERO uint32 pins every frame in
12490
+ * the batch to the Python pool's bench preprocess cache
12491
+ * (`_bench_frame_id`) so a REPEATED benchmark frame is decoded +
12492
+ * preprocessed ONCE and every later inference is a pure-inference cache
12493
+ * hit — the sustained-throughput run measures inference, not
12494
+ * decode+preprocess+infer. Omitted/0 for live frames (all different →
12495
+ * full preprocess every call, correct). Fresh per sustained run;
12496
+ * released via `uncacheFrame`.
12497
+ */
12498
+ frameId: number().int().nonnegative().optional(),
12499
+ /** Inference-device selector (Phase 2 multi-device); see runPipeline. */
12500
+ deviceKey: string$2().optional()
12473
12501
  }), object({ results: array(PipelineRunResultBridge).readonly() }), { kind: "mutation" }), method(object({
12474
12502
  data: _instanceof(Uint8Array),
12475
12503
  width: number().int().positive(),
@@ -12501,8 +12529,18 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
12501
12529
  * - `runtime` — main camera-serving engine (no idle TTL).
12502
12530
  * - `warm-override` — benchmark/test override held in the warm
12503
12531
  * cache; auto-disposed after the idle TTL.
12532
+ * - `device-pool` — a concurrent per-device pool (Phase 2
12533
+ * multi-device, keyed by `deviceKey`) resolved
12534
+ * via `resolveDeviceFactory`. Runs alongside the
12535
+ * `runtime` engine on a DIFFERENT accelerator
12536
+ * (NPU / iGPU / Coral) — this is how the
12537
+ * Engines tab shows all pools running at once.
12504
12538
  */
12505
- kind: _enum(["runtime", "warm-override"]),
12539
+ kind: _enum([
12540
+ "runtime",
12541
+ "warm-override",
12542
+ "device-pool"
12543
+ ]),
12506
12544
  /** Native pid of the underlying Python pool (null when no pool). */
12507
12545
  poolPid: number().nullable(),
12508
12546
  /** ms since this factory was last used (null when not warm-tracked). */
@@ -12877,7 +12915,14 @@ var RunnerCameraConfigSchema = object({
12877
12915
  * camera's detect node differs from its source-owner (P2d, gated by the
12878
12916
  * `remoteSourcingNodes` rollout setting).
12879
12917
  */
12880
- frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
12918
+ frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" }),
12919
+ /**
12920
+ * Inference-device selector for this camera's sessions (Phase 2 multi-device).
12921
+ * Format `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`);
12922
+ * omitted ⇒ the runner's default device. The engine itself stays node-local —
12923
+ * this only selects WHICH device pool of that node runs the session.
12924
+ */
12925
+ deviceKey: string$2().optional()
12881
12926
  });
12882
12927
  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;
12883
12928
  /**
@@ -12898,6 +12943,19 @@ var RunnerLocalLoadSchema = object({
12898
12943
  avgInferenceTimeMs: number(),
12899
12944
  /** Total queue depth across motion + detection queues. */
12900
12945
  queueDepthTotal: number(),
12946
+ /**
12947
+ * Per-inference-device live load (multi-device C4). One entry per deviceKey
12948
+ * this runner currently has attached cameras on, so the orchestrator's second
12949
+ * `balance()` pass (over a node's devices) weights on real per-pool session
12950
+ * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
12951
+ * per device is 0 until the pool backlog gets a public accessor (follow-up).
12952
+ */
12953
+ devices: array(object({
12954
+ deviceKey: string$2(),
12955
+ backend: string$2(),
12956
+ attachedCameras: number(),
12957
+ queueDepthTotal: number()
12958
+ })).default([]),
12901
12959
  /** Hardware capability flags reported by this node. */
12902
12960
  hardware: object({
12903
12961
  hasGpu: boolean(),
@@ -16046,6 +16104,8 @@ var BaseDeviceProvider = class extends BaseAddon {
16046
16104
  return toDeviceSummary(device, this.addonId);
16047
16105
  }
16048
16106
  };
16107
+ 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;
16108
+ new Set(Object.values(DeviceType));
16049
16109
  /**
16050
16110
  * `addon-pages` — system-scoped singleton aggregator cap. Public-facing
16051
16111
  * surface that admin-ui consumes through `useAddonPagesListPages()`.
@@ -19781,13 +19841,11 @@ var PipelineTemplateSchema = object({
19781
19841
  createdAt: string$2(),
19782
19842
  updatedAt: string$2()
19783
19843
  });
19784
- var AgentAddonConfigSchema = object({
19785
- enabled: boolean(),
19844
+ var DeviceStepConfigSchema = object({
19786
19845
  modelId: string$2().optional(),
19787
- settings: record(string$2(), unknown()).readonly()
19846
+ settings: record(string$2(), unknown()).optional()
19788
19847
  });
19789
19848
  var AgentPipelineSettingsSchema = object({
19790
- addonDefaults: record(string$2(), AgentAddonConfigSchema).readonly(),
19791
19849
  maxCameras: number().int().nonnegative().nullable().default(null),
19792
19850
  /** Per-node detection weight (relative share for the quota balancer). */
19793
19851
  detectWeight: number().positive().optional(),
@@ -19811,7 +19869,22 @@ var AgentPipelineSettingsSchema = object({
19811
19869
  * it already uses to reach the hub). Set this only when the auto-detected
19812
19870
  * address is wrong (multi-homed host, NAT, custom interface).
19813
19871
  */
19814
- reachableHost: string$2().optional()
19872
+ reachableHost: string$2().optional(),
19873
+ /**
19874
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
19875
+ * weight, steps}. Absent / all-disabled ⇒ the node's single default
19876
+ * accelerator (safe default); two+ enabled ⇒ the dispatcher balances
19877
+ * detection sessions across them so they run CONCURRENTLY. `steps` is the
19878
+ * per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
19879
+ * the default model/settings for every camera landing on that accelerator;
19880
+ * a stepId absent ⇒ the step uses that device's format default.
19881
+ */
19882
+ inferenceDevices: record(string$2(), object({
19883
+ enabled: boolean(),
19884
+ weight: number().positive().optional(),
19885
+ maxSessions: number().int().positive().optional(),
19886
+ steps: record(string$2(), DeviceStepConfigSchema).optional()
19887
+ })).optional()
19815
19888
  });
19816
19889
  var CameraPipelineForAgentSchema = object({
19817
19890
  steps: array(PipelineStepInputSchema).readonly(),
@@ -19821,14 +19894,13 @@ var CameraPipelineForAgentSchema = object({
19821
19894
  }).nullable()
19822
19895
  });
19823
19896
  var CameraStepOverridePatchSchema = object({
19824
- enabled: boolean().optional(),
19825
19897
  modelId: string$2().optional(),
19826
19898
  settings: record(string$2(), unknown()).readonly().optional()
19827
19899
  });
19828
19900
  var CameraPipelineSettingsSchema = object({
19829
19901
  pinnedAgentNodeId: string$2().optional(),
19830
19902
  stepToggles: record(string$2(), boolean()).optional(),
19831
- stepOverridesByAgent: record(string$2(), record(string$2(), CameraStepOverridePatchSchema)).optional(),
19903
+ stepOverridesByDevice: record(string$2(), record(string$2(), record(string$2(), CameraStepOverridePatchSchema))).optional(),
19832
19904
  pipelineByAgent: record(string$2(), CameraPipelineForAgentSchema).optional()
19833
19905
  });
19834
19906
  /**
@@ -20042,6 +20114,44 @@ var CameraStatusSchema = object({
20042
20114
  /** Unix timestamp (ms) when this snapshot was composed server-side. */
20043
20115
  fetchedAt: number()
20044
20116
  });
20117
+ var NodeInferenceDeviceSchema = object({
20118
+ /** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
20119
+ key: string$2(),
20120
+ backend: string$2(),
20121
+ device: string$2(),
20122
+ format: _enum(MODEL_FORMATS),
20123
+ /** Whether the node's live probe reports the device as usable right now. */
20124
+ available: boolean(),
20125
+ /**
20126
+ * Whether this device participates in dispatch. AUTO default (spec C2):
20127
+ * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
20128
+ * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
20129
+ * not a balanced target). An explicit stored value always wins; a stored-only
20130
+ * (unavailable) key keeps its stored value.
20131
+ */
20132
+ enabled: boolean(),
20133
+ /** Relative balancer weight for the enabled device (default 1). */
20134
+ weight: number(),
20135
+ /** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
20136
+ maxSessions: number().nullable(),
20137
+ /** Object-detection model the executor defaults to for this deviceKey. */
20138
+ defaultModelId: string$2(),
20139
+ /**
20140
+ * Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
20141
+ * `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
20142
+ * Absent/empty ⇒ no base (every step uses its device format default). The
20143
+ * UI cross-references `pipelineExecutor.getSchema` for the models actually
20144
+ * available per format; this is the stored selection that becomes the
20145
+ * default for EVERY camera landing on this accelerator.
20146
+ */
20147
+ steps: record(string$2(), DeviceStepConfigSchema).optional()
20148
+ });
20149
+ var NodeInferenceDevicesSchema = object({
20150
+ nodeId: string$2(),
20151
+ /** False when the node's platform-probe was unreachable (no live device set). */
20152
+ reachable: boolean(),
20153
+ devices: array(NodeInferenceDeviceSchema).readonly()
20154
+ });
20045
20155
  method(object({
20046
20156
  deviceId: number(),
20047
20157
  agentNodeId: string$2()
@@ -20051,7 +20161,13 @@ method(object({
20051
20161
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
20052
20162
  kind: "mutation",
20053
20163
  auth: "admin"
20054
- }), method(_void(), object({ migrated: number() }), {
20164
+ }), method(object({
20165
+ deviceId: number(),
20166
+ deviceKey: string$2()
20167
+ }), object({ success: literal(true) }), {
20168
+ kind: "mutation",
20169
+ auth: "admin"
20170
+ }), method(object({ deviceId: number() }), object({ deviceKey: string$2().nullable() })), method(_void(), object({ migrated: number() }), {
20055
20171
  kind: "mutation",
20056
20172
  auth: "admin"
20057
20173
  }), 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$2() }), CapabilityBindingsSchema), method(object({
@@ -20085,13 +20201,7 @@ method(object({
20085
20201
  }))), method(object({ agentNodeId: string$2() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
20086
20202
  nodeId: string$2(),
20087
20203
  settings: AgentPipelineSettingsSchema
20088
- })).readonly()), method(object({
20089
- agentNodeId: string$2(),
20090
- defaults: record(string$2(), AgentAddonConfigSchema)
20091
- }), object({ success: literal(true) }), {
20092
- kind: "mutation",
20093
- auth: "admin"
20094
- }), method(object({ agentNodeId: string$2() }), object({
20204
+ })).readonly()), method(object({ agentNodeId: string$2() }), object({
20095
20205
  success: boolean(),
20096
20206
  removed: boolean()
20097
20207
  }), {
@@ -20123,7 +20233,18 @@ method(object({
20123
20233
  }), object({ success: literal(true) }), {
20124
20234
  kind: "mutation",
20125
20235
  auth: "admin"
20126
- }), method(object({ agentNodeId: string$2() }), object({
20236
+ }), method(object({
20237
+ agentNodeId: string$2(),
20238
+ inferenceDevices: record(string$2(), object({
20239
+ enabled: boolean(),
20240
+ weight: number().positive().optional(),
20241
+ maxSessions: number().int().positive().optional(),
20242
+ steps: record(string$2(), DeviceStepConfigSchema).optional()
20243
+ }))
20244
+ }), object({ success: literal(true) }), {
20245
+ kind: "mutation",
20246
+ auth: "admin"
20247
+ }), method(object({ nodeId: string$2() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string$2() }), object({
20127
20248
  success: literal(true),
20128
20249
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
20129
20250
  effectiveModelId: string$2().nullable(),
@@ -20139,9 +20260,10 @@ method(object({
20139
20260
  }), object({ success: literal(true) }), {
20140
20261
  kind: "mutation",
20141
20262
  auth: "admin"
20142
- }), method(object({ deviceId: number() }), record(string$2(), record(string$2(), CameraStepOverridePatchSchema)).nullable()), method(object({
20263
+ }), method(object({ deviceId: number() }), record(string$2(), record(string$2(), record(string$2(), CameraStepOverridePatchSchema))).nullable()), method(object({
20143
20264
  deviceId: number(),
20144
20265
  agentNodeId: string$2(),
20266
+ deviceKey: string$2(),
20145
20267
  addonId: string$2(),
20146
20268
  patch: CameraStepOverridePatchSchema.nullable()
20147
20269
  }), object({ success: literal(true) }), {
@@ -20178,14 +20300,13 @@ method(object({
20178
20300
  });
20179
20301
  /**
20180
20302
  * server-management — per-NODE singleton capability for a node's ROOT
20181
- * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
20182
- * agents).
20303
+ * package lifecycle (runtime-updatable node packages).
20183
20304
  *
20184
- * Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
20185
- * on agents) carries the whole software stack in its npm dep tree, so ONE
20186
- * version describes the node. Updates install into
20187
- * `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
20188
- * starter (probation boot + auto-rollback to N-1).
20305
+ * Every node role runs the SAME root package (`@camstack/server`), which
20306
+ * carries the whole software stack in its npm dep tree, so ONE version
20307
+ * describes the node. Updates stage into `<dataDir>/server-root/` and apply
20308
+ * on restart via the baked starter (single-copy in-place swap — no probation,
20309
+ * no auto-rollback).
20189
20310
  *
20190
20311
  * Providers:
20191
20312
  * - HUB: `ServerUpdateService` behind the `server-provided` mount
@@ -20293,7 +20414,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
20293
20414
  /** Explicit target version; omitted = latest from the registry. */
20294
20415
  version: string$2().optional() }), ServerUpdateActionResultSchema, {
20295
20416
  kind: "mutation",
20296
- auth: "admin"
20417
+ auth: "admin",
20418
+ timeoutMs: 16 * 6e4
20297
20419
  }), method(_void(), ServerUpdateActionResultSchema, {
20298
20420
  kind: "mutation",
20299
20421
  auth: "admin"
@@ -21337,22 +21459,6 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
21337
21459
  var RestartAddonResultSchema = unknown();
21338
21460
  var InstallPackageResultSchema = unknown();
21339
21461
  var ReloadPackagesResultSchema = unknown();
21340
- /**
21341
- * Result of `updateFrameworkPackage`. The cap method returns BEFORE the
21342
- * server restarts so the admin UI can react to the `restartingAt`
21343
- * timestamp (shows reconnect overlay). The transition from
21344
- * `fromVersion` to `toVersion` will be confirmed by a subsequent
21345
- * `system.restart-completed` event after the new process boots.
21346
- *
21347
- * Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
21348
- */
21349
- var UpdateFrameworkPackageResultSchema = object({
21350
- packageName: string$2(),
21351
- fromVersion: string$2(),
21352
- toVersion: string$2(),
21353
- /** Ms-epoch the server scheduled its self-restart. */
21354
- restartingAt: number()
21355
- });
21356
21462
  var BulkUpdateItemStatusSchema = _enum([
21357
21463
  "queued",
21358
21464
  "updating",
@@ -21480,13 +21586,6 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
21480
21586
  }), object({ success: literal(true) }), {
21481
21587
  kind: "mutation",
21482
21588
  auth: "admin"
21483
- }), method(object({
21484
- packageName: string$2().min(1),
21485
- version: string$2().optional(),
21486
- deferRestart: boolean().optional()
21487
- }), UpdateFrameworkPackageResultSchema, {
21488
- kind: "mutation",
21489
- auth: "admin"
21490
21589
  }), method(object({ name: string$2() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string$2() }), RestartAddonResultSchema, {
21491
21590
  kind: "mutation",
21492
21591
  auth: "admin"
@@ -22369,10 +22468,10 @@ var TopologyCategorySchema = object({
22369
22468
  addons: array(TopologyCategoryAddonSchema).readonly()
22370
22469
  });
22371
22470
  /**
22372
- * The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
22373
- * `@camstack/agent` on agents) as reported by its `registerNode` manifest —
22374
- * version visibility for the Server management surface. Nullable: offline
22375
- * rows and pre-phase-2 nodes report none.
22471
+ * The node's runtime-updatable ROOT package (`@camstack/server` the single
22472
+ * root package for every node role) as reported by its `registerNode`
22473
+ * manifest — version visibility for the Server management surface. Nullable:
22474
+ * offline rows and nodes that never reported one.
22376
22475
  */
22377
22476
  var TopologyRootPackageSchema = object({
22378
22477
  name: string$2(),
@@ -22760,17 +22859,28 @@ var PlatformScoreSchema = object({
22760
22859
  format: _enum([
22761
22860
  "onnx",
22762
22861
  "coreml",
22763
- "openvino"
22862
+ "openvino",
22863
+ "tflite"
22764
22864
  ]),
22765
22865
  score: number(),
22766
22866
  reason: string$2(),
22767
22867
  available: boolean()
22768
22868
  });
22869
+ var InferenceDeviceDescriptorSchema = object({
22870
+ key: string$2(),
22871
+ backend: string$2(),
22872
+ device: string$2(),
22873
+ format: ModelFormatSchema,
22874
+ runtime: literal("python"),
22875
+ score: number(),
22876
+ available: boolean()
22877
+ });
22769
22878
  var PlatformCapabilitiesSchema = object({
22770
22879
  hardware: HardwareInfoSchema,
22771
22880
  scores: array(PlatformScoreSchema).readonly(),
22772
22881
  bestScore: PlatformScoreSchema,
22773
- pythonPath: string$2().nullable()
22882
+ pythonPath: string$2().nullable(),
22883
+ devices: array(InferenceDeviceDescriptorSchema).readonly()
22774
22884
  });
22775
22885
  var ModelRequirementSchema = object({
22776
22886
  modelId: string$2(),
@@ -23649,12 +23759,6 @@ Object.freeze({
23649
23759
  addonId: null,
23650
23760
  access: "delete"
23651
23761
  },
23652
- "addons.updateFrameworkPackage": {
23653
- capName: "addons",
23654
- capScope: "system",
23655
- addonId: null,
23656
- access: "create"
23657
- },
23658
23762
  "addons.updatePackage": {
23659
23763
  capName: "addons",
23660
23764
  capScope: "system",
@@ -26427,12 +26531,6 @@ Object.freeze({
26427
26531
  addonId: null,
26428
26532
  access: "view"
26429
26533
  },
26430
- "pipelineExecutor.reprobeEngine": {
26431
- capName: "pipeline-executor",
26432
- capScope: "system",
26433
- addonId: null,
26434
- access: "create"
26435
- },
26436
26534
  "pipelineExecutor.runAudioTest": {
26437
26535
  capName: "pipeline-executor",
26438
26536
  capScope: "system",
@@ -26583,6 +26681,12 @@ Object.freeze({
26583
26681
  addonId: null,
26584
26682
  access: "view"
26585
26683
  },
26684
+ "pipelineOrchestrator.getNodeInferenceDevices": {
26685
+ capName: "pipeline-orchestrator",
26686
+ capScope: "system",
26687
+ addonId: null,
26688
+ access: "view"
26689
+ },
26586
26690
  "pipelineOrchestrator.getPipelineAssignment": {
26587
26691
  capName: "pipeline-orchestrator",
26588
26692
  capScope: "system",
@@ -26595,6 +26699,12 @@ Object.freeze({
26595
26699
  addonId: null,
26596
26700
  access: "view"
26597
26701
  },
26702
+ "pipelineOrchestrator.getPipelineDevicePin": {
26703
+ capName: "pipeline-orchestrator",
26704
+ capScope: "system",
26705
+ addonId: null,
26706
+ access: "view"
26707
+ },
26598
26708
  "pipelineOrchestrator.listAgentSettings": {
26599
26709
  capName: "pipeline-orchestrator",
26600
26710
  capScope: "system",
@@ -26637,19 +26747,19 @@ Object.freeze({
26637
26747
  addonId: null,
26638
26748
  access: "create"
26639
26749
  },
26640
- "pipelineOrchestrator.setAgentAddonDefaults": {
26750
+ "pipelineOrchestrator.setAgentCapabilities": {
26641
26751
  capName: "pipeline-orchestrator",
26642
26752
  capScope: "system",
26643
26753
  addonId: null,
26644
26754
  access: "create"
26645
26755
  },
26646
- "pipelineOrchestrator.setAgentCapabilities": {
26756
+ "pipelineOrchestrator.setAgentDetectWeight": {
26647
26757
  capName: "pipeline-orchestrator",
26648
26758
  capScope: "system",
26649
26759
  addonId: null,
26650
26760
  access: "create"
26651
26761
  },
26652
- "pipelineOrchestrator.setAgentDetectWeight": {
26762
+ "pipelineOrchestrator.setAgentInferenceDevices": {
26653
26763
  capName: "pipeline-orchestrator",
26654
26764
  capScope: "system",
26655
26765
  addonId: null,
@@ -26691,6 +26801,12 @@ Object.freeze({
26691
26801
  addonId: null,
26692
26802
  access: "create"
26693
26803
  },
26804
+ "pipelineOrchestrator.setPipelineDevicePin": {
26805
+ capName: "pipeline-orchestrator",
26806
+ capScope: "system",
26807
+ addonId: null,
26808
+ access: "create"
26809
+ },
26694
26810
  "pipelineOrchestrator.unassignAudio": {
26695
26811
  capName: "pipeline-orchestrator",
26696
26812
  capScope: "system",
@@ -28243,32 +28359,6 @@ Object.freeze({
28243
28359
  "network-access": "ingress",
28244
28360
  "smtp-provider": "email"
28245
28361
  });
28246
- var frameworkSwapPackageSchema = object({
28247
- name: string$2(),
28248
- stagedPath: string$2(),
28249
- backupPath: string$2(),
28250
- toVersion: string$2(),
28251
- fromVersion: string$2().nullable()
28252
- });
28253
- object({
28254
- jobId: string$2(),
28255
- taskId: string$2(),
28256
- packages: array(frameworkSwapPackageSchema),
28257
- requestedAtMs: number(),
28258
- schemaVersion: literal(1)
28259
- });
28260
- object({
28261
- jobId: string$2(),
28262
- taskId: string$2(),
28263
- backups: array(object({
28264
- name: string$2(),
28265
- backupPath: string$2(),
28266
- livePath: string$2()
28267
- })),
28268
- appliedAtMs: number(),
28269
- bootAttempts: number(),
28270
- schemaVersion: literal(1)
28271
- });
28272
28362
  //#endregion
28273
28363
  //#region ../../node_modules/@matter/general/dist/esm/net/tcp/TcpConnection.js
28274
28364
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-matter-broker",
3
- "version": "0.1.25",
3
+ "version": "0.2.0",
4
4
  "description": "Matter broker addon for CamStack — owns a Matter fabric (commissioning + the long-lived controller) via the matter.js controller and brokers commissioned Matter nodes into CamStack",
5
5
  "keywords": [
6
6
  "camstack",