@camstack/addon-mqtt-broker 1.0.3 → 1.0.5

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.
@@ -5027,6 +5027,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5027
5027
  */
5028
5028
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
5029
5029
  /**
5030
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
5031
+ * the detection-pipeline provider on every state change of its lazy
5032
+ * engine-provisioning machine (idle → installing → verifying → ready,
5033
+ * or → failed with a `nextRetryAt`). Payload is the
5034
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
5035
+ * node. The Pipeline page subscribes to drive a live "installing
5036
+ * OpenVINO… / ready" indicator per node without polling
5037
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
5038
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
5039
+ */
5040
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
5041
+ /**
5030
5042
  * Cluster topology snapshot. Carries the same payload returned by
5031
5043
  * `nodes.topology` (every reachable node + addons + processes).
5032
5044
  * Emitted by the hub on any agent / addon lifecycle change
@@ -5176,14 +5188,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5176
5188
  EventCategory["DeviceSleeping"] = "device.sleeping";
5177
5189
  EventCategory["RetentionCleanup"] = "retention.cleanup";
5178
5190
  /**
5179
- * Progress snapshot emitted by `BulkUpdateCoordinator` on every state
5180
- * transition (item status change, phase change, completion, cancel).
5181
- * Payload is `BulkUpdateState`. Admin UI subscribes via `useLiveEvent`
5182
- * to drive the sticky `BulkUpdateBanner` and per-row `AddonRowBadge`.
5183
- *
5184
- * Spec: docs/superpowers/specs/2026-05-21-addons-bulk-update-progress-design.md
5191
+ * Legacy bulk-update progress snapshot (payload `BulkUpdateState`). No longer
5192
+ * emitted F3 removed the coordinator that produced it; "Update all" now runs
5193
+ * as one lifecycle engine job (`AddonsJobProgress`/`AddonsJobLog`). Retained
5194
+ * (with `BulkUpdateState`) only to avoid regenerating the event maps; removed
5195
+ * in F4 once live bulk progress is re-implemented over the engine events.
5185
5196
  */
5186
5197
  EventCategory["AddonsBulkUpdateProgress"] = "addons.bulk-update-progress";
5198
+ EventCategory["AddonsJobProgress"] = "addons.job-progress";
5199
+ EventCategory["AddonsJobLog"] = "addons.job-log";
5187
5200
  /**
5188
5201
  * A container's child visibility toggled (hidden/shown). Emitted by the
5189
5202
  * `accessories` cap when a child device is hidden or revealed.
@@ -9190,6 +9203,24 @@ var DetectorOutputSchema = object({
9190
9203
  inferenceMs: number(),
9191
9204
  modelId: string()
9192
9205
  });
9206
+ var EngineProvisioningSchema = object({
9207
+ runtimeId: _enum([
9208
+ "onnx",
9209
+ "openvino",
9210
+ "coreml"
9211
+ ]).nullable(),
9212
+ device: string().nullable(),
9213
+ state: _enum([
9214
+ "idle",
9215
+ "installing",
9216
+ "verifying",
9217
+ "ready",
9218
+ "failed"
9219
+ ]),
9220
+ progress: number().optional(),
9221
+ error: string().optional(),
9222
+ nextRetryAt: number().optional()
9223
+ });
9193
9224
  var PipelineStepInputSchema = lazy(() => object({
9194
9225
  addonId: string(),
9195
9226
  modelId: string(),
@@ -9258,7 +9289,7 @@ var PipelineRunResultBridge = custom();
9258
9289
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
9259
9290
  kind: "mutation",
9260
9291
  auth: "admin"
9261
- }), method(_void(), record(string(), object({
9292
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
9262
9293
  modelId: string(),
9263
9294
  settings: record(string(), unknown()).readonly()
9264
9295
  }))), method(object({ steps: record(string(), object({
@@ -12913,7 +12944,10 @@ var AgentAddonConfigSchema = object({
12913
12944
  modelId: string(),
12914
12945
  settings: record(string(), unknown()).readonly()
12915
12946
  });
12916
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
12947
+ var AgentPipelineSettingsSchema = object({
12948
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
12949
+ maxCameras: number().int().nonnegative().nullable().default(null)
12950
+ });
12917
12951
  var CameraPipelineForAgentSchema = object({
12918
12952
  steps: array(PipelineStepInputSchema).readonly(),
12919
12953
  audio: object({
@@ -13015,6 +13049,133 @@ var GlobalMetricsSchema = object({
13015
13049
  * capability providers.
13016
13050
  */
13017
13051
  var CapabilityBindingsSchema = record(string(), string());
13052
+ /** Source block — always present; derives from the stream catalog. */
13053
+ var CameraSourceStatusSchema = object({ streams: array(object({
13054
+ camStreamId: string(),
13055
+ codec: string(),
13056
+ width: number(),
13057
+ height: number(),
13058
+ fps: number(),
13059
+ kind: string()
13060
+ })).readonly() });
13061
+ /** Assignment block — always present (orchestrator-local, no remote call). */
13062
+ var CameraAssignmentStatusSchema = object({
13063
+ detectionNodeId: string().nullable(),
13064
+ decoderNodeId: string().nullable(),
13065
+ audioNodeId: string().nullable(),
13066
+ pinned: object({
13067
+ detection: boolean(),
13068
+ decoder: boolean(),
13069
+ audio: boolean()
13070
+ }),
13071
+ reasons: object({
13072
+ detection: string().optional(),
13073
+ decoder: string().optional(),
13074
+ audio: string().optional()
13075
+ })
13076
+ });
13077
+ /** Broker block — null when the broker stage is unreachable or inactive. */
13078
+ var CameraBrokerStatusSchema = object({
13079
+ profiles: array(object({
13080
+ profile: string(),
13081
+ status: string(),
13082
+ codec: string(),
13083
+ width: number(),
13084
+ height: number(),
13085
+ subscribers: number(),
13086
+ inFps: number(),
13087
+ outFps: number()
13088
+ })).readonly(),
13089
+ webrtcSessions: number(),
13090
+ rtspRestream: boolean()
13091
+ });
13092
+ /** Shared-memory ring statistics within the decoder block. */
13093
+ var CameraDecoderShmSchema = object({
13094
+ framesWritten: number(),
13095
+ getFrameHits: number(),
13096
+ getFrameMisses: number(),
13097
+ budgetMb: number()
13098
+ });
13099
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
13100
+ var CameraDecoderStatusSchema = object({
13101
+ nodeId: string(),
13102
+ formats: array(string()).readonly(),
13103
+ sessionCount: number(),
13104
+ shm: CameraDecoderShmSchema
13105
+ });
13106
+ /** Motion block — null when motion detection is not active for this device. */
13107
+ var CameraMotionStatusSchema = object({
13108
+ enabled: boolean(),
13109
+ fps: number()
13110
+ });
13111
+ /** Detection provisioning sub-block. */
13112
+ var CameraDetectionProvisioningSchema = object({
13113
+ state: _enum([
13114
+ "idle",
13115
+ "installing",
13116
+ "verifying",
13117
+ "ready",
13118
+ "failed"
13119
+ ]),
13120
+ error: string().optional()
13121
+ });
13122
+ /** Detection phase — derived from the runner's engine phase. */
13123
+ var CameraDetectionPhaseSchema = _enum([
13124
+ "idle",
13125
+ "watching",
13126
+ "active"
13127
+ ]);
13128
+ /** Detection block — null when no detection node is assigned or reachable. */
13129
+ var CameraDetectionStatusSchema = object({
13130
+ nodeId: string(),
13131
+ engine: object({
13132
+ backend: string(),
13133
+ device: string()
13134
+ }),
13135
+ phase: CameraDetectionPhaseSchema,
13136
+ configuredFps: number(),
13137
+ actualFps: number(),
13138
+ queueDepth: number(),
13139
+ avgInferenceMs: number(),
13140
+ provisioning: CameraDetectionProvisioningSchema
13141
+ });
13142
+ /** Audio block — null when no audio node is assigned or reachable. */
13143
+ var CameraAudioStatusSchema = object({
13144
+ nodeId: string(),
13145
+ enabled: boolean()
13146
+ });
13147
+ /** Recording block — null when no recording cap is active for this device. */
13148
+ var CameraRecordingStatusSchema = object({
13149
+ mode: _enum([
13150
+ "off",
13151
+ "continuous",
13152
+ "events"
13153
+ ]),
13154
+ active: boolean(),
13155
+ storageBytes: number()
13156
+ });
13157
+ /**
13158
+ * Aggregated per-camera pipeline status — server-composed, single call.
13159
+ *
13160
+ * The `assignment` and `source` blocks are always present.
13161
+ * Every other block is `null` when the stage is inactive or unreachable
13162
+ * during the bounded parallel fan-out in the orchestrator implementation.
13163
+ *
13164
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
13165
+ */
13166
+ var CameraStatusSchema = object({
13167
+ deviceId: number(),
13168
+ assignment: CameraAssignmentStatusSchema,
13169
+ source: CameraSourceStatusSchema,
13170
+ broker: CameraBrokerStatusSchema.nullable(),
13171
+ decoder: CameraDecoderStatusSchema.nullable(),
13172
+ motion: CameraMotionStatusSchema.nullable(),
13173
+ detection: CameraDetectionStatusSchema.nullable(),
13174
+ audio: CameraAudioStatusSchema.nullable(),
13175
+ recording: CameraRecordingStatusSchema.nullable(),
13176
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
13177
+ fetchedAt: number()
13178
+ });
13018
13179
  method(object({
13019
13180
  deviceId: number(),
13020
13181
  agentNodeId: string()
@@ -13082,6 +13243,12 @@ method(object({
13082
13243
  }), {
13083
13244
  kind: "mutation",
13084
13245
  auth: "admin"
13246
+ }), method(object({
13247
+ agentNodeId: string(),
13248
+ maxCameras: number().int().nonnegative().nullable()
13249
+ }), object({ success: literal(true) }), {
13250
+ kind: "mutation",
13251
+ auth: "admin"
13085
13252
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
13086
13253
  deviceId: number(),
13087
13254
  addonId: string(),
@@ -13107,7 +13274,7 @@ method(object({
13107
13274
  }), method(object({
13108
13275
  deviceId: number(),
13109
13276
  agentNodeId: string().optional()
13110
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13277
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13111
13278
  name: string(),
13112
13279
  description: string().optional(),
13113
13280
  config: CameraPipelineConfigSchema
@@ -16071,6 +16238,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
16071
16238
  kind: "mutation",
16072
16239
  auth: "admin"
16073
16240
  });
16241
+ var jobKindSchema = _enum([
16242
+ "install",
16243
+ "update",
16244
+ "uninstall",
16245
+ "restart"
16246
+ ]);
16247
+ var taskPhaseSchema = _enum([
16248
+ "queued",
16249
+ "fetching",
16250
+ "staged",
16251
+ "validating",
16252
+ "applying",
16253
+ "restarting",
16254
+ "applied",
16255
+ "done",
16256
+ "failed",
16257
+ "skipped"
16258
+ ]);
16259
+ var taskTargetSchema = _enum(["framework", "addon"]);
16260
+ var taskLogEntrySchema = object({
16261
+ tsMs: number(),
16262
+ nodeId: string(),
16263
+ packageName: string(),
16264
+ phase: taskPhaseSchema,
16265
+ message: string()
16266
+ });
16267
+ var lifecycleTaskSchema = object({
16268
+ taskId: string(),
16269
+ nodeId: string(),
16270
+ packageName: string(),
16271
+ fromVersion: string().nullable(),
16272
+ toVersion: string(),
16273
+ target: taskTargetSchema,
16274
+ phase: taskPhaseSchema,
16275
+ stagedPath: string().nullable(),
16276
+ attempts: number(),
16277
+ steps: array(taskLogEntrySchema),
16278
+ error: string().nullable(),
16279
+ startedAtMs: number().nullable(),
16280
+ finishedAtMs: number().nullable()
16281
+ });
16282
+ var lifecycleJobStateSchema = _enum([
16283
+ "running",
16284
+ "completed",
16285
+ "failed",
16286
+ "partially-failed",
16287
+ "cancelled"
16288
+ ]);
16289
+ var lifecycleJobScopeSchema = _enum([
16290
+ "single",
16291
+ "bulk",
16292
+ "cluster"
16293
+ ]);
16294
+ var lifecycleJobSchema = object({
16295
+ jobId: string(),
16296
+ kind: jobKindSchema,
16297
+ createdAtMs: number(),
16298
+ createdBy: string(),
16299
+ scope: lifecycleJobScopeSchema,
16300
+ tasks: array(lifecycleTaskSchema),
16301
+ state: lifecycleJobStateSchema,
16302
+ schemaVersion: literal(1)
16303
+ });
16074
16304
  /**
16075
16305
  * addons — system-scoped singleton capability for addon package
16076
16306
  * management (install, update, configure, restart) and per-addon log
@@ -16253,7 +16483,7 @@ var BulkUpdatePhaseSchema = _enum([
16253
16483
  "restarting",
16254
16484
  "finalizing"
16255
16485
  ]);
16256
- var BulkUpdateStateSchema = object({
16486
+ object({
16257
16487
  id: string(),
16258
16488
  nodeId: string(),
16259
16489
  startedAtMs: number(),
@@ -16356,20 +16586,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16356
16586
  }), UpdateFrameworkPackageResultSchema, {
16357
16587
  kind: "mutation",
16358
16588
  auth: "admin"
16359
- }), method(object({
16360
- nodeId: string(),
16361
- items: array(object({
16362
- name: string(),
16363
- version: string(),
16364
- isSystem: boolean()
16365
- })).readonly()
16366
- }), object({ id: string() }), {
16367
- kind: "mutation",
16368
- auth: "admin"
16369
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
16370
- kind: "mutation",
16371
- auth: "admin"
16372
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16589
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16373
16590
  kind: "mutation",
16374
16591
  auth: "admin"
16375
16592
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -16391,6 +16608,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16391
16608
  kind: "mutation",
16392
16609
  auth: "admin"
16393
16610
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
16611
+ kind: _enum([
16612
+ "install",
16613
+ "update",
16614
+ "uninstall",
16615
+ "restart"
16616
+ ]),
16617
+ targets: array(object({
16618
+ name: string().min(1),
16619
+ version: string().min(1)
16620
+ })).min(1),
16621
+ nodeIds: array(string()).optional()
16622
+ }), object({ jobId: string() }), {
16623
+ kind: "mutation",
16624
+ auth: "admin"
16625
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
16626
+ kind: "mutation",
16627
+ auth: "admin"
16628
+ }), method(object({
16394
16629
  addonId: string(),
16395
16630
  level: LogLevelSchema$1.optional()
16396
16631
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -16431,7 +16666,7 @@ Object.freeze({
16431
16666
  addonId: null,
16432
16667
  access: "create"
16433
16668
  },
16434
- "addons.cancelBulkUpdate": {
16669
+ "addons.cancelJob": {
16435
16670
  capName: "addons",
16436
16671
  capScope: "system",
16437
16672
  addonId: null,
@@ -16461,7 +16696,7 @@ Object.freeze({
16461
16696
  addonId: null,
16462
16697
  access: "view"
16463
16698
  },
16464
- "addons.getBulkUpdateState": {
16699
+ "addons.getJob": {
16465
16700
  capName: "addons",
16466
16701
  capScope: "system",
16467
16702
  addonId: null,
@@ -16509,19 +16744,19 @@ Object.freeze({
16509
16744
  addonId: null,
16510
16745
  access: "view"
16511
16746
  },
16512
- "addons.listActiveBulkUpdates": {
16747
+ "addons.listCapabilityProviders": {
16513
16748
  capName: "addons",
16514
16749
  capScope: "system",
16515
16750
  addonId: null,
16516
16751
  access: "view"
16517
16752
  },
16518
- "addons.listCapabilityProviders": {
16753
+ "addons.listFrameworkPackages": {
16519
16754
  capName: "addons",
16520
16755
  capScope: "system",
16521
16756
  addonId: null,
16522
16757
  access: "view"
16523
16758
  },
16524
- "addons.listFrameworkPackages": {
16759
+ "addons.listJobs": {
16525
16760
  capName: "addons",
16526
16761
  capScope: "system",
16527
16762
  addonId: null,
@@ -16605,7 +16840,7 @@ Object.freeze({
16605
16840
  addonId: null,
16606
16841
  access: "create"
16607
16842
  },
16608
- "addons.startBulkUpdate": {
16843
+ "addons.startJob": {
16609
16844
  capName: "addons",
16610
16845
  capScope: "system",
16611
16846
  addonId: null,
@@ -18831,6 +19066,12 @@ Object.freeze({
18831
19066
  addonId: null,
18832
19067
  access: "view"
18833
19068
  },
19069
+ "pipelineExecutor.getEngineProvisioning": {
19070
+ capName: "pipeline-executor",
19071
+ capScope: "system",
19072
+ addonId: null,
19073
+ access: "view"
19074
+ },
18834
19075
  "pipelineExecutor.getGlobalPipelineConfig": {
18835
19076
  capName: "pipeline-executor",
18836
19077
  capScope: "system",
@@ -19035,6 +19276,18 @@ Object.freeze({
19035
19276
  addonId: null,
19036
19277
  access: "view"
19037
19278
  },
19279
+ "pipelineOrchestrator.getCameraStatus": {
19280
+ capName: "pipeline-orchestrator",
19281
+ capScope: "system",
19282
+ addonId: null,
19283
+ access: "view"
19284
+ },
19285
+ "pipelineOrchestrator.getCameraStatuses": {
19286
+ capName: "pipeline-orchestrator",
19287
+ capScope: "system",
19288
+ addonId: null,
19289
+ access: "view"
19290
+ },
19038
19291
  "pipelineOrchestrator.getCameraStepOverrides": {
19039
19292
  capName: "pipeline-orchestrator",
19040
19293
  capScope: "system",
@@ -19119,6 +19372,12 @@ Object.freeze({
19119
19372
  addonId: null,
19120
19373
  access: "create"
19121
19374
  },
19375
+ "pipelineOrchestrator.setAgentMaxCameras": {
19376
+ capName: "pipeline-orchestrator",
19377
+ capScope: "system",
19378
+ addonId: null,
19379
+ access: "create"
19380
+ },
19122
19381
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19123
19382
  capName: "pipeline-orchestrator",
19124
19383
  capScope: "system",
@@ -20592,6 +20851,32 @@ Object.freeze({
20592
20851
  "network-access": "ingress",
20593
20852
  "smtp-provider": "email"
20594
20853
  });
20854
+ var frameworkSwapPackageSchema = object({
20855
+ name: string(),
20856
+ stagedPath: string(),
20857
+ backupPath: string(),
20858
+ toVersion: string(),
20859
+ fromVersion: string().nullable()
20860
+ });
20861
+ object({
20862
+ jobId: string(),
20863
+ taskId: string(),
20864
+ packages: array(frameworkSwapPackageSchema),
20865
+ requestedAtMs: number(),
20866
+ schemaVersion: literal(1)
20867
+ });
20868
+ object({
20869
+ jobId: string(),
20870
+ taskId: string(),
20871
+ backups: array(object({
20872
+ name: string(),
20873
+ backupPath: string(),
20874
+ livePath: string()
20875
+ })),
20876
+ appliedAtMs: number(),
20877
+ bootAttempts: number(),
20878
+ schemaVersion: literal(1)
20879
+ });
20595
20880
  //#endregion
20596
20881
  //#region ../../node_modules/xtend/immutable.js
20597
20882
  var require_immutable = /* @__PURE__ */ __commonJSMin(((exports, module) => {
@@ -5022,6 +5022,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5022
5022
  */
5023
5023
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
5024
5024
  /**
5025
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
5026
+ * the detection-pipeline provider on every state change of its lazy
5027
+ * engine-provisioning machine (idle → installing → verifying → ready,
5028
+ * or → failed with a `nextRetryAt`). Payload is the
5029
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
5030
+ * node. The Pipeline page subscribes to drive a live "installing
5031
+ * OpenVINO… / ready" indicator per node without polling
5032
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
5033
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
5034
+ */
5035
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
5036
+ /**
5025
5037
  * Cluster topology snapshot. Carries the same payload returned by
5026
5038
  * `nodes.topology` (every reachable node + addons + processes).
5027
5039
  * Emitted by the hub on any agent / addon lifecycle change
@@ -5171,14 +5183,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5171
5183
  EventCategory["DeviceSleeping"] = "device.sleeping";
5172
5184
  EventCategory["RetentionCleanup"] = "retention.cleanup";
5173
5185
  /**
5174
- * Progress snapshot emitted by `BulkUpdateCoordinator` on every state
5175
- * transition (item status change, phase change, completion, cancel).
5176
- * Payload is `BulkUpdateState`. Admin UI subscribes via `useLiveEvent`
5177
- * to drive the sticky `BulkUpdateBanner` and per-row `AddonRowBadge`.
5178
- *
5179
- * Spec: docs/superpowers/specs/2026-05-21-addons-bulk-update-progress-design.md
5186
+ * Legacy bulk-update progress snapshot (payload `BulkUpdateState`). No longer
5187
+ * emitted F3 removed the coordinator that produced it; "Update all" now runs
5188
+ * as one lifecycle engine job (`AddonsJobProgress`/`AddonsJobLog`). Retained
5189
+ * (with `BulkUpdateState`) only to avoid regenerating the event maps; removed
5190
+ * in F4 once live bulk progress is re-implemented over the engine events.
5180
5191
  */
5181
5192
  EventCategory["AddonsBulkUpdateProgress"] = "addons.bulk-update-progress";
5193
+ EventCategory["AddonsJobProgress"] = "addons.job-progress";
5194
+ EventCategory["AddonsJobLog"] = "addons.job-log";
5182
5195
  /**
5183
5196
  * A container's child visibility toggled (hidden/shown). Emitted by the
5184
5197
  * `accessories` cap when a child device is hidden or revealed.
@@ -9185,6 +9198,24 @@ var DetectorOutputSchema = object({
9185
9198
  inferenceMs: number(),
9186
9199
  modelId: string()
9187
9200
  });
9201
+ var EngineProvisioningSchema = object({
9202
+ runtimeId: _enum([
9203
+ "onnx",
9204
+ "openvino",
9205
+ "coreml"
9206
+ ]).nullable(),
9207
+ device: string().nullable(),
9208
+ state: _enum([
9209
+ "idle",
9210
+ "installing",
9211
+ "verifying",
9212
+ "ready",
9213
+ "failed"
9214
+ ]),
9215
+ progress: number().optional(),
9216
+ error: string().optional(),
9217
+ nextRetryAt: number().optional()
9218
+ });
9188
9219
  var PipelineStepInputSchema = lazy(() => object({
9189
9220
  addonId: string(),
9190
9221
  modelId: string(),
@@ -9253,7 +9284,7 @@ var PipelineRunResultBridge = custom();
9253
9284
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
9254
9285
  kind: "mutation",
9255
9286
  auth: "admin"
9256
- }), method(_void(), record(string(), object({
9287
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
9257
9288
  modelId: string(),
9258
9289
  settings: record(string(), unknown()).readonly()
9259
9290
  }))), method(object({ steps: record(string(), object({
@@ -12908,7 +12939,10 @@ var AgentAddonConfigSchema = object({
12908
12939
  modelId: string(),
12909
12940
  settings: record(string(), unknown()).readonly()
12910
12941
  });
12911
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
12942
+ var AgentPipelineSettingsSchema = object({
12943
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
12944
+ maxCameras: number().int().nonnegative().nullable().default(null)
12945
+ });
12912
12946
  var CameraPipelineForAgentSchema = object({
12913
12947
  steps: array(PipelineStepInputSchema).readonly(),
12914
12948
  audio: object({
@@ -13010,6 +13044,133 @@ var GlobalMetricsSchema = object({
13010
13044
  * capability providers.
13011
13045
  */
13012
13046
  var CapabilityBindingsSchema = record(string(), string());
13047
+ /** Source block — always present; derives from the stream catalog. */
13048
+ var CameraSourceStatusSchema = object({ streams: array(object({
13049
+ camStreamId: string(),
13050
+ codec: string(),
13051
+ width: number(),
13052
+ height: number(),
13053
+ fps: number(),
13054
+ kind: string()
13055
+ })).readonly() });
13056
+ /** Assignment block — always present (orchestrator-local, no remote call). */
13057
+ var CameraAssignmentStatusSchema = object({
13058
+ detectionNodeId: string().nullable(),
13059
+ decoderNodeId: string().nullable(),
13060
+ audioNodeId: string().nullable(),
13061
+ pinned: object({
13062
+ detection: boolean(),
13063
+ decoder: boolean(),
13064
+ audio: boolean()
13065
+ }),
13066
+ reasons: object({
13067
+ detection: string().optional(),
13068
+ decoder: string().optional(),
13069
+ audio: string().optional()
13070
+ })
13071
+ });
13072
+ /** Broker block — null when the broker stage is unreachable or inactive. */
13073
+ var CameraBrokerStatusSchema = object({
13074
+ profiles: array(object({
13075
+ profile: string(),
13076
+ status: string(),
13077
+ codec: string(),
13078
+ width: number(),
13079
+ height: number(),
13080
+ subscribers: number(),
13081
+ inFps: number(),
13082
+ outFps: number()
13083
+ })).readonly(),
13084
+ webrtcSessions: number(),
13085
+ rtspRestream: boolean()
13086
+ });
13087
+ /** Shared-memory ring statistics within the decoder block. */
13088
+ var CameraDecoderShmSchema = object({
13089
+ framesWritten: number(),
13090
+ getFrameHits: number(),
13091
+ getFrameMisses: number(),
13092
+ budgetMb: number()
13093
+ });
13094
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
13095
+ var CameraDecoderStatusSchema = object({
13096
+ nodeId: string(),
13097
+ formats: array(string()).readonly(),
13098
+ sessionCount: number(),
13099
+ shm: CameraDecoderShmSchema
13100
+ });
13101
+ /** Motion block — null when motion detection is not active for this device. */
13102
+ var CameraMotionStatusSchema = object({
13103
+ enabled: boolean(),
13104
+ fps: number()
13105
+ });
13106
+ /** Detection provisioning sub-block. */
13107
+ var CameraDetectionProvisioningSchema = object({
13108
+ state: _enum([
13109
+ "idle",
13110
+ "installing",
13111
+ "verifying",
13112
+ "ready",
13113
+ "failed"
13114
+ ]),
13115
+ error: string().optional()
13116
+ });
13117
+ /** Detection phase — derived from the runner's engine phase. */
13118
+ var CameraDetectionPhaseSchema = _enum([
13119
+ "idle",
13120
+ "watching",
13121
+ "active"
13122
+ ]);
13123
+ /** Detection block — null when no detection node is assigned or reachable. */
13124
+ var CameraDetectionStatusSchema = object({
13125
+ nodeId: string(),
13126
+ engine: object({
13127
+ backend: string(),
13128
+ device: string()
13129
+ }),
13130
+ phase: CameraDetectionPhaseSchema,
13131
+ configuredFps: number(),
13132
+ actualFps: number(),
13133
+ queueDepth: number(),
13134
+ avgInferenceMs: number(),
13135
+ provisioning: CameraDetectionProvisioningSchema
13136
+ });
13137
+ /** Audio block — null when no audio node is assigned or reachable. */
13138
+ var CameraAudioStatusSchema = object({
13139
+ nodeId: string(),
13140
+ enabled: boolean()
13141
+ });
13142
+ /** Recording block — null when no recording cap is active for this device. */
13143
+ var CameraRecordingStatusSchema = object({
13144
+ mode: _enum([
13145
+ "off",
13146
+ "continuous",
13147
+ "events"
13148
+ ]),
13149
+ active: boolean(),
13150
+ storageBytes: number()
13151
+ });
13152
+ /**
13153
+ * Aggregated per-camera pipeline status — server-composed, single call.
13154
+ *
13155
+ * The `assignment` and `source` blocks are always present.
13156
+ * Every other block is `null` when the stage is inactive or unreachable
13157
+ * during the bounded parallel fan-out in the orchestrator implementation.
13158
+ *
13159
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
13160
+ */
13161
+ var CameraStatusSchema = object({
13162
+ deviceId: number(),
13163
+ assignment: CameraAssignmentStatusSchema,
13164
+ source: CameraSourceStatusSchema,
13165
+ broker: CameraBrokerStatusSchema.nullable(),
13166
+ decoder: CameraDecoderStatusSchema.nullable(),
13167
+ motion: CameraMotionStatusSchema.nullable(),
13168
+ detection: CameraDetectionStatusSchema.nullable(),
13169
+ audio: CameraAudioStatusSchema.nullable(),
13170
+ recording: CameraRecordingStatusSchema.nullable(),
13171
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
13172
+ fetchedAt: number()
13173
+ });
13013
13174
  method(object({
13014
13175
  deviceId: number(),
13015
13176
  agentNodeId: string()
@@ -13077,6 +13238,12 @@ method(object({
13077
13238
  }), {
13078
13239
  kind: "mutation",
13079
13240
  auth: "admin"
13241
+ }), method(object({
13242
+ agentNodeId: string(),
13243
+ maxCameras: number().int().nonnegative().nullable()
13244
+ }), object({ success: literal(true) }), {
13245
+ kind: "mutation",
13246
+ auth: "admin"
13080
13247
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
13081
13248
  deviceId: number(),
13082
13249
  addonId: string(),
@@ -13102,7 +13269,7 @@ method(object({
13102
13269
  }), method(object({
13103
13270
  deviceId: number(),
13104
13271
  agentNodeId: string().optional()
13105
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13272
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13106
13273
  name: string(),
13107
13274
  description: string().optional(),
13108
13275
  config: CameraPipelineConfigSchema
@@ -16066,6 +16233,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
16066
16233
  kind: "mutation",
16067
16234
  auth: "admin"
16068
16235
  });
16236
+ var jobKindSchema = _enum([
16237
+ "install",
16238
+ "update",
16239
+ "uninstall",
16240
+ "restart"
16241
+ ]);
16242
+ var taskPhaseSchema = _enum([
16243
+ "queued",
16244
+ "fetching",
16245
+ "staged",
16246
+ "validating",
16247
+ "applying",
16248
+ "restarting",
16249
+ "applied",
16250
+ "done",
16251
+ "failed",
16252
+ "skipped"
16253
+ ]);
16254
+ var taskTargetSchema = _enum(["framework", "addon"]);
16255
+ var taskLogEntrySchema = object({
16256
+ tsMs: number(),
16257
+ nodeId: string(),
16258
+ packageName: string(),
16259
+ phase: taskPhaseSchema,
16260
+ message: string()
16261
+ });
16262
+ var lifecycleTaskSchema = object({
16263
+ taskId: string(),
16264
+ nodeId: string(),
16265
+ packageName: string(),
16266
+ fromVersion: string().nullable(),
16267
+ toVersion: string(),
16268
+ target: taskTargetSchema,
16269
+ phase: taskPhaseSchema,
16270
+ stagedPath: string().nullable(),
16271
+ attempts: number(),
16272
+ steps: array(taskLogEntrySchema),
16273
+ error: string().nullable(),
16274
+ startedAtMs: number().nullable(),
16275
+ finishedAtMs: number().nullable()
16276
+ });
16277
+ var lifecycleJobStateSchema = _enum([
16278
+ "running",
16279
+ "completed",
16280
+ "failed",
16281
+ "partially-failed",
16282
+ "cancelled"
16283
+ ]);
16284
+ var lifecycleJobScopeSchema = _enum([
16285
+ "single",
16286
+ "bulk",
16287
+ "cluster"
16288
+ ]);
16289
+ var lifecycleJobSchema = object({
16290
+ jobId: string(),
16291
+ kind: jobKindSchema,
16292
+ createdAtMs: number(),
16293
+ createdBy: string(),
16294
+ scope: lifecycleJobScopeSchema,
16295
+ tasks: array(lifecycleTaskSchema),
16296
+ state: lifecycleJobStateSchema,
16297
+ schemaVersion: literal(1)
16298
+ });
16069
16299
  /**
16070
16300
  * addons — system-scoped singleton capability for addon package
16071
16301
  * management (install, update, configure, restart) and per-addon log
@@ -16248,7 +16478,7 @@ var BulkUpdatePhaseSchema = _enum([
16248
16478
  "restarting",
16249
16479
  "finalizing"
16250
16480
  ]);
16251
- var BulkUpdateStateSchema = object({
16481
+ object({
16252
16482
  id: string(),
16253
16483
  nodeId: string(),
16254
16484
  startedAtMs: number(),
@@ -16351,20 +16581,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16351
16581
  }), UpdateFrameworkPackageResultSchema, {
16352
16582
  kind: "mutation",
16353
16583
  auth: "admin"
16354
- }), method(object({
16355
- nodeId: string(),
16356
- items: array(object({
16357
- name: string(),
16358
- version: string(),
16359
- isSystem: boolean()
16360
- })).readonly()
16361
- }), object({ id: string() }), {
16362
- kind: "mutation",
16363
- auth: "admin"
16364
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
16365
- kind: "mutation",
16366
- auth: "admin"
16367
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16584
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16368
16585
  kind: "mutation",
16369
16586
  auth: "admin"
16370
16587
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -16386,6 +16603,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16386
16603
  kind: "mutation",
16387
16604
  auth: "admin"
16388
16605
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
16606
+ kind: _enum([
16607
+ "install",
16608
+ "update",
16609
+ "uninstall",
16610
+ "restart"
16611
+ ]),
16612
+ targets: array(object({
16613
+ name: string().min(1),
16614
+ version: string().min(1)
16615
+ })).min(1),
16616
+ nodeIds: array(string()).optional()
16617
+ }), object({ jobId: string() }), {
16618
+ kind: "mutation",
16619
+ auth: "admin"
16620
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
16621
+ kind: "mutation",
16622
+ auth: "admin"
16623
+ }), method(object({
16389
16624
  addonId: string(),
16390
16625
  level: LogLevelSchema$1.optional()
16391
16626
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -16426,7 +16661,7 @@ Object.freeze({
16426
16661
  addonId: null,
16427
16662
  access: "create"
16428
16663
  },
16429
- "addons.cancelBulkUpdate": {
16664
+ "addons.cancelJob": {
16430
16665
  capName: "addons",
16431
16666
  capScope: "system",
16432
16667
  addonId: null,
@@ -16456,7 +16691,7 @@ Object.freeze({
16456
16691
  addonId: null,
16457
16692
  access: "view"
16458
16693
  },
16459
- "addons.getBulkUpdateState": {
16694
+ "addons.getJob": {
16460
16695
  capName: "addons",
16461
16696
  capScope: "system",
16462
16697
  addonId: null,
@@ -16504,19 +16739,19 @@ Object.freeze({
16504
16739
  addonId: null,
16505
16740
  access: "view"
16506
16741
  },
16507
- "addons.listActiveBulkUpdates": {
16742
+ "addons.listCapabilityProviders": {
16508
16743
  capName: "addons",
16509
16744
  capScope: "system",
16510
16745
  addonId: null,
16511
16746
  access: "view"
16512
16747
  },
16513
- "addons.listCapabilityProviders": {
16748
+ "addons.listFrameworkPackages": {
16514
16749
  capName: "addons",
16515
16750
  capScope: "system",
16516
16751
  addonId: null,
16517
16752
  access: "view"
16518
16753
  },
16519
- "addons.listFrameworkPackages": {
16754
+ "addons.listJobs": {
16520
16755
  capName: "addons",
16521
16756
  capScope: "system",
16522
16757
  addonId: null,
@@ -16600,7 +16835,7 @@ Object.freeze({
16600
16835
  addonId: null,
16601
16836
  access: "create"
16602
16837
  },
16603
- "addons.startBulkUpdate": {
16838
+ "addons.startJob": {
16604
16839
  capName: "addons",
16605
16840
  capScope: "system",
16606
16841
  addonId: null,
@@ -18826,6 +19061,12 @@ Object.freeze({
18826
19061
  addonId: null,
18827
19062
  access: "view"
18828
19063
  },
19064
+ "pipelineExecutor.getEngineProvisioning": {
19065
+ capName: "pipeline-executor",
19066
+ capScope: "system",
19067
+ addonId: null,
19068
+ access: "view"
19069
+ },
18829
19070
  "pipelineExecutor.getGlobalPipelineConfig": {
18830
19071
  capName: "pipeline-executor",
18831
19072
  capScope: "system",
@@ -19030,6 +19271,18 @@ Object.freeze({
19030
19271
  addonId: null,
19031
19272
  access: "view"
19032
19273
  },
19274
+ "pipelineOrchestrator.getCameraStatus": {
19275
+ capName: "pipeline-orchestrator",
19276
+ capScope: "system",
19277
+ addonId: null,
19278
+ access: "view"
19279
+ },
19280
+ "pipelineOrchestrator.getCameraStatuses": {
19281
+ capName: "pipeline-orchestrator",
19282
+ capScope: "system",
19283
+ addonId: null,
19284
+ access: "view"
19285
+ },
19033
19286
  "pipelineOrchestrator.getCameraStepOverrides": {
19034
19287
  capName: "pipeline-orchestrator",
19035
19288
  capScope: "system",
@@ -19114,6 +19367,12 @@ Object.freeze({
19114
19367
  addonId: null,
19115
19368
  access: "create"
19116
19369
  },
19370
+ "pipelineOrchestrator.setAgentMaxCameras": {
19371
+ capName: "pipeline-orchestrator",
19372
+ capScope: "system",
19373
+ addonId: null,
19374
+ access: "create"
19375
+ },
19117
19376
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19118
19377
  capName: "pipeline-orchestrator",
19119
19378
  capScope: "system",
@@ -20587,6 +20846,32 @@ Object.freeze({
20587
20846
  "network-access": "ingress",
20588
20847
  "smtp-provider": "email"
20589
20848
  });
20849
+ var frameworkSwapPackageSchema = object({
20850
+ name: string(),
20851
+ stagedPath: string(),
20852
+ backupPath: string(),
20853
+ toVersion: string(),
20854
+ fromVersion: string().nullable()
20855
+ });
20856
+ object({
20857
+ jobId: string(),
20858
+ taskId: string(),
20859
+ packages: array(frameworkSwapPackageSchema),
20860
+ requestedAtMs: number(),
20861
+ schemaVersion: literal(1)
20862
+ });
20863
+ object({
20864
+ jobId: string(),
20865
+ taskId: string(),
20866
+ backups: array(object({
20867
+ name: string(),
20868
+ backupPath: string(),
20869
+ livePath: string()
20870
+ })),
20871
+ appliedAtMs: number(),
20872
+ bootAttempts: number(),
20873
+ schemaVersion: literal(1)
20874
+ });
20590
20875
  //#endregion
20591
20876
  //#region ../../node_modules/xtend/immutable.js
20592
20877
  var require_immutable = /* @__PURE__ */ __commonJSMin(((exports, module) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-mqtt-broker",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "MQTT broker registry addon for CamStack — manages external broker entries + an optional embedded aedes broker. Consumers spin up their own `mqtt.js` clients via the `mqtt-broker` cap.",
5
5
  "keywords": [
6
6
  "camstack",