@camstack/addon-provider-homeassistant 1.1.32 → 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/addon.js +193 -103
- package/dist/addon.mjs +193 -103
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -7086,6 +7086,17 @@ var ModelCatalogEntrySchema = object({
|
|
|
7086
7086
|
"imagenet",
|
|
7087
7087
|
"none"
|
|
7088
7088
|
]).optional(),
|
|
7089
|
+
/**
|
|
7090
|
+
* The model already applies softmax IN-GRAPH — its raw output is a
|
|
7091
|
+
* probability distribution, not logits. When set, the `softmax`
|
|
7092
|
+
* postprocessor must NOT re-apply softmax: re-softmaxing an already-normalised
|
|
7093
|
+
* probability vector collapses it toward uniform (top-1 score craters far
|
|
7094
|
+
* below its true value, making every confidence gate meaningless). Absent ⇒
|
|
7095
|
+
* the output is raw logits and the postprocessor applies softmax (the normal
|
|
7096
|
+
* case). Set on the Google AIY Birds `bird-classifier` (softmax baked into the
|
|
7097
|
+
* TF graph). Threaded to the Python pool via `PoolModelConfig.outputProbabilities`.
|
|
7098
|
+
*/
|
|
7099
|
+
outputProbabilities: boolean().optional(),
|
|
7089
7100
|
preprocessMode: _enum(["letterbox", "resize"]).optional(),
|
|
7090
7101
|
/**
|
|
7091
7102
|
* Per-MODEL postprocessor override. Absent ⇒ the step's own
|
|
@@ -12731,10 +12742,7 @@ var ConfigUISchemaNullableBridge = custom();
|
|
|
12731
12742
|
var InferenceCapabilitiesBridge = custom();
|
|
12732
12743
|
var ModelAvailabilityListBridge = custom();
|
|
12733
12744
|
var PipelineRunResultBridge = custom();
|
|
12734
|
-
method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(),
|
|
12735
|
-
kind: "mutation",
|
|
12736
|
-
auth: "admin"
|
|
12737
|
-
}), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
|
|
12745
|
+
method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
|
|
12738
12746
|
modelId: string(),
|
|
12739
12747
|
settings: record(string(), unknown()).readonly()
|
|
12740
12748
|
}))), method(object({ steps: record(string(), object({
|
|
@@ -12794,13 +12802,33 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
12794
12802
|
* (inputClasses ≠ null) are skipped and served per-track via
|
|
12795
12803
|
* pipelineRunner.runDetailSubtree (two-plane design).
|
|
12796
12804
|
*/
|
|
12797
|
-
plane: _enum(["full", "frame"]).optional()
|
|
12805
|
+
plane: _enum(["full", "frame"]).optional(),
|
|
12806
|
+
/**
|
|
12807
|
+
* Inference-device selector (Phase 2 multi-device). Format
|
|
12808
|
+
* `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`).
|
|
12809
|
+
* Omitted ⇒ the runner's default device (current single-engine
|
|
12810
|
+
* behaviour). Selects WHICH device pool of the node runs the call.
|
|
12811
|
+
*/
|
|
12812
|
+
deviceKey: string().optional()
|
|
12798
12813
|
}), PipelineRunResultBridge, { kind: "mutation" }), method(object({
|
|
12799
12814
|
engine: PipelineEngineChoiceSchema.optional(),
|
|
12800
12815
|
steps: array(PipelineStepInputSchema).min(1),
|
|
12801
12816
|
frames: array(FrameInputSchema).min(1).max(255),
|
|
12802
12817
|
deviceId: number().optional(),
|
|
12803
|
-
sessionId: string().optional()
|
|
12818
|
+
sessionId: string().optional(),
|
|
12819
|
+
/**
|
|
12820
|
+
* Pure-inference benchmark hint. A NONZERO uint32 pins every frame in
|
|
12821
|
+
* the batch to the Python pool's bench preprocess cache
|
|
12822
|
+
* (`_bench_frame_id`) so a REPEATED benchmark frame is decoded +
|
|
12823
|
+
* preprocessed ONCE and every later inference is a pure-inference cache
|
|
12824
|
+
* hit — the sustained-throughput run measures inference, not
|
|
12825
|
+
* decode+preprocess+infer. Omitted/0 for live frames (all different →
|
|
12826
|
+
* full preprocess every call, correct). Fresh per sustained run;
|
|
12827
|
+
* released via `uncacheFrame`.
|
|
12828
|
+
*/
|
|
12829
|
+
frameId: number().int().nonnegative().optional(),
|
|
12830
|
+
/** Inference-device selector (Phase 2 multi-device); see runPipeline. */
|
|
12831
|
+
deviceKey: string().optional()
|
|
12804
12832
|
}), object({ results: array(PipelineRunResultBridge).readonly() }), { kind: "mutation" }), method(object({
|
|
12805
12833
|
data: _instanceof(Uint8Array),
|
|
12806
12834
|
width: number().int().positive(),
|
|
@@ -12832,8 +12860,18 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
12832
12860
|
* - `runtime` — main camera-serving engine (no idle TTL).
|
|
12833
12861
|
* - `warm-override` — benchmark/test override held in the warm
|
|
12834
12862
|
* cache; auto-disposed after the idle TTL.
|
|
12863
|
+
* - `device-pool` — a concurrent per-device pool (Phase 2
|
|
12864
|
+
* multi-device, keyed by `deviceKey`) resolved
|
|
12865
|
+
* via `resolveDeviceFactory`. Runs alongside the
|
|
12866
|
+
* `runtime` engine on a DIFFERENT accelerator
|
|
12867
|
+
* (NPU / iGPU / Coral) — this is how the
|
|
12868
|
+
* Engines tab shows all pools running at once.
|
|
12835
12869
|
*/
|
|
12836
|
-
kind: _enum([
|
|
12870
|
+
kind: _enum([
|
|
12871
|
+
"runtime",
|
|
12872
|
+
"warm-override",
|
|
12873
|
+
"device-pool"
|
|
12874
|
+
]),
|
|
12837
12875
|
/** Native pid of the underlying Python pool (null when no pool). */
|
|
12838
12876
|
poolPid: number().nullable(),
|
|
12839
12877
|
/** ms since this factory was last used (null when not warm-tracked). */
|
|
@@ -13208,7 +13246,14 @@ var RunnerCameraConfigSchema = object({
|
|
|
13208
13246
|
* camera's detect node differs from its source-owner (P2d, gated by the
|
|
13209
13247
|
* `remoteSourcingNodes` rollout setting).
|
|
13210
13248
|
*/
|
|
13211
|
-
frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
|
|
13249
|
+
frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" }),
|
|
13250
|
+
/**
|
|
13251
|
+
* Inference-device selector for this camera's sessions (Phase 2 multi-device).
|
|
13252
|
+
* Format `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`);
|
|
13253
|
+
* omitted ⇒ the runner's default device. The engine itself stays node-local —
|
|
13254
|
+
* this only selects WHICH device pool of that node runs the session.
|
|
13255
|
+
*/
|
|
13256
|
+
deviceKey: string().optional()
|
|
13212
13257
|
});
|
|
13213
13258
|
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;
|
|
13214
13259
|
/**
|
|
@@ -13229,6 +13274,19 @@ var RunnerLocalLoadSchema = object({
|
|
|
13229
13274
|
avgInferenceTimeMs: number(),
|
|
13230
13275
|
/** Total queue depth across motion + detection queues. */
|
|
13231
13276
|
queueDepthTotal: number(),
|
|
13277
|
+
/**
|
|
13278
|
+
* Per-inference-device live load (multi-device C4). One entry per deviceKey
|
|
13279
|
+
* this runner currently has attached cameras on, so the orchestrator's second
|
|
13280
|
+
* `balance()` pass (over a node's devices) weights on real per-pool session
|
|
13281
|
+
* counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
|
|
13282
|
+
* per device is 0 until the pool backlog gets a public accessor (follow-up).
|
|
13283
|
+
*/
|
|
13284
|
+
devices: array(object({
|
|
13285
|
+
deviceKey: string(),
|
|
13286
|
+
backend: string(),
|
|
13287
|
+
attachedCameras: number(),
|
|
13288
|
+
queueDepthTotal: number()
|
|
13289
|
+
})).default([]),
|
|
13232
13290
|
/** Hardware capability flags reported by this node. */
|
|
13233
13291
|
hardware: object({
|
|
13234
13292
|
hasGpu: boolean(),
|
|
@@ -16377,6 +16435,8 @@ var BaseDeviceProvider = class extends BaseAddon {
|
|
|
16377
16435
|
return toDeviceSummary(device, this.addonId);
|
|
16378
16436
|
}
|
|
16379
16437
|
};
|
|
16438
|
+
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;
|
|
16439
|
+
new Set(Object.values(DeviceType));
|
|
16380
16440
|
/**
|
|
16381
16441
|
* `addon-pages` — system-scoped singleton aggregator cap. Public-facing
|
|
16382
16442
|
* surface that admin-ui consumes through `useAddonPagesListPages()`.
|
|
@@ -20145,13 +20205,11 @@ var PipelineTemplateSchema = object({
|
|
|
20145
20205
|
createdAt: string(),
|
|
20146
20206
|
updatedAt: string()
|
|
20147
20207
|
});
|
|
20148
|
-
var
|
|
20149
|
-
enabled: boolean(),
|
|
20208
|
+
var DeviceStepConfigSchema = object({
|
|
20150
20209
|
modelId: string().optional(),
|
|
20151
|
-
settings: record(string(), unknown()).
|
|
20210
|
+
settings: record(string(), unknown()).optional()
|
|
20152
20211
|
});
|
|
20153
20212
|
var AgentPipelineSettingsSchema = object({
|
|
20154
|
-
addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
|
|
20155
20213
|
maxCameras: number().int().nonnegative().nullable().default(null),
|
|
20156
20214
|
/** Per-node detection weight (relative share for the quota balancer). */
|
|
20157
20215
|
detectWeight: number().positive().optional(),
|
|
@@ -20175,7 +20233,22 @@ var AgentPipelineSettingsSchema = object({
|
|
|
20175
20233
|
* it already uses to reach the hub). Set this only when the auto-detected
|
|
20176
20234
|
* address is wrong (multi-homed host, NAT, custom interface).
|
|
20177
20235
|
*/
|
|
20178
|
-
reachableHost: string().optional()
|
|
20236
|
+
reachableHost: string().optional(),
|
|
20237
|
+
/**
|
|
20238
|
+
* Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
|
|
20239
|
+
* weight, steps}. Absent / all-disabled ⇒ the node's single default
|
|
20240
|
+
* accelerator (safe default); two+ enabled ⇒ the dispatcher balances
|
|
20241
|
+
* detection sessions across them so they run CONCURRENTLY. `steps` is the
|
|
20242
|
+
* per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
|
|
20243
|
+
* the default model/settings for every camera landing on that accelerator;
|
|
20244
|
+
* a stepId absent ⇒ the step uses that device's format default.
|
|
20245
|
+
*/
|
|
20246
|
+
inferenceDevices: record(string(), object({
|
|
20247
|
+
enabled: boolean(),
|
|
20248
|
+
weight: number().positive().optional(),
|
|
20249
|
+
maxSessions: number().int().positive().optional(),
|
|
20250
|
+
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
20251
|
+
})).optional()
|
|
20179
20252
|
});
|
|
20180
20253
|
var CameraPipelineForAgentSchema = object({
|
|
20181
20254
|
steps: array(PipelineStepInputSchema).readonly(),
|
|
@@ -20185,14 +20258,13 @@ var CameraPipelineForAgentSchema = object({
|
|
|
20185
20258
|
}).nullable()
|
|
20186
20259
|
});
|
|
20187
20260
|
var CameraStepOverridePatchSchema = object({
|
|
20188
|
-
enabled: boolean().optional(),
|
|
20189
20261
|
modelId: string().optional(),
|
|
20190
20262
|
settings: record(string(), unknown()).readonly().optional()
|
|
20191
20263
|
});
|
|
20192
20264
|
var CameraPipelineSettingsSchema = object({
|
|
20193
20265
|
pinnedAgentNodeId: string().optional(),
|
|
20194
20266
|
stepToggles: record(string(), boolean()).optional(),
|
|
20195
|
-
|
|
20267
|
+
stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
|
|
20196
20268
|
pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
|
|
20197
20269
|
});
|
|
20198
20270
|
/**
|
|
@@ -20406,6 +20478,44 @@ var CameraStatusSchema = object({
|
|
|
20406
20478
|
/** Unix timestamp (ms) when this snapshot was composed server-side. */
|
|
20407
20479
|
fetchedAt: number()
|
|
20408
20480
|
});
|
|
20481
|
+
var NodeInferenceDeviceSchema = object({
|
|
20482
|
+
/** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
|
|
20483
|
+
key: string(),
|
|
20484
|
+
backend: string(),
|
|
20485
|
+
device: string(),
|
|
20486
|
+
format: _enum(MODEL_FORMATS),
|
|
20487
|
+
/** Whether the node's live probe reports the device as usable right now. */
|
|
20488
|
+
available: boolean(),
|
|
20489
|
+
/**
|
|
20490
|
+
* Whether this device participates in dispatch. AUTO default (spec C2):
|
|
20491
|
+
* accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
|
|
20492
|
+
* entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
|
|
20493
|
+
* not a balanced target). An explicit stored value always wins; a stored-only
|
|
20494
|
+
* (unavailable) key keeps its stored value.
|
|
20495
|
+
*/
|
|
20496
|
+
enabled: boolean(),
|
|
20497
|
+
/** Relative balancer weight for the enabled device (default 1). */
|
|
20498
|
+
weight: number(),
|
|
20499
|
+
/** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
|
|
20500
|
+
maxSessions: number().nullable(),
|
|
20501
|
+
/** Object-detection model the executor defaults to for this deviceKey. */
|
|
20502
|
+
defaultModelId: string(),
|
|
20503
|
+
/**
|
|
20504
|
+
* Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
|
|
20505
|
+
* `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
|
|
20506
|
+
* Absent/empty ⇒ no base (every step uses its device format default). The
|
|
20507
|
+
* UI cross-references `pipelineExecutor.getSchema` for the models actually
|
|
20508
|
+
* available per format; this is the stored selection that becomes the
|
|
20509
|
+
* default for EVERY camera landing on this accelerator.
|
|
20510
|
+
*/
|
|
20511
|
+
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
20512
|
+
});
|
|
20513
|
+
var NodeInferenceDevicesSchema = object({
|
|
20514
|
+
nodeId: string(),
|
|
20515
|
+
/** False when the node's platform-probe was unreachable (no live device set). */
|
|
20516
|
+
reachable: boolean(),
|
|
20517
|
+
devices: array(NodeInferenceDeviceSchema).readonly()
|
|
20518
|
+
});
|
|
20409
20519
|
method(object({
|
|
20410
20520
|
deviceId: number(),
|
|
20411
20521
|
agentNodeId: string()
|
|
@@ -20415,7 +20525,13 @@ method(object({
|
|
|
20415
20525
|
}), method(object({ deviceId: number() }), object({ success: literal(true) }), {
|
|
20416
20526
|
kind: "mutation",
|
|
20417
20527
|
auth: "admin"
|
|
20418
|
-
}), method(
|
|
20528
|
+
}), method(object({
|
|
20529
|
+
deviceId: number(),
|
|
20530
|
+
deviceKey: string()
|
|
20531
|
+
}), object({ success: literal(true) }), {
|
|
20532
|
+
kind: "mutation",
|
|
20533
|
+
auth: "admin"
|
|
20534
|
+
}), method(object({ deviceId: number() }), object({ deviceKey: string().nullable() })), method(_void(), object({ migrated: number() }), {
|
|
20419
20535
|
kind: "mutation",
|
|
20420
20536
|
auth: "admin"
|
|
20421
20537
|
}), 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({
|
|
@@ -20449,13 +20565,7 @@ method(object({
|
|
|
20449
20565
|
}))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
|
|
20450
20566
|
nodeId: string(),
|
|
20451
20567
|
settings: AgentPipelineSettingsSchema
|
|
20452
|
-
})).readonly()), method(object({
|
|
20453
|
-
agentNodeId: string(),
|
|
20454
|
-
defaults: record(string(), AgentAddonConfigSchema)
|
|
20455
|
-
}), object({ success: literal(true) }), {
|
|
20456
|
-
kind: "mutation",
|
|
20457
|
-
auth: "admin"
|
|
20458
|
-
}), method(object({ agentNodeId: string() }), object({
|
|
20568
|
+
})).readonly()), method(object({ agentNodeId: string() }), object({
|
|
20459
20569
|
success: boolean(),
|
|
20460
20570
|
removed: boolean()
|
|
20461
20571
|
}), {
|
|
@@ -20487,7 +20597,18 @@ method(object({
|
|
|
20487
20597
|
}), object({ success: literal(true) }), {
|
|
20488
20598
|
kind: "mutation",
|
|
20489
20599
|
auth: "admin"
|
|
20490
|
-
}), method(object({
|
|
20600
|
+
}), method(object({
|
|
20601
|
+
agentNodeId: string(),
|
|
20602
|
+
inferenceDevices: record(string(), object({
|
|
20603
|
+
enabled: boolean(),
|
|
20604
|
+
weight: number().positive().optional(),
|
|
20605
|
+
maxSessions: number().int().positive().optional(),
|
|
20606
|
+
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
20607
|
+
}))
|
|
20608
|
+
}), object({ success: literal(true) }), {
|
|
20609
|
+
kind: "mutation",
|
|
20610
|
+
auth: "admin"
|
|
20611
|
+
}), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
|
|
20491
20612
|
success: literal(true),
|
|
20492
20613
|
/** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
|
|
20493
20614
|
effectiveModelId: string().nullable(),
|
|
@@ -20503,9 +20624,10 @@ method(object({
|
|
|
20503
20624
|
}), object({ success: literal(true) }), {
|
|
20504
20625
|
kind: "mutation",
|
|
20505
20626
|
auth: "admin"
|
|
20506
|
-
}), method(object({ deviceId: number() }), record(string(), record(string(), CameraStepOverridePatchSchema)).nullable()), method(object({
|
|
20627
|
+
}), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
|
|
20507
20628
|
deviceId: number(),
|
|
20508
20629
|
agentNodeId: string(),
|
|
20630
|
+
deviceKey: string(),
|
|
20509
20631
|
addonId: string(),
|
|
20510
20632
|
patch: CameraStepOverridePatchSchema.nullable()
|
|
20511
20633
|
}), object({ success: literal(true) }), {
|
|
@@ -20542,14 +20664,13 @@ method(object({
|
|
|
20542
20664
|
});
|
|
20543
20665
|
/**
|
|
20544
20666
|
* server-management — per-NODE singleton capability for a node's ROOT
|
|
20545
|
-
* package lifecycle (runtime-updatable node packages
|
|
20546
|
-
* agents).
|
|
20667
|
+
* package lifecycle (runtime-updatable node packages).
|
|
20547
20668
|
*
|
|
20548
|
-
*
|
|
20549
|
-
*
|
|
20550
|
-
*
|
|
20551
|
-
*
|
|
20552
|
-
*
|
|
20669
|
+
* Every node role runs the SAME root package (`@camstack/server`), which
|
|
20670
|
+
* carries the whole software stack in its npm dep tree, so ONE version
|
|
20671
|
+
* describes the node. Updates stage into `<dataDir>/server-root/` and apply
|
|
20672
|
+
* on restart via the baked starter (single-copy in-place swap — no probation,
|
|
20673
|
+
* no auto-rollback).
|
|
20553
20674
|
*
|
|
20554
20675
|
* Providers:
|
|
20555
20676
|
* - HUB: `ServerUpdateService` behind the `server-provided` mount
|
|
@@ -20657,7 +20778,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
|
|
|
20657
20778
|
/** Explicit target version; omitted = latest from the registry. */
|
|
20658
20779
|
version: string().optional() }), ServerUpdateActionResultSchema, {
|
|
20659
20780
|
kind: "mutation",
|
|
20660
|
-
auth: "admin"
|
|
20781
|
+
auth: "admin",
|
|
20782
|
+
timeoutMs: 16 * 6e4
|
|
20661
20783
|
}), method(_void(), ServerUpdateActionResultSchema, {
|
|
20662
20784
|
kind: "mutation",
|
|
20663
20785
|
auth: "admin"
|
|
@@ -21773,22 +21895,6 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
|
|
|
21773
21895
|
var RestartAddonResultSchema = unknown();
|
|
21774
21896
|
var InstallPackageResultSchema = unknown();
|
|
21775
21897
|
var ReloadPackagesResultSchema = unknown();
|
|
21776
|
-
/**
|
|
21777
|
-
* Result of `updateFrameworkPackage`. The cap method returns BEFORE the
|
|
21778
|
-
* server restarts so the admin UI can react to the `restartingAt`
|
|
21779
|
-
* timestamp (shows reconnect overlay). The transition from
|
|
21780
|
-
* `fromVersion` to `toVersion` will be confirmed by a subsequent
|
|
21781
|
-
* `system.restart-completed` event after the new process boots.
|
|
21782
|
-
*
|
|
21783
|
-
* Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
|
|
21784
|
-
*/
|
|
21785
|
-
var UpdateFrameworkPackageResultSchema = object({
|
|
21786
|
-
packageName: string(),
|
|
21787
|
-
fromVersion: string(),
|
|
21788
|
-
toVersion: string(),
|
|
21789
|
-
/** Ms-epoch the server scheduled its self-restart. */
|
|
21790
|
-
restartingAt: number()
|
|
21791
|
-
});
|
|
21792
21898
|
var BulkUpdateItemStatusSchema = _enum([
|
|
21793
21899
|
"queued",
|
|
21794
21900
|
"updating",
|
|
@@ -21916,13 +22022,6 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
|
|
|
21916
22022
|
}), object({ success: literal(true) }), {
|
|
21917
22023
|
kind: "mutation",
|
|
21918
22024
|
auth: "admin"
|
|
21919
|
-
}), method(object({
|
|
21920
|
-
packageName: string().min(1),
|
|
21921
|
-
version: string().optional(),
|
|
21922
|
-
deferRestart: boolean().optional()
|
|
21923
|
-
}), UpdateFrameworkPackageResultSchema, {
|
|
21924
|
-
kind: "mutation",
|
|
21925
|
-
auth: "admin"
|
|
21926
22025
|
}), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
|
|
21927
22026
|
kind: "mutation",
|
|
21928
22027
|
auth: "admin"
|
|
@@ -22805,10 +22904,10 @@ var TopologyCategorySchema = object({
|
|
|
22805
22904
|
addons: array(TopologyCategoryAddonSchema).readonly()
|
|
22806
22905
|
});
|
|
22807
22906
|
/**
|
|
22808
|
-
* The node's runtime-updatable ROOT package (`@camstack/server`
|
|
22809
|
-
*
|
|
22810
|
-
* version visibility for the Server management surface. Nullable:
|
|
22811
|
-
* rows and
|
|
22907
|
+
* The node's runtime-updatable ROOT package (`@camstack/server` — the single
|
|
22908
|
+
* root package for every node role) as reported by its `registerNode`
|
|
22909
|
+
* manifest — version visibility for the Server management surface. Nullable:
|
|
22910
|
+
* offline rows and nodes that never reported one.
|
|
22812
22911
|
*/
|
|
22813
22912
|
var TopologyRootPackageSchema = object({
|
|
22814
22913
|
name: string(),
|
|
@@ -23196,17 +23295,28 @@ var PlatformScoreSchema = object({
|
|
|
23196
23295
|
format: _enum([
|
|
23197
23296
|
"onnx",
|
|
23198
23297
|
"coreml",
|
|
23199
|
-
"openvino"
|
|
23298
|
+
"openvino",
|
|
23299
|
+
"tflite"
|
|
23200
23300
|
]),
|
|
23201
23301
|
score: number(),
|
|
23202
23302
|
reason: string(),
|
|
23203
23303
|
available: boolean()
|
|
23204
23304
|
});
|
|
23305
|
+
var InferenceDeviceDescriptorSchema = object({
|
|
23306
|
+
key: string(),
|
|
23307
|
+
backend: string(),
|
|
23308
|
+
device: string(),
|
|
23309
|
+
format: ModelFormatSchema,
|
|
23310
|
+
runtime: literal("python"),
|
|
23311
|
+
score: number(),
|
|
23312
|
+
available: boolean()
|
|
23313
|
+
});
|
|
23205
23314
|
var PlatformCapabilitiesSchema = object({
|
|
23206
23315
|
hardware: HardwareInfoSchema,
|
|
23207
23316
|
scores: array(PlatformScoreSchema).readonly(),
|
|
23208
23317
|
bestScore: PlatformScoreSchema,
|
|
23209
|
-
pythonPath: string().nullable()
|
|
23318
|
+
pythonPath: string().nullable(),
|
|
23319
|
+
devices: array(InferenceDeviceDescriptorSchema).readonly()
|
|
23210
23320
|
});
|
|
23211
23321
|
var ModelRequirementSchema = object({
|
|
23212
23322
|
modelId: string(),
|
|
@@ -24085,12 +24195,6 @@ Object.freeze({
|
|
|
24085
24195
|
addonId: null,
|
|
24086
24196
|
access: "delete"
|
|
24087
24197
|
},
|
|
24088
|
-
"addons.updateFrameworkPackage": {
|
|
24089
|
-
capName: "addons",
|
|
24090
|
-
capScope: "system",
|
|
24091
|
-
addonId: null,
|
|
24092
|
-
access: "create"
|
|
24093
|
-
},
|
|
24094
24198
|
"addons.updatePackage": {
|
|
24095
24199
|
capName: "addons",
|
|
24096
24200
|
capScope: "system",
|
|
@@ -26863,12 +26967,6 @@ Object.freeze({
|
|
|
26863
26967
|
addonId: null,
|
|
26864
26968
|
access: "view"
|
|
26865
26969
|
},
|
|
26866
|
-
"pipelineExecutor.reprobeEngine": {
|
|
26867
|
-
capName: "pipeline-executor",
|
|
26868
|
-
capScope: "system",
|
|
26869
|
-
addonId: null,
|
|
26870
|
-
access: "create"
|
|
26871
|
-
},
|
|
26872
26970
|
"pipelineExecutor.runAudioTest": {
|
|
26873
26971
|
capName: "pipeline-executor",
|
|
26874
26972
|
capScope: "system",
|
|
@@ -27019,6 +27117,12 @@ Object.freeze({
|
|
|
27019
27117
|
addonId: null,
|
|
27020
27118
|
access: "view"
|
|
27021
27119
|
},
|
|
27120
|
+
"pipelineOrchestrator.getNodeInferenceDevices": {
|
|
27121
|
+
capName: "pipeline-orchestrator",
|
|
27122
|
+
capScope: "system",
|
|
27123
|
+
addonId: null,
|
|
27124
|
+
access: "view"
|
|
27125
|
+
},
|
|
27022
27126
|
"pipelineOrchestrator.getPipelineAssignment": {
|
|
27023
27127
|
capName: "pipeline-orchestrator",
|
|
27024
27128
|
capScope: "system",
|
|
@@ -27031,6 +27135,12 @@ Object.freeze({
|
|
|
27031
27135
|
addonId: null,
|
|
27032
27136
|
access: "view"
|
|
27033
27137
|
},
|
|
27138
|
+
"pipelineOrchestrator.getPipelineDevicePin": {
|
|
27139
|
+
capName: "pipeline-orchestrator",
|
|
27140
|
+
capScope: "system",
|
|
27141
|
+
addonId: null,
|
|
27142
|
+
access: "view"
|
|
27143
|
+
},
|
|
27034
27144
|
"pipelineOrchestrator.listAgentSettings": {
|
|
27035
27145
|
capName: "pipeline-orchestrator",
|
|
27036
27146
|
capScope: "system",
|
|
@@ -27073,19 +27183,19 @@ Object.freeze({
|
|
|
27073
27183
|
addonId: null,
|
|
27074
27184
|
access: "create"
|
|
27075
27185
|
},
|
|
27076
|
-
"pipelineOrchestrator.
|
|
27186
|
+
"pipelineOrchestrator.setAgentCapabilities": {
|
|
27077
27187
|
capName: "pipeline-orchestrator",
|
|
27078
27188
|
capScope: "system",
|
|
27079
27189
|
addonId: null,
|
|
27080
27190
|
access: "create"
|
|
27081
27191
|
},
|
|
27082
|
-
"pipelineOrchestrator.
|
|
27192
|
+
"pipelineOrchestrator.setAgentDetectWeight": {
|
|
27083
27193
|
capName: "pipeline-orchestrator",
|
|
27084
27194
|
capScope: "system",
|
|
27085
27195
|
addonId: null,
|
|
27086
27196
|
access: "create"
|
|
27087
27197
|
},
|
|
27088
|
-
"pipelineOrchestrator.
|
|
27198
|
+
"pipelineOrchestrator.setAgentInferenceDevices": {
|
|
27089
27199
|
capName: "pipeline-orchestrator",
|
|
27090
27200
|
capScope: "system",
|
|
27091
27201
|
addonId: null,
|
|
@@ -27127,6 +27237,12 @@ Object.freeze({
|
|
|
27127
27237
|
addonId: null,
|
|
27128
27238
|
access: "create"
|
|
27129
27239
|
},
|
|
27240
|
+
"pipelineOrchestrator.setPipelineDevicePin": {
|
|
27241
|
+
capName: "pipeline-orchestrator",
|
|
27242
|
+
capScope: "system",
|
|
27243
|
+
addonId: null,
|
|
27244
|
+
access: "create"
|
|
27245
|
+
},
|
|
27130
27246
|
"pipelineOrchestrator.unassignAudio": {
|
|
27131
27247
|
capName: "pipeline-orchestrator",
|
|
27132
27248
|
capScope: "system",
|
|
@@ -28679,32 +28795,6 @@ Object.freeze({
|
|
|
28679
28795
|
"network-access": "ingress",
|
|
28680
28796
|
"smtp-provider": "email"
|
|
28681
28797
|
});
|
|
28682
|
-
var frameworkSwapPackageSchema = object({
|
|
28683
|
-
name: string(),
|
|
28684
|
-
stagedPath: string(),
|
|
28685
|
-
backupPath: string(),
|
|
28686
|
-
toVersion: string(),
|
|
28687
|
-
fromVersion: string().nullable()
|
|
28688
|
-
});
|
|
28689
|
-
object({
|
|
28690
|
-
jobId: string(),
|
|
28691
|
-
taskId: string(),
|
|
28692
|
-
packages: array(frameworkSwapPackageSchema),
|
|
28693
|
-
requestedAtMs: number(),
|
|
28694
|
-
schemaVersion: literal(1)
|
|
28695
|
-
});
|
|
28696
|
-
object({
|
|
28697
|
-
jobId: string(),
|
|
28698
|
-
taskId: string(),
|
|
28699
|
-
backups: array(object({
|
|
28700
|
-
name: string(),
|
|
28701
|
-
backupPath: string(),
|
|
28702
|
-
livePath: string()
|
|
28703
|
-
})),
|
|
28704
|
-
appliedAtMs: number(),
|
|
28705
|
-
bootAttempts: number(),
|
|
28706
|
-
schemaVersion: literal(1)
|
|
28707
|
-
});
|
|
28708
28798
|
/**
|
|
28709
28799
|
* Pure fuzzy matcher for adoption location import. Normalized
|
|
28710
28800
|
* case-insensitive Levenshtein similarity, used to reuse an existing
|
package/dist/addon.mjs
CHANGED
|
@@ -7085,6 +7085,17 @@ var ModelCatalogEntrySchema = object({
|
|
|
7085
7085
|
"imagenet",
|
|
7086
7086
|
"none"
|
|
7087
7087
|
]).optional(),
|
|
7088
|
+
/**
|
|
7089
|
+
* The model already applies softmax IN-GRAPH — its raw output is a
|
|
7090
|
+
* probability distribution, not logits. When set, the `softmax`
|
|
7091
|
+
* postprocessor must NOT re-apply softmax: re-softmaxing an already-normalised
|
|
7092
|
+
* probability vector collapses it toward uniform (top-1 score craters far
|
|
7093
|
+
* below its true value, making every confidence gate meaningless). Absent ⇒
|
|
7094
|
+
* the output is raw logits and the postprocessor applies softmax (the normal
|
|
7095
|
+
* case). Set on the Google AIY Birds `bird-classifier` (softmax baked into the
|
|
7096
|
+
* TF graph). Threaded to the Python pool via `PoolModelConfig.outputProbabilities`.
|
|
7097
|
+
*/
|
|
7098
|
+
outputProbabilities: boolean().optional(),
|
|
7088
7099
|
preprocessMode: _enum(["letterbox", "resize"]).optional(),
|
|
7089
7100
|
/**
|
|
7090
7101
|
* Per-MODEL postprocessor override. Absent ⇒ the step's own
|
|
@@ -12730,10 +12741,7 @@ var ConfigUISchemaNullableBridge = custom();
|
|
|
12730
12741
|
var InferenceCapabilitiesBridge = custom();
|
|
12731
12742
|
var ModelAvailabilityListBridge = custom();
|
|
12732
12743
|
var PipelineRunResultBridge = custom();
|
|
12733
|
-
method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(),
|
|
12734
|
-
kind: "mutation",
|
|
12735
|
-
auth: "admin"
|
|
12736
|
-
}), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
|
|
12744
|
+
method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
|
|
12737
12745
|
modelId: string(),
|
|
12738
12746
|
settings: record(string(), unknown()).readonly()
|
|
12739
12747
|
}))), method(object({ steps: record(string(), object({
|
|
@@ -12793,13 +12801,33 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
12793
12801
|
* (inputClasses ≠ null) are skipped and served per-track via
|
|
12794
12802
|
* pipelineRunner.runDetailSubtree (two-plane design).
|
|
12795
12803
|
*/
|
|
12796
|
-
plane: _enum(["full", "frame"]).optional()
|
|
12804
|
+
plane: _enum(["full", "frame"]).optional(),
|
|
12805
|
+
/**
|
|
12806
|
+
* Inference-device selector (Phase 2 multi-device). Format
|
|
12807
|
+
* `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`).
|
|
12808
|
+
* Omitted ⇒ the runner's default device (current single-engine
|
|
12809
|
+
* behaviour). Selects WHICH device pool of the node runs the call.
|
|
12810
|
+
*/
|
|
12811
|
+
deviceKey: string().optional()
|
|
12797
12812
|
}), PipelineRunResultBridge, { kind: "mutation" }), method(object({
|
|
12798
12813
|
engine: PipelineEngineChoiceSchema.optional(),
|
|
12799
12814
|
steps: array(PipelineStepInputSchema).min(1),
|
|
12800
12815
|
frames: array(FrameInputSchema).min(1).max(255),
|
|
12801
12816
|
deviceId: number().optional(),
|
|
12802
|
-
sessionId: string().optional()
|
|
12817
|
+
sessionId: string().optional(),
|
|
12818
|
+
/**
|
|
12819
|
+
* Pure-inference benchmark hint. A NONZERO uint32 pins every frame in
|
|
12820
|
+
* the batch to the Python pool's bench preprocess cache
|
|
12821
|
+
* (`_bench_frame_id`) so a REPEATED benchmark frame is decoded +
|
|
12822
|
+
* preprocessed ONCE and every later inference is a pure-inference cache
|
|
12823
|
+
* hit — the sustained-throughput run measures inference, not
|
|
12824
|
+
* decode+preprocess+infer. Omitted/0 for live frames (all different →
|
|
12825
|
+
* full preprocess every call, correct). Fresh per sustained run;
|
|
12826
|
+
* released via `uncacheFrame`.
|
|
12827
|
+
*/
|
|
12828
|
+
frameId: number().int().nonnegative().optional(),
|
|
12829
|
+
/** Inference-device selector (Phase 2 multi-device); see runPipeline. */
|
|
12830
|
+
deviceKey: string().optional()
|
|
12803
12831
|
}), object({ results: array(PipelineRunResultBridge).readonly() }), { kind: "mutation" }), method(object({
|
|
12804
12832
|
data: _instanceof(Uint8Array),
|
|
12805
12833
|
width: number().int().positive(),
|
|
@@ -12831,8 +12859,18 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
12831
12859
|
* - `runtime` — main camera-serving engine (no idle TTL).
|
|
12832
12860
|
* - `warm-override` — benchmark/test override held in the warm
|
|
12833
12861
|
* cache; auto-disposed after the idle TTL.
|
|
12862
|
+
* - `device-pool` — a concurrent per-device pool (Phase 2
|
|
12863
|
+
* multi-device, keyed by `deviceKey`) resolved
|
|
12864
|
+
* via `resolveDeviceFactory`. Runs alongside the
|
|
12865
|
+
* `runtime` engine on a DIFFERENT accelerator
|
|
12866
|
+
* (NPU / iGPU / Coral) — this is how the
|
|
12867
|
+
* Engines tab shows all pools running at once.
|
|
12834
12868
|
*/
|
|
12835
|
-
kind: _enum([
|
|
12869
|
+
kind: _enum([
|
|
12870
|
+
"runtime",
|
|
12871
|
+
"warm-override",
|
|
12872
|
+
"device-pool"
|
|
12873
|
+
]),
|
|
12836
12874
|
/** Native pid of the underlying Python pool (null when no pool). */
|
|
12837
12875
|
poolPid: number().nullable(),
|
|
12838
12876
|
/** ms since this factory was last used (null when not warm-tracked). */
|
|
@@ -13207,7 +13245,14 @@ var RunnerCameraConfigSchema = object({
|
|
|
13207
13245
|
* camera's detect node differs from its source-owner (P2d, gated by the
|
|
13208
13246
|
* `remoteSourcingNodes` rollout setting).
|
|
13209
13247
|
*/
|
|
13210
|
-
frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
|
|
13248
|
+
frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" }),
|
|
13249
|
+
/**
|
|
13250
|
+
* Inference-device selector for this camera's sessions (Phase 2 multi-device).
|
|
13251
|
+
* Format `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`);
|
|
13252
|
+
* omitted ⇒ the runner's default device. The engine itself stays node-local —
|
|
13253
|
+
* this only selects WHICH device pool of that node runs the session.
|
|
13254
|
+
*/
|
|
13255
|
+
deviceKey: string().optional()
|
|
13211
13256
|
});
|
|
13212
13257
|
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;
|
|
13213
13258
|
/**
|
|
@@ -13228,6 +13273,19 @@ var RunnerLocalLoadSchema = object({
|
|
|
13228
13273
|
avgInferenceTimeMs: number(),
|
|
13229
13274
|
/** Total queue depth across motion + detection queues. */
|
|
13230
13275
|
queueDepthTotal: number(),
|
|
13276
|
+
/**
|
|
13277
|
+
* Per-inference-device live load (multi-device C4). One entry per deviceKey
|
|
13278
|
+
* this runner currently has attached cameras on, so the orchestrator's second
|
|
13279
|
+
* `balance()` pass (over a node's devices) weights on real per-pool session
|
|
13280
|
+
* counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
|
|
13281
|
+
* per device is 0 until the pool backlog gets a public accessor (follow-up).
|
|
13282
|
+
*/
|
|
13283
|
+
devices: array(object({
|
|
13284
|
+
deviceKey: string(),
|
|
13285
|
+
backend: string(),
|
|
13286
|
+
attachedCameras: number(),
|
|
13287
|
+
queueDepthTotal: number()
|
|
13288
|
+
})).default([]),
|
|
13231
13289
|
/** Hardware capability flags reported by this node. */
|
|
13232
13290
|
hardware: object({
|
|
13233
13291
|
hasGpu: boolean(),
|
|
@@ -16376,6 +16434,8 @@ var BaseDeviceProvider = class extends BaseAddon {
|
|
|
16376
16434
|
return toDeviceSummary(device, this.addonId);
|
|
16377
16435
|
}
|
|
16378
16436
|
};
|
|
16437
|
+
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;
|
|
16438
|
+
new Set(Object.values(DeviceType));
|
|
16379
16439
|
/**
|
|
16380
16440
|
* `addon-pages` — system-scoped singleton aggregator cap. Public-facing
|
|
16381
16441
|
* surface that admin-ui consumes through `useAddonPagesListPages()`.
|
|
@@ -20144,13 +20204,11 @@ var PipelineTemplateSchema = object({
|
|
|
20144
20204
|
createdAt: string(),
|
|
20145
20205
|
updatedAt: string()
|
|
20146
20206
|
});
|
|
20147
|
-
var
|
|
20148
|
-
enabled: boolean(),
|
|
20207
|
+
var DeviceStepConfigSchema = object({
|
|
20149
20208
|
modelId: string().optional(),
|
|
20150
|
-
settings: record(string(), unknown()).
|
|
20209
|
+
settings: record(string(), unknown()).optional()
|
|
20151
20210
|
});
|
|
20152
20211
|
var AgentPipelineSettingsSchema = object({
|
|
20153
|
-
addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
|
|
20154
20212
|
maxCameras: number().int().nonnegative().nullable().default(null),
|
|
20155
20213
|
/** Per-node detection weight (relative share for the quota balancer). */
|
|
20156
20214
|
detectWeight: number().positive().optional(),
|
|
@@ -20174,7 +20232,22 @@ var AgentPipelineSettingsSchema = object({
|
|
|
20174
20232
|
* it already uses to reach the hub). Set this only when the auto-detected
|
|
20175
20233
|
* address is wrong (multi-homed host, NAT, custom interface).
|
|
20176
20234
|
*/
|
|
20177
|
-
reachableHost: string().optional()
|
|
20235
|
+
reachableHost: string().optional(),
|
|
20236
|
+
/**
|
|
20237
|
+
* Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
|
|
20238
|
+
* weight, steps}. Absent / all-disabled ⇒ the node's single default
|
|
20239
|
+
* accelerator (safe default); two+ enabled ⇒ the dispatcher balances
|
|
20240
|
+
* detection sessions across them so they run CONCURRENTLY. `steps` is the
|
|
20241
|
+
* per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
|
|
20242
|
+
* the default model/settings for every camera landing on that accelerator;
|
|
20243
|
+
* a stepId absent ⇒ the step uses that device's format default.
|
|
20244
|
+
*/
|
|
20245
|
+
inferenceDevices: record(string(), object({
|
|
20246
|
+
enabled: boolean(),
|
|
20247
|
+
weight: number().positive().optional(),
|
|
20248
|
+
maxSessions: number().int().positive().optional(),
|
|
20249
|
+
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
20250
|
+
})).optional()
|
|
20178
20251
|
});
|
|
20179
20252
|
var CameraPipelineForAgentSchema = object({
|
|
20180
20253
|
steps: array(PipelineStepInputSchema).readonly(),
|
|
@@ -20184,14 +20257,13 @@ var CameraPipelineForAgentSchema = object({
|
|
|
20184
20257
|
}).nullable()
|
|
20185
20258
|
});
|
|
20186
20259
|
var CameraStepOverridePatchSchema = object({
|
|
20187
|
-
enabled: boolean().optional(),
|
|
20188
20260
|
modelId: string().optional(),
|
|
20189
20261
|
settings: record(string(), unknown()).readonly().optional()
|
|
20190
20262
|
});
|
|
20191
20263
|
var CameraPipelineSettingsSchema = object({
|
|
20192
20264
|
pinnedAgentNodeId: string().optional(),
|
|
20193
20265
|
stepToggles: record(string(), boolean()).optional(),
|
|
20194
|
-
|
|
20266
|
+
stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
|
|
20195
20267
|
pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
|
|
20196
20268
|
});
|
|
20197
20269
|
/**
|
|
@@ -20405,6 +20477,44 @@ var CameraStatusSchema = object({
|
|
|
20405
20477
|
/** Unix timestamp (ms) when this snapshot was composed server-side. */
|
|
20406
20478
|
fetchedAt: number()
|
|
20407
20479
|
});
|
|
20480
|
+
var NodeInferenceDeviceSchema = object({
|
|
20481
|
+
/** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
|
|
20482
|
+
key: string(),
|
|
20483
|
+
backend: string(),
|
|
20484
|
+
device: string(),
|
|
20485
|
+
format: _enum(MODEL_FORMATS),
|
|
20486
|
+
/** Whether the node's live probe reports the device as usable right now. */
|
|
20487
|
+
available: boolean(),
|
|
20488
|
+
/**
|
|
20489
|
+
* Whether this device participates in dispatch. AUTO default (spec C2):
|
|
20490
|
+
* accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
|
|
20491
|
+
* entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
|
|
20492
|
+
* not a balanced target). An explicit stored value always wins; a stored-only
|
|
20493
|
+
* (unavailable) key keeps its stored value.
|
|
20494
|
+
*/
|
|
20495
|
+
enabled: boolean(),
|
|
20496
|
+
/** Relative balancer weight for the enabled device (default 1). */
|
|
20497
|
+
weight: number(),
|
|
20498
|
+
/** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
|
|
20499
|
+
maxSessions: number().nullable(),
|
|
20500
|
+
/** Object-detection model the executor defaults to for this deviceKey. */
|
|
20501
|
+
defaultModelId: string(),
|
|
20502
|
+
/**
|
|
20503
|
+
* Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
|
|
20504
|
+
* `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
|
|
20505
|
+
* Absent/empty ⇒ no base (every step uses its device format default). The
|
|
20506
|
+
* UI cross-references `pipelineExecutor.getSchema` for the models actually
|
|
20507
|
+
* available per format; this is the stored selection that becomes the
|
|
20508
|
+
* default for EVERY camera landing on this accelerator.
|
|
20509
|
+
*/
|
|
20510
|
+
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
20511
|
+
});
|
|
20512
|
+
var NodeInferenceDevicesSchema = object({
|
|
20513
|
+
nodeId: string(),
|
|
20514
|
+
/** False when the node's platform-probe was unreachable (no live device set). */
|
|
20515
|
+
reachable: boolean(),
|
|
20516
|
+
devices: array(NodeInferenceDeviceSchema).readonly()
|
|
20517
|
+
});
|
|
20408
20518
|
method(object({
|
|
20409
20519
|
deviceId: number(),
|
|
20410
20520
|
agentNodeId: string()
|
|
@@ -20414,7 +20524,13 @@ method(object({
|
|
|
20414
20524
|
}), method(object({ deviceId: number() }), object({ success: literal(true) }), {
|
|
20415
20525
|
kind: "mutation",
|
|
20416
20526
|
auth: "admin"
|
|
20417
|
-
}), method(
|
|
20527
|
+
}), method(object({
|
|
20528
|
+
deviceId: number(),
|
|
20529
|
+
deviceKey: string()
|
|
20530
|
+
}), object({ success: literal(true) }), {
|
|
20531
|
+
kind: "mutation",
|
|
20532
|
+
auth: "admin"
|
|
20533
|
+
}), method(object({ deviceId: number() }), object({ deviceKey: string().nullable() })), method(_void(), object({ migrated: number() }), {
|
|
20418
20534
|
kind: "mutation",
|
|
20419
20535
|
auth: "admin"
|
|
20420
20536
|
}), 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({
|
|
@@ -20448,13 +20564,7 @@ method(object({
|
|
|
20448
20564
|
}))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
|
|
20449
20565
|
nodeId: string(),
|
|
20450
20566
|
settings: AgentPipelineSettingsSchema
|
|
20451
|
-
})).readonly()), method(object({
|
|
20452
|
-
agentNodeId: string(),
|
|
20453
|
-
defaults: record(string(), AgentAddonConfigSchema)
|
|
20454
|
-
}), object({ success: literal(true) }), {
|
|
20455
|
-
kind: "mutation",
|
|
20456
|
-
auth: "admin"
|
|
20457
|
-
}), method(object({ agentNodeId: string() }), object({
|
|
20567
|
+
})).readonly()), method(object({ agentNodeId: string() }), object({
|
|
20458
20568
|
success: boolean(),
|
|
20459
20569
|
removed: boolean()
|
|
20460
20570
|
}), {
|
|
@@ -20486,7 +20596,18 @@ method(object({
|
|
|
20486
20596
|
}), object({ success: literal(true) }), {
|
|
20487
20597
|
kind: "mutation",
|
|
20488
20598
|
auth: "admin"
|
|
20489
|
-
}), method(object({
|
|
20599
|
+
}), method(object({
|
|
20600
|
+
agentNodeId: string(),
|
|
20601
|
+
inferenceDevices: record(string(), object({
|
|
20602
|
+
enabled: boolean(),
|
|
20603
|
+
weight: number().positive().optional(),
|
|
20604
|
+
maxSessions: number().int().positive().optional(),
|
|
20605
|
+
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
20606
|
+
}))
|
|
20607
|
+
}), object({ success: literal(true) }), {
|
|
20608
|
+
kind: "mutation",
|
|
20609
|
+
auth: "admin"
|
|
20610
|
+
}), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
|
|
20490
20611
|
success: literal(true),
|
|
20491
20612
|
/** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
|
|
20492
20613
|
effectiveModelId: string().nullable(),
|
|
@@ -20502,9 +20623,10 @@ method(object({
|
|
|
20502
20623
|
}), object({ success: literal(true) }), {
|
|
20503
20624
|
kind: "mutation",
|
|
20504
20625
|
auth: "admin"
|
|
20505
|
-
}), method(object({ deviceId: number() }), record(string(), record(string(), CameraStepOverridePatchSchema)).nullable()), method(object({
|
|
20626
|
+
}), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
|
|
20506
20627
|
deviceId: number(),
|
|
20507
20628
|
agentNodeId: string(),
|
|
20629
|
+
deviceKey: string(),
|
|
20508
20630
|
addonId: string(),
|
|
20509
20631
|
patch: CameraStepOverridePatchSchema.nullable()
|
|
20510
20632
|
}), object({ success: literal(true) }), {
|
|
@@ -20541,14 +20663,13 @@ method(object({
|
|
|
20541
20663
|
});
|
|
20542
20664
|
/**
|
|
20543
20665
|
* server-management — per-NODE singleton capability for a node's ROOT
|
|
20544
|
-
* package lifecycle (runtime-updatable node packages
|
|
20545
|
-
* agents).
|
|
20666
|
+
* package lifecycle (runtime-updatable node packages).
|
|
20546
20667
|
*
|
|
20547
|
-
*
|
|
20548
|
-
*
|
|
20549
|
-
*
|
|
20550
|
-
*
|
|
20551
|
-
*
|
|
20668
|
+
* Every node role runs the SAME root package (`@camstack/server`), which
|
|
20669
|
+
* carries the whole software stack in its npm dep tree, so ONE version
|
|
20670
|
+
* describes the node. Updates stage into `<dataDir>/server-root/` and apply
|
|
20671
|
+
* on restart via the baked starter (single-copy in-place swap — no probation,
|
|
20672
|
+
* no auto-rollback).
|
|
20552
20673
|
*
|
|
20553
20674
|
* Providers:
|
|
20554
20675
|
* - HUB: `ServerUpdateService` behind the `server-provided` mount
|
|
@@ -20656,7 +20777,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
|
|
|
20656
20777
|
/** Explicit target version; omitted = latest from the registry. */
|
|
20657
20778
|
version: string().optional() }), ServerUpdateActionResultSchema, {
|
|
20658
20779
|
kind: "mutation",
|
|
20659
|
-
auth: "admin"
|
|
20780
|
+
auth: "admin",
|
|
20781
|
+
timeoutMs: 16 * 6e4
|
|
20660
20782
|
}), method(_void(), ServerUpdateActionResultSchema, {
|
|
20661
20783
|
kind: "mutation",
|
|
20662
20784
|
auth: "admin"
|
|
@@ -21772,22 +21894,6 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
|
|
|
21772
21894
|
var RestartAddonResultSchema = unknown();
|
|
21773
21895
|
var InstallPackageResultSchema = unknown();
|
|
21774
21896
|
var ReloadPackagesResultSchema = unknown();
|
|
21775
|
-
/**
|
|
21776
|
-
* Result of `updateFrameworkPackage`. The cap method returns BEFORE the
|
|
21777
|
-
* server restarts so the admin UI can react to the `restartingAt`
|
|
21778
|
-
* timestamp (shows reconnect overlay). The transition from
|
|
21779
|
-
* `fromVersion` to `toVersion` will be confirmed by a subsequent
|
|
21780
|
-
* `system.restart-completed` event after the new process boots.
|
|
21781
|
-
*
|
|
21782
|
-
* Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
|
|
21783
|
-
*/
|
|
21784
|
-
var UpdateFrameworkPackageResultSchema = object({
|
|
21785
|
-
packageName: string(),
|
|
21786
|
-
fromVersion: string(),
|
|
21787
|
-
toVersion: string(),
|
|
21788
|
-
/** Ms-epoch the server scheduled its self-restart. */
|
|
21789
|
-
restartingAt: number()
|
|
21790
|
-
});
|
|
21791
21897
|
var BulkUpdateItemStatusSchema = _enum([
|
|
21792
21898
|
"queued",
|
|
21793
21899
|
"updating",
|
|
@@ -21915,13 +22021,6 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
|
|
|
21915
22021
|
}), object({ success: literal(true) }), {
|
|
21916
22022
|
kind: "mutation",
|
|
21917
22023
|
auth: "admin"
|
|
21918
|
-
}), method(object({
|
|
21919
|
-
packageName: string().min(1),
|
|
21920
|
-
version: string().optional(),
|
|
21921
|
-
deferRestart: boolean().optional()
|
|
21922
|
-
}), UpdateFrameworkPackageResultSchema, {
|
|
21923
|
-
kind: "mutation",
|
|
21924
|
-
auth: "admin"
|
|
21925
22024
|
}), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
|
|
21926
22025
|
kind: "mutation",
|
|
21927
22026
|
auth: "admin"
|
|
@@ -22804,10 +22903,10 @@ var TopologyCategorySchema = object({
|
|
|
22804
22903
|
addons: array(TopologyCategoryAddonSchema).readonly()
|
|
22805
22904
|
});
|
|
22806
22905
|
/**
|
|
22807
|
-
* The node's runtime-updatable ROOT package (`@camstack/server`
|
|
22808
|
-
*
|
|
22809
|
-
* version visibility for the Server management surface. Nullable:
|
|
22810
|
-
* rows and
|
|
22906
|
+
* The node's runtime-updatable ROOT package (`@camstack/server` — the single
|
|
22907
|
+
* root package for every node role) as reported by its `registerNode`
|
|
22908
|
+
* manifest — version visibility for the Server management surface. Nullable:
|
|
22909
|
+
* offline rows and nodes that never reported one.
|
|
22811
22910
|
*/
|
|
22812
22911
|
var TopologyRootPackageSchema = object({
|
|
22813
22912
|
name: string(),
|
|
@@ -23195,17 +23294,28 @@ var PlatformScoreSchema = object({
|
|
|
23195
23294
|
format: _enum([
|
|
23196
23295
|
"onnx",
|
|
23197
23296
|
"coreml",
|
|
23198
|
-
"openvino"
|
|
23297
|
+
"openvino",
|
|
23298
|
+
"tflite"
|
|
23199
23299
|
]),
|
|
23200
23300
|
score: number(),
|
|
23201
23301
|
reason: string(),
|
|
23202
23302
|
available: boolean()
|
|
23203
23303
|
});
|
|
23304
|
+
var InferenceDeviceDescriptorSchema = object({
|
|
23305
|
+
key: string(),
|
|
23306
|
+
backend: string(),
|
|
23307
|
+
device: string(),
|
|
23308
|
+
format: ModelFormatSchema,
|
|
23309
|
+
runtime: literal("python"),
|
|
23310
|
+
score: number(),
|
|
23311
|
+
available: boolean()
|
|
23312
|
+
});
|
|
23204
23313
|
var PlatformCapabilitiesSchema = object({
|
|
23205
23314
|
hardware: HardwareInfoSchema,
|
|
23206
23315
|
scores: array(PlatformScoreSchema).readonly(),
|
|
23207
23316
|
bestScore: PlatformScoreSchema,
|
|
23208
|
-
pythonPath: string().nullable()
|
|
23317
|
+
pythonPath: string().nullable(),
|
|
23318
|
+
devices: array(InferenceDeviceDescriptorSchema).readonly()
|
|
23209
23319
|
});
|
|
23210
23320
|
var ModelRequirementSchema = object({
|
|
23211
23321
|
modelId: string(),
|
|
@@ -24084,12 +24194,6 @@ Object.freeze({
|
|
|
24084
24194
|
addonId: null,
|
|
24085
24195
|
access: "delete"
|
|
24086
24196
|
},
|
|
24087
|
-
"addons.updateFrameworkPackage": {
|
|
24088
|
-
capName: "addons",
|
|
24089
|
-
capScope: "system",
|
|
24090
|
-
addonId: null,
|
|
24091
|
-
access: "create"
|
|
24092
|
-
},
|
|
24093
24197
|
"addons.updatePackage": {
|
|
24094
24198
|
capName: "addons",
|
|
24095
24199
|
capScope: "system",
|
|
@@ -26862,12 +26966,6 @@ Object.freeze({
|
|
|
26862
26966
|
addonId: null,
|
|
26863
26967
|
access: "view"
|
|
26864
26968
|
},
|
|
26865
|
-
"pipelineExecutor.reprobeEngine": {
|
|
26866
|
-
capName: "pipeline-executor",
|
|
26867
|
-
capScope: "system",
|
|
26868
|
-
addonId: null,
|
|
26869
|
-
access: "create"
|
|
26870
|
-
},
|
|
26871
26969
|
"pipelineExecutor.runAudioTest": {
|
|
26872
26970
|
capName: "pipeline-executor",
|
|
26873
26971
|
capScope: "system",
|
|
@@ -27018,6 +27116,12 @@ Object.freeze({
|
|
|
27018
27116
|
addonId: null,
|
|
27019
27117
|
access: "view"
|
|
27020
27118
|
},
|
|
27119
|
+
"pipelineOrchestrator.getNodeInferenceDevices": {
|
|
27120
|
+
capName: "pipeline-orchestrator",
|
|
27121
|
+
capScope: "system",
|
|
27122
|
+
addonId: null,
|
|
27123
|
+
access: "view"
|
|
27124
|
+
},
|
|
27021
27125
|
"pipelineOrchestrator.getPipelineAssignment": {
|
|
27022
27126
|
capName: "pipeline-orchestrator",
|
|
27023
27127
|
capScope: "system",
|
|
@@ -27030,6 +27134,12 @@ Object.freeze({
|
|
|
27030
27134
|
addonId: null,
|
|
27031
27135
|
access: "view"
|
|
27032
27136
|
},
|
|
27137
|
+
"pipelineOrchestrator.getPipelineDevicePin": {
|
|
27138
|
+
capName: "pipeline-orchestrator",
|
|
27139
|
+
capScope: "system",
|
|
27140
|
+
addonId: null,
|
|
27141
|
+
access: "view"
|
|
27142
|
+
},
|
|
27033
27143
|
"pipelineOrchestrator.listAgentSettings": {
|
|
27034
27144
|
capName: "pipeline-orchestrator",
|
|
27035
27145
|
capScope: "system",
|
|
@@ -27072,19 +27182,19 @@ Object.freeze({
|
|
|
27072
27182
|
addonId: null,
|
|
27073
27183
|
access: "create"
|
|
27074
27184
|
},
|
|
27075
|
-
"pipelineOrchestrator.
|
|
27185
|
+
"pipelineOrchestrator.setAgentCapabilities": {
|
|
27076
27186
|
capName: "pipeline-orchestrator",
|
|
27077
27187
|
capScope: "system",
|
|
27078
27188
|
addonId: null,
|
|
27079
27189
|
access: "create"
|
|
27080
27190
|
},
|
|
27081
|
-
"pipelineOrchestrator.
|
|
27191
|
+
"pipelineOrchestrator.setAgentDetectWeight": {
|
|
27082
27192
|
capName: "pipeline-orchestrator",
|
|
27083
27193
|
capScope: "system",
|
|
27084
27194
|
addonId: null,
|
|
27085
27195
|
access: "create"
|
|
27086
27196
|
},
|
|
27087
|
-
"pipelineOrchestrator.
|
|
27197
|
+
"pipelineOrchestrator.setAgentInferenceDevices": {
|
|
27088
27198
|
capName: "pipeline-orchestrator",
|
|
27089
27199
|
capScope: "system",
|
|
27090
27200
|
addonId: null,
|
|
@@ -27126,6 +27236,12 @@ Object.freeze({
|
|
|
27126
27236
|
addonId: null,
|
|
27127
27237
|
access: "create"
|
|
27128
27238
|
},
|
|
27239
|
+
"pipelineOrchestrator.setPipelineDevicePin": {
|
|
27240
|
+
capName: "pipeline-orchestrator",
|
|
27241
|
+
capScope: "system",
|
|
27242
|
+
addonId: null,
|
|
27243
|
+
access: "create"
|
|
27244
|
+
},
|
|
27129
27245
|
"pipelineOrchestrator.unassignAudio": {
|
|
27130
27246
|
capName: "pipeline-orchestrator",
|
|
27131
27247
|
capScope: "system",
|
|
@@ -28678,32 +28794,6 @@ Object.freeze({
|
|
|
28678
28794
|
"network-access": "ingress",
|
|
28679
28795
|
"smtp-provider": "email"
|
|
28680
28796
|
});
|
|
28681
|
-
var frameworkSwapPackageSchema = object({
|
|
28682
|
-
name: string(),
|
|
28683
|
-
stagedPath: string(),
|
|
28684
|
-
backupPath: string(),
|
|
28685
|
-
toVersion: string(),
|
|
28686
|
-
fromVersion: string().nullable()
|
|
28687
|
-
});
|
|
28688
|
-
object({
|
|
28689
|
-
jobId: string(),
|
|
28690
|
-
taskId: string(),
|
|
28691
|
-
packages: array(frameworkSwapPackageSchema),
|
|
28692
|
-
requestedAtMs: number(),
|
|
28693
|
-
schemaVersion: literal(1)
|
|
28694
|
-
});
|
|
28695
|
-
object({
|
|
28696
|
-
jobId: string(),
|
|
28697
|
-
taskId: string(),
|
|
28698
|
-
backups: array(object({
|
|
28699
|
-
name: string(),
|
|
28700
|
-
backupPath: string(),
|
|
28701
|
-
livePath: string()
|
|
28702
|
-
})),
|
|
28703
|
-
appliedAtMs: number(),
|
|
28704
|
-
bootAttempts: number(),
|
|
28705
|
-
schemaVersion: literal(1)
|
|
28706
|
-
});
|
|
28707
28797
|
/**
|
|
28708
28798
|
* Pure fuzzy matcher for adoption location import. Normalized
|
|
28709
28799
|
* case-insensitive Levenshtein similarity, used to reuse an existing
|