@camstack/addon-pipeline 1.2.161 → 1.2.162

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 (37) 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-De1p9-ha.js → dist-15qysRyR.js} +146 -6
  6. package/dist/{dist-DJuym0uY.mjs → dist-Bz00AHCy.mjs} +146 -6
  7. package/dist/{lazy-sharp-BNjzhQI_.js → lazy-sharp-CusvUEdy.js} +1 -1
  8. package/dist/{local-frame-registry-fV6AMeXw.mjs → local-frame-registry-B7cPLEW-.mjs} +1 -1
  9. package/dist/{local-frame-registry-8Ph7u04x.js → local-frame-registry-BnimNHwT.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-BCv87MWN.js → node-BdjJPTLk.js} +1 -1
  13. package/dist/{node-CoP2EuNP.mjs → node-CpW6WY9n.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-F9dxEjGr.mjs → process-memory-BosDzc_U.mjs} +1 -1
  17. package/dist/{process-memory-DT9anN3q.js → process-memory-CJHwbMAy.js} +1 -1
  18. package/dist/recorder/index.js +126 -39
  19. package/dist/recorder/index.mjs +126 -39
  20. package/dist/{segment-demux-js-DJUr6Jsi.mjs → segment-demux-js-CmaBsM0K.mjs} +1 -1
  21. package/dist/{segment-demux-js-BF9CwpQh.js → segment-demux-js-DoH8TCnt.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-C5Uex5Kp.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_stream_broker_widgets-sfos9TiN.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-CqO3zOjL.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-CWtPG7OH.mjs → _virtual_mf___mfe_internal__addon_stream_broker_widgets__loadShare___mf_0_camstack_mf_1_ui_mf_2_library__loadShare__.js-B6HSEhpx.mjs} +1 -1
  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-BlI9lWFs.mjs → hostInit-hk0XBAnv.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-BCrnGbX_.mjs → worker-protocol-B2RCeDwS.mjs} +1 -1
  35. package/dist/{worker-protocol-D4sajaZG.js → worker-protocol-DczDySjo.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-Blnh70uP.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-De1p9-ha.js");
6
- const require_process_memory = require("../process-memory-DT9anN3q.js");
5
+ const require_dist = require("../dist-15qysRyR.js");
6
+ const require_process_memory = require("../process-memory-CJHwbMAy.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-DJuym0uY.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-F9dxEjGr.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-Bz00AHCy.mjs";
3
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BosDzc_U.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-De1p9-ha.js");
6
- const require_node = require("../node-BCv87MWN.js");
7
- const require_local_frame_registry = require("../local-frame-registry-8Ph7u04x.js");
8
- const require_lazy_sharp = require("../lazy-sharp-BNjzhQI_.js");
5
+ const require_dist = require("../dist-15qysRyR.js");
6
+ const require_node = require("../node-BdjJPTLk.js");
7
+ const require_local_frame_registry = require("../local-frame-registry-BnimNHwT.js");
8
+ const require_lazy_sharp = require("../lazy-sharp-CusvUEdy.js");
9
9
  const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DaUBcb13.js");
10
- const require_process_memory = require("../process-memory-DT9anN3q.js");
10
+ const require_process_memory = require("../process-memory-CJHwbMAy.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-DJuym0uY.mjs";
3
- import { a as readProcessCost } from "../node-CoP2EuNP.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-fV6AMeXw.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-Bz00AHCy.mjs";
3
+ import { a as readProcessCost } from "../node-CpW6WY9n.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-B7cPLEW-.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-F9dxEjGr.mjs";
7
+ import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-BosDzc_U.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";
@@ -21346,6 +21346,34 @@ var KeyEventsForDeviceSchema = object({
21346
21346
  deviceId: number(),
21347
21347
  events: array(KeyEventSchema).readonly()
21348
21348
  });
21349
+ /** One non-empty bucket of the timeline histogram. */
21350
+ var EventDensityBucketSchema = object({
21351
+ bucketStart: number(),
21352
+ motion: number().int(),
21353
+ object: number().int(),
21354
+ audio: number().int()
21355
+ });
21356
+ /**
21357
+ * One camera's row in a `getEventDensityBatch` answer.
21358
+ *
21359
+ * TWO facts, and the timeline draws them differently:
21360
+ *
21361
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
21362
+ * claim: read, and nothing happened in the window.
21363
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
21364
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
21365
+ * not quiet.
21366
+ *
21367
+ * Fanned out per camera the difference was free — one query rejected while the
21368
+ * others resolved — and collapsing to a batch is the exact moment it is lost
21369
+ * silently. Every requested id gets a row: a caller that asked for twelve and
21370
+ * got eleven cannot tell which one is missing, or that any is.
21371
+ */
21372
+ var EventDensityForDeviceSchema = object({
21373
+ deviceId: number(),
21374
+ read: _enum(["read", "unreadable"]),
21375
+ buckets: array(EventDensityBucketSchema).readonly()
21376
+ });
21349
21377
  object({
21350
21378
  trackId: string(),
21351
21379
  className: string(),
@@ -21656,12 +21684,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21656
21684
  since: number(),
21657
21685
  until: number(),
21658
21686
  bucketMs: number().int().positive()
21659
- }), array(object({
21660
- bucketStart: number(),
21661
- motion: number().int(),
21662
- object: number().int(),
21663
- audio: number().int()
21664
- })).readonly()), method(object({
21687
+ }), array(EventDensityBucketSchema).readonly()), method(object({
21688
+ deviceIds: array(number()).min(1).max(200),
21689
+ since: number(),
21690
+ until: number(),
21691
+ bucketMs: number().int().positive()
21692
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
21665
21693
  deviceId: number(),
21666
21694
  cutoffMs: number()
21667
21695
  }), object({
@@ -29282,6 +29310,39 @@ var RecordingDaysSchema = object({
29282
29310
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29283
29311
  days: array(number())
29284
29312
  });
29313
+ /**
29314
+ * One camera's row in a `getAvailabilityBatch` answer.
29315
+ *
29316
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
29317
+ * batch collapses the transport, not the work — plus the one thing the singular
29318
+ * method never had to say:
29319
+ *
29320
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
29321
+ * no footage in the window", which is a real claim.
29322
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
29323
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
29324
+ * that emptiness means NOTHING.
29325
+ *
29326
+ * A timeline that renders the second as the first tells an operator there is no
29327
+ * footage when the truth is that nobody looked.
29328
+ */
29329
+ var RecordingAvailabilityForDeviceSchema = object({
29330
+ deviceId: number(),
29331
+ read: _enum(["read", "unreadable"]),
29332
+ ranges: array(RecordingRangeSchema).readonly()
29333
+ });
29334
+ /**
29335
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
29336
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
29337
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
29338
+ * the date-picker's day dots must not spell them the same.
29339
+ */
29340
+ var RecordingDaysForDeviceSchema = object({
29341
+ deviceId: number(),
29342
+ read: _enum(["read", "unreadable"]),
29343
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29344
+ days: array(number()).readonly()
29345
+ });
29285
29346
  var RecordingManifestSchema = object({
29286
29347
  deviceId: number(),
29287
29348
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -29527,6 +29588,32 @@ var recordingCapability = {
29527
29588
  kind: "query",
29528
29589
  auth: "protected"
29529
29590
  }),
29591
+ /**
29592
+ * `getAvailability` for a SET of cameras, in one round trip.
29593
+ *
29594
+ * A multi-camera timeline re-asks availability for every camera in the grid
29595
+ * on every day change; fanned out that is one request per camera for N
29596
+ * independent calendar walks. The per-camera work is IDENTICAL (the same
29597
+ * `availabilityProfileFor` + `rangesIn`, run concurrently inside the
29598
+ * recorder) — only the transport collapses.
29599
+ *
29600
+ * `protected` for the same reason the singular method is: every id in
29601
+ * `deviceIds` is a device reference, so the F1 #3 gate refuses any camera
29602
+ * outside the caller's scope — one id out of scope refuses the CALL, it
29603
+ * does not quietly drop a row.
29604
+ *
29605
+ * Every requested id gets a row, marked — see
29606
+ * {@link RecordingAvailabilityForDeviceSchema}. `deviceIds` is capped at
29607
+ * {@link RECORDING_TIMELINE_BATCH_MAX} and an over-cap ask is refused.
29608
+ */
29609
+ getAvailabilityBatch: method(object({
29610
+ deviceIds: array(number()).min(1).max(200),
29611
+ fromMs: number(),
29612
+ toMs: number()
29613
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
29614
+ kind: "query",
29615
+ auth: "protected"
29616
+ }),
29530
29617
  /** Which calendar days in [fromMs,toMs) have ≥1 recorded segment, bucketed by
29531
29618
  * the client's local day (`tzOffsetMinutes` = minutes to add to UTC). Drives
29532
29619
  * the theater date-picker's day dots. */
@@ -29539,6 +29626,26 @@ var recordingCapability = {
29539
29626
  kind: "query",
29540
29627
  auth: "protected"
29541
29628
  }),
29629
+ /**
29630
+ * `getDaysWithRecordings` for a SET of cameras, in one round trip.
29631
+ *
29632
+ * The cheapest question in the product, asked once per camera per month
29633
+ * change. One directory read per day per camera at the owner, unchanged;
29634
+ * what collapses is the N requests it took to ask.
29635
+ *
29636
+ * Every requested id gets a row, marked — see
29637
+ * {@link RecordingDaysForDeviceSchema}. `deviceIds` is capped at
29638
+ * {@link RECORDING_TIMELINE_BATCH_MAX} and an over-cap ask is refused.
29639
+ */
29640
+ getDaysWithRecordingsBatch: method(object({
29641
+ deviceIds: array(number()).min(1).max(200),
29642
+ fromMs: number(),
29643
+ toMs: number(),
29644
+ tzOffsetMinutes: number()
29645
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
29646
+ kind: "query",
29647
+ auth: "protected"
29648
+ }),
29542
29649
  getPlaybackManifest: method(object({
29543
29650
  deviceId: number(),
29544
29651
  fromMs: number(),
@@ -35074,6 +35181,12 @@ Object.freeze({
35074
35181
  addonId: null,
35075
35182
  access: "view"
35076
35183
  },
35184
+ "pipelineAnalytics.getEventDensityBatch": {
35185
+ capName: "pipeline-analytics",
35186
+ capScope: "device",
35187
+ addonId: null,
35188
+ access: "view"
35189
+ },
35077
35190
  "pipelineAnalytics.getEventMedia": {
35078
35191
  capName: "pipeline-analytics",
35079
35192
  capScope: "device",
@@ -36196,12 +36309,24 @@ Object.freeze({
36196
36309
  addonId: null,
36197
36310
  access: "view"
36198
36311
  },
36312
+ "recording.getAvailabilityBatch": {
36313
+ capName: "recording",
36314
+ capScope: "system",
36315
+ addonId: null,
36316
+ access: "view"
36317
+ },
36199
36318
  "recording.getDaysWithRecordings": {
36200
36319
  capName: "recording",
36201
36320
  capScope: "system",
36202
36321
  addonId: null,
36203
36322
  access: "view"
36204
36323
  },
36324
+ "recording.getDaysWithRecordingsBatch": {
36325
+ capName: "recording",
36326
+ capScope: "system",
36327
+ addonId: null,
36328
+ access: "view"
36329
+ },
36205
36330
  "recording.getDeviceConfig": {
36206
36331
  capName: "recording",
36207
36332
  capScope: "system",
@@ -38806,6 +38931,11 @@ Object.freeze({
38806
38931
  form: "single",
38807
38932
  optional: false
38808
38933
  }],
38934
+ "pipelineAnalytics.getEventDensityBatch": [{
38935
+ name: "deviceIds",
38936
+ form: "array",
38937
+ optional: false
38938
+ }],
38809
38939
  "pipelineAnalytics.getEventMedia": [{
38810
38940
  name: "deviceId",
38811
38941
  form: "single",
@@ -39221,11 +39351,21 @@ Object.freeze({
39221
39351
  form: "single",
39222
39352
  optional: false
39223
39353
  }],
39354
+ "recording.getAvailabilityBatch": [{
39355
+ name: "deviceIds",
39356
+ form: "array",
39357
+ optional: false
39358
+ }],
39224
39359
  "recording.getDaysWithRecordings": [{
39225
39360
  name: "deviceId",
39226
39361
  form: "single",
39227
39362
  optional: false
39228
39363
  }],
39364
+ "recording.getDaysWithRecordingsBatch": [{
39365
+ name: "deviceIds",
39366
+ form: "array",
39367
+ optional: false
39368
+ }],
39229
39369
  "recording.getDeviceConfig": [{
39230
39370
  name: "deviceId",
39231
39371
  form: "single",
@@ -21323,6 +21323,34 @@ var KeyEventsForDeviceSchema = object({
21323
21323
  deviceId: number(),
21324
21324
  events: array(KeyEventSchema).readonly()
21325
21325
  });
21326
+ /** One non-empty bucket of the timeline histogram. */
21327
+ var EventDensityBucketSchema = object({
21328
+ bucketStart: number(),
21329
+ motion: number().int(),
21330
+ object: number().int(),
21331
+ audio: number().int()
21332
+ });
21333
+ /**
21334
+ * One camera's row in a `getEventDensityBatch` answer.
21335
+ *
21336
+ * TWO facts, and the timeline draws them differently:
21337
+ *
21338
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
21339
+ * claim: read, and nothing happened in the window.
21340
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
21341
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
21342
+ * not quiet.
21343
+ *
21344
+ * Fanned out per camera the difference was free — one query rejected while the
21345
+ * others resolved — and collapsing to a batch is the exact moment it is lost
21346
+ * silently. Every requested id gets a row: a caller that asked for twelve and
21347
+ * got eleven cannot tell which one is missing, or that any is.
21348
+ */
21349
+ var EventDensityForDeviceSchema = object({
21350
+ deviceId: number(),
21351
+ read: _enum(["read", "unreadable"]),
21352
+ buckets: array(EventDensityBucketSchema).readonly()
21353
+ });
21326
21354
  object({
21327
21355
  trackId: string(),
21328
21356
  className: string(),
@@ -21633,12 +21661,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21633
21661
  since: number(),
21634
21662
  until: number(),
21635
21663
  bucketMs: number().int().positive()
21636
- }), array(object({
21637
- bucketStart: number(),
21638
- motion: number().int(),
21639
- object: number().int(),
21640
- audio: number().int()
21641
- })).readonly()), method(object({
21664
+ }), array(EventDensityBucketSchema).readonly()), method(object({
21665
+ deviceIds: array(number()).min(1).max(200),
21666
+ since: number(),
21667
+ until: number(),
21668
+ bucketMs: number().int().positive()
21669
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
21642
21670
  deviceId: number(),
21643
21671
  cutoffMs: number()
21644
21672
  }), object({
@@ -29259,6 +29287,39 @@ var RecordingDaysSchema = object({
29259
29287
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29260
29288
  days: array(number())
29261
29289
  });
29290
+ /**
29291
+ * One camera's row in a `getAvailabilityBatch` answer.
29292
+ *
29293
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
29294
+ * batch collapses the transport, not the work — plus the one thing the singular
29295
+ * method never had to say:
29296
+ *
29297
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
29298
+ * no footage in the window", which is a real claim.
29299
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
29300
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
29301
+ * that emptiness means NOTHING.
29302
+ *
29303
+ * A timeline that renders the second as the first tells an operator there is no
29304
+ * footage when the truth is that nobody looked.
29305
+ */
29306
+ var RecordingAvailabilityForDeviceSchema = object({
29307
+ deviceId: number(),
29308
+ read: _enum(["read", "unreadable"]),
29309
+ ranges: array(RecordingRangeSchema).readonly()
29310
+ });
29311
+ /**
29312
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
29313
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
29314
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
29315
+ * the date-picker's day dots must not spell them the same.
29316
+ */
29317
+ var RecordingDaysForDeviceSchema = object({
29318
+ deviceId: number(),
29319
+ read: _enum(["read", "unreadable"]),
29320
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29321
+ days: array(number()).readonly()
29322
+ });
29262
29323
  var RecordingManifestSchema = object({
29263
29324
  deviceId: number(),
29264
29325
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -29504,6 +29565,32 @@ var recordingCapability = {
29504
29565
  kind: "query",
29505
29566
  auth: "protected"
29506
29567
  }),
29568
+ /**
29569
+ * `getAvailability` for a SET of cameras, in one round trip.
29570
+ *
29571
+ * A multi-camera timeline re-asks availability for every camera in the grid
29572
+ * on every day change; fanned out that is one request per camera for N
29573
+ * independent calendar walks. The per-camera work is IDENTICAL (the same
29574
+ * `availabilityProfileFor` + `rangesIn`, run concurrently inside the
29575
+ * recorder) — only the transport collapses.
29576
+ *
29577
+ * `protected` for the same reason the singular method is: every id in
29578
+ * `deviceIds` is a device reference, so the F1 #3 gate refuses any camera
29579
+ * outside the caller's scope — one id out of scope refuses the CALL, it
29580
+ * does not quietly drop a row.
29581
+ *
29582
+ * Every requested id gets a row, marked — see
29583
+ * {@link RecordingAvailabilityForDeviceSchema}. `deviceIds` is capped at
29584
+ * {@link RECORDING_TIMELINE_BATCH_MAX} and an over-cap ask is refused.
29585
+ */
29586
+ getAvailabilityBatch: method(object({
29587
+ deviceIds: array(number()).min(1).max(200),
29588
+ fromMs: number(),
29589
+ toMs: number()
29590
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
29591
+ kind: "query",
29592
+ auth: "protected"
29593
+ }),
29507
29594
  /** Which calendar days in [fromMs,toMs) have ≥1 recorded segment, bucketed by
29508
29595
  * the client's local day (`tzOffsetMinutes` = minutes to add to UTC). Drives
29509
29596
  * the theater date-picker's day dots. */
@@ -29516,6 +29603,26 @@ var recordingCapability = {
29516
29603
  kind: "query",
29517
29604
  auth: "protected"
29518
29605
  }),
29606
+ /**
29607
+ * `getDaysWithRecordings` for a SET of cameras, in one round trip.
29608
+ *
29609
+ * The cheapest question in the product, asked once per camera per month
29610
+ * change. One directory read per day per camera at the owner, unchanged;
29611
+ * what collapses is the N requests it took to ask.
29612
+ *
29613
+ * Every requested id gets a row, marked — see
29614
+ * {@link RecordingDaysForDeviceSchema}. `deviceIds` is capped at
29615
+ * {@link RECORDING_TIMELINE_BATCH_MAX} and an over-cap ask is refused.
29616
+ */
29617
+ getDaysWithRecordingsBatch: method(object({
29618
+ deviceIds: array(number()).min(1).max(200),
29619
+ fromMs: number(),
29620
+ toMs: number(),
29621
+ tzOffsetMinutes: number()
29622
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
29623
+ kind: "query",
29624
+ auth: "protected"
29625
+ }),
29519
29626
  getPlaybackManifest: method(object({
29520
29627
  deviceId: number(),
29521
29628
  fromMs: number(),
@@ -35051,6 +35158,12 @@ Object.freeze({
35051
35158
  addonId: null,
35052
35159
  access: "view"
35053
35160
  },
35161
+ "pipelineAnalytics.getEventDensityBatch": {
35162
+ capName: "pipeline-analytics",
35163
+ capScope: "device",
35164
+ addonId: null,
35165
+ access: "view"
35166
+ },
35054
35167
  "pipelineAnalytics.getEventMedia": {
35055
35168
  capName: "pipeline-analytics",
35056
35169
  capScope: "device",
@@ -36173,12 +36286,24 @@ Object.freeze({
36173
36286
  addonId: null,
36174
36287
  access: "view"
36175
36288
  },
36289
+ "recording.getAvailabilityBatch": {
36290
+ capName: "recording",
36291
+ capScope: "system",
36292
+ addonId: null,
36293
+ access: "view"
36294
+ },
36176
36295
  "recording.getDaysWithRecordings": {
36177
36296
  capName: "recording",
36178
36297
  capScope: "system",
36179
36298
  addonId: null,
36180
36299
  access: "view"
36181
36300
  },
36301
+ "recording.getDaysWithRecordingsBatch": {
36302
+ capName: "recording",
36303
+ capScope: "system",
36304
+ addonId: null,
36305
+ access: "view"
36306
+ },
36182
36307
  "recording.getDeviceConfig": {
36183
36308
  capName: "recording",
36184
36309
  capScope: "system",
@@ -38783,6 +38908,11 @@ Object.freeze({
38783
38908
  form: "single",
38784
38909
  optional: false
38785
38910
  }],
38911
+ "pipelineAnalytics.getEventDensityBatch": [{
38912
+ name: "deviceIds",
38913
+ form: "array",
38914
+ optional: false
38915
+ }],
38786
38916
  "pipelineAnalytics.getEventMedia": [{
38787
38917
  name: "deviceId",
38788
38918
  form: "single",
@@ -39198,11 +39328,21 @@ Object.freeze({
39198
39328
  form: "single",
39199
39329
  optional: false
39200
39330
  }],
39331
+ "recording.getAvailabilityBatch": [{
39332
+ name: "deviceIds",
39333
+ form: "array",
39334
+ optional: false
39335
+ }],
39201
39336
  "recording.getDaysWithRecordings": [{
39202
39337
  name: "deviceId",
39203
39338
  form: "single",
39204
39339
  optional: false
39205
39340
  }],
39341
+ "recording.getDaysWithRecordingsBatch": [{
39342
+ name: "deviceIds",
39343
+ form: "array",
39344
+ optional: false
39345
+ }],
39206
39346
  "recording.getDeviceConfig": [{
39207
39347
  name: "deviceId",
39208
39348
  form: "single",
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-De1p9-ha.js");
1
+ const require_dist = require("./dist-15qysRyR.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-DJuym0uY.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-Bz00AHCy.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-De1p9-ha.js");
1
+ const require_dist = require("./dist-15qysRyR.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-De1p9-ha.js");
6
- const require_lazy_sharp = require("../lazy-sharp-BNjzhQI_.js");
5
+ const require_dist = require("../dist-15qysRyR.js");
6
+ const require_lazy_sharp = require("../lazy-sharp-CusvUEdy.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-DJuym0uY.mjs";
1
+ import { It as hydrateSchema, Pt as DeviceType, Y as evaluateZoneRules, it as motionDetectionCapability, jt as BaseAddon } from "../dist-Bz00AHCy.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
- const require_dist = require("./dist-De1p9-ha.js");
1
+ const require_dist = require("./dist-15qysRyR.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);
@@ -1,4 +1,4 @@
1
- import { Dt as buildFfmpegArgs, Et as Fmp4BoxSplitter, kt as isSoftwareDecode, wt as errMsg } from "./dist-DJuym0uY.mjs";
1
+ import { Dt as buildFfmpegArgs, Et as Fmp4BoxSplitter, kt as isSoftwareDecode, wt as errMsg } from "./dist-Bz00AHCy.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import "node:fs";
4
4
  import "node:path";
@@ -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-De1p9-ha.js");
6
- const require_node = require("../node-BCv87MWN.js");
7
- const require_local_frame_registry = require("../local-frame-registry-8Ph7u04x.js");
8
- const require_worker_protocol = require("../worker-protocol-D4sajaZG.js");
5
+ const require_dist = require("../dist-15qysRyR.js");
6
+ const require_node = require("../node-BdjJPTLk.js");
7
+ const require_local_frame_registry = require("../local-frame-registry-BnimNHwT.js");
8
+ const require_worker_protocol = require("../worker-protocol-DczDySjo.js");
9
9
  const require_hub_hostname = require("../hub-hostname-DAJXlOgV.js");
10
- const require_lazy_sharp = require("../lazy-sharp-BNjzhQI_.js");
10
+ const require_lazy_sharp = require("../lazy-sharp-CusvUEdy.js");
11
11
  const require_restream_intent = require("../restream-intent-Cv9x3jmu.js");
12
12
  const require_event_loop_stall_monitor = require("../event-loop-stall-monitor-DaUBcb13.js");
13
13
  const require_remote_restream = require("../remote-restream-CO36Sr30.js");
@@ -1,7 +1,7 @@
1
- import { B as defineCustomActions, Bt as nodePin, Ft as createEvent, Gt as _enum, H as deriveDetailCropRect, Kt as array, L as customAction, Qt as object, X as failureContributionCapability, Xt as literal, Yt as lazy, Zt as number, _ as FailureCounters, en as string, et as loadContributionCapability, ft as pipelineRunnerCapability, jt as BaseAddon, lt as pickDetailCropConvention, m as DEVICE_BACKEND_TO_FORMAT, nn as EventCategory, p as DEFAULT_NATIVE_LEASE_SETTINGS, qt as boolean, u as DEFAULT_DETAIL_CROP_CONVENTION, ut as pickNativeLeaseOverride, wt as errMsg } from "../dist-DJuym0uY.mjs";
2
- import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-CoP2EuNP.mjs";
3
- import { c as getStepDefinition, n as resolveFrameViewGeometry, t as localFrameRegistry } from "../local-frame-registry-fV6AMeXw.mjs";
4
- import { a as nativeLeaseSettingEnv, t as isWorkerReply } from "../worker-protocol-BCrnGbX_.mjs";
1
+ import { B as defineCustomActions, Bt as nodePin, Ft as createEvent, Gt as _enum, H as deriveDetailCropRect, Kt as array, L as customAction, Qt as object, X as failureContributionCapability, Xt as literal, Yt as lazy, Zt as number, _ as FailureCounters, en as string, et as loadContributionCapability, ft as pipelineRunnerCapability, jt as BaseAddon, lt as pickDetailCropConvention, m as DEVICE_BACKEND_TO_FORMAT, nn as EventCategory, p as DEFAULT_NATIVE_LEASE_SETTINGS, qt as boolean, u as DEFAULT_DETAIL_CROP_CONVENTION, ut as pickNativeLeaseOverride, wt as errMsg } from "../dist-Bz00AHCy.mjs";
2
+ import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-CpW6WY9n.mjs";
3
+ import { c as getStepDefinition, n as resolveFrameViewGeometry, t as localFrameRegistry } from "../local-frame-registry-B7cPLEW-.mjs";
4
+ import { a as nativeLeaseSettingEnv, t as isWorkerReply } from "../worker-protocol-B2RCeDwS.mjs";
5
5
  import { t as resolveHubHostname } from "../hub-hostname-cCknRYKj.mjs";
6
6
  import { t as getSharp } from "../lazy-sharp-DXsqwpph.mjs";
7
7
  import { n as withDetectionIntent } from "../restream-intent-B4BXZra7.mjs";
@@ -1,4 +1,4 @@
1
- import { ot as parseProcStatus } from "./dist-DJuym0uY.mjs";
1
+ import { ot as parseProcStatus } from "./dist-Bz00AHCy.mjs";
2
2
  import * as fs from "node:fs";
3
3
  import { execFile } from "node:child_process";
4
4
  //#region src/shared/node-topology-platform.ts
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-De1p9-ha.js");
1
+ const require_dist = require("./dist-15qysRyR.js");
2
2
  let node_fs = require("node:fs");
3
3
  node_fs = require_dist.__toESM(node_fs);
4
4
  let node_child_process = require("node:child_process");