@camstack/addon-tailscale 1.2.50 → 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-v7uK6zeq.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-CMpgFoPi.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";
@@ -15607,6 +15607,8 @@ var NcSystemEventKindSchema = _enum([
15607
15607
  "device-offline",
15608
15608
  "device-disabled",
15609
15609
  "device-enabled",
15610
+ "device-battery-low",
15611
+ "device-battery-normal",
15610
15612
  "stream-online",
15611
15613
  "stream-offline",
15612
15614
  "node-online",
@@ -18881,6 +18883,34 @@ var KeyEventsForDeviceSchema = object({
18881
18883
  deviceId: number(),
18882
18884
  events: array(KeyEventSchema).readonly()
18883
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
+ });
18884
18914
  object({
18885
18915
  trackId: string(),
18886
18916
  className: string(),
@@ -19191,12 +19221,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19191
19221
  since: number(),
19192
19222
  until: number(),
19193
19223
  bucketMs: number().int().positive()
19194
- }), array(object({
19195
- bucketStart: number(),
19196
- motion: number().int(),
19197
- object: number().int(),
19198
- audio: number().int()
19199
- })).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({
19200
19230
  deviceId: number(),
19201
19231
  cutoffMs: number()
19202
19232
  }), object({
@@ -26567,6 +26597,39 @@ var RecordingDaysSchema = object({
26567
26597
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26568
26598
  days: array(number())
26569
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
+ });
26570
26633
  var RecordingManifestSchema = object({
26571
26634
  deviceId: number(),
26572
26635
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -26801,6 +26864,13 @@ method(object({
26801
26864
  }), RecordingAvailabilitySchema, {
26802
26865
  kind: "query",
26803
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"
26804
26874
  }), method(object({
26805
26875
  deviceId: number(),
26806
26876
  fromMs: number(),
@@ -26809,6 +26879,14 @@ method(object({
26809
26879
  }), RecordingDaysSchema, {
26810
26880
  kind: "query",
26811
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"
26812
26890
  }), method(object({
26813
26891
  deviceId: number(),
26814
26892
  fromMs: number(),
@@ -32006,6 +32084,12 @@ Object.freeze({
32006
32084
  addonId: null,
32007
32085
  access: "view"
32008
32086
  },
32087
+ "pipelineAnalytics.getEventDensityBatch": {
32088
+ capName: "pipeline-analytics",
32089
+ capScope: "device",
32090
+ addonId: null,
32091
+ access: "view"
32092
+ },
32009
32093
  "pipelineAnalytics.getEventMedia": {
32010
32094
  capName: "pipeline-analytics",
32011
32095
  capScope: "device",
@@ -33128,12 +33212,24 @@ Object.freeze({
33128
33212
  addonId: null,
33129
33213
  access: "view"
33130
33214
  },
33215
+ "recording.getAvailabilityBatch": {
33216
+ capName: "recording",
33217
+ capScope: "system",
33218
+ addonId: null,
33219
+ access: "view"
33220
+ },
33131
33221
  "recording.getDaysWithRecordings": {
33132
33222
  capName: "recording",
33133
33223
  capScope: "system",
33134
33224
  addonId: null,
33135
33225
  access: "view"
33136
33226
  },
33227
+ "recording.getDaysWithRecordingsBatch": {
33228
+ capName: "recording",
33229
+ capScope: "system",
33230
+ addonId: null,
33231
+ access: "view"
33232
+ },
33137
33233
  "recording.getDeviceConfig": {
33138
33234
  capName: "recording",
33139
33235
  capScope: "system",
@@ -35738,6 +35834,11 @@ Object.freeze({
35738
35834
  form: "single",
35739
35835
  optional: false
35740
35836
  }],
35837
+ "pipelineAnalytics.getEventDensityBatch": [{
35838
+ name: "deviceIds",
35839
+ form: "array",
35840
+ optional: false
35841
+ }],
35741
35842
  "pipelineAnalytics.getEventMedia": [{
35742
35843
  name: "deviceId",
35743
35844
  form: "single",
@@ -36153,11 +36254,21 @@ Object.freeze({
36153
36254
  form: "single",
36154
36255
  optional: false
36155
36256
  }],
36257
+ "recording.getAvailabilityBatch": [{
36258
+ name: "deviceIds",
36259
+ form: "array",
36260
+ optional: false
36261
+ }],
36156
36262
  "recording.getDaysWithRecordings": [{
36157
36263
  name: "deviceId",
36158
36264
  form: "single",
36159
36265
  optional: false
36160
36266
  }],
36267
+ "recording.getDaysWithRecordingsBatch": [{
36268
+ name: "deviceIds",
36269
+ form: "array",
36270
+ optional: false
36271
+ }],
36161
36272
  "recording.getDeviceConfig": [{
36162
36273
  name: "deviceId",
36163
36274
  form: "single",
@@ -15607,6 +15607,8 @@ var NcSystemEventKindSchema = _enum([
15607
15607
  "device-offline",
15608
15608
  "device-disabled",
15609
15609
  "device-enabled",
15610
+ "device-battery-low",
15611
+ "device-battery-normal",
15610
15612
  "stream-online",
15611
15613
  "stream-offline",
15612
15614
  "node-online",
@@ -18881,6 +18883,34 @@ var KeyEventsForDeviceSchema = object({
18881
18883
  deviceId: number(),
18882
18884
  events: array(KeyEventSchema).readonly()
18883
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
+ });
18884
18914
  object({
18885
18915
  trackId: string(),
18886
18916
  className: string(),
@@ -19191,12 +19221,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19191
19221
  since: number(),
19192
19222
  until: number(),
19193
19223
  bucketMs: number().int().positive()
19194
- }), array(object({
19195
- bucketStart: number(),
19196
- motion: number().int(),
19197
- object: number().int(),
19198
- audio: number().int()
19199
- })).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({
19200
19230
  deviceId: number(),
19201
19231
  cutoffMs: number()
19202
19232
  }), object({
@@ -26567,6 +26597,39 @@ var RecordingDaysSchema = object({
26567
26597
  /** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
26568
26598
  days: array(number())
26569
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
+ });
26570
26633
  var RecordingManifestSchema = object({
26571
26634
  deviceId: number(),
26572
26635
  /** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
@@ -26801,6 +26864,13 @@ method(object({
26801
26864
  }), RecordingAvailabilitySchema, {
26802
26865
  kind: "query",
26803
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"
26804
26874
  }), method(object({
26805
26875
  deviceId: number(),
26806
26876
  fromMs: number(),
@@ -26809,6 +26879,14 @@ method(object({
26809
26879
  }), RecordingDaysSchema, {
26810
26880
  kind: "query",
26811
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"
26812
26890
  }), method(object({
26813
26891
  deviceId: number(),
26814
26892
  fromMs: number(),
@@ -32006,6 +32084,12 @@ Object.freeze({
32006
32084
  addonId: null,
32007
32085
  access: "view"
32008
32086
  },
32087
+ "pipelineAnalytics.getEventDensityBatch": {
32088
+ capName: "pipeline-analytics",
32089
+ capScope: "device",
32090
+ addonId: null,
32091
+ access: "view"
32092
+ },
32009
32093
  "pipelineAnalytics.getEventMedia": {
32010
32094
  capName: "pipeline-analytics",
32011
32095
  capScope: "device",
@@ -33128,12 +33212,24 @@ Object.freeze({
33128
33212
  addonId: null,
33129
33213
  access: "view"
33130
33214
  },
33215
+ "recording.getAvailabilityBatch": {
33216
+ capName: "recording",
33217
+ capScope: "system",
33218
+ addonId: null,
33219
+ access: "view"
33220
+ },
33131
33221
  "recording.getDaysWithRecordings": {
33132
33222
  capName: "recording",
33133
33223
  capScope: "system",
33134
33224
  addonId: null,
33135
33225
  access: "view"
33136
33226
  },
33227
+ "recording.getDaysWithRecordingsBatch": {
33228
+ capName: "recording",
33229
+ capScope: "system",
33230
+ addonId: null,
33231
+ access: "view"
33232
+ },
33137
33233
  "recording.getDeviceConfig": {
33138
33234
  capName: "recording",
33139
33235
  capScope: "system",
@@ -35738,6 +35834,11 @@ Object.freeze({
35738
35834
  form: "single",
35739
35835
  optional: false
35740
35836
  }],
35837
+ "pipelineAnalytics.getEventDensityBatch": [{
35838
+ name: "deviceIds",
35839
+ form: "array",
35840
+ optional: false
35841
+ }],
35741
35842
  "pipelineAnalytics.getEventMedia": [{
35742
35843
  name: "deviceId",
35743
35844
  form: "single",
@@ -36153,11 +36254,21 @@ Object.freeze({
36153
36254
  form: "single",
36154
36255
  optional: false
36155
36256
  }],
36257
+ "recording.getAvailabilityBatch": [{
36258
+ name: "deviceIds",
36259
+ form: "array",
36260
+ optional: false
36261
+ }],
36156
36262
  "recording.getDaysWithRecordings": [{
36157
36263
  name: "deviceId",
36158
36264
  form: "single",
36159
36265
  optional: false
36160
36266
  }],
36267
+ "recording.getDaysWithRecordingsBatch": [{
36268
+ name: "deviceIds",
36269
+ form: "array",
36270
+ optional: false
36271
+ }],
36161
36272
  "recording.getDeviceConfig": [{
36162
36273
  name: "deviceId",
36163
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-v7uK6zeq.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-CMpgFoPi.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.50",
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",