@camstack/addon-tailscale 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.
@@ -24,7 +24,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  enumerable: true
25
25
  }) : target, mod));
26
26
  //#endregion
27
- const require_dist = require("../dist-ByDiIgMC.js");
27
+ const require_dist = require("../dist-C3Gth0Ap.js");
28
28
  let node_child_process = require("node:child_process");
29
29
  let node_util = require("node:util");
30
30
  let node_fs = require("node:fs");
@@ -1,4 +1,4 @@
1
- import { i as networkAccessCapability, n as EventCategory, r as meshNetworkCapability, t as BaseAddon } from "../dist-DcSssCOP.mjs";
1
+ import { i as networkAccessCapability, n as EventCategory, r as meshNetworkCapability, t as BaseAddon } from "../dist-Dr1YikI7.mjs";
2
2
  import { execFile, spawn } from "node:child_process";
3
3
  import { promisify } from "node:util";
4
4
  import * as fs from "node:fs";
@@ -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
@@ -16035,6 +16202,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
16035
16202
  kind: "mutation",
16036
16203
  auth: "admin"
16037
16204
  });
16205
+ var jobKindSchema = _enum([
16206
+ "install",
16207
+ "update",
16208
+ "uninstall",
16209
+ "restart"
16210
+ ]);
16211
+ var taskPhaseSchema = _enum([
16212
+ "queued",
16213
+ "fetching",
16214
+ "staged",
16215
+ "validating",
16216
+ "applying",
16217
+ "restarting",
16218
+ "applied",
16219
+ "done",
16220
+ "failed",
16221
+ "skipped"
16222
+ ]);
16223
+ var taskTargetSchema = _enum(["framework", "addon"]);
16224
+ var taskLogEntrySchema = object({
16225
+ tsMs: number(),
16226
+ nodeId: string(),
16227
+ packageName: string(),
16228
+ phase: taskPhaseSchema,
16229
+ message: string()
16230
+ });
16231
+ var lifecycleTaskSchema = object({
16232
+ taskId: string(),
16233
+ nodeId: string(),
16234
+ packageName: string(),
16235
+ fromVersion: string().nullable(),
16236
+ toVersion: string(),
16237
+ target: taskTargetSchema,
16238
+ phase: taskPhaseSchema,
16239
+ stagedPath: string().nullable(),
16240
+ attempts: number(),
16241
+ steps: array(taskLogEntrySchema),
16242
+ error: string().nullable(),
16243
+ startedAtMs: number().nullable(),
16244
+ finishedAtMs: number().nullable()
16245
+ });
16246
+ var lifecycleJobStateSchema = _enum([
16247
+ "running",
16248
+ "completed",
16249
+ "failed",
16250
+ "partially-failed",
16251
+ "cancelled"
16252
+ ]);
16253
+ var lifecycleJobScopeSchema = _enum([
16254
+ "single",
16255
+ "bulk",
16256
+ "cluster"
16257
+ ]);
16258
+ var lifecycleJobSchema = object({
16259
+ jobId: string(),
16260
+ kind: jobKindSchema,
16261
+ createdAtMs: number(),
16262
+ createdBy: string(),
16263
+ scope: lifecycleJobScopeSchema,
16264
+ tasks: array(lifecycleTaskSchema),
16265
+ state: lifecycleJobStateSchema,
16266
+ schemaVersion: literal(1)
16267
+ });
16038
16268
  /**
16039
16269
  * addons — system-scoped singleton capability for addon package
16040
16270
  * management (install, update, configure, restart) and per-addon log
@@ -16217,7 +16447,7 @@ var BulkUpdatePhaseSchema = _enum([
16217
16447
  "restarting",
16218
16448
  "finalizing"
16219
16449
  ]);
16220
- var BulkUpdateStateSchema = object({
16450
+ object({
16221
16451
  id: string(),
16222
16452
  nodeId: string(),
16223
16453
  startedAtMs: number(),
@@ -16320,20 +16550,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16320
16550
  }), UpdateFrameworkPackageResultSchema, {
16321
16551
  kind: "mutation",
16322
16552
  auth: "admin"
16323
- }), method(object({
16324
- nodeId: string(),
16325
- items: array(object({
16326
- name: string(),
16327
- version: string(),
16328
- isSystem: boolean()
16329
- })).readonly()
16330
- }), object({ id: string() }), {
16331
- kind: "mutation",
16332
- auth: "admin"
16333
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
16334
- kind: "mutation",
16335
- auth: "admin"
16336
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16553
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16337
16554
  kind: "mutation",
16338
16555
  auth: "admin"
16339
16556
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -16355,6 +16572,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16355
16572
  kind: "mutation",
16356
16573
  auth: "admin"
16357
16574
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
16575
+ kind: _enum([
16576
+ "install",
16577
+ "update",
16578
+ "uninstall",
16579
+ "restart"
16580
+ ]),
16581
+ targets: array(object({
16582
+ name: string().min(1),
16583
+ version: string().min(1)
16584
+ })).min(1),
16585
+ nodeIds: array(string()).optional()
16586
+ }), object({ jobId: string() }), {
16587
+ kind: "mutation",
16588
+ auth: "admin"
16589
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
16590
+ kind: "mutation",
16591
+ auth: "admin"
16592
+ }), method(object({
16358
16593
  addonId: string(),
16359
16594
  level: LogLevelSchema$1.optional()
16360
16595
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -16395,7 +16630,7 @@ Object.freeze({
16395
16630
  addonId: null,
16396
16631
  access: "create"
16397
16632
  },
16398
- "addons.cancelBulkUpdate": {
16633
+ "addons.cancelJob": {
16399
16634
  capName: "addons",
16400
16635
  capScope: "system",
16401
16636
  addonId: null,
@@ -16425,7 +16660,7 @@ Object.freeze({
16425
16660
  addonId: null,
16426
16661
  access: "view"
16427
16662
  },
16428
- "addons.getBulkUpdateState": {
16663
+ "addons.getJob": {
16429
16664
  capName: "addons",
16430
16665
  capScope: "system",
16431
16666
  addonId: null,
@@ -16473,19 +16708,19 @@ Object.freeze({
16473
16708
  addonId: null,
16474
16709
  access: "view"
16475
16710
  },
16476
- "addons.listActiveBulkUpdates": {
16711
+ "addons.listCapabilityProviders": {
16477
16712
  capName: "addons",
16478
16713
  capScope: "system",
16479
16714
  addonId: null,
16480
16715
  access: "view"
16481
16716
  },
16482
- "addons.listCapabilityProviders": {
16717
+ "addons.listFrameworkPackages": {
16483
16718
  capName: "addons",
16484
16719
  capScope: "system",
16485
16720
  addonId: null,
16486
16721
  access: "view"
16487
16722
  },
16488
- "addons.listFrameworkPackages": {
16723
+ "addons.listJobs": {
16489
16724
  capName: "addons",
16490
16725
  capScope: "system",
16491
16726
  addonId: null,
@@ -16569,7 +16804,7 @@ Object.freeze({
16569
16804
  addonId: null,
16570
16805
  access: "create"
16571
16806
  },
16572
- "addons.startBulkUpdate": {
16807
+ "addons.startJob": {
16573
16808
  capName: "addons",
16574
16809
  capScope: "system",
16575
16810
  addonId: null,
@@ -18795,6 +19030,12 @@ Object.freeze({
18795
19030
  addonId: null,
18796
19031
  access: "view"
18797
19032
  },
19033
+ "pipelineExecutor.getEngineProvisioning": {
19034
+ capName: "pipeline-executor",
19035
+ capScope: "system",
19036
+ addonId: null,
19037
+ access: "view"
19038
+ },
18798
19039
  "pipelineExecutor.getGlobalPipelineConfig": {
18799
19040
  capName: "pipeline-executor",
18800
19041
  capScope: "system",
@@ -18999,6 +19240,18 @@ Object.freeze({
18999
19240
  addonId: null,
19000
19241
  access: "view"
19001
19242
  },
19243
+ "pipelineOrchestrator.getCameraStatus": {
19244
+ capName: "pipeline-orchestrator",
19245
+ capScope: "system",
19246
+ addonId: null,
19247
+ access: "view"
19248
+ },
19249
+ "pipelineOrchestrator.getCameraStatuses": {
19250
+ capName: "pipeline-orchestrator",
19251
+ capScope: "system",
19252
+ addonId: null,
19253
+ access: "view"
19254
+ },
19002
19255
  "pipelineOrchestrator.getCameraStepOverrides": {
19003
19256
  capName: "pipeline-orchestrator",
19004
19257
  capScope: "system",
@@ -19083,6 +19336,12 @@ Object.freeze({
19083
19336
  addonId: null,
19084
19337
  access: "create"
19085
19338
  },
19339
+ "pipelineOrchestrator.setAgentMaxCameras": {
19340
+ capName: "pipeline-orchestrator",
19341
+ capScope: "system",
19342
+ addonId: null,
19343
+ access: "create"
19344
+ },
19086
19345
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19087
19346
  capName: "pipeline-orchestrator",
19088
19347
  capScope: "system",
@@ -20556,6 +20815,32 @@ Object.freeze({
20556
20815
  "network-access": "ingress",
20557
20816
  "smtp-provider": "email"
20558
20817
  });
20818
+ var frameworkSwapPackageSchema = object({
20819
+ name: string(),
20820
+ stagedPath: string(),
20821
+ backupPath: string(),
20822
+ toVersion: string(),
20823
+ fromVersion: string().nullable()
20824
+ });
20825
+ object({
20826
+ jobId: string(),
20827
+ taskId: string(),
20828
+ packages: array(frameworkSwapPackageSchema),
20829
+ requestedAtMs: number(),
20830
+ schemaVersion: literal(1)
20831
+ });
20832
+ object({
20833
+ jobId: string(),
20834
+ taskId: string(),
20835
+ backups: array(object({
20836
+ name: string(),
20837
+ backupPath: string(),
20838
+ livePath: string()
20839
+ })),
20840
+ appliedAtMs: number(),
20841
+ bootAttempts: number(),
20842
+ schemaVersion: literal(1)
20843
+ });
20559
20844
  //#endregion
20560
20845
  Object.defineProperty(exports, "BaseAddon", {
20561
20846
  enumerable: true,
@@ -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
@@ -16035,6 +16202,69 @@ method(_void(), array(IntegrationWithStateSchema)), method(object({ id: string()
16035
16202
  kind: "mutation",
16036
16203
  auth: "admin"
16037
16204
  });
16205
+ var jobKindSchema = _enum([
16206
+ "install",
16207
+ "update",
16208
+ "uninstall",
16209
+ "restart"
16210
+ ]);
16211
+ var taskPhaseSchema = _enum([
16212
+ "queued",
16213
+ "fetching",
16214
+ "staged",
16215
+ "validating",
16216
+ "applying",
16217
+ "restarting",
16218
+ "applied",
16219
+ "done",
16220
+ "failed",
16221
+ "skipped"
16222
+ ]);
16223
+ var taskTargetSchema = _enum(["framework", "addon"]);
16224
+ var taskLogEntrySchema = object({
16225
+ tsMs: number(),
16226
+ nodeId: string(),
16227
+ packageName: string(),
16228
+ phase: taskPhaseSchema,
16229
+ message: string()
16230
+ });
16231
+ var lifecycleTaskSchema = object({
16232
+ taskId: string(),
16233
+ nodeId: string(),
16234
+ packageName: string(),
16235
+ fromVersion: string().nullable(),
16236
+ toVersion: string(),
16237
+ target: taskTargetSchema,
16238
+ phase: taskPhaseSchema,
16239
+ stagedPath: string().nullable(),
16240
+ attempts: number(),
16241
+ steps: array(taskLogEntrySchema),
16242
+ error: string().nullable(),
16243
+ startedAtMs: number().nullable(),
16244
+ finishedAtMs: number().nullable()
16245
+ });
16246
+ var lifecycleJobStateSchema = _enum([
16247
+ "running",
16248
+ "completed",
16249
+ "failed",
16250
+ "partially-failed",
16251
+ "cancelled"
16252
+ ]);
16253
+ var lifecycleJobScopeSchema = _enum([
16254
+ "single",
16255
+ "bulk",
16256
+ "cluster"
16257
+ ]);
16258
+ var lifecycleJobSchema = object({
16259
+ jobId: string(),
16260
+ kind: jobKindSchema,
16261
+ createdAtMs: number(),
16262
+ createdBy: string(),
16263
+ scope: lifecycleJobScopeSchema,
16264
+ tasks: array(lifecycleTaskSchema),
16265
+ state: lifecycleJobStateSchema,
16266
+ schemaVersion: literal(1)
16267
+ });
16038
16268
  /**
16039
16269
  * addons — system-scoped singleton capability for addon package
16040
16270
  * management (install, update, configure, restart) and per-addon log
@@ -16217,7 +16447,7 @@ var BulkUpdatePhaseSchema = _enum([
16217
16447
  "restarting",
16218
16448
  "finalizing"
16219
16449
  ]);
16220
- var BulkUpdateStateSchema = object({
16450
+ object({
16221
16451
  id: string(),
16222
16452
  nodeId: string(),
16223
16453
  startedAtMs: number(),
@@ -16320,20 +16550,7 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16320
16550
  }), UpdateFrameworkPackageResultSchema, {
16321
16551
  kind: "mutation",
16322
16552
  auth: "admin"
16323
- }), method(object({
16324
- nodeId: string(),
16325
- items: array(object({
16326
- name: string(),
16327
- version: string(),
16328
- isSystem: boolean()
16329
- })).readonly()
16330
- }), object({ id: string() }), {
16331
- kind: "mutation",
16332
- auth: "admin"
16333
- }), method(object({ id: string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }), method(object({ id: string() }), object({ cancelled: boolean() }), {
16334
- kind: "mutation",
16335
- auth: "admin"
16336
- }), method(object({ nodeId: string().optional() }), array(BulkUpdateStateSchema).readonly(), { auth: "admin" }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16553
+ }), method(object({ name: string() }), array(PackageVersionInfoSchema).readonly()), method(object({ addonId: string() }), RestartAddonResultSchema, {
16337
16554
  kind: "mutation",
16338
16555
  auth: "admin"
16339
16556
  }), method(object({ packageName: string() }), object({ success: literal(true) }), {
@@ -16355,6 +16572,24 @@ method(_void(), array(AddonListItemSchema).readonly()), method(object({
16355
16572
  kind: "mutation",
16356
16573
  auth: "admin"
16357
16574
  }), method(CustomActionInputSchema, unknown(), { kind: "mutation" }), method(object({
16575
+ kind: _enum([
16576
+ "install",
16577
+ "update",
16578
+ "uninstall",
16579
+ "restart"
16580
+ ]),
16581
+ targets: array(object({
16582
+ name: string().min(1),
16583
+ version: string().min(1)
16584
+ })).min(1),
16585
+ nodeIds: array(string()).optional()
16586
+ }), object({ jobId: string() }), {
16587
+ kind: "mutation",
16588
+ auth: "admin"
16589
+ }), method(object({ jobId: string() }), lifecycleJobSchema.nullable(), { auth: "admin" }), method(object({ activeOnly: boolean().optional() }), array(lifecycleJobSchema), { auth: "admin" }), method(object({ jobId: string() }), object({ cancelled: boolean() }), {
16590
+ kind: "mutation",
16591
+ auth: "admin"
16592
+ }), method(object({
16358
16593
  addonId: string(),
16359
16594
  level: LogLevelSchema$1.optional()
16360
16595
  }), LogStreamEntrySchema, { kind: "subscription" });
@@ -16395,7 +16630,7 @@ Object.freeze({
16395
16630
  addonId: null,
16396
16631
  access: "create"
16397
16632
  },
16398
- "addons.cancelBulkUpdate": {
16633
+ "addons.cancelJob": {
16399
16634
  capName: "addons",
16400
16635
  capScope: "system",
16401
16636
  addonId: null,
@@ -16425,7 +16660,7 @@ Object.freeze({
16425
16660
  addonId: null,
16426
16661
  access: "view"
16427
16662
  },
16428
- "addons.getBulkUpdateState": {
16663
+ "addons.getJob": {
16429
16664
  capName: "addons",
16430
16665
  capScope: "system",
16431
16666
  addonId: null,
@@ -16473,19 +16708,19 @@ Object.freeze({
16473
16708
  addonId: null,
16474
16709
  access: "view"
16475
16710
  },
16476
- "addons.listActiveBulkUpdates": {
16711
+ "addons.listCapabilityProviders": {
16477
16712
  capName: "addons",
16478
16713
  capScope: "system",
16479
16714
  addonId: null,
16480
16715
  access: "view"
16481
16716
  },
16482
- "addons.listCapabilityProviders": {
16717
+ "addons.listFrameworkPackages": {
16483
16718
  capName: "addons",
16484
16719
  capScope: "system",
16485
16720
  addonId: null,
16486
16721
  access: "view"
16487
16722
  },
16488
- "addons.listFrameworkPackages": {
16723
+ "addons.listJobs": {
16489
16724
  capName: "addons",
16490
16725
  capScope: "system",
16491
16726
  addonId: null,
@@ -16569,7 +16804,7 @@ Object.freeze({
16569
16804
  addonId: null,
16570
16805
  access: "create"
16571
16806
  },
16572
- "addons.startBulkUpdate": {
16807
+ "addons.startJob": {
16573
16808
  capName: "addons",
16574
16809
  capScope: "system",
16575
16810
  addonId: null,
@@ -18795,6 +19030,12 @@ Object.freeze({
18795
19030
  addonId: null,
18796
19031
  access: "view"
18797
19032
  },
19033
+ "pipelineExecutor.getEngineProvisioning": {
19034
+ capName: "pipeline-executor",
19035
+ capScope: "system",
19036
+ addonId: null,
19037
+ access: "view"
19038
+ },
18798
19039
  "pipelineExecutor.getGlobalPipelineConfig": {
18799
19040
  capName: "pipeline-executor",
18800
19041
  capScope: "system",
@@ -18999,6 +19240,18 @@ Object.freeze({
18999
19240
  addonId: null,
19000
19241
  access: "view"
19001
19242
  },
19243
+ "pipelineOrchestrator.getCameraStatus": {
19244
+ capName: "pipeline-orchestrator",
19245
+ capScope: "system",
19246
+ addonId: null,
19247
+ access: "view"
19248
+ },
19249
+ "pipelineOrchestrator.getCameraStatuses": {
19250
+ capName: "pipeline-orchestrator",
19251
+ capScope: "system",
19252
+ addonId: null,
19253
+ access: "view"
19254
+ },
19002
19255
  "pipelineOrchestrator.getCameraStepOverrides": {
19003
19256
  capName: "pipeline-orchestrator",
19004
19257
  capScope: "system",
@@ -19083,6 +19336,12 @@ Object.freeze({
19083
19336
  addonId: null,
19084
19337
  access: "create"
19085
19338
  },
19339
+ "pipelineOrchestrator.setAgentMaxCameras": {
19340
+ capName: "pipeline-orchestrator",
19341
+ capScope: "system",
19342
+ addonId: null,
19343
+ access: "create"
19344
+ },
19086
19345
  "pipelineOrchestrator.setCameraPipelineForAgent": {
19087
19346
  capName: "pipeline-orchestrator",
19088
19347
  capScope: "system",
@@ -20556,5 +20815,31 @@ Object.freeze({
20556
20815
  "network-access": "ingress",
20557
20816
  "smtp-provider": "email"
20558
20817
  });
20818
+ var frameworkSwapPackageSchema = object({
20819
+ name: string(),
20820
+ stagedPath: string(),
20821
+ backupPath: string(),
20822
+ toVersion: string(),
20823
+ fromVersion: string().nullable()
20824
+ });
20825
+ object({
20826
+ jobId: string(),
20827
+ taskId: string(),
20828
+ packages: array(frameworkSwapPackageSchema),
20829
+ requestedAtMs: number(),
20830
+ schemaVersion: literal(1)
20831
+ });
20832
+ object({
20833
+ jobId: string(),
20834
+ taskId: string(),
20835
+ backups: array(object({
20836
+ name: string(),
20837
+ backupPath: string(),
20838
+ livePath: string()
20839
+ })),
20840
+ appliedAtMs: number(),
20841
+ bootAttempts: number(),
20842
+ schemaVersion: literal(1)
20843
+ });
20559
20844
  //#endregion
20560
20845
  export { networkAccessCapability as i, EventCategory as n, meshNetworkCapability as r, BaseAddon as t };
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-ByDiIgMC.js");
5
+ const require_dist = require("../dist-C3Gth0Ap.js");
6
6
  let node_child_process = require("node:child_process");
7
7
  let node_util = require("node:util");
8
8
  let node_crypto = require("node:crypto");
@@ -1,4 +1,4 @@
1
- import { i as networkAccessCapability, n as EventCategory, t as BaseAddon } from "../dist-DcSssCOP.mjs";
1
+ import { i as networkAccessCapability, n as EventCategory, t as BaseAddon } from "../dist-Dr1YikI7.mjs";
2
2
  import { execFile } from "node:child_process";
3
3
  import { promisify } from "node:util";
4
4
  import { randomUUID } from "node:crypto";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-tailscale",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "Tailscale bundle for CamStack — joins the host to a tailnet (client) and exposes the hub via Serve/Funnel (ingress). Multi-entry npm package shipping 2 addons under a single bundle.",
5
5
  "keywords": [
6
6
  "camstack",