@camstack/addon-pipeline 1.2.160 → 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-5VmTxa8x.js → dist-15qysRyR.js} +148 -6
  6. package/dist/{dist-C8zVKhzA.mjs → dist-Bz00AHCy.mjs} +148 -6
  7. package/dist/{lazy-sharp-C89jIlwj.js → lazy-sharp-CusvUEdy.js} +1 -1
  8. package/dist/{local-frame-registry-Bh-egEcl.mjs → local-frame-registry-B7cPLEW-.mjs} +1 -1
  9. package/dist/{local-frame-registry-BNMgZ5uA.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-FsbZDqyh.js → node-BdjJPTLk.js} +1 -1
  13. package/dist/{node-G9AiO_JJ.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-Bbvc_vQS.mjs → process-memory-BosDzc_U.mjs} +1 -1
  17. package/dist/{process-memory-CMC_42XT.js → process-memory-CJHwbMAy.js} +1 -1
  18. package/dist/recorder/index.js +132 -40
  19. package/dist/recorder/index.mjs +132 -40
  20. package/dist/{segment-demux-js-Cw--C40J.mjs → segment-demux-js-CmaBsM0K.mjs} +1 -1
  21. package/dist/{segment-demux-js-iEt5OWTd.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-l7NtBWCj.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-C2zs9368.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-CA_SVsYj.mjs → worker-protocol-B2RCeDwS.mjs} +1 -1
  35. package/dist/{worker-protocol-CB8pNFkV.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-5VmTxa8x.js");
6
- const require_process_memory = require("../process-memory-CMC_42XT.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-C8zVKhzA.mjs";
3
- import { n as pickNodePlatformArch, t as readProcessMemory } from "../process-memory-Bbvc_vQS.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-5VmTxa8x.js");
6
- const require_node = require("../node-FsbZDqyh.js");
7
- const require_local_frame_registry = require("../local-frame-registry-BNMgZ5uA.js");
8
- const require_lazy_sharp = require("../lazy-sharp-C89jIlwj.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-CMC_42XT.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-C8zVKhzA.mjs";
3
- import { a as readProcessCost } from "../node-G9AiO_JJ.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-Bh-egEcl.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-Bbvc_vQS.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";
@@ -17886,6 +17886,8 @@ var NcSystemEventKindSchema = _enum([
17886
17886
  "device-offline",
17887
17887
  "device-disabled",
17888
17888
  "device-enabled",
17889
+ "device-battery-low",
17890
+ "device-battery-normal",
17889
17891
  "stream-online",
17890
17892
  "stream-offline",
17891
17893
  "node-online",
@@ -21344,6 +21346,34 @@ var KeyEventsForDeviceSchema = object({
21344
21346
  deviceId: number(),
21345
21347
  events: array(KeyEventSchema).readonly()
21346
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
+ });
21347
21377
  object({
21348
21378
  trackId: string(),
21349
21379
  className: string(),
@@ -21654,12 +21684,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21654
21684
  since: number(),
21655
21685
  until: number(),
21656
21686
  bucketMs: number().int().positive()
21657
- }), array(object({
21658
- bucketStart: number(),
21659
- motion: number().int(),
21660
- object: number().int(),
21661
- audio: number().int()
21662
- })).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({
21663
21693
  deviceId: number(),
21664
21694
  cutoffMs: number()
21665
21695
  }), object({
@@ -29280,6 +29310,39 @@ var RecordingDaysSchema = object({
29280
29310
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29281
29311
  days: array(number())
29282
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
+ });
29283
29346
  var RecordingManifestSchema = object({
29284
29347
  deviceId: number(),
29285
29348
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -29525,6 +29588,32 @@ var recordingCapability = {
29525
29588
  kind: "query",
29526
29589
  auth: "protected"
29527
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
+ }),
29528
29617
  /** Which calendar days in [fromMs,toMs) have ≥1 recorded segment, bucketed by
29529
29618
  * the client's local day (`tzOffsetMinutes` = minutes to add to UTC). Drives
29530
29619
  * the theater date-picker's day dots. */
@@ -29537,6 +29626,26 @@ var recordingCapability = {
29537
29626
  kind: "query",
29538
29627
  auth: "protected"
29539
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
+ }),
29540
29649
  getPlaybackManifest: method(object({
29541
29650
  deviceId: number(),
29542
29651
  fromMs: number(),
@@ -35072,6 +35181,12 @@ Object.freeze({
35072
35181
  addonId: null,
35073
35182
  access: "view"
35074
35183
  },
35184
+ "pipelineAnalytics.getEventDensityBatch": {
35185
+ capName: "pipeline-analytics",
35186
+ capScope: "device",
35187
+ addonId: null,
35188
+ access: "view"
35189
+ },
35075
35190
  "pipelineAnalytics.getEventMedia": {
35076
35191
  capName: "pipeline-analytics",
35077
35192
  capScope: "device",
@@ -36194,12 +36309,24 @@ Object.freeze({
36194
36309
  addonId: null,
36195
36310
  access: "view"
36196
36311
  },
36312
+ "recording.getAvailabilityBatch": {
36313
+ capName: "recording",
36314
+ capScope: "system",
36315
+ addonId: null,
36316
+ access: "view"
36317
+ },
36197
36318
  "recording.getDaysWithRecordings": {
36198
36319
  capName: "recording",
36199
36320
  capScope: "system",
36200
36321
  addonId: null,
36201
36322
  access: "view"
36202
36323
  },
36324
+ "recording.getDaysWithRecordingsBatch": {
36325
+ capName: "recording",
36326
+ capScope: "system",
36327
+ addonId: null,
36328
+ access: "view"
36329
+ },
36203
36330
  "recording.getDeviceConfig": {
36204
36331
  capName: "recording",
36205
36332
  capScope: "system",
@@ -38804,6 +38931,11 @@ Object.freeze({
38804
38931
  form: "single",
38805
38932
  optional: false
38806
38933
  }],
38934
+ "pipelineAnalytics.getEventDensityBatch": [{
38935
+ name: "deviceIds",
38936
+ form: "array",
38937
+ optional: false
38938
+ }],
38807
38939
  "pipelineAnalytics.getEventMedia": [{
38808
38940
  name: "deviceId",
38809
38941
  form: "single",
@@ -39219,11 +39351,21 @@ Object.freeze({
39219
39351
  form: "single",
39220
39352
  optional: false
39221
39353
  }],
39354
+ "recording.getAvailabilityBatch": [{
39355
+ name: "deviceIds",
39356
+ form: "array",
39357
+ optional: false
39358
+ }],
39222
39359
  "recording.getDaysWithRecordings": [{
39223
39360
  name: "deviceId",
39224
39361
  form: "single",
39225
39362
  optional: false
39226
39363
  }],
39364
+ "recording.getDaysWithRecordingsBatch": [{
39365
+ name: "deviceIds",
39366
+ form: "array",
39367
+ optional: false
39368
+ }],
39227
39369
  "recording.getDeviceConfig": [{
39228
39370
  name: "deviceId",
39229
39371
  form: "single",
@@ -17863,6 +17863,8 @@ var NcSystemEventKindSchema = _enum([
17863
17863
  "device-offline",
17864
17864
  "device-disabled",
17865
17865
  "device-enabled",
17866
+ "device-battery-low",
17867
+ "device-battery-normal",
17866
17868
  "stream-online",
17867
17869
  "stream-offline",
17868
17870
  "node-online",
@@ -21321,6 +21323,34 @@ var KeyEventsForDeviceSchema = object({
21321
21323
  deviceId: number(),
21322
21324
  events: array(KeyEventSchema).readonly()
21323
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
+ });
21324
21354
  object({
21325
21355
  trackId: string(),
21326
21356
  className: string(),
@@ -21631,12 +21661,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
21631
21661
  since: number(),
21632
21662
  until: number(),
21633
21663
  bucketMs: number().int().positive()
21634
- }), array(object({
21635
- bucketStart: number(),
21636
- motion: number().int(),
21637
- object: number().int(),
21638
- audio: number().int()
21639
- })).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({
21640
21670
  deviceId: number(),
21641
21671
  cutoffMs: number()
21642
21672
  }), object({
@@ -29257,6 +29287,39 @@ var RecordingDaysSchema = object({
29257
29287
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
29258
29288
  days: array(number())
29259
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
+ });
29260
29323
  var RecordingManifestSchema = object({
29261
29324
  deviceId: number(),
29262
29325
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -29502,6 +29565,32 @@ var recordingCapability = {
29502
29565
  kind: "query",
29503
29566
  auth: "protected"
29504
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
+ }),
29505
29594
  /** Which calendar days in [fromMs,toMs) have ≥1 recorded segment, bucketed by
29506
29595
  * the client's local day (`tzOffsetMinutes` = minutes to add to UTC). Drives
29507
29596
  * the theater date-picker's day dots. */
@@ -29514,6 +29603,26 @@ var recordingCapability = {
29514
29603
  kind: "query",
29515
29604
  auth: "protected"
29516
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
+ }),
29517
29626
  getPlaybackManifest: method(object({
29518
29627
  deviceId: number(),
29519
29628
  fromMs: number(),
@@ -35049,6 +35158,12 @@ Object.freeze({
35049
35158
  addonId: null,
35050
35159
  access: "view"
35051
35160
  },
35161
+ "pipelineAnalytics.getEventDensityBatch": {
35162
+ capName: "pipeline-analytics",
35163
+ capScope: "device",
35164
+ addonId: null,
35165
+ access: "view"
35166
+ },
35052
35167
  "pipelineAnalytics.getEventMedia": {
35053
35168
  capName: "pipeline-analytics",
35054
35169
  capScope: "device",
@@ -36171,12 +36286,24 @@ Object.freeze({
36171
36286
  addonId: null,
36172
36287
  access: "view"
36173
36288
  },
36289
+ "recording.getAvailabilityBatch": {
36290
+ capName: "recording",
36291
+ capScope: "system",
36292
+ addonId: null,
36293
+ access: "view"
36294
+ },
36174
36295
  "recording.getDaysWithRecordings": {
36175
36296
  capName: "recording",
36176
36297
  capScope: "system",
36177
36298
  addonId: null,
36178
36299
  access: "view"
36179
36300
  },
36301
+ "recording.getDaysWithRecordingsBatch": {
36302
+ capName: "recording",
36303
+ capScope: "system",
36304
+ addonId: null,
36305
+ access: "view"
36306
+ },
36180
36307
  "recording.getDeviceConfig": {
36181
36308
  capName: "recording",
36182
36309
  capScope: "system",
@@ -38781,6 +38908,11 @@ Object.freeze({
38781
38908
  form: "single",
38782
38909
  optional: false
38783
38910
  }],
38911
+ "pipelineAnalytics.getEventDensityBatch": [{
38912
+ name: "deviceIds",
38913
+ form: "array",
38914
+ optional: false
38915
+ }],
38784
38916
  "pipelineAnalytics.getEventMedia": [{
38785
38917
  name: "deviceId",
38786
38918
  form: "single",
@@ -39196,11 +39328,21 @@ Object.freeze({
39196
39328
  form: "single",
39197
39329
  optional: false
39198
39330
  }],
39331
+ "recording.getAvailabilityBatch": [{
39332
+ name: "deviceIds",
39333
+ form: "array",
39334
+ optional: false
39335
+ }],
39199
39336
  "recording.getDaysWithRecordings": [{
39200
39337
  name: "deviceId",
39201
39338
  form: "single",
39202
39339
  optional: false
39203
39340
  }],
39341
+ "recording.getDaysWithRecordingsBatch": [{
39342
+ name: "deviceIds",
39343
+ form: "array",
39344
+ optional: false
39345
+ }],
39204
39346
  "recording.getDeviceConfig": [{
39205
39347
  name: "deviceId",
39206
39348
  form: "single",
@@ -1,4 +1,4 @@
1
- const require_dist = require("./dist-5VmTxa8x.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-C8zVKhzA.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-5VmTxa8x.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-5VmTxa8x.js");
6
- const require_lazy_sharp = require("../lazy-sharp-C89jIlwj.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-C8zVKhzA.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-5VmTxa8x.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-C8zVKhzA.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-5VmTxa8x.js");
6
- const require_node = require("../node-FsbZDqyh.js");
7
- const require_local_frame_registry = require("../local-frame-registry-BNMgZ5uA.js");
8
- const require_worker_protocol = require("../worker-protocol-CB8pNFkV.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-C89jIlwj.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-C8zVKhzA.mjs";
2
- import { i as NO_COST_CLAIM, t as ChildCostRegistry } from "../node-G9AiO_JJ.mjs";
3
- import { c as getStepDefinition, n as resolveFrameViewGeometry, t as localFrameRegistry } from "../local-frame-registry-Bh-egEcl.mjs";
4
- import { a as nativeLeaseSettingEnv, t as isWorkerReply } from "../worker-protocol-CA_SVsYj.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-C8zVKhzA.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-5VmTxa8x.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");