@camstack/addon-pipeline-orchestrator 1.1.20 → 1.1.21

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.
@@ -3,7 +3,7 @@ import "./dist-CYZr2fwk.mjs";
3
3
  var e = {
4
4
  "@camstack/sdk": {
5
5
  name: "@camstack/sdk",
6
- version: "1.1.14",
6
+ version: "1.1.15",
7
7
  scope: ["default"],
8
8
  loaded: !1,
9
9
  from: "addon_pipeline_orchestrator_widgets",
@@ -18,7 +18,7 @@ var e = {
18
18
  },
19
19
  "@camstack/types": {
20
20
  name: "@camstack/types",
21
- version: "1.1.22",
21
+ version: "1.1.24",
22
22
  scope: ["default"],
23
23
  loaded: !1,
24
24
  from: "addon_pipeline_orchestrator_widgets",
@@ -33,7 +33,7 @@ var e = {
33
33
  },
34
34
  "@camstack/ui-library": {
35
35
  name: "@camstack/ui-library",
36
- version: "1.1.19",
36
+ version: "1.1.20",
37
37
  scope: ["default"],
38
38
  loaded: !1,
39
39
  from: "addon_pipeline_orchestrator_widgets",
@@ -36,7 +36,7 @@ async function r() {
36
36
  }
37
37
  },
38
38
  "@camstack/types": {
39
- version: "1.1.22",
39
+ version: "1.1.24",
40
40
  scope: "default",
41
41
  shareConfig: {
42
42
  singleton: !0,
@@ -45,7 +45,7 @@ async function r() {
45
45
  }
46
46
  },
47
47
  "@camstack/sdk": {
48
- version: "1.1.14",
48
+ version: "1.1.15",
49
49
  scope: "default",
50
50
  shareConfig: {
51
51
  singleton: !0,
@@ -99,7 +99,7 @@ async function r() {
99
99
  }
100
100
  },
101
101
  "@camstack/ui-library": {
102
- version: "1.1.19",
102
+ version: "1.1.20",
103
103
  scope: "default",
104
104
  shareConfig: {
105
105
  singleton: !0,
package/dist/index.js CHANGED
@@ -15778,7 +15778,10 @@ var AgentLoadSummarySchema = object({
15778
15778
  online: boolean(),
15779
15779
  load: RunnerLocalLoadSchema,
15780
15780
  /** Computed score used by the L2 capacity balancer (lower = less loaded). */
15781
- score: number()
15781
+ score: number(),
15782
+ /** This node's decode hwaccel backend (per-node `probedBestHwaccel`), or null
15783
+ * when not yet probed — for the cluster Pipeline table UI (P0.2). */
15784
+ decodeHwaccel: string().nullable()
15782
15785
  });
15783
15786
  /**
15784
15787
  * Aggregate metrics across the whole detection cluster. Replaces the legacy
@@ -18489,7 +18492,7 @@ var HardwareEncoderIdSchema = _enum([
18489
18492
  "libx264",
18490
18493
  "libx265"
18491
18494
  ]);
18492
- var HardwareEncodersSchema = object({
18495
+ object({
18493
18496
  encoders: array(object({
18494
18497
  encoder: HardwareEncoderIdSchema,
18495
18498
  codec: _enum(["H264", "H265"]),
@@ -18508,15 +18511,7 @@ var HardwareEncodersSchema = object({
18508
18511
  defaultH265: HardwareEncoderIdSchema,
18509
18512
  probedAt: number()
18510
18513
  });
18511
- /**
18512
- * Decode-side companion to {@link HardwareEncodersSchema}: the `-hwaccel`
18513
- * methods the configured ffmpeg binary actually supports (parsed from
18514
- * `ffmpeg -hwaccels`). Used to gate decode-hwaccel attempts so the transcode
18515
- * egress never spends a spawn on a backend this build cannot offer. Per-stream
18516
- * decode fragility (e.g. VideoToolbox HEVC) is still handled by the egress's
18517
- * software fallback — this only filters out wholly-unsupported backends.
18518
- */
18519
- var HardwareDecodeAccelsSchema = object({
18514
+ object({
18520
18515
  methods: array(string()).readonly(),
18521
18516
  probedAt: number()
18522
18517
  });
@@ -18579,13 +18574,7 @@ var ResolvedInferenceConfigSchema = object({
18579
18574
  format: ModelFormatSchema,
18580
18575
  reason: string()
18581
18576
  });
18582
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), HardwareEncodersSchema), method(_void(), HardwareEncodersSchema, {
18583
- kind: "mutation",
18584
- auth: "admin"
18585
- }), method(_void(), HardwareDecodeAccelsSchema), method(_void(), HardwareDecodeAccelsSchema, {
18586
- kind: "mutation",
18587
- auth: "admin"
18588
- });
18577
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
18589
18578
  var PtzPresetSchema = object({
18590
18579
  id: string(),
18591
18580
  name: string()
@@ -22210,30 +22199,6 @@ Object.freeze({
22210
22199
  addonId: null,
22211
22200
  access: "view"
22212
22201
  },
22213
- "platformProbe.getHardwareDecodeAccels": {
22214
- capName: "platform-probe",
22215
- capScope: "system",
22216
- addonId: null,
22217
- access: "view"
22218
- },
22219
- "platformProbe.getHardwareEncoders": {
22220
- capName: "platform-probe",
22221
- capScope: "system",
22222
- addonId: null,
22223
- access: "view"
22224
- },
22225
- "platformProbe.refreshHardwareDecodeAccels": {
22226
- capName: "platform-probe",
22227
- capScope: "system",
22228
- addonId: null,
22229
- access: "create"
22230
- },
22231
- "platformProbe.refreshHardwareEncoders": {
22232
- capName: "platform-probe",
22233
- capScope: "system",
22234
- addonId: null,
22235
- access: "create"
22236
- },
22237
22202
  "platformProbe.resolveHwAccel": {
22238
22203
  capName: "platform-probe",
22239
22204
  capScope: "system",
@@ -25966,6 +25931,7 @@ var PipelineOrchestratorAddon = class PipelineOrchestratorAddon extends BaseAddo
25966
25931
  * re-dispatching).
25967
25932
  */
25968
25933
  async getAgentLoad() {
25934
+ await this.refreshDecodeHwaccels();
25969
25935
  await this.collectAgentLoad();
25970
25936
  return [...this.cachedAgentLoad.values()];
25971
25937
  }
@@ -26231,11 +26197,48 @@ var PipelineOrchestratorAddon = class PipelineOrchestratorAddon extends BaseAddo
26231
26197
  nodeId: load.nodeId,
26232
26198
  online: true,
26233
26199
  load,
26234
- score: computeCapacityScore(load)
26200
+ score: computeCapacityScore(load),
26201
+ decodeHwaccel: this.decodeHwaccelByNode.get(load.nodeId) ?? null
26235
26202
  });
26236
26203
  this.cachedAgentLoad = next;
26237
26204
  }
26238
26205
  /**
26206
+ * Per-node decode hwaccel cache (`nodeId` → backend), refreshed by
26207
+ * {@link refreshDecodeHwaccels} before a UI-facing {@link getAgentLoad}. Read
26208
+ * from the decoder addon's per-node `probedBestHwaccel@<node>` setting — a
26209
+ * node-LOCAL probe published to a per-node setting — via `addonSettings`,
26210
+ * NEVER the `platform-probe` singleton (whose pin answers with hub hardware).
26211
+ */
26212
+ decodeHwaccelByNode = /* @__PURE__ */ new Map();
26213
+ /** Refresh {@link decodeHwaccelByNode} for every known runner node. */
26214
+ async refreshDecodeHwaccels() {
26215
+ await Promise.all([...this.knownRunnerNodes].map(async (nodeId) => {
26216
+ const hwaccel = await this.readNodeDecodeHwaccel(nodeId);
26217
+ if (hwaccel !== void 0) this.decodeHwaccelByNode.set(nodeId, hwaccel);
26218
+ }));
26219
+ }
26220
+ /**
26221
+ * Read a node's `probedBestHwaccel` from the decoder-ffmpeg addon's per-node
26222
+ * settings via the hub-routed `addonSettings` cap. Returns `null` when the
26223
+ * value is empty/unset, `undefined` on a read failure (keep the last known).
26224
+ * Mirrors {@link readDetectionPipelineEngine}.
26225
+ */
26226
+ async readNodeDecodeHwaccel(nodeId) {
26227
+ const api = this.ctx.api;
26228
+ if (!api?.addonSettings) return void 0;
26229
+ try {
26230
+ const schema = await api.addonSettings.getGlobalSettings.query({
26231
+ addonId: "decoder-ffmpeg",
26232
+ nodeId
26233
+ });
26234
+ if (!schema) return void 0;
26235
+ for (const s of schema.sections) for (const f of s.fields) if (f.key === "probedBestHwaccel") return typeof f.value === "string" && f.value.length > 0 ? f.value : null;
26236
+ return null;
26237
+ } catch {
26238
+ return;
26239
+ }
26240
+ }
26241
+ /**
26239
26242
  * Per-node `getLocalLoad` budget (ms). A WEDGED runner — transport up
26240
26243
  * enough to stay in the service registry, but whose `broker.call` neither
26241
26244
  * resolves nor rejects (observed live as
package/dist/index.mjs CHANGED
@@ -15774,7 +15774,10 @@ var AgentLoadSummarySchema = object({
15774
15774
  online: boolean(),
15775
15775
  load: RunnerLocalLoadSchema,
15776
15776
  /** Computed score used by the L2 capacity balancer (lower = less loaded). */
15777
- score: number()
15777
+ score: number(),
15778
+ /** This node's decode hwaccel backend (per-node `probedBestHwaccel`), or null
15779
+ * when not yet probed — for the cluster Pipeline table UI (P0.2). */
15780
+ decodeHwaccel: string().nullable()
15778
15781
  });
15779
15782
  /**
15780
15783
  * Aggregate metrics across the whole detection cluster. Replaces the legacy
@@ -18485,7 +18488,7 @@ var HardwareEncoderIdSchema = _enum([
18485
18488
  "libx264",
18486
18489
  "libx265"
18487
18490
  ]);
18488
- var HardwareEncodersSchema = object({
18491
+ object({
18489
18492
  encoders: array(object({
18490
18493
  encoder: HardwareEncoderIdSchema,
18491
18494
  codec: _enum(["H264", "H265"]),
@@ -18504,15 +18507,7 @@ var HardwareEncodersSchema = object({
18504
18507
  defaultH265: HardwareEncoderIdSchema,
18505
18508
  probedAt: number()
18506
18509
  });
18507
- /**
18508
- * Decode-side companion to {@link HardwareEncodersSchema}: the `-hwaccel`
18509
- * methods the configured ffmpeg binary actually supports (parsed from
18510
- * `ffmpeg -hwaccels`). Used to gate decode-hwaccel attempts so the transcode
18511
- * egress never spends a spawn on a backend this build cannot offer. Per-stream
18512
- * decode fragility (e.g. VideoToolbox HEVC) is still handled by the egress's
18513
- * software fallback — this only filters out wholly-unsupported backends.
18514
- */
18515
- var HardwareDecodeAccelsSchema = object({
18510
+ object({
18516
18511
  methods: array(string()).readonly(),
18517
18512
  probedAt: number()
18518
18513
  });
@@ -18575,13 +18570,7 @@ var ResolvedInferenceConfigSchema = object({
18575
18570
  format: ModelFormatSchema,
18576
18571
  reason: string()
18577
18572
  });
18578
- method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema), method(_void(), HardwareEncodersSchema), method(_void(), HardwareEncodersSchema, {
18579
- kind: "mutation",
18580
- auth: "admin"
18581
- }), method(_void(), HardwareDecodeAccelsSchema), method(_void(), HardwareDecodeAccelsSchema, {
18582
- kind: "mutation",
18583
- auth: "admin"
18584
- });
18573
+ method(_void(), PlatformCapabilitiesSchema), method(_void(), HardwareInfoSchema), method(object({ requirements: array(ModelRequirementSchema).readonly() }), ResolvedInferenceConfigSchema), method(object({ prefer: HwAccelBackendInputSchema }), HwAccelResolutionSchema);
18585
18574
  var PtzPresetSchema = object({
18586
18575
  id: string(),
18587
18576
  name: string()
@@ -22206,30 +22195,6 @@ Object.freeze({
22206
22195
  addonId: null,
22207
22196
  access: "view"
22208
22197
  },
22209
- "platformProbe.getHardwareDecodeAccels": {
22210
- capName: "platform-probe",
22211
- capScope: "system",
22212
- addonId: null,
22213
- access: "view"
22214
- },
22215
- "platformProbe.getHardwareEncoders": {
22216
- capName: "platform-probe",
22217
- capScope: "system",
22218
- addonId: null,
22219
- access: "view"
22220
- },
22221
- "platformProbe.refreshHardwareDecodeAccels": {
22222
- capName: "platform-probe",
22223
- capScope: "system",
22224
- addonId: null,
22225
- access: "create"
22226
- },
22227
- "platformProbe.refreshHardwareEncoders": {
22228
- capName: "platform-probe",
22229
- capScope: "system",
22230
- addonId: null,
22231
- access: "create"
22232
- },
22233
22198
  "platformProbe.resolveHwAccel": {
22234
22199
  capName: "platform-probe",
22235
22200
  capScope: "system",
@@ -25962,6 +25927,7 @@ var PipelineOrchestratorAddon = class PipelineOrchestratorAddon extends BaseAddo
25962
25927
  * re-dispatching).
25963
25928
  */
25964
25929
  async getAgentLoad() {
25930
+ await this.refreshDecodeHwaccels();
25965
25931
  await this.collectAgentLoad();
25966
25932
  return [...this.cachedAgentLoad.values()];
25967
25933
  }
@@ -26227,11 +26193,48 @@ var PipelineOrchestratorAddon = class PipelineOrchestratorAddon extends BaseAddo
26227
26193
  nodeId: load.nodeId,
26228
26194
  online: true,
26229
26195
  load,
26230
- score: computeCapacityScore(load)
26196
+ score: computeCapacityScore(load),
26197
+ decodeHwaccel: this.decodeHwaccelByNode.get(load.nodeId) ?? null
26231
26198
  });
26232
26199
  this.cachedAgentLoad = next;
26233
26200
  }
26234
26201
  /**
26202
+ * Per-node decode hwaccel cache (`nodeId` → backend), refreshed by
26203
+ * {@link refreshDecodeHwaccels} before a UI-facing {@link getAgentLoad}. Read
26204
+ * from the decoder addon's per-node `probedBestHwaccel@<node>` setting — a
26205
+ * node-LOCAL probe published to a per-node setting — via `addonSettings`,
26206
+ * NEVER the `platform-probe` singleton (whose pin answers with hub hardware).
26207
+ */
26208
+ decodeHwaccelByNode = /* @__PURE__ */ new Map();
26209
+ /** Refresh {@link decodeHwaccelByNode} for every known runner node. */
26210
+ async refreshDecodeHwaccels() {
26211
+ await Promise.all([...this.knownRunnerNodes].map(async (nodeId) => {
26212
+ const hwaccel = await this.readNodeDecodeHwaccel(nodeId);
26213
+ if (hwaccel !== void 0) this.decodeHwaccelByNode.set(nodeId, hwaccel);
26214
+ }));
26215
+ }
26216
+ /**
26217
+ * Read a node's `probedBestHwaccel` from the decoder-ffmpeg addon's per-node
26218
+ * settings via the hub-routed `addonSettings` cap. Returns `null` when the
26219
+ * value is empty/unset, `undefined` on a read failure (keep the last known).
26220
+ * Mirrors {@link readDetectionPipelineEngine}.
26221
+ */
26222
+ async readNodeDecodeHwaccel(nodeId) {
26223
+ const api = this.ctx.api;
26224
+ if (!api?.addonSettings) return void 0;
26225
+ try {
26226
+ const schema = await api.addonSettings.getGlobalSettings.query({
26227
+ addonId: "decoder-ffmpeg",
26228
+ nodeId
26229
+ });
26230
+ if (!schema) return void 0;
26231
+ for (const s of schema.sections) for (const f of s.fields) if (f.key === "probedBestHwaccel") return typeof f.value === "string" && f.value.length > 0 ? f.value : null;
26232
+ return null;
26233
+ } catch {
26234
+ return;
26235
+ }
26236
+ }
26237
+ /**
26235
26238
  * Per-node `getLocalLoad` budget (ms). A WEDGED runner — transport up
26236
26239
  * enough to stay in the service registry, but whose `broker.call` neither
26237
26240
  * resolves nor rejects (observed live as
@@ -30,7 +30,7 @@ async function d(e) {
30
30
  }
31
31
  }
32
32
  async function f() {
33
- return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-BM9L-K3j.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-DVzgRExi.mjs")).catch((e) => {
34
34
  throw l = void 0, e;
35
35
  }), l;
36
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-pipeline-orchestrator",
3
- "version": "1.1.20",
3
+ "version": "1.1.21",
4
4
  "description": "Hub-side camera-to-agent load balancer — tracks runner capacity and dispatches attachCamera calls to the optimal pipeline-runner instance",
5
5
  "keywords": [
6
6
  "camstack",