@camstack/addon-tailscale 1.2.47 → 1.2.48

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-CJS8Mo7l.js");
27
+ const require_dist = require("../dist-D4Kv7xGB.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-BO7-LQSt.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability, r as BOOT_RECOVERY_BACKOFF_MS, t as meshNetworkCapability } from "../dist-r9nSS25r.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";
@@ -18787,6 +18787,50 @@ var EventStoreFootprintSchema = object({
18787
18787
  totalBytes: number().int(),
18788
18788
  devices: array(EventStoreDeviceFootprintSchema).readonly()
18789
18789
  });
18790
+ /** Event-media footprint for one {@link MediaFileKind}. */
18791
+ var EventMediaKindFootprintSchema = object({
18792
+ kind: MediaFileKindEnum,
18793
+ /** Media rows of this kind. */
18794
+ rows: number().int(),
18795
+ /** Bytes on disk held by those rows. */
18796
+ bytes: number().int()
18797
+ });
18798
+ /**
18799
+ * The media footprint broken down by KIND — the axis a deletion decision
18800
+ * actually turns on.
18801
+ *
18802
+ * A byte total says how much there is; it cannot say what is safe to remove.
18803
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
18804
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
18805
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
18806
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
18807
+ * nothing else, so sizing a deletion means summing per kind.
18808
+ *
18809
+ * ## Why `unaccounted*` exists
18810
+ *
18811
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
18812
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
18813
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
18814
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
18815
+ * retired code path, or by a version that knew a kind this one does not) would
18816
+ * otherwise vanish from the total silently, and an operator would delete
18817
+ * against a denominator smaller than the disk.
18818
+ *
18819
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
18820
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
18821
+ */
18822
+ var EventMediaKindBreakdownSchema = object({
18823
+ /** Every media row in scope, from one unfiltered aggregate. */
18824
+ totalRows: number().int(),
18825
+ /** Every media byte in scope, from that same aggregate. */
18826
+ totalBytes: number().int(),
18827
+ /** Per-kind footprint, ordered by bytes descending. */
18828
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
18829
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
18830
+ unaccountedRows: number().int(),
18831
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
18832
+ unaccountedBytes: number().int()
18833
+ });
18790
18834
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
18791
18835
  var EventPruneCountsSchema = object({
18792
18836
  motion: number().int(),
@@ -18990,6 +19034,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18990
19034
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
18991
19035
  kind: "query",
18992
19036
  auth: "admin"
19037
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19038
+ kind: "query",
19039
+ auth: "admin"
18993
19040
  }), method(object({
18994
19041
  olderThanMs: number(),
18995
19042
  reason: OpsLogReasonSchema.optional()
@@ -20941,6 +20988,20 @@ method(object({
20941
20988
  error: string().optional()
20942
20989
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
20943
20990
  providerId: string(),
20991
+ /**
20992
+ * The location this config is an UNSAVED edit of, when there is one.
20993
+ *
20994
+ * `listLocations` replaces every declared secret with the redaction
20995
+ * sentinel, so the edit modal's form state holds the sentinel for any
20996
+ * credential the operator did not retype — and posting that here
20997
+ * without a way to resolve it makes the provider try to authenticate
20998
+ * as `__camstack_redacted__` and report the operator's own working
20999
+ * password as wrong. Given this id, the orchestrator restores each
21000
+ * sentinel from the stored config (same rule as `upsertLocation`)
21001
+ * before dispatching. Omitted by the "Add location" wizard, where
21002
+ * every value was typed just now and nothing is stored yet.
21003
+ */
21004
+ locationId: string().optional(),
20944
21005
  config: record(string(), unknown())
20945
21006
  }), object({
20946
21007
  ok: boolean(),
@@ -31656,6 +31717,12 @@ Object.freeze({
31656
31717
  addonId: null,
31657
31718
  access: "view"
31658
31719
  },
31720
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31721
+ capName: "pipeline-analytics",
31722
+ capScope: "device",
31723
+ addonId: null,
31724
+ access: "view"
31725
+ },
31659
31726
  "pipelineAnalytics.getEventStoreFootprint": {
31660
31727
  capName: "pipeline-analytics",
31661
31728
  capScope: "device",
@@ -35321,6 +35388,11 @@ Object.freeze({
35321
35388
  form: "single",
35322
35389
  optional: false
35323
35390
  }],
35391
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35392
+ name: "deviceId",
35393
+ form: "single",
35394
+ optional: true
35395
+ }],
35324
35396
  "pipelineAnalytics.getGroup": [{
35325
35397
  name: "deviceId",
35326
35398
  form: "single",
@@ -18787,6 +18787,50 @@ var EventStoreFootprintSchema = object({
18787
18787
  totalBytes: number().int(),
18788
18788
  devices: array(EventStoreDeviceFootprintSchema).readonly()
18789
18789
  });
18790
+ /** Event-media footprint for one {@link MediaFileKind}. */
18791
+ var EventMediaKindFootprintSchema = object({
18792
+ kind: MediaFileKindEnum,
18793
+ /** Media rows of this kind. */
18794
+ rows: number().int(),
18795
+ /** Bytes on disk held by those rows. */
18796
+ bytes: number().int()
18797
+ });
18798
+ /**
18799
+ * The media footprint broken down by KIND — the axis a deletion decision
18800
+ * actually turns on.
18801
+ *
18802
+ * A byte total says how much there is; it cannot say what is safe to remove.
18803
+ * The deletable set (the periodic `snapshot` filmstrip, the surplus per-edge
18804
+ * motion stills) and the keep set (`firstFrame`, rolling `lastFrame`,
18805
+ * `thumbnail`/`thumbnailSmall`, `keyFrame`/`keyFrameSmall`, the face/plate
18806
+ * buffers, gallery media, the CLIP `crop`) are distinguished by `kind` and by
18807
+ * nothing else, so sizing a deletion means summing per kind.
18808
+ *
18809
+ * ## Why `unaccounted*` exists
18810
+ *
18811
+ * `kinds` is enumerated from {@link MediaFileKindEnum} — the closed set the
18812
+ * writers use — and summed one kind at a time. `totalRows` / `totalBytes` come
18813
+ * from a SEPARATE unfiltered aggregate over the same rows, never from adding
18814
+ * `kinds` up. A row whose stored `kind` is not in the enum (written by a
18815
+ * retired code path, or by a version that knew a kind this one does not) would
18816
+ * otherwise vanish from the total silently, and an operator would delete
18817
+ * against a denominator smaller than the disk.
18818
+ *
18819
+ * `unaccountedRows` / `unaccountedBytes` are the difference. They are normally
18820
+ * zero; a non-zero value is a real finding and must be shown, not rounded away.
18821
+ */
18822
+ var EventMediaKindBreakdownSchema = object({
18823
+ /** Every media row in scope, from one unfiltered aggregate. */
18824
+ totalRows: number().int(),
18825
+ /** Every media byte in scope, from that same aggregate. */
18826
+ totalBytes: number().int(),
18827
+ /** Per-kind footprint, ordered by bytes descending. */
18828
+ kinds: array(EventMediaKindFootprintSchema).readonly(),
18829
+ /** `totalRows` minus the summed `kinds` rows — see the schema note. */
18830
+ unaccountedRows: number().int(),
18831
+ /** `totalBytes` minus the summed `kinds` bytes — see the schema note. */
18832
+ unaccountedBytes: number().int()
18833
+ });
18790
18834
  /** Per-kind counts returned by the event-prune / device-delete mutations. */
18791
18835
  var EventPruneCountsSchema = object({
18792
18836
  motion: number().int(),
@@ -18990,6 +19034,9 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
18990
19034
  }), TrackFlagsSchema, { kind: "mutation" }), method(object({}), EventStoreFootprintSchema, {
18991
19035
  kind: "query",
18992
19036
  auth: "admin"
19037
+ }), method(object({ deviceId: number().int().optional() }), EventMediaKindBreakdownSchema, {
19038
+ kind: "query",
19039
+ auth: "admin"
18993
19040
  }), method(object({
18994
19041
  olderThanMs: number(),
18995
19042
  reason: OpsLogReasonSchema.optional()
@@ -20941,6 +20988,20 @@ method(object({
20941
20988
  error: string().optional()
20942
20989
  }), { auth: "admin" }), method(_void(), array(ProviderListEntrySchema).readonly()), method(object({
20943
20990
  providerId: string(),
20991
+ /**
20992
+ * The location this config is an UNSAVED edit of, when there is one.
20993
+ *
20994
+ * `listLocations` replaces every declared secret with the redaction
20995
+ * sentinel, so the edit modal's form state holds the sentinel for any
20996
+ * credential the operator did not retype — and posting that here
20997
+ * without a way to resolve it makes the provider try to authenticate
20998
+ * as `__camstack_redacted__` and report the operator's own working
20999
+ * password as wrong. Given this id, the orchestrator restores each
21000
+ * sentinel from the stored config (same rule as `upsertLocation`)
21001
+ * before dispatching. Omitted by the "Add location" wizard, where
21002
+ * every value was typed just now and nothing is stored yet.
21003
+ */
21004
+ locationId: string().optional(),
20944
21005
  config: record(string(), unknown())
20945
21006
  }), object({
20946
21007
  ok: boolean(),
@@ -31656,6 +31717,12 @@ Object.freeze({
31656
31717
  addonId: null,
31657
31718
  access: "view"
31658
31719
  },
31720
+ "pipelineAnalytics.getEventMediaFootprintByKind": {
31721
+ capName: "pipeline-analytics",
31722
+ capScope: "device",
31723
+ addonId: null,
31724
+ access: "view"
31725
+ },
31659
31726
  "pipelineAnalytics.getEventStoreFootprint": {
31660
31727
  capName: "pipeline-analytics",
31661
31728
  capScope: "device",
@@ -35321,6 +35388,11 @@ Object.freeze({
35321
35388
  form: "single",
35322
35389
  optional: false
35323
35390
  }],
35391
+ "pipelineAnalytics.getEventMediaFootprintByKind": [{
35392
+ name: "deviceId",
35393
+ form: "single",
35394
+ optional: true
35395
+ }],
35324
35396
  "pipelineAnalytics.getGroup": [{
35325
35397
  name: "deviceId",
35326
35398
  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-CJS8Mo7l.js");
5
+ const require_dist = require("../dist-D4Kv7xGB.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-BO7-LQSt.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability } from "../dist-r9nSS25r.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.47",
3
+ "version": "1.2.48",
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",