@camstack/addon-tailscale 1.2.30 → 1.2.31

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-BEvrmXjC.js");
27
+ const require_dist = require("../dist-BWD82LMY.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-DfeU-Wem.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability, r as BOOT_RECOVERY_BACKOFF_MS, t as meshNetworkCapability } from "../dist-BX0XBnDk.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";
@@ -15514,7 +15514,23 @@ var NcHistoryEntrySchema = object({
15514
15514
  updatedAt: number(),
15515
15515
  /** Failure detail — present on a `dead` row. */
15516
15516
  error: string().optional(),
15517
- subject: NcHistorySubjectSchema
15517
+ subject: NcHistorySubjectSchema,
15518
+ /**
15519
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15520
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15521
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15522
+ * every delivery attempt). Absent on a row still pending/dead, a row
15523
+ * delivered before this field shipped, or a wiring with no artefact index.
15524
+ *
15525
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15526
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15527
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15528
+ * also answers `null` for an id whose artefact has since expired past the
15529
+ * retained shelf's own age bound — the degrade a caller (the Home
15530
+ * Assistant export) must render as "no image right now", never as a
15531
+ * broken link.
15532
+ */
15533
+ artifactIds: array(string().min(1)).optional()
15518
15534
  });
15519
15535
  /**
15520
15536
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -15741,7 +15757,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
15741
15757
  }), method(object({}), object({
15742
15758
  catalog: array(NcConditionDescriptorSchema),
15743
15759
  taxonomy: NcTaxonomySchema.optional()
15744
- })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15760
+ })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string().min(1) }), object({ url: string().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15745
15761
  kind: "mutation",
15746
15762
  caller: "required"
15747
15763
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -25094,6 +25110,39 @@ var ReadGopBytesResultSchema = object({
25094
25110
  /** Media ms the returned fragment covers. */
25095
25111
  gopDurMs: number()
25096
25112
  });
25113
+ /**
25114
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
25115
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
25116
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
25117
+ * a replay needs several seconds of native pixels, not one frame.
25118
+ *
25119
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
25120
+ * is `false` when the returned bytes were cut short by the read's own safety
25121
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
25122
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
25123
+ * degradation: a window whose end falls past the covering segment would need
25124
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
25125
+ * not one standalone-demuxable stream — the caller's answer is to request a
25126
+ * shorter window or one aligned to a single segment, not to receive spliced
25127
+ * bytes nothing has proven decodable.
25128
+ */
25129
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
25130
+ kind: literal("ok"),
25131
+ data: _instanceof(Uint8Array),
25132
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
25133
+ * the requested `fromMs` (anchored on the nearest keyframe). */
25134
+ gopStartMs: number(),
25135
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
25136
+ gopDurMs: number(),
25137
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
25138
+ * the requested `toMs`; the caller got fewer frames than asked for. */
25139
+ reachesRequestedEnd: boolean()
25140
+ }), object({
25141
+ kind: literal("spans-multiple-segments"),
25142
+ /** Where the covering segment's own footage runs out — informational,
25143
+ * not a retry hint (retrying the same window would refuse again). */
25144
+ segmentEndMs: number()
25145
+ })]);
25097
25146
  method(object({
25098
25147
  deviceId: number(),
25099
25148
  fromMs: number(),
@@ -25144,6 +25193,15 @@ method(object({
25144
25193
  }), ReadGopBytesResultSchema, {
25145
25194
  kind: "query",
25146
25195
  auth: "admin"
25196
+ }), method(object({
25197
+ deviceId: number(),
25198
+ profile: string(),
25199
+ startMs: number(),
25200
+ fromMs: number(),
25201
+ toMs: number()
25202
+ }), ReadWindowBytesResultSchema, {
25203
+ kind: "query",
25204
+ auth: "admin"
25147
25205
  }), method(object({
25148
25206
  deviceId: number(),
25149
25207
  config: RecordingConfigSchema
@@ -29562,6 +29620,12 @@ Object.freeze({
29562
29620
  addonId: null,
29563
29621
  access: "view"
29564
29622
  },
29623
+ "notificationRules.resolveArtifactUrl": {
29624
+ capName: "notification-rules",
29625
+ capScope: "system",
29626
+ addonId: null,
29627
+ access: "view"
29628
+ },
29565
29629
  "notificationRules.setAlarmConfig": {
29566
29630
  capName: "notification-rules",
29567
29631
  capScope: "system",
@@ -30966,6 +31030,12 @@ Object.freeze({
30966
31030
  addonId: null,
30967
31031
  access: "view"
30968
31032
  },
31033
+ "recording.readWindowBytes": {
31034
+ capName: "recording",
31035
+ capScope: "system",
31036
+ addonId: null,
31037
+ access: "view"
31038
+ },
30969
31039
  "recording.refreshStorageLocationsForMigration": {
30970
31040
  capName: "recording",
30971
31041
  capScope: "system",
@@ -33796,6 +33866,11 @@ Object.freeze({
33796
33866
  form: "single",
33797
33867
  optional: false
33798
33868
  }],
33869
+ "recording.readWindowBytes": [{
33870
+ name: "deviceId",
33871
+ form: "single",
33872
+ optional: false
33873
+ }],
33799
33874
  "recording.relocateFootage": [{
33800
33875
  name: "deviceId",
33801
33876
  form: "single",
@@ -15514,7 +15514,23 @@ var NcHistoryEntrySchema = object({
15514
15514
  updatedAt: number(),
15515
15515
  /** Failure detail — present on a `dead` row. */
15516
15516
  error: string().optional(),
15517
- subject: NcHistorySubjectSchema
15517
+ subject: NcHistorySubjectSchema,
15518
+ /**
15519
+ * Ids of the artefacts (still, then gif, then clip) this row's successful
15520
+ * delivery indexed in the artefact library — a REFERENCE, never the bytes
15521
+ * (an artefact is often megabytes; this row is durable JSON rewritten on
15522
+ * every delivery attempt). Absent on a row still pending/dead, a row
15523
+ * delivered before this field shipped, or a wiring with no artefact index.
15524
+ *
15525
+ * Resolve one to a fetchable URL with `resolveArtifactUrl` — an id
15526
+ * outlives any one URL's TTL, so a caller mints a fresh link on demand
15527
+ * rather than trusting one frozen at delivery time. `resolveArtifactUrl`
15528
+ * also answers `null` for an id whose artefact has since expired past the
15529
+ * retained shelf's own age bound — the degrade a caller (the Home
15530
+ * Assistant export) must render as "no image right now", never as a
15531
+ * broken link.
15532
+ */
15533
+ artifactIds: array(string().min(1)).optional()
15518
15534
  });
15519
15535
  /**
15520
15536
  * Query filter for `getHistory` (spec §4.2). Every field is a narrowing
@@ -15741,7 +15757,7 @@ method(object({}), object({ rules: array(NcRuleSchema) }), { auth: "admin" }), m
15741
15757
  }), method(object({}), object({
15742
15758
  catalog: array(NcConditionDescriptorSchema),
15743
15759
  taxonomy: NcTaxonomySchema.optional()
15744
- })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15760
+ })), method(object({ filter: NcHistoryFilterSchema.default({ limit: 100 }) }), object({ entries: array(NcHistoryEntrySchema) }), { auth: "admin" }), method(object({ artifactId: string().min(1) }), object({ url: string().nullable() }), { auth: "admin" }), method(object({}), object({ snoozes: array(NcSnoozeSchema) }), { caller: "required" }), method(object({ snooze: NcSnoozeInputSchema }), object({ snooze: NcSnoozeSchema }), {
15745
15761
  kind: "mutation",
15746
15762
  caller: "required"
15747
15763
  }), method(object({ snoozeId: string() }), object({ success: literal(true) }), {
@@ -25094,6 +25110,39 @@ var ReadGopBytesResultSchema = object({
25094
25110
  /** Media ms the returned fragment covers. */
25095
25111
  gopDurMs: number()
25096
25112
  });
25113
+ /**
25114
+ * A time WINDOW of one finalized segment, cut by byte range — the multi-GOP
25115
+ * twin of {@link ReadGopBytesResultSchema}'s single instant. Built for the
25116
+ * replay clip's `recording` source (`docs/design/plans/2026-08-26-replay-clip-su-pipeline.md`):
25117
+ * a replay needs several seconds of native pixels, not one frame.
25118
+ *
25119
+ * `ok.data` is standalone-demuxable, same as a GOP read. `ok.reachesRequestedEnd`
25120
+ * is `false` when the returned bytes were cut short by the read's own safety
25121
+ * byte cap before covering `[fromMs, toMs)` — a truncation, reported, not a
25122
+ * silently shorter answer. `spans-multiple-segments` is a REFUSAL, not a
25123
+ * degradation: a window whose end falls past the covering segment would need
25124
+ * bytes stitched from a second segment file (its own `ftyp`+`moov`), which is
25125
+ * not one standalone-demuxable stream — the caller's answer is to request a
25126
+ * shorter window or one aligned to a single segment, not to receive spliced
25127
+ * bytes nothing has proven decodable.
25128
+ */
25129
+ var ReadWindowBytesResultSchema = discriminatedUnion("kind", [object({
25130
+ kind: literal("ok"),
25131
+ data: _instanceof(Uint8Array),
25132
+ /** Absolute epoch ms of the returned bytes' first sample — at or before
25133
+ * the requested `fromMs` (anchored on the nearest keyframe). */
25134
+ gopStartMs: number(),
25135
+ /** Media ms the returned bytes cover, from `gopStartMs`. */
25136
+ gopDurMs: number(),
25137
+ /** `false` ⇒ the safety byte cap cut the read short before it reached
25138
+ * the requested `toMs`; the caller got fewer frames than asked for. */
25139
+ reachesRequestedEnd: boolean()
25140
+ }), object({
25141
+ kind: literal("spans-multiple-segments"),
25142
+ /** Where the covering segment's own footage runs out — informational,
25143
+ * not a retry hint (retrying the same window would refuse again). */
25144
+ segmentEndMs: number()
25145
+ })]);
25097
25146
  method(object({
25098
25147
  deviceId: number(),
25099
25148
  fromMs: number(),
@@ -25144,6 +25193,15 @@ method(object({
25144
25193
  }), ReadGopBytesResultSchema, {
25145
25194
  kind: "query",
25146
25195
  auth: "admin"
25196
+ }), method(object({
25197
+ deviceId: number(),
25198
+ profile: string(),
25199
+ startMs: number(),
25200
+ fromMs: number(),
25201
+ toMs: number()
25202
+ }), ReadWindowBytesResultSchema, {
25203
+ kind: "query",
25204
+ auth: "admin"
25147
25205
  }), method(object({
25148
25206
  deviceId: number(),
25149
25207
  config: RecordingConfigSchema
@@ -29562,6 +29620,12 @@ Object.freeze({
29562
29620
  addonId: null,
29563
29621
  access: "view"
29564
29622
  },
29623
+ "notificationRules.resolveArtifactUrl": {
29624
+ capName: "notification-rules",
29625
+ capScope: "system",
29626
+ addonId: null,
29627
+ access: "view"
29628
+ },
29565
29629
  "notificationRules.setAlarmConfig": {
29566
29630
  capName: "notification-rules",
29567
29631
  capScope: "system",
@@ -30966,6 +31030,12 @@ Object.freeze({
30966
31030
  addonId: null,
30967
31031
  access: "view"
30968
31032
  },
31033
+ "recording.readWindowBytes": {
31034
+ capName: "recording",
31035
+ capScope: "system",
31036
+ addonId: null,
31037
+ access: "view"
31038
+ },
30969
31039
  "recording.refreshStorageLocationsForMigration": {
30970
31040
  capName: "recording",
30971
31041
  capScope: "system",
@@ -33796,6 +33866,11 @@ Object.freeze({
33796
33866
  form: "single",
33797
33867
  optional: false
33798
33868
  }],
33869
+ "recording.readWindowBytes": [{
33870
+ name: "deviceId",
33871
+ form: "single",
33872
+ optional: false
33873
+ }],
33799
33874
  "recording.relocateFootage": [{
33800
33875
  name: "deviceId",
33801
33876
  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-BEvrmXjC.js");
5
+ const require_dist = require("../dist-BWD82LMY.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-DfeU-Wem.mjs";
1
+ import { a as EventCategory, i as BaseAddon, n as networkAccessCapability } from "../dist-BX0XBnDk.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.30",
3
+ "version": "1.2.31",
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",