@camstack/addon-tailscale 1.2.51 → 1.2.53
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-DZmp04sL.js → dist-BFbW-DND.js} +153 -8
- package/dist/{dist-CLEhB-7g.mjs → dist-DCvDQ86T.mjs} +153 -8
- 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-BFbW-DND.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-DCvDQ86T.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";
|
|
@@ -7735,7 +7735,8 @@ var OpsLogReasonSchema = _enum([
|
|
|
7735
7735
|
"quota",
|
|
7736
7736
|
"manual",
|
|
7737
7737
|
"operator",
|
|
7738
|
-
"maintenance"
|
|
7738
|
+
"maintenance",
|
|
7739
|
+
"orphaned-device"
|
|
7739
7740
|
]);
|
|
7740
7741
|
/** One audit row, shared verbatim by both domains. */
|
|
7741
7742
|
var OpsLogEntrySchema = object({
|
|
@@ -12766,10 +12767,39 @@ var DevicePersistConfigPayloadSchema = object({
|
|
|
12766
12767
|
deviceId: number(),
|
|
12767
12768
|
data: record(string(), unknown())
|
|
12768
12769
|
});
|
|
12770
|
+
/** What a migration actually did, per switch. `unreachable` is a first-class
|
|
12771
|
+
* answer: a camera that could not be asked is not a camera that was silenced. */
|
|
12772
|
+
var MigrateSwitchOutcomeSchema = _enum([
|
|
12773
|
+
"off",
|
|
12774
|
+
"on",
|
|
12775
|
+
"not-offered",
|
|
12776
|
+
"unreachable"
|
|
12777
|
+
]);
|
|
12778
|
+
var MigrateSwitchReportSchema = object({
|
|
12779
|
+
deviceId: number(),
|
|
12780
|
+
switchId: CameraSwitchIdSchema,
|
|
12781
|
+
outcome: MigrateSwitchOutcomeSchema,
|
|
12782
|
+
detail: string().optional()
|
|
12783
|
+
});
|
|
12784
|
+
var MigrateDeviceResultSchema = object({
|
|
12785
|
+
sourceId: number(),
|
|
12786
|
+
targetId: number(),
|
|
12787
|
+
switches: array(MigrateSwitchReportSchema).readonly(),
|
|
12788
|
+
/** Switches that could NOT be turned off on the source. Empty is the only
|
|
12789
|
+
* value meaning the replaced hardware is quiet. */
|
|
12790
|
+
sourceStillLive: array(CameraSwitchIdSchema).readonly(),
|
|
12791
|
+
swapped: boolean()
|
|
12792
|
+
});
|
|
12769
12793
|
method(object({
|
|
12770
12794
|
addonId: string(),
|
|
12771
12795
|
stableId: string()
|
|
12772
|
-
}), object({ id: number() }), { kind: "mutation" }), method(
|
|
12796
|
+
}), object({ id: number() }), { kind: "mutation" }), method(object({
|
|
12797
|
+
sourceId: number(),
|
|
12798
|
+
targetId: number()
|
|
12799
|
+
}), MigrateDeviceResultSchema, {
|
|
12800
|
+
kind: "mutation",
|
|
12801
|
+
auth: "admin"
|
|
12802
|
+
}), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
|
|
12773
12803
|
deviceId: number(),
|
|
12774
12804
|
name: string()
|
|
12775
12805
|
}), _void(), {
|
|
@@ -18883,6 +18913,34 @@ var KeyEventsForDeviceSchema = object({
|
|
|
18883
18913
|
deviceId: number(),
|
|
18884
18914
|
events: array(KeyEventSchema).readonly()
|
|
18885
18915
|
});
|
|
18916
|
+
/** One non-empty bucket of the timeline histogram. */
|
|
18917
|
+
var EventDensityBucketSchema = object({
|
|
18918
|
+
bucketStart: number(),
|
|
18919
|
+
motion: number().int(),
|
|
18920
|
+
object: number().int(),
|
|
18921
|
+
audio: number().int()
|
|
18922
|
+
});
|
|
18923
|
+
/**
|
|
18924
|
+
* One camera's row in a `getEventDensityBatch` answer.
|
|
18925
|
+
*
|
|
18926
|
+
* TWO facts, and the timeline draws them differently:
|
|
18927
|
+
*
|
|
18928
|
+
* - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
|
|
18929
|
+
* claim: read, and nothing happened in the window.
|
|
18930
|
+
* - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
|
|
18931
|
+
* empty and that emptiness means NOTHING; the timeline must render unknown,
|
|
18932
|
+
* not quiet.
|
|
18933
|
+
*
|
|
18934
|
+
* Fanned out per camera the difference was free — one query rejected while the
|
|
18935
|
+
* others resolved — and collapsing to a batch is the exact moment it is lost
|
|
18936
|
+
* silently. Every requested id gets a row: a caller that asked for twelve and
|
|
18937
|
+
* got eleven cannot tell which one is missing, or that any is.
|
|
18938
|
+
*/
|
|
18939
|
+
var EventDensityForDeviceSchema = object({
|
|
18940
|
+
deviceId: number(),
|
|
18941
|
+
read: _enum(["read", "unreadable"]),
|
|
18942
|
+
buckets: array(EventDensityBucketSchema).readonly()
|
|
18943
|
+
});
|
|
18886
18944
|
object({
|
|
18887
18945
|
trackId: string(),
|
|
18888
18946
|
className: string(),
|
|
@@ -19193,12 +19251,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19193
19251
|
since: number(),
|
|
19194
19252
|
until: number(),
|
|
19195
19253
|
bucketMs: number().int().positive()
|
|
19196
|
-
}), array(object({
|
|
19197
|
-
|
|
19198
|
-
|
|
19199
|
-
|
|
19200
|
-
|
|
19201
|
-
})).readonly()), method(object({
|
|
19254
|
+
}), array(EventDensityBucketSchema).readonly()), method(object({
|
|
19255
|
+
deviceIds: array(number()).min(1).max(200),
|
|
19256
|
+
since: number(),
|
|
19257
|
+
until: number(),
|
|
19258
|
+
bucketMs: number().int().positive()
|
|
19259
|
+
}), array(EventDensityForDeviceSchema).readonly()), method(object({
|
|
19202
19260
|
deviceId: number(),
|
|
19203
19261
|
cutoffMs: number()
|
|
19204
19262
|
}), object({
|
|
@@ -26569,6 +26627,39 @@ var RecordingDaysSchema = object({
|
|
|
26569
26627
|
/** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
|
|
26570
26628
|
days: array(number())
|
|
26571
26629
|
});
|
|
26630
|
+
/**
|
|
26631
|
+
* One camera's row in a `getAvailabilityBatch` answer.
|
|
26632
|
+
*
|
|
26633
|
+
* `ranges` is EXACTLY what `getAvailability` returns for that camera — the
|
|
26634
|
+
* batch collapses the transport, not the work — plus the one thing the singular
|
|
26635
|
+
* method never had to say:
|
|
26636
|
+
*
|
|
26637
|
+
* - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
|
|
26638
|
+
* no footage in the window", which is a real claim.
|
|
26639
|
+
* - `read: 'unreadable'` — the recorder could not answer for this camera (its
|
|
26640
|
+
* calendar rung threw, its location is unmounted). `ranges` is empty and
|
|
26641
|
+
* that emptiness means NOTHING.
|
|
26642
|
+
*
|
|
26643
|
+
* A timeline that renders the second as the first tells an operator there is no
|
|
26644
|
+
* footage when the truth is that nobody looked.
|
|
26645
|
+
*/
|
|
26646
|
+
var RecordingAvailabilityForDeviceSchema = object({
|
|
26647
|
+
deviceId: number(),
|
|
26648
|
+
read: _enum(["read", "unreadable"]),
|
|
26649
|
+
ranges: array(RecordingRangeSchema).readonly()
|
|
26650
|
+
});
|
|
26651
|
+
/**
|
|
26652
|
+
* One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
|
|
26653
|
+
* {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
|
|
26654
|
+
* "no footage in this month", `read: 'unreadable'` is "nobody could look", and
|
|
26655
|
+
* the date-picker's day dots must not spell them the same.
|
|
26656
|
+
*/
|
|
26657
|
+
var RecordingDaysForDeviceSchema = object({
|
|
26658
|
+
deviceId: number(),
|
|
26659
|
+
read: _enum(["read", "unreadable"]),
|
|
26660
|
+
/** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
|
|
26661
|
+
days: array(number()).readonly()
|
|
26662
|
+
});
|
|
26572
26663
|
var RecordingManifestSchema = object({
|
|
26573
26664
|
deviceId: number(),
|
|
26574
26665
|
/** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
|
|
@@ -26803,6 +26894,13 @@ method(object({
|
|
|
26803
26894
|
}), RecordingAvailabilitySchema, {
|
|
26804
26895
|
kind: "query",
|
|
26805
26896
|
auth: "protected"
|
|
26897
|
+
}), method(object({
|
|
26898
|
+
deviceIds: array(number()).min(1).max(200),
|
|
26899
|
+
fromMs: number(),
|
|
26900
|
+
toMs: number()
|
|
26901
|
+
}), array(RecordingAvailabilityForDeviceSchema).readonly(), {
|
|
26902
|
+
kind: "query",
|
|
26903
|
+
auth: "protected"
|
|
26806
26904
|
}), method(object({
|
|
26807
26905
|
deviceId: number(),
|
|
26808
26906
|
fromMs: number(),
|
|
@@ -26811,6 +26909,14 @@ method(object({
|
|
|
26811
26909
|
}), RecordingDaysSchema, {
|
|
26812
26910
|
kind: "query",
|
|
26813
26911
|
auth: "protected"
|
|
26912
|
+
}), method(object({
|
|
26913
|
+
deviceIds: array(number()).min(1).max(200),
|
|
26914
|
+
fromMs: number(),
|
|
26915
|
+
toMs: number(),
|
|
26916
|
+
tzOffsetMinutes: number()
|
|
26917
|
+
}), array(RecordingDaysForDeviceSchema).readonly(), {
|
|
26918
|
+
kind: "query",
|
|
26919
|
+
auth: "protected"
|
|
26814
26920
|
}), method(object({
|
|
26815
26921
|
deviceId: number(),
|
|
26816
26922
|
fromMs: number(),
|
|
@@ -30274,6 +30380,12 @@ Object.freeze({
|
|
|
30274
30380
|
addonId: null,
|
|
30275
30381
|
access: "view"
|
|
30276
30382
|
},
|
|
30383
|
+
"deviceManager.migrateDevice": {
|
|
30384
|
+
capName: "device-manager",
|
|
30385
|
+
capScope: "system",
|
|
30386
|
+
addonId: null,
|
|
30387
|
+
access: "create"
|
|
30388
|
+
},
|
|
30277
30389
|
"deviceManager.persistConfig": {
|
|
30278
30390
|
capName: "device-manager",
|
|
30279
30391
|
capScope: "system",
|
|
@@ -32008,6 +32120,12 @@ Object.freeze({
|
|
|
32008
32120
|
addonId: null,
|
|
32009
32121
|
access: "view"
|
|
32010
32122
|
},
|
|
32123
|
+
"pipelineAnalytics.getEventDensityBatch": {
|
|
32124
|
+
capName: "pipeline-analytics",
|
|
32125
|
+
capScope: "device",
|
|
32126
|
+
addonId: null,
|
|
32127
|
+
access: "view"
|
|
32128
|
+
},
|
|
32011
32129
|
"pipelineAnalytics.getEventMedia": {
|
|
32012
32130
|
capName: "pipeline-analytics",
|
|
32013
32131
|
capScope: "device",
|
|
@@ -33130,12 +33248,24 @@ Object.freeze({
|
|
|
33130
33248
|
addonId: null,
|
|
33131
33249
|
access: "view"
|
|
33132
33250
|
},
|
|
33251
|
+
"recording.getAvailabilityBatch": {
|
|
33252
|
+
capName: "recording",
|
|
33253
|
+
capScope: "system",
|
|
33254
|
+
addonId: null,
|
|
33255
|
+
access: "view"
|
|
33256
|
+
},
|
|
33133
33257
|
"recording.getDaysWithRecordings": {
|
|
33134
33258
|
capName: "recording",
|
|
33135
33259
|
capScope: "system",
|
|
33136
33260
|
addonId: null,
|
|
33137
33261
|
access: "view"
|
|
33138
33262
|
},
|
|
33263
|
+
"recording.getDaysWithRecordingsBatch": {
|
|
33264
|
+
capName: "recording",
|
|
33265
|
+
capScope: "system",
|
|
33266
|
+
addonId: null,
|
|
33267
|
+
access: "view"
|
|
33268
|
+
},
|
|
33139
33269
|
"recording.getDeviceConfig": {
|
|
33140
33270
|
capName: "recording",
|
|
33141
33271
|
capScope: "system",
|
|
@@ -35740,6 +35870,11 @@ Object.freeze({
|
|
|
35740
35870
|
form: "single",
|
|
35741
35871
|
optional: false
|
|
35742
35872
|
}],
|
|
35873
|
+
"pipelineAnalytics.getEventDensityBatch": [{
|
|
35874
|
+
name: "deviceIds",
|
|
35875
|
+
form: "array",
|
|
35876
|
+
optional: false
|
|
35877
|
+
}],
|
|
35743
35878
|
"pipelineAnalytics.getEventMedia": [{
|
|
35744
35879
|
name: "deviceId",
|
|
35745
35880
|
form: "single",
|
|
@@ -36155,11 +36290,21 @@ Object.freeze({
|
|
|
36155
36290
|
form: "single",
|
|
36156
36291
|
optional: false
|
|
36157
36292
|
}],
|
|
36293
|
+
"recording.getAvailabilityBatch": [{
|
|
36294
|
+
name: "deviceIds",
|
|
36295
|
+
form: "array",
|
|
36296
|
+
optional: false
|
|
36297
|
+
}],
|
|
36158
36298
|
"recording.getDaysWithRecordings": [{
|
|
36159
36299
|
name: "deviceId",
|
|
36160
36300
|
form: "single",
|
|
36161
36301
|
optional: false
|
|
36162
36302
|
}],
|
|
36303
|
+
"recording.getDaysWithRecordingsBatch": [{
|
|
36304
|
+
name: "deviceIds",
|
|
36305
|
+
form: "array",
|
|
36306
|
+
optional: false
|
|
36307
|
+
}],
|
|
36163
36308
|
"recording.getDeviceConfig": [{
|
|
36164
36309
|
name: "deviceId",
|
|
36165
36310
|
form: "single",
|
|
@@ -7735,7 +7735,8 @@ var OpsLogReasonSchema = _enum([
|
|
|
7735
7735
|
"quota",
|
|
7736
7736
|
"manual",
|
|
7737
7737
|
"operator",
|
|
7738
|
-
"maintenance"
|
|
7738
|
+
"maintenance",
|
|
7739
|
+
"orphaned-device"
|
|
7739
7740
|
]);
|
|
7740
7741
|
/** One audit row, shared verbatim by both domains. */
|
|
7741
7742
|
var OpsLogEntrySchema = object({
|
|
@@ -12766,10 +12767,39 @@ var DevicePersistConfigPayloadSchema = object({
|
|
|
12766
12767
|
deviceId: number(),
|
|
12767
12768
|
data: record(string(), unknown())
|
|
12768
12769
|
});
|
|
12770
|
+
/** What a migration actually did, per switch. `unreachable` is a first-class
|
|
12771
|
+
* answer: a camera that could not be asked is not a camera that was silenced. */
|
|
12772
|
+
var MigrateSwitchOutcomeSchema = _enum([
|
|
12773
|
+
"off",
|
|
12774
|
+
"on",
|
|
12775
|
+
"not-offered",
|
|
12776
|
+
"unreachable"
|
|
12777
|
+
]);
|
|
12778
|
+
var MigrateSwitchReportSchema = object({
|
|
12779
|
+
deviceId: number(),
|
|
12780
|
+
switchId: CameraSwitchIdSchema,
|
|
12781
|
+
outcome: MigrateSwitchOutcomeSchema,
|
|
12782
|
+
detail: string().optional()
|
|
12783
|
+
});
|
|
12784
|
+
var MigrateDeviceResultSchema = object({
|
|
12785
|
+
sourceId: number(),
|
|
12786
|
+
targetId: number(),
|
|
12787
|
+
switches: array(MigrateSwitchReportSchema).readonly(),
|
|
12788
|
+
/** Switches that could NOT be turned off on the source. Empty is the only
|
|
12789
|
+
* value meaning the replaced hardware is quiet. */
|
|
12790
|
+
sourceStillLive: array(CameraSwitchIdSchema).readonly(),
|
|
12791
|
+
swapped: boolean()
|
|
12792
|
+
});
|
|
12769
12793
|
method(object({
|
|
12770
12794
|
addonId: string(),
|
|
12771
12795
|
stableId: string()
|
|
12772
|
-
}), object({ id: number() }), { kind: "mutation" }), method(
|
|
12796
|
+
}), object({ id: number() }), { kind: "mutation" }), method(object({
|
|
12797
|
+
sourceId: number(),
|
|
12798
|
+
targetId: number()
|
|
12799
|
+
}), MigrateDeviceResultSchema, {
|
|
12800
|
+
kind: "mutation",
|
|
12801
|
+
auth: "admin"
|
|
12802
|
+
}), method(DeviceRegisterPayloadSchema, _void(), { kind: "mutation" }), method(DeviceRemovePayloadSchema, _void(), { kind: "mutation" }), method(DevicePersistConfigPayloadSchema, _void(), { kind: "mutation" }), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), record(string(), unknown())), method(object({ deviceId: number() }), DeviceMetaSchema.nullable()), method(object({
|
|
12773
12803
|
deviceId: number(),
|
|
12774
12804
|
name: string()
|
|
12775
12805
|
}), _void(), {
|
|
@@ -18883,6 +18913,34 @@ var KeyEventsForDeviceSchema = object({
|
|
|
18883
18913
|
deviceId: number(),
|
|
18884
18914
|
events: array(KeyEventSchema).readonly()
|
|
18885
18915
|
});
|
|
18916
|
+
/** One non-empty bucket of the timeline histogram. */
|
|
18917
|
+
var EventDensityBucketSchema = object({
|
|
18918
|
+
bucketStart: number(),
|
|
18919
|
+
motion: number().int(),
|
|
18920
|
+
object: number().int(),
|
|
18921
|
+
audio: number().int()
|
|
18922
|
+
});
|
|
18923
|
+
/**
|
|
18924
|
+
* One camera's row in a `getEventDensityBatch` answer.
|
|
18925
|
+
*
|
|
18926
|
+
* TWO facts, and the timeline draws them differently:
|
|
18927
|
+
*
|
|
18928
|
+
* - `read: 'read'` — the histogram for this camera. `buckets: []` is a real
|
|
18929
|
+
* claim: read, and nothing happened in the window.
|
|
18930
|
+
* - `read: 'unreadable'` — nobody could answer for this camera. `buckets` is
|
|
18931
|
+
* empty and that emptiness means NOTHING; the timeline must render unknown,
|
|
18932
|
+
* not quiet.
|
|
18933
|
+
*
|
|
18934
|
+
* Fanned out per camera the difference was free — one query rejected while the
|
|
18935
|
+
* others resolved — and collapsing to a batch is the exact moment it is lost
|
|
18936
|
+
* silently. Every requested id gets a row: a caller that asked for twelve and
|
|
18937
|
+
* got eleven cannot tell which one is missing, or that any is.
|
|
18938
|
+
*/
|
|
18939
|
+
var EventDensityForDeviceSchema = object({
|
|
18940
|
+
deviceId: number(),
|
|
18941
|
+
read: _enum(["read", "unreadable"]),
|
|
18942
|
+
buckets: array(EventDensityBucketSchema).readonly()
|
|
18943
|
+
});
|
|
18886
18944
|
object({
|
|
18887
18945
|
trackId: string(),
|
|
18888
18946
|
className: string(),
|
|
@@ -19193,12 +19251,12 @@ DeviceType.Camera, method(object({ deviceId: number() }), array(TrackSchema).rea
|
|
|
19193
19251
|
since: number(),
|
|
19194
19252
|
until: number(),
|
|
19195
19253
|
bucketMs: number().int().positive()
|
|
19196
|
-
}), array(object({
|
|
19197
|
-
|
|
19198
|
-
|
|
19199
|
-
|
|
19200
|
-
|
|
19201
|
-
})).readonly()), method(object({
|
|
19254
|
+
}), array(EventDensityBucketSchema).readonly()), method(object({
|
|
19255
|
+
deviceIds: array(number()).min(1).max(200),
|
|
19256
|
+
since: number(),
|
|
19257
|
+
until: number(),
|
|
19258
|
+
bucketMs: number().int().positive()
|
|
19259
|
+
}), array(EventDensityForDeviceSchema).readonly()), method(object({
|
|
19202
19260
|
deviceId: number(),
|
|
19203
19261
|
cutoffMs: number()
|
|
19204
19262
|
}), object({
|
|
@@ -26569,6 +26627,39 @@ var RecordingDaysSchema = object({
|
|
|
26569
26627
|
/** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
|
|
26570
26628
|
days: array(number())
|
|
26571
26629
|
});
|
|
26630
|
+
/**
|
|
26631
|
+
* One camera's row in a `getAvailabilityBatch` answer.
|
|
26632
|
+
*
|
|
26633
|
+
* `ranges` is EXACTLY what `getAvailability` returns for that camera — the
|
|
26634
|
+
* batch collapses the transport, not the work — plus the one thing the singular
|
|
26635
|
+
* method never had to say:
|
|
26636
|
+
*
|
|
26637
|
+
* - `read: 'read'` — answered. `ranges: []` means "read, and this camera has
|
|
26638
|
+
* no footage in the window", which is a real claim.
|
|
26639
|
+
* - `read: 'unreadable'` — the recorder could not answer for this camera (its
|
|
26640
|
+
* calendar rung threw, its location is unmounted). `ranges` is empty and
|
|
26641
|
+
* that emptiness means NOTHING.
|
|
26642
|
+
*
|
|
26643
|
+
* A timeline that renders the second as the first tells an operator there is no
|
|
26644
|
+
* footage when the truth is that nobody looked.
|
|
26645
|
+
*/
|
|
26646
|
+
var RecordingAvailabilityForDeviceSchema = object({
|
|
26647
|
+
deviceId: number(),
|
|
26648
|
+
read: _enum(["read", "unreadable"]),
|
|
26649
|
+
ranges: array(RecordingRangeSchema).readonly()
|
|
26650
|
+
});
|
|
26651
|
+
/**
|
|
26652
|
+
* One camera's row in a `getDaysWithRecordingsBatch` answer. Same rule as
|
|
26653
|
+
* {@link RecordingAvailabilityForDeviceSchema}: `days: []` on a `'read'` row is
|
|
26654
|
+
* "no footage in this month", `read: 'unreadable'` is "nobody could look", and
|
|
26655
|
+
* the date-picker's day dots must not spell them the same.
|
|
26656
|
+
*/
|
|
26657
|
+
var RecordingDaysForDeviceSchema = object({
|
|
26658
|
+
deviceId: number(),
|
|
26659
|
+
read: _enum(["read", "unreadable"]),
|
|
26660
|
+
/** Local-midnight epochs (UTC ms) of days that have ≥1 recorded segment. */
|
|
26661
|
+
days: array(number()).readonly()
|
|
26662
|
+
});
|
|
26572
26663
|
var RecordingManifestSchema = object({
|
|
26573
26664
|
deviceId: number(),
|
|
26574
26665
|
/** Local filesystem path to the master playlist; null when no recording exists for the requested range. */
|
|
@@ -26803,6 +26894,13 @@ method(object({
|
|
|
26803
26894
|
}), RecordingAvailabilitySchema, {
|
|
26804
26895
|
kind: "query",
|
|
26805
26896
|
auth: "protected"
|
|
26897
|
+
}), method(object({
|
|
26898
|
+
deviceIds: array(number()).min(1).max(200),
|
|
26899
|
+
fromMs: number(),
|
|
26900
|
+
toMs: number()
|
|
26901
|
+
}), array(RecordingAvailabilityForDeviceSchema).readonly(), {
|
|
26902
|
+
kind: "query",
|
|
26903
|
+
auth: "protected"
|
|
26806
26904
|
}), method(object({
|
|
26807
26905
|
deviceId: number(),
|
|
26808
26906
|
fromMs: number(),
|
|
@@ -26811,6 +26909,14 @@ method(object({
|
|
|
26811
26909
|
}), RecordingDaysSchema, {
|
|
26812
26910
|
kind: "query",
|
|
26813
26911
|
auth: "protected"
|
|
26912
|
+
}), method(object({
|
|
26913
|
+
deviceIds: array(number()).min(1).max(200),
|
|
26914
|
+
fromMs: number(),
|
|
26915
|
+
toMs: number(),
|
|
26916
|
+
tzOffsetMinutes: number()
|
|
26917
|
+
}), array(RecordingDaysForDeviceSchema).readonly(), {
|
|
26918
|
+
kind: "query",
|
|
26919
|
+
auth: "protected"
|
|
26814
26920
|
}), method(object({
|
|
26815
26921
|
deviceId: number(),
|
|
26816
26922
|
fromMs: number(),
|
|
@@ -30274,6 +30380,12 @@ Object.freeze({
|
|
|
30274
30380
|
addonId: null,
|
|
30275
30381
|
access: "view"
|
|
30276
30382
|
},
|
|
30383
|
+
"deviceManager.migrateDevice": {
|
|
30384
|
+
capName: "device-manager",
|
|
30385
|
+
capScope: "system",
|
|
30386
|
+
addonId: null,
|
|
30387
|
+
access: "create"
|
|
30388
|
+
},
|
|
30277
30389
|
"deviceManager.persistConfig": {
|
|
30278
30390
|
capName: "device-manager",
|
|
30279
30391
|
capScope: "system",
|
|
@@ -32008,6 +32120,12 @@ Object.freeze({
|
|
|
32008
32120
|
addonId: null,
|
|
32009
32121
|
access: "view"
|
|
32010
32122
|
},
|
|
32123
|
+
"pipelineAnalytics.getEventDensityBatch": {
|
|
32124
|
+
capName: "pipeline-analytics",
|
|
32125
|
+
capScope: "device",
|
|
32126
|
+
addonId: null,
|
|
32127
|
+
access: "view"
|
|
32128
|
+
},
|
|
32011
32129
|
"pipelineAnalytics.getEventMedia": {
|
|
32012
32130
|
capName: "pipeline-analytics",
|
|
32013
32131
|
capScope: "device",
|
|
@@ -33130,12 +33248,24 @@ Object.freeze({
|
|
|
33130
33248
|
addonId: null,
|
|
33131
33249
|
access: "view"
|
|
33132
33250
|
},
|
|
33251
|
+
"recording.getAvailabilityBatch": {
|
|
33252
|
+
capName: "recording",
|
|
33253
|
+
capScope: "system",
|
|
33254
|
+
addonId: null,
|
|
33255
|
+
access: "view"
|
|
33256
|
+
},
|
|
33133
33257
|
"recording.getDaysWithRecordings": {
|
|
33134
33258
|
capName: "recording",
|
|
33135
33259
|
capScope: "system",
|
|
33136
33260
|
addonId: null,
|
|
33137
33261
|
access: "view"
|
|
33138
33262
|
},
|
|
33263
|
+
"recording.getDaysWithRecordingsBatch": {
|
|
33264
|
+
capName: "recording",
|
|
33265
|
+
capScope: "system",
|
|
33266
|
+
addonId: null,
|
|
33267
|
+
access: "view"
|
|
33268
|
+
},
|
|
33139
33269
|
"recording.getDeviceConfig": {
|
|
33140
33270
|
capName: "recording",
|
|
33141
33271
|
capScope: "system",
|
|
@@ -35740,6 +35870,11 @@ Object.freeze({
|
|
|
35740
35870
|
form: "single",
|
|
35741
35871
|
optional: false
|
|
35742
35872
|
}],
|
|
35873
|
+
"pipelineAnalytics.getEventDensityBatch": [{
|
|
35874
|
+
name: "deviceIds",
|
|
35875
|
+
form: "array",
|
|
35876
|
+
optional: false
|
|
35877
|
+
}],
|
|
35743
35878
|
"pipelineAnalytics.getEventMedia": [{
|
|
35744
35879
|
name: "deviceId",
|
|
35745
35880
|
form: "single",
|
|
@@ -36155,11 +36290,21 @@ Object.freeze({
|
|
|
36155
36290
|
form: "single",
|
|
36156
36291
|
optional: false
|
|
36157
36292
|
}],
|
|
36293
|
+
"recording.getAvailabilityBatch": [{
|
|
36294
|
+
name: "deviceIds",
|
|
36295
|
+
form: "array",
|
|
36296
|
+
optional: false
|
|
36297
|
+
}],
|
|
36158
36298
|
"recording.getDaysWithRecordings": [{
|
|
36159
36299
|
name: "deviceId",
|
|
36160
36300
|
form: "single",
|
|
36161
36301
|
optional: false
|
|
36162
36302
|
}],
|
|
36303
|
+
"recording.getDaysWithRecordingsBatch": [{
|
|
36304
|
+
name: "deviceIds",
|
|
36305
|
+
form: "array",
|
|
36306
|
+
optional: false
|
|
36307
|
+
}],
|
|
36163
36308
|
"recording.getDeviceConfig": [{
|
|
36164
36309
|
name: "deviceId",
|
|
36165
36310
|
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-BFbW-DND.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-DCvDQ86T.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.53",
|
|
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",
|