@camstack/addon-export-alexa 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.
@@ -5009,6 +5009,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5009
5009
  */
5010
5010
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
5011
5011
  /**
5012
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
5013
+ * the detection-pipeline provider on every state change of its lazy
5014
+ * engine-provisioning machine (idle → installing → verifying → ready,
5015
+ * or → failed with a `nextRetryAt`). Payload is the
5016
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
5017
+ * node. The Pipeline page subscribes to drive a live "installing
5018
+ * OpenVINO… / ready" indicator per node without polling
5019
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
5020
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
5021
+ */
5022
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
5023
+ /**
5012
5024
  * Cluster topology snapshot. Carries the same payload returned by
5013
5025
  * `nodes.topology` (every reachable node + addons + processes).
5014
5026
  * Emitted by the hub on any agent / addon lifecycle change
@@ -5158,14 +5170,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5158
5170
  EventCategory["DeviceSleeping"] = "device.sleeping";
5159
5171
  EventCategory["RetentionCleanup"] = "retention.cleanup";
5160
5172
  /**
5161
- * Progress snapshot emitted by `BulkUpdateCoordinator` on every state
5162
- * transition (item status change, phase change, completion, cancel).
5163
- * Payload is `BulkUpdateState`. Admin UI subscribes via `useLiveEvent`
5164
- * to drive the sticky `BulkUpdateBanner` and per-row `AddonRowBadge`.
5165
- *
5166
- * Spec: docs/superpowers/specs/2026-05-21-addons-bulk-update-progress-design.md
5173
+ * Legacy bulk-update progress snapshot (payload `BulkUpdateState`). No longer
5174
+ * emitted F3 removed the coordinator that produced it; "Update all" now runs
5175
+ * as one lifecycle engine job (`AddonsJobProgress`/`AddonsJobLog`). Retained
5176
+ * (with `BulkUpdateState`) only to avoid regenerating the event maps; removed
5177
+ * in F4 once live bulk progress is re-implemented over the engine events.
5167
5178
  */
5168
5179
  EventCategory["AddonsBulkUpdateProgress"] = "addons.bulk-update-progress";
5180
+ EventCategory["AddonsJobProgress"] = "addons.job-progress";
5181
+ EventCategory["AddonsJobLog"] = "addons.job-log";
5169
5182
  /**
5170
5183
  * A container's child visibility toggled (hidden/shown). Emitted by the
5171
5184
  * `accessories` cap when a child device is hidden or revealed.
@@ -9364,6 +9377,24 @@ var DetectorOutputSchema = object({
9364
9377
  inferenceMs: number(),
9365
9378
  modelId: string()
9366
9379
  });
9380
+ var EngineProvisioningSchema = object({
9381
+ runtimeId: _enum([
9382
+ "onnx",
9383
+ "openvino",
9384
+ "coreml"
9385
+ ]).nullable(),
9386
+ device: string().nullable(),
9387
+ state: _enum([
9388
+ "idle",
9389
+ "installing",
9390
+ "verifying",
9391
+ "ready",
9392
+ "failed"
9393
+ ]),
9394
+ progress: number().optional(),
9395
+ error: string().optional(),
9396
+ nextRetryAt: number().optional()
9397
+ });
9367
9398
  var PipelineStepInputSchema = lazy(() => object({
9368
9399
  addonId: string(),
9369
9400
  modelId: string(),
@@ -9432,7 +9463,7 @@ var PipelineRunResultBridge = custom();
9432
9463
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
9433
9464
  kind: "mutation",
9434
9465
  auth: "admin"
9435
- }), method(_void(), record(string(), object({
9466
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
9436
9467
  modelId: string(),
9437
9468
  settings: record(string(), unknown()).readonly()
9438
9469
  }))), method(object({ steps: record(string(), object({
@@ -13088,7 +13119,10 @@ var AgentAddonConfigSchema = object({
13088
13119
  modelId: string(),
13089
13120
  settings: record(string(), unknown()).readonly()
13090
13121
  });
13091
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
13122
+ var AgentPipelineSettingsSchema = object({
13123
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
13124
+ maxCameras: number().int().nonnegative().nullable().default(null)
13125
+ });
13092
13126
  var CameraPipelineForAgentSchema = object({
13093
13127
  steps: array(PipelineStepInputSchema).readonly(),
13094
13128
  audio: object({
@@ -13190,6 +13224,133 @@ var GlobalMetricsSchema = object({
13190
13224
  * capability providers.
13191
13225
  */
13192
13226
  var CapabilityBindingsSchema = record(string(), string());
13227
+ /** Source block — always present; derives from the stream catalog. */
13228
+ var CameraSourceStatusSchema = object({ streams: array(object({
13229
+ camStreamId: string(),
13230
+ codec: string(),
13231
+ width: number(),
13232
+ height: number(),
13233
+ fps: number(),
13234
+ kind: string()
13235
+ })).readonly() });
13236
+ /** Assignment block — always present (orchestrator-local, no remote call). */
13237
+ var CameraAssignmentStatusSchema = object({
13238
+ detectionNodeId: string().nullable(),
13239
+ decoderNodeId: string().nullable(),
13240
+ audioNodeId: string().nullable(),
13241
+ pinned: object({
13242
+ detection: boolean(),
13243
+ decoder: boolean(),
13244
+ audio: boolean()
13245
+ }),
13246
+ reasons: object({
13247
+ detection: string().optional(),
13248
+ decoder: string().optional(),
13249
+ audio: string().optional()
13250
+ })
13251
+ });
13252
+ /** Broker block — null when the broker stage is unreachable or inactive. */
13253
+ var CameraBrokerStatusSchema = object({
13254
+ profiles: array(object({
13255
+ profile: string(),
13256
+ status: string(),
13257
+ codec: string(),
13258
+ width: number(),
13259
+ height: number(),
13260
+ subscribers: number(),
13261
+ inFps: number(),
13262
+ outFps: number()
13263
+ })).readonly(),
13264
+ webrtcSessions: number(),
13265
+ rtspRestream: boolean()
13266
+ });
13267
+ /** Shared-memory ring statistics within the decoder block. */
13268
+ var CameraDecoderShmSchema = object({
13269
+ framesWritten: number(),
13270
+ getFrameHits: number(),
13271
+ getFrameMisses: number(),
13272
+ budgetMb: number()
13273
+ });
13274
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
13275
+ var CameraDecoderStatusSchema = object({
13276
+ nodeId: string(),
13277
+ formats: array(string()).readonly(),
13278
+ sessionCount: number(),
13279
+ shm: CameraDecoderShmSchema
13280
+ });
13281
+ /** Motion block — null when motion detection is not active for this device. */
13282
+ var CameraMotionStatusSchema = object({
13283
+ enabled: boolean(),
13284
+ fps: number()
13285
+ });
13286
+ /** Detection provisioning sub-block. */
13287
+ var CameraDetectionProvisioningSchema = object({
13288
+ state: _enum([
13289
+ "idle",
13290
+ "installing",
13291
+ "verifying",
13292
+ "ready",
13293
+ "failed"
13294
+ ]),
13295
+ error: string().optional()
13296
+ });
13297
+ /** Detection phase — derived from the runner's engine phase. */
13298
+ var CameraDetectionPhaseSchema = _enum([
13299
+ "idle",
13300
+ "watching",
13301
+ "active"
13302
+ ]);
13303
+ /** Detection block — null when no detection node is assigned or reachable. */
13304
+ var CameraDetectionStatusSchema = object({
13305
+ nodeId: string(),
13306
+ engine: object({
13307
+ backend: string(),
13308
+ device: string()
13309
+ }),
13310
+ phase: CameraDetectionPhaseSchema,
13311
+ configuredFps: number(),
13312
+ actualFps: number(),
13313
+ queueDepth: number(),
13314
+ avgInferenceMs: number(),
13315
+ provisioning: CameraDetectionProvisioningSchema
13316
+ });
13317
+ /** Audio block — null when no audio node is assigned or reachable. */
13318
+ var CameraAudioStatusSchema = object({
13319
+ nodeId: string(),
13320
+ enabled: boolean()
13321
+ });
13322
+ /** Recording block — null when no recording cap is active for this device. */
13323
+ var CameraRecordingStatusSchema = object({
13324
+ mode: _enum([
13325
+ "off",
13326
+ "continuous",
13327
+ "events"
13328
+ ]),
13329
+ active: boolean(),
13330
+ storageBytes: number()
13331
+ });
13332
+ /**
13333
+ * Aggregated per-camera pipeline status — server-composed, single call.
13334
+ *
13335
+ * The `assignment` and `source` blocks are always present.
13336
+ * Every other block is `null` when the stage is inactive or unreachable
13337
+ * during the bounded parallel fan-out in the orchestrator implementation.
13338
+ *
13339
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
13340
+ */
13341
+ var CameraStatusSchema = object({
13342
+ deviceId: number(),
13343
+ assignment: CameraAssignmentStatusSchema,
13344
+ source: CameraSourceStatusSchema,
13345
+ broker: CameraBrokerStatusSchema.nullable(),
13346
+ decoder: CameraDecoderStatusSchema.nullable(),
13347
+ motion: CameraMotionStatusSchema.nullable(),
13348
+ detection: CameraDetectionStatusSchema.nullable(),
13349
+ audio: CameraAudioStatusSchema.nullable(),
13350
+ recording: CameraRecordingStatusSchema.nullable(),
13351
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
13352
+ fetchedAt: number()
13353
+ });
13193
13354
  method(object({
13194
13355
  deviceId: number(),
13195
13356
  agentNodeId: string()
@@ -13257,6 +13418,12 @@ method(object({
13257
13418
  }), {
13258
13419
  kind: "mutation",
13259
13420
  auth: "admin"
13421
+ }), method(object({
13422
+ agentNodeId: string(),
13423
+ maxCameras: number().int().nonnegative().nullable()
13424
+ }), object({ success: literal(true) }), {
13425
+ kind: "mutation",
13426
+ auth: "admin"
13260
13427
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
13261
13428
  deviceId: number(),
13262
13429
  addonId: string(),
@@ -13282,7 +13449,7 @@ method(object({
13282
13449
  }), method(object({
13283
13450
  deviceId: number(),
13284
13451
  agentNodeId: string().optional()
13285
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13452
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13286
13453
  name: string(),
13287
13454
  description: string().optional(),
13288
13455
  config: CameraPipelineConfigSchema
@@ -16246,6 +16413,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
16246
16413
  kind: "mutation",
16247
16414
  auth: "admin"
16248
16415
  });
16416
+ var jobKindSchema = _enum([
16417
+ "install",
16418
+ "update",
16419
+ "uninstall",
16420
+ "restart"
16421
+ ]);
16422
+ var taskPhaseSchema = _enum([
16423
+ "queued",
16424
+ "fetching",
16425
+ "staged",
16426
+ "validating",
16427
+ "applying",
16428
+ "restarting",
16429
+ "applied",
16430
+ "done",
16431
+ "failed",
16432
+ "skipped"
16433
+ ]);
16434
+ var taskTargetSchema = _enum(["framework", "addon"]);
16435
+ var taskLogEntrySchema = object({
16436
+ tsMs: number(),
16437
+ nodeId: string(),
16438
+ packageName: string(),
16439
+ phase: taskPhaseSchema,
16440
+ message: string()
16441
+ });
16442
+ var lifecycleTaskSchema = object({
16443
+ taskId: string(),
16444
+ nodeId: string(),
16445
+ packageName: string(),
16446
+ fromVersion: string().nullable(),
16447
+ toVersion: string(),
16448
+ target: taskTargetSchema,
16449
+ phase: taskPhaseSchema,
16450
+ stagedPath: string().nullable(),
16451
+ attempts: number(),
16452
+ steps: array(taskLogEntrySchema),
16453
+ error: string().nullable(),
16454
+ startedAtMs: number().nullable(),
16455
+ finishedAtMs: number().nullable()
16456
+ });
16457
+ var lifecycleJobStateSchema = _enum([
16458
+ "running",
16459
+ "completed",
16460
+ "failed",
16461
+ "partially-failed",
16462
+ "cancelled"
16463
+ ]);
16464
+ var lifecycleJobScopeSchema = _enum([
16465
+ "single",
16466
+ "bulk",
16467
+ "cluster"
16468
+ ]);
16469
+ var lifecycleJobSchema = object({
16470
+ jobId: string(),
16471
+ kind: jobKindSchema,
16472
+ createdAtMs: number(),
16473
+ createdBy: string(),
16474
+ scope: lifecycleJobScopeSchema,
16475
+ tasks: array(lifecycleTaskSchema),
16476
+ state: lifecycleJobStateSchema,
16477
+ schemaVersion: literal(1)
16478
+ });
16249
16479
  /**
16250
16480
  * addons — system-scoped singleton capability for addon package
16251
16481
  * management (install, update, configure, restart) and per-addon log
@@ -16428,7 +16658,7 @@ var BulkUpdatePhaseSchema = _enum([
16428
16658
  "restarting",
16429
16659
  "finalizing"
16430
16660
  ]);
16431
- var BulkUpdateStateSchema = object({
16661
+ object({
16432
16662
  id: string(),
16433
16663
  nodeId: string(),
16434
16664
  startedAtMs: number(),
@@ -16531,20 +16761,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16531
16761
  }), UpdateFrameworkPackageResultSchema, {
16532
16762
  kind: "mutation",
16533
16763
  auth: "admin"
16534
- }), method(object({
16535
- nodeId: string(),
16536
- items: array(object({
16537
- name: string(),
16538
- version: string(),
16539
- isSystem: boolean()
16540
- })).readonly()
16541
- }), object({ id: string() }), {
16542
- kind: "mutation",
16543
- auth: "admin"
16544
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
16545
- kind: "mutation",
16546
- auth: "admin"
16547
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16764
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16548
16765
  kind: "mutation",
16549
16766
  auth: "admin"
16550
16767
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -16566,6 +16783,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16566
16783
  kind: "mutation",
16567
16784
  auth: "admin"
16568
16785
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
16786
+ kind: _enum([
16787
+ "install",
16788
+ "update",
16789
+ "uninstall",
16790
+ "restart"
16791
+ ]),
16792
+ targets: array(object({
16793
+ name: string().min(1),
16794
+ version: string().min(1)
16795
+ })).min(1),
16796
+ nodeIds: array(string()).optional()
16797
+ }), object({ jobId: string() }), {
16798
+ kind: "mutation",
16799
+ auth: "admin"
16800
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
16801
+ kind: "mutation",
16802
+ auth: "admin"
16803
+ }), method(object({
16569
16804
  addonId: string(),
16570
16805
  level: LogLevelSchema$1.optional()
16571
16806
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -16606,7 +16841,7 @@ Object.freeze({
16606
16841
  addonId: null,
16607
16842
  access: "create"
16608
16843
  },
16609
- "addons.cancelBulkUpdate": {
16844
+ "addons.cancelJob": {
16610
16845
  capName: "addons",
16611
16846
  capScope: "system",
16612
16847
  addonId: null,
@@ -16636,7 +16871,7 @@ Object.freeze({
16636
16871
  addonId: null,
16637
16872
  access: "view"
16638
16873
  },
16639
- "addons.getBulkUpdateState": {
16874
+ "addons.getJob": {
16640
16875
  capName: "addons",
16641
16876
  capScope: "system",
16642
16877
  addonId: null,
@@ -16684,19 +16919,19 @@ Object.freeze({
16684
16919
  addonId: null,
16685
16920
  access: "view"
16686
16921
  },
16687
- "addons.listActiveBulkUpdates": {
16922
+ "addons.listCapabilityProviders": {
16688
16923
  capName: "addons",
16689
16924
  capScope: "system",
16690
16925
  addonId: null,
16691
16926
  access: "view"
16692
16927
  },
16693
- "addons.listCapabilityProviders": {
16928
+ "addons.listFrameworkPackages": {
16694
16929
  capName: "addons",
16695
16930
  capScope: "system",
16696
16931
  addonId: null,
16697
16932
  access: "view"
16698
16933
  },
16699
- "addons.listFrameworkPackages": {
16934
+ "addons.listJobs": {
16700
16935
  capName: "addons",
16701
16936
  capScope: "system",
16702
16937
  addonId: null,
@@ -16780,7 +17015,7 @@ Object.freeze({
16780
17015
  addonId: null,
16781
17016
  access: "create"
16782
17017
  },
16783
- "addons.startBulkUpdate": {
17018
+ "addons.startJob": {
16784
17019
  capName: "addons",
16785
17020
  capScope: "system",
16786
17021
  addonId: null,
@@ -19006,6 +19241,12 @@ Object.freeze({
19006
19241
  addonId: null,
19007
19242
  access: "view"
19008
19243
  },
19244
+ "pipelineExecutor.getEngineProvisioning": {
19245
+ capName: "pipeline-executor",
19246
+ capScope: "system",
19247
+ addonId: null,
19248
+ access: "view"
19249
+ },
19009
19250
  "pipelineExecutor.getGlobalPipelineConfig": {
19010
19251
  capName: "pipeline-executor",
19011
19252
  capScope: "system",
@@ -19210,6 +19451,18 @@ Object.freeze({
19210
19451
  addonId: null,
19211
19452
  access: "view"
19212
19453
  },
19454
+ "pipelineOrchestrator.getCameraStatus": {
19455
+ capName: "pipeline-orchestrator",
19456
+ capScope: "system",
19457
+ addonId: null,
19458
+ access: "view"
19459
+ },
19460
+ "pipelineOrchestrator.getCameraStatuses": {
19461
+ capName: "pipeline-orchestrator",
19462
+ capScope: "system",
19463
+ addonId: null,
19464
+ access: "view"
19465
+ },
19213
19466
  "pipelineOrchestrator.getCameraStepOverrides": {
19214
19467
  capName: "pipeline-orchestrator",
19215
19468
  capScope: "system",
@@ -19294,6 +19547,12 @@ Object.freeze({
19294
19547
  addonId: null,
19295
19548
  access: "create"
19296
19549
  },
19550
+ "pipelineOrchestrator.setAgentMaxCameras": {
19551
+ capName: "pipeline-orchestrator",
19552
+ capScope: "system",
19553
+ addonId: null,
19554
+ access: "create"
19555
+ },
19297
19556
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19298
19557
  capName: "pipeline-orchestrator",
19299
19558
  capScope: "system",
@@ -20767,6 +21026,32 @@ Object.freeze({
20767
21026
  "network-access": "ingress",
20768
21027
  "smtp-provider": "email"
20769
21028
  });
21029
+ var frameworkSwapPackageSchema = object({
21030
+ name: string(),
21031
+ stagedPath: string(),
21032
+ backupPath: string(),
21033
+ toVersion: string(),
21034
+ fromVersion: string().nullable()
21035
+ });
21036
+ object({
21037
+ jobId: string(),
21038
+ taskId: string(),
21039
+ packages: array(frameworkSwapPackageSchema),
21040
+ requestedAtMs: number(),
21041
+ schemaVersion: literal(1)
21042
+ });
21043
+ object({
21044
+ jobId: string(),
21045
+ taskId: string(),
21046
+ backups: array(object({
21047
+ name: string(),
21048
+ backupPath: string(),
21049
+ livePath: string()
21050
+ })),
21051
+ appliedAtMs: number(),
21052
+ bootAttempts: number(),
21053
+ schemaVersion: literal(1)
21054
+ });
20770
21055
  //#endregion
20771
21056
  //#region src/custom-actions.ts
20772
21057
  /**
@@ -4983,6 +4983,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
4983
4983
  */
4984
4984
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
4985
4985
  /**
4986
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
4987
+ * the detection-pipeline provider on every state change of its lazy
4988
+ * engine-provisioning machine (idle → installing → verifying → ready,
4989
+ * or → failed with a `nextRetryAt`). Payload is the
4990
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
4991
+ * node. The Pipeline page subscribes to drive a live "installing
4992
+ * OpenVINO… / ready" indicator per node without polling
4993
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
4994
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
4995
+ */
4996
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
4997
+ /**
4986
4998
  * Cluster topology snapshot. Carries the same payload returned by
4987
4999
  * `nodes.topology` (every reachable node + addons + processes).
4988
5000
  * Emitted by the hub on any agent / addon lifecycle change
@@ -5132,14 +5144,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5132
5144
  EventCategory["DeviceSleeping"] = "device.sleeping";
5133
5145
  EventCategory["RetentionCleanup"] = "retention.cleanup";
5134
5146
  /**
5135
- * Progress snapshot emitted by `BulkUpdateCoordinator` on every state
5136
- * transition (item status change, phase change, completion, cancel).
5137
- * Payload is `BulkUpdateState`. Admin UI subscribes via `useLiveEvent`
5138
- * to drive the sticky `BulkUpdateBanner` and per-row `AddonRowBadge`.
5139
- *
5140
- * Spec: docs/superpowers/specs/2026-05-21-addons-bulk-update-progress-design.md
5147
+ * Legacy bulk-update progress snapshot (payload `BulkUpdateState`). No longer
5148
+ * emitted F3 removed the coordinator that produced it; "Update all" now runs
5149
+ * as one lifecycle engine job (`AddonsJobProgress`/`AddonsJobLog`). Retained
5150
+ * (with `BulkUpdateState`) only to avoid regenerating the event maps; removed
5151
+ * in F4 once live bulk progress is re-implemented over the engine events.
5141
5152
  */
5142
5153
  EventCategory["AddonsBulkUpdateProgress"] = "addons.bulk-update-progress";
5154
+ EventCategory["AddonsJobProgress"] = "addons.job-progress";
5155
+ EventCategory["AddonsJobLog"] = "addons.job-log";
5143
5156
  /**
5144
5157
  * A container's child visibility toggled (hidden/shown). Emitted by the
5145
5158
  * `accessories` cap when a child device is hidden or revealed.
@@ -9338,6 +9351,24 @@ var DetectorOutputSchema = object({
9338
9351
  inferenceMs: number(),
9339
9352
  modelId: string()
9340
9353
  });
9354
+ var EngineProvisioningSchema = object({
9355
+ runtimeId: _enum([
9356
+ "onnx",
9357
+ "openvino",
9358
+ "coreml"
9359
+ ]).nullable(),
9360
+ device: string().nullable(),
9361
+ state: _enum([
9362
+ "idle",
9363
+ "installing",
9364
+ "verifying",
9365
+ "ready",
9366
+ "failed"
9367
+ ]),
9368
+ progress: number().optional(),
9369
+ error: string().optional(),
9370
+ nextRetryAt: number().optional()
9371
+ });
9341
9372
  var PipelineStepInputSchema = lazy(() => object({
9342
9373
  addonId: string(),
9343
9374
  modelId: string(),
@@ -9406,7 +9437,7 @@ var PipelineRunResultBridge = custom();
9406
9437
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
9407
9438
  kind: "mutation",
9408
9439
  auth: "admin"
9409
- }), method(_void(), record(string(), object({
9440
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
9410
9441
  modelId: string(),
9411
9442
  settings: record(string(), unknown()).readonly()
9412
9443
  }))), method(object({ steps: record(string(), object({
@@ -13062,7 +13093,10 @@ var AgentAddonConfigSchema = object({
13062
13093
  modelId: string(),
13063
13094
  settings: record(string(), unknown()).readonly()
13064
13095
  });
13065
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
13096
+ var AgentPipelineSettingsSchema = object({
13097
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
13098
+ maxCameras: number().int().nonnegative().nullable().default(null)
13099
+ });
13066
13100
  var CameraPipelineForAgentSchema = object({
13067
13101
  steps: array(PipelineStepInputSchema).readonly(),
13068
13102
  audio: object({
@@ -13164,6 +13198,133 @@ var GlobalMetricsSchema = object({
13164
13198
  * capability providers.
13165
13199
  */
13166
13200
  var CapabilityBindingsSchema = record(string(), string());
13201
+ /** Source block — always present; derives from the stream catalog. */
13202
+ var CameraSourceStatusSchema = object({ streams: array(object({
13203
+ camStreamId: string(),
13204
+ codec: string(),
13205
+ width: number(),
13206
+ height: number(),
13207
+ fps: number(),
13208
+ kind: string()
13209
+ })).readonly() });
13210
+ /** Assignment block — always present (orchestrator-local, no remote call). */
13211
+ var CameraAssignmentStatusSchema = object({
13212
+ detectionNodeId: string().nullable(),
13213
+ decoderNodeId: string().nullable(),
13214
+ audioNodeId: string().nullable(),
13215
+ pinned: object({
13216
+ detection: boolean(),
13217
+ decoder: boolean(),
13218
+ audio: boolean()
13219
+ }),
13220
+ reasons: object({
13221
+ detection: string().optional(),
13222
+ decoder: string().optional(),
13223
+ audio: string().optional()
13224
+ })
13225
+ });
13226
+ /** Broker block — null when the broker stage is unreachable or inactive. */
13227
+ var CameraBrokerStatusSchema = object({
13228
+ profiles: array(object({
13229
+ profile: string(),
13230
+ status: string(),
13231
+ codec: string(),
13232
+ width: number(),
13233
+ height: number(),
13234
+ subscribers: number(),
13235
+ inFps: number(),
13236
+ outFps: number()
13237
+ })).readonly(),
13238
+ webrtcSessions: number(),
13239
+ rtspRestream: boolean()
13240
+ });
13241
+ /** Shared-memory ring statistics within the decoder block. */
13242
+ var CameraDecoderShmSchema = object({
13243
+ framesWritten: number(),
13244
+ getFrameHits: number(),
13245
+ getFrameMisses: number(),
13246
+ budgetMb: number()
13247
+ });
13248
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
13249
+ var CameraDecoderStatusSchema = object({
13250
+ nodeId: string(),
13251
+ formats: array(string()).readonly(),
13252
+ sessionCount: number(),
13253
+ shm: CameraDecoderShmSchema
13254
+ });
13255
+ /** Motion block — null when motion detection is not active for this device. */
13256
+ var CameraMotionStatusSchema = object({
13257
+ enabled: boolean(),
13258
+ fps: number()
13259
+ });
13260
+ /** Detection provisioning sub-block. */
13261
+ var CameraDetectionProvisioningSchema = object({
13262
+ state: _enum([
13263
+ "idle",
13264
+ "installing",
13265
+ "verifying",
13266
+ "ready",
13267
+ "failed"
13268
+ ]),
13269
+ error: string().optional()
13270
+ });
13271
+ /** Detection phase — derived from the runner's engine phase. */
13272
+ var CameraDetectionPhaseSchema = _enum([
13273
+ "idle",
13274
+ "watching",
13275
+ "active"
13276
+ ]);
13277
+ /** Detection block — null when no detection node is assigned or reachable. */
13278
+ var CameraDetectionStatusSchema = object({
13279
+ nodeId: string(),
13280
+ engine: object({
13281
+ backend: string(),
13282
+ device: string()
13283
+ }),
13284
+ phase: CameraDetectionPhaseSchema,
13285
+ configuredFps: number(),
13286
+ actualFps: number(),
13287
+ queueDepth: number(),
13288
+ avgInferenceMs: number(),
13289
+ provisioning: CameraDetectionProvisioningSchema
13290
+ });
13291
+ /** Audio block — null when no audio node is assigned or reachable. */
13292
+ var CameraAudioStatusSchema = object({
13293
+ nodeId: string(),
13294
+ enabled: boolean()
13295
+ });
13296
+ /** Recording block — null when no recording cap is active for this device. */
13297
+ var CameraRecordingStatusSchema = object({
13298
+ mode: _enum([
13299
+ "off",
13300
+ "continuous",
13301
+ "events"
13302
+ ]),
13303
+ active: boolean(),
13304
+ storageBytes: number()
13305
+ });
13306
+ /**
13307
+ * Aggregated per-camera pipeline status — server-composed, single call.
13308
+ *
13309
+ * The `assignment` and `source` blocks are always present.
13310
+ * Every other block is `null` when the stage is inactive or unreachable
13311
+ * during the bounded parallel fan-out in the orchestrator implementation.
13312
+ *
13313
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
13314
+ */
13315
+ var CameraStatusSchema = object({
13316
+ deviceId: number(),
13317
+ assignment: CameraAssignmentStatusSchema,
13318
+ source: CameraSourceStatusSchema,
13319
+ broker: CameraBrokerStatusSchema.nullable(),
13320
+ decoder: CameraDecoderStatusSchema.nullable(),
13321
+ motion: CameraMotionStatusSchema.nullable(),
13322
+ detection: CameraDetectionStatusSchema.nullable(),
13323
+ audio: CameraAudioStatusSchema.nullable(),
13324
+ recording: CameraRecordingStatusSchema.nullable(),
13325
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
13326
+ fetchedAt: number()
13327
+ });
13167
13328
  method(object({
13168
13329
  deviceId: number(),
13169
13330
  agentNodeId: string()
@@ -13231,6 +13392,12 @@ method(object({
13231
13392
  }), {
13232
13393
  kind: "mutation",
13233
13394
  auth: "admin"
13395
+ }), method(object({
13396
+ agentNodeId: string(),
13397
+ maxCameras: number().int().nonnegative().nullable()
13398
+ }), object({ success: literal(true) }), {
13399
+ kind: "mutation",
13400
+ auth: "admin"
13234
13401
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
13235
13402
  deviceId: number(),
13236
13403
  addonId: string(),
@@ -13256,7 +13423,7 @@ method(object({
13256
13423
  }), method(object({
13257
13424
  deviceId: number(),
13258
13425
  agentNodeId: string().optional()
13259
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13426
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13260
13427
  name: string(),
13261
13428
  description: string().optional(),
13262
13429
  config: CameraPipelineConfigSchema
@@ -16220,6 +16387,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
16220
16387
  kind: "mutation",
16221
16388
  auth: "admin"
16222
16389
  });
16390
+ var jobKindSchema = _enum([
16391
+ "install",
16392
+ "update",
16393
+ "uninstall",
16394
+ "restart"
16395
+ ]);
16396
+ var taskPhaseSchema = _enum([
16397
+ "queued",
16398
+ "fetching",
16399
+ "staged",
16400
+ "validating",
16401
+ "applying",
16402
+ "restarting",
16403
+ "applied",
16404
+ "done",
16405
+ "failed",
16406
+ "skipped"
16407
+ ]);
16408
+ var taskTargetSchema = _enum(["framework", "addon"]);
16409
+ var taskLogEntrySchema = object({
16410
+ tsMs: number(),
16411
+ nodeId: string(),
16412
+ packageName: string(),
16413
+ phase: taskPhaseSchema,
16414
+ message: string()
16415
+ });
16416
+ var lifecycleTaskSchema = object({
16417
+ taskId: string(),
16418
+ nodeId: string(),
16419
+ packageName: string(),
16420
+ fromVersion: string().nullable(),
16421
+ toVersion: string(),
16422
+ target: taskTargetSchema,
16423
+ phase: taskPhaseSchema,
16424
+ stagedPath: string().nullable(),
16425
+ attempts: number(),
16426
+ steps: array(taskLogEntrySchema),
16427
+ error: string().nullable(),
16428
+ startedAtMs: number().nullable(),
16429
+ finishedAtMs: number().nullable()
16430
+ });
16431
+ var lifecycleJobStateSchema = _enum([
16432
+ "running",
16433
+ "completed",
16434
+ "failed",
16435
+ "partially-failed",
16436
+ "cancelled"
16437
+ ]);
16438
+ var lifecycleJobScopeSchema = _enum([
16439
+ "single",
16440
+ "bulk",
16441
+ "cluster"
16442
+ ]);
16443
+ var lifecycleJobSchema = object({
16444
+ jobId: string(),
16445
+ kind: jobKindSchema,
16446
+ createdAtMs: number(),
16447
+ createdBy: string(),
16448
+ scope: lifecycleJobScopeSchema,
16449
+ tasks: array(lifecycleTaskSchema),
16450
+ state: lifecycleJobStateSchema,
16451
+ schemaVersion: literal(1)
16452
+ });
16223
16453
  /**
16224
16454
  * addons — system-scoped singleton capability for addon package
16225
16455
  * management (install, update, configure, restart) and per-addon log
@@ -16402,7 +16632,7 @@ var BulkUpdatePhaseSchema = _enum([
16402
16632
  "restarting",
16403
16633
  "finalizing"
16404
16634
  ]);
16405
- var BulkUpdateStateSchema = object({
16635
+ object({
16406
16636
  id: string(),
16407
16637
  nodeId: string(),
16408
16638
  startedAtMs: number(),
@@ -16505,20 +16735,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16505
16735
  }), UpdateFrameworkPackageResultSchema, {
16506
16736
  kind: "mutation",
16507
16737
  auth: "admin"
16508
- }), method(object({
16509
- nodeId: string(),
16510
- items: array(object({
16511
- name: string(),
16512
- version: string(),
16513
- isSystem: boolean()
16514
- })).readonly()
16515
- }), object({ id: string() }), {
16516
- kind: "mutation",
16517
- auth: "admin"
16518
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
16519
- kind: "mutation",
16520
- auth: "admin"
16521
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16738
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16522
16739
  kind: "mutation",
16523
16740
  auth: "admin"
16524
16741
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -16540,6 +16757,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16540
16757
  kind: "mutation",
16541
16758
  auth: "admin"
16542
16759
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
16760
+ kind: _enum([
16761
+ "install",
16762
+ "update",
16763
+ "uninstall",
16764
+ "restart"
16765
+ ]),
16766
+ targets: array(object({
16767
+ name: string().min(1),
16768
+ version: string().min(1)
16769
+ })).min(1),
16770
+ nodeIds: array(string()).optional()
16771
+ }), object({ jobId: string() }), {
16772
+ kind: "mutation",
16773
+ auth: "admin"
16774
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
16775
+ kind: "mutation",
16776
+ auth: "admin"
16777
+ }), method(object({
16543
16778
  addonId: string(),
16544
16779
  level: LogLevelSchema$1.optional()
16545
16780
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -16580,7 +16815,7 @@ Object.freeze({
16580
16815
  addonId: null,
16581
16816
  access: "create"
16582
16817
  },
16583
- "addons.cancelBulkUpdate": {
16818
+ "addons.cancelJob": {
16584
16819
  capName: "addons",
16585
16820
  capScope: "system",
16586
16821
  addonId: null,
@@ -16610,7 +16845,7 @@ Object.freeze({
16610
16845
  addonId: null,
16611
16846
  access: "view"
16612
16847
  },
16613
- "addons.getBulkUpdateState": {
16848
+ "addons.getJob": {
16614
16849
  capName: "addons",
16615
16850
  capScope: "system",
16616
16851
  addonId: null,
@@ -16658,19 +16893,19 @@ Object.freeze({
16658
16893
  addonId: null,
16659
16894
  access: "view"
16660
16895
  },
16661
- "addons.listActiveBulkUpdates": {
16896
+ "addons.listCapabilityProviders": {
16662
16897
  capName: "addons",
16663
16898
  capScope: "system",
16664
16899
  addonId: null,
16665
16900
  access: "view"
16666
16901
  },
16667
- "addons.listCapabilityProviders": {
16902
+ "addons.listFrameworkPackages": {
16668
16903
  capName: "addons",
16669
16904
  capScope: "system",
16670
16905
  addonId: null,
16671
16906
  access: "view"
16672
16907
  },
16673
- "addons.listFrameworkPackages": {
16908
+ "addons.listJobs": {
16674
16909
  capName: "addons",
16675
16910
  capScope: "system",
16676
16911
  addonId: null,
@@ -16754,7 +16989,7 @@ Object.freeze({
16754
16989
  addonId: null,
16755
16990
  access: "create"
16756
16991
  },
16757
- "addons.startBulkUpdate": {
16992
+ "addons.startJob": {
16758
16993
  capName: "addons",
16759
16994
  capScope: "system",
16760
16995
  addonId: null,
@@ -18980,6 +19215,12 @@ Object.freeze({
18980
19215
  addonId: null,
18981
19216
  access: "view"
18982
19217
  },
19218
+ "pipelineExecutor.getEngineProvisioning": {
19219
+ capName: "pipeline-executor",
19220
+ capScope: "system",
19221
+ addonId: null,
19222
+ access: "view"
19223
+ },
18983
19224
  "pipelineExecutor.getGlobalPipelineConfig": {
18984
19225
  capName: "pipeline-executor",
18985
19226
  capScope: "system",
@@ -19184,6 +19425,18 @@ Object.freeze({
19184
19425
  addonId: null,
19185
19426
  access: "view"
19186
19427
  },
19428
+ "pipelineOrchestrator.getCameraStatus": {
19429
+ capName: "pipeline-orchestrator",
19430
+ capScope: "system",
19431
+ addonId: null,
19432
+ access: "view"
19433
+ },
19434
+ "pipelineOrchestrator.getCameraStatuses": {
19435
+ capName: "pipeline-orchestrator",
19436
+ capScope: "system",
19437
+ addonId: null,
19438
+ access: "view"
19439
+ },
19187
19440
  "pipelineOrchestrator.getCameraStepOverrides": {
19188
19441
  capName: "pipeline-orchestrator",
19189
19442
  capScope: "system",
@@ -19268,6 +19521,12 @@ Object.freeze({
19268
19521
  addonId: null,
19269
19522
  access: "create"
19270
19523
  },
19524
+ "pipelineOrchestrator.setAgentMaxCameras": {
19525
+ capName: "pipeline-orchestrator",
19526
+ capScope: "system",
19527
+ addonId: null,
19528
+ access: "create"
19529
+ },
19271
19530
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19272
19531
  capName: "pipeline-orchestrator",
19273
19532
  capScope: "system",
@@ -20741,6 +21000,32 @@ Object.freeze({
20741
21000
  "network-access": "ingress",
20742
21001
  "smtp-provider": "email"
20743
21002
  });
21003
+ var frameworkSwapPackageSchema = object({
21004
+ name: string(),
21005
+ stagedPath: string(),
21006
+ backupPath: string(),
21007
+ toVersion: string(),
21008
+ fromVersion: string().nullable()
21009
+ });
21010
+ object({
21011
+ jobId: string(),
21012
+ taskId: string(),
21013
+ packages: array(frameworkSwapPackageSchema),
21014
+ requestedAtMs: number(),
21015
+ schemaVersion: literal(1)
21016
+ });
21017
+ object({
21018
+ jobId: string(),
21019
+ taskId: string(),
21020
+ backups: array(object({
21021
+ name: string(),
21022
+ backupPath: string(),
21023
+ livePath: string()
21024
+ })),
21025
+ appliedAtMs: number(),
21026
+ bootAttempts: number(),
21027
+ schemaVersion: literal(1)
21028
+ });
20744
21029
  //#endregion
20745
21030
  //#region src/custom-actions.ts
20746
21031
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-alexa",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "Alexa Smart Home Skill export — hub-side OAuth provider + directive handler. The companion AWS Lambda forwards Alexa directives to this addon's /addon/export-alexa/directive endpoint.",
5
5
  "keywords": [
6
6
  "camstack",