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