@camstack/addon-provider-reolink 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
@@ -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.
@@ -10585,6 +10598,24 @@ var DetectorOutputSchema = object({
10585
10598
  inferenceMs: number(),
10586
10599
  modelId: string()
10587
10600
  });
10601
+ var EngineProvisioningSchema = object({
10602
+ runtimeId: _enum([
10603
+ "onnx",
10604
+ "openvino",
10605
+ "coreml"
10606
+ ]).nullable(),
10607
+ device: string().nullable(),
10608
+ state: _enum([
10609
+ "idle",
10610
+ "installing",
10611
+ "verifying",
10612
+ "ready",
10613
+ "failed"
10614
+ ]),
10615
+ progress: number().optional(),
10616
+ error: string().optional(),
10617
+ nextRetryAt: number().optional()
10618
+ });
10588
10619
  var PipelineStepInputSchema = lazy(() => object({
10589
10620
  addonId: string(),
10590
10621
  modelId: string(),
@@ -10653,7 +10684,7 @@ var PipelineRunResultBridge = custom$2();
10653
10684
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
10654
10685
  kind: "mutation",
10655
10686
  auth: "admin"
10656
- }), method(_void(), record(string(), object({
10687
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
10657
10688
  modelId: string(),
10658
10689
  settings: record(string(), unknown()).readonly()
10659
10690
  }))), method(object({ steps: record(string(), object({
@@ -15821,7 +15852,10 @@ var AgentAddonConfigSchema = object({
15821
15852
  modelId: string(),
15822
15853
  settings: record(string(), unknown()).readonly()
15823
15854
  });
15824
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
15855
+ var AgentPipelineSettingsSchema = object({
15856
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
15857
+ maxCameras: number().int().nonnegative().nullable().default(null)
15858
+ });
15825
15859
  var CameraPipelineForAgentSchema = object({
15826
15860
  steps: array(PipelineStepInputSchema).readonly(),
15827
15861
  audio: object({
@@ -15923,6 +15957,133 @@ var GlobalMetricsSchema = object({
15923
15957
  * capability providers.
15924
15958
  */
15925
15959
  var CapabilityBindingsSchema = record(string(), string());
15960
+ /** Source block — always present; derives from the stream catalog. */
15961
+ var CameraSourceStatusSchema = object({ streams: array(object({
15962
+ camStreamId: string(),
15963
+ codec: string(),
15964
+ width: number(),
15965
+ height: number(),
15966
+ fps: number(),
15967
+ kind: string()
15968
+ })).readonly() });
15969
+ /** Assignment block — always present (orchestrator-local, no remote call). */
15970
+ var CameraAssignmentStatusSchema = object({
15971
+ detectionNodeId: string().nullable(),
15972
+ decoderNodeId: string().nullable(),
15973
+ audioNodeId: string().nullable(),
15974
+ pinned: object({
15975
+ detection: boolean(),
15976
+ decoder: boolean(),
15977
+ audio: boolean()
15978
+ }),
15979
+ reasons: object({
15980
+ detection: string().optional(),
15981
+ decoder: string().optional(),
15982
+ audio: string().optional()
15983
+ })
15984
+ });
15985
+ /** Broker block — null when the broker stage is unreachable or inactive. */
15986
+ var CameraBrokerStatusSchema = object({
15987
+ profiles: array(object({
15988
+ profile: string(),
15989
+ status: string(),
15990
+ codec: string(),
15991
+ width: number(),
15992
+ height: number(),
15993
+ subscribers: number(),
15994
+ inFps: number(),
15995
+ outFps: number()
15996
+ })).readonly(),
15997
+ webrtcSessions: number(),
15998
+ rtspRestream: boolean()
15999
+ });
16000
+ /** Shared-memory ring statistics within the decoder block. */
16001
+ var CameraDecoderShmSchema = object({
16002
+ framesWritten: number(),
16003
+ getFrameHits: number(),
16004
+ getFrameMisses: number(),
16005
+ budgetMb: number()
16006
+ });
16007
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
16008
+ var CameraDecoderStatusSchema = object({
16009
+ nodeId: string(),
16010
+ formats: array(string()).readonly(),
16011
+ sessionCount: number(),
16012
+ shm: CameraDecoderShmSchema
16013
+ });
16014
+ /** Motion block — null when motion detection is not active for this device. */
16015
+ var CameraMotionStatusSchema = object({
16016
+ enabled: boolean(),
16017
+ fps: number()
16018
+ });
16019
+ /** Detection provisioning sub-block. */
16020
+ var CameraDetectionProvisioningSchema = object({
16021
+ state: _enum([
16022
+ "idle",
16023
+ "installing",
16024
+ "verifying",
16025
+ "ready",
16026
+ "failed"
16027
+ ]),
16028
+ error: string().optional()
16029
+ });
16030
+ /** Detection phase — derived from the runner's engine phase. */
16031
+ var CameraDetectionPhaseSchema = _enum([
16032
+ "idle",
16033
+ "watching",
16034
+ "active"
16035
+ ]);
16036
+ /** Detection block — null when no detection node is assigned or reachable. */
16037
+ var CameraDetectionStatusSchema = object({
16038
+ nodeId: string(),
16039
+ engine: object({
16040
+ backend: string(),
16041
+ device: string()
16042
+ }),
16043
+ phase: CameraDetectionPhaseSchema,
16044
+ configuredFps: number(),
16045
+ actualFps: number(),
16046
+ queueDepth: number(),
16047
+ avgInferenceMs: number(),
16048
+ provisioning: CameraDetectionProvisioningSchema
16049
+ });
16050
+ /** Audio block — null when no audio node is assigned or reachable. */
16051
+ var CameraAudioStatusSchema = object({
16052
+ nodeId: string(),
16053
+ enabled: boolean()
16054
+ });
16055
+ /** Recording block — null when no recording cap is active for this device. */
16056
+ var CameraRecordingStatusSchema = object({
16057
+ mode: _enum([
16058
+ "off",
16059
+ "continuous",
16060
+ "events"
16061
+ ]),
16062
+ active: boolean(),
16063
+ storageBytes: number()
16064
+ });
16065
+ /**
16066
+ * Aggregated per-camera pipeline status — server-composed, single call.
16067
+ *
16068
+ * The `assignment` and `source` blocks are always present.
16069
+ * Every other block is `null` when the stage is inactive or unreachable
16070
+ * during the bounded parallel fan-out in the orchestrator implementation.
16071
+ *
16072
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
16073
+ */
16074
+ var CameraStatusSchema = object({
16075
+ deviceId: number(),
16076
+ assignment: CameraAssignmentStatusSchema,
16077
+ source: CameraSourceStatusSchema,
16078
+ broker: CameraBrokerStatusSchema.nullable(),
16079
+ decoder: CameraDecoderStatusSchema.nullable(),
16080
+ motion: CameraMotionStatusSchema.nullable(),
16081
+ detection: CameraDetectionStatusSchema.nullable(),
16082
+ audio: CameraAudioStatusSchema.nullable(),
16083
+ recording: CameraRecordingStatusSchema.nullable(),
16084
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
16085
+ fetchedAt: number()
16086
+ });
15926
16087
  method(object({
15927
16088
  deviceId: number(),
15928
16089
  agentNodeId: string()
@@ -15990,6 +16151,12 @@ method(object({
15990
16151
  }), {
15991
16152
  kind: "mutation",
15992
16153
  auth: "admin"
16154
+ }), method(object({
16155
+ agentNodeId: string(),
16156
+ maxCameras: number().int().nonnegative().nullable()
16157
+ }), object({ success: literal(true) }), {
16158
+ kind: "mutation",
16159
+ auth: "admin"
15993
16160
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
15994
16161
  deviceId: number(),
15995
16162
  addonId: string(),
@@ -16015,7 +16182,7 @@ method(object({
16015
16182
  }), method(object({
16016
16183
  deviceId: number(),
16017
16184
  agentNodeId: string().optional()
16018
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
16185
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
16019
16186
  name: string(),
16020
16187
  description: string().optional(),
16021
16188
  config: CameraPipelineConfigSchema
@@ -19351,6 +19518,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
19351
19518
  kind: "mutation",
19352
19519
  auth: "admin"
19353
19520
  });
19521
+ var jobKindSchema = _enum([
19522
+ "install",
19523
+ "update",
19524
+ "uninstall",
19525
+ "restart"
19526
+ ]);
19527
+ var taskPhaseSchema = _enum([
19528
+ "queued",
19529
+ "fetching",
19530
+ "staged",
19531
+ "validating",
19532
+ "applying",
19533
+ "restarting",
19534
+ "applied",
19535
+ "done",
19536
+ "failed",
19537
+ "skipped"
19538
+ ]);
19539
+ var taskTargetSchema = _enum(["framework", "addon"]);
19540
+ var taskLogEntrySchema = object({
19541
+ tsMs: number(),
19542
+ nodeId: string(),
19543
+ packageName: string(),
19544
+ phase: taskPhaseSchema,
19545
+ message: string()
19546
+ });
19547
+ var lifecycleTaskSchema = object({
19548
+ taskId: string(),
19549
+ nodeId: string(),
19550
+ packageName: string(),
19551
+ fromVersion: string().nullable(),
19552
+ toVersion: string(),
19553
+ target: taskTargetSchema,
19554
+ phase: taskPhaseSchema,
19555
+ stagedPath: string().nullable(),
19556
+ attempts: number(),
19557
+ steps: array(taskLogEntrySchema),
19558
+ error: string().nullable(),
19559
+ startedAtMs: number().nullable(),
19560
+ finishedAtMs: number().nullable()
19561
+ });
19562
+ var lifecycleJobStateSchema = _enum([
19563
+ "running",
19564
+ "completed",
19565
+ "failed",
19566
+ "partially-failed",
19567
+ "cancelled"
19568
+ ]);
19569
+ var lifecycleJobScopeSchema = _enum([
19570
+ "single",
19571
+ "bulk",
19572
+ "cluster"
19573
+ ]);
19574
+ var lifecycleJobSchema = object({
19575
+ jobId: string(),
19576
+ kind: jobKindSchema,
19577
+ createdAtMs: number(),
19578
+ createdBy: string(),
19579
+ scope: lifecycleJobScopeSchema,
19580
+ tasks: array(lifecycleTaskSchema),
19581
+ state: lifecycleJobStateSchema,
19582
+ schemaVersion: literal(1)
19583
+ });
19354
19584
  /**
19355
19585
  * addons — system-scoped singleton capability for addon package
19356
19586
  * management (install, update, configure, restart) and per-addon log
@@ -19533,7 +19763,7 @@ var BulkUpdatePhaseSchema = _enum([
19533
19763
  "restarting",
19534
19764
  "finalizing"
19535
19765
  ]);
19536
- var BulkUpdateStateSchema = object({
19766
+ object({
19537
19767
  id: string(),
19538
19768
  nodeId: string(),
19539
19769
  startedAtMs: number(),
@@ -19636,20 +19866,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
19636
19866
  }), UpdateFrameworkPackageResultSchema, {
19637
19867
  kind: "mutation",
19638
19868
  auth: "admin"
19639
- }), method(object({
19640
- nodeId: string(),
19641
- items: array(object({
19642
- name: string(),
19643
- version: string(),
19644
- isSystem: boolean()
19645
- })).readonly()
19646
- }), object({ id: string() }), {
19647
- kind: "mutation",
19648
- auth: "admin"
19649
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
19650
- kind: "mutation",
19651
- auth: "admin"
19652
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
19869
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
19653
19870
  kind: "mutation",
19654
19871
  auth: "admin"
19655
19872
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -19671,6 +19888,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
19671
19888
  kind: "mutation",
19672
19889
  auth: "admin"
19673
19890
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
19891
+ kind: _enum([
19892
+ "install",
19893
+ "update",
19894
+ "uninstall",
19895
+ "restart"
19896
+ ]),
19897
+ targets: array(object({
19898
+ name: string().min(1),
19899
+ version: string().min(1)
19900
+ })).min(1),
19901
+ nodeIds: array(string()).optional()
19902
+ }), object({ jobId: string() }), {
19903
+ kind: "mutation",
19904
+ auth: "admin"
19905
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
19906
+ kind: "mutation",
19907
+ auth: "admin"
19908
+ }), method(object({
19674
19909
  addonId: string(),
19675
19910
  level: LogLevelSchema$1.optional()
19676
19911
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -19711,7 +19946,7 @@ Object.freeze({
19711
19946
  addonId: null,
19712
19947
  access: "create"
19713
19948
  },
19714
- "addons.cancelBulkUpdate": {
19949
+ "addons.cancelJob": {
19715
19950
  capName: "addons",
19716
19951
  capScope: "system",
19717
19952
  addonId: null,
@@ -19741,7 +19976,7 @@ Object.freeze({
19741
19976
  addonId: null,
19742
19977
  access: "view"
19743
19978
  },
19744
- "addons.getBulkUpdateState": {
19979
+ "addons.getJob": {
19745
19980
  capName: "addons",
19746
19981
  capScope: "system",
19747
19982
  addonId: null,
@@ -19789,19 +20024,19 @@ Object.freeze({
19789
20024
  addonId: null,
19790
20025
  access: "view"
19791
20026
  },
19792
- "addons.listActiveBulkUpdates": {
20027
+ "addons.listCapabilityProviders": {
19793
20028
  capName: "addons",
19794
20029
  capScope: "system",
19795
20030
  addonId: null,
19796
20031
  access: "view"
19797
20032
  },
19798
- "addons.listCapabilityProviders": {
20033
+ "addons.listFrameworkPackages": {
19799
20034
  capName: "addons",
19800
20035
  capScope: "system",
19801
20036
  addonId: null,
19802
20037
  access: "view"
19803
20038
  },
19804
- "addons.listFrameworkPackages": {
20039
+ "addons.listJobs": {
19805
20040
  capName: "addons",
19806
20041
  capScope: "system",
19807
20042
  addonId: null,
@@ -19885,7 +20120,7 @@ Object.freeze({
19885
20120
  addonId: null,
19886
20121
  access: "create"
19887
20122
  },
19888
- "addons.startBulkUpdate": {
20123
+ "addons.startJob": {
19889
20124
  capName: "addons",
19890
20125
  capScope: "system",
19891
20126
  addonId: null,
@@ -22111,6 +22346,12 @@ Object.freeze({
22111
22346
  addonId: null,
22112
22347
  access: "view"
22113
22348
  },
22349
+ "pipelineExecutor.getEngineProvisioning": {
22350
+ capName: "pipeline-executor",
22351
+ capScope: "system",
22352
+ addonId: null,
22353
+ access: "view"
22354
+ },
22114
22355
  "pipelineExecutor.getGlobalPipelineConfig": {
22115
22356
  capName: "pipeline-executor",
22116
22357
  capScope: "system",
@@ -22315,6 +22556,18 @@ Object.freeze({
22315
22556
  addonId: null,
22316
22557
  access: "view"
22317
22558
  },
22559
+ "pipelineOrchestrator.getCameraStatus": {
22560
+ capName: "pipeline-orchestrator",
22561
+ capScope: "system",
22562
+ addonId: null,
22563
+ access: "view"
22564
+ },
22565
+ "pipelineOrchestrator.getCameraStatuses": {
22566
+ capName: "pipeline-orchestrator",
22567
+ capScope: "system",
22568
+ addonId: null,
22569
+ access: "view"
22570
+ },
22318
22571
  "pipelineOrchestrator.getCameraStepOverrides": {
22319
22572
  capName: "pipeline-orchestrator",
22320
22573
  capScope: "system",
@@ -22399,6 +22652,12 @@ Object.freeze({
22399
22652
  addonId: null,
22400
22653
  access: "create"
22401
22654
  },
22655
+ "pipelineOrchestrator.setAgentMaxCameras": {
22656
+ capName: "pipeline-orchestrator",
22657
+ capScope: "system",
22658
+ addonId: null,
22659
+ access: "create"
22660
+ },
22402
22661
  "pipelineOrchestrator.setCameraPipelineForAgent": {
22403
22662
  capName: "pipeline-orchestrator",
22404
22663
  capScope: "system",
@@ -23872,6 +24131,32 @@ Object.freeze({
23872
24131
  "network-access": "ingress",
23873
24132
  "smtp-provider": "email"
23874
24133
  });
24134
+ var frameworkSwapPackageSchema = object({
24135
+ name: string(),
24136
+ stagedPath: string(),
24137
+ backupPath: string(),
24138
+ toVersion: string(),
24139
+ fromVersion: string().nullable()
24140
+ });
24141
+ object({
24142
+ jobId: string(),
24143
+ taskId: string(),
24144
+ packages: array(frameworkSwapPackageSchema),
24145
+ requestedAtMs: number(),
24146
+ schemaVersion: literal(1)
24147
+ });
24148
+ object({
24149
+ jobId: string(),
24150
+ taskId: string(),
24151
+ backups: array(object({
24152
+ name: string(),
24153
+ backupPath: string(),
24154
+ livePath: string()
24155
+ })),
24156
+ appliedAtMs: number(),
24157
+ bootAttempts: number(),
24158
+ schemaVersion: literal(1)
24159
+ });
23875
24160
  /**
23876
24161
  * Promise-based timer helpers — used everywhere the codebase needs to
23877
24162
  * wait, back off, or schedule a retry. Before these helpers landed, each
package/dist/addon.mjs CHANGED
@@ -5004,6 +5004,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5004
5004
  */
5005
5005
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
5006
5006
  /**
5007
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
5008
+ * the detection-pipeline provider on every state change of its lazy
5009
+ * engine-provisioning machine (idle → installing → verifying → ready,
5010
+ * or → failed with a `nextRetryAt`). Payload is the
5011
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
5012
+ * node. The Pipeline page subscribes to drive a live "installing
5013
+ * OpenVINO… / ready" indicator per node without polling
5014
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
5015
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
5016
+ */
5017
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
5018
+ /**
5007
5019
  * Cluster topology snapshot. Carries the same payload returned by
5008
5020
  * `nodes.topology` (every reachable node + addons + processes).
5009
5021
  * Emitted by the hub on any agent / addon lifecycle change
@@ -5153,14 +5165,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5153
5165
  EventCategory["DeviceSleeping"] = "device.sleeping";
5154
5166
  EventCategory["RetentionCleanup"] = "retention.cleanup";
5155
5167
  /**
5156
- * Progress snapshot emitted by `BulkUpdateCoordinator` on every state
5157
- * transition (item status change, phase change, completion, cancel).
5158
- * Payload is `BulkUpdateState`. Admin UI subscribes via `useLiveEvent`
5159
- * to drive the sticky `BulkUpdateBanner` and per-row `AddonRowBadge`.
5160
- *
5161
- * Spec: docs/superpowers/specs/2026-05-21-addons-bulk-update-progress-design.md
5168
+ * Legacy bulk-update progress snapshot (payload `BulkUpdateState`). No longer
5169
+ * emitted F3 removed the coordinator that produced it; "Update all" now runs
5170
+ * as one lifecycle engine job (`AddonsJobProgress`/`AddonsJobLog`). Retained
5171
+ * (with `BulkUpdateState`) only to avoid regenerating the event maps; removed
5172
+ * in F4 once live bulk progress is re-implemented over the engine events.
5162
5173
  */
5163
5174
  EventCategory["AddonsBulkUpdateProgress"] = "addons.bulk-update-progress";
5175
+ EventCategory["AddonsJobProgress"] = "addons.job-progress";
5176
+ EventCategory["AddonsJobLog"] = "addons.job-log";
5164
5177
  /**
5165
5178
  * A container's child visibility toggled (hidden/shown). Emitted by the
5166
5179
  * `accessories` cap when a child device is hidden or revealed.
@@ -10580,6 +10593,24 @@ var DetectorOutputSchema = object({
10580
10593
  inferenceMs: number(),
10581
10594
  modelId: string()
10582
10595
  });
10596
+ var EngineProvisioningSchema = object({
10597
+ runtimeId: _enum([
10598
+ "onnx",
10599
+ "openvino",
10600
+ "coreml"
10601
+ ]).nullable(),
10602
+ device: string().nullable(),
10603
+ state: _enum([
10604
+ "idle",
10605
+ "installing",
10606
+ "verifying",
10607
+ "ready",
10608
+ "failed"
10609
+ ]),
10610
+ progress: number().optional(),
10611
+ error: string().optional(),
10612
+ nextRetryAt: number().optional()
10613
+ });
10583
10614
  var PipelineStepInputSchema = lazy(() => object({
10584
10615
  addonId: string(),
10585
10616
  modelId: string(),
@@ -10648,7 +10679,7 @@ var PipelineRunResultBridge = custom$2();
10648
10679
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
10649
10680
  kind: "mutation",
10650
10681
  auth: "admin"
10651
- }), method(_void(), record(string(), object({
10682
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
10652
10683
  modelId: string(),
10653
10684
  settings: record(string(), unknown()).readonly()
10654
10685
  }))), method(object({ steps: record(string(), object({
@@ -15816,7 +15847,10 @@ var AgentAddonConfigSchema = object({
15816
15847
  modelId: string(),
15817
15848
  settings: record(string(), unknown()).readonly()
15818
15849
  });
15819
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
15850
+ var AgentPipelineSettingsSchema = object({
15851
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
15852
+ maxCameras: number().int().nonnegative().nullable().default(null)
15853
+ });
15820
15854
  var CameraPipelineForAgentSchema = object({
15821
15855
  steps: array(PipelineStepInputSchema).readonly(),
15822
15856
  audio: object({
@@ -15918,6 +15952,133 @@ var GlobalMetricsSchema = object({
15918
15952
  * capability providers.
15919
15953
  */
15920
15954
  var CapabilityBindingsSchema = record(string(), string());
15955
+ /** Source block — always present; derives from the stream catalog. */
15956
+ var CameraSourceStatusSchema = object({ streams: array(object({
15957
+ camStreamId: string(),
15958
+ codec: string(),
15959
+ width: number(),
15960
+ height: number(),
15961
+ fps: number(),
15962
+ kind: string()
15963
+ })).readonly() });
15964
+ /** Assignment block — always present (orchestrator-local, no remote call). */
15965
+ var CameraAssignmentStatusSchema = object({
15966
+ detectionNodeId: string().nullable(),
15967
+ decoderNodeId: string().nullable(),
15968
+ audioNodeId: string().nullable(),
15969
+ pinned: object({
15970
+ detection: boolean(),
15971
+ decoder: boolean(),
15972
+ audio: boolean()
15973
+ }),
15974
+ reasons: object({
15975
+ detection: string().optional(),
15976
+ decoder: string().optional(),
15977
+ audio: string().optional()
15978
+ })
15979
+ });
15980
+ /** Broker block — null when the broker stage is unreachable or inactive. */
15981
+ var CameraBrokerStatusSchema = object({
15982
+ profiles: array(object({
15983
+ profile: string(),
15984
+ status: string(),
15985
+ codec: string(),
15986
+ width: number(),
15987
+ height: number(),
15988
+ subscribers: number(),
15989
+ inFps: number(),
15990
+ outFps: number()
15991
+ })).readonly(),
15992
+ webrtcSessions: number(),
15993
+ rtspRestream: boolean()
15994
+ });
15995
+ /** Shared-memory ring statistics within the decoder block. */
15996
+ var CameraDecoderShmSchema = object({
15997
+ framesWritten: number(),
15998
+ getFrameHits: number(),
15999
+ getFrameMisses: number(),
16000
+ budgetMb: number()
16001
+ });
16002
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
16003
+ var CameraDecoderStatusSchema = object({
16004
+ nodeId: string(),
16005
+ formats: array(string()).readonly(),
16006
+ sessionCount: number(),
16007
+ shm: CameraDecoderShmSchema
16008
+ });
16009
+ /** Motion block — null when motion detection is not active for this device. */
16010
+ var CameraMotionStatusSchema = object({
16011
+ enabled: boolean(),
16012
+ fps: number()
16013
+ });
16014
+ /** Detection provisioning sub-block. */
16015
+ var CameraDetectionProvisioningSchema = object({
16016
+ state: _enum([
16017
+ "idle",
16018
+ "installing",
16019
+ "verifying",
16020
+ "ready",
16021
+ "failed"
16022
+ ]),
16023
+ error: string().optional()
16024
+ });
16025
+ /** Detection phase — derived from the runner's engine phase. */
16026
+ var CameraDetectionPhaseSchema = _enum([
16027
+ "idle",
16028
+ "watching",
16029
+ "active"
16030
+ ]);
16031
+ /** Detection block — null when no detection node is assigned or reachable. */
16032
+ var CameraDetectionStatusSchema = object({
16033
+ nodeId: string(),
16034
+ engine: object({
16035
+ backend: string(),
16036
+ device: string()
16037
+ }),
16038
+ phase: CameraDetectionPhaseSchema,
16039
+ configuredFps: number(),
16040
+ actualFps: number(),
16041
+ queueDepth: number(),
16042
+ avgInferenceMs: number(),
16043
+ provisioning: CameraDetectionProvisioningSchema
16044
+ });
16045
+ /** Audio block — null when no audio node is assigned or reachable. */
16046
+ var CameraAudioStatusSchema = object({
16047
+ nodeId: string(),
16048
+ enabled: boolean()
16049
+ });
16050
+ /** Recording block — null when no recording cap is active for this device. */
16051
+ var CameraRecordingStatusSchema = object({
16052
+ mode: _enum([
16053
+ "off",
16054
+ "continuous",
16055
+ "events"
16056
+ ]),
16057
+ active: boolean(),
16058
+ storageBytes: number()
16059
+ });
16060
+ /**
16061
+ * Aggregated per-camera pipeline status — server-composed, single call.
16062
+ *
16063
+ * The `assignment` and `source` blocks are always present.
16064
+ * Every other block is `null` when the stage is inactive or unreachable
16065
+ * during the bounded parallel fan-out in the orchestrator implementation.
16066
+ *
16067
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
16068
+ */
16069
+ var CameraStatusSchema = object({
16070
+ deviceId: number(),
16071
+ assignment: CameraAssignmentStatusSchema,
16072
+ source: CameraSourceStatusSchema,
16073
+ broker: CameraBrokerStatusSchema.nullable(),
16074
+ decoder: CameraDecoderStatusSchema.nullable(),
16075
+ motion: CameraMotionStatusSchema.nullable(),
16076
+ detection: CameraDetectionStatusSchema.nullable(),
16077
+ audio: CameraAudioStatusSchema.nullable(),
16078
+ recording: CameraRecordingStatusSchema.nullable(),
16079
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
16080
+ fetchedAt: number()
16081
+ });
15921
16082
  method(object({
15922
16083
  deviceId: number(),
15923
16084
  agentNodeId: string()
@@ -15985,6 +16146,12 @@ method(object({
15985
16146
  }), {
15986
16147
  kind: "mutation",
15987
16148
  auth: "admin"
16149
+ }), method(object({
16150
+ agentNodeId: string(),
16151
+ maxCameras: number().int().nonnegative().nullable()
16152
+ }), object({ success: literal(true) }), {
16153
+ kind: "mutation",
16154
+ auth: "admin"
15988
16155
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
15989
16156
  deviceId: number(),
15990
16157
  addonId: string(),
@@ -16010,7 +16177,7 @@ method(object({
16010
16177
  }), method(object({
16011
16178
  deviceId: number(),
16012
16179
  agentNodeId: string().optional()
16013
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
16180
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
16014
16181
  name: string(),
16015
16182
  description: string().optional(),
16016
16183
  config: CameraPipelineConfigSchema
@@ -19346,6 +19513,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
19346
19513
  kind: "mutation",
19347
19514
  auth: "admin"
19348
19515
  });
19516
+ var jobKindSchema = _enum([
19517
+ "install",
19518
+ "update",
19519
+ "uninstall",
19520
+ "restart"
19521
+ ]);
19522
+ var taskPhaseSchema = _enum([
19523
+ "queued",
19524
+ "fetching",
19525
+ "staged",
19526
+ "validating",
19527
+ "applying",
19528
+ "restarting",
19529
+ "applied",
19530
+ "done",
19531
+ "failed",
19532
+ "skipped"
19533
+ ]);
19534
+ var taskTargetSchema = _enum(["framework", "addon"]);
19535
+ var taskLogEntrySchema = object({
19536
+ tsMs: number(),
19537
+ nodeId: string(),
19538
+ packageName: string(),
19539
+ phase: taskPhaseSchema,
19540
+ message: string()
19541
+ });
19542
+ var lifecycleTaskSchema = object({
19543
+ taskId: string(),
19544
+ nodeId: string(),
19545
+ packageName: string(),
19546
+ fromVersion: string().nullable(),
19547
+ toVersion: string(),
19548
+ target: taskTargetSchema,
19549
+ phase: taskPhaseSchema,
19550
+ stagedPath: string().nullable(),
19551
+ attempts: number(),
19552
+ steps: array(taskLogEntrySchema),
19553
+ error: string().nullable(),
19554
+ startedAtMs: number().nullable(),
19555
+ finishedAtMs: number().nullable()
19556
+ });
19557
+ var lifecycleJobStateSchema = _enum([
19558
+ "running",
19559
+ "completed",
19560
+ "failed",
19561
+ "partially-failed",
19562
+ "cancelled"
19563
+ ]);
19564
+ var lifecycleJobScopeSchema = _enum([
19565
+ "single",
19566
+ "bulk",
19567
+ "cluster"
19568
+ ]);
19569
+ var lifecycleJobSchema = object({
19570
+ jobId: string(),
19571
+ kind: jobKindSchema,
19572
+ createdAtMs: number(),
19573
+ createdBy: string(),
19574
+ scope: lifecycleJobScopeSchema,
19575
+ tasks: array(lifecycleTaskSchema),
19576
+ state: lifecycleJobStateSchema,
19577
+ schemaVersion: literal(1)
19578
+ });
19349
19579
  /**
19350
19580
  * addons — system-scoped singleton capability for addon package
19351
19581
  * management (install, update, configure, restart) and per-addon log
@@ -19528,7 +19758,7 @@ var BulkUpdatePhaseSchema = _enum([
19528
19758
  "restarting",
19529
19759
  "finalizing"
19530
19760
  ]);
19531
- var BulkUpdateStateSchema = object({
19761
+ object({
19532
19762
  id: string(),
19533
19763
  nodeId: string(),
19534
19764
  startedAtMs: number(),
@@ -19631,20 +19861,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
19631
19861
  }), UpdateFrameworkPackageResultSchema, {
19632
19862
  kind: "mutation",
19633
19863
  auth: "admin"
19634
- }), method(object({
19635
- nodeId: string(),
19636
- items: array(object({
19637
- name: string(),
19638
- version: string(),
19639
- isSystem: boolean()
19640
- })).readonly()
19641
- }), object({ id: string() }), {
19642
- kind: "mutation",
19643
- auth: "admin"
19644
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
19645
- kind: "mutation",
19646
- auth: "admin"
19647
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
19864
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
19648
19865
  kind: "mutation",
19649
19866
  auth: "admin"
19650
19867
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -19666,6 +19883,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
19666
19883
  kind: "mutation",
19667
19884
  auth: "admin"
19668
19885
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
19886
+ kind: _enum([
19887
+ "install",
19888
+ "update",
19889
+ "uninstall",
19890
+ "restart"
19891
+ ]),
19892
+ targets: array(object({
19893
+ name: string().min(1),
19894
+ version: string().min(1)
19895
+ })).min(1),
19896
+ nodeIds: array(string()).optional()
19897
+ }), object({ jobId: string() }), {
19898
+ kind: "mutation",
19899
+ auth: "admin"
19900
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
19901
+ kind: "mutation",
19902
+ auth: "admin"
19903
+ }), method(object({
19669
19904
  addonId: string(),
19670
19905
  level: LogLevelSchema$1.optional()
19671
19906
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -19706,7 +19941,7 @@ Object.freeze({
19706
19941
  addonId: null,
19707
19942
  access: "create"
19708
19943
  },
19709
- "addons.cancelBulkUpdate": {
19944
+ "addons.cancelJob": {
19710
19945
  capName: "addons",
19711
19946
  capScope: "system",
19712
19947
  addonId: null,
@@ -19736,7 +19971,7 @@ Object.freeze({
19736
19971
  addonId: null,
19737
19972
  access: "view"
19738
19973
  },
19739
- "addons.getBulkUpdateState": {
19974
+ "addons.getJob": {
19740
19975
  capName: "addons",
19741
19976
  capScope: "system",
19742
19977
  addonId: null,
@@ -19784,19 +20019,19 @@ Object.freeze({
19784
20019
  addonId: null,
19785
20020
  access: "view"
19786
20021
  },
19787
- "addons.listActiveBulkUpdates": {
20022
+ "addons.listCapabilityProviders": {
19788
20023
  capName: "addons",
19789
20024
  capScope: "system",
19790
20025
  addonId: null,
19791
20026
  access: "view"
19792
20027
  },
19793
- "addons.listCapabilityProviders": {
20028
+ "addons.listFrameworkPackages": {
19794
20029
  capName: "addons",
19795
20030
  capScope: "system",
19796
20031
  addonId: null,
19797
20032
  access: "view"
19798
20033
  },
19799
- "addons.listFrameworkPackages": {
20034
+ "addons.listJobs": {
19800
20035
  capName: "addons",
19801
20036
  capScope: "system",
19802
20037
  addonId: null,
@@ -19880,7 +20115,7 @@ Object.freeze({
19880
20115
  addonId: null,
19881
20116
  access: "create"
19882
20117
  },
19883
- "addons.startBulkUpdate": {
20118
+ "addons.startJob": {
19884
20119
  capName: "addons",
19885
20120
  capScope: "system",
19886
20121
  addonId: null,
@@ -22106,6 +22341,12 @@ Object.freeze({
22106
22341
  addonId: null,
22107
22342
  access: "view"
22108
22343
  },
22344
+ "pipelineExecutor.getEngineProvisioning": {
22345
+ capName: "pipeline-executor",
22346
+ capScope: "system",
22347
+ addonId: null,
22348
+ access: "view"
22349
+ },
22109
22350
  "pipelineExecutor.getGlobalPipelineConfig": {
22110
22351
  capName: "pipeline-executor",
22111
22352
  capScope: "system",
@@ -22310,6 +22551,18 @@ Object.freeze({
22310
22551
  addonId: null,
22311
22552
  access: "view"
22312
22553
  },
22554
+ "pipelineOrchestrator.getCameraStatus": {
22555
+ capName: "pipeline-orchestrator",
22556
+ capScope: "system",
22557
+ addonId: null,
22558
+ access: "view"
22559
+ },
22560
+ "pipelineOrchestrator.getCameraStatuses": {
22561
+ capName: "pipeline-orchestrator",
22562
+ capScope: "system",
22563
+ addonId: null,
22564
+ access: "view"
22565
+ },
22313
22566
  "pipelineOrchestrator.getCameraStepOverrides": {
22314
22567
  capName: "pipeline-orchestrator",
22315
22568
  capScope: "system",
@@ -22394,6 +22647,12 @@ Object.freeze({
22394
22647
  addonId: null,
22395
22648
  access: "create"
22396
22649
  },
22650
+ "pipelineOrchestrator.setAgentMaxCameras": {
22651
+ capName: "pipeline-orchestrator",
22652
+ capScope: "system",
22653
+ addonId: null,
22654
+ access: "create"
22655
+ },
22397
22656
  "pipelineOrchestrator.setCameraPipelineForAgent": {
22398
22657
  capName: "pipeline-orchestrator",
22399
22658
  capScope: "system",
@@ -23867,6 +24126,32 @@ Object.freeze({
23867
24126
  "network-access": "ingress",
23868
24127
  "smtp-provider": "email"
23869
24128
  });
24129
+ var frameworkSwapPackageSchema = object({
24130
+ name: string(),
24131
+ stagedPath: string(),
24132
+ backupPath: string(),
24133
+ toVersion: string(),
24134
+ fromVersion: string().nullable()
24135
+ });
24136
+ object({
24137
+ jobId: string(),
24138
+ taskId: string(),
24139
+ packages: array(frameworkSwapPackageSchema),
24140
+ requestedAtMs: number(),
24141
+ schemaVersion: literal(1)
24142
+ });
24143
+ object({
24144
+ jobId: string(),
24145
+ taskId: string(),
24146
+ backups: array(object({
24147
+ name: string(),
24148
+ backupPath: string(),
24149
+ livePath: string()
24150
+ })),
24151
+ appliedAtMs: number(),
24152
+ bootAttempts: number(),
24153
+ schemaVersion: literal(1)
24154
+ });
23870
24155
  /**
23871
24156
  * Promise-based timer helpers — used everywhere the codebase needs to
23872
24157
  * wait, back off, or schedule a retry. Before these helpers landed, each
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-reolink",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "Reolink camera device provider addon for CamStack — native Baichuan protocol",
5
5
  "keywords": [
6
6
  "camstack",