@camstack/addon-pipeline 1.2.171 → 1.2.173

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/audio-analyzer/index.js +2 -2
  2. package/dist/audio-analyzer/index.mjs +2 -2
  3. package/dist/detection-pipeline/index.js +5 -5
  4. package/dist/detection-pipeline/index.mjs +4 -4
  5. package/dist/{dist-D0liXHO7.mjs → dist-D35w3ngN.mjs} +154 -3
  6. package/dist/{dist-M39Js6iu.js → dist-DSJDq5hY.js} +154 -3
  7. package/dist/{lazy-sharp-CO-c2L9_.js → lazy-sharp-Fre6HHg6.js} +1 -1
  8. package/dist/{local-frame-registry--_WjAPa2.mjs → local-frame-registry-AtRvlifj.mjs} +1 -1
  9. package/dist/{local-frame-registry-CHUbcz6r.js → local-frame-registry-Y4TreSiT.js} +1 -1
  10. package/dist/motion-wasm/index.js +2 -2
  11. package/dist/motion-wasm/index.mjs +1 -1
  12. package/dist/{node-CQ6VBSrE.mjs → node-B2NS7cyi.mjs} +1 -1
  13. package/dist/{node-Byy6tlFm.js → node-DVcGI_Kr.js} +1 -1
  14. package/dist/pipeline-runner/index.js +63 -6
  15. package/dist/pipeline-runner/index.mjs +62 -5
  16. package/dist/{process-memory-DjLHImhM.mjs → process-memory-BFuXzmyZ.mjs} +1 -1
  17. package/dist/{process-memory-CH3OIHHe.js → process-memory-DR2vCoO6.js} +1 -1
  18. package/dist/recorder/index.js +97 -13
  19. package/dist/recorder/index.mjs +97 -13
  20. package/dist/{segment-demux-js-B0KzROD9.js → segment-demux-js-CeJfEP5v.js} +1 -1
  21. package/dist/{segment-demux-js-Bmy3u2VM.mjs → segment-demux-js-wtPM5v2H.mjs} +1 -1
  22. package/dist/session-decode/decode-worker-child.js +2 -2
  23. package/dist/session-decode/decode-worker-child.mjs +1 -1
  24. package/dist/stream-broker/_stub.js +2 -2
  25. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CN6ybZtQ.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-eyqVqXTI.mjs} +3 -3
  26. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-B_HZNoVq.mjs +26 -0
  27. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-BC-nahrU.mjs +26 -0
  28. package/dist/stream-broker/demux-worker-child.js +1 -1
  29. package/dist/stream-broker/demux-worker-child.mjs +1 -1
  30. package/dist/stream-broker/{hostInit-Dq40Ieaf.mjs → hostInit-eKLgfpTH.mjs} +3 -3
  31. package/dist/stream-broker/index.js +87 -4
  32. package/dist/stream-broker/index.mjs +87 -4
  33. package/dist/stream-broker/remoteEntry.js +1 -1
  34. package/dist/{worker-protocol-CAWMqnxs.mjs → worker-protocol-B7PzysnJ.mjs} +1 -1
  35. package/dist/{worker-protocol-NB-CjUQf.js → worker-protocol-wr4XEhUh.js} +1 -1
  36. package/package.json +8 -1
  37. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-BjYSKqCM.mjs +0 -26
  38. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-E0nHxt6U.mjs +0 -26
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-M39Js6iu.js");
6
- const require_process_memory = require("../process-memory-CH3OIHHe.js");
5
+ const require_dist = require("../dist-DSJDq5hY.js");
6
+ const require_process_memory = require("../process-memory-DR2vCoO6.js");
7
7
  let node_fs = require("node:fs");
8
8
  node_fs = require_dist.__toESM(node_fs);
9
9
  let node_path = require("node:path");
@@ -1,6 +1,6 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { A as audioAnalysisCapability, It as hydrateSchema, S as PoolMemoryWatchdog, _t as resolvePoolMemoryPolicy, j as audioAnalyzerCapability, jt as BaseAddon, n as AUDIO_BACKEND_CHOICES, nt as mapAudioLabelToMacro, s as DEFAULT_AUDIO_ANALYZER_CONFIG, v as HF_BASE_URL, wt as errMsg } from "../dist-D0liXHO7.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-DjLHImhM.mjs";
2
+ import { A as audioAnalysisCapability, It as hydrateSchema, S as PoolMemoryWatchdog, _t as resolvePoolMemoryPolicy, j as audioAnalyzerCapability, jt as BaseAddon, n as AUDIO_BACKEND_CHOICES, nt as mapAudioLabelToMacro, s as DEFAULT_AUDIO_ANALYZER_CONFIG, v as HF_BASE_URL, wt as errMsg } from "../dist-D35w3ngN.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BFuXzmyZ.mjs";
4
4
  import * as fs from "node:fs";
5
5
  import * as path$1 from "node:path";
6
6
  import { downloadFile } from "@camstack/system/addon-utils";
@@ -2,12 +2,12 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-M39Js6iu.js");
6
- const require_node = require("../node-Byy6tlFm.js");
7
- const require_local_frame_registry = require("../local-frame-registry-CHUbcz6r.js");
8
- const require_lazy_sharp = require("../lazy-sharp-CO-c2L9_.js");
5
+ const require_dist = require("../dist-DSJDq5hY.js");
6
+ const require_node = require("../node-DVcGI_Kr.js");
7
+ const require_local_frame_registry = require("../local-frame-registry-Y4TreSiT.js");
8
+ const require_lazy_sharp = require("../lazy-sharp-Fre6HHg6.js");
9
9
  const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DaUBcb13.js");
10
- const require_process_memory = require("../process-memory-CH3OIHHe.js");
10
+ const require_process_memory = require("../process-memory-DR2vCoO6.js");
11
11
  let node_fs = require("node:fs");
12
12
  node_fs = require_dist.__toESM(node_fs);
13
13
  let node_path = require("node:path");
@@ -1,10 +1,10 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { Bt as nodePin, Ft as createEvent, It as hydrateSchema, Kt as array, O as YAMNET_TO_MACRO, Q as inferModelProvider, Qt as object, S as PoolMemoryWatchdog, St as supportedRuntimes$1, Vt as parseJsonUnknown, W as detectionPipelineCapability, Wt as sleep, Y as evaluateZoneRules, _t as resolvePoolMemoryPolicy, at as overlayClusterStepSettings, c as DEFAULT_CLUSTER_STEP_MODELS, ct as pickClusterStepSettings, dt as pipelineExecutorCapability, en as string, et as loadContributionCapability, ht as resolveClusterStepModelId, jt as BaseAddon, l as DEFAULT_CLUSTER_STEP_SETTINGS, m as DEVICE_BACKEND_TO_FORMAT, nn as EventCategory, q as enumerateInferenceDevices, st as pickClusterStepModels, t as APPLE_SA_TO_MACRO, tn as union, wt as errMsg, yt as runtimeDevices$1, z as defaultDeviceFor$1 } from "../dist-D0liXHO7.mjs";
3
- import { a as readProcessCost } from "../node-CQ6VBSrE.mjs";
4
- import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep, t as localFrameRegistry, u as landmarkPrecisionVerdict } from "../local-frame-registry--_WjAPa2.mjs";
2
+ import { Bt as nodePin, Ft as createEvent, It as hydrateSchema, Kt as array, O as YAMNET_TO_MACRO, Q as inferModelProvider, Qt as object, S as PoolMemoryWatchdog, St as supportedRuntimes$1, Vt as parseJsonUnknown, W as detectionPipelineCapability, Wt as sleep, Y as evaluateZoneRules, _t as resolvePoolMemoryPolicy, at as overlayClusterStepSettings, c as DEFAULT_CLUSTER_STEP_MODELS, ct as pickClusterStepSettings, dt as pipelineExecutorCapability, en as string, et as loadContributionCapability, ht as resolveClusterStepModelId, jt as BaseAddon, l as DEFAULT_CLUSTER_STEP_SETTINGS, m as DEVICE_BACKEND_TO_FORMAT, nn as EventCategory, q as enumerateInferenceDevices, st as pickClusterStepModels, t as APPLE_SA_TO_MACRO, tn as union, wt as errMsg, yt as runtimeDevices$1, z as defaultDeviceFor$1 } from "../dist-D35w3ngN.mjs";
3
+ import { a as readProcessCost } from "../node-B2NS7cyi.mjs";
4
+ import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep, t as localFrameRegistry, u as landmarkPrecisionVerdict } from "../local-frame-registry-AtRvlifj.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
6
6
  import { n as startEventLoopStallMonitor } from "../event-loop-stall-monitor-DXLNBMkY.mjs";
7
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-DjLHImhM.mjs";
7
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BFuXzmyZ.mjs";
8
8
  import * as fs from "node:fs";
9
9
  import * as path$1 from "node:path";
10
10
  import { spawn } from "node:child_process";
@@ -12061,6 +12061,89 @@ var LocationStatSchema = object({
12061
12061
  fileCount: number(),
12062
12062
  present: boolean()
12063
12063
  });
12064
+ /** Lifecycle of a backup run. Terminal states: succeeded / failed / cancelled. */
12065
+ var BackupRunStateSchema = _enum([
12066
+ "queued",
12067
+ "running",
12068
+ "succeeded",
12069
+ "failed",
12070
+ "cancelled"
12071
+ ]);
12072
+ /**
12073
+ * Where a running backup currently is. `queued` before it starts,
12074
+ * `building` while the tar.gz is being staged, `uploading` during the
12075
+ * per-destination fan-out, `done` once terminal.
12076
+ */
12077
+ var BackupRunPhaseSchema = _enum([
12078
+ "queued",
12079
+ "building",
12080
+ "uploading",
12081
+ "done"
12082
+ ]);
12083
+ /**
12084
+ * Observable state of one backup run — readable WHILE it runs via
12085
+ * `backup.listRuns`. This is what makes the execution queue and
12086
+ * `backup.cancel` usable: the 2026-09-04 incident (two concurrent
12087
+ * multi-GB builds, staging 5.1 GB → 18 GB, load 62) was only
12088
+ * diagnosable with `du` because nothing reported that runs existed or
12089
+ * how large the staged archive had grown.
12090
+ */
12091
+ var BackupRunSchema = object({
12092
+ /** Stable run id — the handle `backup.cancel` takes. */
12093
+ id: string(),
12094
+ state: BackupRunStateSchema,
12095
+ phase: BackupRunPhaseSchema,
12096
+ /**
12097
+ * Resolved destination location ids. Empty while queued (targets are
12098
+ * resolved when the run starts, against the then-current policies).
12099
+ */
12100
+ destinationIds: array(string()).readonly(),
12101
+ label: string().optional(),
12102
+ /** ms-epoch when the run was submitted (trigger call / schedule fire). */
12103
+ requestedAt: number(),
12104
+ /** ms-epoch when the run left the queue and started building. */
12105
+ startedAt: number().optional(),
12106
+ /** ms-epoch when the run reached a terminal state. */
12107
+ finishedAt: number().optional(),
12108
+ /** Compressed bytes of the staging archive written so far. */
12109
+ stagedBytes: number(),
12110
+ /** Final staged archive size, once the build phase completes. */
12111
+ archiveSizeBytes: number().optional(),
12112
+ /** Bytes pushed to the destination currently uploading. */
12113
+ uploadedBytes: number(),
12114
+ /** Destinations where the archive fully landed (uploaded + indexed). */
12115
+ completedDestinationIds: array(string()).readonly(),
12116
+ /** Destinations that failed during the fan-out. */
12117
+ failedDestinationIds: array(string()).readonly(),
12118
+ /** Failure message when `state === 'failed'`. */
12119
+ error: string().optional(),
12120
+ /**
12121
+ * 1-based place in the execution queue — 1 = runs next. Present only
12122
+ * while `state === 'queued'`. Stamped by the orchestrator from the
12123
+ * queue's OWN pending order, never derived from timestamps, so the
12124
+ * UI cannot show an order the executor will not honour.
12125
+ */
12126
+ queuePosition: number().int().min(1).optional()
12127
+ });
12128
+ /**
12129
+ * Result of `backup.trigger`. The call still resolves when the run
12130
+ * terminates (compat with schedule-driven runs and the admin UI), but
12131
+ * it now names the run and says whether it had to WAIT: a trigger that
12132
+ * arrives while another run is in flight is enqueued (or joined onto
12133
+ * an identical already-queued run), never started concurrently.
12134
+ */
12135
+ var BackupTriggerResultSchema = object({
12136
+ /** The run this trigger mapped to — poll it via `listRuns`, stop it via `cancel`. */
12137
+ runId: string(),
12138
+ /** True when the run waited behind an in-flight run instead of starting immediately. */
12139
+ queued: boolean(),
12140
+ /** True when this trigger was coalesced onto an identical already-queued run. */
12141
+ joined: boolean(),
12142
+ /** True when the run was cancelled before completing every destination. */
12143
+ cancelled: boolean(),
12144
+ /** One entry per destination the archive landed at (partial on cancel). */
12145
+ entries: array(BackupEntrySchema).readonly()
12146
+ });
12064
12147
  /**
12065
12148
  * A backup schedule — the N:M "entry" that binds one cron cadence to a
12066
12149
  * SET of destination locations. Supersedes the per-location cron on
@@ -12108,7 +12191,10 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
12108
12191
  * retention (manual runs).
12109
12192
  */
12110
12193
  retentionCount: number().int().min(1).max(1e3).optional()
12111
- }).optional(), array(BackupEntrySchema).readonly(), {
12194
+ }).optional(), BackupTriggerResultSchema, {
12195
+ kind: "mutation",
12196
+ auth: "admin"
12197
+ }), method(_void(), array(BackupRunSchema).readonly(), { auth: "admin" }), method(object({ runId: string() }), object({ cancelled: boolean() }), {
12112
12198
  kind: "mutation",
12113
12199
  auth: "admin"
12114
12200
  }), method(_void(), array(BackupEntrySchema).readonly(), { auth: "admin" }), method(_void(), array(LocationStatSchema).readonly(), { auth: "admin" }), method(object({
@@ -12836,6 +12922,38 @@ var streamBrokerCapability = {
12836
12922
  auth: "admin"
12837
12923
  }),
12838
12924
  /**
12925
+ * The HARDWARE behind a device number was replaced
12926
+ * (`deviceManager.migrateDevice`). Forget every piece of broker state that
12927
+ * described the old box, so the next catalog pull derives everything from
12928
+ * the camera that is actually there:
12929
+ *
12930
+ * - every `derived:*` stream definition — a derived is authored against a
12931
+ * specific profile layout, and against the wrong hardware its feeder
12932
+ * respawns forever (observed at attempt 2732 on the live hub,
12933
+ * 2026-09-01);
12934
+ * - the profile-slot assignment entry, PURGED (not unassigned — unassign
12935
+ * marks the slot manual, which would pin the stale choice instead of
12936
+ * letting `computeInitialAssignment` re-derive it);
12937
+ * - the probe snapshots (`<deviceId>/…` — probed codec/resolution of the
12938
+ * old hardware);
12939
+ * - the persisted RTSP token rows for the device's brokers (keyed
12940
+ * `<deviceId>/<camStreamId>`; the stream ids change with the hardware,
12941
+ * so the rows are dead URLs).
12942
+ *
12943
+ * An RPC, deliberately — an event is telemetry and may be dropped (D8),
12944
+ * and a dropped forget leaves a feeder respawning against a stream that
12945
+ * does not exist.
12946
+ */
12947
+ forgetDeviceHardware: method(object({ deviceId: number().int().nonnegative() }), object({
12948
+ derivedStreamsDeleted: array(string()).readonly(),
12949
+ assignmentsPurged: boolean(),
12950
+ probeSnapshotsDropped: number().int().nonnegative(),
12951
+ rtspTokenRowsDeleted: number().int().nonnegative()
12952
+ }), {
12953
+ kind: "mutation",
12954
+ auth: "admin"
12955
+ }),
12956
+ /**
12839
12957
  * Render a short GIF or MP4 from the broker's PRE-BUFFER around an instant.
12840
12958
  *
12841
12959
  * The pre-buffer is the only source that already holds the seconds BEFORE
@@ -14393,7 +14511,10 @@ method(_void(), _void(), { kind: "mutation" }), method(_void(), _void(), { kind:
14393
14511
  id: string(),
14394
14512
  name: string(),
14395
14513
  type: string()
14396
- }))), method(object({}), boolean()), method(object({ params: record(string(), unknown()).optional() }), array(DiscoveryCandidateSchema), {
14514
+ }))), method(object({ stableId: string() }), object({ deviceId: number() }), {
14515
+ kind: "mutation",
14516
+ timeoutMs: 3 * 6e4
14517
+ }), method(object({}), boolean()), method(object({ params: record(string(), unknown()).optional() }), array(DiscoveryCandidateSchema), {
14397
14518
  kind: "mutation",
14398
14519
  auth: "admin"
14399
14520
  }), method(object({}), CreationSchemaOutputSchema), method(object({}), object({ deviceType: _enum(DeviceType).nullable() })), method(object({ candidate: DiscoveryCandidateSchema }), DeviceSummarySchema, {
@@ -14674,7 +14795,8 @@ method(object({
14674
14795
  targetId: number()
14675
14796
  }), MigrateDeviceResultSchema, {
14676
14797
  kind: "mutation",
14677
- auth: "admin"
14798
+ auth: "admin",
14799
+ timeoutMs: 12 * 6e4
14678
14800
  }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
14679
14801
  deviceId: number(),
14680
14802
  name: string()
@@ -32555,6 +32677,12 @@ Object.freeze({
32555
32677
  addonId: null,
32556
32678
  access: "create"
32557
32679
  },
32680
+ "backup.cancel": {
32681
+ capName: "backup",
32682
+ capScope: "system",
32683
+ addonId: null,
32684
+ access: "create"
32685
+ },
32558
32686
  "backup.delete": {
32559
32687
  capName: "backup",
32560
32688
  capScope: "system",
@@ -32597,6 +32725,12 @@ Object.freeze({
32597
32725
  addonId: null,
32598
32726
  access: "view"
32599
32727
  },
32728
+ "backup.listRuns": {
32729
+ capName: "backup",
32730
+ capScope: "system",
32731
+ addonId: null,
32732
+ access: "view"
32733
+ },
32600
32734
  "backup.listSchedules": {
32601
32735
  capName: "backup",
32602
32736
  capScope: "system",
@@ -33797,6 +33931,12 @@ Object.freeze({
33797
33931
  addonId: null,
33798
33932
  access: "view"
33799
33933
  },
33934
+ "deviceProvider.reloadDevice": {
33935
+ capName: "device-provider",
33936
+ capScope: "system",
33937
+ addonId: null,
33938
+ access: "create"
33939
+ },
33800
33940
  "deviceProvider.start": {
33801
33941
  capName: "device-provider",
33802
33942
  capScope: "system",
@@ -37163,6 +37303,12 @@ Object.freeze({
37163
37303
  addonId: null,
37164
37304
  access: "create"
37165
37305
  },
37306
+ "streamBroker.forgetDeviceHardware": {
37307
+ capName: "stream-broker",
37308
+ capScope: "system",
37309
+ addonId: null,
37310
+ access: "delete"
37311
+ },
37166
37312
  "streamBroker.getAllRtspEntries": {
37167
37313
  capName: "stream-broker",
37168
37314
  capScope: "system",
@@ -39621,6 +39767,11 @@ Object.freeze({
39621
39767
  form: "single",
39622
39768
  optional: false
39623
39769
  }],
39770
+ "streamBroker.forgetDeviceHardware": [{
39771
+ name: "deviceId",
39772
+ form: "single",
39773
+ optional: false
39774
+ }],
39624
39775
  "streamBroker.getDeviceAudioMute": [{
39625
39776
  name: "deviceId",
39626
39777
  form: "single",
@@ -12084,6 +12084,89 @@ var LocationStatSchema = object({
12084
12084
  fileCount: number(),
12085
12085
  present: boolean()
12086
12086
  });
12087
+ /** Lifecycle of a backup run. Terminal states: succeeded / failed / cancelled. */
12088
+ var BackupRunStateSchema = _enum([
12089
+ "queued",
12090
+ "running",
12091
+ "succeeded",
12092
+ "failed",
12093
+ "cancelled"
12094
+ ]);
12095
+ /**
12096
+ * Where a running backup currently is. `queued` before it starts,
12097
+ * `building` while the tar.gz is being staged, `uploading` during the
12098
+ * per-destination fan-out, `done` once terminal.
12099
+ */
12100
+ var BackupRunPhaseSchema = _enum([
12101
+ "queued",
12102
+ "building",
12103
+ "uploading",
12104
+ "done"
12105
+ ]);
12106
+ /**
12107
+ * Observable state of one backup run — readable WHILE it runs via
12108
+ * `backup.listRuns`. This is what makes the execution queue and
12109
+ * `backup.cancel` usable: the 2026-09-04 incident (two concurrent
12110
+ * multi-GB builds, staging 5.1 GB → 18 GB, load 62) was only
12111
+ * diagnosable with `du` because nothing reported that runs existed or
12112
+ * how large the staged archive had grown.
12113
+ */
12114
+ var BackupRunSchema = object({
12115
+ /** Stable run id — the handle `backup.cancel` takes. */
12116
+ id: string(),
12117
+ state: BackupRunStateSchema,
12118
+ phase: BackupRunPhaseSchema,
12119
+ /**
12120
+ * Resolved destination location ids. Empty while queued (targets are
12121
+ * resolved when the run starts, against the then-current policies).
12122
+ */
12123
+ destinationIds: array(string()).readonly(),
12124
+ label: string().optional(),
12125
+ /** ms-epoch when the run was submitted (trigger call / schedule fire). */
12126
+ requestedAt: number(),
12127
+ /** ms-epoch when the run left the queue and started building. */
12128
+ startedAt: number().optional(),
12129
+ /** ms-epoch when the run reached a terminal state. */
12130
+ finishedAt: number().optional(),
12131
+ /** Compressed bytes of the staging archive written so far. */
12132
+ stagedBytes: number(),
12133
+ /** Final staged archive size, once the build phase completes. */
12134
+ archiveSizeBytes: number().optional(),
12135
+ /** Bytes pushed to the destination currently uploading. */
12136
+ uploadedBytes: number(),
12137
+ /** Destinations where the archive fully landed (uploaded + indexed). */
12138
+ completedDestinationIds: array(string()).readonly(),
12139
+ /** Destinations that failed during the fan-out. */
12140
+ failedDestinationIds: array(string()).readonly(),
12141
+ /** Failure message when `state === 'failed'`. */
12142
+ error: string().optional(),
12143
+ /**
12144
+ * 1-based place in the execution queue — 1 = runs next. Present only
12145
+ * while `state === 'queued'`. Stamped by the orchestrator from the
12146
+ * queue's OWN pending order, never derived from timestamps, so the
12147
+ * UI cannot show an order the executor will not honour.
12148
+ */
12149
+ queuePosition: number().int().min(1).optional()
12150
+ });
12151
+ /**
12152
+ * Result of `backup.trigger`. The call still resolves when the run
12153
+ * terminates (compat with schedule-driven runs and the admin UI), but
12154
+ * it now names the run and says whether it had to WAIT: a trigger that
12155
+ * arrives while another run is in flight is enqueued (or joined onto
12156
+ * an identical already-queued run), never started concurrently.
12157
+ */
12158
+ var BackupTriggerResultSchema = object({
12159
+ /** The run this trigger mapped to — poll it via `listRuns`, stop it via `cancel`. */
12160
+ runId: string(),
12161
+ /** True when the run waited behind an in-flight run instead of starting immediately. */
12162
+ queued: boolean(),
12163
+ /** True when this trigger was coalesced onto an identical already-queued run. */
12164
+ joined: boolean(),
12165
+ /** True when the run was cancelled before completing every destination. */
12166
+ cancelled: boolean(),
12167
+ /** One entry per destination the archive landed at (partial on cancel). */
12168
+ entries: array(BackupEntrySchema).readonly()
12169
+ });
12087
12170
  /**
12088
12171
  * A backup schedule — the N:M "entry" that binds one cron cadence to a
12089
12172
  * SET of destination locations. Supersedes the per-location cron on
@@ -12131,7 +12214,10 @@ method(_void(), array(BackupDestinationInfoSchema).readonly(), { auth: "admin" }
12131
12214
  * retention (manual runs).
12132
12215
  */
12133
12216
  retentionCount: number().int().min(1).max(1e3).optional()
12134
- }).optional(), array(BackupEntrySchema).readonly(), {
12217
+ }).optional(), BackupTriggerResultSchema, {
12218
+ kind: "mutation",
12219
+ auth: "admin"
12220
+ }), method(_void(), array(BackupRunSchema).readonly(), { auth: "admin" }), method(object({ runId: string() }), object({ cancelled: boolean() }), {
12135
12221
  kind: "mutation",
12136
12222
  auth: "admin"
12137
12223
  }), method(_void(), array(BackupEntrySchema).readonly(), { auth: "admin" }), method(_void(), array(LocationStatSchema).readonly(), { auth: "admin" }), method(object({
@@ -12859,6 +12945,38 @@ var streamBrokerCapability = {
12859
12945
  auth: "admin"
12860
12946
  }),
12861
12947
  /**
12948
+ * The HARDWARE behind a device number was replaced
12949
+ * (`deviceManager.migrateDevice`). Forget every piece of broker state that
12950
+ * described the old box, so the next catalog pull derives everything from
12951
+ * the camera that is actually there:
12952
+ *
12953
+ * - every `derived:*` stream definition — a derived is authored against a
12954
+ * specific profile layout, and against the wrong hardware its feeder
12955
+ * respawns forever (observed at attempt 2732 on the live hub,
12956
+ * 2026-09-01);
12957
+ * - the profile-slot assignment entry, PURGED (not unassigned — unassign
12958
+ * marks the slot manual, which would pin the stale choice instead of
12959
+ * letting `computeInitialAssignment` re-derive it);
12960
+ * - the probe snapshots (`<deviceId>/…` — probed codec/resolution of the
12961
+ * old hardware);
12962
+ * - the persisted RTSP token rows for the device's brokers (keyed
12963
+ * `<deviceId>/<camStreamId>`; the stream ids change with the hardware,
12964
+ * so the rows are dead URLs).
12965
+ *
12966
+ * An RPC, deliberately — an event is telemetry and may be dropped (D8),
12967
+ * and a dropped forget leaves a feeder respawning against a stream that
12968
+ * does not exist.
12969
+ */
12970
+ forgetDeviceHardware: method(object({ deviceId: number().int().nonnegative() }), object({
12971
+ derivedStreamsDeleted: array(string()).readonly(),
12972
+ assignmentsPurged: boolean(),
12973
+ probeSnapshotsDropped: number().int().nonnegative(),
12974
+ rtspTokenRowsDeleted: number().int().nonnegative()
12975
+ }), {
12976
+ kind: "mutation",
12977
+ auth: "admin"
12978
+ }),
12979
+ /**
12862
12980
  * Render a short GIF or MP4 from the broker's PRE-BUFFER around an instant.
12863
12981
  *
12864
12982
  * The pre-buffer is the only source that already holds the seconds BEFORE
@@ -14416,7 +14534,10 @@ method(_void(), _void(), { kind: "mutation" }), method(_void(), _void(), { kind:
14416
14534
  id: string(),
14417
14535
  name: string(),
14418
14536
  type: string()
14419
- }))), method(object({}), boolean()), method(object({ params: record(string(), unknown()).optional() }), array(DiscoveryCandidateSchema), {
14537
+ }))), method(object({ stableId: string() }), object({ deviceId: number() }), {
14538
+ kind: "mutation",
14539
+ timeoutMs: 3 * 6e4
14540
+ }), method(object({}), boolean()), method(object({ params: record(string(), unknown()).optional() }), array(DiscoveryCandidateSchema), {
14420
14541
  kind: "mutation",
14421
14542
  auth: "admin"
14422
14543
  }), method(object({}), CreationSchemaOutputSchema), method(object({}), object({ deviceType: _enum(DeviceType).nullable() })), method(object({ candidate: DiscoveryCandidateSchema }), DeviceSummarySchema, {
@@ -14697,7 +14818,8 @@ method(object({
14697
14818
  targetId: number()
14698
14819
  }), MigrateDeviceResultSchema, {
14699
14820
  kind: "mutation",
14700
- auth: "admin"
14821
+ auth: "admin",
14822
+ timeoutMs: 12 * 6e4
14701
14823
  }), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
14702
14824
  deviceId: number(),
14703
14825
  name: string()
@@ -32578,6 +32700,12 @@ Object.freeze({
32578
32700
  addonId: null,
32579
32701
  access: "create"
32580
32702
  },
32703
+ "backup.cancel": {
32704
+ capName: "backup",
32705
+ capScope: "system",
32706
+ addonId: null,
32707
+ access: "create"
32708
+ },
32581
32709
  "backup.delete": {
32582
32710
  capName: "backup",
32583
32711
  capScope: "system",
@@ -32620,6 +32748,12 @@ Object.freeze({
32620
32748
  addonId: null,
32621
32749
  access: "view"
32622
32750
  },
32751
+ "backup.listRuns": {
32752
+ capName: "backup",
32753
+ capScope: "system",
32754
+ addonId: null,
32755
+ access: "view"
32756
+ },
32623
32757
  "backup.listSchedules": {
32624
32758
  capName: "backup",
32625
32759
  capScope: "system",
@@ -33820,6 +33954,12 @@ Object.freeze({
33820
33954
  addonId: null,
33821
33955
  access: "view"
33822
33956
  },
33957
+ "deviceProvider.reloadDevice": {
33958
+ capName: "device-provider",
33959
+ capScope: "system",
33960
+ addonId: null,
33961
+ access: "create"
33962
+ },
33823
33963
  "deviceProvider.start": {
33824
33964
  capName: "device-provider",
33825
33965
  capScope: "system",
@@ -37186,6 +37326,12 @@ Object.freeze({
37186
37326
  addonId: null,
37187
37327
  access: "create"
37188
37328
  },
37329
+ "streamBroker.forgetDeviceHardware": {
37330
+ capName: "stream-broker",
37331
+ capScope: "system",
37332
+ addonId: null,
37333
+ access: "delete"
37334
+ },
37189
37335
  "streamBroker.getAllRtspEntries": {
37190
37336
  capName: "stream-broker",
37191
37337
  capScope: "system",
@@ -39644,6 +39790,11 @@ Object.freeze({
39644
39790
  form: "single",
39645
39791
  optional: false
39646
39792
  }],
39793
+ "streamBroker.forgetDeviceHardware": [{
39794
+ name: "deviceId",
39795
+ form: "single",
39796
+ optional: false
39797
+ }],
39647
39798
  "streamBroker.getDeviceAudioMute": [{
39648
39799
  name: "deviceId",
39649
39800
  form: "single",
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-M39Js6iu.js");
1
+ const require_dist = require("./dist-DSJDq5hY.js");
2
2
  let node_path = require("node:path");
3
3
  node_path = require_dist.__toESM(node_path);
4
4
  let node_url = require("node:url");
@@ -1,4 +1,4 @@
1
- import { M as audioKindId, Z as hfModelUrl, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-D0liXHO7.mjs";
1
+ import { M as audioKindId, Z as hfModelUrl, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-D35w3ngN.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  //#region src/detection-pipeline/registry/model-catalogs.ts
4
4
  var HF_REPO = "camstack/camstack-models";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-M39Js6iu.js");
1
+ const require_dist = require("./dist-DSJDq5hY.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  //#region src/detection-pipeline/registry/model-catalogs.ts
4
4
  var HF_REPO = "camstack/camstack-models";
@@ -2,8 +2,8 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-M39Js6iu.js");
6
- const require_lazy_sharp = require("../lazy-sharp-CO-c2L9_.js");
5
+ const require_dist = require("../dist-DSJDq5hY.js");
6
+ const require_lazy_sharp = require("../lazy-sharp-Fre6HHg6.js");
7
7
  let node_fs = require("node:fs");
8
8
  let node_path = require("node:path");
9
9
  //#region src/motion-wasm/wasm-motion-detector.ts
@@ -1,4 +1,4 @@
1
- import { It as hydrateSchema, Pt as DeviceType, Y as evaluateZoneRules, it as motionDetectionCapability, jt as BaseAddon } from "../dist-D0liXHO7.mjs";
1
+ import { It as hydrateSchema, Pt as DeviceType, Y as evaluateZoneRules, it as motionDetectionCapability, jt as BaseAddon } from "../dist-D35w3ngN.mjs";
2
2
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
3
3
  import { readFileSync } from "node:fs";
4
4
  import { join } from "node:path";
@@ -1,4 +1,4 @@
1
- import { Dt as buildFfmpegArgs, Et as Fmp4BoxSplitter, kt as isSoftwareDecode, wt as errMsg } from "./dist-D0liXHO7.mjs";
1
+ import { Dt as buildFfmpegArgs, Et as Fmp4BoxSplitter, kt as isSoftwareDecode, wt as errMsg } from "./dist-D35w3ngN.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import "node:fs";
4
4
  import "node:path";
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-M39Js6iu.js");
1
+ const require_dist = require("./dist-DSJDq5hY.js");
2
2
  let node_crypto = require("node:crypto");
3
3
  let node_fs = require("node:fs");
4
4
  node_fs = require_dist.__toESM(node_fs, 1);