@camstack/addon-tailscale 1.2.17 → 1.2.18

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-CDYOSmZP.js");
27
+ const require_dist = require("../dist-DbpUYHfo.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-uBwggMrS.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability, r as BOOT_RECOVERY_BACKOFF_MS, t as meshNetworkCapability } from "../dist-jVhbn7qz.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";
@@ -10832,6 +10832,8 @@ var QueryFilterSchema = object({
10832
10832
  where: record(string(), unknown()).optional(),
10833
10833
  whereIn: record(string(), array(unknown())).optional(),
10834
10834
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
10835
+ /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
10836
+ whereNot: record(string(), unknown()).optional(),
10835
10837
  orderBy: object({
10836
10838
  field: string(),
10837
10839
  direction: _enum(["asc", "desc"])
@@ -10851,7 +10853,8 @@ var QueryFilterSchema = object({
10851
10853
  var MutationFilterSchema = object({
10852
10854
  where: record(string(), unknown()).optional(),
10853
10855
  whereIn: record(string(), array(unknown())).optional(),
10854
- whereBetween: record(string(), tuple([unknown(), unknown()])).optional()
10856
+ whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
10857
+ whereNot: record(string(), unknown()).optional()
10855
10858
  });
10856
10859
  /** A single stored record: `{ id, data }`. */
10857
10860
  var SettingsRecordSchema = object({
@@ -16744,7 +16747,10 @@ var RecentTracksQueryInput = object({
16744
16747
  * Encodes the (lastSeen, trackId) sort position — treat as opaque. */
16745
16748
  cursor: string().optional(),
16746
16749
  /** See {@link TrackProjectionSchema}. Default `full`. */
16747
- projection: TrackProjectionSchema.optional()
16750
+ projection: TrackProjectionSchema.optional(),
16751
+ /** Include stationary-promoted rows (parked objects). Default false: the
16752
+ * feed lists passages; parking records live on the stationary registry. */
16753
+ includeStationary: boolean().optional()
16748
16754
  });
16749
16755
  var RecentTracksPageSchema = object({
16750
16756
  /** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
@@ -16962,7 +16968,11 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
16962
16968
  zone: TrackZoneFilterSchema.optional(),
16963
16969
  /** See {@link TrackProjectionSchema}. Default `full` (backward
16964
16970
  * compatible — omitting the field keeps today's exact behaviour). */
16965
- projection: TrackProjectionSchema.optional()
16971
+ projection: TrackProjectionSchema.optional(),
16972
+ /** Include stationary-promoted rows (parked objects handed to the
16973
+ * stationary registry). Default false: the timeline lists passages,
16974
+ * not parking records (operator decision, 2026-08-15). */
16975
+ includeStationary: boolean().optional()
16966
16976
  }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
16967
16977
  kind: "mutation",
16968
16978
  auth: "admin"
@@ -17126,11 +17136,16 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17126
17136
  auth: "admin"
17127
17137
  }), method(object({
17128
17138
  eventId: string(),
17129
- kind: MediaFileKindEnum.optional()
17139
+ kind: MediaFileKindEnum.optional(),
17140
+ deviceId: number()
17141
+ }), array(MediaFileSchema).readonly()), method(object({
17142
+ trackId: string(),
17143
+ kinds: array(MediaFileKindEnum).optional(),
17144
+ deviceId: number()
17130
17145
  }), array(MediaFileSchema).readonly()), method(object({
17131
17146
  trackId: string(),
17132
- kinds: array(MediaFileKindEnum).optional()
17133
- }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
17147
+ deviceId: number()
17148
+ }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
17134
17149
  kind: "mutation",
17135
17150
  auth: "admin"
17136
17151
  }), method(RebuildObjectEmbeddingsInput, RebuildObjectEmbeddingsResultSchema, {
@@ -19109,7 +19124,16 @@ targets: array(object({
19109
19124
  /** A sleeping battery camera: the frame is deliberately stale and will
19110
19125
  * NOT refresh in the background. A surface should say so rather than
19111
19126
  * present it as current. */
19112
- sleeping: boolean()
19127
+ sleeping: boolean(),
19128
+ /** Current device state rendered over the cached frame. State images
19129
+ * remain authoritative even when their photographic background is
19130
+ * old; null means the link must carry a current camera frame. */
19131
+ stateReason: _enum([
19132
+ "disabled",
19133
+ "sleeping",
19134
+ "unreachable",
19135
+ "waking"
19136
+ ]).nullable()
19113
19137
  })));
19114
19138
  /**
19115
19139
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
@@ -20631,6 +20655,25 @@ var BatteryStatusSchema = object({
20631
20655
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
20632
20656
  lastUpdated: number(),
20633
20657
  /**
20658
+ * Ms epoch of the last time the device PROVED it was reachable — a
20659
+ * completed firmware round-trip, an observed wake, or an inbound push
20660
+ * (firmware event, email). `0`/absent = never since this slice was born.
20661
+ *
20662
+ * This is the ONLY input that separates "asleep" from "gone", and it is
20663
+ * fed exclusively by PASSIVE signals: nothing may write it by reaching
20664
+ * for the radio, because a poll that confirms reachability is the same
20665
+ * poll that drains the battery. See {@link deriveBatteryPresence} — the
20666
+ * single derivation every consumer must use; no surface computes its own.
20667
+ *
20668
+ * It is deliberately NOT a clock in the
20669
+ * `scripts/check-runtime-state-durability.ts` sense: it is the
20670
+ * observation itself, and it is the only thing a 30-hour silence is
20671
+ * visible in. Writers quantise it (see `CONTACT_WRITE_QUANTUM_MS` in the
20672
+ * Reolink provider) so a value that means "recently" cannot cost a
20673
+ * SQLite commit per round-trip.
20674
+ */
20675
+ lastContactAt: number().optional(),
20676
+ /**
20634
20677
  * True when the source is a BINARY low-battery indicator (HA
20635
20678
  * `binary_sensor` device_class=battery / `LOW_BAT`) that has no real
20636
20679
  * charge level — `percentage` is then a coarse stand-in (100 = normal,
@@ -24969,6 +25012,16 @@ var CamStreamDescriptorSchema = object({
24969
25012
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
24970
25013
  metadata: record(string(), unknown()).optional()
24971
25014
  });
25015
+ object({
25016
+ /** The descriptors as last built from a real camera response. Never a guess:
25017
+ * a failed or refused build writes NOTHING, so a restored catalog is always
25018
+ * one the camera itself once produced. */
25019
+ descriptors: array(CamStreamDescriptorSchema),
25020
+ /** Ms epoch of the build that produced {@link descriptors}. Lets the wake
25021
+ * path decide whether the camera's own awake window is worth spending on a
25022
+ * re-read. */
25023
+ lastFetchedAt: number()
25024
+ });
24972
25025
  DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), array(CamStreamDescriptorSchema).readonly());
24973
25026
  /** One of the camera's stream profiles. */
24974
25027
  var StreamProfileSchema = _enum([
@@ -32399,6 +32452,11 @@ Object.freeze({
32399
32452
  form: "single",
32400
32453
  optional: false
32401
32454
  }],
32455
+ "pipelineAnalytics.getEventMedia": [{
32456
+ name: "deviceId",
32457
+ form: "single",
32458
+ optional: false
32459
+ }],
32402
32460
  "pipelineAnalytics.getKeyEvents": [{
32403
32461
  name: "deviceId",
32404
32462
  form: "single",
@@ -32429,6 +32487,11 @@ Object.freeze({
32429
32487
  form: "single",
32430
32488
  optional: false
32431
32489
  }],
32490
+ "pipelineAnalytics.getTrackMedia": [{
32491
+ name: "deviceId",
32492
+ form: "single",
32493
+ optional: false
32494
+ }],
32432
32495
  "pipelineAnalytics.getTrainingExportSummary": [{
32433
32496
  name: "deviceIds",
32434
32497
  form: "array",
@@ -32464,6 +32527,11 @@ Object.freeze({
32464
32527
  form: "array",
32465
32528
  optional: true
32466
32529
  }],
32530
+ "pipelineAnalytics.listTrackMedia": [{
32531
+ name: "deviceId",
32532
+ form: "single",
32533
+ optional: false
32534
+ }],
32467
32535
  "pipelineAnalytics.listTracks": [{
32468
32536
  name: "deviceId",
32469
32537
  form: "single",
@@ -32904,6 +32972,12 @@ Object.freeze({
32904
32972
  form: "single",
32905
32973
  optional: false
32906
32974
  }],
32975
+ "snapshot.getSnapshotLinks": [{
32976
+ name: "targets",
32977
+ form: "object-array",
32978
+ optional: false,
32979
+ itemField: "deviceId"
32980
+ }],
32907
32981
  "snapshot.getSnapshotOverview": [{
32908
32982
  name: "deviceIds",
32909
32983
  form: "array",
@@ -10832,6 +10832,8 @@ var QueryFilterSchema = object({
10832
10832
  where: record(string(), unknown()).optional(),
10833
10833
  whereIn: record(string(), array(unknown())).optional(),
10834
10834
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
10835
+ /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
10836
+ whereNot: record(string(), unknown()).optional(),
10835
10837
  orderBy: object({
10836
10838
  field: string(),
10837
10839
  direction: _enum(["asc", "desc"])
@@ -10851,7 +10853,8 @@ var QueryFilterSchema = object({
10851
10853
  var MutationFilterSchema = object({
10852
10854
  where: record(string(), unknown()).optional(),
10853
10855
  whereIn: record(string(), array(unknown())).optional(),
10854
- whereBetween: record(string(), tuple([unknown(), unknown()])).optional()
10856
+ whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
10857
+ whereNot: record(string(), unknown()).optional()
10855
10858
  });
10856
10859
  /** A single stored record: `{ id, data }`. */
10857
10860
  var SettingsRecordSchema = object({
@@ -16744,7 +16747,10 @@ var RecentTracksQueryInput = object({
16744
16747
  * Encodes the (lastSeen, trackId) sort position — treat as opaque. */
16745
16748
  cursor: string().optional(),
16746
16749
  /** See {@link TrackProjectionSchema}. Default `full`. */
16747
- projection: TrackProjectionSchema.optional()
16750
+ projection: TrackProjectionSchema.optional(),
16751
+ /** Include stationary-promoted rows (parked objects). Default false: the
16752
+ * feed lists passages; parking records live on the stationary registry. */
16753
+ includeStationary: boolean().optional()
16748
16754
  });
16749
16755
  var RecentTracksPageSchema = object({
16750
16756
  /** Merged page, ordered by (`lastSeen` DESC, `trackId` DESC). */
@@ -16962,7 +16968,11 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
16962
16968
  zone: TrackZoneFilterSchema.optional(),
16963
16969
  /** See {@link TrackProjectionSchema}. Default `full` (backward
16964
16970
  * compatible — omitting the field keeps today's exact behaviour). */
16965
- projection: TrackProjectionSchema.optional()
16971
+ projection: TrackProjectionSchema.optional(),
16972
+ /** Include stationary-promoted rows (parked objects handed to the
16973
+ * stationary registry). Default false: the timeline lists passages,
16974
+ * not parking records (operator decision, 2026-08-15). */
16975
+ includeStationary: boolean().optional()
16966
16976
  }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(object({ deviceId: number() }), _void(), {
16967
16977
  kind: "mutation",
16968
16978
  auth: "admin"
@@ -17126,11 +17136,16 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
17126
17136
  auth: "admin"
17127
17137
  }), method(object({
17128
17138
  eventId: string(),
17129
- kind: MediaFileKindEnum.optional()
17139
+ kind: MediaFileKindEnum.optional(),
17140
+ deviceId: number()
17141
+ }), array(MediaFileSchema).readonly()), method(object({
17142
+ trackId: string(),
17143
+ kinds: array(MediaFileKindEnum).optional(),
17144
+ deviceId: number()
17130
17145
  }), array(MediaFileSchema).readonly()), method(object({
17131
17146
  trackId: string(),
17132
- kinds: array(MediaFileKindEnum).optional()
17133
- }), array(MediaFileSchema).readonly()), method(object({ trackId: string() }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
17147
+ deviceId: number()
17148
+ }), array(MediaFileInfoSchema).readonly()), method(SearchObjectEventsInput, array(ScoredObjectEventSchema).readonly()), method(object({}), WipeObjectEmbeddingsResultSchema, {
17134
17149
  kind: "mutation",
17135
17150
  auth: "admin"
17136
17151
  }), method(RebuildObjectEmbeddingsInput, RebuildObjectEmbeddingsResultSchema, {
@@ -19109,7 +19124,16 @@ targets: array(object({
19109
19124
  /** A sleeping battery camera: the frame is deliberately stale and will
19110
19125
  * NOT refresh in the background. A surface should say so rather than
19111
19126
  * present it as current. */
19112
- sleeping: boolean()
19127
+ sleeping: boolean(),
19128
+ /** Current device state rendered over the cached frame. State images
19129
+ * remain authoritative even when their photographic background is
19130
+ * old; null means the link must carry a current camera frame. */
19131
+ stateReason: _enum([
19132
+ "disabled",
19133
+ "sleeping",
19134
+ "unreachable",
19135
+ "waking"
19136
+ ]).nullable()
19113
19137
  })));
19114
19138
  /**
19115
19139
  * `sso-bridge` — internal hub-only cap that lets SSO-style auth
@@ -20631,6 +20655,25 @@ var BatteryStatusSchema = object({
20631
20655
  /** Ms epoch of the last observation. Lets consumers reason about freshness. */
20632
20656
  lastUpdated: number(),
20633
20657
  /**
20658
+ * Ms epoch of the last time the device PROVED it was reachable — a
20659
+ * completed firmware round-trip, an observed wake, or an inbound push
20660
+ * (firmware event, email). `0`/absent = never since this slice was born.
20661
+ *
20662
+ * This is the ONLY input that separates "asleep" from "gone", and it is
20663
+ * fed exclusively by PASSIVE signals: nothing may write it by reaching
20664
+ * for the radio, because a poll that confirms reachability is the same
20665
+ * poll that drains the battery. See {@link deriveBatteryPresence} — the
20666
+ * single derivation every consumer must use; no surface computes its own.
20667
+ *
20668
+ * It is deliberately NOT a clock in the
20669
+ * `scripts/check-runtime-state-durability.ts` sense: it is the
20670
+ * observation itself, and it is the only thing a 30-hour silence is
20671
+ * visible in. Writers quantise it (see `CONTACT_WRITE_QUANTUM_MS` in the
20672
+ * Reolink provider) so a value that means "recently" cannot cost a
20673
+ * SQLite commit per round-trip.
20674
+ */
20675
+ lastContactAt: number().optional(),
20676
+ /**
20634
20677
  * True when the source is a BINARY low-battery indicator (HA
20635
20678
  * `binary_sensor` device_class=battery / `LOW_BAT`) that has no real
20636
20679
  * charge level — `percentage` is then a coarse stand-in (100 = normal,
@@ -24969,6 +25012,16 @@ var CamStreamDescriptorSchema = object({
24969
25012
  /** Transport-specific opaque metadata (e.g. rfc4571 SDP). */
24970
25013
  metadata: record(string(), unknown()).optional()
24971
25014
  });
25015
+ object({
25016
+ /** The descriptors as last built from a real camera response. Never a guess:
25017
+ * a failed or refused build writes NOTHING, so a restored catalog is always
25018
+ * one the camera itself once produced. */
25019
+ descriptors: array(CamStreamDescriptorSchema),
25020
+ /** Ms epoch of the build that produced {@link descriptors}. Lets the wake
25021
+ * path decide whether the camera's own awake window is worth spending on a
25022
+ * re-read. */
25023
+ lastFetchedAt: number()
25024
+ });
24972
25025
  DeviceType.Camera, method(object({ deviceId: number().int().nonnegative() }), array(CamStreamDescriptorSchema).readonly());
24973
25026
  /** One of the camera's stream profiles. */
24974
25027
  var StreamProfileSchema = _enum([
@@ -32399,6 +32452,11 @@ Object.freeze({
32399
32452
  form: "single",
32400
32453
  optional: false
32401
32454
  }],
32455
+ "pipelineAnalytics.getEventMedia": [{
32456
+ name: "deviceId",
32457
+ form: "single",
32458
+ optional: false
32459
+ }],
32402
32460
  "pipelineAnalytics.getKeyEvents": [{
32403
32461
  name: "deviceId",
32404
32462
  form: "single",
@@ -32429,6 +32487,11 @@ Object.freeze({
32429
32487
  form: "single",
32430
32488
  optional: false
32431
32489
  }],
32490
+ "pipelineAnalytics.getTrackMedia": [{
32491
+ name: "deviceId",
32492
+ form: "single",
32493
+ optional: false
32494
+ }],
32432
32495
  "pipelineAnalytics.getTrainingExportSummary": [{
32433
32496
  name: "deviceIds",
32434
32497
  form: "array",
@@ -32464,6 +32527,11 @@ Object.freeze({
32464
32527
  form: "array",
32465
32528
  optional: true
32466
32529
  }],
32530
+ "pipelineAnalytics.listTrackMedia": [{
32531
+ name: "deviceId",
32532
+ form: "single",
32533
+ optional: false
32534
+ }],
32467
32535
  "pipelineAnalytics.listTracks": [{
32468
32536
  name: "deviceId",
32469
32537
  form: "single",
@@ -32904,6 +32972,12 @@ Object.freeze({
32904
32972
  form: "single",
32905
32973
  optional: false
32906
32974
  }],
32975
+ "snapshot.getSnapshotLinks": [{
32976
+ name: "targets",
32977
+ form: "object-array",
32978
+ optional: false,
32979
+ itemField: "deviceId"
32980
+ }],
32907
32981
  "snapshot.getSnapshotOverview": [{
32908
32982
  name: "deviceIds",
32909
32983
  form: "array",
@@ -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-CDYOSmZP.js");
5
+ const require_dist = require("../dist-DbpUYHfo.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-uBwggMrS.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability } from "../dist-jVhbn7qz.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.17",
3
+ "version": "1.2.18",
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",