@camstack/addon-static-turn 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/static-turn.addon.js +193 -103
- package/dist/static-turn.addon.mjs +193 -103
- package/package.json +1 -1
|
@@ -7068,6 +7068,17 @@ var ModelCatalogEntrySchema = object({
|
|
|
7068
7068
|
"imagenet",
|
|
7069
7069
|
"none"
|
|
7070
7070
|
]).optional(),
|
|
7071
|
+
/**
|
|
7072
|
+
* The model already applies softmax IN-GRAPH — its raw output is a
|
|
7073
|
+
* probability distribution, not logits. When set, the `softmax`
|
|
7074
|
+
* postprocessor must NOT re-apply softmax: re-softmaxing an already-normalised
|
|
7075
|
+
* probability vector collapses it toward uniform (top-1 score craters far
|
|
7076
|
+
* below its true value, making every confidence gate meaningless). Absent ⇒
|
|
7077
|
+
* the output is raw logits and the postprocessor applies softmax (the normal
|
|
7078
|
+
* case). Set on the Google AIY Birds `bird-classifier` (softmax baked into the
|
|
7079
|
+
* TF graph). Threaded to the Python pool via `PoolModelConfig.outputProbabilities`.
|
|
7080
|
+
*/
|
|
7081
|
+
outputProbabilities: boolean().optional(),
|
|
7071
7082
|
preprocessMode: _enum(["letterbox", "resize"]).optional(),
|
|
7072
7083
|
/**
|
|
7073
7084
|
* Per-MODEL postprocessor override. Absent ⇒ the step's own
|
|
@@ -11081,10 +11092,7 @@ var ConfigUISchemaNullableBridge = custom();
|
|
|
11081
11092
|
var InferenceCapabilitiesBridge = custom();
|
|
11082
11093
|
var ModelAvailabilityListBridge = custom();
|
|
11083
11094
|
var PipelineRunResultBridge = custom();
|
|
11084
|
-
method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(),
|
|
11085
|
-
kind: "mutation",
|
|
11086
|
-
auth: "admin"
|
|
11087
|
-
}), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
|
|
11095
|
+
method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
|
|
11088
11096
|
modelId: string(),
|
|
11089
11097
|
settings: record(string(), unknown()).readonly()
|
|
11090
11098
|
}))), method(object({ steps: record(string(), object({
|
|
@@ -11144,13 +11152,33 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
11144
11152
|
* (inputClasses ≠ null) are skipped and served per-track via
|
|
11145
11153
|
* pipelineRunner.runDetailSubtree (two-plane design).
|
|
11146
11154
|
*/
|
|
11147
|
-
plane: _enum(["full", "frame"]).optional()
|
|
11155
|
+
plane: _enum(["full", "frame"]).optional(),
|
|
11156
|
+
/**
|
|
11157
|
+
* Inference-device selector (Phase 2 multi-device). Format
|
|
11158
|
+
* `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`).
|
|
11159
|
+
* Omitted ⇒ the runner's default device (current single-engine
|
|
11160
|
+
* behaviour). Selects WHICH device pool of the node runs the call.
|
|
11161
|
+
*/
|
|
11162
|
+
deviceKey: string().optional()
|
|
11148
11163
|
}), PipelineRunResultBridge, { kind: "mutation" }), method(object({
|
|
11149
11164
|
engine: PipelineEngineChoiceSchema.optional(),
|
|
11150
11165
|
steps: array(PipelineStepInputSchema).min(1),
|
|
11151
11166
|
frames: array(FrameInputSchema).min(1).max(255),
|
|
11152
11167
|
deviceId: number().optional(),
|
|
11153
|
-
sessionId: string().optional()
|
|
11168
|
+
sessionId: string().optional(),
|
|
11169
|
+
/**
|
|
11170
|
+
* Pure-inference benchmark hint. A NONZERO uint32 pins every frame in
|
|
11171
|
+
* the batch to the Python pool's bench preprocess cache
|
|
11172
|
+
* (`_bench_frame_id`) so a REPEATED benchmark frame is decoded +
|
|
11173
|
+
* preprocessed ONCE and every later inference is a pure-inference cache
|
|
11174
|
+
* hit — the sustained-throughput run measures inference, not
|
|
11175
|
+
* decode+preprocess+infer. Omitted/0 for live frames (all different →
|
|
11176
|
+
* full preprocess every call, correct). Fresh per sustained run;
|
|
11177
|
+
* released via `uncacheFrame`.
|
|
11178
|
+
*/
|
|
11179
|
+
frameId: number().int().nonnegative().optional(),
|
|
11180
|
+
/** Inference-device selector (Phase 2 multi-device); see runPipeline. */
|
|
11181
|
+
deviceKey: string().optional()
|
|
11154
11182
|
}), object({ results: array(PipelineRunResultBridge).readonly() }), { kind: "mutation" }), method(object({
|
|
11155
11183
|
data: _instanceof(Uint8Array),
|
|
11156
11184
|
width: number().int().positive(),
|
|
@@ -11182,8 +11210,18 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
11182
11210
|
* - `runtime` — main camera-serving engine (no idle TTL).
|
|
11183
11211
|
* - `warm-override` — benchmark/test override held in the warm
|
|
11184
11212
|
* cache; auto-disposed after the idle TTL.
|
|
11213
|
+
* - `device-pool` — a concurrent per-device pool (Phase 2
|
|
11214
|
+
* multi-device, keyed by `deviceKey`) resolved
|
|
11215
|
+
* via `resolveDeviceFactory`. Runs alongside the
|
|
11216
|
+
* `runtime` engine on a DIFFERENT accelerator
|
|
11217
|
+
* (NPU / iGPU / Coral) — this is how the
|
|
11218
|
+
* Engines tab shows all pools running at once.
|
|
11185
11219
|
*/
|
|
11186
|
-
kind: _enum([
|
|
11220
|
+
kind: _enum([
|
|
11221
|
+
"runtime",
|
|
11222
|
+
"warm-override",
|
|
11223
|
+
"device-pool"
|
|
11224
|
+
]),
|
|
11187
11225
|
/** Native pid of the underlying Python pool (null when no pool). */
|
|
11188
11226
|
poolPid: number().nullable(),
|
|
11189
11227
|
/** ms since this factory was last used (null when not warm-tracked). */
|
|
@@ -11525,7 +11563,14 @@ var RunnerCameraConfigSchema = object({
|
|
|
11525
11563
|
* camera's detect node differs from its source-owner (P2d, gated by the
|
|
11526
11564
|
* `remoteSourcingNodes` rollout setting).
|
|
11527
11565
|
*/
|
|
11528
|
-
frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
|
|
11566
|
+
frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" }),
|
|
11567
|
+
/**
|
|
11568
|
+
* Inference-device selector for this camera's sessions (Phase 2 multi-device).
|
|
11569
|
+
* Format `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`);
|
|
11570
|
+
* omitted ⇒ the runner's default device. The engine itself stays node-local —
|
|
11571
|
+
* this only selects WHICH device pool of that node runs the session.
|
|
11572
|
+
*/
|
|
11573
|
+
deviceKey: string().optional()
|
|
11529
11574
|
});
|
|
11530
11575
|
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;
|
|
11531
11576
|
/**
|
|
@@ -11546,6 +11591,19 @@ var RunnerLocalLoadSchema = object({
|
|
|
11546
11591
|
avgInferenceTimeMs: number(),
|
|
11547
11592
|
/** Total queue depth across motion + detection queues. */
|
|
11548
11593
|
queueDepthTotal: number(),
|
|
11594
|
+
/**
|
|
11595
|
+
* Per-inference-device live load (multi-device C4). One entry per deviceKey
|
|
11596
|
+
* this runner currently has attached cameras on, so the orchestrator's second
|
|
11597
|
+
* `balance()` pass (over a node's devices) weights on real per-pool session
|
|
11598
|
+
* counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
|
|
11599
|
+
* per device is 0 until the pool backlog gets a public accessor (follow-up).
|
|
11600
|
+
*/
|
|
11601
|
+
devices: array(object({
|
|
11602
|
+
deviceKey: string(),
|
|
11603
|
+
backend: string(),
|
|
11604
|
+
attachedCameras: number(),
|
|
11605
|
+
queueDepthTotal: number()
|
|
11606
|
+
})).default([]),
|
|
11549
11607
|
/** Hardware capability flags reported by this node. */
|
|
11550
11608
|
hardware: object({
|
|
11551
11609
|
hasGpu: boolean(),
|
|
@@ -13021,6 +13079,8 @@ method(_void(), _void(), { kind: "mutation" }), method(_void(), _void(), { kind:
|
|
|
13021
13079
|
kind: "mutation",
|
|
13022
13080
|
auth: "admin"
|
|
13023
13081
|
});
|
|
13082
|
+
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;
|
|
13083
|
+
new Set(Object.values(DeviceType));
|
|
13024
13084
|
/**
|
|
13025
13085
|
* `addon-pages` — system-scoped singleton aggregator cap. Public-facing
|
|
13026
13086
|
* surface that admin-ui consumes through `useAddonPagesListPages()`.
|
|
@@ -16690,13 +16750,11 @@ var PipelineTemplateSchema = object({
|
|
|
16690
16750
|
createdAt: string(),
|
|
16691
16751
|
updatedAt: string()
|
|
16692
16752
|
});
|
|
16693
|
-
var
|
|
16694
|
-
enabled: boolean(),
|
|
16753
|
+
var DeviceStepConfigSchema = object({
|
|
16695
16754
|
modelId: string().optional(),
|
|
16696
|
-
settings: record(string(), unknown()).
|
|
16755
|
+
settings: record(string(), unknown()).optional()
|
|
16697
16756
|
});
|
|
16698
16757
|
var AgentPipelineSettingsSchema = object({
|
|
16699
|
-
addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
|
|
16700
16758
|
maxCameras: number().int().nonnegative().nullable().default(null),
|
|
16701
16759
|
/** Per-node detection weight (relative share for the quota balancer). */
|
|
16702
16760
|
detectWeight: number().positive().optional(),
|
|
@@ -16720,7 +16778,22 @@ var AgentPipelineSettingsSchema = object({
|
|
|
16720
16778
|
* it already uses to reach the hub). Set this only when the auto-detected
|
|
16721
16779
|
* address is wrong (multi-homed host, NAT, custom interface).
|
|
16722
16780
|
*/
|
|
16723
|
-
reachableHost: string().optional()
|
|
16781
|
+
reachableHost: string().optional(),
|
|
16782
|
+
/**
|
|
16783
|
+
* Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
|
|
16784
|
+
* weight, steps}. Absent / all-disabled ⇒ the node's single default
|
|
16785
|
+
* accelerator (safe default); two+ enabled ⇒ the dispatcher balances
|
|
16786
|
+
* detection sessions across them so they run CONCURRENTLY. `steps` is the
|
|
16787
|
+
* per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
|
|
16788
|
+
* the default model/settings for every camera landing on that accelerator;
|
|
16789
|
+
* a stepId absent ⇒ the step uses that device's format default.
|
|
16790
|
+
*/
|
|
16791
|
+
inferenceDevices: record(string(), object({
|
|
16792
|
+
enabled: boolean(),
|
|
16793
|
+
weight: number().positive().optional(),
|
|
16794
|
+
maxSessions: number().int().positive().optional(),
|
|
16795
|
+
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
16796
|
+
})).optional()
|
|
16724
16797
|
});
|
|
16725
16798
|
var CameraPipelineForAgentSchema = object({
|
|
16726
16799
|
steps: array(PipelineStepInputSchema).readonly(),
|
|
@@ -16730,14 +16803,13 @@ var CameraPipelineForAgentSchema = object({
|
|
|
16730
16803
|
}).nullable()
|
|
16731
16804
|
});
|
|
16732
16805
|
var CameraStepOverridePatchSchema = object({
|
|
16733
|
-
enabled: boolean().optional(),
|
|
16734
16806
|
modelId: string().optional(),
|
|
16735
16807
|
settings: record(string(), unknown()).readonly().optional()
|
|
16736
16808
|
});
|
|
16737
16809
|
var CameraPipelineSettingsSchema = object({
|
|
16738
16810
|
pinnedAgentNodeId: string().optional(),
|
|
16739
16811
|
stepToggles: record(string(), boolean()).optional(),
|
|
16740
|
-
|
|
16812
|
+
stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
|
|
16741
16813
|
pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
|
|
16742
16814
|
});
|
|
16743
16815
|
/**
|
|
@@ -16951,6 +17023,44 @@ var CameraStatusSchema = object({
|
|
|
16951
17023
|
/** Unix timestamp (ms) when this snapshot was composed server-side. */
|
|
16952
17024
|
fetchedAt: number()
|
|
16953
17025
|
});
|
|
17026
|
+
var NodeInferenceDeviceSchema = object({
|
|
17027
|
+
/** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
|
|
17028
|
+
key: string(),
|
|
17029
|
+
backend: string(),
|
|
17030
|
+
device: string(),
|
|
17031
|
+
format: _enum(MODEL_FORMATS),
|
|
17032
|
+
/** Whether the node's live probe reports the device as usable right now. */
|
|
17033
|
+
available: boolean(),
|
|
17034
|
+
/**
|
|
17035
|
+
* Whether this device participates in dispatch. AUTO default (spec C2):
|
|
17036
|
+
* accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
|
|
17037
|
+
* entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
|
|
17038
|
+
* not a balanced target). An explicit stored value always wins; a stored-only
|
|
17039
|
+
* (unavailable) key keeps its stored value.
|
|
17040
|
+
*/
|
|
17041
|
+
enabled: boolean(),
|
|
17042
|
+
/** Relative balancer weight for the enabled device (default 1). */
|
|
17043
|
+
weight: number(),
|
|
17044
|
+
/** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
|
|
17045
|
+
maxSessions: number().nullable(),
|
|
17046
|
+
/** Object-detection model the executor defaults to for this deviceKey. */
|
|
17047
|
+
defaultModelId: string(),
|
|
17048
|
+
/**
|
|
17049
|
+
* Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
|
|
17050
|
+
* `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
|
|
17051
|
+
* Absent/empty ⇒ no base (every step uses its device format default). The
|
|
17052
|
+
* UI cross-references `pipelineExecutor.getSchema` for the models actually
|
|
17053
|
+
* available per format; this is the stored selection that becomes the
|
|
17054
|
+
* default for EVERY camera landing on this accelerator.
|
|
17055
|
+
*/
|
|
17056
|
+
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
17057
|
+
});
|
|
17058
|
+
var NodeInferenceDevicesSchema = object({
|
|
17059
|
+
nodeId: string(),
|
|
17060
|
+
/** False when the node's platform-probe was unreachable (no live device set). */
|
|
17061
|
+
reachable: boolean(),
|
|
17062
|
+
devices: array(NodeInferenceDeviceSchema).readonly()
|
|
17063
|
+
});
|
|
16954
17064
|
method(object({
|
|
16955
17065
|
deviceId: number(),
|
|
16956
17066
|
agentNodeId: string()
|
|
@@ -16960,7 +17070,13 @@ method(object({
|
|
|
16960
17070
|
}), method(object({ deviceId: number() }), object({ success: literal(true) }), {
|
|
16961
17071
|
kind: "mutation",
|
|
16962
17072
|
auth: "admin"
|
|
16963
|
-
}), method(
|
|
17073
|
+
}), method(object({
|
|
17074
|
+
deviceId: number(),
|
|
17075
|
+
deviceKey: string()
|
|
17076
|
+
}), object({ success: literal(true) }), {
|
|
17077
|
+
kind: "mutation",
|
|
17078
|
+
auth: "admin"
|
|
17079
|
+
}), method(object({ deviceId: number() }), object({ deviceKey: string().nullable() })), method(_void(), object({ migrated: number() }), {
|
|
16964
17080
|
kind: "mutation",
|
|
16965
17081
|
auth: "admin"
|
|
16966
17082
|
}), 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({
|
|
@@ -16994,13 +17110,7 @@ method(object({
|
|
|
16994
17110
|
}))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
|
|
16995
17111
|
nodeId: string(),
|
|
16996
17112
|
settings: AgentPipelineSettingsSchema
|
|
16997
|
-
})).readonly()), method(object({
|
|
16998
|
-
agentNodeId: string(),
|
|
16999
|
-
defaults: record(string(), AgentAddonConfigSchema)
|
|
17000
|
-
}), object({ success: literal(true) }), {
|
|
17001
|
-
kind: "mutation",
|
|
17002
|
-
auth: "admin"
|
|
17003
|
-
}), method(object({ agentNodeId: string() }), object({
|
|
17113
|
+
})).readonly()), method(object({ agentNodeId: string() }), object({
|
|
17004
17114
|
success: boolean(),
|
|
17005
17115
|
removed: boolean()
|
|
17006
17116
|
}), {
|
|
@@ -17032,7 +17142,18 @@ method(object({
|
|
|
17032
17142
|
}), object({ success: literal(true) }), {
|
|
17033
17143
|
kind: "mutation",
|
|
17034
17144
|
auth: "admin"
|
|
17035
|
-
}), method(object({
|
|
17145
|
+
}), method(object({
|
|
17146
|
+
agentNodeId: string(),
|
|
17147
|
+
inferenceDevices: record(string(), object({
|
|
17148
|
+
enabled: boolean(),
|
|
17149
|
+
weight: number().positive().optional(),
|
|
17150
|
+
maxSessions: number().int().positive().optional(),
|
|
17151
|
+
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
17152
|
+
}))
|
|
17153
|
+
}), object({ success: literal(true) }), {
|
|
17154
|
+
kind: "mutation",
|
|
17155
|
+
auth: "admin"
|
|
17156
|
+
}), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
|
|
17036
17157
|
success: literal(true),
|
|
17037
17158
|
/** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
|
|
17038
17159
|
effectiveModelId: string().nullable(),
|
|
@@ -17048,9 +17169,10 @@ method(object({
|
|
|
17048
17169
|
}), object({ success: literal(true) }), {
|
|
17049
17170
|
kind: "mutation",
|
|
17050
17171
|
auth: "admin"
|
|
17051
|
-
}), method(object({ deviceId: number() }), record(string(), record(string(), CameraStepOverridePatchSchema)).nullable()), method(object({
|
|
17172
|
+
}), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
|
|
17052
17173
|
deviceId: number(),
|
|
17053
17174
|
agentNodeId: string(),
|
|
17175
|
+
deviceKey: string(),
|
|
17054
17176
|
addonId: string(),
|
|
17055
17177
|
patch: CameraStepOverridePatchSchema.nullable()
|
|
17056
17178
|
}), object({ success: literal(true) }), {
|
|
@@ -17087,14 +17209,13 @@ method(object({
|
|
|
17087
17209
|
});
|
|
17088
17210
|
/**
|
|
17089
17211
|
* server-management — per-NODE singleton capability for a node's ROOT
|
|
17090
|
-
* package lifecycle (runtime-updatable node packages
|
|
17091
|
-
* agents).
|
|
17212
|
+
* package lifecycle (runtime-updatable node packages).
|
|
17092
17213
|
*
|
|
17093
|
-
*
|
|
17094
|
-
*
|
|
17095
|
-
*
|
|
17096
|
-
*
|
|
17097
|
-
*
|
|
17214
|
+
* Every node role runs the SAME root package (`@camstack/server`), which
|
|
17215
|
+
* carries the whole software stack in its npm dep tree, so ONE version
|
|
17216
|
+
* describes the node. Updates stage into `<dataDir>/server-root/` and apply
|
|
17217
|
+
* on restart via the baked starter (single-copy in-place swap — no probation,
|
|
17218
|
+
* no auto-rollback).
|
|
17098
17219
|
*
|
|
17099
17220
|
* Providers:
|
|
17100
17221
|
* - HUB: `ServerUpdateService` behind the `server-provided` mount
|
|
@@ -17202,7 +17323,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
|
|
|
17202
17323
|
/** Explicit target version; omitted = latest from the registry. */
|
|
17203
17324
|
version: string().optional() }), ServerUpdateActionResultSchema, {
|
|
17204
17325
|
kind: "mutation",
|
|
17205
|
-
auth: "admin"
|
|
17326
|
+
auth: "admin",
|
|
17327
|
+
timeoutMs: 16 * 6e4
|
|
17206
17328
|
}), method(_void(), ServerUpdateActionResultSchema, {
|
|
17207
17329
|
kind: "mutation",
|
|
17208
17330
|
auth: "admin"
|
|
@@ -18269,22 +18391,6 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
|
|
|
18269
18391
|
var RestartAddonResultSchema = unknown();
|
|
18270
18392
|
var InstallPackageResultSchema = unknown();
|
|
18271
18393
|
var ReloadPackagesResultSchema = unknown();
|
|
18272
|
-
/**
|
|
18273
|
-
* Result of `updateFrameworkPackage`. The cap method returns BEFORE the
|
|
18274
|
-
* server restarts so the admin UI can react to the `restartingAt`
|
|
18275
|
-
* timestamp (shows reconnect overlay). The transition from
|
|
18276
|
-
* `fromVersion` to `toVersion` will be confirmed by a subsequent
|
|
18277
|
-
* `system.restart-completed` event after the new process boots.
|
|
18278
|
-
*
|
|
18279
|
-
* Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
|
|
18280
|
-
*/
|
|
18281
|
-
var UpdateFrameworkPackageResultSchema = object({
|
|
18282
|
-
packageName: string(),
|
|
18283
|
-
fromVersion: string(),
|
|
18284
|
-
toVersion: string(),
|
|
18285
|
-
/** Ms-epoch the server scheduled its self-restart. */
|
|
18286
|
-
restartingAt: number()
|
|
18287
|
-
});
|
|
18288
18394
|
var BulkUpdateItemStatusSchema = _enum([
|
|
18289
18395
|
"queued",
|
|
18290
18396
|
"updating",
|
|
@@ -18412,13 +18518,6 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
|
|
|
18412
18518
|
}), object({ success: literal(true) }), {
|
|
18413
18519
|
kind: "mutation",
|
|
18414
18520
|
auth: "admin"
|
|
18415
|
-
}), method(object({
|
|
18416
|
-
packageName: string().min(1),
|
|
18417
|
-
version: string().optional(),
|
|
18418
|
-
deferRestart: boolean().optional()
|
|
18419
|
-
}), UpdateFrameworkPackageResultSchema, {
|
|
18420
|
-
kind: "mutation",
|
|
18421
|
-
auth: "admin"
|
|
18422
18521
|
}), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
|
|
18423
18522
|
kind: "mutation",
|
|
18424
18523
|
auth: "admin"
|
|
@@ -19284,10 +19383,10 @@ var TopologyCategorySchema = object({
|
|
|
19284
19383
|
addons: array(TopologyCategoryAddonSchema).readonly()
|
|
19285
19384
|
});
|
|
19286
19385
|
/**
|
|
19287
|
-
* The node's runtime-updatable ROOT package (`@camstack/server`
|
|
19288
|
-
*
|
|
19289
|
-
* version visibility for the Server management surface. Nullable:
|
|
19290
|
-
* rows and
|
|
19386
|
+
* The node's runtime-updatable ROOT package (`@camstack/server` — the single
|
|
19387
|
+
* root package for every node role) as reported by its `registerNode`
|
|
19388
|
+
* manifest — version visibility for the Server management surface. Nullable:
|
|
19389
|
+
* offline rows and nodes that never reported one.
|
|
19291
19390
|
*/
|
|
19292
19391
|
var TopologyRootPackageSchema = object({
|
|
19293
19392
|
name: string(),
|
|
@@ -19675,17 +19774,28 @@ var PlatformScoreSchema = object({
|
|
|
19675
19774
|
format: _enum([
|
|
19676
19775
|
"onnx",
|
|
19677
19776
|
"coreml",
|
|
19678
|
-
"openvino"
|
|
19777
|
+
"openvino",
|
|
19778
|
+
"tflite"
|
|
19679
19779
|
]),
|
|
19680
19780
|
score: number(),
|
|
19681
19781
|
reason: string(),
|
|
19682
19782
|
available: boolean()
|
|
19683
19783
|
});
|
|
19784
|
+
var InferenceDeviceDescriptorSchema = object({
|
|
19785
|
+
key: string(),
|
|
19786
|
+
backend: string(),
|
|
19787
|
+
device: string(),
|
|
19788
|
+
format: ModelFormatSchema,
|
|
19789
|
+
runtime: literal("python"),
|
|
19790
|
+
score: number(),
|
|
19791
|
+
available: boolean()
|
|
19792
|
+
});
|
|
19684
19793
|
var PlatformCapabilitiesSchema = object({
|
|
19685
19794
|
hardware: HardwareInfoSchema,
|
|
19686
19795
|
scores: array(PlatformScoreSchema).readonly(),
|
|
19687
19796
|
bestScore: PlatformScoreSchema,
|
|
19688
|
-
pythonPath: string().nullable()
|
|
19797
|
+
pythonPath: string().nullable(),
|
|
19798
|
+
devices: array(InferenceDeviceDescriptorSchema).readonly()
|
|
19689
19799
|
});
|
|
19690
19800
|
var ModelRequirementSchema = object({
|
|
19691
19801
|
modelId: string(),
|
|
@@ -20564,12 +20674,6 @@ Object.freeze({
|
|
|
20564
20674
|
addonId: null,
|
|
20565
20675
|
access: "delete"
|
|
20566
20676
|
},
|
|
20567
|
-
"addons.updateFrameworkPackage": {
|
|
20568
|
-
capName: "addons",
|
|
20569
|
-
capScope: "system",
|
|
20570
|
-
addonId: null,
|
|
20571
|
-
access: "create"
|
|
20572
|
-
},
|
|
20573
20677
|
"addons.updatePackage": {
|
|
20574
20678
|
capName: "addons",
|
|
20575
20679
|
capScope: "system",
|
|
@@ -23342,12 +23446,6 @@ Object.freeze({
|
|
|
23342
23446
|
addonId: null,
|
|
23343
23447
|
access: "view"
|
|
23344
23448
|
},
|
|
23345
|
-
"pipelineExecutor.reprobeEngine": {
|
|
23346
|
-
capName: "pipeline-executor",
|
|
23347
|
-
capScope: "system",
|
|
23348
|
-
addonId: null,
|
|
23349
|
-
access: "create"
|
|
23350
|
-
},
|
|
23351
23449
|
"pipelineExecutor.runAudioTest": {
|
|
23352
23450
|
capName: "pipeline-executor",
|
|
23353
23451
|
capScope: "system",
|
|
@@ -23498,6 +23596,12 @@ Object.freeze({
|
|
|
23498
23596
|
addonId: null,
|
|
23499
23597
|
access: "view"
|
|
23500
23598
|
},
|
|
23599
|
+
"pipelineOrchestrator.getNodeInferenceDevices": {
|
|
23600
|
+
capName: "pipeline-orchestrator",
|
|
23601
|
+
capScope: "system",
|
|
23602
|
+
addonId: null,
|
|
23603
|
+
access: "view"
|
|
23604
|
+
},
|
|
23501
23605
|
"pipelineOrchestrator.getPipelineAssignment": {
|
|
23502
23606
|
capName: "pipeline-orchestrator",
|
|
23503
23607
|
capScope: "system",
|
|
@@ -23510,6 +23614,12 @@ Object.freeze({
|
|
|
23510
23614
|
addonId: null,
|
|
23511
23615
|
access: "view"
|
|
23512
23616
|
},
|
|
23617
|
+
"pipelineOrchestrator.getPipelineDevicePin": {
|
|
23618
|
+
capName: "pipeline-orchestrator",
|
|
23619
|
+
capScope: "system",
|
|
23620
|
+
addonId: null,
|
|
23621
|
+
access: "view"
|
|
23622
|
+
},
|
|
23513
23623
|
"pipelineOrchestrator.listAgentSettings": {
|
|
23514
23624
|
capName: "pipeline-orchestrator",
|
|
23515
23625
|
capScope: "system",
|
|
@@ -23552,19 +23662,19 @@ Object.freeze({
|
|
|
23552
23662
|
addonId: null,
|
|
23553
23663
|
access: "create"
|
|
23554
23664
|
},
|
|
23555
|
-
"pipelineOrchestrator.
|
|
23665
|
+
"pipelineOrchestrator.setAgentCapabilities": {
|
|
23556
23666
|
capName: "pipeline-orchestrator",
|
|
23557
23667
|
capScope: "system",
|
|
23558
23668
|
addonId: null,
|
|
23559
23669
|
access: "create"
|
|
23560
23670
|
},
|
|
23561
|
-
"pipelineOrchestrator.
|
|
23671
|
+
"pipelineOrchestrator.setAgentDetectWeight": {
|
|
23562
23672
|
capName: "pipeline-orchestrator",
|
|
23563
23673
|
capScope: "system",
|
|
23564
23674
|
addonId: null,
|
|
23565
23675
|
access: "create"
|
|
23566
23676
|
},
|
|
23567
|
-
"pipelineOrchestrator.
|
|
23677
|
+
"pipelineOrchestrator.setAgentInferenceDevices": {
|
|
23568
23678
|
capName: "pipeline-orchestrator",
|
|
23569
23679
|
capScope: "system",
|
|
23570
23680
|
addonId: null,
|
|
@@ -23606,6 +23716,12 @@ Object.freeze({
|
|
|
23606
23716
|
addonId: null,
|
|
23607
23717
|
access: "create"
|
|
23608
23718
|
},
|
|
23719
|
+
"pipelineOrchestrator.setPipelineDevicePin": {
|
|
23720
|
+
capName: "pipeline-orchestrator",
|
|
23721
|
+
capScope: "system",
|
|
23722
|
+
addonId: null,
|
|
23723
|
+
access: "create"
|
|
23724
|
+
},
|
|
23609
23725
|
"pipelineOrchestrator.unassignAudio": {
|
|
23610
23726
|
capName: "pipeline-orchestrator",
|
|
23611
23727
|
capScope: "system",
|
|
@@ -25158,32 +25274,6 @@ Object.freeze({
|
|
|
25158
25274
|
"network-access": "ingress",
|
|
25159
25275
|
"smtp-provider": "email"
|
|
25160
25276
|
});
|
|
25161
|
-
var frameworkSwapPackageSchema = object({
|
|
25162
|
-
name: string(),
|
|
25163
|
-
stagedPath: string(),
|
|
25164
|
-
backupPath: string(),
|
|
25165
|
-
toVersion: string(),
|
|
25166
|
-
fromVersion: string().nullable()
|
|
25167
|
-
});
|
|
25168
|
-
object({
|
|
25169
|
-
jobId: string(),
|
|
25170
|
-
taskId: string(),
|
|
25171
|
-
packages: array(frameworkSwapPackageSchema),
|
|
25172
|
-
requestedAtMs: number(),
|
|
25173
|
-
schemaVersion: literal(1)
|
|
25174
|
-
});
|
|
25175
|
-
object({
|
|
25176
|
-
jobId: string(),
|
|
25177
|
-
taskId: string(),
|
|
25178
|
-
backups: array(object({
|
|
25179
|
-
name: string(),
|
|
25180
|
-
backupPath: string(),
|
|
25181
|
-
livePath: string()
|
|
25182
|
-
})),
|
|
25183
|
-
appliedAtMs: number(),
|
|
25184
|
-
bootAttempts: number(),
|
|
25185
|
-
schemaVersion: literal(1)
|
|
25186
|
-
});
|
|
25187
25277
|
//#endregion
|
|
25188
25278
|
//#region src/static-turn.addon.ts
|
|
25189
25279
|
/**
|
|
@@ -7067,6 +7067,17 @@ var ModelCatalogEntrySchema = object({
|
|
|
7067
7067
|
"imagenet",
|
|
7068
7068
|
"none"
|
|
7069
7069
|
]).optional(),
|
|
7070
|
+
/**
|
|
7071
|
+
* The model already applies softmax IN-GRAPH — its raw output is a
|
|
7072
|
+
* probability distribution, not logits. When set, the `softmax`
|
|
7073
|
+
* postprocessor must NOT re-apply softmax: re-softmaxing an already-normalised
|
|
7074
|
+
* probability vector collapses it toward uniform (top-1 score craters far
|
|
7075
|
+
* below its true value, making every confidence gate meaningless). Absent ⇒
|
|
7076
|
+
* the output is raw logits and the postprocessor applies softmax (the normal
|
|
7077
|
+
* case). Set on the Google AIY Birds `bird-classifier` (softmax baked into the
|
|
7078
|
+
* TF graph). Threaded to the Python pool via `PoolModelConfig.outputProbabilities`.
|
|
7079
|
+
*/
|
|
7080
|
+
outputProbabilities: boolean().optional(),
|
|
7070
7081
|
preprocessMode: _enum(["letterbox", "resize"]).optional(),
|
|
7071
7082
|
/**
|
|
7072
7083
|
* Per-MODEL postprocessor override. Absent ⇒ the step's own
|
|
@@ -11080,10 +11091,7 @@ var ConfigUISchemaNullableBridge = custom();
|
|
|
11080
11091
|
var InferenceCapabilitiesBridge = custom();
|
|
11081
11092
|
var ModelAvailabilityListBridge = custom();
|
|
11082
11093
|
var PipelineRunResultBridge = custom();
|
|
11083
|
-
method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(),
|
|
11084
|
-
kind: "mutation",
|
|
11085
|
-
auth: "admin"
|
|
11086
|
-
}), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
|
|
11094
|
+
method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
|
|
11087
11095
|
modelId: string(),
|
|
11088
11096
|
settings: record(string(), unknown()).readonly()
|
|
11089
11097
|
}))), method(object({ steps: record(string(), object({
|
|
@@ -11143,13 +11151,33 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
11143
11151
|
* (inputClasses ≠ null) are skipped and served per-track via
|
|
11144
11152
|
* pipelineRunner.runDetailSubtree (two-plane design).
|
|
11145
11153
|
*/
|
|
11146
|
-
plane: _enum(["full", "frame"]).optional()
|
|
11154
|
+
plane: _enum(["full", "frame"]).optional(),
|
|
11155
|
+
/**
|
|
11156
|
+
* Inference-device selector (Phase 2 multi-device). Format
|
|
11157
|
+
* `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`).
|
|
11158
|
+
* Omitted ⇒ the runner's default device (current single-engine
|
|
11159
|
+
* behaviour). Selects WHICH device pool of the node runs the call.
|
|
11160
|
+
*/
|
|
11161
|
+
deviceKey: string().optional()
|
|
11147
11162
|
}), PipelineRunResultBridge, { kind: "mutation" }), method(object({
|
|
11148
11163
|
engine: PipelineEngineChoiceSchema.optional(),
|
|
11149
11164
|
steps: array(PipelineStepInputSchema).min(1),
|
|
11150
11165
|
frames: array(FrameInputSchema).min(1).max(255),
|
|
11151
11166
|
deviceId: number().optional(),
|
|
11152
|
-
sessionId: string().optional()
|
|
11167
|
+
sessionId: string().optional(),
|
|
11168
|
+
/**
|
|
11169
|
+
* Pure-inference benchmark hint. A NONZERO uint32 pins every frame in
|
|
11170
|
+
* the batch to the Python pool's bench preprocess cache
|
|
11171
|
+
* (`_bench_frame_id`) so a REPEATED benchmark frame is decoded +
|
|
11172
|
+
* preprocessed ONCE and every later inference is a pure-inference cache
|
|
11173
|
+
* hit — the sustained-throughput run measures inference, not
|
|
11174
|
+
* decode+preprocess+infer. Omitted/0 for live frames (all different →
|
|
11175
|
+
* full preprocess every call, correct). Fresh per sustained run;
|
|
11176
|
+
* released via `uncacheFrame`.
|
|
11177
|
+
*/
|
|
11178
|
+
frameId: number().int().nonnegative().optional(),
|
|
11179
|
+
/** Inference-device selector (Phase 2 multi-device); see runPipeline. */
|
|
11180
|
+
deviceKey: string().optional()
|
|
11153
11181
|
}), object({ results: array(PipelineRunResultBridge).readonly() }), { kind: "mutation" }), method(object({
|
|
11154
11182
|
data: _instanceof(Uint8Array),
|
|
11155
11183
|
width: number().int().positive(),
|
|
@@ -11181,8 +11209,18 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
|
|
|
11181
11209
|
* - `runtime` — main camera-serving engine (no idle TTL).
|
|
11182
11210
|
* - `warm-override` — benchmark/test override held in the warm
|
|
11183
11211
|
* cache; auto-disposed after the idle TTL.
|
|
11212
|
+
* - `device-pool` — a concurrent per-device pool (Phase 2
|
|
11213
|
+
* multi-device, keyed by `deviceKey`) resolved
|
|
11214
|
+
* via `resolveDeviceFactory`. Runs alongside the
|
|
11215
|
+
* `runtime` engine on a DIFFERENT accelerator
|
|
11216
|
+
* (NPU / iGPU / Coral) — this is how the
|
|
11217
|
+
* Engines tab shows all pools running at once.
|
|
11184
11218
|
*/
|
|
11185
|
-
kind: _enum([
|
|
11219
|
+
kind: _enum([
|
|
11220
|
+
"runtime",
|
|
11221
|
+
"warm-override",
|
|
11222
|
+
"device-pool"
|
|
11223
|
+
]),
|
|
11186
11224
|
/** Native pid of the underlying Python pool (null when no pool). */
|
|
11187
11225
|
poolPid: number().nullable(),
|
|
11188
11226
|
/** ms since this factory was last used (null when not warm-tracked). */
|
|
@@ -11524,7 +11562,14 @@ var RunnerCameraConfigSchema = object({
|
|
|
11524
11562
|
* camera's detect node differs from its source-owner (P2d, gated by the
|
|
11525
11563
|
* `remoteSourcingNodes` rollout setting).
|
|
11526
11564
|
*/
|
|
11527
|
-
frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
|
|
11565
|
+
frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" }),
|
|
11566
|
+
/**
|
|
11567
|
+
* Inference-device selector for this camera's sessions (Phase 2 multi-device).
|
|
11568
|
+
* Format `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`);
|
|
11569
|
+
* omitted ⇒ the runner's default device. The engine itself stays node-local —
|
|
11570
|
+
* this only selects WHICH device pool of that node runs the session.
|
|
11571
|
+
*/
|
|
11572
|
+
deviceKey: string().optional()
|
|
11528
11573
|
});
|
|
11529
11574
|
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;
|
|
11530
11575
|
/**
|
|
@@ -11545,6 +11590,19 @@ var RunnerLocalLoadSchema = object({
|
|
|
11545
11590
|
avgInferenceTimeMs: number(),
|
|
11546
11591
|
/** Total queue depth across motion + detection queues. */
|
|
11547
11592
|
queueDepthTotal: number(),
|
|
11593
|
+
/**
|
|
11594
|
+
* Per-inference-device live load (multi-device C4). One entry per deviceKey
|
|
11595
|
+
* this runner currently has attached cameras on, so the orchestrator's second
|
|
11596
|
+
* `balance()` pass (over a node's devices) weights on real per-pool session
|
|
11597
|
+
* counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
|
|
11598
|
+
* per device is 0 until the pool backlog gets a public accessor (follow-up).
|
|
11599
|
+
*/
|
|
11600
|
+
devices: array(object({
|
|
11601
|
+
deviceKey: string(),
|
|
11602
|
+
backend: string(),
|
|
11603
|
+
attachedCameras: number(),
|
|
11604
|
+
queueDepthTotal: number()
|
|
11605
|
+
})).default([]),
|
|
11548
11606
|
/** Hardware capability flags reported by this node. */
|
|
11549
11607
|
hardware: object({
|
|
11550
11608
|
hasGpu: boolean(),
|
|
@@ -13020,6 +13078,8 @@ method(_void(), _void(), { kind: "mutation" }), method(_void(), _void(), { kind:
|
|
|
13020
13078
|
kind: "mutation",
|
|
13021
13079
|
auth: "admin"
|
|
13022
13080
|
});
|
|
13081
|
+
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;
|
|
13082
|
+
new Set(Object.values(DeviceType));
|
|
13023
13083
|
/**
|
|
13024
13084
|
* `addon-pages` — system-scoped singleton aggregator cap. Public-facing
|
|
13025
13085
|
* surface that admin-ui consumes through `useAddonPagesListPages()`.
|
|
@@ -16689,13 +16749,11 @@ var PipelineTemplateSchema = object({
|
|
|
16689
16749
|
createdAt: string(),
|
|
16690
16750
|
updatedAt: string()
|
|
16691
16751
|
});
|
|
16692
|
-
var
|
|
16693
|
-
enabled: boolean(),
|
|
16752
|
+
var DeviceStepConfigSchema = object({
|
|
16694
16753
|
modelId: string().optional(),
|
|
16695
|
-
settings: record(string(), unknown()).
|
|
16754
|
+
settings: record(string(), unknown()).optional()
|
|
16696
16755
|
});
|
|
16697
16756
|
var AgentPipelineSettingsSchema = object({
|
|
16698
|
-
addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
|
|
16699
16757
|
maxCameras: number().int().nonnegative().nullable().default(null),
|
|
16700
16758
|
/** Per-node detection weight (relative share for the quota balancer). */
|
|
16701
16759
|
detectWeight: number().positive().optional(),
|
|
@@ -16719,7 +16777,22 @@ var AgentPipelineSettingsSchema = object({
|
|
|
16719
16777
|
* it already uses to reach the hub). Set this only when the auto-detected
|
|
16720
16778
|
* address is wrong (multi-homed host, NAT, custom interface).
|
|
16721
16779
|
*/
|
|
16722
|
-
reachableHost: string().optional()
|
|
16780
|
+
reachableHost: string().optional(),
|
|
16781
|
+
/**
|
|
16782
|
+
* Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
|
|
16783
|
+
* weight, steps}. Absent / all-disabled ⇒ the node's single default
|
|
16784
|
+
* accelerator (safe default); two+ enabled ⇒ the dispatcher balances
|
|
16785
|
+
* detection sessions across them so they run CONCURRENTLY. `steps` is the
|
|
16786
|
+
* per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
|
|
16787
|
+
* the default model/settings for every camera landing on that accelerator;
|
|
16788
|
+
* a stepId absent ⇒ the step uses that device's format default.
|
|
16789
|
+
*/
|
|
16790
|
+
inferenceDevices: record(string(), object({
|
|
16791
|
+
enabled: boolean(),
|
|
16792
|
+
weight: number().positive().optional(),
|
|
16793
|
+
maxSessions: number().int().positive().optional(),
|
|
16794
|
+
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
16795
|
+
})).optional()
|
|
16723
16796
|
});
|
|
16724
16797
|
var CameraPipelineForAgentSchema = object({
|
|
16725
16798
|
steps: array(PipelineStepInputSchema).readonly(),
|
|
@@ -16729,14 +16802,13 @@ var CameraPipelineForAgentSchema = object({
|
|
|
16729
16802
|
}).nullable()
|
|
16730
16803
|
});
|
|
16731
16804
|
var CameraStepOverridePatchSchema = object({
|
|
16732
|
-
enabled: boolean().optional(),
|
|
16733
16805
|
modelId: string().optional(),
|
|
16734
16806
|
settings: record(string(), unknown()).readonly().optional()
|
|
16735
16807
|
});
|
|
16736
16808
|
var CameraPipelineSettingsSchema = object({
|
|
16737
16809
|
pinnedAgentNodeId: string().optional(),
|
|
16738
16810
|
stepToggles: record(string(), boolean()).optional(),
|
|
16739
|
-
|
|
16811
|
+
stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
|
|
16740
16812
|
pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
|
|
16741
16813
|
});
|
|
16742
16814
|
/**
|
|
@@ -16950,6 +17022,44 @@ var CameraStatusSchema = object({
|
|
|
16950
17022
|
/** Unix timestamp (ms) when this snapshot was composed server-side. */
|
|
16951
17023
|
fetchedAt: number()
|
|
16952
17024
|
});
|
|
17025
|
+
var NodeInferenceDeviceSchema = object({
|
|
17026
|
+
/** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
|
|
17027
|
+
key: string(),
|
|
17028
|
+
backend: string(),
|
|
17029
|
+
device: string(),
|
|
17030
|
+
format: _enum(MODEL_FORMATS),
|
|
17031
|
+
/** Whether the node's live probe reports the device as usable right now. */
|
|
17032
|
+
available: boolean(),
|
|
17033
|
+
/**
|
|
17034
|
+
* Whether this device participates in dispatch. AUTO default (spec C2):
|
|
17035
|
+
* accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
|
|
17036
|
+
* entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
|
|
17037
|
+
* not a balanced target). An explicit stored value always wins; a stored-only
|
|
17038
|
+
* (unavailable) key keeps its stored value.
|
|
17039
|
+
*/
|
|
17040
|
+
enabled: boolean(),
|
|
17041
|
+
/** Relative balancer weight for the enabled device (default 1). */
|
|
17042
|
+
weight: number(),
|
|
17043
|
+
/** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
|
|
17044
|
+
maxSessions: number().nullable(),
|
|
17045
|
+
/** Object-detection model the executor defaults to for this deviceKey. */
|
|
17046
|
+
defaultModelId: string(),
|
|
17047
|
+
/**
|
|
17048
|
+
* Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
|
|
17049
|
+
* `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
|
|
17050
|
+
* Absent/empty ⇒ no base (every step uses its device format default). The
|
|
17051
|
+
* UI cross-references `pipelineExecutor.getSchema` for the models actually
|
|
17052
|
+
* available per format; this is the stored selection that becomes the
|
|
17053
|
+
* default for EVERY camera landing on this accelerator.
|
|
17054
|
+
*/
|
|
17055
|
+
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
17056
|
+
});
|
|
17057
|
+
var NodeInferenceDevicesSchema = object({
|
|
17058
|
+
nodeId: string(),
|
|
17059
|
+
/** False when the node's platform-probe was unreachable (no live device set). */
|
|
17060
|
+
reachable: boolean(),
|
|
17061
|
+
devices: array(NodeInferenceDeviceSchema).readonly()
|
|
17062
|
+
});
|
|
16953
17063
|
method(object({
|
|
16954
17064
|
deviceId: number(),
|
|
16955
17065
|
agentNodeId: string()
|
|
@@ -16959,7 +17069,13 @@ method(object({
|
|
|
16959
17069
|
}), method(object({ deviceId: number() }), object({ success: literal(true) }), {
|
|
16960
17070
|
kind: "mutation",
|
|
16961
17071
|
auth: "admin"
|
|
16962
|
-
}), method(
|
|
17072
|
+
}), method(object({
|
|
17073
|
+
deviceId: number(),
|
|
17074
|
+
deviceKey: string()
|
|
17075
|
+
}), object({ success: literal(true) }), {
|
|
17076
|
+
kind: "mutation",
|
|
17077
|
+
auth: "admin"
|
|
17078
|
+
}), method(object({ deviceId: number() }), object({ deviceKey: string().nullable() })), method(_void(), object({ migrated: number() }), {
|
|
16963
17079
|
kind: "mutation",
|
|
16964
17080
|
auth: "admin"
|
|
16965
17081
|
}), 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({
|
|
@@ -16993,13 +17109,7 @@ method(object({
|
|
|
16993
17109
|
}))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
|
|
16994
17110
|
nodeId: string(),
|
|
16995
17111
|
settings: AgentPipelineSettingsSchema
|
|
16996
|
-
})).readonly()), method(object({
|
|
16997
|
-
agentNodeId: string(),
|
|
16998
|
-
defaults: record(string(), AgentAddonConfigSchema)
|
|
16999
|
-
}), object({ success: literal(true) }), {
|
|
17000
|
-
kind: "mutation",
|
|
17001
|
-
auth: "admin"
|
|
17002
|
-
}), method(object({ agentNodeId: string() }), object({
|
|
17112
|
+
})).readonly()), method(object({ agentNodeId: string() }), object({
|
|
17003
17113
|
success: boolean(),
|
|
17004
17114
|
removed: boolean()
|
|
17005
17115
|
}), {
|
|
@@ -17031,7 +17141,18 @@ method(object({
|
|
|
17031
17141
|
}), object({ success: literal(true) }), {
|
|
17032
17142
|
kind: "mutation",
|
|
17033
17143
|
auth: "admin"
|
|
17034
|
-
}), method(object({
|
|
17144
|
+
}), method(object({
|
|
17145
|
+
agentNodeId: string(),
|
|
17146
|
+
inferenceDevices: record(string(), object({
|
|
17147
|
+
enabled: boolean(),
|
|
17148
|
+
weight: number().positive().optional(),
|
|
17149
|
+
maxSessions: number().int().positive().optional(),
|
|
17150
|
+
steps: record(string(), DeviceStepConfigSchema).optional()
|
|
17151
|
+
}))
|
|
17152
|
+
}), object({ success: literal(true) }), {
|
|
17153
|
+
kind: "mutation",
|
|
17154
|
+
auth: "admin"
|
|
17155
|
+
}), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
|
|
17035
17156
|
success: literal(true),
|
|
17036
17157
|
/** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
|
|
17037
17158
|
effectiveModelId: string().nullable(),
|
|
@@ -17047,9 +17168,10 @@ method(object({
|
|
|
17047
17168
|
}), object({ success: literal(true) }), {
|
|
17048
17169
|
kind: "mutation",
|
|
17049
17170
|
auth: "admin"
|
|
17050
|
-
}), method(object({ deviceId: number() }), record(string(), record(string(), CameraStepOverridePatchSchema)).nullable()), method(object({
|
|
17171
|
+
}), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
|
|
17051
17172
|
deviceId: number(),
|
|
17052
17173
|
agentNodeId: string(),
|
|
17174
|
+
deviceKey: string(),
|
|
17053
17175
|
addonId: string(),
|
|
17054
17176
|
patch: CameraStepOverridePatchSchema.nullable()
|
|
17055
17177
|
}), object({ success: literal(true) }), {
|
|
@@ -17086,14 +17208,13 @@ method(object({
|
|
|
17086
17208
|
});
|
|
17087
17209
|
/**
|
|
17088
17210
|
* server-management — per-NODE singleton capability for a node's ROOT
|
|
17089
|
-
* package lifecycle (runtime-updatable node packages
|
|
17090
|
-
* agents).
|
|
17211
|
+
* package lifecycle (runtime-updatable node packages).
|
|
17091
17212
|
*
|
|
17092
|
-
*
|
|
17093
|
-
*
|
|
17094
|
-
*
|
|
17095
|
-
*
|
|
17096
|
-
*
|
|
17213
|
+
* Every node role runs the SAME root package (`@camstack/server`), which
|
|
17214
|
+
* carries the whole software stack in its npm dep tree, so ONE version
|
|
17215
|
+
* describes the node. Updates stage into `<dataDir>/server-root/` and apply
|
|
17216
|
+
* on restart via the baked starter (single-copy in-place swap — no probation,
|
|
17217
|
+
* no auto-rollback).
|
|
17097
17218
|
*
|
|
17098
17219
|
* Providers:
|
|
17099
17220
|
* - HUB: `ServerUpdateService` behind the `server-provided` mount
|
|
@@ -17201,7 +17322,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
|
|
|
17201
17322
|
/** Explicit target version; omitted = latest from the registry. */
|
|
17202
17323
|
version: string().optional() }), ServerUpdateActionResultSchema, {
|
|
17203
17324
|
kind: "mutation",
|
|
17204
|
-
auth: "admin"
|
|
17325
|
+
auth: "admin",
|
|
17326
|
+
timeoutMs: 16 * 6e4
|
|
17205
17327
|
}), method(_void(), ServerUpdateActionResultSchema, {
|
|
17206
17328
|
kind: "mutation",
|
|
17207
17329
|
auth: "admin"
|
|
@@ -18268,22 +18390,6 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
|
|
|
18268
18390
|
var RestartAddonResultSchema = unknown();
|
|
18269
18391
|
var InstallPackageResultSchema = unknown();
|
|
18270
18392
|
var ReloadPackagesResultSchema = unknown();
|
|
18271
|
-
/**
|
|
18272
|
-
* Result of `updateFrameworkPackage`. The cap method returns BEFORE the
|
|
18273
|
-
* server restarts so the admin UI can react to the `restartingAt`
|
|
18274
|
-
* timestamp (shows reconnect overlay). The transition from
|
|
18275
|
-
* `fromVersion` to `toVersion` will be confirmed by a subsequent
|
|
18276
|
-
* `system.restart-completed` event after the new process boots.
|
|
18277
|
-
*
|
|
18278
|
-
* Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
|
|
18279
|
-
*/
|
|
18280
|
-
var UpdateFrameworkPackageResultSchema = object({
|
|
18281
|
-
packageName: string(),
|
|
18282
|
-
fromVersion: string(),
|
|
18283
|
-
toVersion: string(),
|
|
18284
|
-
/** Ms-epoch the server scheduled its self-restart. */
|
|
18285
|
-
restartingAt: number()
|
|
18286
|
-
});
|
|
18287
18393
|
var BulkUpdateItemStatusSchema = _enum([
|
|
18288
18394
|
"queued",
|
|
18289
18395
|
"updating",
|
|
@@ -18411,13 +18517,6 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
|
|
|
18411
18517
|
}), object({ success: literal(true) }), {
|
|
18412
18518
|
kind: "mutation",
|
|
18413
18519
|
auth: "admin"
|
|
18414
|
-
}), method(object({
|
|
18415
|
-
packageName: string().min(1),
|
|
18416
|
-
version: string().optional(),
|
|
18417
|
-
deferRestart: boolean().optional()
|
|
18418
|
-
}), UpdateFrameworkPackageResultSchema, {
|
|
18419
|
-
kind: "mutation",
|
|
18420
|
-
auth: "admin"
|
|
18421
18520
|
}), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
|
|
18422
18521
|
kind: "mutation",
|
|
18423
18522
|
auth: "admin"
|
|
@@ -19283,10 +19382,10 @@ var TopologyCategorySchema = object({
|
|
|
19283
19382
|
addons: array(TopologyCategoryAddonSchema).readonly()
|
|
19284
19383
|
});
|
|
19285
19384
|
/**
|
|
19286
|
-
* The node's runtime-updatable ROOT package (`@camstack/server`
|
|
19287
|
-
*
|
|
19288
|
-
* version visibility for the Server management surface. Nullable:
|
|
19289
|
-
* rows and
|
|
19385
|
+
* The node's runtime-updatable ROOT package (`@camstack/server` — the single
|
|
19386
|
+
* root package for every node role) as reported by its `registerNode`
|
|
19387
|
+
* manifest — version visibility for the Server management surface. Nullable:
|
|
19388
|
+
* offline rows and nodes that never reported one.
|
|
19290
19389
|
*/
|
|
19291
19390
|
var TopologyRootPackageSchema = object({
|
|
19292
19391
|
name: string(),
|
|
@@ -19674,17 +19773,28 @@ var PlatformScoreSchema = object({
|
|
|
19674
19773
|
format: _enum([
|
|
19675
19774
|
"onnx",
|
|
19676
19775
|
"coreml",
|
|
19677
|
-
"openvino"
|
|
19776
|
+
"openvino",
|
|
19777
|
+
"tflite"
|
|
19678
19778
|
]),
|
|
19679
19779
|
score: number(),
|
|
19680
19780
|
reason: string(),
|
|
19681
19781
|
available: boolean()
|
|
19682
19782
|
});
|
|
19783
|
+
var InferenceDeviceDescriptorSchema = object({
|
|
19784
|
+
key: string(),
|
|
19785
|
+
backend: string(),
|
|
19786
|
+
device: string(),
|
|
19787
|
+
format: ModelFormatSchema,
|
|
19788
|
+
runtime: literal("python"),
|
|
19789
|
+
score: number(),
|
|
19790
|
+
available: boolean()
|
|
19791
|
+
});
|
|
19683
19792
|
var PlatformCapabilitiesSchema = object({
|
|
19684
19793
|
hardware: HardwareInfoSchema,
|
|
19685
19794
|
scores: array(PlatformScoreSchema).readonly(),
|
|
19686
19795
|
bestScore: PlatformScoreSchema,
|
|
19687
|
-
pythonPath: string().nullable()
|
|
19796
|
+
pythonPath: string().nullable(),
|
|
19797
|
+
devices: array(InferenceDeviceDescriptorSchema).readonly()
|
|
19688
19798
|
});
|
|
19689
19799
|
var ModelRequirementSchema = object({
|
|
19690
19800
|
modelId: string(),
|
|
@@ -20563,12 +20673,6 @@ Object.freeze({
|
|
|
20563
20673
|
addonId: null,
|
|
20564
20674
|
access: "delete"
|
|
20565
20675
|
},
|
|
20566
|
-
"addons.updateFrameworkPackage": {
|
|
20567
|
-
capName: "addons",
|
|
20568
|
-
capScope: "system",
|
|
20569
|
-
addonId: null,
|
|
20570
|
-
access: "create"
|
|
20571
|
-
},
|
|
20572
20676
|
"addons.updatePackage": {
|
|
20573
20677
|
capName: "addons",
|
|
20574
20678
|
capScope: "system",
|
|
@@ -23341,12 +23445,6 @@ Object.freeze({
|
|
|
23341
23445
|
addonId: null,
|
|
23342
23446
|
access: "view"
|
|
23343
23447
|
},
|
|
23344
|
-
"pipelineExecutor.reprobeEngine": {
|
|
23345
|
-
capName: "pipeline-executor",
|
|
23346
|
-
capScope: "system",
|
|
23347
|
-
addonId: null,
|
|
23348
|
-
access: "create"
|
|
23349
|
-
},
|
|
23350
23448
|
"pipelineExecutor.runAudioTest": {
|
|
23351
23449
|
capName: "pipeline-executor",
|
|
23352
23450
|
capScope: "system",
|
|
@@ -23497,6 +23595,12 @@ Object.freeze({
|
|
|
23497
23595
|
addonId: null,
|
|
23498
23596
|
access: "view"
|
|
23499
23597
|
},
|
|
23598
|
+
"pipelineOrchestrator.getNodeInferenceDevices": {
|
|
23599
|
+
capName: "pipeline-orchestrator",
|
|
23600
|
+
capScope: "system",
|
|
23601
|
+
addonId: null,
|
|
23602
|
+
access: "view"
|
|
23603
|
+
},
|
|
23500
23604
|
"pipelineOrchestrator.getPipelineAssignment": {
|
|
23501
23605
|
capName: "pipeline-orchestrator",
|
|
23502
23606
|
capScope: "system",
|
|
@@ -23509,6 +23613,12 @@ Object.freeze({
|
|
|
23509
23613
|
addonId: null,
|
|
23510
23614
|
access: "view"
|
|
23511
23615
|
},
|
|
23616
|
+
"pipelineOrchestrator.getPipelineDevicePin": {
|
|
23617
|
+
capName: "pipeline-orchestrator",
|
|
23618
|
+
capScope: "system",
|
|
23619
|
+
addonId: null,
|
|
23620
|
+
access: "view"
|
|
23621
|
+
},
|
|
23512
23622
|
"pipelineOrchestrator.listAgentSettings": {
|
|
23513
23623
|
capName: "pipeline-orchestrator",
|
|
23514
23624
|
capScope: "system",
|
|
@@ -23551,19 +23661,19 @@ Object.freeze({
|
|
|
23551
23661
|
addonId: null,
|
|
23552
23662
|
access: "create"
|
|
23553
23663
|
},
|
|
23554
|
-
"pipelineOrchestrator.
|
|
23664
|
+
"pipelineOrchestrator.setAgentCapabilities": {
|
|
23555
23665
|
capName: "pipeline-orchestrator",
|
|
23556
23666
|
capScope: "system",
|
|
23557
23667
|
addonId: null,
|
|
23558
23668
|
access: "create"
|
|
23559
23669
|
},
|
|
23560
|
-
"pipelineOrchestrator.
|
|
23670
|
+
"pipelineOrchestrator.setAgentDetectWeight": {
|
|
23561
23671
|
capName: "pipeline-orchestrator",
|
|
23562
23672
|
capScope: "system",
|
|
23563
23673
|
addonId: null,
|
|
23564
23674
|
access: "create"
|
|
23565
23675
|
},
|
|
23566
|
-
"pipelineOrchestrator.
|
|
23676
|
+
"pipelineOrchestrator.setAgentInferenceDevices": {
|
|
23567
23677
|
capName: "pipeline-orchestrator",
|
|
23568
23678
|
capScope: "system",
|
|
23569
23679
|
addonId: null,
|
|
@@ -23605,6 +23715,12 @@ Object.freeze({
|
|
|
23605
23715
|
addonId: null,
|
|
23606
23716
|
access: "create"
|
|
23607
23717
|
},
|
|
23718
|
+
"pipelineOrchestrator.setPipelineDevicePin": {
|
|
23719
|
+
capName: "pipeline-orchestrator",
|
|
23720
|
+
capScope: "system",
|
|
23721
|
+
addonId: null,
|
|
23722
|
+
access: "create"
|
|
23723
|
+
},
|
|
23608
23724
|
"pipelineOrchestrator.unassignAudio": {
|
|
23609
23725
|
capName: "pipeline-orchestrator",
|
|
23610
23726
|
capScope: "system",
|
|
@@ -25157,32 +25273,6 @@ Object.freeze({
|
|
|
25157
25273
|
"network-access": "ingress",
|
|
25158
25274
|
"smtp-provider": "email"
|
|
25159
25275
|
});
|
|
25160
|
-
var frameworkSwapPackageSchema = object({
|
|
25161
|
-
name: string(),
|
|
25162
|
-
stagedPath: string(),
|
|
25163
|
-
backupPath: string(),
|
|
25164
|
-
toVersion: string(),
|
|
25165
|
-
fromVersion: string().nullable()
|
|
25166
|
-
});
|
|
25167
|
-
object({
|
|
25168
|
-
jobId: string(),
|
|
25169
|
-
taskId: string(),
|
|
25170
|
-
packages: array(frameworkSwapPackageSchema),
|
|
25171
|
-
requestedAtMs: number(),
|
|
25172
|
-
schemaVersion: literal(1)
|
|
25173
|
-
});
|
|
25174
|
-
object({
|
|
25175
|
-
jobId: string(),
|
|
25176
|
-
taskId: string(),
|
|
25177
|
-
backups: array(object({
|
|
25178
|
-
name: string(),
|
|
25179
|
-
backupPath: string(),
|
|
25180
|
-
livePath: string()
|
|
25181
|
-
})),
|
|
25182
|
-
appliedAtMs: number(),
|
|
25183
|
-
bootAttempts: number(),
|
|
25184
|
-
schemaVersion: literal(1)
|
|
25185
|
-
});
|
|
25186
25276
|
//#endregion
|
|
25187
25277
|
//#region src/static-turn.addon.ts
|
|
25188
25278
|
/**
|