@camstack/addon-pipeline 1.2.154 → 1.2.155

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-B3LRtscY.mjs → dist-CBRky_dz.mjs} +232 -4
  6. package/dist/{dist-CNyaLgDE.js → dist-CmrtJ8RB.js} +232 -4
  7. package/dist/{lazy-sharp-BtcZ-K2I.js → lazy-sharp-BODx7w1t.js} +1 -1
  8. package/dist/{local-frame-registry-TkoMo5_E.js → local-frame-registry-BRG0GTmK.js} +1 -1
  9. package/dist/{local-frame-registry-C5pZ5QSM.mjs → local-frame-registry-ByKcWWPU.mjs} +1 -1
  10. package/dist/motion-wasm/index.js +2 -2
  11. package/dist/motion-wasm/index.mjs +1 -1
  12. package/dist/{node-Ctiow9ZV.js → node-BSeMUwxJ.js} +1 -1
  13. package/dist/{node-CtIkY7To.mjs → node-CQzPpwIR.mjs} +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-DQX-DbHx.mjs} +1 -1
  17. package/dist/{process-memory-W1prDrmt.js → process-memory-DVmHBraW.js} +1 -1
  18. package/dist/recorder/index.js +667 -100
  19. package/dist/recorder/index.mjs +667 -100
  20. package/dist/{segment-demux-js-BXma5CQd.mjs → segment-demux-js-DGX1iGLL.mjs} +1 -1
  21. package/dist/{segment-demux-js-CnRETfAK.js → segment-demux-js-DmqnujVx.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-DvfM0ofY.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-CSNuIp4J.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-DQGeMfoN.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-C7jOjCsc.mjs} +1 -1
  35. package/dist/{worker-protocol-DOFTntiF.js → worker-protocol-S2nAdf6B.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-CmrtJ8RB.js");
6
+ const require_process_memory = require("../process-memory-DVmHBraW.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-CBRky_dz.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-DQX-DbHx.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-CmrtJ8RB.js");
6
+ const require_node = require("../node-BSeMUwxJ.js");
7
+ const require_local_frame_registry = require("../local-frame-registry-BRG0GTmK.js");
8
+ const require_lazy_sharp = require("../lazy-sharp-BODx7w1t.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-DVmHBraW.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-CBRky_dz.mjs";
3
+ import { a as readProcessCost } from "../node-CQzPpwIR.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-ByKcWWPU.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-DQX-DbHx.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";
@@ -9330,6 +9330,20 @@ var RelocateJobSchema = object({
9330
9330
  * in its row, not in its name, so `MediaRelocateEngine` never reconciles one.
9331
9331
  */
9332
9332
  rowsReconciled: number().int().nonnegative().optional(),
9333
+ /**
9334
+ * Rows this run FORGOT because the file they name is not on disk.
9335
+ *
9336
+ * The mover derived the path from the row's own fields and `stat`ed it; an
9337
+ * ENOENT there is a per-path confirmation that the segment is gone (D296),
9338
+ * and the durable row is dropped through the same channel eviction uses. It
9339
+ * is reported for the same reason `rowsReconciled` is: this is a durable
9340
+ * mutation nobody asked for, and a migration that quietly erases hour rows is
9341
+ * the same failure as one that quietly skips them (D295).
9342
+ *
9343
+ * The production drain of 2026-08-30 would have reported 11 074 here — the
9344
+ * ledger claimed 5.65 GB of footage that no longer existed.
9345
+ */
9346
+ rowsForgotten: number().int().nonnegative().optional(),
9333
9347
  startedAt: number(),
9334
9348
  finishedAt: number().nullable(),
9335
9349
  error: string().nullable()
@@ -9693,6 +9707,91 @@ var RelocateResidueSchema = object({
9693
9707
  segments: number().int().nonnegative(),
9694
9708
  bytes: number().int().nonnegative()
9695
9709
  }).nullable();
9710
+ /**
9711
+ * Ask one location whether its durable hour rows describe the disk — the walk
9712
+ * (D319).
9713
+ *
9714
+ * `apply` DEFAULTS TO FALSE and that default is the product: the operator's
9715
+ * missing tool is the question, and the dry run is how they sanity-check the
9716
+ * destructive run before authorising it.
9717
+ */
9718
+ var LedgerWalkInputSchema = object({
9719
+ locationId: string().min(1),
9720
+ /** Forget the confirmed-absent rows, rather than only counting them. */
9721
+ apply: boolean().optional(),
9722
+ /** Narrow to one camera. */
9723
+ deviceId: number().int().positive().optional(),
9724
+ /** Narrow to these recording profiles; empty/absent = every profile. */
9725
+ profiles: array(string().min(1)).optional()
9726
+ });
9727
+ /** Why a whole walk did nothing. Every one leaves the ledger untouched. */
9728
+ var LedgerWalkRefusalSchema = _enum([
9729
+ "location-unknown",
9730
+ "source-writable",
9731
+ "no-ledger",
9732
+ "archive-unreadable",
9733
+ "anchor-absent",
9734
+ "anchor-unreadable",
9735
+ "anchor-moved"
9736
+ ]);
9737
+ _enum([
9738
+ "live-tail",
9739
+ "listing-error",
9740
+ "path-mismatch",
9741
+ "durable-refused"
9742
+ ]);
9743
+ /** Every skip reason, always present, always a number — so a reason that never
9744
+ * fired reports as zero rather than absent and the report shape is constant
9745
+ * between passes. Spelled out rather than `z.record` for exactly that. */
9746
+ var LedgerWalkSkipCountsSchema = object({
9747
+ "live-tail": number().int().nonnegative(),
9748
+ "listing-error": number().int().nonnegative(),
9749
+ "path-mismatch": number().int().nonnegative(),
9750
+ "durable-refused": number().int().nonnegative()
9751
+ });
9752
+ /** One camera's share of a walk, so a report names cameras and not rows. */
9753
+ var LedgerWalkDeviceReportSchema = object({
9754
+ deviceId: number().int(),
9755
+ hoursWalked: number().int().nonnegative(),
9756
+ hoursMissing: number().int().nonnegative(),
9757
+ ghostSegments: number().int().nonnegative(),
9758
+ ghostBytes: number().int().nonnegative(),
9759
+ forgottenSegments: number().int().nonnegative(),
9760
+ orphanFiles: number().int().nonnegative()
9761
+ });
9762
+ /**
9763
+ * What one walk claimed, listed, found and (only when armed) forgot.
9764
+ *
9765
+ * `archiveSegments` is the **M** and `segmentsClaimed` the **N** (D295), so a
9766
+ * walk that saw a fraction of the location is visible in its own report rather
9767
+ * than in the absence of one.
9768
+ */
9769
+ var LedgerWalkReportSchema = object({
9770
+ locationId: string(),
9771
+ applied: boolean(),
9772
+ refused: LedgerWalkRefusalSchema.nullable(),
9773
+ archiveSegments: number().int().nonnegative().nullable(),
9774
+ archiveBytes: number().int().nonnegative().nullable(),
9775
+ hoursClaimed: number().int().nonnegative(),
9776
+ hoursWalked: number().int().nonnegative(),
9777
+ hoursMissing: number().int().nonnegative(),
9778
+ /** `readdir` calls issued — the cost, stated in the unit that is paid. */
9779
+ listings: number().int().nonnegative(),
9780
+ segmentsClaimed: number().int().nonnegative(),
9781
+ ghostSegments: number().int().nonnegative(),
9782
+ ghostBytes: number().int().nonnegative(),
9783
+ ghostHoursWhole: number().int().nonnegative(),
9784
+ forgottenSegments: number().int().nonnegative(),
9785
+ forgottenBytes: number().int().nonnegative(),
9786
+ /** Files under a claimed hour that no durable row names. Never deleted. */
9787
+ orphanFiles: number().int().nonnegative(),
9788
+ orphanSample: array(string()).readonly(),
9789
+ hoursSkipped: number().int().nonnegative(),
9790
+ skippedByReason: LedgerWalkSkipCountsSchema,
9791
+ /** The walk stopped at its per-pass hour bound with claims unwalked. */
9792
+ bounded: boolean(),
9793
+ byDevice: array(LedgerWalkDeviceReportSchema).readonly()
9794
+ });
9696
9795
  /** How many rows a media pass would still act on against a given target — the
9697
9796
  * media lane's denominator AND its residue, from ONE derivation so the two can
9698
9797
  * never disagree. `null` = the count could not be taken. */
@@ -21128,13 +21227,15 @@ var ListGroupsPageSchema = object({
21128
21227
  groups: array(AnalyticsGroupRecordSchema).readonly(),
21129
21228
  nextCursor: string().nullable()
21130
21229
  });
21230
+ var KEY_EVENTS_DEFAULT_LIMIT = 50;
21231
+ var KEY_EVENTS_MAX_LIMIT = 200;
21131
21232
  var KeyEventQueryInput = object({
21132
21233
  deviceId: number(),
21133
21234
  /** Window lower bound (track firstSeen ≥ since). */
21134
21235
  since: number(),
21135
21236
  /** Window upper bound (track firstSeen ≤ until). */
21136
21237
  until: number(),
21137
- limit: number().int().min(1).max(200).default(50),
21238
+ limit: number().int().min(1).max(KEY_EVENTS_MAX_LIMIT).default(KEY_EVENTS_DEFAULT_LIMIT),
21138
21239
  /** Drop tracks scoring below this importance. */
21139
21240
  minImportance: number().min(0).max(1).optional(),
21140
21241
  /** Restrict to a single class (e.g. 'person'). */
@@ -21156,6 +21257,32 @@ var KeyEventSchema = object({
21156
21257
  ...TrackFlagFields,
21157
21258
  ...TrackRetrainFields
21158
21259
  });
21260
+ /** `getKeyEvents`' window and filters, asked of a SET of cameras at once. */
21261
+ var KeyEventBatchQueryInput = object({
21262
+ deviceIds: array(number()).min(1).max(200),
21263
+ since: number(),
21264
+ until: number(),
21265
+ /** Applied PER CAMERA, exactly as `getKeyEvents.limit` is — never a total
21266
+ * across the set, which would let a busy camera starve a quiet one of its
21267
+ * rows and change what the merged feed contains. */
21268
+ limit: number().int().min(1).max(KEY_EVENTS_MAX_LIMIT).default(KEY_EVENTS_DEFAULT_LIMIT),
21269
+ minImportance: number().min(0).max(1).optional(),
21270
+ classFilter: string().optional()
21271
+ });
21272
+ /**
21273
+ * One camera's key events in a batch answer.
21274
+ *
21275
+ * The row exists for every requested id. `getKeyEvents` degrades to `[]` on
21276
+ * error rather than throwing, so a camera whose store read failed and one with
21277
+ * no events in the window were ALREADY indistinguishable per camera — the
21278
+ * batch does not make that worse, and the row keeps the deviceId the single
21279
+ * method's output never carried (the caller used to stamp it from the fan-out
21280
+ * key, which only worked because there was one query per camera).
21281
+ */
21282
+ var KeyEventsForDeviceSchema = object({
21283
+ deviceId: number(),
21284
+ events: array(KeyEventSchema).readonly()
21285
+ });
21159
21286
  object({
21160
21287
  trackId: string(),
21161
21288
  className: string(),
@@ -21425,7 +21552,7 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21425
21552
  until: number().optional(),
21426
21553
  kinds: array(string()).optional(),
21427
21554
  limit: number().int().min(1).max(MAX_EVENT_QUERY_LIMIT).default(DEFAULT_EVENT_QUERY_LIMIT)
21428
- }), array(SensorEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(object({
21555
+ }), array(SensorEventSchema).readonly()), method(KeyEventQueryInput, array(KeyEventSchema).readonly()), method(KeyEventBatchQueryInput, array(KeyEventsForDeviceSchema).readonly()), method(object({
21429
21556
  deviceId: number(),
21430
21557
  since: number(),
21431
21558
  until: number(),
@@ -29496,6 +29623,23 @@ var recordingCapability = {
29496
29623
  kind: "query",
29497
29624
  auth: "admin"
29498
29625
  }),
29626
+ /**
29627
+ * Does this location's LEDGER tell the truth about its disk? (D319)
29628
+ *
29629
+ * One `readdir` per claimed hour, diffed both ways: durable rows whose file
29630
+ * is not there, and files no durable row names. `apply` defaults to FALSE —
29631
+ * the report is the product, and the dry run is how an operator
29632
+ * sanity-checks the destructive run before authorising it.
29633
+ *
29634
+ * REFUSES a source that is still a write target: a listing of a live
29635
+ * location is a lower bound, which is not the strong evidence that lets
29636
+ * this pass forget without a budget. A live location is reconciled by the
29637
+ * mover, under D318's bound.
29638
+ */
29639
+ reconcileLedgerAgainstDisk: method(LedgerWalkInputSchema, LedgerWalkReportSchema, {
29640
+ kind: "mutation",
29641
+ auth: "admin"
29642
+ }),
29499
29643
  /** Cancel a running or queued relocate job. A queued job never runs. */
29500
29644
  cancelRelocateJob: method(object({ jobId: string() }), object({ cancelled: boolean() }), {
29501
29645
  kind: "mutation",
@@ -29949,7 +30093,26 @@ var SceneMonitorStatusSchema = object({
29949
30093
  monitors: array(SceneMonitorSchema),
29950
30094
  lastFetchedAt: number()
29951
30095
  });
29952
- DeviceType.Camera, method(object({ deviceId: number() }), SceneMonitorStatusSchema), method(object({
30096
+ /**
30097
+ * One camera's row in a `listScenesBatch` answer.
30098
+ *
30099
+ * `status` is NULLABLE and the nullability is the whole point. `scene-monitor`
30100
+ * is a `defaultActive` wrapper, so every camera is asked; a camera whose
30101
+ * provider is absent (pipeline-analytics not deployed, the post-processing node
30102
+ * down) cannot answer, and that is not the same fact as a camera with no scenes
30103
+ * configured. Fanned out per camera the difference was visible — one query
30104
+ * errored while the others resolved — and a batch that returned only the rows
30105
+ * it managed would have destroyed it, silently, by making an unreachable camera
30106
+ * indistinguishable from one that answered `monitors: []`.
30107
+ *
30108
+ * So: EVERY requested deviceId gets a row. `status: null` means "this camera
30109
+ * could not be read"; `status.monitors: []` means "read, and it has none".
30110
+ */
30111
+ var SceneMonitorStatusForDeviceSchema = object({
30112
+ deviceId: number(),
30113
+ status: SceneMonitorStatusSchema.nullable()
30114
+ });
30115
+ DeviceType.Camera, method(object({ deviceId: number() }), SceneMonitorStatusSchema), method(object({ deviceIds: array(number()).min(1).max(200) }), array(SceneMonitorStatusForDeviceSchema).readonly()), method(object({
29953
30116
  deviceId: number(),
29954
30117
  label: string(),
29955
30118
  roi: MaskRectShapeSchema,
@@ -31273,6 +31436,27 @@ var CameraOccupancySnapshotSchema = object({
31273
31436
  stationaryObjects: array(StationaryObjectSchema).readonly().optional()
31274
31437
  });
31275
31438
  /**
31439
+ * One camera's row in a `getCurrentSnapshotBatch` answer.
31440
+ *
31441
+ * THREE outcomes, and the single-camera method could only express two of them
31442
+ * because `snapshot: null` was already spoken for:
31443
+ *
31444
+ * - `read: 'read'`, `snapshot` present — the live occupancy reading.
31445
+ * - `read: 'read'`, `snapshot: null` — read, and this camera has no reading
31446
+ * yet: no frame since boot, and no parked-object registry to hydrate from.
31447
+ * - `read: 'unreadable'` — the owner could not answer for this
31448
+ * camera. `snapshot` is null, and it does NOT mean "nothing parked here".
31449
+ *
31450
+ * Collapsing the last two is the failure this field exists to prevent: a
31451
+ * hydration that threw would otherwise render as an empty Stationary section,
31452
+ * which is a definite claim about a camera nobody could read.
31453
+ */
31454
+ var CameraOccupancySnapshotForDeviceSchema = object({
31455
+ deviceId: number(),
31456
+ read: _enum(["read", "unreadable"]),
31457
+ snapshot: CameraOccupancySnapshotSchema.nullable()
31458
+ });
31459
+ /**
31276
31460
  * Time-series resolution. The history methods return one bucket per
31277
31461
  * step over the requested range. Smaller resolutions cost more
31278
31462
  * memory + bandwidth; bound to discrete steps so caller cannot ask
@@ -31296,7 +31480,7 @@ var HistoryPointSchema = object({
31296
31480
  /** Object count averaged over the bucket (rounded to nearest integer). */
31297
31481
  count: number().int().nonnegative()
31298
31482
  });
31299
- DeviceType.Camera, method(object({ deviceId: number() }), CameraOccupancySnapshotSchema.nullable()), method(object({
31483
+ DeviceType.Camera, method(object({ deviceId: number() }), CameraOccupancySnapshotSchema.nullable()), method(object({ deviceIds: array(number()).min(1).max(200) }), array(CameraOccupancySnapshotForDeviceSchema).readonly()), method(object({
31300
31484
  deviceId: number(),
31301
31485
  zoneId: string(),
31302
31486
  className: string().optional()
@@ -34760,6 +34944,12 @@ Object.freeze({
34760
34944
  addonId: null,
34761
34945
  access: "view"
34762
34946
  },
34947
+ "pipelineAnalytics.getKeyEventsBatch": {
34948
+ capName: "pipeline-analytics",
34949
+ capScope: "device",
34950
+ addonId: null,
34951
+ access: "view"
34952
+ },
34763
34953
  "pipelineAnalytics.getMotionEvents": {
34764
34954
  capName: "pipeline-analytics",
34765
34955
  capScope: "device",
@@ -35936,6 +36126,12 @@ Object.freeze({
35936
36126
  addonId: null,
35937
36127
  access: "view"
35938
36128
  },
36129
+ "recording.reconcileLedgerAgainstDisk": {
36130
+ capName: "recording",
36131
+ capScope: "system",
36132
+ addonId: null,
36133
+ access: "create"
36134
+ },
35939
36135
  "recording.refreshStorageLocationsForMigration": {
35940
36136
  capName: "recording",
35941
36137
  capScope: "system",
@@ -36062,6 +36258,12 @@ Object.freeze({
36062
36258
  addonId: null,
36063
36259
  access: "view"
36064
36260
  },
36261
+ "sceneMonitor.listScenesBatch": {
36262
+ capName: "scene-monitor",
36263
+ capScope: "device",
36264
+ addonId: null,
36265
+ access: "view"
36266
+ },
36065
36267
  "sceneMonitor.recheckNow": {
36066
36268
  capName: "scene-monitor",
36067
36269
  capScope: "device",
@@ -37418,6 +37620,12 @@ Object.freeze({
37418
37620
  addonId: null,
37419
37621
  access: "view"
37420
37622
  },
37623
+ "zoneAnalytics.getCurrentSnapshotBatch": {
37624
+ capName: "zone-analytics",
37625
+ capScope: "device",
37626
+ addonId: null,
37627
+ access: "view"
37628
+ },
37421
37629
  "zoneAnalytics.getUnzonedHistory": {
37422
37630
  capName: "zone-analytics",
37423
37631
  capScope: "device",
@@ -38422,6 +38630,11 @@ Object.freeze({
38422
38630
  form: "single",
38423
38631
  optional: false
38424
38632
  }],
38633
+ "pipelineAnalytics.getKeyEventsBatch": [{
38634
+ name: "deviceIds",
38635
+ form: "array",
38636
+ optional: false
38637
+ }],
38425
38638
  "pipelineAnalytics.getMotionEvents": [{
38426
38639
  name: "deviceId",
38427
38640
  form: "single",
@@ -38862,6 +39075,11 @@ Object.freeze({
38862
39075
  form: "single",
38863
39076
  optional: false
38864
39077
  }],
39078
+ "recording.reconcileLedgerAgainstDisk": [{
39079
+ name: "deviceId",
39080
+ form: "single",
39081
+ optional: true
39082
+ }],
38865
39083
  "recording.relocateFootage": [{
38866
39084
  name: "deviceId",
38867
39085
  form: "single",
@@ -38927,6 +39145,11 @@ Object.freeze({
38927
39145
  form: "single",
38928
39146
  optional: false
38929
39147
  }],
39148
+ "sceneMonitor.listScenesBatch": [{
39149
+ name: "deviceIds",
39150
+ form: "array",
39151
+ optional: false
39152
+ }],
38930
39153
  "sceneMonitor.recheckNow": [{
38931
39154
  name: "deviceId",
38932
39155
  form: "single",
@@ -39188,6 +39411,11 @@ Object.freeze({
39188
39411
  form: "single",
39189
39412
  optional: false
39190
39413
  }],
39414
+ "zoneAnalytics.getCurrentSnapshotBatch": [{
39415
+ name: "deviceIds",
39416
+ form: "array",
39417
+ optional: false
39418
+ }],
39191
39419
  "zoneAnalytics.getUnzonedHistory": [{
39192
39420
  name: "deviceId",
39193
39421
  form: "single",