@camstack/addon-export-ha-mqtt 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.
@@ -5033,6 +5033,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5033
5033
  */
5034
5034
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
5035
5035
  /**
5036
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
5037
+ * the detection-pipeline provider on every state change of its lazy
5038
+ * engine-provisioning machine (idle → installing → verifying → ready,
5039
+ * or → failed with a `nextRetryAt`). Payload is the
5040
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
5041
+ * node. The Pipeline page subscribes to drive a live "installing
5042
+ * OpenVINO… / ready" indicator per node without polling
5043
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
5044
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
5045
+ */
5046
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
5047
+ /**
5036
5048
  * Cluster topology snapshot. Carries the same payload returned by
5037
5049
  * `nodes.topology` (every reachable node + addons + processes).
5038
5050
  * Emitted by the hub on any agent / addon lifecycle change
@@ -5182,14 +5194,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5182
5194
  EventCategory["DeviceSleeping"] = "device.sleeping";
5183
5195
  EventCategory["RetentionCleanup"] = "retention.cleanup";
5184
5196
  /**
5185
- * Progress snapshot emitted by `BulkUpdateCoordinator` on every state
5186
- * transition (item status change, phase change, completion, cancel).
5187
- * Payload is `BulkUpdateState`. Admin UI subscribes via `useLiveEvent`
5188
- * to drive the sticky `BulkUpdateBanner` and per-row `AddonRowBadge`.
5189
- *
5190
- * Spec: docs/superpowers/specs/2026-05-21-addons-bulk-update-progress-design.md
5197
+ * Legacy bulk-update progress snapshot (payload `BulkUpdateState`). No longer
5198
+ * emitted F3 removed the coordinator that produced it; "Update all" now runs
5199
+ * as one lifecycle engine job (`AddonsJobProgress`/`AddonsJobLog`). Retained
5200
+ * (with `BulkUpdateState`) only to avoid regenerating the event maps; removed
5201
+ * in F4 once live bulk progress is re-implemented over the engine events.
5191
5202
  */
5192
5203
  EventCategory["AddonsBulkUpdateProgress"] = "addons.bulk-update-progress";
5204
+ EventCategory["AddonsJobProgress"] = "addons.job-progress";
5205
+ EventCategory["AddonsJobLog"] = "addons.job-log";
5193
5206
  /**
5194
5207
  * A container's child visibility toggled (hidden/shown). Emitted by the
5195
5208
  * `accessories` cap when a child device is hidden or revealed.
@@ -9196,6 +9209,24 @@ var DetectorOutputSchema = object({
9196
9209
  inferenceMs: number$1(),
9197
9210
  modelId: string()
9198
9211
  });
9212
+ var EngineProvisioningSchema = object({
9213
+ runtimeId: _enum([
9214
+ "onnx",
9215
+ "openvino",
9216
+ "coreml"
9217
+ ]).nullable(),
9218
+ device: string().nullable(),
9219
+ state: _enum([
9220
+ "idle",
9221
+ "installing",
9222
+ "verifying",
9223
+ "ready",
9224
+ "failed"
9225
+ ]),
9226
+ progress: number$1().optional(),
9227
+ error: string().optional(),
9228
+ nextRetryAt: number$1().optional()
9229
+ });
9199
9230
  var PipelineStepInputSchema = lazy(() => object({
9200
9231
  addonId: string(),
9201
9232
  modelId: string(),
@@ -9264,7 +9295,7 @@ var PipelineRunResultBridge = custom();
9264
9295
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
9265
9296
  kind: "mutation",
9266
9297
  auth: "admin"
9267
- }), method(_void(), record(string(), object({
9298
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
9268
9299
  modelId: string(),
9269
9300
  settings: record(string(), unknown()).readonly()
9270
9301
  }))), method(object({ steps: record(string(), object({
@@ -12876,7 +12907,10 @@ var AgentAddonConfigSchema = object({
12876
12907
  modelId: string(),
12877
12908
  settings: record(string(), unknown()).readonly()
12878
12909
  });
12879
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
12910
+ var AgentPipelineSettingsSchema = object({
12911
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
12912
+ maxCameras: number$1().int().nonnegative().nullable().default(null)
12913
+ });
12880
12914
  var CameraPipelineForAgentSchema = object({
12881
12915
  steps: array(PipelineStepInputSchema).readonly(),
12882
12916
  audio: object({
@@ -12978,6 +13012,133 @@ var GlobalMetricsSchema = object({
12978
13012
  * capability providers.
12979
13013
  */
12980
13014
  var CapabilityBindingsSchema = record(string(), string());
13015
+ /** Source block — always present; derives from the stream catalog. */
13016
+ var CameraSourceStatusSchema = object({ streams: array(object({
13017
+ camStreamId: string(),
13018
+ codec: string(),
13019
+ width: number$1(),
13020
+ height: number$1(),
13021
+ fps: number$1(),
13022
+ kind: string()
13023
+ })).readonly() });
13024
+ /** Assignment block — always present (orchestrator-local, no remote call). */
13025
+ var CameraAssignmentStatusSchema = object({
13026
+ detectionNodeId: string().nullable(),
13027
+ decoderNodeId: string().nullable(),
13028
+ audioNodeId: string().nullable(),
13029
+ pinned: object({
13030
+ detection: boolean(),
13031
+ decoder: boolean(),
13032
+ audio: boolean()
13033
+ }),
13034
+ reasons: object({
13035
+ detection: string().optional(),
13036
+ decoder: string().optional(),
13037
+ audio: string().optional()
13038
+ })
13039
+ });
13040
+ /** Broker block — null when the broker stage is unreachable or inactive. */
13041
+ var CameraBrokerStatusSchema = object({
13042
+ profiles: array(object({
13043
+ profile: string(),
13044
+ status: string(),
13045
+ codec: string(),
13046
+ width: number$1(),
13047
+ height: number$1(),
13048
+ subscribers: number$1(),
13049
+ inFps: number$1(),
13050
+ outFps: number$1()
13051
+ })).readonly(),
13052
+ webrtcSessions: number$1(),
13053
+ rtspRestream: boolean()
13054
+ });
13055
+ /** Shared-memory ring statistics within the decoder block. */
13056
+ var CameraDecoderShmSchema = object({
13057
+ framesWritten: number$1(),
13058
+ getFrameHits: number$1(),
13059
+ getFrameMisses: number$1(),
13060
+ budgetMb: number$1()
13061
+ });
13062
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
13063
+ var CameraDecoderStatusSchema = object({
13064
+ nodeId: string(),
13065
+ formats: array(string()).readonly(),
13066
+ sessionCount: number$1(),
13067
+ shm: CameraDecoderShmSchema
13068
+ });
13069
+ /** Motion block — null when motion detection is not active for this device. */
13070
+ var CameraMotionStatusSchema = object({
13071
+ enabled: boolean(),
13072
+ fps: number$1()
13073
+ });
13074
+ /** Detection provisioning sub-block. */
13075
+ var CameraDetectionProvisioningSchema = object({
13076
+ state: _enum([
13077
+ "idle",
13078
+ "installing",
13079
+ "verifying",
13080
+ "ready",
13081
+ "failed"
13082
+ ]),
13083
+ error: string().optional()
13084
+ });
13085
+ /** Detection phase — derived from the runner's engine phase. */
13086
+ var CameraDetectionPhaseSchema = _enum([
13087
+ "idle",
13088
+ "watching",
13089
+ "active"
13090
+ ]);
13091
+ /** Detection block — null when no detection node is assigned or reachable. */
13092
+ var CameraDetectionStatusSchema = object({
13093
+ nodeId: string(),
13094
+ engine: object({
13095
+ backend: string(),
13096
+ device: string()
13097
+ }),
13098
+ phase: CameraDetectionPhaseSchema,
13099
+ configuredFps: number$1(),
13100
+ actualFps: number$1(),
13101
+ queueDepth: number$1(),
13102
+ avgInferenceMs: number$1(),
13103
+ provisioning: CameraDetectionProvisioningSchema
13104
+ });
13105
+ /** Audio block — null when no audio node is assigned or reachable. */
13106
+ var CameraAudioStatusSchema = object({
13107
+ nodeId: string(),
13108
+ enabled: boolean()
13109
+ });
13110
+ /** Recording block — null when no recording cap is active for this device. */
13111
+ var CameraRecordingStatusSchema = object({
13112
+ mode: _enum([
13113
+ "off",
13114
+ "continuous",
13115
+ "events"
13116
+ ]),
13117
+ active: boolean(),
13118
+ storageBytes: number$1()
13119
+ });
13120
+ /**
13121
+ * Aggregated per-camera pipeline status — server-composed, single call.
13122
+ *
13123
+ * The `assignment` and `source` blocks are always present.
13124
+ * Every other block is `null` when the stage is inactive or unreachable
13125
+ * during the bounded parallel fan-out in the orchestrator implementation.
13126
+ *
13127
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
13128
+ */
13129
+ var CameraStatusSchema = object({
13130
+ deviceId: number$1(),
13131
+ assignment: CameraAssignmentStatusSchema,
13132
+ source: CameraSourceStatusSchema,
13133
+ broker: CameraBrokerStatusSchema.nullable(),
13134
+ decoder: CameraDecoderStatusSchema.nullable(),
13135
+ motion: CameraMotionStatusSchema.nullable(),
13136
+ detection: CameraDetectionStatusSchema.nullable(),
13137
+ audio: CameraAudioStatusSchema.nullable(),
13138
+ recording: CameraRecordingStatusSchema.nullable(),
13139
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
13140
+ fetchedAt: number$1()
13141
+ });
12981
13142
  method(object({
12982
13143
  deviceId: number$1(),
12983
13144
  agentNodeId: string()
@@ -13045,6 +13206,12 @@ method(object({
13045
13206
  }), {
13046
13207
  kind: "mutation",
13047
13208
  auth: "admin"
13209
+ }), method(object({
13210
+ agentNodeId: string(),
13211
+ maxCameras: number$1().int().nonnegative().nullable()
13212
+ }), object({ success: literal(true) }), {
13213
+ kind: "mutation",
13214
+ auth: "admin"
13048
13215
  }), method(object({ deviceId: number$1() }), CameraPipelineSettingsSchema.nullable()), method(object({
13049
13216
  deviceId: number$1(),
13050
13217
  addonId: string(),
@@ -13070,7 +13237,7 @@ method(object({
13070
13237
  }), method(object({
13071
13238
  deviceId: number$1(),
13072
13239
  agentNodeId: string().optional()
13073
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13240
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number$1() }), CameraStatusSchema), method(object({ deviceIds: array(number$1()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13074
13241
  name: string(),
13075
13242
  description: string().optional(),
13076
13243
  config: CameraPipelineConfigSchema
@@ -16034,6 +16201,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
16034
16201
  kind: "mutation",
16035
16202
  auth: "admin"
16036
16203
  });
16204
+ var jobKindSchema = _enum([
16205
+ "install",
16206
+ "update",
16207
+ "uninstall",
16208
+ "restart"
16209
+ ]);
16210
+ var taskPhaseSchema = _enum([
16211
+ "queued",
16212
+ "fetching",
16213
+ "staged",
16214
+ "validating",
16215
+ "applying",
16216
+ "restarting",
16217
+ "applied",
16218
+ "done",
16219
+ "failed",
16220
+ "skipped"
16221
+ ]);
16222
+ var taskTargetSchema = _enum(["framework", "addon"]);
16223
+ var taskLogEntrySchema = object({
16224
+ tsMs: number$1(),
16225
+ nodeId: string(),
16226
+ packageName: string(),
16227
+ phase: taskPhaseSchema,
16228
+ message: string()
16229
+ });
16230
+ var lifecycleTaskSchema = object({
16231
+ taskId: string(),
16232
+ nodeId: string(),
16233
+ packageName: string(),
16234
+ fromVersion: string().nullable(),
16235
+ toVersion: string(),
16236
+ target: taskTargetSchema,
16237
+ phase: taskPhaseSchema,
16238
+ stagedPath: string().nullable(),
16239
+ attempts: number$1(),
16240
+ steps: array(taskLogEntrySchema),
16241
+ error: string().nullable(),
16242
+ startedAtMs: number$1().nullable(),
16243
+ finishedAtMs: number$1().nullable()
16244
+ });
16245
+ var lifecycleJobStateSchema = _enum([
16246
+ "running",
16247
+ "completed",
16248
+ "failed",
16249
+ "partially-failed",
16250
+ "cancelled"
16251
+ ]);
16252
+ var lifecycleJobScopeSchema = _enum([
16253
+ "single",
16254
+ "bulk",
16255
+ "cluster"
16256
+ ]);
16257
+ var lifecycleJobSchema = object({
16258
+ jobId: string(),
16259
+ kind: jobKindSchema,
16260
+ createdAtMs: number$1(),
16261
+ createdBy: string(),
16262
+ scope: lifecycleJobScopeSchema,
16263
+ tasks: array(lifecycleTaskSchema),
16264
+ state: lifecycleJobStateSchema,
16265
+ schemaVersion: literal(1)
16266
+ });
16037
16267
  /**
16038
16268
  * addons — system-scoped singleton capability for addon package
16039
16269
  * management (install, update, configure, restart) and per-addon log
@@ -16216,7 +16446,7 @@ var BulkUpdatePhaseSchema = _enum([
16216
16446
  "restarting",
16217
16447
  "finalizing"
16218
16448
  ]);
16219
- var BulkUpdateStateSchema = object({
16449
+ object({
16220
16450
  id: string(),
16221
16451
  nodeId: string(),
16222
16452
  startedAtMs: number$1(),
@@ -16319,20 +16549,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16319
16549
  }), UpdateFrameworkPackageResultSchema, {
16320
16550
  kind: "mutation",
16321
16551
  auth: "admin"
16322
- }), method(object({
16323
- nodeId: string(),
16324
- items: array(object({
16325
- name: string(),
16326
- version: string(),
16327
- isSystem: boolean()
16328
- })).readonly()
16329
- }), object({ id: string() }), {
16330
- kind: "mutation",
16331
- auth: "admin"
16332
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
16333
- kind: "mutation",
16334
- auth: "admin"
16335
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16552
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16336
16553
  kind: "mutation",
16337
16554
  auth: "admin"
16338
16555
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -16354,6 +16571,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16354
16571
  kind: "mutation",
16355
16572
  auth: "admin"
16356
16573
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
16574
+ kind: _enum([
16575
+ "install",
16576
+ "update",
16577
+ "uninstall",
16578
+ "restart"
16579
+ ]),
16580
+ targets: array(object({
16581
+ name: string().min(1),
16582
+ version: string().min(1)
16583
+ })).min(1),
16584
+ nodeIds: array(string()).optional()
16585
+ }), object({ jobId: string() }), {
16586
+ kind: "mutation",
16587
+ auth: "admin"
16588
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
16589
+ kind: "mutation",
16590
+ auth: "admin"
16591
+ }), method(object({
16357
16592
  addonId: string(),
16358
16593
  level: LogLevelSchema$1.optional()
16359
16594
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -16394,7 +16629,7 @@ Object.freeze({
16394
16629
  addonId: null,
16395
16630
  access: "create"
16396
16631
  },
16397
- "addons.cancelBulkUpdate": {
16632
+ "addons.cancelJob": {
16398
16633
  capName: "addons",
16399
16634
  capScope: "system",
16400
16635
  addonId: null,
@@ -16424,7 +16659,7 @@ Object.freeze({
16424
16659
  addonId: null,
16425
16660
  access: "view"
16426
16661
  },
16427
- "addons.getBulkUpdateState": {
16662
+ "addons.getJob": {
16428
16663
  capName: "addons",
16429
16664
  capScope: "system",
16430
16665
  addonId: null,
@@ -16472,19 +16707,19 @@ Object.freeze({
16472
16707
  addonId: null,
16473
16708
  access: "view"
16474
16709
  },
16475
- "addons.listActiveBulkUpdates": {
16710
+ "addons.listCapabilityProviders": {
16476
16711
  capName: "addons",
16477
16712
  capScope: "system",
16478
16713
  addonId: null,
16479
16714
  access: "view"
16480
16715
  },
16481
- "addons.listCapabilityProviders": {
16716
+ "addons.listFrameworkPackages": {
16482
16717
  capName: "addons",
16483
16718
  capScope: "system",
16484
16719
  addonId: null,
16485
16720
  access: "view"
16486
16721
  },
16487
- "addons.listFrameworkPackages": {
16722
+ "addons.listJobs": {
16488
16723
  capName: "addons",
16489
16724
  capScope: "system",
16490
16725
  addonId: null,
@@ -16568,7 +16803,7 @@ Object.freeze({
16568
16803
  addonId: null,
16569
16804
  access: "create"
16570
16805
  },
16571
- "addons.startBulkUpdate": {
16806
+ "addons.startJob": {
16572
16807
  capName: "addons",
16573
16808
  capScope: "system",
16574
16809
  addonId: null,
@@ -18794,6 +19029,12 @@ Object.freeze({
18794
19029
  addonId: null,
18795
19030
  access: "view"
18796
19031
  },
19032
+ "pipelineExecutor.getEngineProvisioning": {
19033
+ capName: "pipeline-executor",
19034
+ capScope: "system",
19035
+ addonId: null,
19036
+ access: "view"
19037
+ },
18797
19038
  "pipelineExecutor.getGlobalPipelineConfig": {
18798
19039
  capName: "pipeline-executor",
18799
19040
  capScope: "system",
@@ -18998,6 +19239,18 @@ Object.freeze({
18998
19239
  addonId: null,
18999
19240
  access: "view"
19000
19241
  },
19242
+ "pipelineOrchestrator.getCameraStatus": {
19243
+ capName: "pipeline-orchestrator",
19244
+ capScope: "system",
19245
+ addonId: null,
19246
+ access: "view"
19247
+ },
19248
+ "pipelineOrchestrator.getCameraStatuses": {
19249
+ capName: "pipeline-orchestrator",
19250
+ capScope: "system",
19251
+ addonId: null,
19252
+ access: "view"
19253
+ },
19001
19254
  "pipelineOrchestrator.getCameraStepOverrides": {
19002
19255
  capName: "pipeline-orchestrator",
19003
19256
  capScope: "system",
@@ -19082,6 +19335,12 @@ Object.freeze({
19082
19335
  addonId: null,
19083
19336
  access: "create"
19084
19337
  },
19338
+ "pipelineOrchestrator.setAgentMaxCameras": {
19339
+ capName: "pipeline-orchestrator",
19340
+ capScope: "system",
19341
+ addonId: null,
19342
+ access: "create"
19343
+ },
19085
19344
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19086
19345
  capName: "pipeline-orchestrator",
19087
19346
  capScope: "system",
@@ -20555,6 +20814,32 @@ Object.freeze({
20555
20814
  "network-access": "ingress",
20556
20815
  "smtp-provider": "email"
20557
20816
  });
20817
+ var frameworkSwapPackageSchema = object({
20818
+ name: string(),
20819
+ stagedPath: string(),
20820
+ backupPath: string(),
20821
+ toVersion: string(),
20822
+ fromVersion: string().nullable()
20823
+ });
20824
+ object({
20825
+ jobId: string(),
20826
+ taskId: string(),
20827
+ packages: array(frameworkSwapPackageSchema),
20828
+ requestedAtMs: number$1(),
20829
+ schemaVersion: literal(1)
20830
+ });
20831
+ object({
20832
+ jobId: string(),
20833
+ taskId: string(),
20834
+ backups: array(object({
20835
+ name: string(),
20836
+ backupPath: string(),
20837
+ livePath: string()
20838
+ })),
20839
+ appliedAtMs: number$1(),
20840
+ bootAttempts: number$1(),
20841
+ schemaVersion: literal(1)
20842
+ });
20558
20843
  //#endregion
20559
20844
  //#region ../../node_modules/readable-stream/lib/ours/primordials.js
20560
20845
  var require_primordials = /* @__PURE__ */ __commonJSMin(((exports, module) => {
@@ -5031,6 +5031,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5031
5031
  */
5032
5032
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
5033
5033
  /**
5034
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
5035
+ * the detection-pipeline provider on every state change of its lazy
5036
+ * engine-provisioning machine (idle → installing → verifying → ready,
5037
+ * or → failed with a `nextRetryAt`). Payload is the
5038
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
5039
+ * node. The Pipeline page subscribes to drive a live "installing
5040
+ * OpenVINO… / ready" indicator per node without polling
5041
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
5042
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
5043
+ */
5044
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
5045
+ /**
5034
5046
  * Cluster topology snapshot. Carries the same payload returned by
5035
5047
  * `nodes.topology` (every reachable node + addons + processes).
5036
5048
  * Emitted by the hub on any agent / addon lifecycle change
@@ -5180,14 +5192,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5180
5192
  EventCategory["DeviceSleeping"] = "device.sleeping";
5181
5193
  EventCategory["RetentionCleanup"] = "retention.cleanup";
5182
5194
  /**
5183
- * Progress snapshot emitted by `BulkUpdateCoordinator` on every state
5184
- * transition (item status change, phase change, completion, cancel).
5185
- * Payload is `BulkUpdateState`. Admin UI subscribes via `useLiveEvent`
5186
- * to drive the sticky `BulkUpdateBanner` and per-row `AddonRowBadge`.
5187
- *
5188
- * Spec: docs/superpowers/specs/2026-05-21-addons-bulk-update-progress-design.md
5195
+ * Legacy bulk-update progress snapshot (payload `BulkUpdateState`). No longer
5196
+ * emitted F3 removed the coordinator that produced it; "Update all" now runs
5197
+ * as one lifecycle engine job (`AddonsJobProgress`/`AddonsJobLog`). Retained
5198
+ * (with `BulkUpdateState`) only to avoid regenerating the event maps; removed
5199
+ * in F4 once live bulk progress is re-implemented over the engine events.
5189
5200
  */
5190
5201
  EventCategory["AddonsBulkUpdateProgress"] = "addons.bulk-update-progress";
5202
+ EventCategory["AddonsJobProgress"] = "addons.job-progress";
5203
+ EventCategory["AddonsJobLog"] = "addons.job-log";
5191
5204
  /**
5192
5205
  * A container's child visibility toggled (hidden/shown). Emitted by the
5193
5206
  * `accessories` cap when a child device is hidden or revealed.
@@ -9194,6 +9207,24 @@ var DetectorOutputSchema = object({
9194
9207
  inferenceMs: number$1(),
9195
9208
  modelId: string()
9196
9209
  });
9210
+ var EngineProvisioningSchema = object({
9211
+ runtimeId: _enum([
9212
+ "onnx",
9213
+ "openvino",
9214
+ "coreml"
9215
+ ]).nullable(),
9216
+ device: string().nullable(),
9217
+ state: _enum([
9218
+ "idle",
9219
+ "installing",
9220
+ "verifying",
9221
+ "ready",
9222
+ "failed"
9223
+ ]),
9224
+ progress: number$1().optional(),
9225
+ error: string().optional(),
9226
+ nextRetryAt: number$1().optional()
9227
+ });
9197
9228
  var PipelineStepInputSchema = lazy(() => object({
9198
9229
  addonId: string(),
9199
9230
  modelId: string(),
@@ -9262,7 +9293,7 @@ var PipelineRunResultBridge = custom();
9262
9293
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
9263
9294
  kind: "mutation",
9264
9295
  auth: "admin"
9265
- }), method(_void(), record(string(), object({
9296
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
9266
9297
  modelId: string(),
9267
9298
  settings: record(string(), unknown()).readonly()
9268
9299
  }))), method(object({ steps: record(string(), object({
@@ -12874,7 +12905,10 @@ var AgentAddonConfigSchema = object({
12874
12905
  modelId: string(),
12875
12906
  settings: record(string(), unknown()).readonly()
12876
12907
  });
12877
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
12908
+ var AgentPipelineSettingsSchema = object({
12909
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
12910
+ maxCameras: number$1().int().nonnegative().nullable().default(null)
12911
+ });
12878
12912
  var CameraPipelineForAgentSchema = object({
12879
12913
  steps: array(PipelineStepInputSchema).readonly(),
12880
12914
  audio: object({
@@ -12976,6 +13010,133 @@ var GlobalMetricsSchema = object({
12976
13010
  * capability providers.
12977
13011
  */
12978
13012
  var CapabilityBindingsSchema = record(string(), string());
13013
+ /** Source block — always present; derives from the stream catalog. */
13014
+ var CameraSourceStatusSchema = object({ streams: array(object({
13015
+ camStreamId: string(),
13016
+ codec: string(),
13017
+ width: number$1(),
13018
+ height: number$1(),
13019
+ fps: number$1(),
13020
+ kind: string()
13021
+ })).readonly() });
13022
+ /** Assignment block — always present (orchestrator-local, no remote call). */
13023
+ var CameraAssignmentStatusSchema = object({
13024
+ detectionNodeId: string().nullable(),
13025
+ decoderNodeId: string().nullable(),
13026
+ audioNodeId: string().nullable(),
13027
+ pinned: object({
13028
+ detection: boolean(),
13029
+ decoder: boolean(),
13030
+ audio: boolean()
13031
+ }),
13032
+ reasons: object({
13033
+ detection: string().optional(),
13034
+ decoder: string().optional(),
13035
+ audio: string().optional()
13036
+ })
13037
+ });
13038
+ /** Broker block — null when the broker stage is unreachable or inactive. */
13039
+ var CameraBrokerStatusSchema = object({
13040
+ profiles: array(object({
13041
+ profile: string(),
13042
+ status: string(),
13043
+ codec: string(),
13044
+ width: number$1(),
13045
+ height: number$1(),
13046
+ subscribers: number$1(),
13047
+ inFps: number$1(),
13048
+ outFps: number$1()
13049
+ })).readonly(),
13050
+ webrtcSessions: number$1(),
13051
+ rtspRestream: boolean()
13052
+ });
13053
+ /** Shared-memory ring statistics within the decoder block. */
13054
+ var CameraDecoderShmSchema = object({
13055
+ framesWritten: number$1(),
13056
+ getFrameHits: number$1(),
13057
+ getFrameMisses: number$1(),
13058
+ budgetMb: number$1()
13059
+ });
13060
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
13061
+ var CameraDecoderStatusSchema = object({
13062
+ nodeId: string(),
13063
+ formats: array(string()).readonly(),
13064
+ sessionCount: number$1(),
13065
+ shm: CameraDecoderShmSchema
13066
+ });
13067
+ /** Motion block — null when motion detection is not active for this device. */
13068
+ var CameraMotionStatusSchema = object({
13069
+ enabled: boolean(),
13070
+ fps: number$1()
13071
+ });
13072
+ /** Detection provisioning sub-block. */
13073
+ var CameraDetectionProvisioningSchema = object({
13074
+ state: _enum([
13075
+ "idle",
13076
+ "installing",
13077
+ "verifying",
13078
+ "ready",
13079
+ "failed"
13080
+ ]),
13081
+ error: string().optional()
13082
+ });
13083
+ /** Detection phase — derived from the runner's engine phase. */
13084
+ var CameraDetectionPhaseSchema = _enum([
13085
+ "idle",
13086
+ "watching",
13087
+ "active"
13088
+ ]);
13089
+ /** Detection block — null when no detection node is assigned or reachable. */
13090
+ var CameraDetectionStatusSchema = object({
13091
+ nodeId: string(),
13092
+ engine: object({
13093
+ backend: string(),
13094
+ device: string()
13095
+ }),
13096
+ phase: CameraDetectionPhaseSchema,
13097
+ configuredFps: number$1(),
13098
+ actualFps: number$1(),
13099
+ queueDepth: number$1(),
13100
+ avgInferenceMs: number$1(),
13101
+ provisioning: CameraDetectionProvisioningSchema
13102
+ });
13103
+ /** Audio block — null when no audio node is assigned or reachable. */
13104
+ var CameraAudioStatusSchema = object({
13105
+ nodeId: string(),
13106
+ enabled: boolean()
13107
+ });
13108
+ /** Recording block — null when no recording cap is active for this device. */
13109
+ var CameraRecordingStatusSchema = object({
13110
+ mode: _enum([
13111
+ "off",
13112
+ "continuous",
13113
+ "events"
13114
+ ]),
13115
+ active: boolean(),
13116
+ storageBytes: number$1()
13117
+ });
13118
+ /**
13119
+ * Aggregated per-camera pipeline status — server-composed, single call.
13120
+ *
13121
+ * The `assignment` and `source` blocks are always present.
13122
+ * Every other block is `null` when the stage is inactive or unreachable
13123
+ * during the bounded parallel fan-out in the orchestrator implementation.
13124
+ *
13125
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
13126
+ */
13127
+ var CameraStatusSchema = object({
13128
+ deviceId: number$1(),
13129
+ assignment: CameraAssignmentStatusSchema,
13130
+ source: CameraSourceStatusSchema,
13131
+ broker: CameraBrokerStatusSchema.nullable(),
13132
+ decoder: CameraDecoderStatusSchema.nullable(),
13133
+ motion: CameraMotionStatusSchema.nullable(),
13134
+ detection: CameraDetectionStatusSchema.nullable(),
13135
+ audio: CameraAudioStatusSchema.nullable(),
13136
+ recording: CameraRecordingStatusSchema.nullable(),
13137
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
13138
+ fetchedAt: number$1()
13139
+ });
12979
13140
  method(object({
12980
13141
  deviceId: number$1(),
12981
13142
  agentNodeId: string()
@@ -13043,6 +13204,12 @@ method(object({
13043
13204
  }), {
13044
13205
  kind: "mutation",
13045
13206
  auth: "admin"
13207
+ }), method(object({
13208
+ agentNodeId: string(),
13209
+ maxCameras: number$1().int().nonnegative().nullable()
13210
+ }), object({ success: literal(true) }), {
13211
+ kind: "mutation",
13212
+ auth: "admin"
13046
13213
  }), method(object({ deviceId: number$1() }), CameraPipelineSettingsSchema.nullable()), method(object({
13047
13214
  deviceId: number$1(),
13048
13215
  addonId: string(),
@@ -13068,7 +13235,7 @@ method(object({
13068
13235
  }), method(object({
13069
13236
  deviceId: number$1(),
13070
13237
  agentNodeId: string().optional()
13071
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13238
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number$1() }), CameraStatusSchema), method(object({ deviceIds: array(number$1()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13072
13239
  name: string(),
13073
13240
  description: string().optional(),
13074
13241
  config: CameraPipelineConfigSchema
@@ -16032,6 +16199,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
16032
16199
  kind: "mutation",
16033
16200
  auth: "admin"
16034
16201
  });
16202
+ var jobKindSchema = _enum([
16203
+ "install",
16204
+ "update",
16205
+ "uninstall",
16206
+ "restart"
16207
+ ]);
16208
+ var taskPhaseSchema = _enum([
16209
+ "queued",
16210
+ "fetching",
16211
+ "staged",
16212
+ "validating",
16213
+ "applying",
16214
+ "restarting",
16215
+ "applied",
16216
+ "done",
16217
+ "failed",
16218
+ "skipped"
16219
+ ]);
16220
+ var taskTargetSchema = _enum(["framework", "addon"]);
16221
+ var taskLogEntrySchema = object({
16222
+ tsMs: number$1(),
16223
+ nodeId: string(),
16224
+ packageName: string(),
16225
+ phase: taskPhaseSchema,
16226
+ message: string()
16227
+ });
16228
+ var lifecycleTaskSchema = object({
16229
+ taskId: string(),
16230
+ nodeId: string(),
16231
+ packageName: string(),
16232
+ fromVersion: string().nullable(),
16233
+ toVersion: string(),
16234
+ target: taskTargetSchema,
16235
+ phase: taskPhaseSchema,
16236
+ stagedPath: string().nullable(),
16237
+ attempts: number$1(),
16238
+ steps: array(taskLogEntrySchema),
16239
+ error: string().nullable(),
16240
+ startedAtMs: number$1().nullable(),
16241
+ finishedAtMs: number$1().nullable()
16242
+ });
16243
+ var lifecycleJobStateSchema = _enum([
16244
+ "running",
16245
+ "completed",
16246
+ "failed",
16247
+ "partially-failed",
16248
+ "cancelled"
16249
+ ]);
16250
+ var lifecycleJobScopeSchema = _enum([
16251
+ "single",
16252
+ "bulk",
16253
+ "cluster"
16254
+ ]);
16255
+ var lifecycleJobSchema = object({
16256
+ jobId: string(),
16257
+ kind: jobKindSchema,
16258
+ createdAtMs: number$1(),
16259
+ createdBy: string(),
16260
+ scope: lifecycleJobScopeSchema,
16261
+ tasks: array(lifecycleTaskSchema),
16262
+ state: lifecycleJobStateSchema,
16263
+ schemaVersion: literal(1)
16264
+ });
16035
16265
  /**
16036
16266
  * addons — system-scoped singleton capability for addon package
16037
16267
  * management (install, update, configure, restart) and per-addon log
@@ -16214,7 +16444,7 @@ var BulkUpdatePhaseSchema = _enum([
16214
16444
  "restarting",
16215
16445
  "finalizing"
16216
16446
  ]);
16217
- var BulkUpdateStateSchema = object({
16447
+ object({
16218
16448
  id: string(),
16219
16449
  nodeId: string(),
16220
16450
  startedAtMs: number$1(),
@@ -16317,20 +16547,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16317
16547
  }), UpdateFrameworkPackageResultSchema, {
16318
16548
  kind: "mutation",
16319
16549
  auth: "admin"
16320
- }), method(object({
16321
- nodeId: string(),
16322
- items: array(object({
16323
- name: string(),
16324
- version: string(),
16325
- isSystem: boolean()
16326
- })).readonly()
16327
- }), object({ id: string() }), {
16328
- kind: "mutation",
16329
- auth: "admin"
16330
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
16331
- kind: "mutation",
16332
- auth: "admin"
16333
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16550
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16334
16551
  kind: "mutation",
16335
16552
  auth: "admin"
16336
16553
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -16352,6 +16569,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16352
16569
  kind: "mutation",
16353
16570
  auth: "admin"
16354
16571
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
16572
+ kind: _enum([
16573
+ "install",
16574
+ "update",
16575
+ "uninstall",
16576
+ "restart"
16577
+ ]),
16578
+ targets: array(object({
16579
+ name: string().min(1),
16580
+ version: string().min(1)
16581
+ })).min(1),
16582
+ nodeIds: array(string()).optional()
16583
+ }), object({ jobId: string() }), {
16584
+ kind: "mutation",
16585
+ auth: "admin"
16586
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
16587
+ kind: "mutation",
16588
+ auth: "admin"
16589
+ }), method(object({
16355
16590
  addonId: string(),
16356
16591
  level: LogLevelSchema$1.optional()
16357
16592
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -16392,7 +16627,7 @@ Object.freeze({
16392
16627
  addonId: null,
16393
16628
  access: "create"
16394
16629
  },
16395
- "addons.cancelBulkUpdate": {
16630
+ "addons.cancelJob": {
16396
16631
  capName: "addons",
16397
16632
  capScope: "system",
16398
16633
  addonId: null,
@@ -16422,7 +16657,7 @@ Object.freeze({
16422
16657
  addonId: null,
16423
16658
  access: "view"
16424
16659
  },
16425
- "addons.getBulkUpdateState": {
16660
+ "addons.getJob": {
16426
16661
  capName: "addons",
16427
16662
  capScope: "system",
16428
16663
  addonId: null,
@@ -16470,19 +16705,19 @@ Object.freeze({
16470
16705
  addonId: null,
16471
16706
  access: "view"
16472
16707
  },
16473
- "addons.listActiveBulkUpdates": {
16708
+ "addons.listCapabilityProviders": {
16474
16709
  capName: "addons",
16475
16710
  capScope: "system",
16476
16711
  addonId: null,
16477
16712
  access: "view"
16478
16713
  },
16479
- "addons.listCapabilityProviders": {
16714
+ "addons.listFrameworkPackages": {
16480
16715
  capName: "addons",
16481
16716
  capScope: "system",
16482
16717
  addonId: null,
16483
16718
  access: "view"
16484
16719
  },
16485
- "addons.listFrameworkPackages": {
16720
+ "addons.listJobs": {
16486
16721
  capName: "addons",
16487
16722
  capScope: "system",
16488
16723
  addonId: null,
@@ -16566,7 +16801,7 @@ Object.freeze({
16566
16801
  addonId: null,
16567
16802
  access: "create"
16568
16803
  },
16569
- "addons.startBulkUpdate": {
16804
+ "addons.startJob": {
16570
16805
  capName: "addons",
16571
16806
  capScope: "system",
16572
16807
  addonId: null,
@@ -18792,6 +19027,12 @@ Object.freeze({
18792
19027
  addonId: null,
18793
19028
  access: "view"
18794
19029
  },
19030
+ "pipelineExecutor.getEngineProvisioning": {
19031
+ capName: "pipeline-executor",
19032
+ capScope: "system",
19033
+ addonId: null,
19034
+ access: "view"
19035
+ },
18795
19036
  "pipelineExecutor.getGlobalPipelineConfig": {
18796
19037
  capName: "pipeline-executor",
18797
19038
  capScope: "system",
@@ -18996,6 +19237,18 @@ Object.freeze({
18996
19237
  addonId: null,
18997
19238
  access: "view"
18998
19239
  },
19240
+ "pipelineOrchestrator.getCameraStatus": {
19241
+ capName: "pipeline-orchestrator",
19242
+ capScope: "system",
19243
+ addonId: null,
19244
+ access: "view"
19245
+ },
19246
+ "pipelineOrchestrator.getCameraStatuses": {
19247
+ capName: "pipeline-orchestrator",
19248
+ capScope: "system",
19249
+ addonId: null,
19250
+ access: "view"
19251
+ },
18999
19252
  "pipelineOrchestrator.getCameraStepOverrides": {
19000
19253
  capName: "pipeline-orchestrator",
19001
19254
  capScope: "system",
@@ -19080,6 +19333,12 @@ Object.freeze({
19080
19333
  addonId: null,
19081
19334
  access: "create"
19082
19335
  },
19336
+ "pipelineOrchestrator.setAgentMaxCameras": {
19337
+ capName: "pipeline-orchestrator",
19338
+ capScope: "system",
19339
+ addonId: null,
19340
+ access: "create"
19341
+ },
19083
19342
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19084
19343
  capName: "pipeline-orchestrator",
19085
19344
  capScope: "system",
@@ -20553,6 +20812,32 @@ Object.freeze({
20553
20812
  "network-access": "ingress",
20554
20813
  "smtp-provider": "email"
20555
20814
  });
20815
+ var frameworkSwapPackageSchema = object({
20816
+ name: string(),
20817
+ stagedPath: string(),
20818
+ backupPath: string(),
20819
+ toVersion: string(),
20820
+ fromVersion: string().nullable()
20821
+ });
20822
+ object({
20823
+ jobId: string(),
20824
+ taskId: string(),
20825
+ packages: array(frameworkSwapPackageSchema),
20826
+ requestedAtMs: number$1(),
20827
+ schemaVersion: literal(1)
20828
+ });
20829
+ object({
20830
+ jobId: string(),
20831
+ taskId: string(),
20832
+ backups: array(object({
20833
+ name: string(),
20834
+ backupPath: string(),
20835
+ livePath: string()
20836
+ })),
20837
+ appliedAtMs: number$1(),
20838
+ bootAttempts: number$1(),
20839
+ schemaVersion: literal(1)
20840
+ });
20556
20841
  //#endregion
20557
20842
  //#region ../../node_modules/readable-stream/lib/ours/primordials.js
20558
20843
  var require_primordials = /* @__PURE__ */ __commonJSMin(((exports, module) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-ha-mqtt",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "HomeAssistant MQTT discovery exporter for CamStack devices. Publishes discovery topics so HA auto-creates entities for exposed cameras/switches/intercoms/sensors.",
5
5
  "keywords": [
6
6
  "camstack",