@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.
- package/dist/client/tailscale.addon.js +1 -1
- package/dist/client/tailscale.addon.mjs +1 -1
- package/dist/{dist-BEvrmXjC.js → dist-BWD82LMY.js} +77 -2
- package/dist/{dist-DfeU-Wem.mjs → dist-BX0XBnDk.mjs} +77 -2
- package/dist/ingress/tailscale-ingress.addon.js +1 -1
- package/dist/ingress/tailscale-ingress.addon.mjs +1 -1
- package/package.json +1 -1
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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.
|
|
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",
|