@camstack/addon-pipeline 1.2.154 → 1.2.156

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-CNyaLgDE.js → dist-C499qEUf.js} +296 -4
  6. package/dist/{dist-B3LRtscY.mjs → dist-C9ohtgTQ.mjs} +296 -4
  7. package/dist/{lazy-sharp-BtcZ-K2I.js → lazy-sharp-D5uApbbe.js} +1 -1
  8. package/dist/{local-frame-registry-C5pZ5QSM.mjs → local-frame-registry-DAVug-jA.mjs} +1 -1
  9. package/dist/{local-frame-registry-TkoMo5_E.js → local-frame-registry-VkzIezFI.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-CtIkY7To.mjs → node-CwIlVFyz.mjs} +1 -1
  13. package/dist/{node-Ctiow9ZV.js → node-DEq8mutP.js} +1 -1
  14. package/dist/pipeline-runner/index.js +5 -5
  15. package/dist/pipeline-runner/index.mjs +4 -4
  16. package/dist/{process-memory-C87TCFw5.mjs → process-memory-DWw7FrV5.mjs} +1 -1
  17. package/dist/{process-memory-W1prDrmt.js → process-memory-DzycAIEm.js} +1 -1
  18. package/dist/recorder/index.js +668 -100
  19. package/dist/recorder/index.mjs +668 -100
  20. package/dist/{segment-demux-js-BXma5CQd.mjs → segment-demux-js-D2InpBpa.mjs} +1 -1
  21. package/dist/{segment-demux-js-CnRETfAK.js → segment-demux-js-Df1rAqNh.js} +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-oS7jpj-4.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-BJlcLzCs.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-lMPlG5w5.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-yWrVN7u8.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-BMp9L2lF.mjs → hostInit-QpJx-TgK.mjs} +3 -3
  31. package/dist/stream-broker/index.js +3 -3
  32. package/dist/stream-broker/index.mjs +3 -3
  33. package/dist/stream-broker/remoteEntry.js +1 -1
  34. package/dist/{worker-protocol-DlDGOO8p.mjs → worker-protocol-CFHcqXoS.mjs} +1 -1
  35. package/dist/{worker-protocol-DOFTntiF.js → worker-protocol-ge8Ce0Bo.js} +1 -1
  36. package/package.json +1 -1
  37. package/dist/stream-broker/_virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CVQG3RZ2.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-Vtqzcp6N.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-CNyaLgDE.js");
6
- const require_process_memory = require("../process-memory-W1prDrmt.js");
5
+ const require_dist = require("../dist-C499qEUf.js");
6
+ const require_process_memory = require("../process-memory-DzycAIEm.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-B3LRtscY.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-C87TCFw5.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-C9ohtgTQ.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-DWw7FrV5.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-CNyaLgDE.js");
6
- const require_node = require("../node-Ctiow9ZV.js");
7
- const require_local_frame_registry = require("../local-frame-registry-TkoMo5_E.js");
8
- const require_lazy_sharp = require("../lazy-sharp-BtcZ-K2I.js");
5
+ const require_dist = require("../dist-C499qEUf.js");
6
+ const require_node = require("../node-DEq8mutP.js");
7
+ const require_local_frame_registry = require("../local-frame-registry-VkzIezFI.js");
8
+ const require_lazy_sharp = require("../lazy-sharp-D5uApbbe.js");
9
9
  const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DaUBcb13.js");
10
- const require_process_memory = require("../process-memory-W1prDrmt.js");
10
+ const require_process_memory = require("../process-memory-DzycAIEm.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-B3LRtscY.mjs";
3
- import { a as readProcessCost } from "../node-CtIkY7To.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-C5pZ5QSM.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-C9ohtgTQ.mjs";
3
+ import { a as readProcessCost } from "../node-CwIlVFyz.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-DAVug-jA.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-C87TCFw5.mjs";
7
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-DWw7FrV5.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";
@@ -9353,6 +9353,20 @@ var RelocateJobSchema = object({
9353
9353
  * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
9354
9354
  */
9355
9355
  rowsReconciled: number().int().nonnegative().optional(),
9356
+ /**
9357
+ * Rows this run FORGOT because the file they name is not on disk.
9358
+ *
9359
+ * The mover derived the path from the row's own fields and `stat`ed it; an
9360
+ * ENOENT there is a per-path confirmation that the segment is gone (D296),
9361
+ * and the durable row is dropped through the same channel eviction uses. It
9362
+ * is reported for the same reason `rowsReconciled` is: this is a durable
9363
+ * mutation nobody asked for, and a migration that quietly erases hour rows is
9364
+ * the same failure as one that quietly skips them (D295).
9365
+ *
9366
+ * The production drain of 2026-08-30 would have reported 11 074 here — the
9367
+ * ledger claimed 5.65 GB of footage that no longer existed.
9368
+ */
9369
+ rowsForgotten: number().int().nonnegative().optional(),
9356
9370
  startedAt: number(),
9357
9371
  finishedAt: number().nullable(),
9358
9372
  error: string().nullable()
@@ -9716,6 +9730,91 @@ var RelocateResidueSchema = object({
9716
9730
  segments: number().int().nonnegative(),
9717
9731
  bytes: number().int().nonnegative()
9718
9732
  }).nullable();
9733
+ /**
9734
+ * Ask one location whether its durable hour rows describe the disk — the walk
9735
+ * (D319).
9736
+ *
9737
+ * `apply` DEFAULTS TO FALSE and that default is the product: the operator's
9738
+ * missing tool is the question, and the dry run is how they sanity-check the
9739
+ * destructive run before authorising it.
9740
+ */
9741
+ var LedgerWalkInputSchema = object({
9742
+ locationId: string().min(1),
9743
+ /** Forget the confirmed-absent rows, rather than only counting them. */
9744
+ apply: boolean().optional(),
9745
+ /** Narrow to one camera. */
9746
+ deviceId: number().int().positive().optional(),
9747
+ /** Narrow to these recording profiles; empty/absent = every profile. */
9748
+ profiles: array(string().min(1)).optional()
9749
+ });
9750
+ /** Why a whole walk did nothing. Every one leaves the ledger untouched. */
9751
+ var LedgerWalkRefusalSchema = _enum([
9752
+ "location-unknown",
9753
+ "source-writable",
9754
+ "no-ledger",
9755
+ "archive-unreadable",
9756
+ "anchor-absent",
9757
+ "anchor-unreadable",
9758
+ "anchor-moved"
9759
+ ]);
9760
+ _enum([
9761
+ "live-tail",
9762
+ "listing-error",
9763
+ "path-mismatch",
9764
+ "durable-refused"
9765
+ ]);
9766
+ /** Every skip reason, always present, always a number — so a reason that never
9767
+ * fired reports as zero rather than absent and the report shape is constant
9768
+ * between passes. Spelled out rather than `z.record` for exactly that. */
9769
+ var LedgerWalkSkipCountsSchema = object({
9770
+ "live-tail": number().int().nonnegative(),
9771
+ "listing-error": number().int().nonnegative(),
9772
+ "path-mismatch": number().int().nonnegative(),
9773
+ "durable-refused": number().int().nonnegative()
9774
+ });
9775
+ /** One camera's share of a walk, so a report names cameras and not rows. */
9776
+ var LedgerWalkDeviceReportSchema = object({
9777
+ deviceId: number().int(),
9778
+ hoursWalked: number().int().nonnegative(),
9779
+ hoursMissing: number().int().nonnegative(),
9780
+ ghostSegments: number().int().nonnegative(),
9781
+ ghostBytes: number().int().nonnegative(),
9782
+ forgottenSegments: number().int().nonnegative(),
9783
+ orphanFiles: number().int().nonnegative()
9784
+ });
9785
+ /**
9786
+ * What one walk claimed, listed, found and (only when armed) forgot.
9787
+ *
9788
+ * `archiveSegments` is the **M** and `segmentsClaimed` the **N** (D295), so a
9789
+ * walk that saw a fraction of the location is visible in its own report rather
9790
+ * than in the absence of one.
9791
+ */
9792
+ var LedgerWalkReportSchema = object({
9793
+ locationId: string(),
9794
+ applied: boolean(),
9795
+ refused: LedgerWalkRefusalSchema.nullable(),
9796
+ archiveSegments: number().int().nonnegative().nullable(),
9797
+ archiveBytes: number().int().nonnegative().nullable(),
9798
+ hoursClaimed: number().int().nonnegative(),
9799
+ hoursWalked: number().int().nonnegative(),
9800
+ hoursMissing: number().int().nonnegative(),
9801
+ /** `readdir` calls issued — the cost, stated in the unit that is paid. */
9802
+ listings: number().int().nonnegative(),
9803
+ segmentsClaimed: number().int().nonnegative(),
9804
+ ghostSegments: number().int().nonnegative(),
9805
+ ghostBytes: number().int().nonnegative(),
9806
+ ghostHoursWhole: number().int().nonnegative(),
9807
+ forgottenSegments: number().int().nonnegative(),
9808
+ forgottenBytes: number().int().nonnegative(),
9809
+ /** Files under a claimed hour that no durable row names. Never deleted. */
9810
+ orphanFiles: number().int().nonnegative(),
9811
+ orphanSample: array(string()).readonly(),
9812
+ hoursSkipped: number().int().nonnegative(),
9813
+ skippedByReason: LedgerWalkSkipCountsSchema,
9814
+ /** The walk stopped at its per-pass hour bound with claims unwalked. */
9815
+ bounded: boolean(),
9816
+ byDevice: array(LedgerWalkDeviceReportSchema).readonly()
9817
+ });
9719
9818
  /** How many rows a media pass would still act on against a given target — the
9720
9819
  * media lane's denominator AND its residue, from ONE derivation so the two can
9721
9820
  * never disagree. `null` = the count could not be taken. */
@@ -21151,13 +21250,15 @@ var ListGroupsPageSchema = object({
21151
21250
  groups: array(AnalyticsGroupRecordSchema).readonly(),
21152
21251
  nextCursor: string().nullable()
21153
21252
  });
21253
+ var KEY_EVENTS_DEFAULT_LIMIT = 50;
21254
+ var KEY_EVENTS_MAX_LIMIT = 200;
21154
21255
  var KeyEventQueryInput = object({
21155
21256
  deviceId: number(),
21156
21257
  /** Window lower bound (track firstSeen ≥ since). */
21157
21258
  since: number(),
21158
21259
  /** Window upper bound (track firstSeen ≤ until). */
21159
21260
  until: number(),
21160
- limit: number().int().min(1).max(200).default(50),
21261
+ limit: number().int().min(1).max(KEY_EVENTS_MAX_LIMIT).default(KEY_EVENTS_DEFAULT_LIMIT),
21161
21262
  /** Drop tracks scoring below this importance. */
21162
21263
  minImportance: number().min(0).max(1).optional(),
21163
21264
  /** Restrict to a single class (e.g. 'person'). */
@@ -21179,6 +21280,32 @@ var KeyEventSchema = object({
21179
21280
  ...TrackFlagFields,
21180
21281
  ...TrackRetrainFields
21181
21282
  });
21283
+ /** `getKeyEvents`' window and filters, asked of a SET of cameras at once. */
21284
+ var KeyEventBatchQueryInput = object({
21285
+ deviceIds: array(number()).min(1).max(200),
21286
+ since: number(),
21287
+ until: number(),
21288
+ /** Applied PER CAMERA, exactly as `getKeyEvents.limit` is — never a total
21289
+ * across the set, which would let a busy camera starve a quiet one of its
21290
+ * rows and change what the merged feed contains. */
21291
+ limit: number().int().min(1).max(KEY_EVENTS_MAX_LIMIT).default(KEY_EVENTS_DEFAULT_LIMIT),
21292
+ minImportance: number().min(0).max(1).optional(),
21293
+ classFilter: string().optional()
21294
+ });
21295
+ /**
21296
+ * One camera's key events in a batch answer.
21297
+ *
21298
+ * The row exists for every requested id. `getKeyEvents` degrades to `[]` on
21299
+ * error rather than throwing, so a camera whose store read failed and one with
21300
+ * no events in the window were ALREADY indistinguishable per camera — the
21301
+ * batch does not make that worse, and the row keeps the deviceId the single
21302
+ * method's output never carried (the caller used to stamp it from the fan-out
21303
+ * key, which only worked because there was one query per camera).
21304
+ */
21305
+ var KeyEventsForDeviceSchema = object({
21306
+ deviceId: number(),
21307
+ events: array(KeyEventSchema).readonly()
21308
+ });
21182
21309
  object({
21183
21310
  trackId: string(),
21184
21311
  className: string(),
@@ -21398,6 +21525,47 @@ var RebuildStatusSchema = object({
21398
21525
  /** Present when the pass ended by throwing. */
21399
21526
  error: string().nullable()
21400
21527
  });
21528
+ /**
21529
+ * Acknowledgement that a debug-media reclaim STARTED.
21530
+ *
21531
+ * The pass is paced at ~2 MB/s over a standing 100 GB — tens of minutes — so
21532
+ * it runs detached and this returns immediately. Awaiting it is how the
21533
+ * `addons.custom` door hit the 60 s UDS deadline while the walk carried on
21534
+ * with no status. Poll {@link pipelineAnalyticsCapability.methods.getMediaReclaimStatus}.
21535
+ */
21536
+ var MediaReclaimStartResultSchema = object({
21537
+ started: boolean(),
21538
+ /** True when a pass was already running; the new request is ignored. */
21539
+ alreadyRunning: boolean()
21540
+ });
21541
+ var MediaReclaimInputSchema = object({
21542
+ mode: _enum(["report", "reclaim"]).default("report"),
21543
+ scopes: array(_enum(["motion-still", "track-filmstrip"])).min(1).optional(),
21544
+ deviceIds: array(number().int()).min(1).optional(),
21545
+ restart: boolean().optional(),
21546
+ pageSize: number().int().min(50).max(5e3).optional(),
21547
+ maxRowsPerDevice: number().int().min(1).max(5e5).optional(),
21548
+ maxReclaimPerDevice: number().int().min(1).max(5e5).optional(),
21549
+ maxBytesPerRun: number().int().min(1).optional(),
21550
+ budgetMinutes: number().int().min(1).max(720).optional(),
21551
+ throttleBytesPerSec: number().int().min(64 * 1024).optional(),
21552
+ graceMinutes: number().int().min(1).max(10080).optional()
21553
+ });
21554
+ var MediaReclaimStatusSchema = object({
21555
+ running: boolean(),
21556
+ mode: _enum(["report", "reclaim"]).nullable(),
21557
+ totalExamined: number(),
21558
+ totalEligible: number(),
21559
+ totalReclaimed: number(),
21560
+ totalBytesReclaimed: number(),
21561
+ totalRefused: number(),
21562
+ /** Device+scope windows finished in this pass. */
21563
+ devicesDone: number(),
21564
+ complete: boolean().nullable(),
21565
+ startedAtMs: number().nullable(),
21566
+ finishedAtMs: number().nullable(),
21567
+ error: string().nullable()
21568
+ });
21401
21569
  var ReplayFrameInputSchema = object({
21402
21570
  timestamp: number(),
21403
21571
  frame: PipelineRunResultBridge
@@ -21448,7 +21616,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21448
21616
  until: number().optional(),
21449
21617
  kinds: array(string()).optional(),
21450
21618
  limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT)
21451
- }), array(SensorEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
21619
+ }), array(SensorEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(KeyEventBatchQueryInput, array(KeyEventsForDeviceSchema).readonly()), method(object({
21452
21620
  deviceId: number(),
21453
21621
  since: number(),
21454
21622
  until: number(),
@@ -21539,6 +21707,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21539
21707
  }), method(OpsLogQueryInputSchema, array(OpsLogEntrySchema).readonly(), {
21540
21708
  kind: "query",
21541
21709
  auth: "admin"
21710
+ }), method(MediaReclaimInputSchema, MediaReclaimStartResultSchema, {
21711
+ kind: "mutation",
21712
+ auth: "admin"
21713
+ }), method(object({}), MediaReclaimStatusSchema, {
21714
+ kind: "query",
21715
+ auth: "admin"
21542
21716
  }), method(object({ deviceIds: array(number()).optional() }), TrainingExportSummarySchema, {
21543
21717
  kind: "query",
21544
21718
  auth: "admin"
@@ -29519,6 +29693,23 @@ var recordingCapability = {
29519
29693
  kind: "query",
29520
29694
  auth: "admin"
29521
29695
  }),
29696
+ /**
29697
+ * Does this location's LEDGER tell the truth about its disk? (D319)
29698
+ *
29699
+ * One `readdir` per claimed hour, diffed both ways: durable rows whose file
29700
+ * is not there, and files no durable row names. `apply` defaults to FALSE —
29701
+ * the report is the product, and the dry run is how an operator
29702
+ * sanity-checks the destructive run before authorising it.
29703
+ *
29704
+ * REFUSES a source that is still a write target: a listing of a live
29705
+ * location is a lower bound, which is not the strong evidence that lets
29706
+ * this pass forget without a budget. A live location is reconciled by the
29707
+ * mover, under D318's bound.
29708
+ */
29709
+ reconcileLedgerAgainstDisk: method(LedgerWalkInputSchema, LedgerWalkReportSchema, {
29710
+ kind: "mutation",
29711
+ auth: "admin"
29712
+ }),
29522
29713
  /** Cancel a running or queued relocate job. A queued job never runs. */
29523
29714
  cancelRelocateJob: method(object({ jobId: string() }), object({ cancelled: boolean() }), {
29524
29715
  kind: "mutation",
@@ -29972,7 +30163,26 @@ var SceneMonitorStatusSchema = object({
29972
30163
  monitors: array(SceneMonitorSchema),
29973
30164
  lastFetchedAt: number()
29974
30165
  });
29975
- DeviceType.Camera, method(object({ deviceId: number() }), SceneMonitorStatusSchema), method(object({
30166
+ /**
30167
+ * One camera's row in a `listScenesBatch` answer.
30168
+ *
30169
+ * `status` is NULLABLE and the nullability is the whole point. `scene-monitor`
30170
+ * is a `defaultActive` wrapper, so every camera is asked; a camera whose
30171
+ * provider is absent (pipeline-analytics not deployed, the post-processing node
30172
+ * down) cannot answer, and that is not the same fact as a camera with no scenes
30173
+ * configured. Fanned out per camera the difference was visible — one query
30174
+ * errored while the others resolved — and a batch that returned only the rows
30175
+ * it managed would have destroyed it, silently, by making an unreachable camera
30176
+ * indistinguishable from one that answered `monitors: []`.
30177
+ *
30178
+ * So: EVERY requested deviceId gets a row. `status: null` means "this camera
30179
+ * could not be read"; `status.monitors: []` means "read, and it has none".
30180
+ */
30181
+ var SceneMonitorStatusForDeviceSchema = object({
30182
+ deviceId: number(),
30183
+ status: SceneMonitorStatusSchema.nullable()
30184
+ });
30185
+ DeviceType.Camera, method(object({ deviceId: number() }), SceneMonitorStatusSchema), method(object({ deviceIds: array(number()).min(1).max(200) }), array(SceneMonitorStatusForDeviceSchema).readonly()), method(object({
29976
30186
  deviceId: number(),
29977
30187
  label: string(),
29978
30188
  roi: MaskRectShapeSchema,
@@ -31296,6 +31506,27 @@ var CameraOccupancySnapshotSchema = object({
31296
31506
  stationaryObjects: array(StationaryObjectSchema).readonly().optional()
31297
31507
  });
31298
31508
  /**
31509
+ * One camera's row in a `getCurrentSnapshotBatch` answer.
31510
+ *
31511
+ * THREE outcomes, and the single-camera method could only express two of them
31512
+ * because `snapshot: null` was already spoken for:
31513
+ *
31514
+ * - `read: 'read'`, `snapshot` present — the live occupancy reading.
31515
+ * - `read: 'read'`, `snapshot: null` — read, and this camera has no reading
31516
+ * yet: no frame since boot, and no parked-object registry to hydrate from.
31517
+ * - `read: 'unreadable'` — the owner could not answer for this
31518
+ * camera. `snapshot` is null, and it does NOT mean "nothing parked here".
31519
+ *
31520
+ * Collapsing the last two is the failure this field exists to prevent: a
31521
+ * hydration that threw would otherwise render as an empty Stationary section,
31522
+ * which is a definite claim about a camera nobody could read.
31523
+ */
31524
+ var CameraOccupancySnapshotForDeviceSchema = object({
31525
+ deviceId: number(),
31526
+ read: _enum(["read", "unreadable"]),
31527
+ snapshot: CameraOccupancySnapshotSchema.nullable()
31528
+ });
31529
+ /**
31299
31530
  * Time-series resolution. The history methods return one bucket per
31300
31531
  * step over the requested range. Smaller resolutions cost more
31301
31532
  * memory + bandwidth; bound to discrete steps so caller cannot ask
@@ -31319,7 +31550,7 @@ var HistoryPointSchema = object({
31319
31550
  /** Object count averaged over the bucket (rounded to nearest integer). */
31320
31551
  count: number().int().nonnegative()
31321
31552
  });
31322
- DeviceType.Camera, method(object({ deviceId: number() }), CameraOccupancySnapshotSchema.nullable()), method(object({
31553
+ DeviceType.Camera, method(object({ deviceId: number() }), CameraOccupancySnapshotSchema.nullable()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(CameraOccupancySnapshotForDeviceSchema).readonly()), method(object({
31323
31554
  deviceId: number(),
31324
31555
  zoneId: string(),
31325
31556
  className: string().optional()
@@ -34783,6 +35014,18 @@ Object.freeze({
34783
35014
  addonId: null,
34784
35015
  access: "view"
34785
35016
  },
35017
+ "pipelineAnalytics.getKeyEventsBatch": {
35018
+ capName: "pipeline-analytics",
35019
+ capScope: "device",
35020
+ addonId: null,
35021
+ access: "view"
35022
+ },
35023
+ "pipelineAnalytics.getMediaReclaimStatus": {
35024
+ capName: "pipeline-analytics",
35025
+ capScope: "device",
35026
+ addonId: null,
35027
+ access: "view"
35028
+ },
34786
35029
  "pipelineAnalytics.getMotionEvents": {
34787
35030
  capName: "pipeline-analytics",
34788
35031
  capScope: "device",
@@ -34957,6 +35200,12 @@ Object.freeze({
34957
35200
  addonId: null,
34958
35201
  access: "create"
34959
35202
  },
35203
+ "pipelineAnalytics.reclaimDebugMedia": {
35204
+ capName: "pipeline-analytics",
35205
+ capScope: "device",
35206
+ addonId: null,
35207
+ access: "create"
35208
+ },
34960
35209
  "pipelineAnalytics.reconcileFromDisk": {
34961
35210
  capName: "pipeline-analytics",
34962
35211
  capScope: "device",
@@ -35959,6 +36208,12 @@ Object.freeze({
35959
36208
  addonId: null,
35960
36209
  access: "view"
35961
36210
  },
36211
+ "recording.reconcileLedgerAgainstDisk": {
36212
+ capName: "recording",
36213
+ capScope: "system",
36214
+ addonId: null,
36215
+ access: "create"
36216
+ },
35962
36217
  "recording.refreshStorageLocationsForMigration": {
35963
36218
  capName: "recording",
35964
36219
  capScope: "system",
@@ -36085,6 +36340,12 @@ Object.freeze({
36085
36340
  addonId: null,
36086
36341
  access: "view"
36087
36342
  },
36343
+ "sceneMonitor.listScenesBatch": {
36344
+ capName: "scene-monitor",
36345
+ capScope: "device",
36346
+ addonId: null,
36347
+ access: "view"
36348
+ },
36088
36349
  "sceneMonitor.recheckNow": {
36089
36350
  capName: "scene-monitor",
36090
36351
  capScope: "device",
@@ -37441,6 +37702,12 @@ Object.freeze({
37441
37702
  addonId: null,
37442
37703
  access: "view"
37443
37704
  },
37705
+ "zoneAnalytics.getCurrentSnapshotBatch": {
37706
+ capName: "zone-analytics",
37707
+ capScope: "device",
37708
+ addonId: null,
37709
+ access: "view"
37710
+ },
37444
37711
  "zoneAnalytics.getUnzonedHistory": {
37445
37712
  capName: "zone-analytics",
37446
37713
  capScope: "device",
@@ -38445,6 +38712,11 @@ Object.freeze({
38445
38712
  form: "single",
38446
38713
  optional: false
38447
38714
  }],
38715
+ "pipelineAnalytics.getKeyEventsBatch": [{
38716
+ name: "deviceIds",
38717
+ form: "array",
38718
+ optional: false
38719
+ }],
38448
38720
  "pipelineAnalytics.getMotionEvents": [{
38449
38721
  name: "deviceId",
38450
38722
  form: "single",
@@ -38550,6 +38822,11 @@ Object.freeze({
38550
38822
  form: "single",
38551
38823
  optional: true
38552
38824
  }],
38825
+ "pipelineAnalytics.reclaimDebugMedia": [{
38826
+ name: "deviceIds",
38827
+ form: "array",
38828
+ optional: true
38829
+ }],
38553
38830
  "pipelineAnalytics.reconcileFromDisk": [{
38554
38831
  name: "deviceId",
38555
38832
  form: "single",
@@ -38885,6 +39162,11 @@ Object.freeze({
38885
39162
  form: "single",
38886
39163
  optional: false
38887
39164
  }],
39165
+ "recording.reconcileLedgerAgainstDisk": [{
39166
+ name: "deviceId",
39167
+ form: "single",
39168
+ optional: true
39169
+ }],
38888
39170
  "recording.relocateFootage": [{
38889
39171
  name: "deviceId",
38890
39172
  form: "single",
@@ -38950,6 +39232,11 @@ Object.freeze({
38950
39232
  form: "single",
38951
39233
  optional: false
38952
39234
  }],
39235
+ "sceneMonitor.listScenesBatch": [{
39236
+ name: "deviceIds",
39237
+ form: "array",
39238
+ optional: false
39239
+ }],
38953
39240
  "sceneMonitor.recheckNow": [{
38954
39241
  name: "deviceId",
38955
39242
  form: "single",
@@ -39211,6 +39498,11 @@ Object.freeze({
39211
39498
  form: "single",
39212
39499
  optional: false
39213
39500
  }],
39501
+ "zoneAnalytics.getCurrentSnapshotBatch": [{
39502
+ name: "deviceIds",
39503
+ form: "array",
39504
+ optional: false
39505
+ }],
39214
39506
  "zoneAnalytics.getUnzonedHistory": [{
39215
39507
  name: "deviceId",
39216
39508
  form: "single",