@camstack/addon-advanced-notifier 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.
Files changed (3) hide show
  1. package/dist/addon.js +315 -30
  2. package/dist/addon.mjs +315 -30
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -4986,6 +4986,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
4986
4986
  */
4987
4987
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
4988
4988
  /**
4989
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
4990
+ * the detection-pipeline provider on every state change of its lazy
4991
+ * engine-provisioning machine (idle → installing → verifying → ready,
4992
+ * or → failed with a `nextRetryAt`). Payload is the
4993
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
4994
+ * node. The Pipeline page subscribes to drive a live "installing
4995
+ * OpenVINO… / ready" indicator per node without polling
4996
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
4997
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
4998
+ */
4999
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
5000
+ /**
4989
5001
  * Cluster topology snapshot. Carries the same payload returned by
4990
5002
  * `nodes.topology` (every reachable node + addons + processes).
4991
5003
  * Emitted by the hub on any agent / addon lifecycle change
@@ -5135,14 +5147,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5135
5147
  EventCategory["DeviceSleeping"] = "device.sleeping";
5136
5148
  EventCategory["RetentionCleanup"] = "retention.cleanup";
5137
5149
  /**
5138
- * Progress snapshot emitted by `BulkUpdateCoordinator` on every state
5139
- * transition (item status change, phase change, completion, cancel).
5140
- * Payload is `BulkUpdateState`. Admin UI subscribes via `useLiveEvent`
5141
- * to drive the sticky `BulkUpdateBanner` and per-row `AddonRowBadge`.
5142
- *
5143
- * Spec: docs/superpowers/specs/2026-05-21-addons-bulk-update-progress-design.md
5150
+ * Legacy bulk-update progress snapshot (payload `BulkUpdateState`). No longer
5151
+ * emitted F3 removed the coordinator that produced it; "Update all" now runs
5152
+ * as one lifecycle engine job (`AddonsJobProgress`/`AddonsJobLog`). Retained
5153
+ * (with `BulkUpdateState`) only to avoid regenerating the event maps; removed
5154
+ * in F4 once live bulk progress is re-implemented over the engine events.
5144
5155
  */
5145
5156
  EventCategory["AddonsBulkUpdateProgress"] = "addons.bulk-update-progress";
5157
+ EventCategory["AddonsJobProgress"] = "addons.job-progress";
5158
+ EventCategory["AddonsJobLog"] = "addons.job-log";
5146
5159
  /**
5147
5160
  * A container's child visibility toggled (hidden/shown). Emitted by the
5148
5161
  * `accessories` cap when a child device is hidden or revealed.
@@ -9149,6 +9162,24 @@ var DetectorOutputSchema = object({
9149
9162
  inferenceMs: number(),
9150
9163
  modelId: string()
9151
9164
  });
9165
+ var EngineProvisioningSchema = object({
9166
+ runtimeId: _enum([
9167
+ "onnx",
9168
+ "openvino",
9169
+ "coreml"
9170
+ ]).nullable(),
9171
+ device: string().nullable(),
9172
+ state: _enum([
9173
+ "idle",
9174
+ "installing",
9175
+ "verifying",
9176
+ "ready",
9177
+ "failed"
9178
+ ]),
9179
+ progress: number().optional(),
9180
+ error: string().optional(),
9181
+ nextRetryAt: number().optional()
9182
+ });
9152
9183
  var PipelineStepInputSchema = lazy(() => object({
9153
9184
  addonId: string(),
9154
9185
  modelId: string(),
@@ -9217,7 +9248,7 @@ var PipelineRunResultBridge = custom();
9217
9248
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
9218
9249
  kind: "mutation",
9219
9250
  auth: "admin"
9220
- }), method(_void(), record(string(), object({
9251
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
9221
9252
  modelId: string(),
9222
9253
  settings: record(string(), unknown()).readonly()
9223
9254
  }))), method(object({ steps: record(string(), object({
@@ -12804,7 +12835,10 @@ var AgentAddonConfigSchema = object({
12804
12835
  modelId: string(),
12805
12836
  settings: record(string(), unknown()).readonly()
12806
12837
  });
12807
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
12838
+ var AgentPipelineSettingsSchema = object({
12839
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
12840
+ maxCameras: number().int().nonnegative().nullable().default(null)
12841
+ });
12808
12842
  var CameraPipelineForAgentSchema = object({
12809
12843
  steps: array(PipelineStepInputSchema).readonly(),
12810
12844
  audio: object({
@@ -12906,6 +12940,133 @@ var GlobalMetricsSchema = object({
12906
12940
  * capability providers.
12907
12941
  */
12908
12942
  var CapabilityBindingsSchema = record(string(), string());
12943
+ /** Source block — always present; derives from the stream catalog. */
12944
+ var CameraSourceStatusSchema = object({ streams: array(object({
12945
+ camStreamId: string(),
12946
+ codec: string(),
12947
+ width: number(),
12948
+ height: number(),
12949
+ fps: number(),
12950
+ kind: string()
12951
+ })).readonly() });
12952
+ /** Assignment block — always present (orchestrator-local, no remote call). */
12953
+ var CameraAssignmentStatusSchema = object({
12954
+ detectionNodeId: string().nullable(),
12955
+ decoderNodeId: string().nullable(),
12956
+ audioNodeId: string().nullable(),
12957
+ pinned: object({
12958
+ detection: boolean(),
12959
+ decoder: boolean(),
12960
+ audio: boolean()
12961
+ }),
12962
+ reasons: object({
12963
+ detection: string().optional(),
12964
+ decoder: string().optional(),
12965
+ audio: string().optional()
12966
+ })
12967
+ });
12968
+ /** Broker block — null when the broker stage is unreachable or inactive. */
12969
+ var CameraBrokerStatusSchema = object({
12970
+ profiles: array(object({
12971
+ profile: string(),
12972
+ status: string(),
12973
+ codec: string(),
12974
+ width: number(),
12975
+ height: number(),
12976
+ subscribers: number(),
12977
+ inFps: number(),
12978
+ outFps: number()
12979
+ })).readonly(),
12980
+ webrtcSessions: number(),
12981
+ rtspRestream: boolean()
12982
+ });
12983
+ /** Shared-memory ring statistics within the decoder block. */
12984
+ var CameraDecoderShmSchema = object({
12985
+ framesWritten: number(),
12986
+ getFrameHits: number(),
12987
+ getFrameMisses: number(),
12988
+ budgetMb: number()
12989
+ });
12990
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
12991
+ var CameraDecoderStatusSchema = object({
12992
+ nodeId: string(),
12993
+ formats: array(string()).readonly(),
12994
+ sessionCount: number(),
12995
+ shm: CameraDecoderShmSchema
12996
+ });
12997
+ /** Motion block — null when motion detection is not active for this device. */
12998
+ var CameraMotionStatusSchema = object({
12999
+ enabled: boolean(),
13000
+ fps: number()
13001
+ });
13002
+ /** Detection provisioning sub-block. */
13003
+ var CameraDetectionProvisioningSchema = object({
13004
+ state: _enum([
13005
+ "idle",
13006
+ "installing",
13007
+ "verifying",
13008
+ "ready",
13009
+ "failed"
13010
+ ]),
13011
+ error: string().optional()
13012
+ });
13013
+ /** Detection phase — derived from the runner's engine phase. */
13014
+ var CameraDetectionPhaseSchema = _enum([
13015
+ "idle",
13016
+ "watching",
13017
+ "active"
13018
+ ]);
13019
+ /** Detection block — null when no detection node is assigned or reachable. */
13020
+ var CameraDetectionStatusSchema = object({
13021
+ nodeId: string(),
13022
+ engine: object({
13023
+ backend: string(),
13024
+ device: string()
13025
+ }),
13026
+ phase: CameraDetectionPhaseSchema,
13027
+ configuredFps: number(),
13028
+ actualFps: number(),
13029
+ queueDepth: number(),
13030
+ avgInferenceMs: number(),
13031
+ provisioning: CameraDetectionProvisioningSchema
13032
+ });
13033
+ /** Audio block — null when no audio node is assigned or reachable. */
13034
+ var CameraAudioStatusSchema = object({
13035
+ nodeId: string(),
13036
+ enabled: boolean()
13037
+ });
13038
+ /** Recording block — null when no recording cap is active for this device. */
13039
+ var CameraRecordingStatusSchema = object({
13040
+ mode: _enum([
13041
+ "off",
13042
+ "continuous",
13043
+ "events"
13044
+ ]),
13045
+ active: boolean(),
13046
+ storageBytes: number()
13047
+ });
13048
+ /**
13049
+ * Aggregated per-camera pipeline status — server-composed, single call.
13050
+ *
13051
+ * The `assignment` and `source` blocks are always present.
13052
+ * Every other block is `null` when the stage is inactive or unreachable
13053
+ * during the bounded parallel fan-out in the orchestrator implementation.
13054
+ *
13055
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
13056
+ */
13057
+ var CameraStatusSchema = object({
13058
+ deviceId: number(),
13059
+ assignment: CameraAssignmentStatusSchema,
13060
+ source: CameraSourceStatusSchema,
13061
+ broker: CameraBrokerStatusSchema.nullable(),
13062
+ decoder: CameraDecoderStatusSchema.nullable(),
13063
+ motion: CameraMotionStatusSchema.nullable(),
13064
+ detection: CameraDetectionStatusSchema.nullable(),
13065
+ audio: CameraAudioStatusSchema.nullable(),
13066
+ recording: CameraRecordingStatusSchema.nullable(),
13067
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
13068
+ fetchedAt: number()
13069
+ });
12909
13070
  method(object({
12910
13071
  deviceId: number(),
12911
13072
  agentNodeId: string()
@@ -12973,6 +13134,12 @@ method(object({
12973
13134
  }), {
12974
13135
  kind: "mutation",
12975
13136
  auth: "admin"
13137
+ }), method(object({
13138
+ agentNodeId: string(),
13139
+ maxCameras: number().int().nonnegative().nullable()
13140
+ }), object({ success: literal(true) }), {
13141
+ kind: "mutation",
13142
+ auth: "admin"
12976
13143
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
12977
13144
  deviceId: number(),
12978
13145
  addonId: string(),
@@ -12998,7 +13165,7 @@ method(object({
12998
13165
  }), method(object({
12999
13166
  deviceId: number(),
13000
13167
  agentNodeId: string().optional()
13001
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13168
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13002
13169
  name: string(),
13003
13170
  description: string().optional(),
13004
13171
  config: CameraPipelineConfigSchema
@@ -15982,6 +16149,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
15982
16149
  kind: "mutation",
15983
16150
  auth: "admin"
15984
16151
  });
16152
+ var jobKindSchema = _enum([
16153
+ "install",
16154
+ "update",
16155
+ "uninstall",
16156
+ "restart"
16157
+ ]);
16158
+ var taskPhaseSchema = _enum([
16159
+ "queued",
16160
+ "fetching",
16161
+ "staged",
16162
+ "validating",
16163
+ "applying",
16164
+ "restarting",
16165
+ "applied",
16166
+ "done",
16167
+ "failed",
16168
+ "skipped"
16169
+ ]);
16170
+ var taskTargetSchema = _enum(["framework", "addon"]);
16171
+ var taskLogEntrySchema = object({
16172
+ tsMs: number(),
16173
+ nodeId: string(),
16174
+ packageName: string(),
16175
+ phase: taskPhaseSchema,
16176
+ message: string()
16177
+ });
16178
+ var lifecycleTaskSchema = object({
16179
+ taskId: string(),
16180
+ nodeId: string(),
16181
+ packageName: string(),
16182
+ fromVersion: string().nullable(),
16183
+ toVersion: string(),
16184
+ target: taskTargetSchema,
16185
+ phase: taskPhaseSchema,
16186
+ stagedPath: string().nullable(),
16187
+ attempts: number(),
16188
+ steps: array(taskLogEntrySchema),
16189
+ error: string().nullable(),
16190
+ startedAtMs: number().nullable(),
16191
+ finishedAtMs: number().nullable()
16192
+ });
16193
+ var lifecycleJobStateSchema = _enum([
16194
+ "running",
16195
+ "completed",
16196
+ "failed",
16197
+ "partially-failed",
16198
+ "cancelled"
16199
+ ]);
16200
+ var lifecycleJobScopeSchema = _enum([
16201
+ "single",
16202
+ "bulk",
16203
+ "cluster"
16204
+ ]);
16205
+ var lifecycleJobSchema = object({
16206
+ jobId: string(),
16207
+ kind: jobKindSchema,
16208
+ createdAtMs: number(),
16209
+ createdBy: string(),
16210
+ scope: lifecycleJobScopeSchema,
16211
+ tasks: array(lifecycleTaskSchema),
16212
+ state: lifecycleJobStateSchema,
16213
+ schemaVersion: literal(1)
16214
+ });
15985
16215
  /**
15986
16216
  * addons — system-scoped singleton capability for addon package
15987
16217
  * management (install, update, configure, restart) and per-addon log
@@ -16164,7 +16394,7 @@ var BulkUpdatePhaseSchema = _enum([
16164
16394
  "restarting",
16165
16395
  "finalizing"
16166
16396
  ]);
16167
- var BulkUpdateStateSchema = object({
16397
+ object({
16168
16398
  id: string(),
16169
16399
  nodeId: string(),
16170
16400
  startedAtMs: number(),
@@ -16267,20 +16497,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16267
16497
  }), UpdateFrameworkPackageResultSchema, {
16268
16498
  kind: "mutation",
16269
16499
  auth: "admin"
16270
- }), method(object({
16271
- nodeId: string(),
16272
- items: array(object({
16273
- name: string(),
16274
- version: string(),
16275
- isSystem: boolean()
16276
- })).readonly()
16277
- }), object({ id: string() }), {
16278
- kind: "mutation",
16279
- auth: "admin"
16280
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
16281
- kind: "mutation",
16282
- auth: "admin"
16283
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16500
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16284
16501
  kind: "mutation",
16285
16502
  auth: "admin"
16286
16503
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -16302,6 +16519,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16302
16519
  kind: "mutation",
16303
16520
  auth: "admin"
16304
16521
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
16522
+ kind: _enum([
16523
+ "install",
16524
+ "update",
16525
+ "uninstall",
16526
+ "restart"
16527
+ ]),
16528
+ targets: array(object({
16529
+ name: string().min(1),
16530
+ version: string().min(1)
16531
+ })).min(1),
16532
+ nodeIds: array(string()).optional()
16533
+ }), object({ jobId: string() }), {
16534
+ kind: "mutation",
16535
+ auth: "admin"
16536
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
16537
+ kind: "mutation",
16538
+ auth: "admin"
16539
+ }), method(object({
16305
16540
  addonId: string(),
16306
16541
  level: LogLevelSchema$1.optional()
16307
16542
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -16342,7 +16577,7 @@ Object.freeze({
16342
16577
  addonId: null,
16343
16578
  access: "create"
16344
16579
  },
16345
- "addons.cancelBulkUpdate": {
16580
+ "addons.cancelJob": {
16346
16581
  capName: "addons",
16347
16582
  capScope: "system",
16348
16583
  addonId: null,
@@ -16372,7 +16607,7 @@ Object.freeze({
16372
16607
  addonId: null,
16373
16608
  access: "view"
16374
16609
  },
16375
- "addons.getBulkUpdateState": {
16610
+ "addons.getJob": {
16376
16611
  capName: "addons",
16377
16612
  capScope: "system",
16378
16613
  addonId: null,
@@ -16420,19 +16655,19 @@ Object.freeze({
16420
16655
  addonId: null,
16421
16656
  access: "view"
16422
16657
  },
16423
- "addons.listActiveBulkUpdates": {
16658
+ "addons.listCapabilityProviders": {
16424
16659
  capName: "addons",
16425
16660
  capScope: "system",
16426
16661
  addonId: null,
16427
16662
  access: "view"
16428
16663
  },
16429
- "addons.listCapabilityProviders": {
16664
+ "addons.listFrameworkPackages": {
16430
16665
  capName: "addons",
16431
16666
  capScope: "system",
16432
16667
  addonId: null,
16433
16668
  access: "view"
16434
16669
  },
16435
- "addons.listFrameworkPackages": {
16670
+ "addons.listJobs": {
16436
16671
  capName: "addons",
16437
16672
  capScope: "system",
16438
16673
  addonId: null,
@@ -16516,7 +16751,7 @@ Object.freeze({
16516
16751
  addonId: null,
16517
16752
  access: "create"
16518
16753
  },
16519
- "addons.startBulkUpdate": {
16754
+ "addons.startJob": {
16520
16755
  capName: "addons",
16521
16756
  capScope: "system",
16522
16757
  addonId: null,
@@ -18742,6 +18977,12 @@ Object.freeze({
18742
18977
  addonId: null,
18743
18978
  access: "view"
18744
18979
  },
18980
+ "pipelineExecutor.getEngineProvisioning": {
18981
+ capName: "pipeline-executor",
18982
+ capScope: "system",
18983
+ addonId: null,
18984
+ access: "view"
18985
+ },
18745
18986
  "pipelineExecutor.getGlobalPipelineConfig": {
18746
18987
  capName: "pipeline-executor",
18747
18988
  capScope: "system",
@@ -18946,6 +19187,18 @@ Object.freeze({
18946
19187
  addonId: null,
18947
19188
  access: "view"
18948
19189
  },
19190
+ "pipelineOrchestrator.getCameraStatus": {
19191
+ capName: "pipeline-orchestrator",
19192
+ capScope: "system",
19193
+ addonId: null,
19194
+ access: "view"
19195
+ },
19196
+ "pipelineOrchestrator.getCameraStatuses": {
19197
+ capName: "pipeline-orchestrator",
19198
+ capScope: "system",
19199
+ addonId: null,
19200
+ access: "view"
19201
+ },
18949
19202
  "pipelineOrchestrator.getCameraStepOverrides": {
18950
19203
  capName: "pipeline-orchestrator",
18951
19204
  capScope: "system",
@@ -19030,6 +19283,12 @@ Object.freeze({
19030
19283
  addonId: null,
19031
19284
  access: "create"
19032
19285
  },
19286
+ "pipelineOrchestrator.setAgentMaxCameras": {
19287
+ capName: "pipeline-orchestrator",
19288
+ capScope: "system",
19289
+ addonId: null,
19290
+ access: "create"
19291
+ },
19033
19292
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19034
19293
  capName: "pipeline-orchestrator",
19035
19294
  capScope: "system",
@@ -20503,6 +20762,32 @@ Object.freeze({
20503
20762
  "network-access": "ingress",
20504
20763
  "smtp-provider": "email"
20505
20764
  });
20765
+ var frameworkSwapPackageSchema = object({
20766
+ name: string(),
20767
+ stagedPath: string(),
20768
+ backupPath: string(),
20769
+ toVersion: string(),
20770
+ fromVersion: string().nullable()
20771
+ });
20772
+ object({
20773
+ jobId: string(),
20774
+ taskId: string(),
20775
+ packages: array(frameworkSwapPackageSchema),
20776
+ requestedAtMs: number(),
20777
+ schemaVersion: literal(1)
20778
+ });
20779
+ object({
20780
+ jobId: string(),
20781
+ taskId: string(),
20782
+ backups: array(object({
20783
+ name: string(),
20784
+ backupPath: string(),
20785
+ livePath: string()
20786
+ })),
20787
+ appliedAtMs: number(),
20788
+ bootAttempts: number(),
20789
+ schemaVersion: literal(1)
20790
+ });
20506
20791
  //#endregion
20507
20792
  //#region src/rules/rule-store.ts
20508
20793
  var COLLECTION$1 = "addon-settings";
package/dist/addon.mjs CHANGED
@@ -4982,6 +4982,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
4982
4982
  */
4983
4983
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
4984
4984
  /**
4985
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
4986
+ * the detection-pipeline provider on every state change of its lazy
4987
+ * engine-provisioning machine (idle → installing → verifying → ready,
4988
+ * or → failed with a `nextRetryAt`). Payload is the
4989
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
4990
+ * node. The Pipeline page subscribes to drive a live "installing
4991
+ * OpenVINO… / ready" indicator per node without polling
4992
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
4993
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
4994
+ */
4995
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
4996
+ /**
4985
4997
  * Cluster topology snapshot. Carries the same payload returned by
4986
4998
  * `nodes.topology` (every reachable node + addons + processes).
4987
4999
  * Emitted by the hub on any agent / addon lifecycle change
@@ -5131,14 +5143,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5131
5143
  EventCategory["DeviceSleeping"] = "device.sleeping";
5132
5144
  EventCategory["RetentionCleanup"] = "retention.cleanup";
5133
5145
  /**
5134
- * Progress snapshot emitted by `BulkUpdateCoordinator` on every state
5135
- * transition (item status change, phase change, completion, cancel).
5136
- * Payload is `BulkUpdateState`. Admin UI subscribes via `useLiveEvent`
5137
- * to drive the sticky `BulkUpdateBanner` and per-row `AddonRowBadge`.
5138
- *
5139
- * Spec: docs/superpowers/specs/2026-05-21-addons-bulk-update-progress-design.md
5146
+ * Legacy bulk-update progress snapshot (payload `BulkUpdateState`). No longer
5147
+ * emitted F3 removed the coordinator that produced it; "Update all" now runs
5148
+ * as one lifecycle engine job (`AddonsJobProgress`/`AddonsJobLog`). Retained
5149
+ * (with `BulkUpdateState`) only to avoid regenerating the event maps; removed
5150
+ * in F4 once live bulk progress is re-implemented over the engine events.
5140
5151
  */
5141
5152
  EventCategory["AddonsBulkUpdateProgress"] = "addons.bulk-update-progress";
5153
+ EventCategory["AddonsJobProgress"] = "addons.job-progress";
5154
+ EventCategory["AddonsJobLog"] = "addons.job-log";
5142
5155
  /**
5143
5156
  * A container's child visibility toggled (hidden/shown). Emitted by the
5144
5157
  * `accessories` cap when a child device is hidden or revealed.
@@ -9145,6 +9158,24 @@ var DetectorOutputSchema = object({
9145
9158
  inferenceMs: number(),
9146
9159
  modelId: string()
9147
9160
  });
9161
+ var EngineProvisioningSchema = object({
9162
+ runtimeId: _enum([
9163
+ "onnx",
9164
+ "openvino",
9165
+ "coreml"
9166
+ ]).nullable(),
9167
+ device: string().nullable(),
9168
+ state: _enum([
9169
+ "idle",
9170
+ "installing",
9171
+ "verifying",
9172
+ "ready",
9173
+ "failed"
9174
+ ]),
9175
+ progress: number().optional(),
9176
+ error: string().optional(),
9177
+ nextRetryAt: number().optional()
9178
+ });
9148
9179
  var PipelineStepInputSchema = lazy(() => object({
9149
9180
  addonId: string(),
9150
9181
  modelId: string(),
@@ -9213,7 +9244,7 @@ var PipelineRunResultBridge = custom();
9213
9244
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
9214
9245
  kind: "mutation",
9215
9246
  auth: "admin"
9216
- }), method(_void(), record(string(), object({
9247
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
9217
9248
  modelId: string(),
9218
9249
  settings: record(string(), unknown()).readonly()
9219
9250
  }))), method(object({ steps: record(string(), object({
@@ -12800,7 +12831,10 @@ var AgentAddonConfigSchema = object({
12800
12831
  modelId: string(),
12801
12832
  settings: record(string(), unknown()).readonly()
12802
12833
  });
12803
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
12834
+ var AgentPipelineSettingsSchema = object({
12835
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
12836
+ maxCameras: number().int().nonnegative().nullable().default(null)
12837
+ });
12804
12838
  var CameraPipelineForAgentSchema = object({
12805
12839
  steps: array(PipelineStepInputSchema).readonly(),
12806
12840
  audio: object({
@@ -12902,6 +12936,133 @@ var GlobalMetricsSchema = object({
12902
12936
  * capability providers.
12903
12937
  */
12904
12938
  var CapabilityBindingsSchema = record(string(), string());
12939
+ /** Source block — always present; derives from the stream catalog. */
12940
+ var CameraSourceStatusSchema = object({ streams: array(object({
12941
+ camStreamId: string(),
12942
+ codec: string(),
12943
+ width: number(),
12944
+ height: number(),
12945
+ fps: number(),
12946
+ kind: string()
12947
+ })).readonly() });
12948
+ /** Assignment block — always present (orchestrator-local, no remote call). */
12949
+ var CameraAssignmentStatusSchema = object({
12950
+ detectionNodeId: string().nullable(),
12951
+ decoderNodeId: string().nullable(),
12952
+ audioNodeId: string().nullable(),
12953
+ pinned: object({
12954
+ detection: boolean(),
12955
+ decoder: boolean(),
12956
+ audio: boolean()
12957
+ }),
12958
+ reasons: object({
12959
+ detection: string().optional(),
12960
+ decoder: string().optional(),
12961
+ audio: string().optional()
12962
+ })
12963
+ });
12964
+ /** Broker block — null when the broker stage is unreachable or inactive. */
12965
+ var CameraBrokerStatusSchema = object({
12966
+ profiles: array(object({
12967
+ profile: string(),
12968
+ status: string(),
12969
+ codec: string(),
12970
+ width: number(),
12971
+ height: number(),
12972
+ subscribers: number(),
12973
+ inFps: number(),
12974
+ outFps: number()
12975
+ })).readonly(),
12976
+ webrtcSessions: number(),
12977
+ rtspRestream: boolean()
12978
+ });
12979
+ /** Shared-memory ring statistics within the decoder block. */
12980
+ var CameraDecoderShmSchema = object({
12981
+ framesWritten: number(),
12982
+ getFrameHits: number(),
12983
+ getFrameMisses: number(),
12984
+ budgetMb: number()
12985
+ });
12986
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
12987
+ var CameraDecoderStatusSchema = object({
12988
+ nodeId: string(),
12989
+ formats: array(string()).readonly(),
12990
+ sessionCount: number(),
12991
+ shm: CameraDecoderShmSchema
12992
+ });
12993
+ /** Motion block — null when motion detection is not active for this device. */
12994
+ var CameraMotionStatusSchema = object({
12995
+ enabled: boolean(),
12996
+ fps: number()
12997
+ });
12998
+ /** Detection provisioning sub-block. */
12999
+ var CameraDetectionProvisioningSchema = object({
13000
+ state: _enum([
13001
+ "idle",
13002
+ "installing",
13003
+ "verifying",
13004
+ "ready",
13005
+ "failed"
13006
+ ]),
13007
+ error: string().optional()
13008
+ });
13009
+ /** Detection phase — derived from the runner's engine phase. */
13010
+ var CameraDetectionPhaseSchema = _enum([
13011
+ "idle",
13012
+ "watching",
13013
+ "active"
13014
+ ]);
13015
+ /** Detection block — null when no detection node is assigned or reachable. */
13016
+ var CameraDetectionStatusSchema = object({
13017
+ nodeId: string(),
13018
+ engine: object({
13019
+ backend: string(),
13020
+ device: string()
13021
+ }),
13022
+ phase: CameraDetectionPhaseSchema,
13023
+ configuredFps: number(),
13024
+ actualFps: number(),
13025
+ queueDepth: number(),
13026
+ avgInferenceMs: number(),
13027
+ provisioning: CameraDetectionProvisioningSchema
13028
+ });
13029
+ /** Audio block — null when no audio node is assigned or reachable. */
13030
+ var CameraAudioStatusSchema = object({
13031
+ nodeId: string(),
13032
+ enabled: boolean()
13033
+ });
13034
+ /** Recording block — null when no recording cap is active for this device. */
13035
+ var CameraRecordingStatusSchema = object({
13036
+ mode: _enum([
13037
+ "off",
13038
+ "continuous",
13039
+ "events"
13040
+ ]),
13041
+ active: boolean(),
13042
+ storageBytes: number()
13043
+ });
13044
+ /**
13045
+ * Aggregated per-camera pipeline status — server-composed, single call.
13046
+ *
13047
+ * The `assignment` and `source` blocks are always present.
13048
+ * Every other block is `null` when the stage is inactive or unreachable
13049
+ * during the bounded parallel fan-out in the orchestrator implementation.
13050
+ *
13051
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
13052
+ */
13053
+ var CameraStatusSchema = object({
13054
+ deviceId: number(),
13055
+ assignment: CameraAssignmentStatusSchema,
13056
+ source: CameraSourceStatusSchema,
13057
+ broker: CameraBrokerStatusSchema.nullable(),
13058
+ decoder: CameraDecoderStatusSchema.nullable(),
13059
+ motion: CameraMotionStatusSchema.nullable(),
13060
+ detection: CameraDetectionStatusSchema.nullable(),
13061
+ audio: CameraAudioStatusSchema.nullable(),
13062
+ recording: CameraRecordingStatusSchema.nullable(),
13063
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
13064
+ fetchedAt: number()
13065
+ });
12905
13066
  method(object({
12906
13067
  deviceId: number(),
12907
13068
  agentNodeId: string()
@@ -12969,6 +13130,12 @@ method(object({
12969
13130
  }), {
12970
13131
  kind: "mutation",
12971
13132
  auth: "admin"
13133
+ }), method(object({
13134
+ agentNodeId: string(),
13135
+ maxCameras: number().int().nonnegative().nullable()
13136
+ }), object({ success: literal(true) }), {
13137
+ kind: "mutation",
13138
+ auth: "admin"
12972
13139
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
12973
13140
  deviceId: number(),
12974
13141
  addonId: string(),
@@ -12994,7 +13161,7 @@ method(object({
12994
13161
  }), method(object({
12995
13162
  deviceId: number(),
12996
13163
  agentNodeId: string().optional()
12997
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13164
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
12998
13165
  name: string(),
12999
13166
  description: string().optional(),
13000
13167
  config: CameraPipelineConfigSchema
@@ -15978,6 +16145,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
15978
16145
  kind: "mutation",
15979
16146
  auth: "admin"
15980
16147
  });
16148
+ var jobKindSchema = _enum([
16149
+ "install",
16150
+ "update",
16151
+ "uninstall",
16152
+ "restart"
16153
+ ]);
16154
+ var taskPhaseSchema = _enum([
16155
+ "queued",
16156
+ "fetching",
16157
+ "staged",
16158
+ "validating",
16159
+ "applying",
16160
+ "restarting",
16161
+ "applied",
16162
+ "done",
16163
+ "failed",
16164
+ "skipped"
16165
+ ]);
16166
+ var taskTargetSchema = _enum(["framework", "addon"]);
16167
+ var taskLogEntrySchema = object({
16168
+ tsMs: number(),
16169
+ nodeId: string(),
16170
+ packageName: string(),
16171
+ phase: taskPhaseSchema,
16172
+ message: string()
16173
+ });
16174
+ var lifecycleTaskSchema = object({
16175
+ taskId: string(),
16176
+ nodeId: string(),
16177
+ packageName: string(),
16178
+ fromVersion: string().nullable(),
16179
+ toVersion: string(),
16180
+ target: taskTargetSchema,
16181
+ phase: taskPhaseSchema,
16182
+ stagedPath: string().nullable(),
16183
+ attempts: number(),
16184
+ steps: array(taskLogEntrySchema),
16185
+ error: string().nullable(),
16186
+ startedAtMs: number().nullable(),
16187
+ finishedAtMs: number().nullable()
16188
+ });
16189
+ var lifecycleJobStateSchema = _enum([
16190
+ "running",
16191
+ "completed",
16192
+ "failed",
16193
+ "partially-failed",
16194
+ "cancelled"
16195
+ ]);
16196
+ var lifecycleJobScopeSchema = _enum([
16197
+ "single",
16198
+ "bulk",
16199
+ "cluster"
16200
+ ]);
16201
+ var lifecycleJobSchema = object({
16202
+ jobId: string(),
16203
+ kind: jobKindSchema,
16204
+ createdAtMs: number(),
16205
+ createdBy: string(),
16206
+ scope: lifecycleJobScopeSchema,
16207
+ tasks: array(lifecycleTaskSchema),
16208
+ state: lifecycleJobStateSchema,
16209
+ schemaVersion: literal(1)
16210
+ });
15981
16211
  /**
15982
16212
  * addons — system-scoped singleton capability for addon package
15983
16213
  * management (install, update, configure, restart) and per-addon log
@@ -16160,7 +16390,7 @@ var BulkUpdatePhaseSchema = _enum([
16160
16390
  "restarting",
16161
16391
  "finalizing"
16162
16392
  ]);
16163
- var BulkUpdateStateSchema = object({
16393
+ object({
16164
16394
  id: string(),
16165
16395
  nodeId: string(),
16166
16396
  startedAtMs: number(),
@@ -16263,20 +16493,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16263
16493
  }), UpdateFrameworkPackageResultSchema, {
16264
16494
  kind: "mutation",
16265
16495
  auth: "admin"
16266
- }), method(object({
16267
- nodeId: string(),
16268
- items: array(object({
16269
- name: string(),
16270
- version: string(),
16271
- isSystem: boolean()
16272
- })).readonly()
16273
- }), object({ id: string() }), {
16274
- kind: "mutation",
16275
- auth: "admin"
16276
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
16277
- kind: "mutation",
16278
- auth: "admin"
16279
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16496
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16280
16497
  kind: "mutation",
16281
16498
  auth: "admin"
16282
16499
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -16298,6 +16515,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16298
16515
  kind: "mutation",
16299
16516
  auth: "admin"
16300
16517
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
16518
+ kind: _enum([
16519
+ "install",
16520
+ "update",
16521
+ "uninstall",
16522
+ "restart"
16523
+ ]),
16524
+ targets: array(object({
16525
+ name: string().min(1),
16526
+ version: string().min(1)
16527
+ })).min(1),
16528
+ nodeIds: array(string()).optional()
16529
+ }), object({ jobId: string() }), {
16530
+ kind: "mutation",
16531
+ auth: "admin"
16532
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
16533
+ kind: "mutation",
16534
+ auth: "admin"
16535
+ }), method(object({
16301
16536
  addonId: string(),
16302
16537
  level: LogLevelSchema$1.optional()
16303
16538
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -16338,7 +16573,7 @@ Object.freeze({
16338
16573
  addonId: null,
16339
16574
  access: "create"
16340
16575
  },
16341
- "addons.cancelBulkUpdate": {
16576
+ "addons.cancelJob": {
16342
16577
  capName: "addons",
16343
16578
  capScope: "system",
16344
16579
  addonId: null,
@@ -16368,7 +16603,7 @@ Object.freeze({
16368
16603
  addonId: null,
16369
16604
  access: "view"
16370
16605
  },
16371
- "addons.getBulkUpdateState": {
16606
+ "addons.getJob": {
16372
16607
  capName: "addons",
16373
16608
  capScope: "system",
16374
16609
  addonId: null,
@@ -16416,19 +16651,19 @@ Object.freeze({
16416
16651
  addonId: null,
16417
16652
  access: "view"
16418
16653
  },
16419
- "addons.listActiveBulkUpdates": {
16654
+ "addons.listCapabilityProviders": {
16420
16655
  capName: "addons",
16421
16656
  capScope: "system",
16422
16657
  addonId: null,
16423
16658
  access: "view"
16424
16659
  },
16425
- "addons.listCapabilityProviders": {
16660
+ "addons.listFrameworkPackages": {
16426
16661
  capName: "addons",
16427
16662
  capScope: "system",
16428
16663
  addonId: null,
16429
16664
  access: "view"
16430
16665
  },
16431
- "addons.listFrameworkPackages": {
16666
+ "addons.listJobs": {
16432
16667
  capName: "addons",
16433
16668
  capScope: "system",
16434
16669
  addonId: null,
@@ -16512,7 +16747,7 @@ Object.freeze({
16512
16747
  addonId: null,
16513
16748
  access: "create"
16514
16749
  },
16515
- "addons.startBulkUpdate": {
16750
+ "addons.startJob": {
16516
16751
  capName: "addons",
16517
16752
  capScope: "system",
16518
16753
  addonId: null,
@@ -18738,6 +18973,12 @@ Object.freeze({
18738
18973
  addonId: null,
18739
18974
  access: "view"
18740
18975
  },
18976
+ "pipelineExecutor.getEngineProvisioning": {
18977
+ capName: "pipeline-executor",
18978
+ capScope: "system",
18979
+ addonId: null,
18980
+ access: "view"
18981
+ },
18741
18982
  "pipelineExecutor.getGlobalPipelineConfig": {
18742
18983
  capName: "pipeline-executor",
18743
18984
  capScope: "system",
@@ -18942,6 +19183,18 @@ Object.freeze({
18942
19183
  addonId: null,
18943
19184
  access: "view"
18944
19185
  },
19186
+ "pipelineOrchestrator.getCameraStatus": {
19187
+ capName: "pipeline-orchestrator",
19188
+ capScope: "system",
19189
+ addonId: null,
19190
+ access: "view"
19191
+ },
19192
+ "pipelineOrchestrator.getCameraStatuses": {
19193
+ capName: "pipeline-orchestrator",
19194
+ capScope: "system",
19195
+ addonId: null,
19196
+ access: "view"
19197
+ },
18945
19198
  "pipelineOrchestrator.getCameraStepOverrides": {
18946
19199
  capName: "pipeline-orchestrator",
18947
19200
  capScope: "system",
@@ -19026,6 +19279,12 @@ Object.freeze({
19026
19279
  addonId: null,
19027
19280
  access: "create"
19028
19281
  },
19282
+ "pipelineOrchestrator.setAgentMaxCameras": {
19283
+ capName: "pipeline-orchestrator",
19284
+ capScope: "system",
19285
+ addonId: null,
19286
+ access: "create"
19287
+ },
19029
19288
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19030
19289
  capName: "pipeline-orchestrator",
19031
19290
  capScope: "system",
@@ -20499,6 +20758,32 @@ Object.freeze({
20499
20758
  "network-access": "ingress",
20500
20759
  "smtp-provider": "email"
20501
20760
  });
20761
+ var frameworkSwapPackageSchema = object({
20762
+ name: string(),
20763
+ stagedPath: string(),
20764
+ backupPath: string(),
20765
+ toVersion: string(),
20766
+ fromVersion: string().nullable()
20767
+ });
20768
+ object({
20769
+ jobId: string(),
20770
+ taskId: string(),
20771
+ packages: array(frameworkSwapPackageSchema),
20772
+ requestedAtMs: number(),
20773
+ schemaVersion: literal(1)
20774
+ });
20775
+ object({
20776
+ jobId: string(),
20777
+ taskId: string(),
20778
+ backups: array(object({
20779
+ name: string(),
20780
+ backupPath: string(),
20781
+ livePath: string()
20782
+ })),
20783
+ appliedAtMs: number(),
20784
+ bootAttempts: number(),
20785
+ schemaVersion: literal(1)
20786
+ });
20502
20787
  //#endregion
20503
20788
  //#region src/rules/rule-store.ts
20504
20789
  var COLLECTION$1 = "addon-settings";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-advanced-notifier",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "Rules-based notification engine for CamStack",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",