@camstack/addon-provider-reolink 1.1.31 → 1.2.1

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.
Files changed (3) hide show
  1. package/dist/addon.js +200 -51
  2. package/dist/addon.mjs +200 -51
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -12638,10 +12638,7 @@ var ConfigUISchemaNullableBridge = custom$2();
12638
12638
  var InferenceCapabilitiesBridge = custom$2();
12639
12639
  var ModelAvailabilityListBridge = custom$2();
12640
12640
  var PipelineRunResultBridge = custom$2();
12641
- method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
12642
- kind: "mutation",
12643
- auth: "admin"
12644
- }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
12641
+ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
12645
12642
  modelId: string(),
12646
12643
  settings: record(string(), unknown()).readonly()
12647
12644
  }))), method(object({ steps: record(string(), object({
@@ -12701,13 +12698,33 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
12701
12698
  * (inputClasses ≠ null) are skipped and served per-track via
12702
12699
  * pipelineRunner.runDetailSubtree (two-plane design).
12703
12700
  */
12704
- plane: _enum(["full", "frame"]).optional()
12701
+ plane: _enum(["full", "frame"]).optional(),
12702
+ /**
12703
+ * Inference-device selector (Phase 2 multi-device). Format
12704
+ * `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`).
12705
+ * Omitted ⇒ the runner's default device (current single-engine
12706
+ * behaviour). Selects WHICH device pool of the node runs the call.
12707
+ */
12708
+ deviceKey: string().optional()
12705
12709
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
12706
12710
  engine: PipelineEngineChoiceSchema.optional(),
12707
12711
  steps: array(PipelineStepInputSchema).min(1),
12708
12712
  frames: array(FrameInputSchema).min(1).max(255),
12709
12713
  deviceId: number().optional(),
12710
- sessionId: string().optional()
12714
+ sessionId: string().optional(),
12715
+ /**
12716
+ * Pure-inference benchmark hint. A NONZERO uint32 pins every frame in
12717
+ * the batch to the Python pool's bench preprocess cache
12718
+ * (`_bench_frame_id`) so a REPEATED benchmark frame is decoded +
12719
+ * preprocessed ONCE and every later inference is a pure-inference cache
12720
+ * hit — the sustained-throughput run measures inference, not
12721
+ * decode+preprocess+infer. Omitted/0 for live frames (all different →
12722
+ * full preprocess every call, correct). Fresh per sustained run;
12723
+ * released via `uncacheFrame`.
12724
+ */
12725
+ frameId: number().int().nonnegative().optional(),
12726
+ /** Inference-device selector (Phase 2 multi-device); see runPipeline. */
12727
+ deviceKey: string().optional()
12711
12728
  }), object({ results: array(PipelineRunResultBridge).readonly() }), { kind: "mutation" }), method(object({
12712
12729
  data: _instanceof(Uint8Array),
12713
12730
  width: number().int().positive(),
@@ -12739,8 +12756,18 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
12739
12756
  * - `runtime` — main camera-serving engine (no idle TTL).
12740
12757
  * - `warm-override` — benchmark/test override held in the warm
12741
12758
  * cache; auto-disposed after the idle TTL.
12759
+ * - `device-pool` — a concurrent per-device pool (Phase 2
12760
+ * multi-device, keyed by `deviceKey`) resolved
12761
+ * via `resolveDeviceFactory`. Runs alongside the
12762
+ * `runtime` engine on a DIFFERENT accelerator
12763
+ * (NPU / iGPU / Coral) — this is how the
12764
+ * Engines tab shows all pools running at once.
12742
12765
  */
12743
- kind: _enum(["runtime", "warm-override"]),
12766
+ kind: _enum([
12767
+ "runtime",
12768
+ "warm-override",
12769
+ "device-pool"
12770
+ ]),
12744
12771
  /** Native pid of the underlying Python pool (null when no pool). */
12745
12772
  poolPid: number().nullable(),
12746
12773
  /** ms since this factory was last used (null when not warm-tracked). */
@@ -12875,7 +12902,21 @@ var NativeCropResultSchema = object({
12875
12902
  /** Packed rgb (24-bit) pixels of the crop. */
12876
12903
  bytes: _instanceof(Uint8Array),
12877
12904
  width: number().int().positive(),
12878
- height: number().int().positive()
12905
+ height: number().int().positive(),
12906
+ /**
12907
+ * Which source served this crop, so a quality-sensitive consumer (the native
12908
+ * `keyFrame`) can reject a degraded fallback:
12909
+ * - `native` — cut from the decode worker's retained NATIVE surface (the
12910
+ * quality path).
12911
+ * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
12912
+ * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
12913
+ * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
12914
+ *
12915
+ * OPTIONAL: a pre-tier runner (version skew) omits it — an ABSENT `tier` MUST be
12916
+ * treated as `native` (accepted) by every consumer so mixed-version clusters
12917
+ * keep the pre-tier behaviour. An ROI miss returns `null` (no tier at all).
12918
+ */
12919
+ tier: _enum(["native", "ram-fullframe"]).optional()
12879
12920
  });
12880
12921
  /** Parent detection context passed to `runDetailSubtree` — the crop's
12881
12922
  * originating detection, in FRAME-space coordinates. Reuses
@@ -13115,7 +13156,14 @@ var RunnerCameraConfigSchema = object({
13115
13156
  * camera's detect node differs from its source-owner (P2d, gated by the
13116
13157
  * `remoteSourcingNodes` rollout setting).
13117
13158
  */
13118
- frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
13159
+ frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" }),
13160
+ /**
13161
+ * Inference-device selector for this camera's sessions (Phase 2 multi-device).
13162
+ * Format `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`);
13163
+ * omitted ⇒ the runner's default device. The engine itself stays node-local —
13164
+ * this only selects WHICH device pool of that node runs the session.
13165
+ */
13166
+ deviceKey: string().optional()
13119
13167
  });
13120
13168
  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;
13121
13169
  /**
@@ -13136,6 +13184,19 @@ var RunnerLocalLoadSchema = object({
13136
13184
  avgInferenceTimeMs: number(),
13137
13185
  /** Total queue depth across motion + detection queues. */
13138
13186
  queueDepthTotal: number(),
13187
+ /**
13188
+ * Per-inference-device live load (multi-device C4). One entry per deviceKey
13189
+ * this runner currently has attached cameras on, so the orchestrator's second
13190
+ * `balance()` pass (over a node's devices) weights on real per-pool session
13191
+ * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
13192
+ * per device is 0 until the pool backlog gets a public accessor (follow-up).
13193
+ */
13194
+ devices: array(object({
13195
+ deviceKey: string(),
13196
+ backend: string(),
13197
+ attachedCameras: number(),
13198
+ queueDepthTotal: number()
13199
+ })).default([]),
13139
13200
  /** Hardware capability flags reported by this node. */
13140
13201
  hardware: object({
13141
13202
  hasGpu: boolean(),
@@ -17871,7 +17932,8 @@ var LinkedDeviceSchema = object({
17871
17932
  deviceId: number(),
17872
17933
  name: string(),
17873
17934
  location: string().nullable(),
17874
- features: array(string())
17935
+ features: array(string()),
17936
+ producesTrackedEvents: boolean().optional()
17875
17937
  });
17876
17938
  var SavedDeviceRowSchema = object({
17877
17939
  /** Numeric id reserved at allocateDeviceId time. */
@@ -19501,6 +19563,7 @@ var TrackSchema = object({
19501
19563
  deviceId: number(),
19502
19564
  className: string(),
19503
19565
  label: string().optional(),
19566
+ producingDeviceName: string().optional(),
19504
19567
  /** Track provenance. Absent ⇒ `pipeline` (legacy rows). */
19505
19568
  source: TrackSourceSchema.optional(),
19506
19569
  firstSeen: number(),
@@ -19638,7 +19701,8 @@ var MediaFileKindEnum = _enum([
19638
19701
  "fullFrameBoxed",
19639
19702
  "faceCrop",
19640
19703
  "plateCrop",
19641
- "keyFrame"
19704
+ "keyFrame",
19705
+ "keyFrameSmall"
19642
19706
  ]);
19643
19707
  var MediaFileSchema = object({
19644
19708
  key: string(),
@@ -19967,13 +20031,11 @@ var PipelineTemplateSchema = object({
19967
20031
  createdAt: string(),
19968
20032
  updatedAt: string()
19969
20033
  });
19970
- var AgentAddonConfigSchema = object({
19971
- enabled: boolean(),
20034
+ var DeviceStepConfigSchema = object({
19972
20035
  modelId: string().optional(),
19973
- settings: record(string(), unknown()).readonly()
20036
+ settings: record(string(), unknown()).optional()
19974
20037
  });
19975
20038
  var AgentPipelineSettingsSchema = object({
19976
- addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
19977
20039
  maxCameras: number().int().nonnegative().nullable().default(null),
19978
20040
  /** Per-node detection weight (relative share for the quota balancer). */
19979
20041
  detectWeight: number().positive().optional(),
@@ -19997,7 +20059,22 @@ var AgentPipelineSettingsSchema = object({
19997
20059
  * it already uses to reach the hub). Set this only when the auto-detected
19998
20060
  * address is wrong (multi-homed host, NAT, custom interface).
19999
20061
  */
20000
- reachableHost: string().optional()
20062
+ reachableHost: string().optional(),
20063
+ /**
20064
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
20065
+ * weight, steps}. Absent / all-disabled ⇒ the node's single default
20066
+ * accelerator (safe default); two+ enabled ⇒ the dispatcher balances
20067
+ * detection sessions across them so they run CONCURRENTLY. `steps` is the
20068
+ * per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
20069
+ * the default model/settings for every camera landing on that accelerator;
20070
+ * a stepId absent ⇒ the step uses that device's format default.
20071
+ */
20072
+ inferenceDevices: record(string(), object({
20073
+ enabled: boolean(),
20074
+ weight: number().positive().optional(),
20075
+ maxSessions: number().int().positive().optional(),
20076
+ steps: record(string(), DeviceStepConfigSchema).optional()
20077
+ })).optional()
20001
20078
  });
20002
20079
  var CameraPipelineForAgentSchema = object({
20003
20080
  steps: array(PipelineStepInputSchema).readonly(),
@@ -20007,14 +20084,13 @@ var CameraPipelineForAgentSchema = object({
20007
20084
  }).nullable()
20008
20085
  });
20009
20086
  var CameraStepOverridePatchSchema = object({
20010
- enabled: boolean().optional(),
20011
20087
  modelId: string().optional(),
20012
20088
  settings: record(string(), unknown()).readonly().optional()
20013
20089
  });
20014
20090
  var CameraPipelineSettingsSchema = object({
20015
20091
  pinnedAgentNodeId: string().optional(),
20016
20092
  stepToggles: record(string(), boolean()).optional(),
20017
- stepOverridesByAgent: record(string(), record(string(), CameraStepOverridePatchSchema)).optional(),
20093
+ stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
20018
20094
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
20019
20095
  });
20020
20096
  /**
@@ -20228,6 +20304,44 @@ var CameraStatusSchema = object({
20228
20304
  /** Unix timestamp (ms) when this snapshot was composed server-side. */
20229
20305
  fetchedAt: number()
20230
20306
  });
20307
+ var NodeInferenceDeviceSchema = object({
20308
+ /** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
20309
+ key: string(),
20310
+ backend: string(),
20311
+ device: string(),
20312
+ format: _enum(MODEL_FORMATS),
20313
+ /** Whether the node's live probe reports the device as usable right now. */
20314
+ available: boolean(),
20315
+ /**
20316
+ * Whether this device participates in dispatch. AUTO default (spec C2):
20317
+ * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
20318
+ * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
20319
+ * not a balanced target). An explicit stored value always wins; a stored-only
20320
+ * (unavailable) key keeps its stored value.
20321
+ */
20322
+ enabled: boolean(),
20323
+ /** Relative balancer weight for the enabled device (default 1). */
20324
+ weight: number(),
20325
+ /** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
20326
+ maxSessions: number().nullable(),
20327
+ /** Object-detection model the executor defaults to for this deviceKey. */
20328
+ defaultModelId: string(),
20329
+ /**
20330
+ * Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
20331
+ * `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
20332
+ * Absent/empty ⇒ no base (every step uses its device format default). The
20333
+ * UI cross-references `pipelineExecutor.getSchema` for the models actually
20334
+ * available per format; this is the stored selection that becomes the
20335
+ * default for EVERY camera landing on this accelerator.
20336
+ */
20337
+ steps: record(string(), DeviceStepConfigSchema).optional()
20338
+ });
20339
+ var NodeInferenceDevicesSchema = object({
20340
+ nodeId: string(),
20341
+ /** False when the node's platform-probe was unreachable (no live device set). */
20342
+ reachable: boolean(),
20343
+ devices: array(NodeInferenceDeviceSchema).readonly()
20344
+ });
20231
20345
  method(object({
20232
20346
  deviceId: number(),
20233
20347
  agentNodeId: string()
@@ -20237,7 +20351,13 @@ method(object({
20237
20351
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
20238
20352
  kind: "mutation",
20239
20353
  auth: "admin"
20240
- }), method(_void(), object({ migrated: number() }), {
20354
+ }), method(object({
20355
+ deviceId: number(),
20356
+ deviceKey: string()
20357
+ }), object({ success: literal(true) }), {
20358
+ kind: "mutation",
20359
+ auth: "admin"
20360
+ }), method(object({ deviceId: number() }), object({ deviceKey: string().nullable() })), method(_void(), object({ migrated: number() }), {
20241
20361
  kind: "mutation",
20242
20362
  auth: "admin"
20243
20363
  }), 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({
@@ -20271,13 +20391,7 @@ method(object({
20271
20391
  }))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
20272
20392
  nodeId: string(),
20273
20393
  settings: AgentPipelineSettingsSchema
20274
- })).readonly()), method(object({
20275
- agentNodeId: string(),
20276
- defaults: record(string(), AgentAddonConfigSchema)
20277
- }), object({ success: literal(true) }), {
20278
- kind: "mutation",
20279
- auth: "admin"
20280
- }), method(object({ agentNodeId: string() }), object({
20394
+ })).readonly()), method(object({ agentNodeId: string() }), object({
20281
20395
  success: boolean(),
20282
20396
  removed: boolean()
20283
20397
  }), {
@@ -20309,7 +20423,18 @@ method(object({
20309
20423
  }), object({ success: literal(true) }), {
20310
20424
  kind: "mutation",
20311
20425
  auth: "admin"
20312
- }), method(object({ agentNodeId: string() }), object({
20426
+ }), method(object({
20427
+ agentNodeId: string(),
20428
+ inferenceDevices: record(string(), object({
20429
+ enabled: boolean(),
20430
+ weight: number().positive().optional(),
20431
+ maxSessions: number().int().positive().optional(),
20432
+ steps: record(string(), DeviceStepConfigSchema).optional()
20433
+ }))
20434
+ }), object({ success: literal(true) }), {
20435
+ kind: "mutation",
20436
+ auth: "admin"
20437
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
20313
20438
  success: literal(true),
20314
20439
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
20315
20440
  effectiveModelId: string().nullable(),
@@ -20325,9 +20450,10 @@ method(object({
20325
20450
  }), object({ success: literal(true) }), {
20326
20451
  kind: "mutation",
20327
20452
  auth: "admin"
20328
- }), method(object({ deviceId: number() }), record(string(), record(string(), CameraStepOverridePatchSchema)).nullable()), method(object({
20453
+ }), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
20329
20454
  deviceId: number(),
20330
20455
  agentNodeId: string(),
20456
+ deviceKey: string(),
20331
20457
  addonId: string(),
20332
20458
  patch: CameraStepOverridePatchSchema.nullable()
20333
20459
  }), object({ success: literal(true) }), {
@@ -20364,14 +20490,13 @@ method(object({
20364
20490
  });
20365
20491
  /**
20366
20492
  * server-management — per-NODE singleton capability for a node's ROOT
20367
- * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
20368
- * agents).
20493
+ * package lifecycle (runtime-updatable node packages).
20369
20494
  *
20370
- * Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
20371
- * on agents) carries the whole software stack in its npm dep tree, so ONE
20372
- * version describes the node. Updates install into
20373
- * `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
20374
- * starter (probation boot + auto-rollback to N-1).
20495
+ * Every node role runs the SAME root package (`@camstack/server`), which
20496
+ * carries the whole software stack in its npm dep tree, so ONE version
20497
+ * describes the node. Updates stage into `<dataDir>/server-root/` and apply
20498
+ * on restart via the baked starter (single-copy in-place swap — no probation,
20499
+ * no auto-rollback).
20375
20500
  *
20376
20501
  * Providers:
20377
20502
  * - HUB: `ServerUpdateService` behind the `server-provided` mount
@@ -20479,7 +20604,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
20479
20604
  /** Explicit target version; omitted = latest from the registry. */
20480
20605
  version: string().optional() }), ServerUpdateActionResultSchema, {
20481
20606
  kind: "mutation",
20482
- auth: "admin"
20607
+ auth: "admin",
20608
+ timeoutMs: 16 * 6e4
20483
20609
  }), method(_void(), ServerUpdateActionResultSchema, {
20484
20610
  kind: "mutation",
20485
20611
  auth: "admin"
@@ -22617,10 +22743,10 @@ var TopologyCategorySchema = object({
22617
22743
  addons: array(TopologyCategoryAddonSchema).readonly()
22618
22744
  });
22619
22745
  /**
22620
- * The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
22621
- * `@camstack/agent` on agents) as reported by its `registerNode` manifest —
22622
- * version visibility for the Server management surface. Nullable: offline
22623
- * rows and pre-phase-2 nodes report none.
22746
+ * The node's runtime-updatable ROOT package (`@camstack/server` the single
22747
+ * root package for every node role) as reported by its `registerNode`
22748
+ * manifest — version visibility for the Server management surface. Nullable:
22749
+ * offline rows and nodes that never reported one.
22624
22750
  */
22625
22751
  var TopologyRootPackageSchema = object({
22626
22752
  name: string(),
@@ -23008,17 +23134,28 @@ var PlatformScoreSchema = object({
23008
23134
  format: _enum([
23009
23135
  "onnx",
23010
23136
  "coreml",
23011
- "openvino"
23137
+ "openvino",
23138
+ "tflite"
23012
23139
  ]),
23013
23140
  score: number(),
23014
23141
  reason: string(),
23015
23142
  available: boolean()
23016
23143
  });
23144
+ var InferenceDeviceDescriptorSchema = object({
23145
+ key: string(),
23146
+ backend: string(),
23147
+ device: string(),
23148
+ format: ModelFormatSchema,
23149
+ runtime: literal("python"),
23150
+ score: number(),
23151
+ available: boolean()
23152
+ });
23017
23153
  var PlatformCapabilitiesSchema = object({
23018
23154
  hardware: HardwareInfoSchema,
23019
23155
  scores: array(PlatformScoreSchema).readonly(),
23020
23156
  bestScore: PlatformScoreSchema,
23021
- pythonPath: string().nullable()
23157
+ pythonPath: string().nullable(),
23158
+ devices: array(InferenceDeviceDescriptorSchema).readonly()
23022
23159
  });
23023
23160
  var ModelRequirementSchema = object({
23024
23161
  modelId: string(),
@@ -26947,12 +27084,6 @@ Object.freeze({
26947
27084
  addonId: null,
26948
27085
  access: "view"
26949
27086
  },
26950
- "pipelineExecutor.reprobeEngine": {
26951
- capName: "pipeline-executor",
26952
- capScope: "system",
26953
- addonId: null,
26954
- access: "create"
26955
- },
26956
27087
  "pipelineExecutor.runAudioTest": {
26957
27088
  capName: "pipeline-executor",
26958
27089
  capScope: "system",
@@ -27103,6 +27234,12 @@ Object.freeze({
27103
27234
  addonId: null,
27104
27235
  access: "view"
27105
27236
  },
27237
+ "pipelineOrchestrator.getNodeInferenceDevices": {
27238
+ capName: "pipeline-orchestrator",
27239
+ capScope: "system",
27240
+ addonId: null,
27241
+ access: "view"
27242
+ },
27106
27243
  "pipelineOrchestrator.getPipelineAssignment": {
27107
27244
  capName: "pipeline-orchestrator",
27108
27245
  capScope: "system",
@@ -27115,6 +27252,12 @@ Object.freeze({
27115
27252
  addonId: null,
27116
27253
  access: "view"
27117
27254
  },
27255
+ "pipelineOrchestrator.getPipelineDevicePin": {
27256
+ capName: "pipeline-orchestrator",
27257
+ capScope: "system",
27258
+ addonId: null,
27259
+ access: "view"
27260
+ },
27118
27261
  "pipelineOrchestrator.listAgentSettings": {
27119
27262
  capName: "pipeline-orchestrator",
27120
27263
  capScope: "system",
@@ -27157,19 +27300,19 @@ Object.freeze({
27157
27300
  addonId: null,
27158
27301
  access: "create"
27159
27302
  },
27160
- "pipelineOrchestrator.setAgentAddonDefaults": {
27303
+ "pipelineOrchestrator.setAgentCapabilities": {
27161
27304
  capName: "pipeline-orchestrator",
27162
27305
  capScope: "system",
27163
27306
  addonId: null,
27164
27307
  access: "create"
27165
27308
  },
27166
- "pipelineOrchestrator.setAgentCapabilities": {
27309
+ "pipelineOrchestrator.setAgentDetectWeight": {
27167
27310
  capName: "pipeline-orchestrator",
27168
27311
  capScope: "system",
27169
27312
  addonId: null,
27170
27313
  access: "create"
27171
27314
  },
27172
- "pipelineOrchestrator.setAgentDetectWeight": {
27315
+ "pipelineOrchestrator.setAgentInferenceDevices": {
27173
27316
  capName: "pipeline-orchestrator",
27174
27317
  capScope: "system",
27175
27318
  addonId: null,
@@ -27211,6 +27354,12 @@ Object.freeze({
27211
27354
  addonId: null,
27212
27355
  access: "create"
27213
27356
  },
27357
+ "pipelineOrchestrator.setPipelineDevicePin": {
27358
+ capName: "pipeline-orchestrator",
27359
+ capScope: "system",
27360
+ addonId: null,
27361
+ access: "create"
27362
+ },
27214
27363
  "pipelineOrchestrator.unassignAudio": {
27215
27364
  capName: "pipeline-orchestrator",
27216
27365
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -12633,10 +12633,7 @@ var ConfigUISchemaNullableBridge = custom$2();
12633
12633
  var InferenceCapabilitiesBridge = custom$2();
12634
12634
  var ModelAvailabilityListBridge = custom$2();
12635
12635
  var PipelineRunResultBridge = custom$2();
12636
- method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
12637
- kind: "mutation",
12638
- auth: "admin"
12639
- }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
12636
+ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
12640
12637
  modelId: string(),
12641
12638
  settings: record(string(), unknown()).readonly()
12642
12639
  }))), method(object({ steps: record(string(), object({
@@ -12696,13 +12693,33 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
12696
12693
  * (inputClasses ≠ null) are skipped and served per-track via
12697
12694
  * pipelineRunner.runDetailSubtree (two-plane design).
12698
12695
  */
12699
- plane: _enum(["full", "frame"]).optional()
12696
+ plane: _enum(["full", "frame"]).optional(),
12697
+ /**
12698
+ * Inference-device selector (Phase 2 multi-device). Format
12699
+ * `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`).
12700
+ * Omitted ⇒ the runner's default device (current single-engine
12701
+ * behaviour). Selects WHICH device pool of the node runs the call.
12702
+ */
12703
+ deviceKey: string().optional()
12700
12704
  }), PipelineRunResultBridge, { kind: "mutation" }), method(object({
12701
12705
  engine: PipelineEngineChoiceSchema.optional(),
12702
12706
  steps: array(PipelineStepInputSchema).min(1),
12703
12707
  frames: array(FrameInputSchema).min(1).max(255),
12704
12708
  deviceId: number().optional(),
12705
- sessionId: string().optional()
12709
+ sessionId: string().optional(),
12710
+ /**
12711
+ * Pure-inference benchmark hint. A NONZERO uint32 pins every frame in
12712
+ * the batch to the Python pool's bench preprocess cache
12713
+ * (`_bench_frame_id`) so a REPEATED benchmark frame is decoded +
12714
+ * preprocessed ONCE and every later inference is a pure-inference cache
12715
+ * hit — the sustained-throughput run measures inference, not
12716
+ * decode+preprocess+infer. Omitted/0 for live frames (all different →
12717
+ * full preprocess every call, correct). Fresh per sustained run;
12718
+ * released via `uncacheFrame`.
12719
+ */
12720
+ frameId: number().int().nonnegative().optional(),
12721
+ /** Inference-device selector (Phase 2 multi-device); see runPipeline. */
12722
+ deviceKey: string().optional()
12706
12723
  }), object({ results: array(PipelineRunResultBridge).readonly() }), { kind: "mutation" }), method(object({
12707
12724
  data: _instanceof(Uint8Array),
12708
12725
  width: number().int().positive(),
@@ -12734,8 +12751,18 @@ method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngi
12734
12751
  * - `runtime` — main camera-serving engine (no idle TTL).
12735
12752
  * - `warm-override` — benchmark/test override held in the warm
12736
12753
  * cache; auto-disposed after the idle TTL.
12754
+ * - `device-pool` — a concurrent per-device pool (Phase 2
12755
+ * multi-device, keyed by `deviceKey`) resolved
12756
+ * via `resolveDeviceFactory`. Runs alongside the
12757
+ * `runtime` engine on a DIFFERENT accelerator
12758
+ * (NPU / iGPU / Coral) — this is how the
12759
+ * Engines tab shows all pools running at once.
12737
12760
  */
12738
- kind: _enum(["runtime", "warm-override"]),
12761
+ kind: _enum([
12762
+ "runtime",
12763
+ "warm-override",
12764
+ "device-pool"
12765
+ ]),
12739
12766
  /** Native pid of the underlying Python pool (null when no pool). */
12740
12767
  poolPid: number().nullable(),
12741
12768
  /** ms since this factory was last used (null when not warm-tracked). */
@@ -12870,7 +12897,21 @@ var NativeCropResultSchema = object({
12870
12897
  /** Packed rgb (24-bit) pixels of the crop. */
12871
12898
  bytes: _instanceof(Uint8Array),
12872
12899
  width: number().int().positive(),
12873
- height: number().int().positive()
12900
+ height: number().int().positive(),
12901
+ /**
12902
+ * Which source served this crop, so a quality-sensitive consumer (the native
12903
+ * `keyFrame`) can reject a degraded fallback:
12904
+ * - `native` — cut from the decode worker's retained NATIVE surface (the
12905
+ * quality path).
12906
+ * - `ram-fullframe` — the native surface MISSED but the request was full-frame,
12907
+ * so the ≤640 RAM `RetainedFrameStore` served it (honest lower-res; legit for
12908
+ * the blank-frame guard / 640-snapshot resolve, NOT for the clean keyFrame).
12909
+ *
12910
+ * OPTIONAL: a pre-tier runner (version skew) omits it — an ABSENT `tier` MUST be
12911
+ * treated as `native` (accepted) by every consumer so mixed-version clusters
12912
+ * keep the pre-tier behaviour. An ROI miss returns `null` (no tier at all).
12913
+ */
12914
+ tier: _enum(["native", "ram-fullframe"]).optional()
12874
12915
  });
12875
12916
  /** Parent detection context passed to `runDetailSubtree` — the crop's
12876
12917
  * originating detection, in FRAME-space coordinates. Reuses
@@ -13110,7 +13151,14 @@ var RunnerCameraConfigSchema = object({
13110
13151
  * camera's detect node differs from its source-owner (P2d, gated by the
13111
13152
  * `remoteSourcingNodes` rollout setting).
13112
13153
  */
13113
- frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" })
13154
+ frameSource: RunnerFrameSourceSchema.default({ kind: "local-broker" }),
13155
+ /**
13156
+ * Inference-device selector for this camera's sessions (Phase 2 multi-device).
13157
+ * Format `<backend>:<device>` (e.g. `openvino:gpu`, `edgetpu:usb`, `cpu`);
13158
+ * omitted ⇒ the runner's default device. The engine itself stays node-local —
13159
+ * this only selects WHICH device pool of that node runs the session.
13160
+ */
13161
+ deviceKey: string().optional()
13114
13162
  });
13115
13163
  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;
13116
13164
  /**
@@ -13131,6 +13179,19 @@ var RunnerLocalLoadSchema = object({
13131
13179
  avgInferenceTimeMs: number(),
13132
13180
  /** Total queue depth across motion + detection queues. */
13133
13181
  queueDepthTotal: number(),
13182
+ /**
13183
+ * Per-inference-device live load (multi-device C4). One entry per deviceKey
13184
+ * this runner currently has attached cameras on, so the orchestrator's second
13185
+ * `balance()` pass (over a node's devices) weights on real per-pool session
13186
+ * counts. Empty on single-device / pre-multi-device runners. `queueDepthTotal`
13187
+ * per device is 0 until the pool backlog gets a public accessor (follow-up).
13188
+ */
13189
+ devices: array(object({
13190
+ deviceKey: string(),
13191
+ backend: string(),
13192
+ attachedCameras: number(),
13193
+ queueDepthTotal: number()
13194
+ })).default([]),
13134
13195
  /** Hardware capability flags reported by this node. */
13135
13196
  hardware: object({
13136
13197
  hasGpu: boolean(),
@@ -17866,7 +17927,8 @@ var LinkedDeviceSchema = object({
17866
17927
  deviceId: number(),
17867
17928
  name: string(),
17868
17929
  location: string().nullable(),
17869
- features: array(string())
17930
+ features: array(string()),
17931
+ producesTrackedEvents: boolean().optional()
17870
17932
  });
17871
17933
  var SavedDeviceRowSchema = object({
17872
17934
  /** Numeric id reserved at allocateDeviceId time. */
@@ -19496,6 +19558,7 @@ var TrackSchema = object({
19496
19558
  deviceId: number(),
19497
19559
  className: string(),
19498
19560
  label: string().optional(),
19561
+ producingDeviceName: string().optional(),
19499
19562
  /** Track provenance. Absent ⇒ `pipeline` (legacy rows). */
19500
19563
  source: TrackSourceSchema.optional(),
19501
19564
  firstSeen: number(),
@@ -19633,7 +19696,8 @@ var MediaFileKindEnum = _enum([
19633
19696
  "fullFrameBoxed",
19634
19697
  "faceCrop",
19635
19698
  "plateCrop",
19636
- "keyFrame"
19699
+ "keyFrame",
19700
+ "keyFrameSmall"
19637
19701
  ]);
19638
19702
  var MediaFileSchema = object({
19639
19703
  key: string(),
@@ -19962,13 +20026,11 @@ var PipelineTemplateSchema = object({
19962
20026
  createdAt: string(),
19963
20027
  updatedAt: string()
19964
20028
  });
19965
- var AgentAddonConfigSchema = object({
19966
- enabled: boolean(),
20029
+ var DeviceStepConfigSchema = object({
19967
20030
  modelId: string().optional(),
19968
- settings: record(string(), unknown()).readonly()
20031
+ settings: record(string(), unknown()).optional()
19969
20032
  });
19970
20033
  var AgentPipelineSettingsSchema = object({
19971
- addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
19972
20034
  maxCameras: number().int().nonnegative().nullable().default(null),
19973
20035
  /** Per-node detection weight (relative share for the quota balancer). */
19974
20036
  detectWeight: number().positive().optional(),
@@ -19992,7 +20054,22 @@ var AgentPipelineSettingsSchema = object({
19992
20054
  * it already uses to reach the hub). Set this only when the auto-detected
19993
20055
  * address is wrong (multi-homed host, NAT, custom interface).
19994
20056
  */
19995
- reachableHost: string().optional()
20057
+ reachableHost: string().optional(),
20058
+ /**
20059
+ * Multi-device inference opt-in (Phase 4). Per-node map deviceKey → {enabled,
20060
+ * weight, steps}. Absent / all-disabled ⇒ the node's single default
20061
+ * accelerator (safe default); two+ enabled ⇒ the dispatcher balances
20062
+ * detection sessions across them so they run CONCURRENTLY. `steps` is the
20063
+ * per-(node,device) BASE provisioning (`stepId → {modelId?, settings?}`) —
20064
+ * the default model/settings for every camera landing on that accelerator;
20065
+ * a stepId absent ⇒ the step uses that device's format default.
20066
+ */
20067
+ inferenceDevices: record(string(), object({
20068
+ enabled: boolean(),
20069
+ weight: number().positive().optional(),
20070
+ maxSessions: number().int().positive().optional(),
20071
+ steps: record(string(), DeviceStepConfigSchema).optional()
20072
+ })).optional()
19996
20073
  });
19997
20074
  var CameraPipelineForAgentSchema = object({
19998
20075
  steps: array(PipelineStepInputSchema).readonly(),
@@ -20002,14 +20079,13 @@ var CameraPipelineForAgentSchema = object({
20002
20079
  }).nullable()
20003
20080
  });
20004
20081
  var CameraStepOverridePatchSchema = object({
20005
- enabled: boolean().optional(),
20006
20082
  modelId: string().optional(),
20007
20083
  settings: record(string(), unknown()).readonly().optional()
20008
20084
  });
20009
20085
  var CameraPipelineSettingsSchema = object({
20010
20086
  pinnedAgentNodeId: string().optional(),
20011
20087
  stepToggles: record(string(), boolean()).optional(),
20012
- stepOverridesByAgent: record(string(), record(string(), CameraStepOverridePatchSchema)).optional(),
20088
+ stepOverridesByDevice: record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).optional(),
20013
20089
  pipelineByAgent: record(string(), CameraPipelineForAgentSchema).optional()
20014
20090
  });
20015
20091
  /**
@@ -20223,6 +20299,44 @@ var CameraStatusSchema = object({
20223
20299
  /** Unix timestamp (ms) when this snapshot was composed server-side. */
20224
20300
  fetchedAt: number()
20225
20301
  });
20302
+ var NodeInferenceDeviceSchema = object({
20303
+ /** Stable per-node device key, e.g. `openvino:npu`, `edgetpu:usb`, `cpu`. */
20304
+ key: string(),
20305
+ backend: string(),
20306
+ device: string(),
20307
+ format: _enum(MODEL_FORMATS),
20308
+ /** Whether the node's live probe reports the device as usable right now. */
20309
+ available: boolean(),
20310
+ /**
20311
+ * Whether this device participates in dispatch. AUTO default (spec C2):
20312
+ * accelerators are opt-OUT (a discovered NPU/iGPU/Coral/ANE with no stored
20313
+ * entry is `true`); CPU is opt-IN (`false` by default — the fallback pool,
20314
+ * not a balanced target). An explicit stored value always wins; a stored-only
20315
+ * (unavailable) key keeps its stored value.
20316
+ */
20317
+ enabled: boolean(),
20318
+ /** Relative balancer weight for the enabled device (default 1). */
20319
+ weight: number(),
20320
+ /** Per-device concurrent-session cap; null = unlimited (multi-device C4). */
20321
+ maxSessions: number().nullable(),
20322
+ /** Object-detection model the executor defaults to for this deviceKey. */
20323
+ defaultModelId: string(),
20324
+ /**
20325
+ * Per-(node,device) BASE provisioning (C7.2/C7.4) — the RAW stored
20326
+ * `stepId → {modelId?, settings?}` map from `inferenceDevices[key].steps`.
20327
+ * Absent/empty ⇒ no base (every step uses its device format default). The
20328
+ * UI cross-references `pipelineExecutor.getSchema` for the models actually
20329
+ * available per format; this is the stored selection that becomes the
20330
+ * default for EVERY camera landing on this accelerator.
20331
+ */
20332
+ steps: record(string(), DeviceStepConfigSchema).optional()
20333
+ });
20334
+ var NodeInferenceDevicesSchema = object({
20335
+ nodeId: string(),
20336
+ /** False when the node's platform-probe was unreachable (no live device set). */
20337
+ reachable: boolean(),
20338
+ devices: array(NodeInferenceDeviceSchema).readonly()
20339
+ });
20226
20340
  method(object({
20227
20341
  deviceId: number(),
20228
20342
  agentNodeId: string()
@@ -20232,7 +20346,13 @@ method(object({
20232
20346
  }), method(object({ deviceId: number() }), object({ success: literal(true) }), {
20233
20347
  kind: "mutation",
20234
20348
  auth: "admin"
20235
- }), method(_void(), object({ migrated: number() }), {
20349
+ }), method(object({
20350
+ deviceId: number(),
20351
+ deviceKey: string()
20352
+ }), object({ success: literal(true) }), {
20353
+ kind: "mutation",
20354
+ auth: "admin"
20355
+ }), method(object({ deviceId: number() }), object({ deviceKey: string().nullable() })), method(_void(), object({ migrated: number() }), {
20236
20356
  kind: "mutation",
20237
20357
  auth: "admin"
20238
20358
  }), 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({
@@ -20266,13 +20386,7 @@ method(object({
20266
20386
  }))), method(object({ agentNodeId: string() }), AgentPipelineSettingsSchema.nullable()), method(_void(), array(object({
20267
20387
  nodeId: string(),
20268
20388
  settings: AgentPipelineSettingsSchema
20269
- })).readonly()), method(object({
20270
- agentNodeId: string(),
20271
- defaults: record(string(), AgentAddonConfigSchema)
20272
- }), object({ success: literal(true) }), {
20273
- kind: "mutation",
20274
- auth: "admin"
20275
- }), method(object({ agentNodeId: string() }), object({
20389
+ })).readonly()), method(object({ agentNodeId: string() }), object({
20276
20390
  success: boolean(),
20277
20391
  removed: boolean()
20278
20392
  }), {
@@ -20304,7 +20418,18 @@ method(object({
20304
20418
  }), object({ success: literal(true) }), {
20305
20419
  kind: "mutation",
20306
20420
  auth: "admin"
20307
- }), method(object({ agentNodeId: string() }), object({
20421
+ }), method(object({
20422
+ agentNodeId: string(),
20423
+ inferenceDevices: record(string(), object({
20424
+ enabled: boolean(),
20425
+ weight: number().positive().optional(),
20426
+ maxSessions: number().int().positive().optional(),
20427
+ steps: record(string(), DeviceStepConfigSchema).optional()
20428
+ }))
20429
+ }), object({ success: literal(true) }), {
20430
+ kind: "mutation",
20431
+ auth: "admin"
20432
+ }), method(object({ nodeId: string() }), NodeInferenceDevicesSchema), method(object({ agentNodeId: string() }), object({
20308
20433
  success: literal(true),
20309
20434
  /** Hardware-aware default detection model now in effect on the node (null when unresolvable). */
20310
20435
  effectiveModelId: string().nullable(),
@@ -20320,9 +20445,10 @@ method(object({
20320
20445
  }), object({ success: literal(true) }), {
20321
20446
  kind: "mutation",
20322
20447
  auth: "admin"
20323
- }), method(object({ deviceId: number() }), record(string(), record(string(), CameraStepOverridePatchSchema)).nullable()), method(object({
20448
+ }), method(object({ deviceId: number() }), record(string(), record(string(), record(string(), CameraStepOverridePatchSchema))).nullable()), method(object({
20324
20449
  deviceId: number(),
20325
20450
  agentNodeId: string(),
20451
+ deviceKey: string(),
20326
20452
  addonId: string(),
20327
20453
  patch: CameraStepOverridePatchSchema.nullable()
20328
20454
  }), object({ success: literal(true) }), {
@@ -20359,14 +20485,13 @@ method(object({
20359
20485
  });
20360
20486
  /**
20361
20487
  * server-management — per-NODE singleton capability for a node's ROOT
20362
- * package lifecycle (runtime-updatable node packages, phase 2: hub + docker
20363
- * agents).
20488
+ * package lifecycle (runtime-updatable node packages).
20364
20489
  *
20365
- * Each node's root package (`@camstack/server` on the hub, `@camstack/agent`
20366
- * on agents) carries the whole software stack in its npm dep tree, so ONE
20367
- * version describes the node. Updates install into
20368
- * `<dataDir>/server-root/versions/<v>/` and apply on restart via the baked
20369
- * starter (probation boot + auto-rollback to N-1).
20490
+ * Every node role runs the SAME root package (`@camstack/server`), which
20491
+ * carries the whole software stack in its npm dep tree, so ONE version
20492
+ * describes the node. Updates stage into `<dataDir>/server-root/` and apply
20493
+ * on restart via the baked starter (single-copy in-place swap — no probation,
20494
+ * no auto-rollback).
20370
20495
  *
20371
20496
  * Providers:
20372
20497
  * - HUB: `ServerUpdateService` behind the `server-provided` mount
@@ -20474,7 +20599,8 @@ method(_void(), ServerPackageStatusSchema, { auth: "admin" }), method(_void(), S
20474
20599
  /** Explicit target version; omitted = latest from the registry. */
20475
20600
  version: string().optional() }), ServerUpdateActionResultSchema, {
20476
20601
  kind: "mutation",
20477
- auth: "admin"
20602
+ auth: "admin",
20603
+ timeoutMs: 16 * 6e4
20478
20604
  }), method(_void(), ServerUpdateActionResultSchema, {
20479
20605
  kind: "mutation",
20480
20606
  auth: "admin"
@@ -22612,10 +22738,10 @@ var TopologyCategorySchema = object({
22612
22738
  addons: array(TopologyCategoryAddonSchema).readonly()
22613
22739
  });
22614
22740
  /**
22615
- * The node's runtime-updatable ROOT package (`@camstack/server` on the hub,
22616
- * `@camstack/agent` on agents) as reported by its `registerNode` manifest —
22617
- * version visibility for the Server management surface. Nullable: offline
22618
- * rows and pre-phase-2 nodes report none.
22741
+ * The node's runtime-updatable ROOT package (`@camstack/server` the single
22742
+ * root package for every node role) as reported by its `registerNode`
22743
+ * manifest — version visibility for the Server management surface. Nullable:
22744
+ * offline rows and nodes that never reported one.
22619
22745
  */
22620
22746
  var TopologyRootPackageSchema = object({
22621
22747
  name: string(),
@@ -23003,17 +23129,28 @@ var PlatformScoreSchema = object({
23003
23129
  format: _enum([
23004
23130
  "onnx",
23005
23131
  "coreml",
23006
- "openvino"
23132
+ "openvino",
23133
+ "tflite"
23007
23134
  ]),
23008
23135
  score: number(),
23009
23136
  reason: string(),
23010
23137
  available: boolean()
23011
23138
  });
23139
+ var InferenceDeviceDescriptorSchema = object({
23140
+ key: string(),
23141
+ backend: string(),
23142
+ device: string(),
23143
+ format: ModelFormatSchema,
23144
+ runtime: literal("python"),
23145
+ score: number(),
23146
+ available: boolean()
23147
+ });
23012
23148
  var PlatformCapabilitiesSchema = object({
23013
23149
  hardware: HardwareInfoSchema,
23014
23150
  scores: array(PlatformScoreSchema).readonly(),
23015
23151
  bestScore: PlatformScoreSchema,
23016
- pythonPath: string().nullable()
23152
+ pythonPath: string().nullable(),
23153
+ devices: array(InferenceDeviceDescriptorSchema).readonly()
23017
23154
  });
23018
23155
  var ModelRequirementSchema = object({
23019
23156
  modelId: string(),
@@ -26942,12 +27079,6 @@ Object.freeze({
26942
27079
  addonId: null,
26943
27080
  access: "view"
26944
27081
  },
26945
- "pipelineExecutor.reprobeEngine": {
26946
- capName: "pipeline-executor",
26947
- capScope: "system",
26948
- addonId: null,
26949
- access: "create"
26950
- },
26951
27082
  "pipelineExecutor.runAudioTest": {
26952
27083
  capName: "pipeline-executor",
26953
27084
  capScope: "system",
@@ -27098,6 +27229,12 @@ Object.freeze({
27098
27229
  addonId: null,
27099
27230
  access: "view"
27100
27231
  },
27232
+ "pipelineOrchestrator.getNodeInferenceDevices": {
27233
+ capName: "pipeline-orchestrator",
27234
+ capScope: "system",
27235
+ addonId: null,
27236
+ access: "view"
27237
+ },
27101
27238
  "pipelineOrchestrator.getPipelineAssignment": {
27102
27239
  capName: "pipeline-orchestrator",
27103
27240
  capScope: "system",
@@ -27110,6 +27247,12 @@ Object.freeze({
27110
27247
  addonId: null,
27111
27248
  access: "view"
27112
27249
  },
27250
+ "pipelineOrchestrator.getPipelineDevicePin": {
27251
+ capName: "pipeline-orchestrator",
27252
+ capScope: "system",
27253
+ addonId: null,
27254
+ access: "view"
27255
+ },
27113
27256
  "pipelineOrchestrator.listAgentSettings": {
27114
27257
  capName: "pipeline-orchestrator",
27115
27258
  capScope: "system",
@@ -27152,19 +27295,19 @@ Object.freeze({
27152
27295
  addonId: null,
27153
27296
  access: "create"
27154
27297
  },
27155
- "pipelineOrchestrator.setAgentAddonDefaults": {
27298
+ "pipelineOrchestrator.setAgentCapabilities": {
27156
27299
  capName: "pipeline-orchestrator",
27157
27300
  capScope: "system",
27158
27301
  addonId: null,
27159
27302
  access: "create"
27160
27303
  },
27161
- "pipelineOrchestrator.setAgentCapabilities": {
27304
+ "pipelineOrchestrator.setAgentDetectWeight": {
27162
27305
  capName: "pipeline-orchestrator",
27163
27306
  capScope: "system",
27164
27307
  addonId: null,
27165
27308
  access: "create"
27166
27309
  },
27167
- "pipelineOrchestrator.setAgentDetectWeight": {
27310
+ "pipelineOrchestrator.setAgentInferenceDevices": {
27168
27311
  capName: "pipeline-orchestrator",
27169
27312
  capScope: "system",
27170
27313
  addonId: null,
@@ -27206,6 +27349,12 @@ Object.freeze({
27206
27349
  addonId: null,
27207
27350
  access: "create"
27208
27351
  },
27352
+ "pipelineOrchestrator.setPipelineDevicePin": {
27353
+ capName: "pipeline-orchestrator",
27354
+ capScope: "system",
27355
+ addonId: null,
27356
+ access: "create"
27357
+ },
27209
27358
  "pipelineOrchestrator.unassignAudio": {
27210
27359
  capName: "pipeline-orchestrator",
27211
27360
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.1.31",
3
+ "version": "1.2.1",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",