@camstack/addon-tailscale 1.2.81 → 1.2.83

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-BLTsm6JN.js");
27
+ const require_dist = require("../dist-Cuor6raQ.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-mpmQ8On1.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability, r as BOOT_RECOVERY_BACKOFF_MS, t as meshNetworkCapability } from "../dist-BXwT8V-y.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";
@@ -11966,6 +11966,9 @@ var QueryFilterSchema = object({
11966
11966
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
11967
11967
  /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
11968
11968
  whereNot: record(string(), unknown()).optional(),
11969
+ /** NULL-safe exclusion of a SET — `whereNot` for more than one value. An
11970
+ * empty list excludes nothing. See `QueryFilter.whereNotIn`. */
11971
+ whereNotIn: record(string(), array(unknown())).optional(),
11969
11972
  orderBy: object({
11970
11973
  field: string(),
11971
11974
  direction: _enum(["asc", "desc"])
@@ -11986,7 +11989,8 @@ var MutationFilterSchema = object({
11986
11989
  where: record(string(), unknown()).optional(),
11987
11990
  whereIn: record(string(), array(unknown())).optional(),
11988
11991
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
11989
- whereNot: record(string(), unknown()).optional()
11992
+ whereNot: record(string(), unknown()).optional(),
11993
+ whereNotIn: record(string(), array(unknown())).optional()
11990
11994
  });
11991
11995
  /**
11992
11996
  * One scalar an {@link settingsStoreCapability.methods.aggregate} call asks for.
@@ -18493,10 +18497,12 @@ var TrackSourceSchema = _enum([
18493
18497
  * Terminal for the plain `markForTrain` toggle: returning it to `staging` is
18494
18498
  * a deliberate action of the retrain page, not a side effect of a checkbox.
18495
18499
  *
18496
- * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` because
18497
- * the store's filter language has only positive equality and `whereIn` — no
18498
- * negation, no IS NULL — so a NULL would be unselectable by ANY predicate and
18499
- * would make the entire pre-column history immortal in one deploy.
18500
+ * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` so that
18501
+ * every row is selectable by a positive predicate. (The filter language has
18502
+ * since grown the NULL-safe `whereNot` / `whereNotIn` and an `IS NULL` reading
18503
+ * of `where: { f: null }`, which is how {@link TrackSourceSchema} can be
18504
+ * filtered on a NULLABLE column — see `excludeSources`. It did not when this
18505
+ * column was designed, and a NOT NULL column is still the better shape.)
18500
18506
  */
18501
18507
  var RetrainStatusSchema = _enum([
18502
18508
  "none",
@@ -19232,7 +19238,9 @@ var RecentTracksQueryInput = object({
19232
19238
  * whose class list is unreadable are kept, and the client's rule stays the
19233
19239
  * exact one.
19234
19240
  */
19235
- classes: array(string()).optional()
19241
+ classes: array(string()).optional(),
19242
+ /** See {@link ExcludeSourcesDoc}. */
19243
+ excludeSources: array(TrackSourceSchema).optional()
19236
19244
  });
19237
19245
  /**
19238
19246
  * A Summary (D359): the per-camera session envelope that references tracks.
@@ -19660,7 +19668,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19660
19668
  * selected is an operator who has not narrowed anything, and an empty
19661
19669
  * timeline would read as a camera that saw nothing.
19662
19670
  */
19663
- classes: array(string()).optional()
19671
+ classes: array(string()).optional(),
19672
+ /** See {@link ExcludeSourcesDoc}. */
19673
+ excludeSources: array(TrackSourceSchema).optional()
19664
19674
  }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(SummariesQueryInput, SummariesPageSchema), method(object({ id: string() }), SummaryDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19665
19675
  kind: "mutation",
19666
19676
  auth: "admin"
@@ -27182,8 +27192,27 @@ var PrivacyMaskRegionSchema = object({
27182
27192
  });
27183
27193
  object({
27184
27194
  enabled: boolean(),
27185
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
27186
- regions: array(PrivacyMaskRegionSchema),
27195
+ /**
27196
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
27197
+ *
27198
+ * `null` means "no answer" — the provider has never reached this camera
27199
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
27200
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
27201
+ * has no zones": those two look identical to an operator right up to the
27202
+ * moment one of them is acted on, and acting on them differs completely.
27203
+ * The switch group turned an unanswered read into *"nothing is set up for
27204
+ * it to act on"* — an instruction to go and draw a zone that already
27205
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
27206
+ * from deleting the mask it could not read.
27207
+ *
27208
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
27209
+ * has no zones. The distinction is the same one {@link
27210
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
27211
+ * microphone, on the very same payload — both planes come from ONE refresh,
27212
+ * so it was never coherent for one of them to be able to say "unknown"
27213
+ * while the other could not.
27214
+ */
27215
+ regions: array(PrivacyMaskRegionSchema).nullable(),
27187
27216
  /**
27188
27217
  * Is the camera capturing sound right now? Read from the camera, never from
27189
27218
  * a server-side mirror.
@@ -11966,6 +11966,9 @@ var QueryFilterSchema = object({
11966
11966
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
11967
11967
  /** NULL-safe exclusion: matches rows whose field is NULL OR != the value. */
11968
11968
  whereNot: record(string(), unknown()).optional(),
11969
+ /** NULL-safe exclusion of a SET — `whereNot` for more than one value. An
11970
+ * empty list excludes nothing. See `QueryFilter.whereNotIn`. */
11971
+ whereNotIn: record(string(), array(unknown())).optional(),
11969
11972
  orderBy: object({
11970
11973
  field: string(),
11971
11974
  direction: _enum(["asc", "desc"])
@@ -11986,7 +11989,8 @@ var MutationFilterSchema = object({
11986
11989
  where: record(string(), unknown()).optional(),
11987
11990
  whereIn: record(string(), array(unknown())).optional(),
11988
11991
  whereBetween: record(string(), tuple([unknown(), unknown()])).optional(),
11989
- whereNot: record(string(), unknown()).optional()
11992
+ whereNot: record(string(), unknown()).optional(),
11993
+ whereNotIn: record(string(), array(unknown())).optional()
11990
11994
  });
11991
11995
  /**
11992
11996
  * One scalar an {@link settingsStoreCapability.methods.aggregate} call asks for.
@@ -18493,10 +18497,12 @@ var TrackSourceSchema = _enum([
18493
18497
  * Terminal for the plain `markForTrain` toggle: returning it to `staging` is
18494
18498
  * a deliberate action of the retrain page, not a side effect of a checkbox.
18495
18499
  *
18496
- * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` because
18497
- * the store's filter language has only positive equality and `whereIn` — no
18498
- * negation, no IS NULL — so a NULL would be unselectable by ANY predicate and
18499
- * would make the entire pre-column history immortal in one deploy.
18500
+ * There is no `null`. The state is stored `TEXT NOT NULL DEFAULT 'none'` so that
18501
+ * every row is selectable by a positive predicate. (The filter language has
18502
+ * since grown the NULL-safe `whereNot` / `whereNotIn` and an `IS NULL` reading
18503
+ * of `where: { f: null }`, which is how {@link TrackSourceSchema} can be
18504
+ * filtered on a NULLABLE column — see `excludeSources`. It did not when this
18505
+ * column was designed, and a NOT NULL column is still the better shape.)
18500
18506
  */
18501
18507
  var RetrainStatusSchema = _enum([
18502
18508
  "none",
@@ -19232,7 +19238,9 @@ var RecentTracksQueryInput = object({
19232
19238
  * whose class list is unreadable are kept, and the client's rule stays the
19233
19239
  * exact one.
19234
19240
  */
19235
- classes: array(string()).optional()
19241
+ classes: array(string()).optional(),
19242
+ /** See {@link ExcludeSourcesDoc}. */
19243
+ excludeSources: array(TrackSourceSchema).optional()
19236
19244
  });
19237
19245
  /**
19238
19246
  * A Summary (D359): the per-camera session envelope that references tracks.
@@ -19660,7 +19668,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
19660
19668
  * selected is an operator who has not narrowed anything, and an empty
19661
19669
  * timeline would read as a camera that saw nothing.
19662
19670
  */
19663
- classes: array(string()).optional()
19671
+ classes: array(string()).optional(),
19672
+ /** See {@link ExcludeSourcesDoc}. */
19673
+ excludeSources: array(TrackSourceSchema).optional()
19664
19674
  }), array(TrackSchema).readonly()), method(RecentTracksQueryInput, RecentTracksPageSchema), method(SummariesQueryInput, SummariesPageSchema), method(object({ id: string() }), SummaryDetailSchema.nullable()), method(object({ deviceId: number() }), _void(), {
19665
19675
  kind: "mutation",
19666
19676
  auth: "admin"
@@ -27182,8 +27192,27 @@ var PrivacyMaskRegionSchema = object({
27182
27192
  });
27183
27193
  object({
27184
27194
  enabled: boolean(),
27185
- /** Active zones (normalized 0..1). Length ≤ maxRegions. */
27186
- regions: array(PrivacyMaskRegionSchema),
27195
+ /**
27196
+ * Active zones (normalized 0..1). Length ≤ maxRegions.
27197
+ *
27198
+ * `null` means "no answer" — the provider has never reached this camera
27199
+ * (a cold `runtimeState` slice, a battery camera asleep) or the read
27200
+ * failed. A consumer must render it as UNKNOWN and never as "this camera
27201
+ * has no zones": those two look identical to an operator right up to the
27202
+ * moment one of them is acted on, and acting on them differs completely.
27203
+ * The switch group turned an unanswered read into *"nothing is set up for
27204
+ * it to act on"* — an instruction to go and draw a zone that already
27205
+ * exists — and this editor seeded an EMPTY canvas from it, one Save away
27206
+ * from deleting the mask it could not read.
27207
+ *
27208
+ * Empty-and-answered is `[]` and stays a real answer: this camera genuinely
27209
+ * has no zones. The distinction is the same one {@link
27210
+ * PrivacyMaskStatusSchema.shape.audioEnabled} already draws for the
27211
+ * microphone, on the very same payload — both planes come from ONE refresh,
27212
+ * so it was never coherent for one of them to be able to say "unknown"
27213
+ * while the other could not.
27214
+ */
27215
+ regions: array(PrivacyMaskRegionSchema).nullable(),
27187
27216
  /**
27188
27217
  * Is the camera capturing sound right now? Read from the camera, never from
27189
27218
  * a server-side mirror.
@@ -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-BLTsm6JN.js");
5
+ const require_dist = require("../dist-Cuor6raQ.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-mpmQ8On1.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability } from "../dist-BXwT8V-y.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.81",
3
+ "version": "1.2.83",
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",