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