camstack 1.2.73 → 1.2.74

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.
@@ -14522,7 +14522,7 @@ function date4(params) {
14522
14522
  // ../../node_modules/zod/v4/classic/external.js
14523
14523
  config(en_default());
14524
14524
 
14525
- // ../types/dist/sleep-DAxSW8cv.mjs
14525
+ // ../types/dist/sleep-C1mz-ocE.mjs
14526
14526
  var WELL_KNOWN_TABS = [
14527
14527
  {
14528
14528
  id: "overview",
@@ -26469,6 +26469,17 @@ var KeyEventsForDeviceSchema = external_exports.object({
26469
26469
  deviceId: external_exports.number(),
26470
26470
  events: external_exports.array(KeyEventSchema).readonly()
26471
26471
  });
26472
+ var EventDensityBucketSchema = external_exports.object({
26473
+ bucketStart: external_exports.number(),
26474
+ motion: external_exports.number().int(),
26475
+ object: external_exports.number().int(),
26476
+ audio: external_exports.number().int()
26477
+ });
26478
+ var EventDensityForDeviceSchema = external_exports.object({
26479
+ deviceId: external_exports.number(),
26480
+ read: external_exports.enum(["read", "unreadable"]),
26481
+ buckets: external_exports.array(EventDensityBucketSchema).readonly()
26482
+ });
26472
26483
  var TrackedDetectionSchema = external_exports.object({
26473
26484
  trackId: external_exports.string(),
26474
26485
  className: external_exports.string(),
@@ -26806,12 +26817,31 @@ var pipelineAnalyticsCapability = {
26806
26817
  since: external_exports.number(),
26807
26818
  until: external_exports.number(),
26808
26819
  bucketMs: external_exports.number().int().positive()
26809
- }), external_exports.array(external_exports.object({
26810
- bucketStart: external_exports.number(),
26811
- motion: external_exports.number().int(),
26812
- object: external_exports.number().int(),
26813
- audio: external_exports.number().int()
26814
- })).readonly()),
26820
+ }), external_exports.array(EventDensityBucketSchema).readonly()),
26821
+ /**
26822
+ * The same histogram, for a SET of cameras, in one round trip.
26823
+ *
26824
+ * A multi-camera timeline (the tablet grid) re-asks this of every camera in
26825
+ * the grid on every day change — N browser → hub → post-analysis round
26826
+ * trips for N independent, already-indexed store queries. The queries are
26827
+ * unchanged and still run per camera (`densityByKind`, one per deviceId,
26828
+ * concurrently INSIDE the owner); only the transport collapses.
26829
+ *
26830
+ * Deliberately per-device rather than pre-merged: a timeline lane belongs
26831
+ * to a camera, and a caller that merged would have to un-merge.
26832
+ * `getEventDensity` stays for single-camera callers.
26833
+ *
26834
+ * Every requested id gets a row, marked — see
26835
+ * {@link EventDensityForDeviceSchema}. `deviceIds` is capped at
26836
+ * {@link EVENT_DENSITY_BATCH_MAX}, and an over-cap ask is refused rather
26837
+ * than truncated.
26838
+ */
26839
+ getEventDensityBatch: method(external_exports.object({
26840
+ deviceIds: external_exports.array(external_exports.number()).min(1).max(200),
26841
+ since: external_exports.number(),
26842
+ until: external_exports.number(),
26843
+ bucketMs: external_exports.number().int().positive()
26844
+ }), external_exports.array(EventDensityForDeviceSchema).readonly()),
26815
26845
  /**
26816
26846
  * @deprecated Prefer `pruneTracksBefore` — the track is the ROOT of the
26817
26847
  * analytics model and retention must cascade from it (design §5.1). This
@@ -36522,6 +36552,17 @@ var RecordingDaysSchema = external_exports.object({
36522
36552
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
36523
36553
  days: external_exports.array(external_exports.number())
36524
36554
  });
36555
+ var RecordingAvailabilityForDeviceSchema = external_exports.object({
36556
+ deviceId: external_exports.number(),
36557
+ read: external_exports.enum(["read", "unreadable"]),
36558
+ ranges: external_exports.array(RecordingRangeSchema).readonly()
36559
+ });
36560
+ var RecordingDaysForDeviceSchema = external_exports.object({
36561
+ deviceId: external_exports.number(),
36562
+ read: external_exports.enum(["read", "unreadable"]),
36563
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
36564
+ days: external_exports.array(external_exports.number()).readonly()
36565
+ });
36525
36566
  var RecordingManifestSchema = external_exports.object({
36526
36567
  deviceId: external_exports.number(),
36527
36568
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -36704,6 +36745,32 @@ var recordingCapability = {
36704
36745
  kind: "query",
36705
36746
  auth: "protected"
36706
36747
  }),
36748
+ /**
36749
+ * `getAvailability` for a SET of cameras, in one round trip.
36750
+ *
36751
+ * A multi-camera timeline re-asks availability for every camera in the grid
36752
+ * on every day change; fanned out that is one request per camera for N
36753
+ * independent calendar walks. The per-camera work is IDENTICAL (the same
36754
+ * `availabilityProfileFor` + `rangesIn`, run concurrently inside the
36755
+ * recorder) — only the transport collapses.
36756
+ *
36757
+ * `protected` for the same reason the singular method is: every id in
36758
+ * `deviceIds` is a device reference, so the F1 #3 gate refuses any camera
36759
+ * outside the caller's scope — one id out of scope refuses the CALL, it
36760
+ * does not quietly drop a row.
36761
+ *
36762
+ * Every requested id gets a row, marked — see
36763
+ * {@link RecordingAvailabilityForDeviceSchema}. `deviceIds` is capped at
36764
+ * {@link RECORDING_TIMELINE_BATCH_MAX} and an over-cap ask is refused.
36765
+ */
36766
+ getAvailabilityBatch: method(external_exports.object({
36767
+ deviceIds: external_exports.array(external_exports.number()).min(1).max(200),
36768
+ fromMs: external_exports.number(),
36769
+ toMs: external_exports.number()
36770
+ }), external_exports.array(RecordingAvailabilityForDeviceSchema).readonly(), {
36771
+ kind: "query",
36772
+ auth: "protected"
36773
+ }),
36707
36774
  /** Which calendar days in [fromMs,toMs) have ≥1 recorded segment, bucketed by
36708
36775
  * the client's local day (`tzOffsetMinutes` = minutes to add to UTC). Drives
36709
36776
  * the theater date-picker's day dots. */
@@ -36716,6 +36783,26 @@ var recordingCapability = {
36716
36783
  kind: "query",
36717
36784
  auth: "protected"
36718
36785
  }),
36786
+ /**
36787
+ * `getDaysWithRecordings` for a SET of cameras, in one round trip.
36788
+ *
36789
+ * The cheapest question in the product, asked once per camera per month
36790
+ * change. One directory read per day per camera at the owner, unchanged;
36791
+ * what collapses is the N requests it took to ask.
36792
+ *
36793
+ * Every requested id gets a row, marked — see
36794
+ * {@link RecordingDaysForDeviceSchema}. `deviceIds` is capped at
36795
+ * {@link RECORDING_TIMELINE_BATCH_MAX} and an over-cap ask is refused.
36796
+ */
36797
+ getDaysWithRecordingsBatch: method(external_exports.object({
36798
+ deviceIds: external_exports.array(external_exports.number()).min(1).max(200),
36799
+ fromMs: external_exports.number(),
36800
+ toMs: external_exports.number(),
36801
+ tzOffsetMinutes: external_exports.number()
36802
+ }), external_exports.array(RecordingDaysForDeviceSchema).readonly(), {
36803
+ kind: "query",
36804
+ auth: "protected"
36805
+ }),
36719
36806
  getPlaybackManifest: method(external_exports.object({
36720
36807
  deviceId: external_exports.number(),
36721
36808
  fromMs: external_exports.number(),
@@ -42302,6 +42389,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
42302
42389
  addonId: null,
42303
42390
  access: "view"
42304
42391
  },
42392
+ "pipelineAnalytics.getEventDensityBatch": {
42393
+ capName: "pipeline-analytics",
42394
+ capScope: "device",
42395
+ addonId: null,
42396
+ access: "view"
42397
+ },
42305
42398
  "pipelineAnalytics.getEventMedia": {
42306
42399
  capName: "pipeline-analytics",
42307
42400
  capScope: "device",
@@ -43424,12 +43517,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
43424
43517
  addonId: null,
43425
43518
  access: "view"
43426
43519
  },
43520
+ "recording.getAvailabilityBatch": {
43521
+ capName: "recording",
43522
+ capScope: "system",
43523
+ addonId: null,
43524
+ access: "view"
43525
+ },
43427
43526
  "recording.getDaysWithRecordings": {
43428
43527
  capName: "recording",
43429
43528
  capScope: "system",
43430
43529
  addonId: null,
43431
43530
  access: "view"
43432
43531
  },
43532
+ "recording.getDaysWithRecordingsBatch": {
43533
+ capName: "recording",
43534
+ capScope: "system",
43535
+ addonId: null,
43536
+ access: "view"
43537
+ },
43433
43538
  "recording.getDeviceConfig": {
43434
43539
  capName: "recording",
43435
43540
  capScope: "system",
@@ -46034,6 +46139,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
46034
46139
  form: "single",
46035
46140
  optional: false
46036
46141
  }],
46142
+ "pipelineAnalytics.getEventDensityBatch": [{
46143
+ name: "deviceIds",
46144
+ form: "array",
46145
+ optional: false
46146
+ }],
46037
46147
  "pipelineAnalytics.getEventMedia": [{
46038
46148
  name: "deviceId",
46039
46149
  form: "single",
@@ -46449,11 +46559,21 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
46449
46559
  form: "single",
46450
46560
  optional: false
46451
46561
  }],
46562
+ "recording.getAvailabilityBatch": [{
46563
+ name: "deviceIds",
46564
+ form: "array",
46565
+ optional: false
46566
+ }],
46452
46567
  "recording.getDaysWithRecordings": [{
46453
46568
  name: "deviceId",
46454
46569
  form: "single",
46455
46570
  optional: false
46456
46571
  }],
46572
+ "recording.getDaysWithRecordingsBatch": [{
46573
+ name: "deviceIds",
46574
+ form: "array",
46575
+ optional: false
46576
+ }],
46457
46577
  "recording.getDeviceConfig": [{
46458
46578
  name: "deviceId",
46459
46579
  form: "single",
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  runDiscover
4
- } from "./chunk-LRCTXS6S.js";
4
+ } from "./chunk-U3GHKSOG.js";
5
5
  import "./chunk-LMMQX4CK.js";
6
6
 
7
7
  // src/cli.ts
@@ -38,7 +38,7 @@ async function runServe(args) {
38
38
  ...typeof values.data === "string" ? { data: values.data } : {}
39
39
  };
40
40
  Object.assign(process.env, buildServeEnv(opts));
41
- await import("./launcher-NDZBIQHT.js");
41
+ await import("./launcher-MNT6I6VY.js");
42
42
  }
43
43
 
44
44
  // src/commands/agent.ts
@@ -83,7 +83,7 @@ async function runAgent(args) {
83
83
  ...typeof values.port === "string" ? { port: values.port } : {}
84
84
  };
85
85
  Object.assign(process.env, buildAgentEnv(opts));
86
- await import("./launcher-NDZBIQHT.js");
86
+ await import("./launcher-MNT6I6VY.js");
87
87
  }
88
88
 
89
89
  // src/commands/setup.ts
@@ -1130,7 +1130,7 @@ function isUnknown(_value) {
1130
1130
  return true;
1131
1131
  }
1132
1132
  async function resolveServerInteractive(presetNamespace) {
1133
- const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-GSZPRHPC.js");
1133
+ const { discoverNodes, resolveHubFromDiscovered, filterHubNodes, DEFAULT_HUB_HTTPS_PORT } = await import("./discover-OD7ECRSD.js");
1134
1134
  if (presetNamespace) {
1135
1135
  const spinner4 = clack.spinner();
1136
1136
  spinner4.start(`Discovering hub on LAN (namespace "${presetNamespace}")`);
@@ -5,7 +5,7 @@ import {
5
5
  filterHubNodes,
6
6
  resolveHubFromDiscovered,
7
7
  runDiscover
8
- } from "./chunk-LRCTXS6S.js";
8
+ } from "./chunk-U3GHKSOG.js";
9
9
  import "./chunk-LMMQX4CK.js";
10
10
  export {
11
11
  DEFAULT_HUB_HTTPS_PORT,