@camstack/addon-pipeline 1.2.89 → 1.2.93

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 (30) hide show
  1. package/dist/{addon-utils-yc-chXuC.js → addon-utils-CTRpEiSd.js} +1 -1
  2. package/dist/audio-analyzer/index.js +2 -2
  3. package/dist/audio-analyzer/index.mjs +1 -1
  4. package/dist/detection-pipeline/index.js +4 -4
  5. package/dist/detection-pipeline/index.mjs +2 -2
  6. package/dist/{dist-BJYwWEZ9.mjs → dist-6POVIYmC.mjs} +91 -4
  7. package/dist/{dist-n4Nbnxx5.js → dist-D9To_r_d.js} +96 -3
  8. package/dist/{event-loop-stall-monitor-BiPffk0D.mjs → event-loop-stall-monitor-C-VvWOxS.mjs} +1 -1
  9. package/dist/{event-loop-stall-monitor-DG7QY00k.js → event-loop-stall-monitor-CGacbzXq.js} +1 -1
  10. package/dist/{lazy-sharp-EoSOHgoj.js → lazy-sharp-C3zOnmiU.js} +1 -1
  11. package/dist/motion-wasm/index.js +2 -2
  12. package/dist/motion-wasm/index.mjs +1 -1
  13. package/dist/pipeline-runner/index.js +4 -4
  14. package/dist/pipeline-runner/index.mjs +3 -3
  15. package/dist/recorder/index.js +680 -37
  16. package/dist/recorder/index.mjs +679 -36
  17. package/dist/session-decode/decode-worker-child.js +2 -2
  18. package/dist/session-decode/decode-worker-child.mjs +1 -1
  19. package/dist/stream-broker/_stub.js +2 -2
  20. package/dist/stream-broker/{_virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-CsrMZYLB.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-C2woB6bY.mjs} +2 -2
  21. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-Dut56EeQ.mjs +26 -0
  22. package/dist/stream-broker/{_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DgivrPsH.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-DsIi4G5Q.mjs} +1 -1
  23. package/dist/stream-broker/{hostInit-DoFovQmc.mjs → hostInit-VCURcZLt.mjs} +2 -2
  24. package/dist/stream-broker/index.js +194 -30
  25. package/dist/stream-broker/index.mjs +194 -30
  26. package/dist/stream-broker/remoteEntry.js +1 -1
  27. package/dist/{worker-protocol-DjuxhGo3.js → worker-protocol-Bq28qobd.js} +1 -1
  28. package/dist/{worker-protocol-XZ1e36rM.mjs → worker-protocol-PzAKg8mC.mjs} +1 -1
  29. package/package.json +1 -1
  30. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DNSELPGi.mjs +0 -26
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-n4Nbnxx5.js");
1
+ const require_dist = require("./dist-D9To_r_d.js");
2
2
  require("node:crypto");
3
3
  let node_path = require("node:path");
4
4
  node_path = require_dist.__toESM(node_path, 1);
@@ -2,9 +2,9 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-n4Nbnxx5.js");
5
+ const require_dist = require("../dist-D9To_r_d.js");
6
6
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
7
- const require_addon_utils = require("../addon-utils-yc-chXuC.js");
7
+ const require_addon_utils = require("../addon-utils-CTRpEiSd.js");
8
8
  let node_path = require("node:path");
9
9
  node_path = require_dist.__toESM(node_path);
10
10
  let node_fs = require("node:fs");
@@ -1,5 +1,5 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { D as audioAnalyzerCapability, E as audioAnalysisCapability, U as mapAudioLabelToMacro, h as HF_BASE_URL, ht as hydrateSchema, it as errMsg, n as AUDIO_BACKEND_CHOICES, s as DEFAULT_AUDIO_ANALYZER_CONFIG, ut as BaseAddon } from "../dist-BJYwWEZ9.mjs";
2
+ import { D as audioAnalyzerCapability, E as audioAnalysisCapability, U as mapAudioLabelToMacro, at as errMsg, dt as BaseAddon, gt as hydrateSchema, h as HF_BASE_URL, n as AUDIO_BACKEND_CHOICES, s as DEFAULT_AUDIO_ANALYZER_CONFIG } from "../dist-6POVIYmC.mjs";
3
3
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
4
4
  import { i as downloadFile } from "../addon-utils-A2S9D7pu.mjs";
5
5
  import * as path$1 from "node:path";
@@ -2,11 +2,11 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-n4Nbnxx5.js");
6
- const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DG7QY00k.js");
7
- const require_lazy_sharp = require("../lazy-sharp-EoSOHgoj.js");
5
+ const require_dist = require("../dist-D9To_r_d.js");
6
+ const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-CGacbzXq.js");
7
+ const require_lazy_sharp = require("../lazy-sharp-C3zOnmiU.js");
8
8
  const require_node_topology_platform = require("../node-topology-platform-CFZ7F4xW.js");
9
- const require_addon_utils = require("../addon-utils-yc-chXuC.js");
9
+ const require_addon_utils = require("../addon-utils-CTRpEiSd.js");
10
10
  let sharp = require("sharp");
11
11
  sharp = require_dist.__toESM(sharp);
12
12
  let node_child_process = require("node:child_process");
@@ -1,6 +1,6 @@
1
1
  import { n as __require } from "../chunk-DnnnRqeS.mjs";
2
- import { $ as runtimeDevices$1, B as enumerateInferenceDevices, Ct as sleep, Ft as EventCategory, J as pipelineExecutorCapability, L as detectionPipelineCapability, M as defaultDeviceFor$1, Nt as string, Pt as union, Tt as array, V as evaluateZoneRules, bt as parseJsonUnknown, d as DEVICE_BACKEND_TO_FORMAT, ht as hydrateSchema, it as errMsg, jt as object, mt as createEvent, nt as supportedRuntimes$1, t as APPLE_SA_TO_MACRO, ut as BaseAddon, w as YAMNET_TO_MACRO, yt as nodePin } from "../dist-BJYwWEZ9.mjs";
3
- import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, n as startEventLoopStallMonitor, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep } from "../event-loop-stall-monitor-BiPffk0D.mjs";
2
+ import { B as enumerateInferenceDevices, Et as array, Ft as union, It as EventCategory, J as pipelineExecutorCapability, L as detectionPipelineCapability, M as defaultDeviceFor$1, Mt as object, Pt as string, V as evaluateZoneRules, at as errMsg, bt as nodePin, d as DEVICE_BACKEND_TO_FORMAT, dt as BaseAddon, et as runtimeDevices$1, gt as hydrateSchema, ht as createEvent, rt as supportedRuntimes$1, t as APPLE_SA_TO_MACRO, w as YAMNET_TO_MACRO, wt as sleep, xt as parseJsonUnknown } from "../dist-6POVIYmC.mjs";
3
+ import { a as getDefaultModelForFormat, c as getStepDefinition, i as ALL_STEPS, l as resolveModelForFormat, n as startEventLoopStallMonitor, o as getDefaultModelForFormatFromDef, r as ALL_PIPELINE_STEPS, s as getStep } from "../event-loop-stall-monitor-C-VvWOxS.mjs";
4
4
  import { t as getSharp } from "../lazy-sharp-6oymT_yf.mjs";
5
5
  import { t as pickNodePlatformArch } from "../node-topology-platform-BkR_k6WT.mjs";
6
6
  import { a as ensureModel, o as isModelDownloaded, r as deleteModelFromDisk } from "../addon-utils-A2S9D7pu.mjs";
@@ -8585,6 +8585,12 @@ var RecordingConfigSchema = object({
8585
8585
  /** DERIVED summary of `bands`, stamped by the recorder on every save.
8586
8586
  * Authoring it has no effect — see {@link RecordingStorageModeSchema}. */
8587
8587
  mode: RecordingStorageModeSchema.optional(),
8588
+ /**
8589
+ * Which assigned broker slots to record. Absent / empty = {@link
8590
+ * DEFAULT_RECORDING_PROFILES} (`high`+`low`) intersected with the
8591
+ * camera's currently assigned slots — never `mid` unless the operator
8592
+ * picks it, and never a slot the broker has not assigned.
8593
+ */
8588
8594
  profiles: array(CamProfileSchema).optional(),
8589
8595
  segmentSeconds: number().int().positive().optional(),
8590
8596
  /**
@@ -8609,7 +8615,7 @@ var RecordingConfigSchema = object({
8609
8615
  *
8610
8616
  * THE one definition: the recorder stamps `config.mode` with it on save and
8611
8617
  * reports it as the cap's `activeMode`, and the settings UI reads it back to
8612
- * decide which authoring tab a config opens in. Two copies would drift, and the
8618
+ * highlight the Off/Events/Continuous shortcut. Two copies would drift, and the
8613
8619
  * symptom (a status dot disagreeing with what is being recorded) is exactly the
8614
8620
  * bug this field was added to fix.
8615
8621
  */
@@ -8619,6 +8625,30 @@ function deriveRecordingMode(config) {
8619
8625
  return "events";
8620
8626
  }
8621
8627
  /**
8628
+ * Default recorded slots when a config omits `profiles`: high + low.
8629
+ * `mid` is opt-in — it is usually a second native encode the operator
8630
+ * did not ask to store twice.
8631
+ */
8632
+ var DEFAULT_RECORDING_PROFILES = ["high", "low"];
8633
+ /**
8634
+ * Pick which assigned broker slots to record. `assigned` is already the
8635
+ * broker's assigned∩deduped set (see `selectAssignedProfileSlots`).
8636
+ *
8637
+ * An operator `override` DISABLES unselected assigned slots (assigned ∩
8638
+ * selection). A selection matching none of the assigned sources, or an
8639
+ * absent/empty override, falls through: prefer {@link DEFAULT_RECORDING_PROFILES}
8640
+ * among assigned, else every assigned slot (a camera with only `mid`
8641
+ * still records something). Empty assigned → empty result.
8642
+ */
8643
+ function resolveRecordingProfiles(assigned, override) {
8644
+ if (override !== void 0 && override.length > 0) {
8645
+ const selected = assigned.filter((profile) => override.includes(profile));
8646
+ return selected.length > 0 ? selected : [...assigned];
8647
+ }
8648
+ const preferred = assigned.filter((profile) => DEFAULT_RECORDING_PROFILES.includes(profile));
8649
+ return preferred.length > 0 ? preferred : [...assigned];
8650
+ }
8651
+ /**
8622
8652
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
8623
8653
  *
8624
8654
  * One shape shared by the recorder and pipeline-analytics internal movers.
@@ -8681,7 +8711,11 @@ var RelocateFootageInputSchema = object({
8681
8711
  profiles: array(string()).optional(),
8682
8712
  /** Copy throttle in MB/s (default 40) — the drain is a background chore,
8683
8713
  * never allowed to starve live writers. */
8684
- throttleMbps: number().min(1).max(1e3).optional()
8714
+ throttleMbps: number().min(1).max(1e3).optional(),
8715
+ /** Move only segments whose startMs is >= this. Absent = the whole source
8716
+ * pile. Used when a full drain is too expensive and the operator only
8717
+ * wants the recent window on the new disk. */
8718
+ sinceMs: number().int().optional()
8685
8719
  });
8686
8720
  /** Internal, lease-scoped participant operation. It is intentionally separate
8687
8721
  * from persistent recording settings: a migration never changes
@@ -18610,6 +18644,12 @@ var TrackCascadeCountsSchema = object({
18610
18644
  /** Per-track CLIP search vectors removed (best-effort). */
18611
18645
  embeddings: number().int()
18612
18646
  });
18647
+ /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18648
+ var DiskReconcileCountsSchema = object({
18649
+ mediaDropped: number().int(),
18650
+ tracks: number().int(),
18651
+ events: number().int()
18652
+ });
18613
18653
  /** Event-store footprint for one camera. */
18614
18654
  var EventStoreDeviceFootprintSchema = object({
18615
18655
  deviceId: number(),
@@ -18786,6 +18826,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18786
18826
  }), method(object({ deviceId: number() }), TrackCascadeCountsSchema, {
18787
18827
  kind: "mutation",
18788
18828
  auth: "admin"
18829
+ }), method(object({ deviceId: number() }), DiskReconcileCountsSchema, {
18830
+ kind: "mutation",
18831
+ auth: "admin"
18789
18832
  }), method(object({
18790
18833
  deviceId: number(),
18791
18834
  trackIds: array(string()).min(1)
@@ -20590,6 +20633,24 @@ var CameraStatusDegradationSchema = object({
20590
20633
  *
20591
20634
  * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
20592
20635
  */
20636
+ var DiskReconcileJobSchema = object({
20637
+ state: _enum([
20638
+ "idle",
20639
+ "running",
20640
+ "done",
20641
+ "error"
20642
+ ]),
20643
+ total: number().int().nonnegative(),
20644
+ completed: number().int().nonnegative(),
20645
+ currentDeviceId: number().int().nullable(),
20646
+ failed: array(number().int()).readonly(),
20647
+ mediaDropped: number().int().nonnegative(),
20648
+ tracks: number().int().nonnegative(),
20649
+ events: number().int().nonnegative(),
20650
+ startedAtMs: number().int().nullable(),
20651
+ finishedAtMs: number().int().nullable(),
20652
+ error: string().nullable()
20653
+ });
20593
20654
  var CameraStatusSchema = object({
20594
20655
  deviceId: number(),
20595
20656
  assignment: CameraAssignmentStatusSchema,
@@ -20821,7 +20882,10 @@ method(StorageMigrationLeaseInputSchema, object({ paused: literal(true) }), {
20821
20882
  }), CameraSwitchGroupSchema, {
20822
20883
  kind: "mutation",
20823
20884
  auth: "admin"
20824
- }), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
20885
+ }), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), DiskReconcileJobSchema, {
20886
+ kind: "mutation",
20887
+ auth: "admin"
20888
+ }), method(_void(), DiskReconcileJobSchema, { auth: "admin" }), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
20825
20889
  name: string(),
20826
20890
  description: string().optional(),
20827
20891
  config: CameraPipelineConfigSchema
@@ -31549,6 +31613,12 @@ Object.freeze({
31549
31613
  addonId: null,
31550
31614
  access: "create"
31551
31615
  },
31616
+ "pipelineAnalytics.reconcileFromDisk": {
31617
+ capName: "pipeline-analytics",
31618
+ capScope: "device",
31619
+ addonId: null,
31620
+ access: "create"
31621
+ },
31552
31622
  "pipelineAnalytics.refreshStorageLocationsForMigration": {
31553
31623
  capName: "pipeline-analytics",
31554
31624
  capScope: "device",
@@ -31951,6 +32021,12 @@ Object.freeze({
31951
32021
  addonId: null,
31952
32022
  access: "view"
31953
32023
  },
32024
+ "pipelineOrchestrator.getReconcileFromDiskStatus": {
32025
+ capName: "pipeline-orchestrator",
32026
+ capScope: "system",
32027
+ addonId: null,
32028
+ access: "view"
32029
+ },
31954
32030
  "pipelineOrchestrator.listAgentSettings": {
31955
32031
  capName: "pipeline-orchestrator",
31956
32032
  capScope: "system",
@@ -31975,6 +32051,12 @@ Object.freeze({
31975
32051
  addonId: null,
31976
32052
  access: "create"
31977
32053
  },
32054
+ "pipelineOrchestrator.reconcileFromDisk": {
32055
+ capName: "pipeline-orchestrator",
32056
+ capScope: "system",
32057
+ addonId: null,
32058
+ access: "create"
32059
+ },
31978
32060
  "pipelineOrchestrator.removeAgentSettings": {
31979
32061
  capName: "pipeline-orchestrator",
31980
32062
  capScope: "system",
@@ -34966,6 +35048,11 @@ Object.freeze({
34966
35048
  form: "single",
34967
35049
  optional: true
34968
35050
  }],
35051
+ "pipelineAnalytics.reconcileFromDisk": [{
35052
+ name: "deviceId",
35053
+ form: "single",
35054
+ optional: false
35055
+ }],
34969
35056
  "pipelineAnalytics.restageRetrainTrack": [{
34970
35057
  name: "deviceId",
34971
35058
  form: "single",
@@ -36651,4 +36738,4 @@ function enumerateInferenceDevices(hw) {
36651
36738
  return out;
36652
36739
  }
36653
36740
  //#endregion
36654
- export { runtimeDevices as $, createHwAccelCache as A, number as At, enumerateInferenceDevices as B, RingBuffer as C, sleep as Ct, audioAnalyzerCapability as D, discriminatedUnion as Dt, audioAnalysisCapability as E, boolean as Et, deriveDetailCropRect as F, EventCategory as Ft, motionDetectionCapability as G, hfModelUrl as H, deriveRecordingMode as I, pipelineExecutorCapability as J, pickDetailCropConvention as K, detectionPipelineCapability as L, defaultDeviceFor as M, record as Mt, defineCustomActions as N, string as Nt, batteryCapability as O, lazy as Ot, deriveBatteryPresence as P, union as Pt, resolveEgressDecodeHwAccel as Q, egressTranscodeSharingKey as R, RecordingConfigSchema as S, selectAssignedProfileSlots as St, addonWidgetsSourceCapability as T, array as Tt, mapAudioLabelToMacro as U, evaluateZoneRules as V, maskUrlCredentials as W, recordingCapability as X, pipelineRunnerCapability as Y, recordingExportCapability as Z, NativeLeaseSettingsSchema as _, makeProfileBrokerId as _t, COCO_80_LABELS as a, AUDIO_PRESETS as at, RATE_CONTROL_TIGHT as b, parseJsonUnknown as bt, DEFAULT_DETAIL_CROP_CONVENTION as c, invocationFromEncodeProfile as ct, DEVICE_BACKEND_TO_FORMAT as d, CAM_PROFILE_ORDER as dt, storageEvictableCapability as et, EVENT_PAD_MS as f, DeviceFeature as ft, NativeLeaseAdmissionSchema as g, isEvent as gt, HF_BASE_URL as h, hydrateSchema as ht, BatteryStatusSchema as i, errMsg as it, customAction as j, object as jt, cameraStreamsCapability as k, literal as kt, DEFAULT_EVENTS_BAND_BUFFER_SEC as l, isSoftwareDecode as lt, ExportRecordSchema as m, createEvent as mt, AUDIO_BACKEND_CHOICES as n, supportedRuntimes as nt, COCO_TO_MACRO as o, Fmp4BoxSplitter as ot, EncodeProfileSchema as p, DeviceType as pt, pickNativeLeaseOverride as q, AUDIO_MACRO_LABELS as r, webrtcSessionCapability as rt, DEFAULT_AUDIO_ANALYZER_CONFIG as s, buildFfmpegArgs as st, APPLE_SA_TO_MACRO as t, streamBrokerCapability as tt, DEFAULT_NATIVE_LEASE_SETTINGS as u, BaseAddon as ut, OpsLogEntrySchema as v, makeSourceBrokerId as vt, YAMNET_TO_MACRO as w, _enum as wt, RECORDING_EXPORT_MAX_READ_BYTES as x, parseProfileBrokerId as xt, RATE_CONTROL_RELAXED as y, nodePin as yt, egressTransportFromRequest as z };
36741
+ export { resolveRecordingProfiles as $, createHwAccelCache as A, literal as At, enumerateInferenceDevices as B, RingBuffer as C, selectAssignedProfileSlots as Ct, audioAnalyzerCapability as D, boolean as Dt, audioAnalysisCapability as E, array as Et, deriveDetailCropRect as F, union as Ft, motionDetectionCapability as G, hfModelUrl as H, deriveRecordingMode as I, EventCategory as It, pipelineExecutorCapability as J, pickDetailCropConvention as K, detectionPipelineCapability as L, defaultDeviceFor as M, object as Mt, defineCustomActions as N, record as Nt, batteryCapability as O, discriminatedUnion as Ot, deriveBatteryPresence as P, string as Pt, resolveEgressDecodeHwAccel as Q, egressTranscodeSharingKey as R, RecordingConfigSchema as S, parseProfileBrokerId as St, addonWidgetsSourceCapability as T, _enum as Tt, mapAudioLabelToMacro as U, evaluateZoneRules as V, maskUrlCredentials as W, recordingCapability as X, pipelineRunnerCapability as Y, recordingExportCapability as Z, NativeLeaseSettingsSchema as _, isEvent as _t, COCO_80_LABELS as a, errMsg as at, RATE_CONTROL_TIGHT as b, nodePin as bt, DEFAULT_DETAIL_CROP_CONVENTION as c, buildFfmpegArgs as ct, DEVICE_BACKEND_TO_FORMAT as d, BaseAddon as dt, runtimeDevices as et, EVENT_PAD_MS as f, CAM_PROFILE_ORDER as ft, NativeLeaseAdmissionSchema as g, hydrateSchema as gt, HF_BASE_URL as h, createEvent as ht, BatteryStatusSchema as i, webrtcSessionCapability as it, customAction as j, number as jt, cameraStreamsCapability as k, lazy as kt, DEFAULT_EVENTS_BAND_BUFFER_SEC as l, invocationFromEncodeProfile as lt, ExportRecordSchema as m, DeviceType as mt, AUDIO_BACKEND_CHOICES as n, streamBrokerCapability as nt, COCO_TO_MACRO as o, AUDIO_PRESETS as ot, EncodeProfileSchema as p, DeviceFeature as pt, pickNativeLeaseOverride as q, AUDIO_MACRO_LABELS as r, supportedRuntimes as rt, DEFAULT_AUDIO_ANALYZER_CONFIG as s, Fmp4BoxSplitter as st, APPLE_SA_TO_MACRO as t, storageEvictableCapability as tt, DEFAULT_NATIVE_LEASE_SETTINGS as u, isSoftwareDecode as ut, OpsLogEntrySchema as v, makeProfileBrokerId as vt, YAMNET_TO_MACRO as w, sleep as wt, RECORDING_EXPORT_MAX_READ_BYTES as x, parseJsonUnknown as xt, RATE_CONTROL_RELAXED as y, makeSourceBrokerId as yt, egressTransportFromRequest as z };
@@ -8608,6 +8608,12 @@ var RecordingConfigSchema = object({
8608
8608
  /** DERIVED summary of `bands`, stamped by the recorder on every save.
8609
8609
  * Authoring it has no effect — see {@link RecordingStorageModeSchema}. */
8610
8610
  mode: RecordingStorageModeSchema.optional(),
8611
+ /**
8612
+ * Which assigned broker slots to record. Absent / empty = {@link
8613
+ * DEFAULT_RECORDING_PROFILES} (`high`+`low`) intersected with the
8614
+ * camera's currently assigned slots — never `mid` unless the operator
8615
+ * picks it, and never a slot the broker has not assigned.
8616
+ */
8611
8617
  profiles: array(CamProfileSchema).optional(),
8612
8618
  segmentSeconds: number().int().positive().optional(),
8613
8619
  /**
@@ -8632,7 +8638,7 @@ var RecordingConfigSchema = object({
8632
8638
  *
8633
8639
  * THE one definition: the recorder stamps `config.mode` with it on save and
8634
8640
  * reports it as the cap's `activeMode`, and the settings UI reads it back to
8635
- * decide which authoring tab a config opens in. Two copies would drift, and the
8641
+ * highlight the Off/Events/Continuous shortcut. Two copies would drift, and the
8636
8642
  * symptom (a status dot disagreeing with what is being recorded) is exactly the
8637
8643
  * bug this field was added to fix.
8638
8644
  */
@@ -8642,6 +8648,30 @@ function deriveRecordingMode(config) {
8642
8648
  return "events";
8643
8649
  }
8644
8650
  /**
8651
+ * Default recorded slots when a config omits `profiles`: high + low.
8652
+ * `mid` is opt-in — it is usually a second native encode the operator
8653
+ * did not ask to store twice.
8654
+ */
8655
+ var DEFAULT_RECORDING_PROFILES = ["high", "low"];
8656
+ /**
8657
+ * Pick which assigned broker slots to record. `assigned` is already the
8658
+ * broker's assigned∩deduped set (see `selectAssignedProfileSlots`).
8659
+ *
8660
+ * An operator `override` DISABLES unselected assigned slots (assigned ∩
8661
+ * selection). A selection matching none of the assigned sources, or an
8662
+ * absent/empty override, falls through: prefer {@link DEFAULT_RECORDING_PROFILES}
8663
+ * among assigned, else every assigned slot (a camera with only `mid`
8664
+ * still records something). Empty assigned → empty result.
8665
+ */
8666
+ function resolveRecordingProfiles(assigned, override) {
8667
+ if (override !== void 0 && override.length > 0) {
8668
+ const selected = assigned.filter((profile) => override.includes(profile));
8669
+ return selected.length > 0 ? selected : [...assigned];
8670
+ }
8671
+ const preferred = assigned.filter((profile) => DEFAULT_RECORDING_PROFILES.includes(profile));
8672
+ return preferred.length > 0 ? preferred : [...assigned];
8673
+ }
8674
+ /**
8645
8675
  * Entity-relocation job state (storage entity-routing spec, Phase 4).
8646
8676
  *
8647
8677
  * One shape shared by the recorder and pipeline-analytics internal movers.
@@ -8704,7 +8734,11 @@ var RelocateFootageInputSchema = object({
8704
8734
  profiles: array(string()).optional(),
8705
8735
  /** Copy throttle in MB/s (default 40) — the drain is a background chore,
8706
8736
  * never allowed to starve live writers. */
8707
- throttleMbps: number().min(1).max(1e3).optional()
8737
+ throttleMbps: number().min(1).max(1e3).optional(),
8738
+ /** Move only segments whose startMs is >= this. Absent = the whole source
8739
+ * pile. Used when a full drain is too expensive and the operator only
8740
+ * wants the recent window on the new disk. */
8741
+ sinceMs: number().int().optional()
8708
8742
  });
8709
8743
  /** Internal, lease-scoped participant operation. It is intentionally separate
8710
8744
  * from persistent recording settings: a migration never changes
@@ -18633,6 +18667,12 @@ var TrackCascadeCountsSchema = object({
18633
18667
  /** Per-track CLIP search vectors removed (best-effort). */
18634
18668
  embeddings: number().int()
18635
18669
  });
18670
+ /** Disk-wins reconcile: media rows whose blobs are gone, then empty tracks. */
18671
+ var DiskReconcileCountsSchema = object({
18672
+ mediaDropped: number().int(),
18673
+ tracks: number().int(),
18674
+ events: number().int()
18675
+ });
18636
18676
  /** Event-store footprint for one camera. */
18637
18677
  var EventStoreDeviceFootprintSchema = object({
18638
18678
  deviceId: number(),
@@ -18809,6 +18849,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18809
18849
  }), method(object({ deviceId: number() }), TrackCascadeCountsSchema, {
18810
18850
  kind: "mutation",
18811
18851
  auth: "admin"
18852
+ }), method(object({ deviceId: number() }), DiskReconcileCountsSchema, {
18853
+ kind: "mutation",
18854
+ auth: "admin"
18812
18855
  }), method(object({
18813
18856
  deviceId: number(),
18814
18857
  trackIds: array(string()).min(1)
@@ -20613,6 +20656,24 @@ var CameraStatusDegradationSchema = object({
20613
20656
  *
20614
20657
  * See spec: `docs/superpowers/specs/2026-06-24-camera-status-aggregator-cap.md`
20615
20658
  */
20659
+ var DiskReconcileJobSchema = object({
20660
+ state: _enum([
20661
+ "idle",
20662
+ "running",
20663
+ "done",
20664
+ "error"
20665
+ ]),
20666
+ total: number().int().nonnegative(),
20667
+ completed: number().int().nonnegative(),
20668
+ currentDeviceId: number().int().nullable(),
20669
+ failed: array(number().int()).readonly(),
20670
+ mediaDropped: number().int().nonnegative(),
20671
+ tracks: number().int().nonnegative(),
20672
+ events: number().int().nonnegative(),
20673
+ startedAtMs: number().int().nullable(),
20674
+ finishedAtMs: number().int().nullable(),
20675
+ error: string().nullable()
20676
+ });
20616
20677
  var CameraStatusSchema = object({
20617
20678
  deviceId: number(),
20618
20679
  assignment: CameraAssignmentStatusSchema,
@@ -20844,7 +20905,10 @@ method(StorageMigrationLeaseInputSchema, object({ paused: literal(true) }), {
20844
20905
  }), CameraSwitchGroupSchema, {
20845
20906
  kind: "mutation",
20846
20907
  auth: "admin"
20847
- }), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
20908
+ }), method(object({ deviceId: number() }), CameraStatusSchema), method(object({ deviceIds: array(number()).optional() }), array(CameraStatusSchema).readonly()), method(_void(), DiskReconcileJobSchema, {
20909
+ kind: "mutation",
20910
+ auth: "admin"
20911
+ }), method(_void(), DiskReconcileJobSchema, { auth: "admin" }), method(_void(), array(PipelineTemplateSchema).readonly()), method(object({
20848
20912
  name: string(),
20849
20913
  description: string().optional(),
20850
20914
  config: CameraPipelineConfigSchema
@@ -31572,6 +31636,12 @@ Object.freeze({
31572
31636
  addonId: null,
31573
31637
  access: "create"
31574
31638
  },
31639
+ "pipelineAnalytics.reconcileFromDisk": {
31640
+ capName: "pipeline-analytics",
31641
+ capScope: "device",
31642
+ addonId: null,
31643
+ access: "create"
31644
+ },
31575
31645
  "pipelineAnalytics.refreshStorageLocationsForMigration": {
31576
31646
  capName: "pipeline-analytics",
31577
31647
  capScope: "device",
@@ -31974,6 +32044,12 @@ Object.freeze({
31974
32044
  addonId: null,
31975
32045
  access: "view"
31976
32046
  },
32047
+ "pipelineOrchestrator.getReconcileFromDiskStatus": {
32048
+ capName: "pipeline-orchestrator",
32049
+ capScope: "system",
32050
+ addonId: null,
32051
+ access: "view"
32052
+ },
31977
32053
  "pipelineOrchestrator.listAgentSettings": {
31978
32054
  capName: "pipeline-orchestrator",
31979
32055
  capScope: "system",
@@ -31998,6 +32074,12 @@ Object.freeze({
31998
32074
  addonId: null,
31999
32075
  access: "create"
32000
32076
  },
32077
+ "pipelineOrchestrator.reconcileFromDisk": {
32078
+ capName: "pipeline-orchestrator",
32079
+ capScope: "system",
32080
+ addonId: null,
32081
+ access: "create"
32082
+ },
32001
32083
  "pipelineOrchestrator.removeAgentSettings": {
32002
32084
  capName: "pipeline-orchestrator",
32003
32085
  capScope: "system",
@@ -34989,6 +35071,11 @@ Object.freeze({
34989
35071
  form: "single",
34990
35072
  optional: true
34991
35073
  }],
35074
+ "pipelineAnalytics.reconcileFromDisk": [{
35075
+ name: "deviceId",
35076
+ form: "single",
35077
+ optional: false
35078
+ }],
34992
35079
  "pipelineAnalytics.restageRetrainTrack": [{
34993
35080
  name: "deviceId",
34994
35081
  form: "single",
@@ -37166,6 +37253,12 @@ Object.defineProperty(exports, "resolveEgressDecodeHwAccel", {
37166
37253
  return resolveEgressDecodeHwAccel;
37167
37254
  }
37168
37255
  });
37256
+ Object.defineProperty(exports, "resolveRecordingProfiles", {
37257
+ enumerable: true,
37258
+ get: function() {
37259
+ return resolveRecordingProfiles;
37260
+ }
37261
+ });
37169
37262
  Object.defineProperty(exports, "runtimeDevices", {
37170
37263
  enumerable: true,
37171
37264
  get: function() {
@@ -1,4 +1,4 @@
1
- import { H as hfModelUrl, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-BJYwWEZ9.mjs";
1
+ import { H as hfModelUrl, a as COCO_80_LABELS, o as COCO_TO_MACRO, r as AUDIO_MACRO_LABELS } from "./dist-6POVIYmC.mjs";
2
2
  import { PerformanceObserver } from "node:perf_hooks";
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-n4Nbnxx5.js");
1
+ const require_dist = require("./dist-D9To_r_d.js");
2
2
  let node_perf_hooks = require("node:perf_hooks");
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-n4Nbnxx5.js");
1
+ const require_dist = require("./dist-D9To_r_d.js");
2
2
  let node_url = require("node:url");
3
3
  let node_module = require("node:module");
4
4
  let node_path = require("node:path");
@@ -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-n4Nbnxx5.js");
6
- const require_lazy_sharp = require("../lazy-sharp-EoSOHgoj.js");
5
+ const require_dist = require("../dist-D9To_r_d.js");
6
+ const require_lazy_sharp = require("../lazy-sharp-C3zOnmiU.js");
7
7
  let node_path = require("node:path");
8
8
  let node_fs = require("node:fs");
9
9
  //#region src/motion-wasm/wasm-motion-detector.ts
@@ -1,4 +1,4 @@
1
- import { G as motionDetectionCapability, V as evaluateZoneRules, ht as hydrateSchema, pt as DeviceType, ut as BaseAddon } from "../dist-BJYwWEZ9.mjs";
1
+ import { G as motionDetectionCapability, V as evaluateZoneRules, dt as BaseAddon, gt as hydrateSchema, mt as DeviceType } from "../dist-6POVIYmC.mjs";
2
2
  import { t as getSharp } from "../lazy-sharp-6oymT_yf.mjs";
3
3
  import { join } from "node:path";
4
4
  import { readFileSync } from "node:fs";
@@ -2,11 +2,11 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-n4Nbnxx5.js");
6
- const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DG7QY00k.js");
7
- const require_worker_protocol = require("../worker-protocol-DjuxhGo3.js");
5
+ const require_dist = require("../dist-D9To_r_d.js");
6
+ const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-CGacbzXq.js");
7
+ const require_worker_protocol = require("../worker-protocol-Bq28qobd.js");
8
8
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
9
- const require_lazy_sharp = require("../lazy-sharp-EoSOHgoj.js");
9
+ const require_lazy_sharp = require("../lazy-sharp-C3zOnmiU.js");
10
10
  const require_remote_restream = require("../remote-restream-BYbAsgUf.js");
11
11
  let sharp = require("sharp");
12
12
  sharp = require_dist.__toESM(sharp);
@@ -1,6 +1,6 @@
1
- import { At as number, Et as boolean, F as deriveDetailCropRect, Ft as EventCategory, K as pickDetailCropConvention, N as defineCustomActions, Nt as string, Ot as lazy, Tt as array, Y as pipelineRunnerCapability, c as DEFAULT_DETAIL_CROP_CONVENTION, d as DEVICE_BACKEND_TO_FORMAT, it as errMsg, j as customAction, jt as object, kt as literal, mt as createEvent, q as pickNativeLeaseOverride, ut as BaseAddon, wt as _enum, yt as nodePin } from "../dist-BJYwWEZ9.mjs";
2
- import { c as getStepDefinition, t as attributeStall } from "../event-loop-stall-monitor-BiPffk0D.mjs";
3
- import { a as nativeLeaseSettingEnv, t as isWorkerReply } from "../worker-protocol-XZ1e36rM.mjs";
1
+ import { At as literal, Dt as boolean, Et as array, F as deriveDetailCropRect, It as EventCategory, K as pickDetailCropConvention, Mt as object, N as defineCustomActions, Pt as string, Tt as _enum, Y as pipelineRunnerCapability, at as errMsg, bt as nodePin, c as DEFAULT_DETAIL_CROP_CONVENTION, d as DEVICE_BACKEND_TO_FORMAT, dt as BaseAddon, ht as createEvent, j as customAction, jt as number, kt as lazy, q as pickNativeLeaseOverride } from "../dist-6POVIYmC.mjs";
2
+ import { c as getStepDefinition, t as attributeStall } from "../event-loop-stall-monitor-C-VvWOxS.mjs";
3
+ import { a as nativeLeaseSettingEnv, t as isWorkerReply } from "../worker-protocol-PzAKg8mC.mjs";
4
4
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
5
5
  import { t as getSharp } from "../lazy-sharp-6oymT_yf.mjs";
6
6
  import { i as withDetectionIntent, n as profileForStreamId, t as isRemoteRestream } from "../remote-restream-Ci7RXNGb.mjs";