@camstack/types 1.1.55 → 1.1.57

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.
@@ -1036,6 +1036,7 @@ export declare const pipelineExecutorCapability: {
1036
1036
  kind: z.ZodEnum<{
1037
1037
  runtime: "runtime";
1038
1038
  "warm-override": "warm-override";
1039
+ "device-pool": "device-pool";
1039
1040
  }>;
1040
1041
  poolPid: z.ZodNullable<z.ZodNumber>;
1041
1042
  idleMs: z.ZodNullable<z.ZodNumber>;
@@ -656,6 +656,10 @@ export declare const pipelineOrchestratorCapability: {
656
656
  audio: z.ZodOptional<z.ZodBoolean>;
657
657
  ingest: z.ZodOptional<z.ZodBoolean>;
658
658
  reachableHost: z.ZodOptional<z.ZodString>;
659
+ inferenceDevices: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
660
+ enabled: z.ZodBoolean;
661
+ weight: z.ZodOptional<z.ZodNumber>;
662
+ }, z.core.$strip>>>;
659
663
  }, z.core.$strip>>, import("./capability-definition.js").CapabilityMethodKind>;
660
664
  /** Enumerate every agent's settings (hub + remote runners). */
661
665
  readonly listAgentSettings: import("./capability-definition.js").CapabilityMethodSchema<z.ZodVoid, z.ZodReadonly<z.ZodArray<z.ZodObject<{
@@ -673,6 +677,10 @@ export declare const pipelineOrchestratorCapability: {
673
677
  audio: z.ZodOptional<z.ZodBoolean>;
674
678
  ingest: z.ZodOptional<z.ZodBoolean>;
675
679
  reachableHost: z.ZodOptional<z.ZodString>;
680
+ inferenceDevices: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
681
+ enabled: z.ZodBoolean;
682
+ weight: z.ZodOptional<z.ZodNumber>;
683
+ }, z.core.$strip>>>;
676
684
  }, z.core.$strip>;
677
685
  }, z.core.$strip>>>, import("./capability-definition.js").CapabilityMethodKind>;
678
686
  /** Bulk-replace ALL addon configs on one agent. Used by the agent-level PipelineEditor which emits the full map per edit. Merges on top of existing entries — omitted addonIds are left alone. */
@@ -766,6 +774,26 @@ export declare const pipelineOrchestratorCapability: {
766
774
  }, z.core.$strip>, z.ZodObject<{
767
775
  success: z.ZodLiteral<true>;
768
776
  }, z.core.$strip>, "mutation">;
777
+ /**
778
+ * Set one node's multi-device inference opt-in (Phase 4 multi-device) — the
779
+ * per-node `deviceKey → { enabled, weight }` map that decides which
780
+ * accelerators the dispatcher may balance detection sessions across.
781
+ * The map REPLACES the node's stored `inferenceDevices` wholesale (pass the
782
+ * complete desired set; an empty map clears the opt-in → the node reverts to
783
+ * its single DEFAULT accelerator). `weight` is optional and defaults to 1.
784
+ * Creates the node's settings entry if absent. Changes take effect on the
785
+ * next dispatch/rebalance cycle — the dispatcher reads the enabled set via
786
+ * `PipelineSettingsStore.buildNodeInferenceDevices` when placing sessions.
787
+ */
788
+ readonly setAgentInferenceDevices: import("./capability-definition.js").CapabilityMethodSchema<z.ZodObject<{
789
+ agentNodeId: z.ZodString;
790
+ inferenceDevices: z.ZodRecord<z.ZodString, z.ZodObject<{
791
+ enabled: z.ZodBoolean;
792
+ weight: z.ZodOptional<z.ZodNumber>;
793
+ }, z.core.$strip>>;
794
+ }, z.core.$strip>, z.ZodObject<{
795
+ success: z.ZodLiteral<true>;
796
+ }, z.core.$strip>, "mutation">;
769
797
  /**
770
798
  * Reset one node's pipeline to its hardware-aware defaults — the HONEST
771
799
  * reset (replaces the executor's legacy `resetToDefault`, which cleared a
@@ -10301,7 +10301,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
10301
10301
  format: "onnx" | "coreml" | "openvino" | "tflite" | "pt" | "gguf";
10302
10302
  device?: string | undefined;
10303
10303
  };
10304
- output: import("packages/types/dist/capabilities/pipeline-executor.cap").PipelineDefaultStepOutput[];
10304
+ output: import("@camstack/types").PipelineDefaultStepOutput[];
10305
10305
  meta: object;
10306
10306
  }>;
10307
10307
  reprobeEngine: import("@trpc/server").TRPCMutationProcedure<{
@@ -10435,7 +10435,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
10435
10435
  input: {
10436
10436
  nodeId?: string | undefined;
10437
10437
  } | undefined;
10438
- output: readonly import("packages/types/dist/capabilities/pipeline-executor.cap").PipelineDefaultStepOutput[] | null;
10438
+ output: readonly import("@camstack/types").PipelineDefaultStepOutput[] | null;
10439
10439
  meta: object;
10440
10440
  }>;
10441
10441
  getGlobalPipelineConfig: import("@trpc/server").TRPCQueryProcedure<{
@@ -10489,7 +10489,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
10489
10489
  format: "onnx" | "coreml" | "openvino" | "tflite" | "pt" | "gguf";
10490
10490
  device?: string | undefined;
10491
10491
  };
10492
- steps: readonly import("packages/types/dist/capabilities/pipeline-executor.cap").PipelineTemplateStepOutput[];
10492
+ steps: readonly import("@camstack/types").PipelineTemplateStepOutput[];
10493
10493
  }[];
10494
10494
  meta: object;
10495
10495
  }>;
@@ -10516,7 +10516,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
10516
10516
  format: "onnx" | "coreml" | "openvino" | "tflite" | "pt" | "gguf";
10517
10517
  device?: string | undefined;
10518
10518
  };
10519
- steps: readonly import("packages/types/dist/capabilities/pipeline-executor.cap").PipelineTemplateStepOutput[];
10519
+ steps: readonly import("@camstack/types").PipelineTemplateStepOutput[];
10520
10520
  };
10521
10521
  meta: object;
10522
10522
  }>;
@@ -10538,7 +10538,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
10538
10538
  format: "onnx" | "coreml" | "openvino" | "tflite" | "pt" | "gguf";
10539
10539
  device?: string | undefined;
10540
10540
  };
10541
- steps: readonly import("packages/types/dist/capabilities/pipeline-executor.cap").PipelineTemplateStepOutput[];
10541
+ steps: readonly import("@camstack/types").PipelineTemplateStepOutput[];
10542
10542
  };
10543
10543
  meta: object;
10544
10544
  }>;
@@ -10626,6 +10626,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
10626
10626
  deviceId?: number | undefined;
10627
10627
  sessionId?: string | undefined;
10628
10628
  plane?: "full" | "frame" | undefined;
10629
+ deviceKey?: string | undefined;
10629
10630
  };
10630
10631
  output: import("@camstack/types").FrameResult;
10631
10632
  meta: object;
@@ -10650,6 +10651,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
10650
10651
  deviceId?: number | undefined;
10651
10652
  sessionId?: string | undefined;
10652
10653
  frameId?: number | undefined;
10654
+ deviceKey?: string | undefined;
10653
10655
  };
10654
10656
  output: {
10655
10657
  results: readonly import("@camstack/types").FrameResult[];
@@ -10714,7 +10716,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
10714
10716
  };
10715
10717
  modelsLoaded: readonly string[];
10716
10718
  inUseByCameras: readonly number[];
10717
- kind: "runtime" | "warm-override";
10719
+ kind: "runtime" | "warm-override" | "device-pool";
10718
10720
  poolPid: number | null;
10719
10721
  idleMs: number | null;
10720
10722
  idleTtlMs: number | null;
@@ -11123,6 +11125,10 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
11123
11125
  audio?: boolean | undefined;
11124
11126
  ingest?: boolean | undefined;
11125
11127
  reachableHost?: string | undefined;
11128
+ inferenceDevices?: Record<string, {
11129
+ enabled: boolean;
11130
+ weight?: number | undefined;
11131
+ }> | undefined;
11126
11132
  } | null;
11127
11133
  meta: object;
11128
11134
  }>;
@@ -11145,6 +11151,10 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
11145
11151
  audio?: boolean | undefined;
11146
11152
  ingest?: boolean | undefined;
11147
11153
  reachableHost?: string | undefined;
11154
+ inferenceDevices?: Record<string, {
11155
+ enabled: boolean;
11156
+ weight?: number | undefined;
11157
+ }> | undefined;
11148
11158
  };
11149
11159
  }[];
11150
11160
  meta: object;
@@ -11221,6 +11231,11 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
11221
11231
  };
11222
11232
  meta: object;
11223
11233
  }>;
11234
+ setAgentInferenceDevices: import("@trpc/server").TRPCMutationProcedure<{
11235
+ input: any;
11236
+ output: any;
11237
+ meta: object;
11238
+ }>;
11224
11239
  resetNodePipelineDefaults: import("@trpc/server").TRPCMutationProcedure<{
11225
11240
  input: {
11226
11241
  [x: string]: unknown;
@@ -11726,6 +11741,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
11726
11741
  ownerReachableHost?: string | undefined;
11727
11742
  hubHostnameOverride?: string | undefined;
11728
11743
  } | undefined;
11744
+ deviceKey?: string | undefined;
11729
11745
  };
11730
11746
  output: {
11731
11747
  success: true;
@@ -27045,7 +27061,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
27045
27061
  format: "onnx" | "coreml" | "openvino" | "tflite" | "pt" | "gguf";
27046
27062
  device?: string | undefined;
27047
27063
  };
27048
- output: import("packages/types/dist/capabilities/pipeline-executor.cap").PipelineDefaultStepOutput[];
27064
+ output: import("@camstack/types").PipelineDefaultStepOutput[];
27049
27065
  meta: object;
27050
27066
  }>;
27051
27067
  reprobeEngine: import("@trpc/server").TRPCMutationProcedure<{
@@ -27179,7 +27195,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
27179
27195
  input: {
27180
27196
  nodeId?: string | undefined;
27181
27197
  } | undefined;
27182
- output: readonly import("packages/types/dist/capabilities/pipeline-executor.cap").PipelineDefaultStepOutput[] | null;
27198
+ output: readonly import("@camstack/types").PipelineDefaultStepOutput[] | null;
27183
27199
  meta: object;
27184
27200
  }>;
27185
27201
  getGlobalPipelineConfig: import("@trpc/server").TRPCQueryProcedure<{
@@ -27233,7 +27249,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
27233
27249
  format: "onnx" | "coreml" | "openvino" | "tflite" | "pt" | "gguf";
27234
27250
  device?: string | undefined;
27235
27251
  };
27236
- steps: readonly import("packages/types/dist/capabilities/pipeline-executor.cap").PipelineTemplateStepOutput[];
27252
+ steps: readonly import("@camstack/types").PipelineTemplateStepOutput[];
27237
27253
  }[];
27238
27254
  meta: object;
27239
27255
  }>;
@@ -27260,7 +27276,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
27260
27276
  format: "onnx" | "coreml" | "openvino" | "tflite" | "pt" | "gguf";
27261
27277
  device?: string | undefined;
27262
27278
  };
27263
- steps: readonly import("packages/types/dist/capabilities/pipeline-executor.cap").PipelineTemplateStepOutput[];
27279
+ steps: readonly import("@camstack/types").PipelineTemplateStepOutput[];
27264
27280
  };
27265
27281
  meta: object;
27266
27282
  }>;
@@ -27282,7 +27298,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
27282
27298
  format: "onnx" | "coreml" | "openvino" | "tflite" | "pt" | "gguf";
27283
27299
  device?: string | undefined;
27284
27300
  };
27285
- steps: readonly import("packages/types/dist/capabilities/pipeline-executor.cap").PipelineTemplateStepOutput[];
27301
+ steps: readonly import("@camstack/types").PipelineTemplateStepOutput[];
27286
27302
  };
27287
27303
  meta: object;
27288
27304
  }>;
@@ -27370,6 +27386,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
27370
27386
  deviceId?: number | undefined;
27371
27387
  sessionId?: string | undefined;
27372
27388
  plane?: "full" | "frame" | undefined;
27389
+ deviceKey?: string | undefined;
27373
27390
  };
27374
27391
  output: import("@camstack/types").FrameResult;
27375
27392
  meta: object;
@@ -27394,6 +27411,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
27394
27411
  deviceId?: number | undefined;
27395
27412
  sessionId?: string | undefined;
27396
27413
  frameId?: number | undefined;
27414
+ deviceKey?: string | undefined;
27397
27415
  };
27398
27416
  output: {
27399
27417
  results: readonly import("@camstack/types").FrameResult[];
@@ -27458,7 +27476,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
27458
27476
  };
27459
27477
  modelsLoaded: readonly string[];
27460
27478
  inUseByCameras: readonly number[];
27461
- kind: "runtime" | "warm-override";
27479
+ kind: "runtime" | "warm-override" | "device-pool";
27462
27480
  poolPid: number | null;
27463
27481
  idleMs: number | null;
27464
27482
  idleTtlMs: number | null;
@@ -27867,6 +27885,10 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
27867
27885
  audio?: boolean | undefined;
27868
27886
  ingest?: boolean | undefined;
27869
27887
  reachableHost?: string | undefined;
27888
+ inferenceDevices?: Record<string, {
27889
+ enabled: boolean;
27890
+ weight?: number | undefined;
27891
+ }> | undefined;
27870
27892
  } | null;
27871
27893
  meta: object;
27872
27894
  }>;
@@ -27889,6 +27911,10 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
27889
27911
  audio?: boolean | undefined;
27890
27912
  ingest?: boolean | undefined;
27891
27913
  reachableHost?: string | undefined;
27914
+ inferenceDevices?: Record<string, {
27915
+ enabled: boolean;
27916
+ weight?: number | undefined;
27917
+ }> | undefined;
27892
27918
  };
27893
27919
  }[];
27894
27920
  meta: object;
@@ -27965,6 +27991,11 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
27965
27991
  };
27966
27992
  meta: object;
27967
27993
  }>;
27994
+ setAgentInferenceDevices: import("@trpc/server").TRPCMutationProcedure<{
27995
+ input: any;
27996
+ output: any;
27997
+ meta: object;
27998
+ }>;
27968
27999
  resetNodePipelineDefaults: import("@trpc/server").TRPCMutationProcedure<{
27969
28000
  input: {
27970
28001
  [x: string]: unknown;
@@ -28470,6 +28501,7 @@ export type AppRouter = import("@trpc/server/unstable-core-do-not-import").Route
28470
28501
  ownerReachableHost?: string | undefined;
28471
28502
  hubHostnameOverride?: string | undefined;
28472
28503
  } | undefined;
28504
+ deviceKey?: string | undefined;
28473
28505
  };
28474
28506
  output: {
28475
28507
  success: true;
@@ -6,7 +6,7 @@
6
6
  * scope+access check inside `protectedProcedure` (see
7
7
  * `server/backend/src/api/trpc/trpc.middleware.ts`).
8
8
  *
9
- * Coverage: 800 method paths across 116 capabilities.
9
+ * Coverage: 801 method paths across 116 capabilities.
10
10
  */
11
11
  import type { CapabilityMethodAccess } from '../capabilities/capability-definition.js';
12
12
  export interface MethodAccessRecord {
@@ -76,7 +76,7 @@ export interface SystemProxy {
76
76
  readonly nodes: Pick<InferProvider<typeof nodesCapability>, 'topology' | 'deployAddon' | 'undeployAddon' | 'restartAddon' | 'restartProcess' | 'restartNode' | 'shutdownNode' | 'renameNode' | 'clusterAddonStatus' | 'getCapUsageGraph' | 'getNodeAddons' | 'setProcessLogLevel' | 'executeQuery'>;
77
77
  readonly notificationOutput: Pick<InferProvider<typeof notificationOutputCapability>, 'listTargetKinds' | 'listTargets' | 'discoverTargets' | 'send' | 'testTarget' | 'upsertTarget' | 'deleteTarget' | 'setTargetEnabled'>;
78
78
  readonly pipelineExecutor: Pick<InferProvider<typeof pipelineExecutorCapability>, 'getAvailableEngines' | 'getSelectedEngine' | 'getDefaultSteps' | 'reprobeEngine' | 'getEngineProvisioning' | 'getVideoPipelineSteps' | 'setVideoPipelineSteps' | 'clearDeviceOverrides' | 'getSchema' | 'getGlobalSteps' | 'getGlobalPipelineConfig' | 'getOrchestratorConfigSchema' | 'validatePipeline' | 'listTemplates' | 'saveTemplate' | 'updateTemplate' | 'deleteTemplate' | 'getCapabilities' | 'getAddonModels' | 'downloadModel' | 'deleteModel' | 'cacheFrameInPool' | 'inferCached' | 'uncacheFrame' | 'getEffectiveTuning' | 'listLoadedEngines' | 'spinEngine' | 'killEngine' | 'listReferenceImages' | 'getReferenceImage' | 'getReferenceAudioFiles' | 'getReferenceAudio' | 'getAudioCapabilities' | 'runAudioTest' | 'getDetectionConfigSchema'>;
79
- readonly pipelineOrchestrator: Pick<InferProvider<typeof pipelineOrchestratorCapability>, 'rebalance' | 'getPipelineAssignments' | 'getAgentLoad' | 'getGlobalMetrics' | 'getCapabilityBindings' | 'setCapabilityBinding' | 'getIngestOwner' | 'getAudioNodeLoad' | 'getAgentSettings' | 'listAgentSettings' | 'setAgentAddonDefaults' | 'removeAgentSettings' | 'setAgentMaxCameras' | 'setAgentDetectWeight' | 'setAgentCapabilities' | 'setAgentReachableHost' | 'resetNodePipelineDefaults' | 'getCameraStatuses' | 'listTemplates' | 'saveTemplate' | 'updateTemplate' | 'deleteTemplate'>;
79
+ readonly pipelineOrchestrator: Pick<InferProvider<typeof pipelineOrchestratorCapability>, 'rebalance' | 'getPipelineAssignments' | 'getAgentLoad' | 'getGlobalMetrics' | 'getCapabilityBindings' | 'setCapabilityBinding' | 'getIngestOwner' | 'getAudioNodeLoad' | 'getAgentSettings' | 'listAgentSettings' | 'setAgentAddonDefaults' | 'removeAgentSettings' | 'setAgentMaxCameras' | 'setAgentDetectWeight' | 'setAgentCapabilities' | 'setAgentReachableHost' | 'setAgentInferenceDevices' | 'resetNodePipelineDefaults' | 'getCameraStatuses' | 'listTemplates' | 'saveTemplate' | 'updateTemplate' | 'deleteTemplate'>;
80
80
  readonly pipelineRunner: Pick<InferProvider<typeof pipelineRunnerCapability>, 'attachCamera' | 'reportMotion' | 'getLocalLoad' | 'getLocalMetrics' | 'getAllCameraMetrics' | 'getLocalCameras' | 'getNativeCrop'>;
81
81
  readonly plateGallery: Pick<InferProvider<typeof plateGalleryCapability>, 'getPlateMedia' | 'searchPlates' | 'suggestPlateClusters' | 'correctPlateText' | 'deletePlate' | 'listVehicles' | 'createVehicle' | 'renameVehicle' | 'deleteVehicle' | 'listVehicleSamples' | 'removeVehicleSample' | 'assignPlate' | 'unassignPlate' | 'assignPlates' | 'unassignPlates'>;
82
82
  readonly recording: Pick<InferProvider<typeof recordingCapability>, 'getStorageUsage' | 'listOpsLog'>;
package/dist/index.js CHANGED
@@ -8318,8 +8318,18 @@ var pipelineExecutorCapability = {
8318
8318
  * - `runtime` — main camera-serving engine (no idle TTL).
8319
8319
  * - `warm-override` — benchmark/test override held in the warm
8320
8320
  * cache; auto-disposed after the idle TTL.
8321
+ * - `device-pool` — a concurrent per-device pool (Phase 2
8322
+ * multi-device, keyed by `deviceKey`) resolved
8323
+ * via `resolveDeviceFactory`. Runs alongside the
8324
+ * `runtime` engine on a DIFFERENT accelerator
8325
+ * (NPU / iGPU / Coral) — this is how the
8326
+ * Engines tab shows all pools running at once.
8321
8327
  */
8322
- kind: zod.z.enum(["runtime", "warm-override"]),
8328
+ kind: zod.z.enum([
8329
+ "runtime",
8330
+ "warm-override",
8331
+ "device-pool"
8332
+ ]),
8323
8333
  /** Native pid of the underlying Python pool (null when no pool). */
8324
8334
  poolPid: zod.z.number().nullable(),
8325
8335
  /** ms since this factory was last used (null when not warm-tracked). */
@@ -13456,6 +13466,7 @@ function createSystemProxy(api) {
13456
13466
  setAgentDetectWeight: (input) => dispatch("pipelineOrchestrator", "setAgentDetectWeight", "mutation", input),
13457
13467
  setAgentCapabilities: (input) => dispatch("pipelineOrchestrator", "setAgentCapabilities", "mutation", input),
13458
13468
  setAgentReachableHost: (input) => dispatch("pipelineOrchestrator", "setAgentReachableHost", "mutation", input),
13469
+ setAgentInferenceDevices: (input) => dispatch("pipelineOrchestrator", "setAgentInferenceDevices", "mutation", input),
13459
13470
  resetNodePipelineDefaults: (input) => dispatch("pipelineOrchestrator", "resetNodePipelineDefaults", "mutation", input),
13460
13471
  getCameraStatuses: (input) => dispatch("pipelineOrchestrator", "getCameraStatuses", "query", input),
13461
13472
  listTemplates: (input) => dispatch("pipelineOrchestrator", "listTemplates", "query", input),
@@ -19563,7 +19574,17 @@ var AgentPipelineSettingsSchema = zod.z.object({
19563
19574
  * it already uses to reach the hub). Set this only when the auto-detected
19564
19575
  * address is wrong (multi-homed host, NAT, custom interface).
19565
19576
  */
19566
- reachableHost: zod.z.string().optional()
19577
+ reachableHost: zod.z.string().optional(),
19578
+ /**
19579
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
19580
+ * weight}. Absent / all-disabled ⇒ the node's single default accelerator
19581
+ * (safe default); two+ enabled ⇒ the dispatcher balances detection sessions
19582
+ * across them so they run CONCURRENTLY.
19583
+ */
19584
+ inferenceDevices: zod.z.record(zod.z.string(), zod.z.object({
19585
+ enabled: zod.z.boolean(),
19586
+ weight: zod.z.number().positive().optional()
19587
+ })).optional()
19567
19588
  });
19568
19589
  var CameraPipelineForAgentSchema = zod.z.object({
19569
19590
  steps: zod.z.array(PipelineStepInputSchema).readonly(),
@@ -20029,6 +20050,27 @@ var pipelineOrchestratorCapability = {
20029
20050
  auth: "admin"
20030
20051
  }),
20031
20052
  /**
20053
+ * Set one node's multi-device inference opt-in (Phase 4 multi-device) — the
20054
+ * per-node `deviceKey → { enabled, weight }` map that decides which
20055
+ * accelerators the dispatcher may balance detection sessions across.
20056
+ * The map REPLACES the node's stored `inferenceDevices` wholesale (pass the
20057
+ * complete desired set; an empty map clears the opt-in → the node reverts to
20058
+ * its single DEFAULT accelerator). `weight` is optional and defaults to 1.
20059
+ * Creates the node's settings entry if absent. Changes take effect on the
20060
+ * next dispatch/rebalance cycle — the dispatcher reads the enabled set via
20061
+ * `PipelineSettingsStore.buildNodeInferenceDevices` when placing sessions.
20062
+ */
20063
+ setAgentInferenceDevices: require_sleep.method(zod.z.object({
20064
+ agentNodeId: zod.z.string(),
20065
+ inferenceDevices: zod.z.record(zod.z.string(), zod.z.object({
20066
+ enabled: zod.z.boolean(),
20067
+ weight: zod.z.number().positive().optional()
20068
+ }))
20069
+ }), zod.z.object({ success: zod.z.literal(true) }), {
20070
+ kind: "mutation",
20071
+ auth: "admin"
20072
+ }),
20073
+ /**
20032
20074
  * Reset one node's pipeline to its hardware-aware defaults — the HONEST
20033
20075
  * reset (replaces the executor's legacy `resetToDefault`, which cleared a
20034
20076
  * dead persisted step-tree seed nothing in the live path read):
@@ -29135,6 +29177,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
29135
29177
  addonId: null,
29136
29178
  access: "create"
29137
29179
  },
29180
+ "pipelineOrchestrator.setAgentInferenceDevices": {
29181
+ capName: "pipeline-orchestrator",
29182
+ capScope: "system",
29183
+ addonId: null,
29184
+ access: "create"
29185
+ },
29138
29186
  "pipelineOrchestrator.setAgentMaxCameras": {
29139
29187
  capName: "pipeline-orchestrator",
29140
29188
  capScope: "system",
@@ -31504,31 +31552,52 @@ function scoreRuntimes(hw) {
31504
31552
  };
31505
31553
  }
31506
31554
  var DEVICE_FOR_BACKEND = {
31507
- openvino: "gpu",
31508
31555
  cuda: "gpu",
31509
31556
  edgetpu: "usb",
31510
31557
  coreml: "all",
31511
31558
  cpu: "cpu"
31512
31559
  };
31560
+ function device(backend, dev, format, score) {
31561
+ return {
31562
+ key: backend === "cpu" ? "cpu" : `${backend}:${dev}`,
31563
+ backend,
31564
+ device: dev,
31565
+ format,
31566
+ runtime: "python",
31567
+ score,
31568
+ available: true
31569
+ };
31570
+ }
31513
31571
  /**
31514
- * Enumerate every usable inference device on a node, one descriptor per scored
31515
- * backend. Unlike the elected `bestScore`, this returns the FULL set so the
31516
- * orchestrator can run and balance across all accelerators concurrently.
31572
+ * Enumerate every usable inference device on a node one descriptor PER PHYSICAL
31573
+ * ACCELERATOR, so the orchestrator can run and balance across all of them
31574
+ * CONCURRENTLY (each device is its own pool). Critically, OpenVINO is expanded
31575
+ * into its distinct devices (NPU / iGPU / CPU) rather than a single AUTO entry:
31576
+ * the Intel NPU ("AI Boost") and the iGPU are separate accelerators and run in
31577
+ * parallel — collapsing them to AUTO would leave one idle. NPU is scored above
31578
+ * the iGPU (faster for int8 detection AND frees the GPU).
31517
31579
  */
31518
31580
  function enumerateInferenceDevices(hw) {
31519
31581
  const { scores } = scoreRuntimes(hw);
31520
- return scores.map((s) => {
31521
- const device = DEVICE_FOR_BACKEND[s.backend] ?? s.backend;
31522
- return {
31523
- key: s.backend === "cpu" ? "cpu" : `${s.backend}:${device}`,
31524
- backend: s.backend,
31525
- device,
31526
- format: s.format,
31527
- runtime: "python",
31528
- score: s.score,
31529
- available: s.available
31530
- };
31531
- });
31582
+ const out = [];
31583
+ for (const s of scores) {
31584
+ if (s.backend === "openvino") {
31585
+ if (hw.npu?.type === "intel-npu") out.push(device("openvino", "npu", s.format, s.score + 2));
31586
+ if (hw.gpu?.type === "intel") out.push(device("openvino", "gpu", s.format, s.score));
31587
+ continue;
31588
+ }
31589
+ if (s.backend === "edgetpu") {
31590
+ const coralCount = Math.max(1, hw.coral?.count ?? 1);
31591
+ for (let i = 0; i < coralCount; i++) {
31592
+ const dev = i === 0 ? "usb" : `usb:${i}`;
31593
+ out.push(device("edgetpu", dev, s.format, s.score));
31594
+ }
31595
+ continue;
31596
+ }
31597
+ const dev = DEVICE_FOR_BACKEND[s.backend] ?? s.backend;
31598
+ out.push(device(s.backend, dev, s.format, s.score));
31599
+ }
31600
+ return out;
31532
31601
  }
31533
31602
  //#endregion
31534
31603
  exports.ACCESSORY_LABEL = ACCESSORY_LABEL;
package/dist/index.mjs CHANGED
@@ -8317,8 +8317,18 @@ var pipelineExecutorCapability = {
8317
8317
  * - `runtime` — main camera-serving engine (no idle TTL).
8318
8318
  * - `warm-override` — benchmark/test override held in the warm
8319
8319
  * cache; auto-disposed after the idle TTL.
8320
+ * - `device-pool` — a concurrent per-device pool (Phase 2
8321
+ * multi-device, keyed by `deviceKey`) resolved
8322
+ * via `resolveDeviceFactory`. Runs alongside the
8323
+ * `runtime` engine on a DIFFERENT accelerator
8324
+ * (NPU / iGPU / Coral) — this is how the
8325
+ * Engines tab shows all pools running at once.
8320
8326
  */
8321
- kind: z.enum(["runtime", "warm-override"]),
8327
+ kind: z.enum([
8328
+ "runtime",
8329
+ "warm-override",
8330
+ "device-pool"
8331
+ ]),
8322
8332
  /** Native pid of the underlying Python pool (null when no pool). */
8323
8333
  poolPid: z.number().nullable(),
8324
8334
  /** ms since this factory was last used (null when not warm-tracked). */
@@ -13455,6 +13465,7 @@ function createSystemProxy(api) {
13455
13465
  setAgentDetectWeight: (input) => dispatch("pipelineOrchestrator", "setAgentDetectWeight", "mutation", input),
13456
13466
  setAgentCapabilities: (input) => dispatch("pipelineOrchestrator", "setAgentCapabilities", "mutation", input),
13457
13467
  setAgentReachableHost: (input) => dispatch("pipelineOrchestrator", "setAgentReachableHost", "mutation", input),
13468
+ setAgentInferenceDevices: (input) => dispatch("pipelineOrchestrator", "setAgentInferenceDevices", "mutation", input),
13458
13469
  resetNodePipelineDefaults: (input) => dispatch("pipelineOrchestrator", "resetNodePipelineDefaults", "mutation", input),
13459
13470
  getCameraStatuses: (input) => dispatch("pipelineOrchestrator", "getCameraStatuses", "query", input),
13460
13471
  listTemplates: (input) => dispatch("pipelineOrchestrator", "listTemplates", "query", input),
@@ -19562,7 +19573,17 @@ var AgentPipelineSettingsSchema = z.object({
19562
19573
  * it already uses to reach the hub). Set this only when the auto-detected
19563
19574
  * address is wrong (multi-homed host, NAT, custom interface).
19564
19575
  */
19565
- reachableHost: z.string().optional()
19576
+ reachableHost: z.string().optional(),
19577
+ /**
19578
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
19579
+ * weight}. Absent / all-disabled ⇒ the node's single default accelerator
19580
+ * (safe default); two+ enabled ⇒ the dispatcher balances detection sessions
19581
+ * across them so they run CONCURRENTLY.
19582
+ */
19583
+ inferenceDevices: z.record(z.string(), z.object({
19584
+ enabled: z.boolean(),
19585
+ weight: z.number().positive().optional()
19586
+ })).optional()
19566
19587
  });
19567
19588
  var CameraPipelineForAgentSchema = z.object({
19568
19589
  steps: z.array(PipelineStepInputSchema).readonly(),
@@ -20028,6 +20049,27 @@ var pipelineOrchestratorCapability = {
20028
20049
  auth: "admin"
20029
20050
  }),
20030
20051
  /**
20052
+ * Set one node's multi-device inference opt-in (Phase 4 multi-device) — the
20053
+ * per-node `deviceKey → { enabled, weight }` map that decides which
20054
+ * accelerators the dispatcher may balance detection sessions across.
20055
+ * The map REPLACES the node's stored `inferenceDevices` wholesale (pass the
20056
+ * complete desired set; an empty map clears the opt-in → the node reverts to
20057
+ * its single DEFAULT accelerator). `weight` is optional and defaults to 1.
20058
+ * Creates the node's settings entry if absent. Changes take effect on the
20059
+ * next dispatch/rebalance cycle — the dispatcher reads the enabled set via
20060
+ * `PipelineSettingsStore.buildNodeInferenceDevices` when placing sessions.
20061
+ */
20062
+ setAgentInferenceDevices: method(z.object({
20063
+ agentNodeId: z.string(),
20064
+ inferenceDevices: z.record(z.string(), z.object({
20065
+ enabled: z.boolean(),
20066
+ weight: z.number().positive().optional()
20067
+ }))
20068
+ }), z.object({ success: z.literal(true) }), {
20069
+ kind: "mutation",
20070
+ auth: "admin"
20071
+ }),
20072
+ /**
20031
20073
  * Reset one node's pipeline to its hardware-aware defaults — the HONEST
20032
20074
  * reset (replaces the executor's legacy `resetToDefault`, which cleared a
20033
20075
  * dead persisted step-tree seed nothing in the live path read):
@@ -29134,6 +29176,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
29134
29176
  addonId: null,
29135
29177
  access: "create"
29136
29178
  },
29179
+ "pipelineOrchestrator.setAgentInferenceDevices": {
29180
+ capName: "pipeline-orchestrator",
29181
+ capScope: "system",
29182
+ addonId: null,
29183
+ access: "create"
29184
+ },
29137
29185
  "pipelineOrchestrator.setAgentMaxCameras": {
29138
29186
  capName: "pipeline-orchestrator",
29139
29187
  capScope: "system",
@@ -31503,31 +31551,52 @@ function scoreRuntimes(hw) {
31503
31551
  };
31504
31552
  }
31505
31553
  var DEVICE_FOR_BACKEND = {
31506
- openvino: "gpu",
31507
31554
  cuda: "gpu",
31508
31555
  edgetpu: "usb",
31509
31556
  coreml: "all",
31510
31557
  cpu: "cpu"
31511
31558
  };
31559
+ function device(backend, dev, format, score) {
31560
+ return {
31561
+ key: backend === "cpu" ? "cpu" : `${backend}:${dev}`,
31562
+ backend,
31563
+ device: dev,
31564
+ format,
31565
+ runtime: "python",
31566
+ score,
31567
+ available: true
31568
+ };
31569
+ }
31512
31570
  /**
31513
- * Enumerate every usable inference device on a node, one descriptor per scored
31514
- * backend. Unlike the elected `bestScore`, this returns the FULL set so the
31515
- * orchestrator can run and balance across all accelerators concurrently.
31571
+ * Enumerate every usable inference device on a node one descriptor PER PHYSICAL
31572
+ * ACCELERATOR, so the orchestrator can run and balance across all of them
31573
+ * CONCURRENTLY (each device is its own pool). Critically, OpenVINO is expanded
31574
+ * into its distinct devices (NPU / iGPU / CPU) rather than a single AUTO entry:
31575
+ * the Intel NPU ("AI Boost") and the iGPU are separate accelerators and run in
31576
+ * parallel — collapsing them to AUTO would leave one idle. NPU is scored above
31577
+ * the iGPU (faster for int8 detection AND frees the GPU).
31516
31578
  */
31517
31579
  function enumerateInferenceDevices(hw) {
31518
31580
  const { scores } = scoreRuntimes(hw);
31519
- return scores.map((s) => {
31520
- const device = DEVICE_FOR_BACKEND[s.backend] ?? s.backend;
31521
- return {
31522
- key: s.backend === "cpu" ? "cpu" : `${s.backend}:${device}`,
31523
- backend: s.backend,
31524
- device,
31525
- format: s.format,
31526
- runtime: "python",
31527
- score: s.score,
31528
- available: s.available
31529
- };
31530
- });
31581
+ const out = [];
31582
+ for (const s of scores) {
31583
+ if (s.backend === "openvino") {
31584
+ if (hw.npu?.type === "intel-npu") out.push(device("openvino", "npu", s.format, s.score + 2));
31585
+ if (hw.gpu?.type === "intel") out.push(device("openvino", "gpu", s.format, s.score));
31586
+ continue;
31587
+ }
31588
+ if (s.backend === "edgetpu") {
31589
+ const coralCount = Math.max(1, hw.coral?.count ?? 1);
31590
+ for (let i = 0; i < coralCount; i++) {
31591
+ const dev = i === 0 ? "usb" : `usb:${i}`;
31592
+ out.push(device("edgetpu", dev, s.format, s.score));
31593
+ }
31594
+ continue;
31595
+ }
31596
+ const dev = DEVICE_FOR_BACKEND[s.backend] ?? s.backend;
31597
+ out.push(device(s.backend, dev, s.format, s.score));
31598
+ }
31599
+ return out;
31531
31600
  }
31532
31601
  //#endregion
31533
31602
  export { ACCESSORY_LABEL, ALL_CAPABILITY_DEFINITIONS, APPLE_SA_TO_MACRO, AUDIO_BACKEND_CHOICES, AUDIO_MACRO_LABELS, AccessoriesStatusSchema, AccessoryKind, AddBrokerInputSchema, AddonAutoUpdateSchema, AddonListItemSchema, AddonPageDeclarationSchema, AddonPageInfoSchema, AdoptInputSchema as AdoptionAdoptInputSchema, AdoptResultSchema as AdoptionAdoptResultSchema, AdoptionFilterSchema, GetCandidateInputSchema as AdoptionGetCandidateInputSchema, ListCandidatesInputSchema as AdoptionListCandidatesInputSchema, ListCandidatesOutputSchema as AdoptionListCandidatesOutputSchema, ReleaseInputSchema as AdoptionReleaseInputSchema, AdoptionStatusSchema, AgentLoadSummarySchema, AirQualitySensorStatusSchema, AlarmArmModeSchema, AlarmPanelStatusSchema, AlarmStateSchema, AlertSchema, AlertSeveritySchema, AlertSourceSchema, AlertStatusSchema, AmbientLightSensorStatusSchema, ApiKeyRecordSchema, ApiKeySummarySchema, ArchiveEntrySchema, ArchiveManifestSchema, AttachmentMediaTypeSchema, AttachmentSchema, AudioAnalysisResultSchema, AudioAnalysisSettingsSchema, AudioChunkInputSchema, AudioClassSummarySchema, AudioClassificationLabelSchema, AudioClassificationResultSchema, AudioCodecInfoSchema, AudioDecodeSessionConfigSchema, AudioEncodeSchema, AudioEncodeSessionConfigSchema, AudioEncodedChunkSchema, AudioEventSchema, AudioLevelSchema, AudioMetricsHistoryPointSchema, AudioMetricsHistorySchema, AudioMetricsSnapshotSchema, AudioPcmChunkSchema, AuthResultSchema, AutoUpdateSettingsSchema, AutomationControlStatusSchema, AvailableIntegrationTypeSchema, BACKEND_TO_FORMAT, BATTERY_DEVICE_PROFILE, BacklightModeSchema, BackupDestinationInfoSchema, BackupEntrySchema, BaseAddon, BaseDevice, BaseDeviceProvider, BatteryStatusSchema, BinaryStatusSchema, BoundingBoxSchema, BrightnessStatusSchema, AddInputSchema as BrokerAddInputSchema, BrokerAudioClientSchema, BrokerClientsSchema, BrokerConnectionDetailsSchema, BrokerConsumerAttributionSchema, BrokerConsumerKindSchema, BrokerDecodedClientSchema, BrokerEncodedClientSchema, GetStateInputSchema as BrokerGetStateInputSchema, BrokerInfoSchema, BrokerProviderInfoSchema, PublishInputSchema as BrokerPublishInputSchema, RegistryStatusSchema as BrokerRegistryStatusSchema, BrokerRtspClientSchema, BrokerStatsSchema, BrokerStatusEnum, BrokerStatusSchema, SubscribeInputSchema as BrokerSubscribeInputSchema, SubscribeResultSchema as BrokerSubscribeResultSchema, TestConnectionResultSchema as BrokerTestConnectionResultSchema, UnsubscribeInputSchema as BrokerUnsubscribeInputSchema, CAM_PROFILE_ORDER, CAPABILITY_NAMES, CAPABILITY_ROUTER_KEYS, CAP_NAMES_WITH_STATUS, CAP_NODE_PIN_CONTEXT_KEY, CAP_PROVIDER_KIND_MAP, COCO_80_LABELS, COCO_TO_MACRO, CamProfileSchema, CamStreamDescriptorSchema, CamStreamKindSchema, CamStreamResolutionSchema, CameraAssignmentStatusSchema, CameraAudioStatusSchema, CameraBrokerProfileSchema, CameraBrokerStatusSchema, CameraCredentialsSchema, CameraCredentialsStatusSchema, CameraDecoderShmSchema, CameraDecoderStatusSchema, CameraDetectionPhaseSchema, CameraDetectionProvisioningSchema, CameraDetectionProvisioningStateSchema, CameraDetectionStatusSchema, CameraMetricsSchema, CameraMetricsWithDeviceIdSchema, CameraMotionStatusSchema, CameraRecordingModeSchema, CameraRecordingStatusSchema, CameraSourceStatusSchema, CameraSourceStreamSchema, CameraStatusSchema, CameraStreamSchema, CandidateQueryFilterSchema, CapScopeSchema, CapabilityBindingsSchema, CarbonMonoxideStatusSchema, ChargingStatus, ClientNetworkStatsSchema, ClimateControlStatusSchema, ClipPlaybackSchema, ClipSchema, ClusterAddonNodeDeploymentSchema, ClusterAddonStatusEntrySchema, CollectionColumnSchema, CollectionIndexSchema, ColorStatusSchema, ConfigEntrySchema, ConfigSectionWithValuesSchema, ConfigTabDeclarationSchema, ConnectivityStatusSchema, ConsumableItemSchema, ConsumablesStatusSchema, ContactStatusSchema, ControlKindSchema, ControlStatusSchema, ConvertArtifactSchema, ConvertResultSchema, ConvertTargetSchema, CoverStateSchema, CoverStatusSchema, CreateApiKeyInputSchema, CreateApiKeyResultSchema, CreateIntegrationInputSchema, CreateScopedTokenInputSchema, CreateScopedTokenResultSchema, CreateUserInputSchema, CustomActionInputSchema, CustomModelDescriptorSchema, DATAPLANE_SECRET_HEADER, DEFAULT_ADDON_PLACEMENT, DEFAULT_AUDIO_ANALYZER_CONFIG, DEFAULT_DECODER_HWACCEL_CONFIG, DEFAULT_EVENT_COLOR, DEFAULT_FEATURES, DEFAULT_RETENTION, DEFAULT_SCRUB_THUMBNAIL_PRESET, DEVICE_CAP_NAMES, DEVICE_PROFILES, DEVICE_SETTINGS_CONTRIBUTION_METHODS, DEVICE_STATUS_METHOD, DEVICE_TYPE_CONTROL_KIND, DEVICE_TYPE_INFO, DayNightModeSchema, DayNightOptionsSchema, DayNightSettingsPatchSchema, DayNightStatusSchema, DecodedAudioChunkSchema, DecodedFrameSchema, DecoderSessionConfigSchema, DecoderStatsSchema, DeleteIntegrationResultSchema, DetectionSourceSchema, DeviceCodeSeveritySchema, DeviceConfig, DeviceDiscoveryStatusSchema, ExposeInputSchema as DeviceExportExposeInputSchema, DeviceExportStatusSchema, UnexposeInputSchema as DeviceExportUnexposeInputSchema, DeviceFeature, DeviceInfoSchema, DeviceLinkModeSchema, DeviceNetworkStatsSchema, DeviceRole, DeviceRuntimeState, DeviceStatusSchema, DeviceType, DiscoveredChildDeviceSchema, DiscoveredChildStatusSchema, DiscoveredDeviceSchema, DiscoveredTargetSchema, DisposerChain, DoorbellPressEventSchema, DoorbellStatusSchema, EVENTFUL_CAP_NAMES, EVENT_KIND_BY_CAP, EVENT_PAD_MS, EVENT_TAXONOMY, EXPRESSION_BUILTINS, EXPRESSION_BUILTIN_NAMES, EXPRESSION_COMPILE_CACHE_CAPACITY, EXPRESSION_IDENTIFIER_RE, EXPRESSION_INJECTED_NOW, ElementConfigStore, EmbeddingInfoSchema, EmbeddingResultSchema, EncodeProfileSchema, EncodedPacketSchema, EnrichedWidgetMetadataSchema, EnumSensorDateTimeFormatSchema, EnumSensorStatusSchema, EventCategory, EventEmitterStatusSchema, EventFireSchema, EventItemSchema, EventKindCategorySchema, EventKindDescriptorSchema, EventKindIconSchema, EventKindSchema, EventSourceType, ExportDownloadSchema, ExportOptionsSchema, ExportRecordSchema, ExportSetupFieldSchema, ExportSetupSchema, ExportSpeedSchema, ExportStateSchema, ExportTimelapseSchema, ExposedDeviceSchema, ExposureModeSchema, ExpressionEvalError, ExpressionParseError, FanControlStatusSchema, FanDirectionSchema, FeatureManifestSchema, FeatureProbeStatusSchema, FloodStatusSchema, FrameHandleFormatSchema, FrameHandleSchema, FrameInputSchema, GasStatusSchema, GetStreamWithCodecInputSchema, GlobalMetricsSchema, HF_BASE_URL, HF_REPO, HWACCEL_OPTIONS, HealthStatusSchema, HistoryPointSchema, HistoryResolutionEnum, HumidifierStatusSchema, HumiditySensorStatusSchema, HvacModeSchema, ImageRotateSchema, ImageSettingsOptionsSchema, ImageSettingsPatchSchema, ImageSettingsStatusSchema, ImageStatusSchema, IngestOwnerSchema, InstalledPackageSchema, IntegrationLiteSchema, IntegrationWithStateSchema, IntercomAbilitySchema, IntercomStatusSchema, KNOWN_CAP_NAMES, KeyEventSchema, LabelDefinitionSchema, LawnMowerActivitySchema, LawnMowerControlStatusSchema, LinkedDeviceSchema, LlmDefaultSchema, LlmDefaultSelectorSchema, LlmErrorCodeSchema, LlmGenerateBaseInputSchema, LlmGenerateErrSchema, LlmGenerateOkSchema, LlmGenerateResultSchema, LlmImageSchema, LlmNodeModelSchema, LlmProfileKindDescriptorSchema, LlmProfileKindSchema, LlmProfileSchema, LlmRuntimeCompleteInputSchema, LlmRuntimeDiskUsageSchema, LlmRuntimeNodeSchema, LlmRuntimeStatusSchema, LlmUsageRollupSchema, LlmUsageSchema, LocateSegmentResultSchema, LocationStatSchema, LockControlStatusSchema, LockStateSchema, LogEntrySchema, LogLevelSchema, LogStreamEntrySchema, LoginMethodContributionSchema, LoginStageEnum, MACRO_LABELS, MAX_EXPRESSION_AST_NODES, MAX_EXPRESSION_BINDINGS, MAX_EXPRESSION_CALL_ARGS, MAX_EXPRESSION_EVAL_STEPS, MAX_EXPRESSION_SOURCE_LENGTH, METHOD_ACCESS_MAP, MODEL_FORMATS, MOTION_TRIGGER_FEATURE, ManagedModelCatalogEntrySchema, ManagedModelRefSchema, ManagedRuntimeConfigSchema, MaskGridDimsSchema, MaskGridShapeSchema, MaskLineShapeSchema, MaskPointSchema, MaskPolygonShapeSchema, MaskPolygonVerticesSchema, MaskRectShapeSchema, MaskShapeKindSchema, MaskShapeSchema, MediaFileSchema, MediaPlayerRepeatSchema, MediaPlayerStateSchema, MediaPlayerStatusSchema, MeshPeerSchema, MeshStatusSchema, MethodAccessSchema, ModelCatalogEntrySchema, ModelConvertInputSchema, ModelConvertMetadataSchema, ModelDistributeInputSchema, ModelDistributeResultSchema, ModelExtraFileSchema, ModelFormatEntrySchema, ModelFormatsSchema, ModelSubstitutionSchema, ModelVariantGroupSchema, MotionAnalysisResultSchema, MotionEventSchema, MotionOnMotionChangedDataSchema, MotionRegionSchema, MotionSourceEnum, MotionSourcesSchema, MotionStatusSchema, MotionTriggerRuntimeStateSchema, MotionTriggerStatusSchema, MotionZoneOptionsSchema, MotionZonePatchSchema, MotionZoneRegionSchema, MotionZoneStatusSchema, StatusSchema as MqttBrokerStatusSchema, NativeDetectionSchema, NativeObjectClassEnum, NativeObjectDetectionRuntimeStateSchema, NativeObjectDetectionStatusSchema, NetworkAccessStatusSchema, NetworkAddressSchema, NetworkEndpointSchema, NotificationActionSchema, NotificationFormatSchema, NotificationHistoryEntrySchema, NotificationRuleSchema, NotificationSchema, NotifierStatusSchema, NumericSensorStatusSchema, OPS_LOG_DEFAULT_LIMIT, OPS_LOG_RING_DEFAULT_MAX, OauthIntegrationDescriptorSchema, ObjectEventSchema, OpsLogDomainSchema, OpsLogEntrySchema, OpsLogOpSchema, OpsLogQueryInputSchema, OpsLogReasonSchema, OrchestratorMetricsSchema, OsdOverlayKindEnum, OsdOverlayPatchSchema, OsdOverlaySchema, OsdPositionEnum, OsdStatusSchema, PET_FEEDER_MANUAL_FEED_MAX, PET_FEEDER_MANUAL_FEED_MIN, PIPELINE_FLOW_CAPABILITY_NAMES, PIPELINE_OWNER_CAPABILITY_NAMES, PROVIDER_KIND_CAP_NAMES, PYTHON_SCRIPT, PackageUpdateSchema, PackageVersionInfoSchema, PasskeyLoginMethodSchema, PasskeySummarySchema, PcmSampleFormatSchema, PerScopeBreakdownSchema, PetFeederStatusSchema, PickStreamPreferencesSchema, PickStreamRequirementsSchema, PickedCamStreamSchema, PipelineAssignmentSchema, PipelineDefaultStepSchema, PipelineEngineChoiceSchema, PipelineRunResultBridge, PipelineStepInputSchema, PipelineValidationIssueSchema, PipelineValidationResultSchema, PlaceholderReasonSchema, PolygonPointSchema, PowerMeterStatusSchema, PresenceStatusSchema, PressureSensorStatusSchema, PrivacyMaskOptionsSchema, PrivacyMaskPatchSchema, PrivacyMaskRegionSchema, PrivacyMaskShapeSchema, PrivacyMaskStatusSchema, ProfileRtspEntrySchema, ProfileSlotSchema, ProfileSlotStatusSchema, ProviderStatusSchema, PtzAutotrackRuntimeStateSchema, PtzAutotrackSettingsSchema, PtzAutotrackStatusSchema, PtzAutotrackTargetOptionSchema, PtzMoveCommandSchema, PtzPositionSchema, PtzPresetSchema, PtzStatusSchema, QueryFilterSchema, REACHABILITY_FAILURES_TO_OFFLINE, REACHABILITY_POLL_INTERVAL_MS, REACHABILITY_PROBE_TIMEOUT_MS, RECOGNITION_TYPES, RESERVED_BINDING_NAMES, RUNTIME_DEFAULTS, RUNTIME_TO_FORMAT, RawStateResultSchema, ReadSegmentBytesResultSchema, ReadinessRegistry, ReadinessTimeoutError, RecentTracksPageSchema, RecentTracksQueryInput, RecordingAvailabilitySchema, RecordingBandModeSchema, RecordingBandSchema, RecordingBandTriggersSchema, RecordingConfigSchema, RecordingDaysSchema, RecordingDeviceUsageSchema, RecordingLocationUsageSchema, RecordingManifestSchema, RecordingModeSchema, RecordingRangeSchema, RecordingRetentionSchema, RecordingRuleSchema, RecordingScheduleSchema, RecordingStatusSchema, RecordingStorageModeSchema, RecordingStorageUsageSchema, RecordingTriggersSchema, RecordingWeekdaySchema, RedirectLoginMethodSchema, RenderedAsSchema, ReportMotionInputSchema, RingBuffer, RtpSourceSchema, RtspRestreamEntrySchema, RunnerCameraConfigSchema, RunnerCameraDeviceUIFields, RunnerFrameSourceSchema, RunnerLocalLoadSchema, RunnerLocalMetricsSchema, SCOPE_PRESETS, SCRUB_THUMBNAIL_PRESETS, SCRUB_THUMBNAIL_PRESET_LABELS, SCRUB_THUMBNAIL_PRESET_ORDER, SENSOR_FEATURES, SENSOR_MAP, SOURCE_INFO_METADATA_KEY, STREAM_PROFILE_META, STREAM_QUALITY_LABELS, SUB_DETECTION_TYPES, SYSTEM_CAP_NAMES, SceneCheckSchema, SceneConditionSchema, SceneMonitorSchema, SceneMonitorStateSchema, SceneMonitorStatusSchema, SceneReferenceSchema, ScopedTokenSchema, ScopedTokenSummarySchema, ScoredObjectEventSchema, ScriptRunnerStatusSchema, ScrubThumbnailPresetSchema, SearchResultSchema, SendEmailInputSchema, SendEmailResultSchema, SendResultSchema, SensorEventSchema, ServerBootModeSchema, ServerPackageStatusSchema, ServerRollbackInfoSchema, ServerUpdateActionResultSchema, ServerUpdateCheckResultSchema, ServerUpdateStateSchema, SettingsPatchSchema, SettingsRecordSchema, SettingsSchemaWithValuesSchema, SettingsUpdateResultSchema, ShmRingStatsSchema, SmokeStatusSchema, SmtpStatusSchema, SnapshotImageSchema, SourceInfoSchema, SpatialDetectionSchema, SsoBridgeClaimsSchema, StartEmbeddedInputSchema, StationaryObjectSchema, AbortUploadInputSchema as StorageAbortUploadInputSchema, BeginDownloadInputSchema as StorageBeginDownloadInputSchema, BeginDownloadResultSchema as StorageBeginDownloadResultSchema, BeginUploadInputSchema as StorageBeginUploadInputSchema, BeginUploadResultSchema as StorageBeginUploadResultSchema, EndDownloadInputSchema as StorageEndDownloadInputSchema, FinalizeUploadInputSchema as StorageFinalizeUploadInputSchema, StorageLocationDeclarationSchema, StorageLocationRefSchema, StorageLocationSchema, StorageLocationTypeSchema, ProviderInfoSchema as StorageProviderInfoSchema, ReadChunkInputSchema as StorageReadChunkInputSchema, TestLocationResultSchema as StorageTestLocationResultSchema, WriteChunkInputSchema as StorageWriteChunkInputSchema, StreamCodecSchema, StreamFormatSchema, StreamNetworkStatsSchema, StreamParamsOptionsSchema, StreamParamsStatusSchema, StreamProfileConfigSchema, StreamProfileOptionsSchema, StreamProfilePatchSchema, StreamProfileSchema, StreamSourceEntrySchema, StreamSourceSchema, SubscribeAudioChunksInputSchema, SubscribeAudioChunksResultSchema, SubscribeFramesInputSchema, SubscribeFramesResultSchema, SwitchStatusSchema, SystemMetricsSchema, SystemMirror, TAXONOMY_COLORS, TIMEZONES, TamperStatusSchema, TankStatusSchema, TargetKindCapsSchema, TargetKindLevelSchema, TargetKindSchema, TargetSchema, TemperatureSensorStatusSchema, TestConnectionResultSchema$1 as TestConnectionResultSchema, TestResultSchema, ToastSchema, TokenScopeSchema, TopologyNodeSchema, TopologyProcessSchema, TopologyServiceSchema, TrackCascadeCountsSchema, TrackEnvelopeSchema, TrackProjectionSchema, TrackSchema, TrackStateSchema, TrackZoneFilterSchema, TrackedDetectionSchema, TurnServerSchema, UNIT_TABLE, BrokerInfoSchema$1 as UnifiedBrokerInfoSchema, UnitConversionError, UpdateIntegrationInputSchema, UpdateStatusSchema, UpdateUserInputSchema, UserRecordSchema, UserSummarySchema, VacuumControlStatusSchema, VacuumStateSchema, ValveStateSchema, ValveStatusSchema, VibrationStatusSchema, VideoEncodeSchema, WELL_KNOWN_TABS, WELL_KNOWN_TAB_MAP, WaterHeaterStatusSchema, WeatherStatusSchema, WebrtcStreamChoiceSchema, WebrtcStreamTargetSchema, WhiteBalanceModeSchema, WidgetHostEnum, WidgetLoginMethodSchema, WidgetMetadataSchema, WidgetRemoteSchema, WidgetSizeEnum, YAMNET_TO_MACRO, ZoneKindEnum, ZoneRuleModeEnum, ZoneRuleSchema, ZoneRuleStageEnum, ZoneRulesArraySchema, ZoneSchema, ZoneScopeBreakdownSchema, accessoriesCapability, accessoryStableId, addonPagesCapability, addonPagesSourceCapability, addonRoutesCapability, addonSettingsCapability, addonWidgetsCapability, addonWidgetsSourceCapability, addonsCapability, adminUiCapability, advancedNotifierCapability, airQualitySensorCapability, alarmPanelCapability, alertsCapability, ambientLightSensorCapability, applyTransform, asBoolean, asJsonArray, asJsonObject, asNumber, asString, audioAnalysisCapability, audioAnalyzerCapability, audioCodecCapability, audioMetricsCapability, authProviderCapability, autoAssignProfiles, automationControlCapability, backupCapability, batteryCapability, bestLocationMatch, binaryCapability, bindAddonActions, brightnessCapability, brokerCapability, buildAddonRouteProvider, buildEventKindDescriptor, buildModelVariantGroups, buildStreamParamsConfigSchema, buttonCapability, cameraCredentialsCapability, cameraPipelineConfigCapability, cameraStreamsCapability, canConvertUnit, carbonMonoxideCapability, cellsToRects, classifyStream, classifyStreams, climateControlCapability, collectHydratedFieldEntries, collectHydratedFieldValues, colorCapability, colorForKind, compileExpression, compileExpressionSafe, connectivityCapability, consumablesCapability, contactCapability, controlCapability, convertUnit, cosineSimilarity, coverCapability, createDeviceProxy, createDurableState, createEvent, createExpressionScope, createLazyTrpcSource, createMirrorSource, createRuntimeStateBridge, createSliceHandle, createSystemProxy, customAction, customModelRegistryCapability, dayNightCapability, decoderCapability, defaultDeviceFor, defineCustomActions, describeModelVariant, detectionPipelineCapability, deviceAdoptionCapability, deviceCustomAction, deviceDiscoveryCapability, deviceExportCapability, deviceManagerCapability, deviceMatchesProfile, deviceOpsCapability, deviceProviderCapability, deviceStateCapability, deviceStatusCapability, doorbellCapability, embeddingEncoderCapability, emitDownForOwnedCaps, emitReadiness, encodeProfileFromStreamShape, enumSensorCapability, enumerateInferenceDevices, enumerateItemArrayFields, enumerateSchemaFields, errMsg, evaluateAst, evaluateLinkExpression, evaluateZoneRules, event, eventEmitterCapability, eventsCapability, expandCapMethods, extractNestedAddonId, extractSourceInfoFromMetadata, faceGalleryCapability, fanControlCapability, featureProbeCapability, filesystemBrowseCapability, findTimezone, floodCapability, formatForBackend, formatForRuntime, gasCapability, getAudioMacroClassIds, getByPath, getCapsByProviderKind, getTaxonomyEntry, hasMotionTrigger, hfModelUrl, htmlToText, humidifierCapability, humiditySensorCapability, hydrateSchema, imageCapability, imageSettingsCapability, integrationsCapability, intercomCapability, isAgentOnlyPlacement, isArrayOutputSchema, isCollectionArrayMethod, isDeployableToAgent, isDeviceConfigCap, isEvent, isNode, isObjectInput, isVoidInput, jobKindSchema, kebabToCamel, lawnMowerControlCapability, lifecycleJobSchema, lifecycleJobScopeSchema, lifecycleJobStateSchema, lifecycleTaskSchema, llmCapability, llmRuntimeCapability, localNetworkCapability, locationSimilarity, lockControlCapability, logDestinationCapability, loginMethodCapability, looseSchema, makeProfileBrokerId, makeSourceBrokerId, mapAudioLabelToMacro, markdownToHtmlLite, markdownToText, maskUrlCredentials, mediaPlayerCapability, mergeSourceInfo, meshNetworkCapability, method, metricsProviderCapability, migrateConfigToBands, modelConvertCapability, modelDistributorCapability, modelFormatForRuntime, motionCapability, motionDetectionCapability, motionTriggerCapability, motionZonesCapability, mqttBrokerCapability, nativeObjectDetectionCapability, networkAccessCapability, networkQualityCapability, nodePin, nodesCapability, normalizeAddonInitResult, normalizeUnit, notificationOutputCapability, notifierCapability, numericSensorCapability, oauthIntegrationCapability, objectInputDeclaresAddonId, osdCapability, parseCameraStreamConfig, parseExpression, parseJsonArray, parseJsonObject, parseJsonUnknown, parseProfileBrokerId, parseStreamParamsFormPatch, petFeederCapability, pickAccessoryControl, pickPreferredRtspEntry, pipelineAnalyticsCapability, pipelineExecutorCapability, pipelineOrchestratorCapability, pipelineRunnerCapability, plateGalleryCapability, platformProbeCapability, powerMeterCapability, prepareNotification, presenceCapability, pressureSensorCapability, privacyMaskCapability, procedureAuthKey, ptzAutotrackCapability, ptzCapability, pythonScriptForBackend, readNodePin, readinessKey, rebootCapability, recordingCapability, recordingExportCapability, rectsToCells, requiresPython, resolveAddonExecution, resolveAddonGroup, resolveAddonPlacement, resolveAddonRuntime, resolveCapMount, resolveDetectionRuntime, resolveDeviceControlKind, resolveDeviceProfile, resolveFormat, resolveHydratedFieldValue, resolveModelFormat, resolveMutate, resolveRunnerId, resolveScrubThumbnailGeometry, resolveVariantModelId, runInferenceStep, runtimeDevices, sceneMonitorCapability, scopeKey, scoreRuntimes, scriptRunnerCapability, selectAssignedProfileSlots, serverManagementCapability, setByPath, settingsStoreCapability, sleep, sleepCancellable, smokeCapability, smtpProviderCapability, snapshotCapability, ssoBridgeCapability, startReachabilityPoll, storageCapability, storageEvictableCapability, storageProviderCapability, streamBrokerCapability, streamCatalogCapability, streamParamsCapability, streamPixels, streamQualityLabel, subKindsOf, supportedRuntimes, switchCapability, synthesizeSourceInfo, systemCapability, tamperCapability, taskLogEntrySchema, taskPhaseSchema, taskTargetSchema, temperatureSensorCapability, textToHtml, toDeviceSummary, toExpressionValue, toStreamSourceEntry, toastCapability, tokenize, transcodeBody, tryConvertUnit, turnProviderCapability, unitDimension, unitsForDimension, updateCapability, userManagementCapability, userPasskeysCapability, vacuumControlCapability, validateExpressionSource, valveCapability, vibrationCapability, videoclipsCapability, viewerUiCapability, waterHeaterCapability, weatherCapability, webrtcClientHintsSchema, webrtcSessionCapability, wiringAddonHealthSchema, wiringHealthSnapshotSchema, wiringNodeHealthSchema, wiringProbeKindSchema, wiringProbeResultSchema, zodEntriesToConfigUI, zoneAnalyticsCapability, zoneRulesCapability, zonesCapability };
@@ -63,9 +63,13 @@ interface ScoreRuntimesResult {
63
63
  */
64
64
  export declare function scoreRuntimes(hw: HardwareInfo): ScoreRuntimesResult;
65
65
  /**
66
- * Enumerate every usable inference device on a node, one descriptor per scored
67
- * backend. Unlike the elected `bestScore`, this returns the FULL set so the
68
- * orchestrator can run and balance across all accelerators concurrently.
66
+ * Enumerate every usable inference device on a node one descriptor PER PHYSICAL
67
+ * ACCELERATOR, so the orchestrator can run and balance across all of them
68
+ * CONCURRENTLY (each device is its own pool). Critically, OpenVINO is expanded
69
+ * into its distinct devices (NPU / iGPU / CPU) rather than a single AUTO entry:
70
+ * the Intel NPU ("AI Boost") and the iGPU are separate accelerators and run in
71
+ * parallel — collapsing them to AUTO would leave one idle. NPU is scored above
72
+ * the iGPU (faster for int8 detection AND frees the GPU).
69
73
  */
70
74
  export declare function enumerateInferenceDevices(hw: HardwareInfo): readonly InferenceDeviceDescriptor[];
71
75
  export {};
@@ -57,6 +57,13 @@ export interface PipelineRunInput {
57
57
  */
58
58
  readonly image?: Uint8Array;
59
59
  readonly deviceId?: number;
60
+ /**
61
+ * Inference-device selector (Phase 2 multi-device). `<backend>:<device>`
62
+ * (e.g. `openvino:npu`, `openvino:gpu`, `edgetpu:usb`, `cpu`). Omitted ⇒ the
63
+ * node's default engine pool. Routes the call to that device's own pool so a
64
+ * node runs detection on NPU + iGPU + Coral concurrently.
65
+ */
66
+ readonly deviceKey?: string;
60
67
  /**
61
68
  * Correlation id tagged on every `pipeline.progress` event emitted
62
69
  * by this run. When a UI-initiated one-shot (`runPipelineTest`)
@@ -23,6 +23,8 @@ export interface GpuInfo {
23
23
  }
24
24
  export interface NpuInfo {
25
25
  readonly type: 'apple-ane' | 'intel-npu';
26
+ /** Human-readable accelerator name (e.g. `Intel AI Boost NPU`), when known. */
27
+ readonly name?: string;
26
28
  }
27
29
  /**
28
30
  * Coral USB Edge TPU (Google Coral). A discrete USB inference accelerator that
@@ -34,6 +36,14 @@ export interface CoralInfo {
34
36
  readonly type: 'coral-edgetpu';
35
37
  /** Bus location hint (e.g. `usb`), informational. */
36
38
  readonly bus?: string;
39
+ /**
40
+ * Number of physically attached Coral Edge TPUs. Multiple Corals coexist on
41
+ * one host and run CONCURRENTLY, one inference pool each — the enumerator emits
42
+ * one device descriptor per unit (`edgetpu:usb`, `edgetpu:usb:1`, …). Omitted /
43
+ * undefined ⇒ treat as a single Coral (the probe couldn't count them, e.g. a
44
+ * container with a limited `/sys` USB view — the delegate-presence fallback).
45
+ */
46
+ readonly count?: number;
37
47
  }
38
48
  /** A probed backend with availability and score */
39
49
  export interface PlatformScore {
@@ -100,6 +100,22 @@ export interface AgentPipelineSettings {
100
100
  * auto-detected address is wrong (multi-homed host, NAT, custom interface).
101
101
  */
102
102
  readonly reachableHost?: string;
103
+ /**
104
+ * Multi-device inference opt-in (Phase 4 multi-device). Maps a device key
105
+ * (`openvino:npu`, `openvino:gpu`, `edgetpu:usb`, `edgetpu:usb:1`, `cpu`, …
106
+ * from `enumerateInferenceDevices`) to whether the orchestrator may dispatch
107
+ * detection SESSIONS onto that device's pool, plus a relative `weight`.
108
+ *
109
+ * Absent / all-disabled ⇒ the node runs detection on its single DEFAULT
110
+ * device (the runner picks it; deviceKey is left unset) — the safe default:
111
+ * one best accelerator, others opt-in. When TWO+ keys are enabled the
112
+ * dispatcher balances new sessions across them (weighted, by active-session
113
+ * count) so the accelerators run CONCURRENTLY.
114
+ */
115
+ readonly inferenceDevices?: Readonly<Record<string, {
116
+ readonly enabled: boolean;
117
+ readonly weight?: number;
118
+ }>>;
103
119
  }
104
120
  /**
105
121
  * Per-camera pipeline settings. Sparse by design — a camera that has
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/types",
3
- "version": "1.1.55",
3
+ "version": "1.1.57",
4
4
  "description": "Shared types, interfaces, and model catalogs for the CamStack detection ecosystem",
5
5
  "keywords": [
6
6
  "camstack",