@camstack/types 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.
package/dist/index.js CHANGED
@@ -473,6 +473,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
473
473
  */
474
474
  EventCategory["PipelineEngineMetricsSnapshot"] = "pipeline.engine-metrics-snapshot";
475
475
  /**
476
+ * Per-node detection-engine runtime-provisioning transition. Emitted by
477
+ * the detection-pipeline provider on every state change of its lazy
478
+ * engine-provisioning machine (idle → installing → verifying → ready,
479
+ * or → failed with a `nextRetryAt`). Payload is the
480
+ * `EngineProvisioningState` snapshot; `event.source.nodeId` carries the
481
+ * node. The Pipeline page subscribes to drive a live "installing
482
+ * OpenVINO… / ready" indicator per node without polling
483
+ * `pipelineExecutor.getEngineProvisioning`. Telemetry-grade (D8): the UI
484
+ * also reads the cap snapshot on mount / reconnect. Phase 2.
485
+ */
486
+ EventCategory["PipelineEngineProvisioning"] = "pipeline.engine-provisioning";
487
+ /**
476
488
  * Cluster topology snapshot. Carries the same payload returned by
477
489
  * `nodes.topology` (every reachable node + addons + processes).
478
490
  * Emitted by the hub on any agent / addon lifecycle change
@@ -622,14 +634,15 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
622
634
  EventCategory["DeviceSleeping"] = "device.sleeping";
623
635
  EventCategory["RetentionCleanup"] = "retention.cleanup";
624
636
  /**
625
- * Progress snapshot emitted by `BulkUpdateCoordinator` on every state
626
- * transition (item status change, phase change, completion, cancel).
627
- * Payload is `BulkUpdateState`. Admin UI subscribes via `useLiveEvent`
628
- * to drive the sticky `BulkUpdateBanner` and per-row `AddonRowBadge`.
629
- *
630
- * Spec: docs/superpowers/specs/2026-05-21-addons-bulk-update-progress-design.md
637
+ * Legacy bulk-update progress snapshot (payload `BulkUpdateState`). No longer
638
+ * emitted F3 removed the coordinator that produced it; "Update all" now runs
639
+ * as one lifecycle engine job (`AddonsJobProgress`/`AddonsJobLog`). Retained
640
+ * (with `BulkUpdateState`) only to avoid regenerating the event maps; removed
641
+ * in F4 once live bulk progress is re-implemented over the engine events.
631
642
  */
632
643
  EventCategory["AddonsBulkUpdateProgress"] = "addons.bulk-update-progress";
644
+ EventCategory["AddonsJobProgress"] = "addons.job-progress";
645
+ EventCategory["AddonsJobLog"] = "addons.job-log";
633
646
  /**
634
647
  * A container's child visibility toggled (hidden/shown). Emitted by the
635
648
  * `accessories` cap when a child device is hidden or revealed.
@@ -8401,6 +8414,24 @@ var DetectorOutputSchema = zod.z.object({
8401
8414
  inferenceMs: zod.z.number(),
8402
8415
  modelId: zod.z.string()
8403
8416
  });
8417
+ var EngineProvisioningSchema = zod.z.object({
8418
+ runtimeId: zod.z.enum([
8419
+ "onnx",
8420
+ "openvino",
8421
+ "coreml"
8422
+ ]).nullable(),
8423
+ device: zod.z.string().nullable(),
8424
+ state: zod.z.enum([
8425
+ "idle",
8426
+ "installing",
8427
+ "verifying",
8428
+ "ready",
8429
+ "failed"
8430
+ ]),
8431
+ progress: zod.z.number().optional(),
8432
+ error: zod.z.string().optional(),
8433
+ nextRetryAt: zod.z.number().optional()
8434
+ });
8404
8435
  var PipelineStepInputSchema = zod.z.lazy(() => zod.z.object({
8405
8436
  addonId: zod.z.string(),
8406
8437
  modelId: zod.z.string(),
@@ -8500,6 +8531,15 @@ var pipelineExecutorCapability = {
8500
8531
  kind: "mutation",
8501
8532
  auth: "admin"
8502
8533
  }),
8534
+ /**
8535
+ * Per-node detection-engine provisioning snapshot. Returns the live
8536
+ * state of the lazy runtime-provisioning machine on `nodeId`
8537
+ * (idle / installing / verifying / ready / failed). The UI pairs this
8538
+ * one-shot query with the `pipeline.engine-provisioning` live event
8539
+ * (emitted on every transition) to drive a per-node "engine ready?"
8540
+ * indicator without polling. Phase 2.
8541
+ */
8542
+ getEngineProvisioning: method(zod.z.object({ nodeId: zod.z.string() }), EngineProvisioningSchema),
8503
8543
  getVideoPipelineSteps: method(zod.z.void(), zod.z.record(zod.z.string(), zod.z.object({
8504
8544
  modelId: zod.z.string(),
8505
8545
  settings: zod.z.record(zod.z.string(), zod.z.unknown()).readonly()
@@ -12925,6 +12965,7 @@ function createDeviceProxy(api, binding, opts) {
12925
12965
  setCameraStepOverride: (input) => dispatchSystem("pipelineOrchestrator", "setCameraStepOverride", "mutation", input),
12926
12966
  setCameraPipelineForAgent: (input) => dispatchSystem("pipelineOrchestrator", "setCameraPipelineForAgent", "mutation", input),
12927
12967
  resolvePipeline: (input) => dispatchSystem("pipelineOrchestrator", "resolvePipeline", "query", input),
12968
+ getCameraStatus: (input) => dispatchSystem("pipelineOrchestrator", "getCameraStatus", "query", input),
12928
12969
  getDeviceSettingsContribution: (input) => dispatchSystem("pipelineOrchestrator", "getDeviceSettingsContribution", "query", input),
12929
12970
  getDeviceLiveContribution: (input) => dispatchSystem("pipelineOrchestrator", "getDeviceLiveContribution", "query", input),
12930
12971
  applyDeviceSettingsPatch: (input) => dispatchSystem("pipelineOrchestrator", "applyDeviceSettingsPatch", "mutation", input)
@@ -13087,10 +13128,6 @@ function createSystemProxy(api) {
13087
13128
  listCapabilityProviders: (input) => dispatch("addons", "listCapabilityProviders", "query", input),
13088
13129
  setCapabilityProviderEnabled: (input) => dispatch("addons", "setCapabilityProviderEnabled", "mutation", input),
13089
13130
  updateFrameworkPackage: (input) => dispatch("addons", "updateFrameworkPackage", "mutation", input),
13090
- startBulkUpdate: (input) => dispatch("addons", "startBulkUpdate", "mutation", input),
13091
- getBulkUpdateState: (input) => dispatch("addons", "getBulkUpdateState", "query", input),
13092
- cancelBulkUpdate: (input) => dispatch("addons", "cancelBulkUpdate", "mutation", input),
13093
- listActiveBulkUpdates: (input) => dispatch("addons", "listActiveBulkUpdates", "query", input),
13094
13131
  getVersions: (input) => dispatch("addons", "getVersions", "query", input),
13095
13132
  restartAddon: (input) => dispatch("addons", "restartAddon", "mutation", input),
13096
13133
  retryLoad: (input) => dispatch("addons", "retryLoad", "mutation", input),
@@ -13100,6 +13137,10 @@ function createSystemProxy(api) {
13100
13137
  setAddonAutoUpdate: (input) => dispatch("addons", "setAddonAutoUpdate", "mutation", input),
13101
13138
  applyAutoUpdateToAll: (input) => dispatch("addons", "applyAutoUpdateToAll", "mutation", input),
13102
13139
  custom: (input) => dispatch("addons", "custom", "mutation", input),
13140
+ startJob: (input) => dispatch("addons", "startJob", "mutation", input),
13141
+ getJob: (input) => dispatch("addons", "getJob", "query", input),
13142
+ listJobs: (input) => dispatch("addons", "listJobs", "query", input),
13143
+ cancelJob: (input) => dispatch("addons", "cancelJob", "mutation", input),
13103
13144
  onAddonLogs: (input, push) => dispatch("addons", "onAddonLogs", "subscription", input, push)
13104
13145
  },
13105
13146
  addonSettings: {
@@ -13336,6 +13377,7 @@ function createSystemProxy(api) {
13336
13377
  getSelectedEngine: (input) => dispatch("pipelineExecutor", "getSelectedEngine", "query", input),
13337
13378
  getDefaultSteps: (input) => dispatch("pipelineExecutor", "getDefaultSteps", "query", input),
13338
13379
  reprobeEngine: (input) => dispatch("pipelineExecutor", "reprobeEngine", "mutation", input),
13380
+ getEngineProvisioning: (input) => dispatch("pipelineExecutor", "getEngineProvisioning", "query", input),
13339
13381
  getVideoPipelineSteps: (input) => dispatch("pipelineExecutor", "getVideoPipelineSteps", "query", input),
13340
13382
  setVideoPipelineSteps: (input) => dispatch("pipelineExecutor", "setVideoPipelineSteps", "mutation", input),
13341
13383
  getSchema: (input) => dispatch("pipelineExecutor", "getSchema", "query", input),
@@ -13379,6 +13421,8 @@ function createSystemProxy(api) {
13379
13421
  listAgentSettings: (input) => dispatch("pipelineOrchestrator", "listAgentSettings", "query", input),
13380
13422
  setAgentAddonDefaults: (input) => dispatch("pipelineOrchestrator", "setAgentAddonDefaults", "mutation", input),
13381
13423
  removeAgentSettings: (input) => dispatch("pipelineOrchestrator", "removeAgentSettings", "mutation", input),
13424
+ setAgentMaxCameras: (input) => dispatch("pipelineOrchestrator", "setAgentMaxCameras", "mutation", input),
13425
+ getCameraStatuses: (input) => dispatch("pipelineOrchestrator", "getCameraStatuses", "query", input),
13382
13426
  listTemplates: (input) => dispatch("pipelineOrchestrator", "listTemplates", "query", input),
13383
13427
  saveTemplate: (input) => dispatch("pipelineOrchestrator", "saveTemplate", "mutation", input),
13384
13428
  updateTemplate: (input) => dispatch("pipelineOrchestrator", "updateTemplate", "mutation", input),
@@ -16994,7 +17038,10 @@ var AgentAddonConfigSchema = zod.z.object({
16994
17038
  modelId: zod.z.string(),
16995
17039
  settings: zod.z.record(zod.z.string(), zod.z.unknown()).readonly()
16996
17040
  });
16997
- var AgentPipelineSettingsSchema = zod.z.object({ addonDefaults: zod.z.record(zod.z.string(), AgentAddonConfigSchema).readonly() });
17041
+ var AgentPipelineSettingsSchema = zod.z.object({
17042
+ addonDefaults: zod.z.record(zod.z.string(), AgentAddonConfigSchema).readonly(),
17043
+ maxCameras: zod.z.number().int().nonnegative().nullable().default(null)
17044
+ });
16998
17045
  var CameraPipelineForAgentSchema = zod.z.object({
16999
17046
  steps: zod.z.array(PipelineStepInputSchema).readonly(),
17000
17047
  audio: zod.z.object({
@@ -17096,6 +17143,141 @@ var GlobalMetricsSchema = zod.z.object({
17096
17143
  * capability providers.
17097
17144
  */
17098
17145
  var CapabilityBindingsSchema = zod.z.record(zod.z.string(), zod.z.string());
17146
+ /** Stream entry surfaced from the stream-catalog for one device. */
17147
+ var CameraSourceStreamSchema = zod.z.object({
17148
+ camStreamId: zod.z.string(),
17149
+ codec: zod.z.string(),
17150
+ width: zod.z.number(),
17151
+ height: zod.z.number(),
17152
+ fps: zod.z.number(),
17153
+ kind: zod.z.string()
17154
+ });
17155
+ /** Source block — always present; derives from the stream catalog. */
17156
+ var CameraSourceStatusSchema = zod.z.object({ streams: zod.z.array(CameraSourceStreamSchema).readonly() });
17157
+ /** Assignment block — always present (orchestrator-local, no remote call). */
17158
+ var CameraAssignmentStatusSchema = zod.z.object({
17159
+ detectionNodeId: zod.z.string().nullable(),
17160
+ decoderNodeId: zod.z.string().nullable(),
17161
+ audioNodeId: zod.z.string().nullable(),
17162
+ pinned: zod.z.object({
17163
+ detection: zod.z.boolean(),
17164
+ decoder: zod.z.boolean(),
17165
+ audio: zod.z.boolean()
17166
+ }),
17167
+ reasons: zod.z.object({
17168
+ detection: zod.z.string().optional(),
17169
+ decoder: zod.z.string().optional(),
17170
+ audio: zod.z.string().optional()
17171
+ })
17172
+ });
17173
+ /** Broker profile slot entry within the broker block. */
17174
+ var CameraBrokerProfileSchema = zod.z.object({
17175
+ profile: zod.z.string(),
17176
+ status: zod.z.string(),
17177
+ codec: zod.z.string(),
17178
+ width: zod.z.number(),
17179
+ height: zod.z.number(),
17180
+ subscribers: zod.z.number(),
17181
+ inFps: zod.z.number(),
17182
+ outFps: zod.z.number()
17183
+ });
17184
+ /** Broker block — null when the broker stage is unreachable or inactive. */
17185
+ var CameraBrokerStatusSchema = zod.z.object({
17186
+ profiles: zod.z.array(CameraBrokerProfileSchema).readonly(),
17187
+ webrtcSessions: zod.z.number(),
17188
+ rtspRestream: zod.z.boolean()
17189
+ });
17190
+ /** Shared-memory ring statistics within the decoder block. */
17191
+ var CameraDecoderShmSchema = zod.z.object({
17192
+ framesWritten: zod.z.number(),
17193
+ getFrameHits: zod.z.number(),
17194
+ getFrameMisses: zod.z.number(),
17195
+ budgetMb: zod.z.number()
17196
+ });
17197
+ /** Decoder block — null when the decoder stage is unreachable or inactive. */
17198
+ var CameraDecoderStatusSchema = zod.z.object({
17199
+ nodeId: zod.z.string(),
17200
+ formats: zod.z.array(zod.z.string()).readonly(),
17201
+ sessionCount: zod.z.number(),
17202
+ shm: CameraDecoderShmSchema
17203
+ });
17204
+ /** Motion block — null when motion detection is not active for this device. */
17205
+ var CameraMotionStatusSchema = zod.z.object({
17206
+ enabled: zod.z.boolean(),
17207
+ fps: zod.z.number()
17208
+ });
17209
+ /** Detection engine provisioning state (mirrors pipeline-executor provisioning states). */
17210
+ var CameraDetectionProvisioningStateSchema = zod.z.enum([
17211
+ "idle",
17212
+ "installing",
17213
+ "verifying",
17214
+ "ready",
17215
+ "failed"
17216
+ ]);
17217
+ /** Detection provisioning sub-block. */
17218
+ var CameraDetectionProvisioningSchema = zod.z.object({
17219
+ state: CameraDetectionProvisioningStateSchema,
17220
+ error: zod.z.string().optional()
17221
+ });
17222
+ /** Detection phase — derived from the runner's engine phase. */
17223
+ var CameraDetectionPhaseSchema = zod.z.enum([
17224
+ "idle",
17225
+ "watching",
17226
+ "active"
17227
+ ]);
17228
+ /** Detection block — null when no detection node is assigned or reachable. */
17229
+ var CameraDetectionStatusSchema = zod.z.object({
17230
+ nodeId: zod.z.string(),
17231
+ engine: zod.z.object({
17232
+ backend: zod.z.string(),
17233
+ device: zod.z.string()
17234
+ }),
17235
+ phase: CameraDetectionPhaseSchema,
17236
+ configuredFps: zod.z.number(),
17237
+ actualFps: zod.z.number(),
17238
+ queueDepth: zod.z.number(),
17239
+ avgInferenceMs: zod.z.number(),
17240
+ provisioning: CameraDetectionProvisioningSchema
17241
+ });
17242
+ /** Audio block — null when no audio node is assigned or reachable. */
17243
+ var CameraAudioStatusSchema = zod.z.object({
17244
+ nodeId: zod.z.string(),
17245
+ enabled: zod.z.boolean()
17246
+ });
17247
+ /** Recording mode enum (matches recording cap). */
17248
+ var CameraRecordingModeSchema = zod.z.enum([
17249
+ "off",
17250
+ "continuous",
17251
+ "events"
17252
+ ]);
17253
+ /** Recording block — null when no recording cap is active for this device. */
17254
+ var CameraRecordingStatusSchema = zod.z.object({
17255
+ mode: CameraRecordingModeSchema,
17256
+ active: zod.z.boolean(),
17257
+ storageBytes: zod.z.number()
17258
+ });
17259
+ /**
17260
+ * Aggregated per-camera pipeline status — server-composed, single call.
17261
+ *
17262
+ * The `assignment` and `source` blocks are always present.
17263
+ * Every other block is `null` when the stage is inactive or unreachable
17264
+ * during the bounded parallel fan-out in the orchestrator implementation.
17265
+ *
17266
+ * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
17267
+ */
17268
+ var CameraStatusSchema = zod.z.object({
17269
+ deviceId: zod.z.number(),
17270
+ assignment: CameraAssignmentStatusSchema,
17271
+ source: CameraSourceStatusSchema,
17272
+ broker: CameraBrokerStatusSchema.nullable(),
17273
+ decoder: CameraDecoderStatusSchema.nullable(),
17274
+ motion: CameraMotionStatusSchema.nullable(),
17275
+ detection: CameraDetectionStatusSchema.nullable(),
17276
+ audio: CameraAudioStatusSchema.nullable(),
17277
+ recording: CameraRecordingStatusSchema.nullable(),
17278
+ /** Unix timestamp (ms) when this snapshot was composed server-side. */
17279
+ fetchedAt: zod.z.number()
17280
+ });
17099
17281
  /**
17100
17282
  * Pipeline Orchestrator capability — global load balancer + camera dispatcher.
17101
17283
  *
@@ -17272,6 +17454,25 @@ var pipelineOrchestratorCapability = {
17272
17454
  kind: "mutation",
17273
17455
  auth: "admin"
17274
17456
  }),
17457
+ /**
17458
+ * Set the per-node camera cap for one agent.
17459
+ *
17460
+ * `maxCameras: 0` and `maxCameras: null` are both treated as unlimited
17461
+ * by the load balancer (0 is stored as-is; the balancer treats ≤0 as
17462
+ * unlimited alongside null). Pass `null` to clear an existing cap.
17463
+ * Note: the admin UI normalises 0→null before calling this method, so
17464
+ * `maxCameras: 0` only reaches the store via direct SDK or CLI calls.
17465
+ * Changes take effect immediately on the next dispatch cycle — cameras
17466
+ * currently assigned over-cap are left in place (no forced eviction),
17467
+ * but new assignments obey the updated cap.
17468
+ */
17469
+ setAgentMaxCameras: method(zod.z.object({
17470
+ agentNodeId: zod.z.string(),
17471
+ maxCameras: zod.z.number().int().nonnegative().nullable()
17472
+ }), zod.z.object({ success: zod.z.literal(true) }), {
17473
+ kind: "mutation",
17474
+ auth: "admin"
17475
+ }),
17275
17476
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
17276
17477
  getCameraSettings: method(zod.z.object({ deviceId: zod.z.number() }), CameraPipelineSettingsSchema.nullable()),
17277
17478
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -17312,6 +17513,29 @@ var pipelineOrchestratorCapability = {
17312
17513
  deviceId: zod.z.number(),
17313
17514
  agentNodeId: zod.z.string().optional()
17314
17515
  }), CameraPipelineConfigSchema),
17516
+ /**
17517
+ * Server-composed aggregated status for a single camera.
17518
+ *
17519
+ * Fans out in parallel (bounded, per-stage graceful degradation) to
17520
+ * broker / decoder / motion / detection / audio / recording source caps
17521
+ * via `ctx.api`. A stage whose source errors or times out becomes `null`
17522
+ * in the returned payload — one slow agent never breaks the whole call.
17523
+ *
17524
+ * Intended for "on open / on camera select" snapshots. Live deltas
17525
+ * keep arriving from the existing ~1Hz events the UI already subscribes to.
17526
+ */
17527
+ getCameraStatus: method(zod.z.object({ deviceId: zod.z.number() }), CameraStatusSchema),
17528
+ /**
17529
+ * Server-composed aggregated status for multiple cameras in one call.
17530
+ *
17531
+ * `deviceIds` defaults to all cameras currently tracked by the
17532
+ * orchestrator's assignment map when omitted.
17533
+ *
17534
+ * Runs per-device composition in parallel (bounded). Use this to
17535
+ * populate the cluster assignments table and the pipeline flow overview
17536
+ * rail without issuing N parallel browser round-trips.
17537
+ */
17538
+ getCameraStatuses: method(zod.z.object({ deviceIds: zod.z.array(zod.z.number()).optional() }), zod.z.array(CameraStatusSchema).readonly()),
17315
17539
  /** List every template the operator has saved. */
17316
17540
  listTemplates: method(zod.z.void(), zod.z.array(PipelineTemplateSchema).readonly()),
17317
17541
  /** Create a new named preset from a given CameraPipelineConfig. */
@@ -22098,6 +22322,71 @@ var integrationsCapability = {
22098
22322
  }
22099
22323
  };
22100
22324
  //#endregion
22325
+ //#region src/lifecycle/job.ts
22326
+ var jobKindSchema = zod.z.enum([
22327
+ "install",
22328
+ "update",
22329
+ "uninstall",
22330
+ "restart"
22331
+ ]);
22332
+ var taskPhaseSchema = zod.z.enum([
22333
+ "queued",
22334
+ "fetching",
22335
+ "staged",
22336
+ "validating",
22337
+ "applying",
22338
+ "restarting",
22339
+ "applied",
22340
+ "done",
22341
+ "failed",
22342
+ "skipped"
22343
+ ]);
22344
+ var taskTargetSchema = zod.z.enum(["framework", "addon"]);
22345
+ var taskLogEntrySchema = zod.z.object({
22346
+ tsMs: zod.z.number(),
22347
+ nodeId: zod.z.string(),
22348
+ packageName: zod.z.string(),
22349
+ phase: taskPhaseSchema,
22350
+ message: zod.z.string()
22351
+ });
22352
+ var lifecycleTaskSchema = zod.z.object({
22353
+ taskId: zod.z.string(),
22354
+ nodeId: zod.z.string(),
22355
+ packageName: zod.z.string(),
22356
+ fromVersion: zod.z.string().nullable(),
22357
+ toVersion: zod.z.string(),
22358
+ target: taskTargetSchema,
22359
+ phase: taskPhaseSchema,
22360
+ stagedPath: zod.z.string().nullable(),
22361
+ attempts: zod.z.number(),
22362
+ steps: zod.z.array(taskLogEntrySchema),
22363
+ error: zod.z.string().nullable(),
22364
+ startedAtMs: zod.z.number().nullable(),
22365
+ finishedAtMs: zod.z.number().nullable()
22366
+ });
22367
+ var lifecycleJobStateSchema = zod.z.enum([
22368
+ "running",
22369
+ "completed",
22370
+ "failed",
22371
+ "partially-failed",
22372
+ "cancelled"
22373
+ ]);
22374
+ var lifecycleJobScopeSchema = zod.z.enum([
22375
+ "single",
22376
+ "bulk",
22377
+ "cluster"
22378
+ ]);
22379
+ var lifecycleJobSchema = zod.z.object({
22380
+ jobId: zod.z.string(),
22381
+ kind: jobKindSchema,
22382
+ createdAtMs: zod.z.number(),
22383
+ createdBy: zod.z.string(),
22384
+ scope: lifecycleJobScopeSchema,
22385
+ tasks: zod.z.array(lifecycleTaskSchema),
22386
+ state: lifecycleJobStateSchema,
22387
+ schemaVersion: zod.z.literal(1)
22388
+ });
22389
+ //#endregion
22101
22390
  //#region src/capabilities/addons.cap.ts
22102
22391
  /**
22103
22392
  * addons — system-scoped singleton capability for addon package
@@ -22281,7 +22570,7 @@ var BulkUpdatePhaseSchema = zod.z.enum([
22281
22570
  "restarting",
22282
22571
  "finalizing"
22283
22572
  ]);
22284
- var BulkUpdateStateSchema = zod.z.object({
22573
+ zod.z.object({
22285
22574
  id: zod.z.string(),
22286
22575
  nodeId: zod.z.string(),
22287
22576
  startedAtMs: zod.z.number(),
@@ -22517,54 +22806,6 @@ var addonsCapability = {
22517
22806
  kind: "mutation",
22518
22807
  auth: "admin"
22519
22808
  }),
22520
- /**
22521
- * Kicks off a server-side bulk update operation and returns the bulk
22522
- * id immediately. The operation runs asynchronously; observe progress
22523
- * via the `AddonsBulkUpdateProgress` event or `getBulkUpdateState`.
22524
- * Items with `isSystem: true` use `deferRestart` — the hub restarts
22525
- * ONCE at the end of the system phase, after all system packages are
22526
- * installed.
22527
- *
22528
- * `items[].version` is REQUIRED — callers must pass the resolved
22529
- * version from `listUpdates`. There is no `'latest'` default here
22530
- * (unlike `updatePackage`) to guarantee deterministic bulk rolls.
22531
- */
22532
- startBulkUpdate: method(zod.z.object({
22533
- nodeId: zod.z.string(),
22534
- items: zod.z.array(zod.z.object({
22535
- name: zod.z.string(),
22536
- version: zod.z.string(),
22537
- isSystem: zod.z.boolean()
22538
- })).readonly()
22539
- }), zod.z.object({ id: zod.z.string() }), {
22540
- kind: "mutation",
22541
- auth: "admin"
22542
- }),
22543
- /**
22544
- * Returns the current state of a bulk update by id.
22545
- * Returns `null` if the id is unknown or has been auto-cleaned
22546
- * (5 minutes after `completedAt` the record is evicted from memory).
22547
- */
22548
- getBulkUpdateState: method(zod.z.object({ id: zod.z.string() }), BulkUpdateStateSchema.nullable(), { auth: "admin" }),
22549
- /**
22550
- * Cancels an in-flight bulk update. The update loop exits after the
22551
- * currently-processing item completes — cancellation is not
22552
- * instantaneous. Has no effect once the `restarting` phase has been
22553
- * entered (the hub is already shutting down at that point).
22554
- * Returns `{ cancelled: false }` if the id is unknown, the operation
22555
- * has already completed, or the `restarting` phase is active.
22556
- */
22557
- cancelBulkUpdate: method(zod.z.object({ id: zod.z.string() }), zod.z.object({ cancelled: zod.z.boolean() }), {
22558
- kind: "mutation",
22559
- auth: "admin"
22560
- }),
22561
- /**
22562
- * Lists all currently active (non-completed) bulk updates.
22563
- * If `nodeId` is provided, filters to only bulk updates targeting
22564
- * that node. Useful for restoring an in-progress banner on a fresh
22565
- * page load when the UI reconnects mid-operation.
22566
- */
22567
- listActiveBulkUpdates: method(zod.z.object({ nodeId: zod.z.string().optional() }), zod.z.array(BulkUpdateStateSchema).readonly(), { auth: "admin" }),
22568
22809
  getVersions: method(zod.z.object({ name: zod.z.string() }), zod.z.array(PackageVersionInfoSchema).readonly()),
22569
22810
  restartAddon: method(zod.z.object({ addonId: zod.z.string() }), RestartAddonResultSchema, {
22570
22811
  kind: "mutation",
@@ -22601,6 +22842,51 @@ var addonsCapability = {
22601
22842
  auth: "admin"
22602
22843
  }),
22603
22844
  custom: method(CustomActionInputSchema, zod.z.unknown(), { kind: "mutation" }),
22845
+ /**
22846
+ * Start a lifecycle job (install / update / uninstall / restart) for one
22847
+ * or more addon packages. Returns the `jobId` immediately — the job runs
22848
+ * asynchronously. Observe progress via `EventCategory.AddonsJobProgress` /
22849
+ * `AddonsJobLog` events or poll `getJob`.
22850
+ *
22851
+ * For a single-addon update on the hub the provider also routes
22852
+ * `updatePackage` through this path so the fast swap + atomic-restart
22853
+ * path (`applyStagedAddonUpdate`) is always used.
22854
+ */
22855
+ startJob: method(zod.z.object({
22856
+ kind: zod.z.enum([
22857
+ "install",
22858
+ "update",
22859
+ "uninstall",
22860
+ "restart"
22861
+ ]),
22862
+ targets: zod.z.array(zod.z.object({
22863
+ name: zod.z.string().min(1),
22864
+ version: zod.z.string().min(1)
22865
+ })).min(1),
22866
+ nodeIds: zod.z.array(zod.z.string()).optional()
22867
+ }), zod.z.object({ jobId: zod.z.string() }), {
22868
+ kind: "mutation",
22869
+ auth: "admin"
22870
+ }),
22871
+ /**
22872
+ * Retrieve a lifecycle job by id. Returns `null` when the id is unknown
22873
+ * (e.g. evicted after the retention window).
22874
+ */
22875
+ getJob: method(zod.z.object({ jobId: zod.z.string() }), lifecycleJobSchema.nullable(), { auth: "admin" }),
22876
+ /**
22877
+ * List lifecycle jobs. When `activeOnly` is true, only jobs still in
22878
+ * `running` state are returned.
22879
+ */
22880
+ listJobs: method(zod.z.object({ activeOnly: zod.z.boolean().optional() }), zod.z.array(lifecycleJobSchema), { auth: "admin" }),
22881
+ /**
22882
+ * Cancel a lifecycle job that is queued but not yet actively running.
22883
+ * Returns `{ cancelled: false }` if the job is unknown, already in a
22884
+ * terminal state, or actively executing (cannot abort mid-flight).
22885
+ */
22886
+ cancelJob: method(zod.z.object({ jobId: zod.z.string() }), zod.z.object({ cancelled: zod.z.boolean() }), {
22887
+ kind: "mutation",
22888
+ auth: "admin"
22889
+ }),
22604
22890
  onAddonLogs: method(zod.z.object({
22605
22891
  addonId: zod.z.string(),
22606
22892
  level: LogLevelSchema$1.optional()
@@ -23562,7 +23848,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
23562
23848
  addonId: null,
23563
23849
  access: "create"
23564
23850
  },
23565
- "addons.cancelBulkUpdate": {
23851
+ "addons.cancelJob": {
23566
23852
  capName: "addons",
23567
23853
  capScope: "system",
23568
23854
  addonId: null,
@@ -23592,7 +23878,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
23592
23878
  addonId: null,
23593
23879
  access: "view"
23594
23880
  },
23595
- "addons.getBulkUpdateState": {
23881
+ "addons.getJob": {
23596
23882
  capName: "addons",
23597
23883
  capScope: "system",
23598
23884
  addonId: null,
@@ -23640,19 +23926,19 @@ var METHOD_ACCESS_MAP = Object.freeze({
23640
23926
  addonId: null,
23641
23927
  access: "view"
23642
23928
  },
23643
- "addons.listActiveBulkUpdates": {
23929
+ "addons.listCapabilityProviders": {
23644
23930
  capName: "addons",
23645
23931
  capScope: "system",
23646
23932
  addonId: null,
23647
23933
  access: "view"
23648
23934
  },
23649
- "addons.listCapabilityProviders": {
23935
+ "addons.listFrameworkPackages": {
23650
23936
  capName: "addons",
23651
23937
  capScope: "system",
23652
23938
  addonId: null,
23653
23939
  access: "view"
23654
23940
  },
23655
- "addons.listFrameworkPackages": {
23941
+ "addons.listJobs": {
23656
23942
  capName: "addons",
23657
23943
  capScope: "system",
23658
23944
  addonId: null,
@@ -23736,7 +24022,7 @@ var METHOD_ACCESS_MAP = Object.freeze({
23736
24022
  addonId: null,
23737
24023
  access: "create"
23738
24024
  },
23739
- "addons.startBulkUpdate": {
24025
+ "addons.startJob": {
23740
24026
  capName: "addons",
23741
24027
  capScope: "system",
23742
24028
  addonId: null,
@@ -25962,6 +26248,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
25962
26248
  addonId: null,
25963
26249
  access: "view"
25964
26250
  },
26251
+ "pipelineExecutor.getEngineProvisioning": {
26252
+ capName: "pipeline-executor",
26253
+ capScope: "system",
26254
+ addonId: null,
26255
+ access: "view"
26256
+ },
25965
26257
  "pipelineExecutor.getGlobalPipelineConfig": {
25966
26258
  capName: "pipeline-executor",
25967
26259
  capScope: "system",
@@ -26166,6 +26458,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
26166
26458
  addonId: null,
26167
26459
  access: "view"
26168
26460
  },
26461
+ "pipelineOrchestrator.getCameraStatus": {
26462
+ capName: "pipeline-orchestrator",
26463
+ capScope: "system",
26464
+ addonId: null,
26465
+ access: "view"
26466
+ },
26467
+ "pipelineOrchestrator.getCameraStatuses": {
26468
+ capName: "pipeline-orchestrator",
26469
+ capScope: "system",
26470
+ addonId: null,
26471
+ access: "view"
26472
+ },
26169
26473
  "pipelineOrchestrator.getCameraStepOverrides": {
26170
26474
  capName: "pipeline-orchestrator",
26171
26475
  capScope: "system",
@@ -26250,6 +26554,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
26250
26554
  addonId: null,
26251
26555
  access: "create"
26252
26556
  },
26557
+ "pipelineOrchestrator.setAgentMaxCameras": {
26558
+ capName: "pipeline-orchestrator",
26559
+ capScope: "system",
26560
+ addonId: null,
26561
+ access: "create"
26562
+ },
26253
26563
  "pipelineOrchestrator.setCameraPipelineForAgent": {
26254
26564
  capName: "pipeline-orchestrator",
26255
26565
  capScope: "system",
@@ -28023,6 +28333,34 @@ function getCapsByProviderKind(kind) {
28023
28333
  return out;
28024
28334
  }
28025
28335
  //#endregion
28336
+ //#region src/lifecycle/framework-swap.ts
28337
+ var frameworkSwapPackageSchema = zod.z.object({
28338
+ name: zod.z.string(),
28339
+ stagedPath: zod.z.string(),
28340
+ backupPath: zod.z.string(),
28341
+ toVersion: zod.z.string(),
28342
+ fromVersion: zod.z.string().nullable()
28343
+ });
28344
+ var pendingFrameworkSwapSchema = zod.z.object({
28345
+ jobId: zod.z.string(),
28346
+ taskId: zod.z.string(),
28347
+ packages: zod.z.array(frameworkSwapPackageSchema),
28348
+ requestedAtMs: zod.z.number(),
28349
+ schemaVersion: zod.z.literal(1)
28350
+ });
28351
+ var frameworkSwapConfirmSchema = zod.z.object({
28352
+ jobId: zod.z.string(),
28353
+ taskId: zod.z.string(),
28354
+ backups: zod.z.array(zod.z.object({
28355
+ name: zod.z.string(),
28356
+ backupPath: zod.z.string(),
28357
+ livePath: zod.z.string()
28358
+ })),
28359
+ appliedAtMs: zod.z.number(),
28360
+ bootAttempts: zod.z.number(),
28361
+ schemaVersion: zod.z.literal(1)
28362
+ });
28363
+ //#endregion
28026
28364
  //#region src/util/location-match.ts
28027
28365
  /**
28028
28366
  * Pure fuzzy matcher for adoption location import. Normalized
@@ -28458,10 +28796,26 @@ exports.CamProfileSchema = CamProfileSchema;
28458
28796
  exports.CamStreamDescriptorSchema = CamStreamDescriptorSchema;
28459
28797
  exports.CamStreamKindSchema = CamStreamKindSchema;
28460
28798
  exports.CamStreamResolutionSchema = CamStreamResolutionSchema;
28799
+ exports.CameraAssignmentStatusSchema = CameraAssignmentStatusSchema;
28800
+ exports.CameraAudioStatusSchema = CameraAudioStatusSchema;
28801
+ exports.CameraBrokerProfileSchema = CameraBrokerProfileSchema;
28802
+ exports.CameraBrokerStatusSchema = CameraBrokerStatusSchema;
28461
28803
  exports.CameraCredentialsSchema = CameraCredentialsSchema;
28462
28804
  exports.CameraCredentialsStatusSchema = CameraCredentialsStatusSchema;
28805
+ exports.CameraDecoderShmSchema = CameraDecoderShmSchema;
28806
+ exports.CameraDecoderStatusSchema = CameraDecoderStatusSchema;
28807
+ exports.CameraDetectionPhaseSchema = CameraDetectionPhaseSchema;
28808
+ exports.CameraDetectionProvisioningSchema = CameraDetectionProvisioningSchema;
28809
+ exports.CameraDetectionProvisioningStateSchema = CameraDetectionProvisioningStateSchema;
28810
+ exports.CameraDetectionStatusSchema = CameraDetectionStatusSchema;
28463
28811
  exports.CameraMetricsSchema = CameraMetricsSchema;
28464
28812
  exports.CameraMetricsWithDeviceIdSchema = CameraMetricsWithDeviceIdSchema;
28813
+ exports.CameraMotionStatusSchema = CameraMotionStatusSchema;
28814
+ exports.CameraRecordingModeSchema = CameraRecordingModeSchema;
28815
+ exports.CameraRecordingStatusSchema = CameraRecordingStatusSchema;
28816
+ exports.CameraSourceStatusSchema = CameraSourceStatusSchema;
28817
+ exports.CameraSourceStreamSchema = CameraSourceStreamSchema;
28818
+ exports.CameraStatusSchema = CameraStatusSchema;
28465
28819
  exports.CameraStreamSchema = CameraStreamSchema;
28466
28820
  exports.CandidateQueryFilterSchema = CandidateQueryFilterSchema;
28467
28821
  exports.CapScopeSchema = CapScopeSchema;
@@ -28914,6 +29268,8 @@ exports.findTimezone = findTimezone;
28914
29268
  exports.floodCapability = floodCapability;
28915
29269
  exports.formatForBackend = formatForBackend;
28916
29270
  exports.formatForRuntime = formatForRuntime;
29271
+ exports.frameworkSwapConfirmSchema = frameworkSwapConfirmSchema;
29272
+ exports.frameworkSwapPackageSchema = frameworkSwapPackageSchema;
28917
29273
  exports.gasCapability = gasCapability;
28918
29274
  exports.getAudioMacroClassIds = getAudioMacroClassIds;
28919
29275
  exports.getByPath = getByPath;
@@ -28929,7 +29285,12 @@ exports.isAgentOnlyPlacement = isAgentOnlyPlacement;
28929
29285
  exports.isDeployableToAgent = isDeployableToAgent;
28930
29286
  exports.isDeviceConfigCap = isDeviceConfigCap;
28931
29287
  exports.isEvent = isEvent;
29288
+ exports.jobKindSchema = jobKindSchema;
28932
29289
  exports.lawnMowerControlCapability = lawnMowerControlCapability;
29290
+ exports.lifecycleJobSchema = lifecycleJobSchema;
29291
+ exports.lifecycleJobScopeSchema = lifecycleJobScopeSchema;
29292
+ exports.lifecycleJobStateSchema = lifecycleJobStateSchema;
29293
+ exports.lifecycleTaskSchema = lifecycleTaskSchema;
28933
29294
  exports.localNetworkCapability = localNetworkCapability;
28934
29295
  exports.locationSimilarity = locationSimilarity;
28935
29296
  exports.lockControlCapability = lockControlCapability;
@@ -28966,6 +29327,7 @@ exports.parseJsonObject = parseJsonObject;
28966
29327
  exports.parseJsonUnknown = parseJsonUnknown;
28967
29328
  exports.parseProfileBrokerId = parseProfileBrokerId;
28968
29329
  exports.parseStreamParamsFormPatch = parseStreamParamsFormPatch;
29330
+ exports.pendingFrameworkSwapSchema = pendingFrameworkSwapSchema;
28969
29331
  exports.pickPreferredRtspEntry = pickPreferredRtspEntry;
28970
29332
  exports.pipelineAnalyticsCapability = pipelineAnalyticsCapability;
28971
29333
  exports.pipelineExecutorCapability = pipelineExecutorCapability;
@@ -29020,6 +29382,9 @@ exports.switchCapability = switchCapability;
29020
29382
  exports.synthesizeSourceInfo = synthesizeSourceInfo;
29021
29383
  exports.systemCapability = systemCapability;
29022
29384
  exports.tamperCapability = tamperCapability;
29385
+ exports.taskLogEntrySchema = taskLogEntrySchema;
29386
+ exports.taskPhaseSchema = taskPhaseSchema;
29387
+ exports.taskTargetSchema = taskTargetSchema;
29023
29388
  exports.temperatureSensorCapability = temperatureSensorCapability;
29024
29389
  exports.toDeviceSummary = toDeviceSummary;
29025
29390
  exports.toStreamSourceEntry = toStreamSourceEntry;