@camstack/addon-smtp-nodemailer 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.
@@ -5019,6 +5019,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5019
5019
  */
5020
5020
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
5021
5021
  /**
5022
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
5023
+ * the detection-pipeline provider on every state change of its lazy
5024
+ * engine-provisioning machine (idle → installing → verifying → ready,
5025
+ * or → failed with a `nextRetryAt`). Payload is the
5026
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
5027
+ * node. The Pipeline page subscribes to drive a live "installing
5028
+ * OpenVINO… / ready" indicator per node without polling
5029
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
5030
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
5031
+ */
5032
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
5033
+ /**
5022
5034
  * Cluster topology snapshot. Carries the same payload returned by
5023
5035
  * `nodes.topology` (every reachable node + addons + processes).
5024
5036
  * Emitted by the hub on any agent / addon lifecycle change
@@ -5168,14 +5180,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5168
5180
  EventCategory["DeviceSleeping"] = "device.sleeping";
5169
5181
  EventCategory["RetentionCleanup"] = "retention.cleanup";
5170
5182
  /**
5171
- * Progress snapshot emitted by `BulkUpdateCoordinator` on every state
5172
- * transition (item status change, phase change, completion, cancel).
5173
- * Payload is `BulkUpdateState`. Admin UI subscribes via `useLiveEvent`
5174
- * to drive the sticky `BulkUpdateBanner` and per-row `AddonRowBadge`.
5175
- *
5176
- * Spec: docs/superpowers/specs/2026-05-21-addons-bulk-update-progress-design.md
5183
+ * Legacy bulk-update progress snapshot (payload `BulkUpdateState`). No longer
5184
+ * emitted F3 removed the coordinator that produced it; "Update all" now runs
5185
+ * as one lifecycle engine job (`AddonsJobProgress`/`AddonsJobLog`). Retained
5186
+ * (with `BulkUpdateState`) only to avoid regenerating the event maps; removed
5187
+ * in F4 once live bulk progress is re-implemented over the engine events.
5177
5188
  */
5178
5189
  EventCategory["AddonsBulkUpdateProgress"] = "addons.bulk-update-progress";
5190
+ EventCategory["AddonsJobProgress"] = "addons.job-progress";
5191
+ EventCategory["AddonsJobLog"] = "addons.job-log";
5179
5192
  /**
5180
5193
  * A container's child visibility toggled (hidden/shown). Emitted by the
5181
5194
  * `accessories` cap when a child device is hidden or revealed.
@@ -9182,6 +9195,24 @@ var DetectorOutputSchema = object({
9182
9195
  inferenceMs: number(),
9183
9196
  modelId: string()
9184
9197
  });
9198
+ var EngineProvisioningSchema = object({
9199
+ runtimeId: _enum([
9200
+ "onnx",
9201
+ "openvino",
9202
+ "coreml"
9203
+ ]).nullable(),
9204
+ device: string().nullable(),
9205
+ state: _enum([
9206
+ "idle",
9207
+ "installing",
9208
+ "verifying",
9209
+ "ready",
9210
+ "failed"
9211
+ ]),
9212
+ progress: number().optional(),
9213
+ error: string().optional(),
9214
+ nextRetryAt: number().optional()
9215
+ });
9185
9216
  var PipelineStepInputSchema = lazy(() => object({
9186
9217
  addonId: string(),
9187
9218
  modelId: string(),
@@ -9250,7 +9281,7 @@ var PipelineRunResultBridge = custom();
9250
9281
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
9251
9282
  kind: "mutation",
9252
9283
  auth: "admin"
9253
- }), method(_void(), record(string(), object({
9284
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
9254
9285
  modelId: string(),
9255
9286
  settings: record(string(), unknown()).readonly()
9256
9287
  }))), method(object({ steps: record(string(), object({
@@ -12850,7 +12881,10 @@ var AgentAddonConfigSchema = object({
12850
12881
  modelId: string(),
12851
12882
  settings: record(string(), unknown()).readonly()
12852
12883
  });
12853
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
12884
+ var AgentPipelineSettingsSchema = object({
12885
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
12886
+ maxCameras: number().int().nonnegative().nullable().default(null)
12887
+ });
12854
12888
  var CameraPipelineForAgentSchema = object({
12855
12889
  steps: array(PipelineStepInputSchema).readonly(),
12856
12890
  audio: object({
@@ -12952,6 +12986,133 @@ var GlobalMetricsSchema = object({
12952
12986
  * capability providers.
12953
12987
  */
12954
12988
  var CapabilityBindingsSchema = record(string(), string());
12989
+ /** Source block — always present; derives from the stream catalog. */
12990
+ var CameraSourceStatusSchema = object({ streams: array(object({
12991
+ camStreamId: string(),
12992
+ codec: string(),
12993
+ width: number(),
12994
+ height: number(),
12995
+ fps: number(),
12996
+ kind: string()
12997
+ })).readonly() });
12998
+ /** Assignment block — always present (orchestrator-local, no remote call). */
12999
+ var CameraAssignmentStatusSchema = object({
13000
+ detectionNodeId: string().nullable(),
13001
+ decoderNodeId: string().nullable(),
13002
+ audioNodeId: string().nullable(),
13003
+ pinned: object({
13004
+ detection: boolean(),
13005
+ decoder: boolean(),
13006
+ audio: boolean()
13007
+ }),
13008
+ reasons: object({
13009
+ detection: string().optional(),
13010
+ decoder: string().optional(),
13011
+ audio: string().optional()
13012
+ })
13013
+ });
13014
+ /** Broker block — null when the broker stage is unreachable or inactive. */
13015
+ var CameraBrokerStatusSchema = object({
13016
+ profiles: array(object({
13017
+ profile: string(),
13018
+ status: string(),
13019
+ codec: string(),
13020
+ width: number(),
13021
+ height: number(),
13022
+ subscribers: number(),
13023
+ inFps: number(),
13024
+ outFps: number()
13025
+ })).readonly(),
13026
+ webrtcSessions: number(),
13027
+ rtspRestream: boolean()
13028
+ });
13029
+ /** Shared-memory ring statistics within the decoder block. */
13030
+ var CameraDecoderShmSchema = object({
13031
+ framesWritten: number(),
13032
+ getFrameHits: number(),
13033
+ getFrameMisses: number(),
13034
+ budgetMb: number()
13035
+ });
13036
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
13037
+ var CameraDecoderStatusSchema = object({
13038
+ nodeId: string(),
13039
+ formats: array(string()).readonly(),
13040
+ sessionCount: number(),
13041
+ shm: CameraDecoderShmSchema
13042
+ });
13043
+ /** Motion block — null when motion detection is not active for this device. */
13044
+ var CameraMotionStatusSchema = object({
13045
+ enabled: boolean(),
13046
+ fps: number()
13047
+ });
13048
+ /** Detection provisioning sub-block. */
13049
+ var CameraDetectionProvisioningSchema = object({
13050
+ state: _enum([
13051
+ "idle",
13052
+ "installing",
13053
+ "verifying",
13054
+ "ready",
13055
+ "failed"
13056
+ ]),
13057
+ error: string().optional()
13058
+ });
13059
+ /** Detection phase — derived from the runner's engine phase. */
13060
+ var CameraDetectionPhaseSchema = _enum([
13061
+ "idle",
13062
+ "watching",
13063
+ "active"
13064
+ ]);
13065
+ /** Detection block — null when no detection node is assigned or reachable. */
13066
+ var CameraDetectionStatusSchema = object({
13067
+ nodeId: string(),
13068
+ engine: object({
13069
+ backend: string(),
13070
+ device: string()
13071
+ }),
13072
+ phase: CameraDetectionPhaseSchema,
13073
+ configuredFps: number(),
13074
+ actualFps: number(),
13075
+ queueDepth: number(),
13076
+ avgInferenceMs: number(),
13077
+ provisioning: CameraDetectionProvisioningSchema
13078
+ });
13079
+ /** Audio block — null when no audio node is assigned or reachable. */
13080
+ var CameraAudioStatusSchema = object({
13081
+ nodeId: string(),
13082
+ enabled: boolean()
13083
+ });
13084
+ /** Recording block — null when no recording cap is active for this device. */
13085
+ var CameraRecordingStatusSchema = object({
13086
+ mode: _enum([
13087
+ "off",
13088
+ "continuous",
13089
+ "events"
13090
+ ]),
13091
+ active: boolean(),
13092
+ storageBytes: number()
13093
+ });
13094
+ /**
13095
+ * Aggregated per-camera pipeline status — server-composed, single call.
13096
+ *
13097
+ * The `assignment` and `source` blocks are always present.
13098
+ * Every other block is `null` when the stage is inactive or unreachable
13099
+ * during the bounded parallel fan-out in the orchestrator implementation.
13100
+ *
13101
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
13102
+ */
13103
+ var CameraStatusSchema = object({
13104
+ deviceId: number(),
13105
+ assignment: CameraAssignmentStatusSchema,
13106
+ source: CameraSourceStatusSchema,
13107
+ broker: CameraBrokerStatusSchema.nullable(),
13108
+ decoder: CameraDecoderStatusSchema.nullable(),
13109
+ motion: CameraMotionStatusSchema.nullable(),
13110
+ detection: CameraDetectionStatusSchema.nullable(),
13111
+ audio: CameraAudioStatusSchema.nullable(),
13112
+ recording: CameraRecordingStatusSchema.nullable(),
13113
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
13114
+ fetchedAt: number()
13115
+ });
12955
13116
  method(object({
12956
13117
  deviceId: number(),
12957
13118
  agentNodeId: string()
@@ -13019,6 +13180,12 @@ method(object({
13019
13180
  }), {
13020
13181
  kind: "mutation",
13021
13182
  auth: "admin"
13183
+ }), method(object({
13184
+ agentNodeId: string(),
13185
+ maxCameras: number().int().nonnegative().nullable()
13186
+ }), object({ success: literal(true) }), {
13187
+ kind: "mutation",
13188
+ auth: "admin"
13022
13189
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
13023
13190
  deviceId: number(),
13024
13191
  addonId: string(),
@@ -13044,7 +13211,7 @@ method(object({
13044
13211
  }), method(object({
13045
13212
  deviceId: number(),
13046
13213
  agentNodeId: string().optional()
13047
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13214
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13048
13215
  name: string(),
13049
13216
  description: string().optional(),
13050
13217
  config: CameraPipelineConfigSchema
@@ -16008,6 +16175,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
16008
16175
  kind: "mutation",
16009
16176
  auth: "admin"
16010
16177
  });
16178
+ var jobKindSchema = _enum([
16179
+ "install",
16180
+ "update",
16181
+ "uninstall",
16182
+ "restart"
16183
+ ]);
16184
+ var taskPhaseSchema = _enum([
16185
+ "queued",
16186
+ "fetching",
16187
+ "staged",
16188
+ "validating",
16189
+ "applying",
16190
+ "restarting",
16191
+ "applied",
16192
+ "done",
16193
+ "failed",
16194
+ "skipped"
16195
+ ]);
16196
+ var taskTargetSchema = _enum(["framework", "addon"]);
16197
+ var taskLogEntrySchema = object({
16198
+ tsMs: number(),
16199
+ nodeId: string(),
16200
+ packageName: string(),
16201
+ phase: taskPhaseSchema,
16202
+ message: string()
16203
+ });
16204
+ var lifecycleTaskSchema = object({
16205
+ taskId: string(),
16206
+ nodeId: string(),
16207
+ packageName: string(),
16208
+ fromVersion: string().nullable(),
16209
+ toVersion: string(),
16210
+ target: taskTargetSchema,
16211
+ phase: taskPhaseSchema,
16212
+ stagedPath: string().nullable(),
16213
+ attempts: number(),
16214
+ steps: array(taskLogEntrySchema),
16215
+ error: string().nullable(),
16216
+ startedAtMs: number().nullable(),
16217
+ finishedAtMs: number().nullable()
16218
+ });
16219
+ var lifecycleJobStateSchema = _enum([
16220
+ "running",
16221
+ "completed",
16222
+ "failed",
16223
+ "partially-failed",
16224
+ "cancelled"
16225
+ ]);
16226
+ var lifecycleJobScopeSchema = _enum([
16227
+ "single",
16228
+ "bulk",
16229
+ "cluster"
16230
+ ]);
16231
+ var lifecycleJobSchema = object({
16232
+ jobId: string(),
16233
+ kind: jobKindSchema,
16234
+ createdAtMs: number(),
16235
+ createdBy: string(),
16236
+ scope: lifecycleJobScopeSchema,
16237
+ tasks: array(lifecycleTaskSchema),
16238
+ state: lifecycleJobStateSchema,
16239
+ schemaVersion: literal(1)
16240
+ });
16011
16241
  /**
16012
16242
  * addons — system-scoped singleton capability for addon package
16013
16243
  * management (install, update, configure, restart) and per-addon log
@@ -16190,7 +16420,7 @@ var BulkUpdatePhaseSchema = _enum([
16190
16420
  "restarting",
16191
16421
  "finalizing"
16192
16422
  ]);
16193
- var BulkUpdateStateSchema = object({
16423
+ object({
16194
16424
  id: string(),
16195
16425
  nodeId: string(),
16196
16426
  startedAtMs: number(),
@@ -16293,20 +16523,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16293
16523
  }), UpdateFrameworkPackageResultSchema, {
16294
16524
  kind: "mutation",
16295
16525
  auth: "admin"
16296
- }), method(object({
16297
- nodeId: string(),
16298
- items: array(object({
16299
- name: string(),
16300
- version: string(),
16301
- isSystem: boolean()
16302
- })).readonly()
16303
- }), object({ id: string() }), {
16304
- kind: "mutation",
16305
- auth: "admin"
16306
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
16307
- kind: "mutation",
16308
- auth: "admin"
16309
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16526
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16310
16527
  kind: "mutation",
16311
16528
  auth: "admin"
16312
16529
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -16328,6 +16545,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16328
16545
  kind: "mutation",
16329
16546
  auth: "admin"
16330
16547
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
16548
+ kind: _enum([
16549
+ "install",
16550
+ "update",
16551
+ "uninstall",
16552
+ "restart"
16553
+ ]),
16554
+ targets: array(object({
16555
+ name: string().min(1),
16556
+ version: string().min(1)
16557
+ })).min(1),
16558
+ nodeIds: array(string()).optional()
16559
+ }), object({ jobId: string() }), {
16560
+ kind: "mutation",
16561
+ auth: "admin"
16562
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
16563
+ kind: "mutation",
16564
+ auth: "admin"
16565
+ }), method(object({
16331
16566
  addonId: string(),
16332
16567
  level: LogLevelSchema$1.optional()
16333
16568
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -16368,7 +16603,7 @@ Object.freeze({
16368
16603
  addonId: null,
16369
16604
  access: "create"
16370
16605
  },
16371
- "addons.cancelBulkUpdate": {
16606
+ "addons.cancelJob": {
16372
16607
  capName: "addons",
16373
16608
  capScope: "system",
16374
16609
  addonId: null,
@@ -16398,7 +16633,7 @@ Object.freeze({
16398
16633
  addonId: null,
16399
16634
  access: "view"
16400
16635
  },
16401
- "addons.getBulkUpdateState": {
16636
+ "addons.getJob": {
16402
16637
  capName: "addons",
16403
16638
  capScope: "system",
16404
16639
  addonId: null,
@@ -16446,19 +16681,19 @@ Object.freeze({
16446
16681
  addonId: null,
16447
16682
  access: "view"
16448
16683
  },
16449
- "addons.listActiveBulkUpdates": {
16684
+ "addons.listCapabilityProviders": {
16450
16685
  capName: "addons",
16451
16686
  capScope: "system",
16452
16687
  addonId: null,
16453
16688
  access: "view"
16454
16689
  },
16455
- "addons.listCapabilityProviders": {
16690
+ "addons.listFrameworkPackages": {
16456
16691
  capName: "addons",
16457
16692
  capScope: "system",
16458
16693
  addonId: null,
16459
16694
  access: "view"
16460
16695
  },
16461
- "addons.listFrameworkPackages": {
16696
+ "addons.listJobs": {
16462
16697
  capName: "addons",
16463
16698
  capScope: "system",
16464
16699
  addonId: null,
@@ -16542,7 +16777,7 @@ Object.freeze({
16542
16777
  addonId: null,
16543
16778
  access: "create"
16544
16779
  },
16545
- "addons.startBulkUpdate": {
16780
+ "addons.startJob": {
16546
16781
  capName: "addons",
16547
16782
  capScope: "system",
16548
16783
  addonId: null,
@@ -18768,6 +19003,12 @@ Object.freeze({
18768
19003
  addonId: null,
18769
19004
  access: "view"
18770
19005
  },
19006
+ "pipelineExecutor.getEngineProvisioning": {
19007
+ capName: "pipeline-executor",
19008
+ capScope: "system",
19009
+ addonId: null,
19010
+ access: "view"
19011
+ },
18771
19012
  "pipelineExecutor.getGlobalPipelineConfig": {
18772
19013
  capName: "pipeline-executor",
18773
19014
  capScope: "system",
@@ -18972,6 +19213,18 @@ Object.freeze({
18972
19213
  addonId: null,
18973
19214
  access: "view"
18974
19215
  },
19216
+ "pipelineOrchestrator.getCameraStatus": {
19217
+ capName: "pipeline-orchestrator",
19218
+ capScope: "system",
19219
+ addonId: null,
19220
+ access: "view"
19221
+ },
19222
+ "pipelineOrchestrator.getCameraStatuses": {
19223
+ capName: "pipeline-orchestrator",
19224
+ capScope: "system",
19225
+ addonId: null,
19226
+ access: "view"
19227
+ },
18975
19228
  "pipelineOrchestrator.getCameraStepOverrides": {
18976
19229
  capName: "pipeline-orchestrator",
18977
19230
  capScope: "system",
@@ -19056,6 +19309,12 @@ Object.freeze({
19056
19309
  addonId: null,
19057
19310
  access: "create"
19058
19311
  },
19312
+ "pipelineOrchestrator.setAgentMaxCameras": {
19313
+ capName: "pipeline-orchestrator",
19314
+ capScope: "system",
19315
+ addonId: null,
19316
+ access: "create"
19317
+ },
19059
19318
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19060
19319
  capName: "pipeline-orchestrator",
19061
19320
  capScope: "system",
@@ -20529,6 +20788,32 @@ Object.freeze({
20529
20788
  "network-access": "ingress",
20530
20789
  "smtp-provider": "email"
20531
20790
  });
20791
+ var frameworkSwapPackageSchema = object({
20792
+ name: string(),
20793
+ stagedPath: string(),
20794
+ backupPath: string(),
20795
+ toVersion: string(),
20796
+ fromVersion: string().nullable()
20797
+ });
20798
+ object({
20799
+ jobId: string(),
20800
+ taskId: string(),
20801
+ packages: array(frameworkSwapPackageSchema),
20802
+ requestedAtMs: number(),
20803
+ schemaVersion: literal(1)
20804
+ });
20805
+ object({
20806
+ jobId: string(),
20807
+ taskId: string(),
20808
+ backups: array(object({
20809
+ name: string(),
20810
+ backupPath: string(),
20811
+ livePath: string()
20812
+ })),
20813
+ appliedAtMs: number(),
20814
+ bootAttempts: number(),
20815
+ schemaVersion: literal(1)
20816
+ });
20532
20817
  //#endregion
20533
20818
  //#region ../../node_modules/nodemailer/lib/punycode/index.js
20534
20819
  var require_punycode = /* @__PURE__ */ __commonJSMin(((exports, module) => {
@@ -5017,6 +5017,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5017
5017
  */
5018
5018
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
5019
5019
  /**
5020
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
5021
+ * the detection-pipeline provider on every state change of its lazy
5022
+ * engine-provisioning machine (idle → installing → verifying → ready,
5023
+ * or → failed with a `nextRetryAt`). Payload is the
5024
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
5025
+ * node. The Pipeline page subscribes to drive a live "installing
5026
+ * OpenVINO… / ready" indicator per node without polling
5027
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
5028
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
5029
+ */
5030
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
5031
+ /**
5020
5032
  * Cluster topology snapshot. Carries the same payload returned by
5021
5033
  * `nodes.topology` (every reachable node + addons + processes).
5022
5034
  * Emitted by the hub on any agent / addon lifecycle change
@@ -5166,14 +5178,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
5166
5178
  EventCategory["DeviceSleeping"] = "device.sleeping";
5167
5179
  EventCategory["RetentionCleanup"] = "retention.cleanup";
5168
5180
  /**
5169
- * Progress snapshot emitted by `BulkUpdateCoordinator` on every state
5170
- * transition (item status change, phase change, completion, cancel).
5171
- * Payload is `BulkUpdateState`. Admin UI subscribes via `useLiveEvent`
5172
- * to drive the sticky `BulkUpdateBanner` and per-row `AddonRowBadge`.
5173
- *
5174
- * Spec: docs/superpowers/specs/2026-05-21-addons-bulk-update-progress-design.md
5181
+ * Legacy bulk-update progress snapshot (payload `BulkUpdateState`). No longer
5182
+ * emitted F3 removed the coordinator that produced it; "Update all" now runs
5183
+ * as one lifecycle engine job (`AddonsJobProgress`/`AddonsJobLog`). Retained
5184
+ * (with `BulkUpdateState`) only to avoid regenerating the event maps; removed
5185
+ * in F4 once live bulk progress is re-implemented over the engine events.
5175
5186
  */
5176
5187
  EventCategory["AddonsBulkUpdateProgress"] = "addons.bulk-update-progress";
5188
+ EventCategory["AddonsJobProgress"] = "addons.job-progress";
5189
+ EventCategory["AddonsJobLog"] = "addons.job-log";
5177
5190
  /**
5178
5191
  * A container's child visibility toggled (hidden/shown). Emitted by the
5179
5192
  * `accessories` cap when a child device is hidden or revealed.
@@ -9180,6 +9193,24 @@ var DetectorOutputSchema = object({
9180
9193
  inferenceMs: number(),
9181
9194
  modelId: string()
9182
9195
  });
9196
+ var EngineProvisioningSchema = object({
9197
+ runtimeId: _enum([
9198
+ "onnx",
9199
+ "openvino",
9200
+ "coreml"
9201
+ ]).nullable(),
9202
+ device: string().nullable(),
9203
+ state: _enum([
9204
+ "idle",
9205
+ "installing",
9206
+ "verifying",
9207
+ "ready",
9208
+ "failed"
9209
+ ]),
9210
+ progress: number().optional(),
9211
+ error: string().optional(),
9212
+ nextRetryAt: number().optional()
9213
+ });
9183
9214
  var PipelineStepInputSchema = lazy(() => object({
9184
9215
  addonId: string(),
9185
9216
  modelId: string(),
@@ -9248,7 +9279,7 @@ var PipelineRunResultBridge = custom();
9248
9279
  method(_void(), array(PipelineEngineChoiceSchema)), method(_void(), PipelineEngineChoiceSchema), method(PipelineEngineChoiceSchema, array(PipelineDefaultStepSchema)), method(_void(), PipelineEngineChoiceSchema, {
9249
9280
  kind: "mutation",
9250
9281
  auth: "admin"
9251
- }), method(_void(), record(string(), object({
9282
+ }), method(object({ nodeId: string() }), EngineProvisioningSchema), method(_void(), record(string(), object({
9252
9283
  modelId: string(),
9253
9284
  settings: record(string(), unknown()).readonly()
9254
9285
  }))), method(object({ steps: record(string(), object({
@@ -12848,7 +12879,10 @@ var AgentAddonConfigSchema = object({
12848
12879
  modelId: string(),
12849
12880
  settings: record(string(), unknown()).readonly()
12850
12881
  });
12851
- var AgentPipelineSettingsSchema = object({ addonDefaults: record(string(), AgentAddonConfigSchema).readonly() });
12882
+ var AgentPipelineSettingsSchema = object({
12883
+ addonDefaults: record(string(), AgentAddonConfigSchema).readonly(),
12884
+ maxCameras: number().int().nonnegative().nullable().default(null)
12885
+ });
12852
12886
  var CameraPipelineForAgentSchema = object({
12853
12887
  steps: array(PipelineStepInputSchema).readonly(),
12854
12888
  audio: object({
@@ -12950,6 +12984,133 @@ var GlobalMetricsSchema = object({
12950
12984
  * capability providers.
12951
12985
  */
12952
12986
  var CapabilityBindingsSchema = record(string(), string());
12987
+ /** Source block — always present; derives from the stream catalog. */
12988
+ var CameraSourceStatusSchema = object({ streams: array(object({
12989
+ camStreamId: string(),
12990
+ codec: string(),
12991
+ width: number(),
12992
+ height: number(),
12993
+ fps: number(),
12994
+ kind: string()
12995
+ })).readonly() });
12996
+ /** Assignment block — always present (orchestrator-local, no remote call). */
12997
+ var CameraAssignmentStatusSchema = object({
12998
+ detectionNodeId: string().nullable(),
12999
+ decoderNodeId: string().nullable(),
13000
+ audioNodeId: string().nullable(),
13001
+ pinned: object({
13002
+ detection: boolean(),
13003
+ decoder: boolean(),
13004
+ audio: boolean()
13005
+ }),
13006
+ reasons: object({
13007
+ detection: string().optional(),
13008
+ decoder: string().optional(),
13009
+ audio: string().optional()
13010
+ })
13011
+ });
13012
+ /** Broker block — null when the broker stage is unreachable or inactive. */
13013
+ var CameraBrokerStatusSchema = object({
13014
+ profiles: array(object({
13015
+ profile: string(),
13016
+ status: string(),
13017
+ codec: string(),
13018
+ width: number(),
13019
+ height: number(),
13020
+ subscribers: number(),
13021
+ inFps: number(),
13022
+ outFps: number()
13023
+ })).readonly(),
13024
+ webrtcSessions: number(),
13025
+ rtspRestream: boolean()
13026
+ });
13027
+ /** Shared-memory ring statistics within the decoder block. */
13028
+ var CameraDecoderShmSchema = object({
13029
+ framesWritten: number(),
13030
+ getFrameHits: number(),
13031
+ getFrameMisses: number(),
13032
+ budgetMb: number()
13033
+ });
13034
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
13035
+ var CameraDecoderStatusSchema = object({
13036
+ nodeId: string(),
13037
+ formats: array(string()).readonly(),
13038
+ sessionCount: number(),
13039
+ shm: CameraDecoderShmSchema
13040
+ });
13041
+ /** Motion block — null when motion detection is not active for this device. */
13042
+ var CameraMotionStatusSchema = object({
13043
+ enabled: boolean(),
13044
+ fps: number()
13045
+ });
13046
+ /** Detection provisioning sub-block. */
13047
+ var CameraDetectionProvisioningSchema = object({
13048
+ state: _enum([
13049
+ "idle",
13050
+ "installing",
13051
+ "verifying",
13052
+ "ready",
13053
+ "failed"
13054
+ ]),
13055
+ error: string().optional()
13056
+ });
13057
+ /** Detection phase — derived from the runner's engine phase. */
13058
+ var CameraDetectionPhaseSchema = _enum([
13059
+ "idle",
13060
+ "watching",
13061
+ "active"
13062
+ ]);
13063
+ /** Detection block — null when no detection node is assigned or reachable. */
13064
+ var CameraDetectionStatusSchema = object({
13065
+ nodeId: string(),
13066
+ engine: object({
13067
+ backend: string(),
13068
+ device: string()
13069
+ }),
13070
+ phase: CameraDetectionPhaseSchema,
13071
+ configuredFps: number(),
13072
+ actualFps: number(),
13073
+ queueDepth: number(),
13074
+ avgInferenceMs: number(),
13075
+ provisioning: CameraDetectionProvisioningSchema
13076
+ });
13077
+ /** Audio block — null when no audio node is assigned or reachable. */
13078
+ var CameraAudioStatusSchema = object({
13079
+ nodeId: string(),
13080
+ enabled: boolean()
13081
+ });
13082
+ /** Recording block — null when no recording cap is active for this device. */
13083
+ var CameraRecordingStatusSchema = object({
13084
+ mode: _enum([
13085
+ "off",
13086
+ "continuous",
13087
+ "events"
13088
+ ]),
13089
+ active: boolean(),
13090
+ storageBytes: number()
13091
+ });
13092
+ /**
13093
+ * Aggregated per-camera pipeline status — server-composed, single call.
13094
+ *
13095
+ * The `assignment` and `source` blocks are always present.
13096
+ * Every other block is `null` when the stage is inactive or unreachable
13097
+ * during the bounded parallel fan-out in the orchestrator implementation.
13098
+ *
13099
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
13100
+ */
13101
+ var CameraStatusSchema = object({
13102
+ deviceId: number(),
13103
+ assignment: CameraAssignmentStatusSchema,
13104
+ source: CameraSourceStatusSchema,
13105
+ broker: CameraBrokerStatusSchema.nullable(),
13106
+ decoder: CameraDecoderStatusSchema.nullable(),
13107
+ motion: CameraMotionStatusSchema.nullable(),
13108
+ detection: CameraDetectionStatusSchema.nullable(),
13109
+ audio: CameraAudioStatusSchema.nullable(),
13110
+ recording: CameraRecordingStatusSchema.nullable(),
13111
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
13112
+ fetchedAt: number()
13113
+ });
12953
13114
  method(object({
12954
13115
  deviceId: number(),
12955
13116
  agentNodeId: string()
@@ -13017,6 +13178,12 @@ method(object({
13017
13178
  }), {
13018
13179
  kind: "mutation",
13019
13180
  auth: "admin"
13181
+ }), method(object({
13182
+ agentNodeId: string(),
13183
+ maxCameras: number().int().nonnegative().nullable()
13184
+ }), object({ success: literal(true) }), {
13185
+ kind: "mutation",
13186
+ auth: "admin"
13020
13187
  }), method(object({ deviceId: number() }), CameraPipelineSettingsSchema.nullable()), method(object({
13021
13188
  deviceId: number(),
13022
13189
  addonId: string(),
@@ -13042,7 +13209,7 @@ method(object({
13042
13209
  }), method(object({
13043
13210
  deviceId: number(),
13044
13211
  agentNodeId: string().optional()
13045
- }), CameraPipelineConfigSchema), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13212
+ }), CameraPipelineConfigSchema), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
13046
13213
  name: string(),
13047
13214
  description: string().optional(),
13048
13215
  config: CameraPipelineConfigSchema
@@ -16006,6 +16173,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
16006
16173
  kind: "mutation",
16007
16174
  auth: "admin"
16008
16175
  });
16176
+ var jobKindSchema = _enum([
16177
+ "install",
16178
+ "update",
16179
+ "uninstall",
16180
+ "restart"
16181
+ ]);
16182
+ var taskPhaseSchema = _enum([
16183
+ "queued",
16184
+ "fetching",
16185
+ "staged",
16186
+ "validating",
16187
+ "applying",
16188
+ "restarting",
16189
+ "applied",
16190
+ "done",
16191
+ "failed",
16192
+ "skipped"
16193
+ ]);
16194
+ var taskTargetSchema = _enum(["framework", "addon"]);
16195
+ var taskLogEntrySchema = object({
16196
+ tsMs: number(),
16197
+ nodeId: string(),
16198
+ packageName: string(),
16199
+ phase: taskPhaseSchema,
16200
+ message: string()
16201
+ });
16202
+ var lifecycleTaskSchema = object({
16203
+ taskId: string(),
16204
+ nodeId: string(),
16205
+ packageName: string(),
16206
+ fromVersion: string().nullable(),
16207
+ toVersion: string(),
16208
+ target: taskTargetSchema,
16209
+ phase: taskPhaseSchema,
16210
+ stagedPath: string().nullable(),
16211
+ attempts: number(),
16212
+ steps: array(taskLogEntrySchema),
16213
+ error: string().nullable(),
16214
+ startedAtMs: number().nullable(),
16215
+ finishedAtMs: number().nullable()
16216
+ });
16217
+ var lifecycleJobStateSchema = _enum([
16218
+ "running",
16219
+ "completed",
16220
+ "failed",
16221
+ "partially-failed",
16222
+ "cancelled"
16223
+ ]);
16224
+ var lifecycleJobScopeSchema = _enum([
16225
+ "single",
16226
+ "bulk",
16227
+ "cluster"
16228
+ ]);
16229
+ var lifecycleJobSchema = object({
16230
+ jobId: string(),
16231
+ kind: jobKindSchema,
16232
+ createdAtMs: number(),
16233
+ createdBy: string(),
16234
+ scope: lifecycleJobScopeSchema,
16235
+ tasks: array(lifecycleTaskSchema),
16236
+ state: lifecycleJobStateSchema,
16237
+ schemaVersion: literal(1)
16238
+ });
16009
16239
  /**
16010
16240
  * addons — system-scoped singleton capability for addon package
16011
16241
  * management (install, update, configure, restart) and per-addon log
@@ -16188,7 +16418,7 @@ var BulkUpdatePhaseSchema = _enum([
16188
16418
  "restarting",
16189
16419
  "finalizing"
16190
16420
  ]);
16191
- var BulkUpdateStateSchema = object({
16421
+ object({
16192
16422
  id: string(),
16193
16423
  nodeId: string(),
16194
16424
  startedAtMs: number(),
@@ -16291,20 +16521,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16291
16521
  }), UpdateFrameworkPackageResultSchema, {
16292
16522
  kind: "mutation",
16293
16523
  auth: "admin"
16294
- }), method(object({
16295
- nodeId: string(),
16296
- items: array(object({
16297
- name: string(),
16298
- version: string(),
16299
- isSystem: boolean()
16300
- })).readonly()
16301
- }), object({ id: string() }), {
16302
- kind: "mutation",
16303
- auth: "admin"
16304
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
16305
- kind: "mutation",
16306
- auth: "admin"
16307
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16524
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16308
16525
  kind: "mutation",
16309
16526
  auth: "admin"
16310
16527
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -16326,6 +16543,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16326
16543
  kind: "mutation",
16327
16544
  auth: "admin"
16328
16545
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
16546
+ kind: _enum([
16547
+ "install",
16548
+ "update",
16549
+ "uninstall",
16550
+ "restart"
16551
+ ]),
16552
+ targets: array(object({
16553
+ name: string().min(1),
16554
+ version: string().min(1)
16555
+ })).min(1),
16556
+ nodeIds: array(string()).optional()
16557
+ }), object({ jobId: string() }), {
16558
+ kind: "mutation",
16559
+ auth: "admin"
16560
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
16561
+ kind: "mutation",
16562
+ auth: "admin"
16563
+ }), method(object({
16329
16564
  addonId: string(),
16330
16565
  level: LogLevelSchema$1.optional()
16331
16566
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -16366,7 +16601,7 @@ Object.freeze({
16366
16601
  addonId: null,
16367
16602
  access: "create"
16368
16603
  },
16369
- "addons.cancelBulkUpdate": {
16604
+ "addons.cancelJob": {
16370
16605
  capName: "addons",
16371
16606
  capScope: "system",
16372
16607
  addonId: null,
@@ -16396,7 +16631,7 @@ Object.freeze({
16396
16631
  addonId: null,
16397
16632
  access: "view"
16398
16633
  },
16399
- "addons.getBulkUpdateState": {
16634
+ "addons.getJob": {
16400
16635
  capName: "addons",
16401
16636
  capScope: "system",
16402
16637
  addonId: null,
@@ -16444,19 +16679,19 @@ Object.freeze({
16444
16679
  addonId: null,
16445
16680
  access: "view"
16446
16681
  },
16447
- "addons.listActiveBulkUpdates": {
16682
+ "addons.listCapabilityProviders": {
16448
16683
  capName: "addons",
16449
16684
  capScope: "system",
16450
16685
  addonId: null,
16451
16686
  access: "view"
16452
16687
  },
16453
- "addons.listCapabilityProviders": {
16688
+ "addons.listFrameworkPackages": {
16454
16689
  capName: "addons",
16455
16690
  capScope: "system",
16456
16691
  addonId: null,
16457
16692
  access: "view"
16458
16693
  },
16459
- "addons.listFrameworkPackages": {
16694
+ "addons.listJobs": {
16460
16695
  capName: "addons",
16461
16696
  capScope: "system",
16462
16697
  addonId: null,
@@ -16540,7 +16775,7 @@ Object.freeze({
16540
16775
  addonId: null,
16541
16776
  access: "create"
16542
16777
  },
16543
- "addons.startBulkUpdate": {
16778
+ "addons.startJob": {
16544
16779
  capName: "addons",
16545
16780
  capScope: "system",
16546
16781
  addonId: null,
@@ -18766,6 +19001,12 @@ Object.freeze({
18766
19001
  addonId: null,
18767
19002
  access: "view"
18768
19003
  },
19004
+ "pipelineExecutor.getEngineProvisioning": {
19005
+ capName: "pipeline-executor",
19006
+ capScope: "system",
19007
+ addonId: null,
19008
+ access: "view"
19009
+ },
18769
19010
  "pipelineExecutor.getGlobalPipelineConfig": {
18770
19011
  capName: "pipeline-executor",
18771
19012
  capScope: "system",
@@ -18970,6 +19211,18 @@ Object.freeze({
18970
19211
  addonId: null,
18971
19212
  access: "view"
18972
19213
  },
19214
+ "pipelineOrchestrator.getCameraStatus": {
19215
+ capName: "pipeline-orchestrator",
19216
+ capScope: "system",
19217
+ addonId: null,
19218
+ access: "view"
19219
+ },
19220
+ "pipelineOrchestrator.getCameraStatuses": {
19221
+ capName: "pipeline-orchestrator",
19222
+ capScope: "system",
19223
+ addonId: null,
19224
+ access: "view"
19225
+ },
18973
19226
  "pipelineOrchestrator.getCameraStepOverrides": {
18974
19227
  capName: "pipeline-orchestrator",
18975
19228
  capScope: "system",
@@ -19054,6 +19307,12 @@ Object.freeze({
19054
19307
  addonId: null,
19055
19308
  access: "create"
19056
19309
  },
19310
+ "pipelineOrchestrator.setAgentMaxCameras": {
19311
+ capName: "pipeline-orchestrator",
19312
+ capScope: "system",
19313
+ addonId: null,
19314
+ access: "create"
19315
+ },
19057
19316
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19058
19317
  capName: "pipeline-orchestrator",
19059
19318
  capScope: "system",
@@ -20527,6 +20786,32 @@ Object.freeze({
20527
20786
  "network-access": "ingress",
20528
20787
  "smtp-provider": "email"
20529
20788
  });
20789
+ var frameworkSwapPackageSchema = object({
20790
+ name: string(),
20791
+ stagedPath: string(),
20792
+ backupPath: string(),
20793
+ toVersion: string(),
20794
+ fromVersion: string().nullable()
20795
+ });
20796
+ object({
20797
+ jobId: string(),
20798
+ taskId: string(),
20799
+ packages: array(frameworkSwapPackageSchema),
20800
+ requestedAtMs: number(),
20801
+ schemaVersion: literal(1)
20802
+ });
20803
+ object({
20804
+ jobId: string(),
20805
+ taskId: string(),
20806
+ backups: array(object({
20807
+ name: string(),
20808
+ backupPath: string(),
20809
+ livePath: string()
20810
+ })),
20811
+ appliedAtMs: number(),
20812
+ bootAttempts: number(),
20813
+ schemaVersion: literal(1)
20814
+ });
20530
20815
  //#endregion
20531
20816
  //#region ../../node_modules/nodemailer/lib/punycode/index.js
20532
20817
  var require_punycode = /* @__PURE__ */ __commonJSMin(((exports, module) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-smtp-nodemailer",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "SMTP email provider addon for CamStack — wraps `nodemailer` and registers a `smtp-provider` cap collection entry. Used by magic-link login + notifier addons.",
5
5
  "keywords": [
6
6
  "camstack",