@camstack/addon-cloudflare 1.1.29 → 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.
@@ -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(), PipelineEngineChoiceSchema, {
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(["runtime", "warm-override"]),
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()`.
@@ -16727,13 +16787,11 @@ var PipelineTemplateSchema = object({
16727
16787
  createdAt: string(),
16728
16788
  updatedAt: string()
16729
16789
  });
16730
- var AgentAddonConfigSchema = object({
16731
- enabled: boolean(),
16790
+ var DeviceStepConfigSchema = object({
16732
16791
  modelId: string().optional(),
16733
- settings: record(string(), unknown()).readonly()
16792
+ settings: record(string(), unknown()).optional()
16734
16793
  });
16735
16794
  var AgentPipelineSettingsSchema = object({
16736
- addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
16737
16795
  maxCameras: number().int().nonnegative().nullable().default(null),
16738
16796
  /** Per-node detection weight (relative share for the quota balancer). */
16739
16797
  detectWeight: number().positive().optional(),
@@ -16757,7 +16815,22 @@ var AgentPipelineSettingsSchema = object({
16757
16815
  * it already uses to reach the hub). Set this only when the auto-detected
16758
16816
  * address is wrong (multi-homed host, NAT, custom interface).
16759
16817
  */
16760
- reachableHost: string().optional()
16818
+ reachableHost: string().optional(),
16819
+ /**
16820
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
16821
+ * weight, steps}. Absent / all-disabled ⇒ the node's single default
16822
+ * accelerator (safe default); two+ enabled ⇒ the dispatcher balances
16823
+ * detection sessions across them so they run CONCURRENTLY. `steps` is the
16824
+ * per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
16825
+ * the default model/settings for every camera landing on that accelerator;
16826
+ * a stepId absent ⇒ the step uses that device's format default.
16827
+ */
16828
+ inferenceDevices: record(string(), object({
16829
+ enabled: boolean(),
16830
+ weight: number().positive().optional(),
16831
+ maxSessions: number().int().positive().optional(),
16832
+ steps: record(string(), DeviceStepConfigSchema).optional()
16833
+ })).optional()
16761
16834
  });
16762
16835
  var CameraPipelineForAgentSchema = object({
16763
16836
  steps: array(PipelineStepInputSchema).readonly(),
@@ -16767,14 +16840,13 @@ var CameraPipelineForAgentSchema = object({
16767
16840
  }).nullable()
16768
16841
  });
16769
16842
  var CameraStepOverridePatchSchema = object({
16770
- enabled: boolean().optional(),
16771
16843
  modelId: string().optional(),
16772
16844
  settings: record(string(), unknown()).readonly().optional()
16773
16845
  });
16774
16846
  var CameraPipelineSettingsSchema = object({
16775
16847
  pinnedAgentNodeId: string().optional(),
16776
16848
  stepToggles: record(string(), boolean()).optional(),
16777
- stepOverridesByAgent: record(string(), record(string(), CameraStepOverridePatchSchema)).optional(),
16849
+ stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
16778
16850
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
16779
16851
  });
16780
16852
  /**
@@ -16988,6 +17060,44 @@ var CameraStatusSchema = object({
16988
17060
  /** Unix timestamp (ms) when this snapshot was composed server-side. */
16989
17061
  fetchedAt: number()
16990
17062
  });
17063
+ var NodeInferenceDeviceSchema = object({
17064
+ /** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
17065
+ key: string(),
17066
+ backend: string(),
17067
+ device: string(),
17068
+ format: _enum(MODEL_FORMATS),
17069
+ /** Whether the node's live probe reports the device as usable right now. */
17070
+ available: boolean(),
17071
+ /**
17072
+ * Whether this device participates in dispatch. AUTO default (spec C2):
17073
+ * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
17074
+ * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
17075
+ * not a balanced target). An explicit stored value always wins; a stored-only
17076
+ * (unavailable) key keeps its stored value.
17077
+ */
17078
+ enabled: boolean(),
17079
+ /** Relative balancer weight for the enabled device (default 1). */
17080
+ weight: number(),
17081
+ /** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
17082
+ maxSessions: number().nullable(),
17083
+ /** Object-detection model the executor defaults to for this deviceKey. */
17084
+ defaultModelId: string(),
17085
+ /**
17086
+ * Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
17087
+ * `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
17088
+ * Absent/empty ⇒ no base (every step uses its device format default). The
17089
+ * UI cross-references `pipelineExecutor.getSchema` for the models actually
17090
+ * available per format; this is the stored selection that becomes the
17091
+ * default for EVERY camera landing on this accelerator.
17092
+ */
17093
+ steps: record(string(), DeviceStepConfigSchema).optional()
17094
+ });
17095
+ var NodeInferenceDevicesSchema = object({
17096
+ nodeId: string(),
17097
+ /** False when the node's platform-probe was unreachable (no live device set). */
17098
+ reachable: boolean(),
17099
+ devices: array(NodeInferenceDeviceSchema).readonly()
17100
+ });
16991
17101
  method(object({
16992
17102
  deviceId: number(),
16993
17103
  agentNodeId: string()
@@ -16997,7 +17107,13 @@ method(object({
16997
17107
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
16998
17108
  kind: "mutation",
16999
17109
  auth: "admin"
17000
- }), method(_void(), object({ migrated: number() }), {
17110
+ }), method(object({
17111
+ deviceId: number(),
17112
+ deviceKey: string()
17113
+ }), object({ success: literal(true) }), {
17114
+ kind: "mutation",
17115
+ auth: "admin"
17116
+ }), method(object({ deviceId: number() }), object({ deviceKey: string().nullable() })), method(_void(), object({ migrated: number() }), {
17001
17117
  kind: "mutation",
17002
17118
  auth: "admin"
17003
17119
  }), 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({
@@ -17031,13 +17147,7 @@ method(object({
17031
17147
  }))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
17032
17148
  nodeId: string(),
17033
17149
  settings: AgentPipelineSettingsSchema
17034
- })).readonly()), method(object({
17035
- agentNodeId: string(),
17036
- defaults: record(string(), AgentAddonConfigSchema)
17037
- }), object({ success: literal(true) }), {
17038
- kind: "mutation",
17039
- auth: "admin"
17040
- }), method(object({ agentNodeId: string() }), object({
17150
+ })).readonly()), method(object({ agentNodeId: string() }), object({
17041
17151
  success: boolean(),
17042
17152
  removed: boolean()
17043
17153
  }), {
@@ -17069,7 +17179,18 @@ method(object({
17069
17179
  }), object({ success: literal(true) }), {
17070
17180
  kind: "mutation",
17071
17181
  auth: "admin"
17072
- }), method(object({ agentNodeId: string() }), object({
17182
+ }), method(object({
17183
+ agentNodeId: string(),
17184
+ inferenceDevices: record(string(), object({
17185
+ enabled: boolean(),
17186
+ weight: number().positive().optional(),
17187
+ maxSessions: number().int().positive().optional(),
17188
+ steps: record(string(), DeviceStepConfigSchema).optional()
17189
+ }))
17190
+ }), object({ success: literal(true) }), {
17191
+ kind: "mutation",
17192
+ auth: "admin"
17193
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
17073
17194
  success: literal(true),
17074
17195
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
17075
17196
  effectiveModelId: string().nullable(),
@@ -17085,9 +17206,10 @@ method(object({
17085
17206
  }), object({ success: literal(true) }), {
17086
17207
  kind: "mutation",
17087
17208
  auth: "admin"
17088
- }), method(object({ deviceId: number() }), record(string(), record(string(), CameraStepOverridePatchSchema)).nullable()), method(object({
17209
+ }), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
17089
17210
  deviceId: number(),
17090
17211
  agentNodeId: string(),
17212
+ deviceKey: string(),
17091
17213
  addonId: string(),
17092
17214
  patch: CameraStepOverridePatchSchema.nullable()
17093
17215
  }), object({ success: literal(true) }), {
@@ -17124,14 +17246,13 @@ method(object({
17124
17246
  });
17125
17247
  /**
17126
17248
  * server-management — per-NODE singleton capability for a node's ROOT
17127
- * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
17128
- * agents).
17249
+ * package lifecycle (runtime-updatable node packages).
17129
17250
  *
17130
- * Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
17131
- * on agents) carries the whole software stack in its npm dep tree, so ONE
17132
- * version describes the node. Updates install into
17133
- * `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
17134
- * starter (probation boot + auto-rollback to N-1).
17251
+ * Every node role runs the SAME root package (`@camstack/server`), which
17252
+ * carries the whole software stack in its npm dep tree, so ONE version
17253
+ * describes the node. Updates stage into `<dataDir>/server-root/` and apply
17254
+ * on restart via the baked starter (single-copy in-place swap — no probation,
17255
+ * no auto-rollback).
17135
17256
  *
17136
17257
  * Providers:
17137
17258
  * - HUB: `ServerUpdateService` behind the `server-provided` mount
@@ -17239,7 +17360,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
17239
17360
  /** Explicit target version; omitted = latest from the registry. */
17240
17361
  version: string().optional() }), ServerUpdateActionResultSchema, {
17241
17362
  kind: "mutation",
17242
- auth: "admin"
17363
+ auth: "admin",
17364
+ timeoutMs: 16 * 6e4
17243
17365
  }), method(_void(), ServerUpdateActionResultSchema, {
17244
17366
  kind: "mutation",
17245
17367
  auth: "admin"
@@ -18306,22 +18428,6 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
18306
18428
  var RestartAddonResultSchema = unknown();
18307
18429
  var InstallPackageResultSchema = unknown();
18308
18430
  var ReloadPackagesResultSchema = unknown();
18309
- /**
18310
- * Result of `updateFrameworkPackage`. The cap method returns BEFORE the
18311
- * server restarts so the admin UI can react to the `restartingAt`
18312
- * timestamp (shows reconnect overlay). The transition from
18313
- * `fromVersion` to `toVersion` will be confirmed by a subsequent
18314
- * `system.restart-completed` event after the new process boots.
18315
- *
18316
- * Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
18317
- */
18318
- var UpdateFrameworkPackageResultSchema = object({
18319
- packageName: string(),
18320
- fromVersion: string(),
18321
- toVersion: string(),
18322
- /** Ms-epoch the server scheduled its self-restart. */
18323
- restartingAt: number()
18324
- });
18325
18431
  var BulkUpdateItemStatusSchema = _enum([
18326
18432
  "queued",
18327
18433
  "updating",
@@ -18449,13 +18555,6 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
18449
18555
  }), object({ success: literal(true) }), {
18450
18556
  kind: "mutation",
18451
18557
  auth: "admin"
18452
- }), method(object({
18453
- packageName: string().min(1),
18454
- version: string().optional(),
18455
- deferRestart: boolean().optional()
18456
- }), UpdateFrameworkPackageResultSchema, {
18457
- kind: "mutation",
18458
- auth: "admin"
18459
18558
  }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
18460
18559
  kind: "mutation",
18461
18560
  auth: "admin"
@@ -19321,10 +19420,10 @@ var TopologyCategorySchema = object({
19321
19420
  addons: array(TopologyCategoryAddonSchema).readonly()
19322
19421
  });
19323
19422
  /**
19324
- * The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
19325
- * `@camstack/agent` on agents) as reported by its `registerNode` manifest —
19326
- * version visibility for the Server management surface. Nullable: offline
19327
- * rows and pre-phase-2 nodes report none.
19423
+ * The node's runtime-updatable ROOT package (`@camstack/server` the single
19424
+ * root package for every node role) as reported by its `registerNode`
19425
+ * manifest — version visibility for the Server management surface. Nullable:
19426
+ * offline rows and nodes that never reported one.
19328
19427
  */
19329
19428
  var TopologyRootPackageSchema = object({
19330
19429
  name: string(),
@@ -19712,17 +19811,28 @@ var PlatformScoreSchema = object({
19712
19811
  format: _enum([
19713
19812
  "onnx",
19714
19813
  "coreml",
19715
- "openvino"
19814
+ "openvino",
19815
+ "tflite"
19716
19816
  ]),
19717
19817
  score: number(),
19718
19818
  reason: string(),
19719
19819
  available: boolean()
19720
19820
  });
19821
+ var InferenceDeviceDescriptorSchema = object({
19822
+ key: string(),
19823
+ backend: string(),
19824
+ device: string(),
19825
+ format: ModelFormatSchema,
19826
+ runtime: literal("python"),
19827
+ score: number(),
19828
+ available: boolean()
19829
+ });
19721
19830
  var PlatformCapabilitiesSchema = object({
19722
19831
  hardware: HardwareInfoSchema,
19723
19832
  scores: array(PlatformScoreSchema).readonly(),
19724
19833
  bestScore: PlatformScoreSchema,
19725
- pythonPath: string().nullable()
19834
+ pythonPath: string().nullable(),
19835
+ devices: array(InferenceDeviceDescriptorSchema).readonly()
19726
19836
  });
19727
19837
  var ModelRequirementSchema = object({
19728
19838
  modelId: string(),
@@ -20601,12 +20711,6 @@ Object.freeze({
20601
20711
  addonId: null,
20602
20712
  access: "delete"
20603
20713
  },
20604
- "addons.updateFrameworkPackage": {
20605
- capName: "addons",
20606
- capScope: "system",
20607
- addonId: null,
20608
- access: "create"
20609
- },
20610
20714
  "addons.updatePackage": {
20611
20715
  capName: "addons",
20612
20716
  capScope: "system",
@@ -23379,12 +23483,6 @@ Object.freeze({
23379
23483
  addonId: null,
23380
23484
  access: "view"
23381
23485
  },
23382
- "pipelineExecutor.reprobeEngine": {
23383
- capName: "pipeline-executor",
23384
- capScope: "system",
23385
- addonId: null,
23386
- access: "create"
23387
- },
23388
23486
  "pipelineExecutor.runAudioTest": {
23389
23487
  capName: "pipeline-executor",
23390
23488
  capScope: "system",
@@ -23535,6 +23633,12 @@ Object.freeze({
23535
23633
  addonId: null,
23536
23634
  access: "view"
23537
23635
  },
23636
+ "pipelineOrchestrator.getNodeInferenceDevices": {
23637
+ capName: "pipeline-orchestrator",
23638
+ capScope: "system",
23639
+ addonId: null,
23640
+ access: "view"
23641
+ },
23538
23642
  "pipelineOrchestrator.getPipelineAssignment": {
23539
23643
  capName: "pipeline-orchestrator",
23540
23644
  capScope: "system",
@@ -23547,6 +23651,12 @@ Object.freeze({
23547
23651
  addonId: null,
23548
23652
  access: "view"
23549
23653
  },
23654
+ "pipelineOrchestrator.getPipelineDevicePin": {
23655
+ capName: "pipeline-orchestrator",
23656
+ capScope: "system",
23657
+ addonId: null,
23658
+ access: "view"
23659
+ },
23550
23660
  "pipelineOrchestrator.listAgentSettings": {
23551
23661
  capName: "pipeline-orchestrator",
23552
23662
  capScope: "system",
@@ -23589,19 +23699,19 @@ Object.freeze({
23589
23699
  addonId: null,
23590
23700
  access: "create"
23591
23701
  },
23592
- "pipelineOrchestrator.setAgentAddonDefaults": {
23702
+ "pipelineOrchestrator.setAgentCapabilities": {
23593
23703
  capName: "pipeline-orchestrator",
23594
23704
  capScope: "system",
23595
23705
  addonId: null,
23596
23706
  access: "create"
23597
23707
  },
23598
- "pipelineOrchestrator.setAgentCapabilities": {
23708
+ "pipelineOrchestrator.setAgentDetectWeight": {
23599
23709
  capName: "pipeline-orchestrator",
23600
23710
  capScope: "system",
23601
23711
  addonId: null,
23602
23712
  access: "create"
23603
23713
  },
23604
- "pipelineOrchestrator.setAgentDetectWeight": {
23714
+ "pipelineOrchestrator.setAgentInferenceDevices": {
23605
23715
  capName: "pipeline-orchestrator",
23606
23716
  capScope: "system",
23607
23717
  addonId: null,
@@ -23643,6 +23753,12 @@ Object.freeze({
23643
23753
  addonId: null,
23644
23754
  access: "create"
23645
23755
  },
23756
+ "pipelineOrchestrator.setPipelineDevicePin": {
23757
+ capName: "pipeline-orchestrator",
23758
+ capScope: "system",
23759
+ addonId: null,
23760
+ access: "create"
23761
+ },
23646
23762
  "pipelineOrchestrator.unassignAudio": {
23647
23763
  capName: "pipeline-orchestrator",
23648
23764
  capScope: "system",
@@ -25195,32 +25311,6 @@ Object.freeze({
25195
25311
  "network-access": "ingress",
25196
25312
  "smtp-provider": "email"
25197
25313
  });
25198
- var frameworkSwapPackageSchema = object({
25199
- name: string(),
25200
- stagedPath: string(),
25201
- backupPath: string(),
25202
- toVersion: string(),
25203
- fromVersion: string().nullable()
25204
- });
25205
- object({
25206
- jobId: string(),
25207
- taskId: string(),
25208
- packages: array(frameworkSwapPackageSchema),
25209
- requestedAtMs: number(),
25210
- schemaVersion: literal(1)
25211
- });
25212
- object({
25213
- jobId: string(),
25214
- taskId: string(),
25215
- backups: array(object({
25216
- name: string(),
25217
- backupPath: string(),
25218
- livePath: string()
25219
- })),
25220
- appliedAtMs: number(),
25221
- bootAttempts: number(),
25222
- schemaVersion: literal(1)
25223
- });
25224
25314
  //#endregion
25225
25315
  Object.defineProperty(exports, "BaseAddon", {
25226
25316
  enumerable: true,
@@ -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(), PipelineEngineChoiceSchema, {
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(["runtime", "warm-override"]),
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()`.
@@ -16727,13 +16787,11 @@ var PipelineTemplateSchema = object({
16727
16787
  createdAt: string(),
16728
16788
  updatedAt: string()
16729
16789
  });
16730
- var AgentAddonConfigSchema = object({
16731
- enabled: boolean(),
16790
+ var DeviceStepConfigSchema = object({
16732
16791
  modelId: string().optional(),
16733
- settings: record(string(), unknown()).readonly()
16792
+ settings: record(string(), unknown()).optional()
16734
16793
  });
16735
16794
  var AgentPipelineSettingsSchema = object({
16736
- addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
16737
16795
  maxCameras: number().int().nonnegative().nullable().default(null),
16738
16796
  /** Per-node detection weight (relative share for the quota balancer). */
16739
16797
  detectWeight: number().positive().optional(),
@@ -16757,7 +16815,22 @@ var AgentPipelineSettingsSchema = object({
16757
16815
  * it already uses to reach the hub). Set this only when the auto-detected
16758
16816
  * address is wrong (multi-homed host, NAT, custom interface).
16759
16817
  */
16760
- reachableHost: string().optional()
16818
+ reachableHost: string().optional(),
16819
+ /**
16820
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
16821
+ * weight, steps}. Absent / all-disabled ⇒ the node's single default
16822
+ * accelerator (safe default); two+ enabled ⇒ the dispatcher balances
16823
+ * detection sessions across them so they run CONCURRENTLY. `steps` is the
16824
+ * per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
16825
+ * the default model/settings for every camera landing on that accelerator;
16826
+ * a stepId absent ⇒ the step uses that device's format default.
16827
+ */
16828
+ inferenceDevices: record(string(), object({
16829
+ enabled: boolean(),
16830
+ weight: number().positive().optional(),
16831
+ maxSessions: number().int().positive().optional(),
16832
+ steps: record(string(), DeviceStepConfigSchema).optional()
16833
+ })).optional()
16761
16834
  });
16762
16835
  var CameraPipelineForAgentSchema = object({
16763
16836
  steps: array(PipelineStepInputSchema).readonly(),
@@ -16767,14 +16840,13 @@ var CameraPipelineForAgentSchema = object({
16767
16840
  }).nullable()
16768
16841
  });
16769
16842
  var CameraStepOverridePatchSchema = object({
16770
- enabled: boolean().optional(),
16771
16843
  modelId: string().optional(),
16772
16844
  settings: record(string(), unknown()).readonly().optional()
16773
16845
  });
16774
16846
  var CameraPipelineSettingsSchema = object({
16775
16847
  pinnedAgentNodeId: string().optional(),
16776
16848
  stepToggles: record(string(), boolean()).optional(),
16777
- stepOverridesByAgent: record(string(), record(string(), CameraStepOverridePatchSchema)).optional(),
16849
+ stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
16778
16850
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
16779
16851
  });
16780
16852
  /**
@@ -16988,6 +17060,44 @@ var CameraStatusSchema = object({
16988
17060
  /** Unix timestamp (ms) when this snapshot was composed server-side. */
16989
17061
  fetchedAt: number()
16990
17062
  });
17063
+ var NodeInferenceDeviceSchema = object({
17064
+ /** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
17065
+ key: string(),
17066
+ backend: string(),
17067
+ device: string(),
17068
+ format: _enum(MODEL_FORMATS),
17069
+ /** Whether the node's live probe reports the device as usable right now. */
17070
+ available: boolean(),
17071
+ /**
17072
+ * Whether this device participates in dispatch. AUTO default (spec C2):
17073
+ * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
17074
+ * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
17075
+ * not a balanced target). An explicit stored value always wins; a stored-only
17076
+ * (unavailable) key keeps its stored value.
17077
+ */
17078
+ enabled: boolean(),
17079
+ /** Relative balancer weight for the enabled device (default 1). */
17080
+ weight: number(),
17081
+ /** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
17082
+ maxSessions: number().nullable(),
17083
+ /** Object-detection model the executor defaults to for this deviceKey. */
17084
+ defaultModelId: string(),
17085
+ /**
17086
+ * Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
17087
+ * `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
17088
+ * Absent/empty ⇒ no base (every step uses its device format default). The
17089
+ * UI cross-references `pipelineExecutor.getSchema` for the models actually
17090
+ * available per format; this is the stored selection that becomes the
17091
+ * default for EVERY camera landing on this accelerator.
17092
+ */
17093
+ steps: record(string(), DeviceStepConfigSchema).optional()
17094
+ });
17095
+ var NodeInferenceDevicesSchema = object({
17096
+ nodeId: string(),
17097
+ /** False when the node's platform-probe was unreachable (no live device set). */
17098
+ reachable: boolean(),
17099
+ devices: array(NodeInferenceDeviceSchema).readonly()
17100
+ });
16991
17101
  method(object({
16992
17102
  deviceId: number(),
16993
17103
  agentNodeId: string()
@@ -16997,7 +17107,13 @@ method(object({
16997
17107
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
16998
17108
  kind: "mutation",
16999
17109
  auth: "admin"
17000
- }), method(_void(), object({ migrated: number() }), {
17110
+ }), method(object({
17111
+ deviceId: number(),
17112
+ deviceKey: string()
17113
+ }), object({ success: literal(true) }), {
17114
+ kind: "mutation",
17115
+ auth: "admin"
17116
+ }), method(object({ deviceId: number() }), object({ deviceKey: string().nullable() })), method(_void(), object({ migrated: number() }), {
17001
17117
  kind: "mutation",
17002
17118
  auth: "admin"
17003
17119
  }), 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({
@@ -17031,13 +17147,7 @@ method(object({
17031
17147
  }))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
17032
17148
  nodeId: string(),
17033
17149
  settings: AgentPipelineSettingsSchema
17034
- })).readonly()), method(object({
17035
- agentNodeId: string(),
17036
- defaults: record(string(), AgentAddonConfigSchema)
17037
- }), object({ success: literal(true) }), {
17038
- kind: "mutation",
17039
- auth: "admin"
17040
- }), method(object({ agentNodeId: string() }), object({
17150
+ })).readonly()), method(object({ agentNodeId: string() }), object({
17041
17151
  success: boolean(),
17042
17152
  removed: boolean()
17043
17153
  }), {
@@ -17069,7 +17179,18 @@ method(object({
17069
17179
  }), object({ success: literal(true) }), {
17070
17180
  kind: "mutation",
17071
17181
  auth: "admin"
17072
- }), method(object({ agentNodeId: string() }), object({
17182
+ }), method(object({
17183
+ agentNodeId: string(),
17184
+ inferenceDevices: record(string(), object({
17185
+ enabled: boolean(),
17186
+ weight: number().positive().optional(),
17187
+ maxSessions: number().int().positive().optional(),
17188
+ steps: record(string(), DeviceStepConfigSchema).optional()
17189
+ }))
17190
+ }), object({ success: literal(true) }), {
17191
+ kind: "mutation",
17192
+ auth: "admin"
17193
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
17073
17194
  success: literal(true),
17074
17195
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
17075
17196
  effectiveModelId: string().nullable(),
@@ -17085,9 +17206,10 @@ method(object({
17085
17206
  }), object({ success: literal(true) }), {
17086
17207
  kind: "mutation",
17087
17208
  auth: "admin"
17088
- }), method(object({ deviceId: number() }), record(string(), record(string(), CameraStepOverridePatchSchema)).nullable()), method(object({
17209
+ }), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
17089
17210
  deviceId: number(),
17090
17211
  agentNodeId: string(),
17212
+ deviceKey: string(),
17091
17213
  addonId: string(),
17092
17214
  patch: CameraStepOverridePatchSchema.nullable()
17093
17215
  }), object({ success: literal(true) }), {
@@ -17124,14 +17246,13 @@ method(object({
17124
17246
  });
17125
17247
  /**
17126
17248
  * server-management — per-NODE singleton capability for a node's ROOT
17127
- * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
17128
- * agents).
17249
+ * package lifecycle (runtime-updatable node packages).
17129
17250
  *
17130
- * Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
17131
- * on agents) carries the whole software stack in its npm dep tree, so ONE
17132
- * version describes the node. Updates install into
17133
- * `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
17134
- * starter (probation boot + auto-rollback to N-1).
17251
+ * Every node role runs the SAME root package (`@camstack/server`), which
17252
+ * carries the whole software stack in its npm dep tree, so ONE version
17253
+ * describes the node. Updates stage into `<dataDir>/server-root/` and apply
17254
+ * on restart via the baked starter (single-copy in-place swap — no probation,
17255
+ * no auto-rollback).
17135
17256
  *
17136
17257
  * Providers:
17137
17258
  * - HUB: `ServerUpdateService` behind the `server-provided` mount
@@ -17239,7 +17360,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
17239
17360
  /** Explicit target version; omitted = latest from the registry. */
17240
17361
  version: string().optional() }), ServerUpdateActionResultSchema, {
17241
17362
  kind: "mutation",
17242
- auth: "admin"
17363
+ auth: "admin",
17364
+ timeoutMs: 16 * 6e4
17243
17365
  }), method(_void(), ServerUpdateActionResultSchema, {
17244
17366
  kind: "mutation",
17245
17367
  auth: "admin"
@@ -18306,22 +18428,6 @@ var AddonAutoUpdateSchema = ChannelWithInheritSchema;
18306
18428
  var RestartAddonResultSchema = unknown();
18307
18429
  var InstallPackageResultSchema = unknown();
18308
18430
  var ReloadPackagesResultSchema = unknown();
18309
- /**
18310
- * Result of `updateFrameworkPackage`. The cap method returns BEFORE the
18311
- * server restarts so the admin UI can react to the `restartingAt`
18312
- * timestamp (shows reconnect overlay). The transition from
18313
- * `fromVersion` to `toVersion` will be confirmed by a subsequent
18314
- * `system.restart-completed` event after the new process boots.
18315
- *
18316
- * Spec: docs/superpowers/specs/2026-05-14-framework-live-update-design.md
18317
- */
18318
- var UpdateFrameworkPackageResultSchema = object({
18319
- packageName: string(),
18320
- fromVersion: string(),
18321
- toVersion: string(),
18322
- /** Ms-epoch the server scheduled its self-restart. */
18323
- restartingAt: number()
18324
- });
18325
18431
  var BulkUpdateItemStatusSchema = _enum([
18326
18432
  "queued",
18327
18433
  "updating",
@@ -18449,13 +18555,6 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
18449
18555
  }), object({ success: literal(true) }), {
18450
18556
  kind: "mutation",
18451
18557
  auth: "admin"
18452
- }), method(object({
18453
- packageName: string().min(1),
18454
- version: string().optional(),
18455
- deferRestart: boolean().optional()
18456
- }), UpdateFrameworkPackageResultSchema, {
18457
- kind: "mutation",
18458
- auth: "admin"
18459
18558
  }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
18460
18559
  kind: "mutation",
18461
18560
  auth: "admin"
@@ -19321,10 +19420,10 @@ var TopologyCategorySchema = object({
19321
19420
  addons: array(TopologyCategoryAddonSchema).readonly()
19322
19421
  });
19323
19422
  /**
19324
- * The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
19325
- * `@camstack/agent` on agents) as reported by its `registerNode` manifest —
19326
- * version visibility for the Server management surface. Nullable: offline
19327
- * rows and pre-phase-2 nodes report none.
19423
+ * The node's runtime-updatable ROOT package (`@camstack/server` the single
19424
+ * root package for every node role) as reported by its `registerNode`
19425
+ * manifest — version visibility for the Server management surface. Nullable:
19426
+ * offline rows and nodes that never reported one.
19328
19427
  */
19329
19428
  var TopologyRootPackageSchema = object({
19330
19429
  name: string(),
@@ -19712,17 +19811,28 @@ var PlatformScoreSchema = object({
19712
19811
  format: _enum([
19713
19812
  "onnx",
19714
19813
  "coreml",
19715
- "openvino"
19814
+ "openvino",
19815
+ "tflite"
19716
19816
  ]),
19717
19817
  score: number(),
19718
19818
  reason: string(),
19719
19819
  available: boolean()
19720
19820
  });
19821
+ var InferenceDeviceDescriptorSchema = object({
19822
+ key: string(),
19823
+ backend: string(),
19824
+ device: string(),
19825
+ format: ModelFormatSchema,
19826
+ runtime: literal("python"),
19827
+ score: number(),
19828
+ available: boolean()
19829
+ });
19721
19830
  var PlatformCapabilitiesSchema = object({
19722
19831
  hardware: HardwareInfoSchema,
19723
19832
  scores: array(PlatformScoreSchema).readonly(),
19724
19833
  bestScore: PlatformScoreSchema,
19725
- pythonPath: string().nullable()
19834
+ pythonPath: string().nullable(),
19835
+ devices: array(InferenceDeviceDescriptorSchema).readonly()
19726
19836
  });
19727
19837
  var ModelRequirementSchema = object({
19728
19838
  modelId: string(),
@@ -20601,12 +20711,6 @@ Object.freeze({
20601
20711
  addonId: null,
20602
20712
  access: "delete"
20603
20713
  },
20604
- "addons.updateFrameworkPackage": {
20605
- capName: "addons",
20606
- capScope: "system",
20607
- addonId: null,
20608
- access: "create"
20609
- },
20610
20714
  "addons.updatePackage": {
20611
20715
  capName: "addons",
20612
20716
  capScope: "system",
@@ -23379,12 +23483,6 @@ Object.freeze({
23379
23483
  addonId: null,
23380
23484
  access: "view"
23381
23485
  },
23382
- "pipelineExecutor.reprobeEngine": {
23383
- capName: "pipeline-executor",
23384
- capScope: "system",
23385
- addonId: null,
23386
- access: "create"
23387
- },
23388
23486
  "pipelineExecutor.runAudioTest": {
23389
23487
  capName: "pipeline-executor",
23390
23488
  capScope: "system",
@@ -23535,6 +23633,12 @@ Object.freeze({
23535
23633
  addonId: null,
23536
23634
  access: "view"
23537
23635
  },
23636
+ "pipelineOrchestrator.getNodeInferenceDevices": {
23637
+ capName: "pipeline-orchestrator",
23638
+ capScope: "system",
23639
+ addonId: null,
23640
+ access: "view"
23641
+ },
23538
23642
  "pipelineOrchestrator.getPipelineAssignment": {
23539
23643
  capName: "pipeline-orchestrator",
23540
23644
  capScope: "system",
@@ -23547,6 +23651,12 @@ Object.freeze({
23547
23651
  addonId: null,
23548
23652
  access: "view"
23549
23653
  },
23654
+ "pipelineOrchestrator.getPipelineDevicePin": {
23655
+ capName: "pipeline-orchestrator",
23656
+ capScope: "system",
23657
+ addonId: null,
23658
+ access: "view"
23659
+ },
23550
23660
  "pipelineOrchestrator.listAgentSettings": {
23551
23661
  capName: "pipeline-orchestrator",
23552
23662
  capScope: "system",
@@ -23589,19 +23699,19 @@ Object.freeze({
23589
23699
  addonId: null,
23590
23700
  access: "create"
23591
23701
  },
23592
- "pipelineOrchestrator.setAgentAddonDefaults": {
23702
+ "pipelineOrchestrator.setAgentCapabilities": {
23593
23703
  capName: "pipeline-orchestrator",
23594
23704
  capScope: "system",
23595
23705
  addonId: null,
23596
23706
  access: "create"
23597
23707
  },
23598
- "pipelineOrchestrator.setAgentCapabilities": {
23708
+ "pipelineOrchestrator.setAgentDetectWeight": {
23599
23709
  capName: "pipeline-orchestrator",
23600
23710
  capScope: "system",
23601
23711
  addonId: null,
23602
23712
  access: "create"
23603
23713
  },
23604
- "pipelineOrchestrator.setAgentDetectWeight": {
23714
+ "pipelineOrchestrator.setAgentInferenceDevices": {
23605
23715
  capName: "pipeline-orchestrator",
23606
23716
  capScope: "system",
23607
23717
  addonId: null,
@@ -23643,6 +23753,12 @@ Object.freeze({
23643
23753
  addonId: null,
23644
23754
  access: "create"
23645
23755
  },
23756
+ "pipelineOrchestrator.setPipelineDevicePin": {
23757
+ capName: "pipeline-orchestrator",
23758
+ capScope: "system",
23759
+ addonId: null,
23760
+ access: "create"
23761
+ },
23646
23762
  "pipelineOrchestrator.unassignAudio": {
23647
23763
  capName: "pipeline-orchestrator",
23648
23764
  capScope: "system",
@@ -25195,31 +25311,5 @@ Object.freeze({
25195
25311
  "network-access": "ingress",
25196
25312
  "smtp-provider": "email"
25197
25313
  });
25198
- var frameworkSwapPackageSchema = object({
25199
- name: string(),
25200
- stagedPath: string(),
25201
- backupPath: string(),
25202
- toVersion: string(),
25203
- fromVersion: string().nullable()
25204
- });
25205
- object({
25206
- jobId: string(),
25207
- taskId: string(),
25208
- packages: array(frameworkSwapPackageSchema),
25209
- requestedAtMs: number(),
25210
- schemaVersion: literal(1)
25211
- });
25212
- object({
25213
- jobId: string(),
25214
- taskId: string(),
25215
- backups: array(object({
25216
- name: string(),
25217
- backupPath: string(),
25218
- livePath: string()
25219
- })),
25220
- appliedAtMs: number(),
25221
- bootAttempts: number(),
25222
- schemaVersion: literal(1)
25223
- });
25224
25314
  //#endregion
25225
25315
  export { BaseAddon as a, boolean as c, number as d, object as f, turnProviderCapability as i, discriminatedUnion as l, EventCategory as m, defineCustomActions as n, _enum as o, string as p, networkAccessCapability as r, array as s, customAction as t, literal as u };
@@ -21,7 +21,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
21
  enumerable: true
22
22
  }) : target, mod));
23
23
  //#endregion
24
- const require_dist = require("../dist-uEQ179pR.js");
24
+ const require_dist = require("../dist-BlG4exZI.js");
25
25
  let node_path = require("node:path");
26
26
  node_path = __toESM(node_path);
27
27
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { a as BaseAddon, c as boolean, d as number, f as object, m as EventCategory, n as defineCustomActions, o as _enum, p as string, r as networkAccessCapability, s as array, t as customAction, u as literal } from "../dist-CNbtRwT8.mjs";
1
+ import { a as BaseAddon, c as boolean, d as number, f as object, m as EventCategory, n as defineCustomActions, o as _enum, p as string, r as networkAccessCapability, s as array, t as customAction, u as literal } from "../dist-DJJB6LQC.mjs";
2
2
  import * as path from "node:path";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import { spawn } from "node:child_process";
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_dist = require("../dist-uEQ179pR.js");
2
+ const require_dist = require("../dist-BlG4exZI.js");
3
3
  //#region src/turn/cloudflare-turn.ts
4
4
  /**
5
5
  * Cloudflare returns ICE servers in several flavours depending on which
@@ -1,4 +1,4 @@
1
- import { a as BaseAddon, c as boolean, d as number, f as object, i as turnProviderCapability, l as discriminatedUnion, n as defineCustomActions, p as string, t as customAction, u as literal } from "../dist-CNbtRwT8.mjs";
1
+ import { a as BaseAddon, c as boolean, d as number, f as object, i as turnProviderCapability, l as discriminatedUnion, n as defineCustomActions, p as string, t as customAction, u as literal } from "../dist-DJJB6LQC.mjs";
2
2
  //#region src/turn/cloudflare-turn.ts
3
3
  /**
4
4
  * Cloudflare returns ICE servers in several flavours depending on which
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-cloudflare",
3
- "version": "1.1.29",
3
+ "version": "1.2.0",
4
4
  "description": "Cloudflare bundle — Tunnel (network-access) + TURN relay (turn-provider). Multi-entry npm package shipping 2 addons under a single bundle.",
5
5
  "keywords": [
6
6
  "camstack",