@camstack/addon-pipeline-orchestrator 1.2.153 → 1.2.155

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 (20) hide show
  1. package/assets/viewer/.viewer-current-files.json +6 -6
  2. package/assets/viewer/.viewer-version +1 -1
  3. package/assets/viewer/_expo/static/js/web/{index-d0c6262238c13f90b3e2f44cde3fa1e5.js → index-75f763b949bea828a458aa4fa88aaabe.js} +6 -6
  4. package/assets/viewer/embed/assets/{MaskShapeCanvas-DI4BY7W2-or7hYi4E.js → MaskShapeCanvas-DI4BY7W2-CwsEoZgH.js} +1 -1
  5. package/assets/viewer/embed/assets/{MotionZonesSettings-DNdnFHso-DsKf0EK0.js → MotionZonesSettings-DNdnFHso-BBL6r4UH.js} +1 -1
  6. package/assets/viewer/embed/assets/{PrivacyMaskSettings-DNSLc6ww-D_ERFExX.js → PrivacyMaskSettings-DNSLc6ww-3mWZlmvm.js} +1 -1
  7. package/assets/viewer/embed/assets/{SceneMonitorEditor-d_A4kO-M-DT03aIuj.js → SceneMonitorEditor-d_A4kO-M-CULeYhtP.js} +1 -1
  8. package/assets/viewer/embed/assets/{index-DnRT7vB-.js → index-6Ff1zM4h.js} +19 -19
  9. package/assets/viewer/embed/index.html +1 -1
  10. package/assets/viewer/index.html +1 -1
  11. package/dist/_stub.js +2 -2
  12. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-BSKRujYj.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-BOf7GO1V.mjs} +3 -3
  13. package/dist/{_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-zcPhDMA0.mjs → _virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D5G3kOI3.mjs} +1 -1
  14. package/dist/{_virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DokBKc_-.mjs → _virtual_mf___mfe_internal__addon_pipeline_orchestrator_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-HpCSXGt7.mjs} +1 -1
  15. package/dist/{hostInit-CSc5yX2O.mjs → hostInit-XEl2iqFg.mjs} +3 -3
  16. package/dist/index.js +103 -1
  17. package/dist/index.mjs +103 -1
  18. package/dist/remoteEntry.js +1 -1
  19. package/package.json +1 -1
  20. package/assets/viewer/_expo/static/js/web/index-0bfe4572bdd5efd9eeb2cefa2e294a8e.js +0 -3674
package/dist/index.js CHANGED
@@ -20200,6 +20200,33 @@ var RecentTracksQueryInput = object({
20200
20200
  */
20201
20201
  classes: array(string()).optional()
20202
20202
  });
20203
+ /**
20204
+ * A Summary (D359): the per-camera session envelope that references tracks.
20205
+ * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20206
+ * served by the event-media plane by key), null until the first frame with a
20207
+ * member visible has been materialised.
20208
+ */
20209
+ var SummarySchema = object({
20210
+ id: string(),
20211
+ deviceId: number(),
20212
+ openedAt: number(),
20213
+ lastActiveAt: number(),
20214
+ sealedAt: number().nullable(),
20215
+ memberCount: number().int().nonnegative(),
20216
+ groupShotKey: string().nullable()
20217
+ });
20218
+ var SummariesQueryInput = object({
20219
+ deviceIds: array(number()).min(1),
20220
+ since: number().optional(),
20221
+ until: number().optional(),
20222
+ limit: number().int().min(1).max(200).default(50)
20223
+ });
20224
+ var SummariesPageSchema = object({ summaries: array(SummarySchema).readonly() });
20225
+ var SummaryDetailSchema = object({
20226
+ summary: SummarySchema,
20227
+ /** Member track ids, in absorption order. */
20228
+ trackIds: array(string()).readonly()
20229
+ });
20203
20230
  var RecentTracksPageSchema = object({
20204
20231
  /** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
20205
20232
  tracks: array(TrackSchema).readonly(),
@@ -20600,7 +20627,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20600
20627
  * timeline would read as a camera that saw nothing.
20601
20628
  */
20602
20629
  classes: array(string()).optional()
20603
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
20630
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(SummariesQueryInput, SummariesPageSchema), method(object({ id: string() }), SummaryDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
20604
20631
  kind: "mutation",
20605
20632
  auth: "admin"
20606
20633
  }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
@@ -21693,6 +21720,14 @@ var AgentPipelineSettingsSchema = object({
21693
21720
  /** Node is eligible to be the ingest / source-owner (serve the restream). */
21694
21721
  ingest: boolean().optional(),
21695
21722
  /**
21723
+ * This node's decode RAM budget, MB. Wins over the cluster
21724
+ * `nodeDecodeBudgetMb`; absent, the runner derives a share of the node's
21725
+ * own RAM unless the operator moved the cluster value (D365).
21726
+ */
21727
+ decodeBudgetMb: number().int().min(1024).max(65536).optional(),
21728
+ /** This node's live decode-worker cap. Wins over the cluster `maxLiveDecodeWorkers`. */
21729
+ maxLiveDecodeWorkers: number().int().min(1).max(32).optional(),
21730
+ /**
21696
21731
  * Operator override for the LAN host a cross-node decoder dials to reach
21697
21732
  * THIS node's restream (Cluster UI). Absent → auto-detect: a remote runner
21698
21733
  * falls back to its `CAMSTACK_HUB_URL`-derived host (the Moleculer address
@@ -22314,6 +22349,20 @@ var pipelineOrchestratorCapability = {
22314
22349
  auth: "admin"
22315
22350
  }),
22316
22351
  /**
22352
+ * Size ONE node's decode admission: its RAM budget and live-worker cap.
22353
+ * `null` clears a limit (back to the cluster setting or the RAM-derived
22354
+ * default); an omitted key leaves it alone. Read by the node's runner on
22355
+ * its next lease refresh (D365).
22356
+ */
22357
+ setAgentDecodeLimits: method(object({
22358
+ agentNodeId: string(),
22359
+ decodeBudgetMb: number().int().min(1024).max(65536).nullable().optional(),
22360
+ maxLiveDecodeWorkers: number().int().min(1).max(32).nullable().optional()
22361
+ }), object({ success: literal(true) }), {
22362
+ kind: "mutation",
22363
+ auth: "admin"
22364
+ }),
22365
+ /**
22317
22366
  * Set (or clear) the operator override for the LAN host a cross-node
22318
22367
  * decoder dials to reach this node's restream. Pass a non-empty string to
22319
22368
  * override the auto-detected address (the runner's `CAMSTACK_HUB_URL`
@@ -34105,6 +34154,12 @@ Object.freeze({
34105
34154
  addonId: null,
34106
34155
  access: "view"
34107
34156
  },
34157
+ "pipelineAnalytics.getSummary": {
34158
+ capName: "pipeline-analytics",
34159
+ capScope: "device",
34160
+ addonId: null,
34161
+ access: "view"
34162
+ },
34108
34163
  "pipelineAnalytics.getTrack": {
34109
34164
  capName: "pipeline-analytics",
34110
34165
  capScope: "device",
@@ -34183,6 +34238,12 @@ Object.freeze({
34183
34238
  addonId: null,
34184
34239
  access: "view"
34185
34240
  },
34241
+ "pipelineAnalytics.listSummaries": {
34242
+ capName: "pipeline-analytics",
34243
+ capScope: "device",
34244
+ addonId: null,
34245
+ access: "view"
34246
+ },
34186
34247
  "pipelineAnalytics.listTrackMedia": {
34187
34248
  capName: "pipeline-analytics",
34188
34249
  capScope: "device",
@@ -34741,6 +34802,12 @@ Object.freeze({
34741
34802
  addonId: null,
34742
34803
  access: "create"
34743
34804
  },
34805
+ "pipelineOrchestrator.setAgentDecodeLimits": {
34806
+ capName: "pipeline-orchestrator",
34807
+ capScope: "system",
34808
+ addonId: null,
34809
+ access: "create"
34810
+ },
34744
34811
  "pipelineOrchestrator.setAgentDetectWeight": {
34745
34812
  capName: "pipeline-orchestrator",
34746
34813
  capScope: "system",
@@ -37872,6 +37939,11 @@ Object.freeze({
37872
37939
  form: "array",
37873
37940
  optional: true
37874
37941
  }],
37942
+ "pipelineAnalytics.listSummaries": [{
37943
+ name: "deviceIds",
37944
+ form: "array",
37945
+ optional: false
37946
+ }],
37875
37947
  "pipelineAnalytics.listTrackMedia": [{
37876
37948
  name: "deviceId",
37877
37949
  form: "single",
@@ -47642,6 +47714,8 @@ var StoredAgentPipelineSettingsSchema = object({
47642
47714
  decode: boolean().optional(),
47643
47715
  audio: boolean().optional(),
47644
47716
  ingest: boolean().optional(),
47717
+ decodeBudgetMb: number().int().min(1024).max(65536).optional(),
47718
+ maxLiveDecodeWorkers: number().int().min(1).max(32).optional(),
47645
47719
  reachableHost: string().optional(),
47646
47720
  inferenceDevices: record(string(), object({
47647
47721
  enabled: boolean(),
@@ -53234,6 +53308,34 @@ var PipelineOrchestratorAddon = class PipelineOrchestratorAddon extends BaseAddo
53234
53308
  return { success: true };
53235
53309
  }
53236
53310
  /**
53311
+ * Size one node's decode admission (D365). `null` clears a limit, an
53312
+ * omitted key leaves it; the node's runner reads the entry on its next
53313
+ * lease refresh and resizes its admission — no restart.
53314
+ */
53315
+ async setAgentDecodeLimits(input) {
53316
+ const existing = (await this.settingsStore.readAgentSettingsMap())[input.agentNodeId] ?? { maxCameras: null };
53317
+ const applyLimit = (key) => {
53318
+ const patch = input[key];
53319
+ if (patch === void 0) return existing[key];
53320
+ if (patch === null) return void 0;
53321
+ return patch;
53322
+ };
53323
+ const next = {
53324
+ ...existing,
53325
+ decodeBudgetMb: applyLimit("decodeBudgetMb"),
53326
+ maxLiveDecodeWorkers: applyLimit("maxLiveDecodeWorkers")
53327
+ };
53328
+ await this.settingsStore.writeAgentSettings(input.agentNodeId, next);
53329
+ this.ctx.logger.info("agentSettings.decodeLimits updated", {
53330
+ tags: { nodeId: input.agentNodeId },
53331
+ meta: {
53332
+ decodeBudgetMb: next.decodeBudgetMb,
53333
+ maxLiveDecodeWorkers: next.maxLiveDecodeWorkers
53334
+ }
53335
+ });
53336
+ return { success: true };
53337
+ }
53338
+ /**
53237
53339
  * Set (or clear) the per-node `reachableHost` override — the LAN host a
53238
53340
  * cross-node decoder dials to reach this node's restream. A non-empty string
53239
53341
  * overrides the auto-detected host the runner would otherwise derive from
package/dist/index.mjs CHANGED
@@ -20172,6 +20172,33 @@ var RecentTracksQueryInput = object({
20172
20172
  */
20173
20173
  classes: array(string()).optional()
20174
20174
  });
20175
+ /**
20176
+ * A Summary (D359): the per-camera session envelope that references tracks.
20177
+ * `groupShotKey` is the media key of its group shot (`ownerKind: 'summary'`,
20178
+ * served by the event-media plane by key), null until the first frame with a
20179
+ * member visible has been materialised.
20180
+ */
20181
+ var SummarySchema = object({
20182
+ id: string(),
20183
+ deviceId: number(),
20184
+ openedAt: number(),
20185
+ lastActiveAt: number(),
20186
+ sealedAt: number().nullable(),
20187
+ memberCount: number().int().nonnegative(),
20188
+ groupShotKey: string().nullable()
20189
+ });
20190
+ var SummariesQueryInput = object({
20191
+ deviceIds: array(number()).min(1),
20192
+ since: number().optional(),
20193
+ until: number().optional(),
20194
+ limit: number().int().min(1).max(200).default(50)
20195
+ });
20196
+ var SummariesPageSchema = object({ summaries: array(SummarySchema).readonly() });
20197
+ var SummaryDetailSchema = object({
20198
+ summary: SummarySchema,
20199
+ /** Member track ids, in absorption order. */
20200
+ trackIds: array(string()).readonly()
20201
+ });
20175
20202
  var RecentTracksPageSchema = object({
20176
20203
  /** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
20177
20204
  tracks: array(TrackSchema).readonly(),
@@ -20572,7 +20599,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
20572
20599
  * timeline would read as a camera that saw nothing.
20573
20600
  */
20574
20601
  classes: array(string()).optional()
20575
- }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
20602
+ }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(SummariesQueryInput, SummariesPageSchema), method(object({ id: string() }), SummaryDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
20576
20603
  kind: "mutation",
20577
20604
  auth: "admin"
20578
20605
  }), method(DeviceEventQueryInput, array(MotionEventSchema).readonly()), method(ObjectEventQueryInput, array(ObjectEventSchema).readonly()), method(DeviceEventQueryInput, array(AudioEventSchema).readonly()), method(object({ deviceId: number() }), array(EventKindDescriptorSchema).readonly()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(EventKindsForDeviceSchema).readonly()), method(object({
@@ -21665,6 +21692,14 @@ var AgentPipelineSettingsSchema = object({
21665
21692
  /** Node is eligible to be the ingest / source-owner (serve the restream). */
21666
21693
  ingest: boolean().optional(),
21667
21694
  /**
21695
+ * This node's decode RAM budget, MB. Wins over the cluster
21696
+ * `nodeDecodeBudgetMb`; absent, the runner derives a share of the node's
21697
+ * own RAM unless the operator moved the cluster value (D365).
21698
+ */
21699
+ decodeBudgetMb: number().int().min(1024).max(65536).optional(),
21700
+ /** This node's live decode-worker cap. Wins over the cluster `maxLiveDecodeWorkers`. */
21701
+ maxLiveDecodeWorkers: number().int().min(1).max(32).optional(),
21702
+ /**
21668
21703
  * Operator override for the LAN host a cross-node decoder dials to reach
21669
21704
  * THIS node's restream (Cluster UI). Absent → auto-detect: a remote runner
21670
21705
  * falls back to its `CAMSTACK_HUB_URL`-derived host (the Moleculer address
@@ -22286,6 +22321,20 @@ var pipelineOrchestratorCapability = {
22286
22321
  auth: "admin"
22287
22322
  }),
22288
22323
  /**
22324
+ * Size ONE node's decode admission: its RAM budget and live-worker cap.
22325
+ * `null` clears a limit (back to the cluster setting or the RAM-derived
22326
+ * default); an omitted key leaves it alone. Read by the node's runner on
22327
+ * its next lease refresh (D365).
22328
+ */
22329
+ setAgentDecodeLimits: method(object({
22330
+ agentNodeId: string(),
22331
+ decodeBudgetMb: number().int().min(1024).max(65536).nullable().optional(),
22332
+ maxLiveDecodeWorkers: number().int().min(1).max(32).nullable().optional()
22333
+ }), object({ success: literal(true) }), {
22334
+ kind: "mutation",
22335
+ auth: "admin"
22336
+ }),
22337
+ /**
22289
22338
  * Set (or clear) the operator override for the LAN host a cross-node
22290
22339
  * decoder dials to reach this node's restream. Pass a non-empty string to
22291
22340
  * override the auto-detected address (the runner's `CAMSTACK_HUB_URL`
@@ -34077,6 +34126,12 @@ Object.freeze({
34077
34126
  addonId: null,
34078
34127
  access: "view"
34079
34128
  },
34129
+ "pipelineAnalytics.getSummary": {
34130
+ capName: "pipeline-analytics",
34131
+ capScope: "device",
34132
+ addonId: null,
34133
+ access: "view"
34134
+ },
34080
34135
  "pipelineAnalytics.getTrack": {
34081
34136
  capName: "pipeline-analytics",
34082
34137
  capScope: "device",
@@ -34155,6 +34210,12 @@ Object.freeze({
34155
34210
  addonId: null,
34156
34211
  access: "view"
34157
34212
  },
34213
+ "pipelineAnalytics.listSummaries": {
34214
+ capName: "pipeline-analytics",
34215
+ capScope: "device",
34216
+ addonId: null,
34217
+ access: "view"
34218
+ },
34158
34219
  "pipelineAnalytics.listTrackMedia": {
34159
34220
  capName: "pipeline-analytics",
34160
34221
  capScope: "device",
@@ -34713,6 +34774,12 @@ Object.freeze({
34713
34774
  addonId: null,
34714
34775
  access: "create"
34715
34776
  },
34777
+ "pipelineOrchestrator.setAgentDecodeLimits": {
34778
+ capName: "pipeline-orchestrator",
34779
+ capScope: "system",
34780
+ addonId: null,
34781
+ access: "create"
34782
+ },
34716
34783
  "pipelineOrchestrator.setAgentDetectWeight": {
34717
34784
  capName: "pipeline-orchestrator",
34718
34785
  capScope: "system",
@@ -37844,6 +37911,11 @@ Object.freeze({
37844
37911
  form: "array",
37845
37912
  optional: true
37846
37913
  }],
37914
+ "pipelineAnalytics.listSummaries": [{
37915
+ name: "deviceIds",
37916
+ form: "array",
37917
+ optional: false
37918
+ }],
37847
37919
  "pipelineAnalytics.listTrackMedia": [{
37848
37920
  name: "deviceId",
37849
37921
  form: "single",
@@ -47614,6 +47686,8 @@ var StoredAgentPipelineSettingsSchema = object({
47614
47686
  decode: boolean().optional(),
47615
47687
  audio: boolean().optional(),
47616
47688
  ingest: boolean().optional(),
47689
+ decodeBudgetMb: number().int().min(1024).max(65536).optional(),
47690
+ maxLiveDecodeWorkers: number().int().min(1).max(32).optional(),
47617
47691
  reachableHost: string().optional(),
47618
47692
  inferenceDevices: record(string(), object({
47619
47693
  enabled: boolean(),
@@ -53206,6 +53280,34 @@ var PipelineOrchestratorAddon = class PipelineOrchestratorAddon extends BaseAddo
53206
53280
  return { success: true };
53207
53281
  }
53208
53282
  /**
53283
+ * Size one node's decode admission (D365). `null` clears a limit, an
53284
+ * omitted key leaves it; the node's runner reads the entry on its next
53285
+ * lease refresh and resizes its admission — no restart.
53286
+ */
53287
+ async setAgentDecodeLimits(input) {
53288
+ const existing = (await this.settingsStore.readAgentSettingsMap())[input.agentNodeId] ?? { maxCameras: null };
53289
+ const applyLimit = (key) => {
53290
+ const patch = input[key];
53291
+ if (patch === void 0) return existing[key];
53292
+ if (patch === null) return void 0;
53293
+ return patch;
53294
+ };
53295
+ const next = {
53296
+ ...existing,
53297
+ decodeBudgetMb: applyLimit("decodeBudgetMb"),
53298
+ maxLiveDecodeWorkers: applyLimit("maxLiveDecodeWorkers")
53299
+ };
53300
+ await this.settingsStore.writeAgentSettings(input.agentNodeId, next);
53301
+ this.ctx.logger.info("agentSettings.decodeLimits updated", {
53302
+ tags: { nodeId: input.agentNodeId },
53303
+ meta: {
53304
+ decodeBudgetMb: next.decodeBudgetMb,
53305
+ maxLiveDecodeWorkers: next.maxLiveDecodeWorkers
53306
+ }
53307
+ });
53308
+ return { success: true };
53309
+ }
53310
+ /**
53209
53311
  * Set (or clear) the per-node `reachableHost` override — the LAN host a
53210
53312
  * cross-node decoder dials to reach this node's restream. A non-empty string
53211
53313
  * overrides the auto-detected host the runner would otherwise derive from
@@ -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-BSKRujYj.mjs")).catch((e) => {
33
+ return l ||= d(() => import("./_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_orchestrator_widgets-BOf7GO1V.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.2.153",
3
+ "version": "1.2.155",
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",