@camstack/addon-tailscale 1.2.51 → 1.2.52

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.
@@ -24,7 +24,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  enumerable: true
25
25
  }) : target, mod));
26
26
  //#endregion
27
- const require_dist = require("../dist-DZmp04sL.js");
27
+ const require_dist = require("../dist-BYSC8bJK.js");
28
28
  let node_child_process = require("node:child_process");
29
29
  let node_util = require("node:util");
30
30
  let node_fs = require("node:fs");
@@ -1,4 +1,4 @@
1
- import { a as EventCategory, i as BaseAddon, n as networkAccessCapability, r as BOOT_RECOVERY_BACKOFF_MS, t as meshNetworkCapability } from "../dist-CLEhB-7g.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability, r as BOOT_RECOVERY_BACKOFF_MS, t as meshNetworkCapability } from "../dist-COyLQeD1.mjs";
2
2
  import { execFile, spawn } from "node:child_process";
3
3
  import { promisify } from "node:util";
4
4
  import * as fs from "node:fs";
@@ -18883,6 +18883,34 @@ var KeyEventsForDeviceSchema = object({
18883
18883
  deviceId: number(),
18884
18884
  events: array(KeyEventSchema).readonly()
18885
18885
  });
18886
+ /** One non-empty bucket of the timeline histogram. */
18887
+ var EventDensityBucketSchema = object({
18888
+ bucketStart: number(),
18889
+ motion: number().int(),
18890
+ object: number().int(),
18891
+ audio: number().int()
18892
+ });
18893
+ /**
18894
+ * One camera's row in a `getEventDensityBatch` answer.
18895
+ *
18896
+ * TWO facts, and the timeline draws them differently:
18897
+ *
18898
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
18899
+ * claim: read, and nothing happened in the window.
18900
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
18901
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
18902
+ * not quiet.
18903
+ *
18904
+ * Fanned out per camera the difference was free — one query rejected while the
18905
+ * others resolved — and collapsing to a batch is the exact moment it is lost
18906
+ * silently. Every requested id gets a row: a caller that asked for twelve and
18907
+ * got eleven cannot tell which one is missing, or that any is.
18908
+ */
18909
+ var EventDensityForDeviceSchema = object({
18910
+ deviceId: number(),
18911
+ read: _enum(["read", "unreadable"]),
18912
+ buckets: array(EventDensityBucketSchema).readonly()
18913
+ });
18886
18914
  object({
18887
18915
  trackId: string(),
18888
18916
  className: string(),
@@ -19193,12 +19221,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19193
19221
  since: number(),
19194
19222
  until: number(),
19195
19223
  bucketMs: number().int().positive()
19196
- }), array(object({
19197
- bucketStart: number(),
19198
- motion: number().int(),
19199
- object: number().int(),
19200
- audio: number().int()
19201
- })).readonly()), method(object({
19224
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19225
+ deviceIds: array(number()).min(1).max(200),
19226
+ since: number(),
19227
+ until: number(),
19228
+ bucketMs: number().int().positive()
19229
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19202
19230
  deviceId: number(),
19203
19231
  cutoffMs: number()
19204
19232
  }), object({
@@ -26569,6 +26597,39 @@ var RecordingDaysSchema = object({
26569
26597
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26570
26598
  days: array(number())
26571
26599
  });
26600
+ /**
26601
+ * One camera's row in a `getAvailabilityBatch` answer.
26602
+ *
26603
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
26604
+ * batch collapses the transport, not the work — plus the one thing the singular
26605
+ * method never had to say:
26606
+ *
26607
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
26608
+ * no footage in the window", which is a real claim.
26609
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
26610
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
26611
+ * that emptiness means NOTHING.
26612
+ *
26613
+ * A timeline that renders the second as the first tells an operator there is no
26614
+ * footage when the truth is that nobody looked.
26615
+ */
26616
+ var RecordingAvailabilityForDeviceSchema = object({
26617
+ deviceId: number(),
26618
+ read: _enum(["read", "unreadable"]),
26619
+ ranges: array(RecordingRangeSchema).readonly()
26620
+ });
26621
+ /**
26622
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
26623
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
26624
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
26625
+ * the date-picker's day dots must not spell them the same.
26626
+ */
26627
+ var RecordingDaysForDeviceSchema = object({
26628
+ deviceId: number(),
26629
+ read: _enum(["read", "unreadable"]),
26630
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26631
+ days: array(number()).readonly()
26632
+ });
26572
26633
  var RecordingManifestSchema = object({
26573
26634
  deviceId: number(),
26574
26635
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -26803,6 +26864,13 @@ method(object({
26803
26864
  }), RecordingAvailabilitySchema, {
26804
26865
  kind: "query",
26805
26866
  auth: "protected"
26867
+ }), method(object({
26868
+ deviceIds: array(number()).min(1).max(200),
26869
+ fromMs: number(),
26870
+ toMs: number()
26871
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
26872
+ kind: "query",
26873
+ auth: "protected"
26806
26874
  }), method(object({
26807
26875
  deviceId: number(),
26808
26876
  fromMs: number(),
@@ -26811,6 +26879,14 @@ method(object({
26811
26879
  }), RecordingDaysSchema, {
26812
26880
  kind: "query",
26813
26881
  auth: "protected"
26882
+ }), method(object({
26883
+ deviceIds: array(number()).min(1).max(200),
26884
+ fromMs: number(),
26885
+ toMs: number(),
26886
+ tzOffsetMinutes: number()
26887
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
26888
+ kind: "query",
26889
+ auth: "protected"
26814
26890
  }), method(object({
26815
26891
  deviceId: number(),
26816
26892
  fromMs: number(),
@@ -32008,6 +32084,12 @@ Object.freeze({
32008
32084
  addonId: null,
32009
32085
  access: "view"
32010
32086
  },
32087
+ "pipelineAnalytics.getEventDensityBatch": {
32088
+ capName: "pipeline-analytics",
32089
+ capScope: "device",
32090
+ addonId: null,
32091
+ access: "view"
32092
+ },
32011
32093
  "pipelineAnalytics.getEventMedia": {
32012
32094
  capName: "pipeline-analytics",
32013
32095
  capScope: "device",
@@ -33130,12 +33212,24 @@ Object.freeze({
33130
33212
  addonId: null,
33131
33213
  access: "view"
33132
33214
  },
33215
+ "recording.getAvailabilityBatch": {
33216
+ capName: "recording",
33217
+ capScope: "system",
33218
+ addonId: null,
33219
+ access: "view"
33220
+ },
33133
33221
  "recording.getDaysWithRecordings": {
33134
33222
  capName: "recording",
33135
33223
  capScope: "system",
33136
33224
  addonId: null,
33137
33225
  access: "view"
33138
33226
  },
33227
+ "recording.getDaysWithRecordingsBatch": {
33228
+ capName: "recording",
33229
+ capScope: "system",
33230
+ addonId: null,
33231
+ access: "view"
33232
+ },
33139
33233
  "recording.getDeviceConfig": {
33140
33234
  capName: "recording",
33141
33235
  capScope: "system",
@@ -35740,6 +35834,11 @@ Object.freeze({
35740
35834
  form: "single",
35741
35835
  optional: false
35742
35836
  }],
35837
+ "pipelineAnalytics.getEventDensityBatch": [{
35838
+ name: "deviceIds",
35839
+ form: "array",
35840
+ optional: false
35841
+ }],
35743
35842
  "pipelineAnalytics.getEventMedia": [{
35744
35843
  name: "deviceId",
35745
35844
  form: "single",
@@ -36155,11 +36254,21 @@ Object.freeze({
36155
36254
  form: "single",
36156
36255
  optional: false
36157
36256
  }],
36257
+ "recording.getAvailabilityBatch": [{
36258
+ name: "deviceIds",
36259
+ form: "array",
36260
+ optional: false
36261
+ }],
36158
36262
  "recording.getDaysWithRecordings": [{
36159
36263
  name: "deviceId",
36160
36264
  form: "single",
36161
36265
  optional: false
36162
36266
  }],
36267
+ "recording.getDaysWithRecordingsBatch": [{
36268
+ name: "deviceIds",
36269
+ form: "array",
36270
+ optional: false
36271
+ }],
36163
36272
  "recording.getDeviceConfig": [{
36164
36273
  name: "deviceId",
36165
36274
  form: "single",
@@ -18883,6 +18883,34 @@ var KeyEventsForDeviceSchema = object({
18883
18883
  deviceId: number(),
18884
18884
  events: array(KeyEventSchema).readonly()
18885
18885
  });
18886
+ /** One non-empty bucket of the timeline histogram. */
18887
+ var EventDensityBucketSchema = object({
18888
+ bucketStart: number(),
18889
+ motion: number().int(),
18890
+ object: number().int(),
18891
+ audio: number().int()
18892
+ });
18893
+ /**
18894
+ * One camera's row in a `getEventDensityBatch` answer.
18895
+ *
18896
+ * TWO facts, and the timeline draws them differently:
18897
+ *
18898
+ * - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
18899
+ * claim: read, and nothing happened in the window.
18900
+ * - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
18901
+ * empty and that emptiness means NOTHING; the timeline must render unknown,
18902
+ * not quiet.
18903
+ *
18904
+ * Fanned out per camera the difference was free — one query rejected while the
18905
+ * others resolved — and collapsing to a batch is the exact moment it is lost
18906
+ * silently. Every requested id gets a row: a caller that asked for twelve and
18907
+ * got eleven cannot tell which one is missing, or that any is.
18908
+ */
18909
+ var EventDensityForDeviceSchema = object({
18910
+ deviceId: number(),
18911
+ read: _enum(["read", "unreadable"]),
18912
+ buckets: array(EventDensityBucketSchema).readonly()
18913
+ });
18886
18914
  object({
18887
18915
  trackId: string(),
18888
18916
  className: string(),
@@ -19193,12 +19221,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19193
19221
  since: number(),
19194
19222
  until: number(),
19195
19223
  bucketMs: number().int().positive()
19196
- }), array(object({
19197
- bucketStart: number(),
19198
- motion: number().int(),
19199
- object: number().int(),
19200
- audio: number().int()
19201
- })).readonly()), method(object({
19224
+ }), array(EventDensityBucketSchema).readonly()), method(object({
19225
+ deviceIds: array(number()).min(1).max(200),
19226
+ since: number(),
19227
+ until: number(),
19228
+ bucketMs: number().int().positive()
19229
+ }), array(EventDensityForDeviceSchema).readonly()), method(object({
19202
19230
  deviceId: number(),
19203
19231
  cutoffMs: number()
19204
19232
  }), object({
@@ -26569,6 +26597,39 @@ var RecordingDaysSchema = object({
26569
26597
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26570
26598
  days: array(number())
26571
26599
  });
26600
+ /**
26601
+ * One camera's row in a `getAvailabilityBatch` answer.
26602
+ *
26603
+ * `ranges` is EXACTLY what `getAvailability` returns for that camera — the
26604
+ * batch collapses the transport, not the work — plus the one thing the singular
26605
+ * method never had to say:
26606
+ *
26607
+ * - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
26608
+ * no footage in the window", which is a real claim.
26609
+ * - `read: 'unreadable'` — the recorder could not answer for this camera (its
26610
+ * calendar rung threw, its location is unmounted). `ranges` is empty and
26611
+ * that emptiness means NOTHING.
26612
+ *
26613
+ * A timeline that renders the second as the first tells an operator there is no
26614
+ * footage when the truth is that nobody looked.
26615
+ */
26616
+ var RecordingAvailabilityForDeviceSchema = object({
26617
+ deviceId: number(),
26618
+ read: _enum(["read", "unreadable"]),
26619
+ ranges: array(RecordingRangeSchema).readonly()
26620
+ });
26621
+ /**
26622
+ * One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
26623
+ * {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
26624
+ * "no footage in this month", `read: 'unreadable'` is "nobody could look", and
26625
+ * the date-picker's day dots must not spell them the same.
26626
+ */
26627
+ var RecordingDaysForDeviceSchema = object({
26628
+ deviceId: number(),
26629
+ read: _enum(["read", "unreadable"]),
26630
+ /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26631
+ days: array(number()).readonly()
26632
+ });
26572
26633
  var RecordingManifestSchema = object({
26573
26634
  deviceId: number(),
26574
26635
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -26803,6 +26864,13 @@ method(object({
26803
26864
  }), RecordingAvailabilitySchema, {
26804
26865
  kind: "query",
26805
26866
  auth: "protected"
26867
+ }), method(object({
26868
+ deviceIds: array(number()).min(1).max(200),
26869
+ fromMs: number(),
26870
+ toMs: number()
26871
+ }), array(RecordingAvailabilityForDeviceSchema).readonly(), {
26872
+ kind: "query",
26873
+ auth: "protected"
26806
26874
  }), method(object({
26807
26875
  deviceId: number(),
26808
26876
  fromMs: number(),
@@ -26811,6 +26879,14 @@ method(object({
26811
26879
  }), RecordingDaysSchema, {
26812
26880
  kind: "query",
26813
26881
  auth: "protected"
26882
+ }), method(object({
26883
+ deviceIds: array(number()).min(1).max(200),
26884
+ fromMs: number(),
26885
+ toMs: number(),
26886
+ tzOffsetMinutes: number()
26887
+ }), array(RecordingDaysForDeviceSchema).readonly(), {
26888
+ kind: "query",
26889
+ auth: "protected"
26814
26890
  }), method(object({
26815
26891
  deviceId: number(),
26816
26892
  fromMs: number(),
@@ -32008,6 +32084,12 @@ Object.freeze({
32008
32084
  addonId: null,
32009
32085
  access: "view"
32010
32086
  },
32087
+ "pipelineAnalytics.getEventDensityBatch": {
32088
+ capName: "pipeline-analytics",
32089
+ capScope: "device",
32090
+ addonId: null,
32091
+ access: "view"
32092
+ },
32011
32093
  "pipelineAnalytics.getEventMedia": {
32012
32094
  capName: "pipeline-analytics",
32013
32095
  capScope: "device",
@@ -33130,12 +33212,24 @@ Object.freeze({
33130
33212
  addonId: null,
33131
33213
  access: "view"
33132
33214
  },
33215
+ "recording.getAvailabilityBatch": {
33216
+ capName: "recording",
33217
+ capScope: "system",
33218
+ addonId: null,
33219
+ access: "view"
33220
+ },
33133
33221
  "recording.getDaysWithRecordings": {
33134
33222
  capName: "recording",
33135
33223
  capScope: "system",
33136
33224
  addonId: null,
33137
33225
  access: "view"
33138
33226
  },
33227
+ "recording.getDaysWithRecordingsBatch": {
33228
+ capName: "recording",
33229
+ capScope: "system",
33230
+ addonId: null,
33231
+ access: "view"
33232
+ },
33139
33233
  "recording.getDeviceConfig": {
33140
33234
  capName: "recording",
33141
33235
  capScope: "system",
@@ -35740,6 +35834,11 @@ Object.freeze({
35740
35834
  form: "single",
35741
35835
  optional: false
35742
35836
  }],
35837
+ "pipelineAnalytics.getEventDensityBatch": [{
35838
+ name: "deviceIds",
35839
+ form: "array",
35840
+ optional: false
35841
+ }],
35743
35842
  "pipelineAnalytics.getEventMedia": [{
35744
35843
  name: "deviceId",
35745
35844
  form: "single",
@@ -36155,11 +36254,21 @@ Object.freeze({
36155
36254
  form: "single",
36156
36255
  optional: false
36157
36256
  }],
36257
+ "recording.getAvailabilityBatch": [{
36258
+ name: "deviceIds",
36259
+ form: "array",
36260
+ optional: false
36261
+ }],
36158
36262
  "recording.getDaysWithRecordings": [{
36159
36263
  name: "deviceId",
36160
36264
  form: "single",
36161
36265
  optional: false
36162
36266
  }],
36267
+ "recording.getDaysWithRecordingsBatch": [{
36268
+ name: "deviceIds",
36269
+ form: "array",
36270
+ optional: false
36271
+ }],
36163
36272
  "recording.getDeviceConfig": [{
36164
36273
  name: "deviceId",
36165
36274
  form: "single",
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_dist = require("../dist-DZmp04sL.js");
5
+ const require_dist = require("../dist-BYSC8bJK.js");
6
6
  let node_crypto = require("node:crypto");
7
7
  let node_child_process = require("node:child_process");
8
8
  //#region src/ingress/tailscale-cli.ts
@@ -1,4 +1,4 @@
1
- import { a as EventCategory, i as BaseAddon, n as networkAccessCapability } from "../dist-CLEhB-7g.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability } from "../dist-COyLQeD1.mjs";
2
2
  import { randomUUID } from "node:crypto";
3
3
  import { execFile } from "node:child_process";
4
4
  import { promisify } from "node:util";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-tailscale",
3
- "version": "1.2.51",
3
+ "version": "1.2.52",
4
4
  "description": "Tailscale bundle for CamStack — joins the host to a tailnet (client) and exposes the hub via Serve/Funnel (ingress). Multi-entry npm package shipping 2 addons under a single bundle.",
5
5
  "keywords": [
6
6
  "camstack",