@camstack/system 1.2.353 → 1.2.354
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/addon-runner.js +1 -1
- package/dist/addon-runner.mjs +1 -1
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
- package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
- package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
- package/dist/builtins/alerts/alerts.addon.js +1 -1
- package/dist/builtins/alerts/alerts.addon.mjs +1 -1
- package/dist/builtins/autotrack/index.js +1 -1
- package/dist/builtins/autotrack/index.mjs +1 -1
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
- package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
- package/dist/builtins/calendars/calendars.addon.js +1 -1
- package/dist/builtins/calendars/calendars.addon.mjs +1 -1
- package/dist/builtins/camera-grid/index.js +1 -1
- package/dist/builtins/camera-grid/index.mjs +1 -1
- package/dist/builtins/composer/composer.addon.js +13 -3
- package/dist/builtins/composer/composer.addon.mjs +13 -3
- package/dist/builtins/console-logging/index.js +1 -1
- package/dist/builtins/console-logging/index.mjs +1 -1
- package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
- package/dist/builtins/core-blocks/core-blocks.addon.mjs +2 -2
- package/dist/builtins/device-manager/device-manager.addon.js +3 -3
- package/dist/builtins/device-manager/device-manager.addon.mjs +3 -3
- package/dist/builtins/hub-forwarder/index.js +1 -1
- package/dist/builtins/hub-forwarder/index.mjs +1 -1
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
- package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
- package/dist/builtins/local-auth/local-auth.addon.js +1 -1
- package/dist/builtins/local-auth/local-auth.addon.mjs +1 -1
- package/dist/builtins/local-network/local-network.addon.d.ts +21 -6
- package/dist/builtins/local-network/local-network.addon.js +81 -54
- package/dist/builtins/local-network/local-network.addon.mjs +81 -55
- package/dist/builtins/loki-logging/index.js +1 -1
- package/dist/builtins/loki-logging/index.mjs +1 -1
- package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
- package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
- package/dist/builtins/platform-probe/index.js +1 -1
- package/dist/builtins/platform-probe/index.mjs +1 -1
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
- package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
- package/dist/builtins/snapshot/index.js +1 -1
- package/dist/builtins/snapshot/index.mjs +1 -1
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
- package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
- package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +2 -2
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +2 -2
- package/dist/builtins/system-config/system-config.addon.js +1 -1
- package/dist/builtins/system-config/system-config.addon.mjs +1 -1
- package/dist/builtins/winston-logging/index.js +1 -1
- package/dist/builtins/winston-logging/index.mjs +1 -1
- package/dist/{child-cap-dispatch-C6IpRb4P.mjs → child-cap-dispatch-C1x1kNJK.mjs} +1 -1
- package/dist/{child-cap-dispatch-CvYlCq60.js → child-cap-dispatch-CRqYKHAb.js} +1 -1
- package/dist/{composition-sources-CAFDvTRs.js → composition-sources-0nuWOdNd.js} +1 -1
- package/dist/{composition-sources-BGlDi3CT.mjs → composition-sources-DzkEFd8q.mjs} +1 -1
- package/dist/{dist-Cm556q2j.mjs → dist-DVyXxn41.mjs} +145 -33
- package/dist/{dist-CXVXFdJX.js → dist-DePB7uwU.js} +156 -32
- package/dist/http/reverse-proxy.d.ts +11 -1
- package/dist/index.js +55 -12
- package/dist/index.mjs +55 -12
- package/dist/kernel/config-schema.d.ts +1 -0
- package/dist/{retired-settings-keys-D24IW4qo.js → retired-settings-keys-BTKZdPn6.js} +1 -1
- package/dist/{retired-settings-keys-DzkSqnH0.mjs → retired-settings-keys-DFur4hJF.mjs} +1 -1
- package/package.json +1 -1
|
@@ -14169,7 +14169,7 @@ var detectionPipelineCapability = {
|
|
|
14169
14169
|
* This matters here more than anywhere else in the repo, because every provider
|
|
14170
14170
|
* that knows a device's host knows its PASSWORD too: `{ host, port, username,
|
|
14171
14171
|
* password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
|
|
14172
|
-
* and `http://admin:hunter2@192.168.
|
|
14172
|
+
* and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
|
|
14173
14173
|
* camera's own page will ask for its own login. That is correct, and pre-
|
|
14174
14174
|
* filling it is the operator's business, not ours.
|
|
14175
14175
|
*
|
|
@@ -21164,8 +21164,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
|
|
|
21164
21164
|
disabledTargetIds: z.array(z.string()).default([])
|
|
21165
21165
|
});
|
|
21166
21166
|
/**
|
|
21167
|
-
* The state-summary SECTIONS (D647 / D698): the D637 kind groups that
|
|
21168
|
-
* still-true state. `
|
|
21167
|
+
* The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
|
|
21168
|
+
* report a still-true state. `addons` is the crash-looped addons only and
|
|
21169
|
+
* `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
|
|
21169
21170
|
* job is not an open state, and the alarm stays instant.
|
|
21170
21171
|
*/
|
|
21171
21172
|
var NcStateSummarySectionIdSchema = z.enum([
|
|
@@ -21177,6 +21178,7 @@ var NcStateSummarySectionIdSchema = z.enum([
|
|
|
21177
21178
|
"detection-blind",
|
|
21178
21179
|
"nodes",
|
|
21179
21180
|
"addons",
|
|
21181
|
+
"addon-updates",
|
|
21180
21182
|
"updates"
|
|
21181
21183
|
]);
|
|
21182
21184
|
/** One section of a previewed state summary. `unavailable` = its state could not be read. */
|
|
@@ -21671,7 +21673,19 @@ var NcAlarmModeDelaysSchema = z.object({
|
|
|
21671
21673
|
* When this mode may be armed. Absent / null = always allowed (same as a
|
|
21672
21674
|
* rule with no `schedule`). Evaluated with {@link isScheduleActive}.
|
|
21673
21675
|
*/
|
|
21674
|
-
schedule: NcScheduleSchema.optional()
|
|
21676
|
+
schedule: NcScheduleSchema.optional(),
|
|
21677
|
+
/**
|
|
21678
|
+
* D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
|
|
21679
|
+
* intrusion naming the locations)? Absent = false — the entry-delay notification is the
|
|
21680
|
+
* only one, and the matches ride the triggered notification's mosaic (D705).
|
|
21681
|
+
*/
|
|
21682
|
+
notifyDuringEntryDelay: z.boolean().optional(),
|
|
21683
|
+
/**
|
|
21684
|
+
* D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
|
|
21685
|
+
* Absent = false (logged, not sent). Even when true it is not sent when that same sensor
|
|
21686
|
+
* is the one that starts the entry delay — the entry-delay notification already names it.
|
|
21687
|
+
*/
|
|
21688
|
+
notifySensorRewatched: z.boolean().optional()
|
|
21675
21689
|
});
|
|
21676
21690
|
var NcAlarmModeDelaysListSchema = z.array(NcAlarmModeDelaysSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
|
|
21677
21691
|
/**
|
|
@@ -21686,7 +21700,11 @@ var NcAlarmModeDelaysEditSchema = z.object({
|
|
|
21686
21700
|
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
|
|
21687
21701
|
postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
|
|
21688
21702
|
/** Set a schedule, or `null` to clear (mode always allowed again). */
|
|
21689
|
-
schedule: NcScheduleSchema.nullable().optional()
|
|
21703
|
+
schedule: NcScheduleSchema.nullable().optional(),
|
|
21704
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
21705
|
+
notifyDuringEntryDelay: z.boolean().nullable().optional(),
|
|
21706
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
21707
|
+
notifySensorRewatched: z.boolean().nullable().optional()
|
|
21690
21708
|
});
|
|
21691
21709
|
var NcAlarmModeDelaysEditListSchema = z.array(NcAlarmModeDelaysEditSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
|
|
21692
21710
|
/** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
|
|
@@ -26630,6 +26648,22 @@ var MotionSourceEnum = z.enum([
|
|
|
26630
26648
|
"device-activity"
|
|
26631
26649
|
]);
|
|
26632
26650
|
/**
|
|
26651
|
+
* What opened an on-motion detection SESSION: the motion source that passed the
|
|
26652
|
+
* camera's `motionSources` gate, and what raised it (the camera itself, or a
|
|
26653
|
+
* sensor the operator attached — D672). `sensorName` is the attached sensor's
|
|
26654
|
+
* device name as the orchestrator's camera-sensors resolution last read it;
|
|
26655
|
+
* absent when unknown or when the camera itself triggered.
|
|
26656
|
+
*
|
|
26657
|
+
* Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
|
|
26658
|
+
* can say what started the session (D672 rule 11, amended 2026-10-06). The
|
|
26659
|
+
* runner never decides anything on it.
|
|
26660
|
+
*/
|
|
26661
|
+
var SessionTriggerSchema = z.object({
|
|
26662
|
+
source: MotionSourceEnum,
|
|
26663
|
+
triggeredBy: MotionTriggeredBySchema,
|
|
26664
|
+
sensorName: z.string().optional()
|
|
26665
|
+
});
|
|
26666
|
+
/**
|
|
26633
26667
|
* List of motion sources active on a camera. Empty array is valid:
|
|
26634
26668
|
* "no source" — happens for battery cams without firmware motion when
|
|
26635
26669
|
* the operator hasn't opted into the SW analyzer (would hold the
|
|
@@ -26881,6 +26915,14 @@ var RunnerCameraConfigSchema = z.object({
|
|
|
26881
26915
|
*/
|
|
26882
26916
|
motionSources: MotionSourcesSchema.default(["analyzer"]),
|
|
26883
26917
|
/**
|
|
26918
|
+
* What opened this attach, on a SESSION attach only (see
|
|
26919
|
+
* {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
|
|
26920
|
+
* standing attach, an occupancy burst, a re-dispatch with no motion event
|
|
26921
|
+
* behind it, and every attach from an orchestrator older than the field — the
|
|
26922
|
+
* runner then names no source on the phase event.
|
|
26923
|
+
*/
|
|
26924
|
+
sessionTrigger: SessionTriggerSchema.optional(),
|
|
26925
|
+
/**
|
|
26884
26926
|
* WHICH root detector runs for this camera. The detection counterpart of
|
|
26885
26927
|
* {@link motionSources}, same shape and same discipline: a per-camera list
|
|
26886
26928
|
* of sources the system understands, vendor-agnostic, owned here.
|
|
@@ -31445,6 +31487,50 @@ var videoclipsCapability = {
|
|
|
31445
31487
|
})
|
|
31446
31488
|
}
|
|
31447
31489
|
};
|
|
31490
|
+
/** The central link domain the viewer app claims (Universal Links / App Links). */
|
|
31491
|
+
var CAMSTACK_APP_LINK_ORIGIN = "https://camstack.zentik.app";
|
|
31492
|
+
/**
|
|
31493
|
+
* Reduce a base URL to the bare origin the central page accepts as `hub=`,
|
|
31494
|
+
* or `null` when it cannot be one: not http(s), carries credentials, or does
|
|
31495
|
+
* not parse. A path/query/fragment is dropped — the central page mounts the
|
|
31496
|
+
* viewer under the origin itself.
|
|
31497
|
+
*/
|
|
31498
|
+
function toAppLinkHubOrigin(baseUrl) {
|
|
31499
|
+
let parsed;
|
|
31500
|
+
try {
|
|
31501
|
+
parsed = new URL(baseUrl);
|
|
31502
|
+
} catch {
|
|
31503
|
+
return null;
|
|
31504
|
+
}
|
|
31505
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
|
|
31506
|
+
if (parsed.username !== "" || parsed.password !== "") return null;
|
|
31507
|
+
if (parsed.hostname === "") return null;
|
|
31508
|
+
return parsed.origin;
|
|
31509
|
+
}
|
|
31510
|
+
/**
|
|
31511
|
+
* The hub address an app link carries as `hub=`, chosen from the hub's OWN
|
|
31512
|
+
* advertised palette so it always agrees with what the Network page lists:
|
|
31513
|
+
* the public tunnel first, then the mesh (Tailscale MagicDNS) — HTTPS only,
|
|
31514
|
+
* because the app and the hosted viewer reach it from off the LAN. `null`
|
|
31515
|
+
* when the hub advertises neither.
|
|
31516
|
+
*/
|
|
31517
|
+
function pickAppLinkHub(endpoints) {
|
|
31518
|
+
const rank = (e) => {
|
|
31519
|
+
if (e.kind !== "public" || !e.baseUrl.startsWith("https://")) return null;
|
|
31520
|
+
if (e.interfaceKind === "public") return 0;
|
|
31521
|
+
if (e.interfaceKind === "vpn") return 1;
|
|
31522
|
+
return null;
|
|
31523
|
+
};
|
|
31524
|
+
return endpoints.flatMap((e) => {
|
|
31525
|
+
const r = rank(e);
|
|
31526
|
+
const origin = toAppLinkHubOrigin(e.baseUrl);
|
|
31527
|
+
return r === null || origin === null ? [] : [{
|
|
31528
|
+
r,
|
|
31529
|
+
p: e.priority,
|
|
31530
|
+
origin
|
|
31531
|
+
}];
|
|
31532
|
+
}).toSorted((a, b) => a.r - b.r || a.p - b.p)[0]?.origin ?? null;
|
|
31533
|
+
}
|
|
31448
31534
|
/**
|
|
31449
31535
|
* Optional client-side hints sent at session creation to help the provider
|
|
31450
31536
|
* pick the best native source. All fields optional — a viewer that knows
|
|
@@ -36148,7 +36234,7 @@ var LocalInterfaceSchema = z.object({
|
|
|
36148
36234
|
name: z.string(),
|
|
36149
36235
|
family: z.enum(["IPv4", "IPv6"]),
|
|
36150
36236
|
address: z.string(),
|
|
36151
|
-
/** CIDR shorthand (e.g. `192.168.
|
|
36237
|
+
/** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
|
|
36152
36238
|
cidr: z.string(),
|
|
36153
36239
|
/** OS netmask. Stable across calls so the SDK can hash on it. */
|
|
36154
36240
|
netmask: z.string(),
|
|
@@ -36202,7 +36288,8 @@ var ConnectionEndpointSchema = z.object({
|
|
|
36202
36288
|
"lan-ipv4",
|
|
36203
36289
|
"lan-ipv6",
|
|
36204
36290
|
"public",
|
|
36205
|
-
"loopback"
|
|
36291
|
+
"loopback",
|
|
36292
|
+
"app-link"
|
|
36206
36293
|
]),
|
|
36207
36294
|
/**
|
|
36208
36295
|
* Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
|
|
@@ -36271,15 +36358,27 @@ var GetConnectionEndpointsResultSchema = z.object({
|
|
|
36271
36358
|
localPort: AdvertisedLocalPortSchema
|
|
36272
36359
|
});
|
|
36273
36360
|
/**
|
|
36274
|
-
* The
|
|
36275
|
-
*
|
|
36276
|
-
*
|
|
36361
|
+
* The address flagged for notification links. `baseUrl: null` = AUTO, which
|
|
36362
|
+
* since D709 is the CamStack app link; `resolved` reports the effective value,
|
|
36363
|
+
* so the UI can show it either way.
|
|
36277
36364
|
*/
|
|
36278
36365
|
var NotificationEndpointSchema = z.object({
|
|
36279
36366
|
/** The operator's explicit choice, or null for AUTO. */
|
|
36280
36367
|
baseUrl: z.string().nullable(),
|
|
36281
|
-
/**
|
|
36282
|
-
|
|
36368
|
+
/**
|
|
36369
|
+
* The effective flagged address: the explicit choice, else (AUTO) the
|
|
36370
|
+
* CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
|
|
36371
|
+
* answered the public tunnel / mesh here, or null.
|
|
36372
|
+
*/
|
|
36373
|
+
resolved: z.string().nullable(),
|
|
36374
|
+
/**
|
|
36375
|
+
* The hub origin an app link carries as `hub=` (D709): the hub's best
|
|
36376
|
+
* public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
|
|
36377
|
+
* picked from this cap's own palette by `pickAppLinkHub`. `null` when the
|
|
36378
|
+
* hub advertises neither; the app link is then minted without `hub=`.
|
|
36379
|
+
* Absent on a pre-D709 hub.
|
|
36380
|
+
*/
|
|
36381
|
+
appLinkHub: z.string().nullable()
|
|
36283
36382
|
});
|
|
36284
36383
|
/**
|
|
36285
36384
|
* The URLs the SDK / viewer should race for API access. `baseUrls` empty =
|
|
@@ -36347,7 +36446,7 @@ var localNetworkCapability = {
|
|
|
36347
36446
|
* every client a second authority on a socket only the hub binds. A viewer
|
|
36348
36447
|
* configured with a port-less public URL (`https://camstack.example.top`)
|
|
36349
36448
|
* infers 443 from the scheme, asks with 443, and was handed
|
|
36350
|
-
* `https://192.168.
|
|
36449
|
+
* `https://192.168.10.9:443` for a hub listening on 4443. That candidate
|
|
36351
36450
|
* cannot ever answer, and losing its race reads in the log exactly like
|
|
36352
36451
|
* "the LAN was tried and it was slower" — so an operator sitting on his own
|
|
36353
36452
|
* WiFi stayed on the public tunnel for weeks, with the LAN candidate born
|
|
@@ -36380,13 +36479,21 @@ var localNetworkCapability = {
|
|
|
36380
36479
|
* Pass `'https'` when the caller is itself loaded over HTTPS
|
|
36381
36480
|
* to avoid mixed-content blocks in the browser. The public
|
|
36382
36481
|
* tunnel always emits `https://` regardless. */
|
|
36383
|
-
scheme: z.enum(["http", "https"]).optional()
|
|
36482
|
+
scheme: z.enum(["http", "https"]).optional(),
|
|
36483
|
+
/** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
|
|
36484
|
+
* an address notification links can be flagged with, not a hub
|
|
36485
|
+
* route. Default `false`: racers and rankers never see it. */
|
|
36486
|
+
includeAppLink: z.boolean().optional()
|
|
36384
36487
|
}), GetConnectionEndpointsResultSchema),
|
|
36385
36488
|
/**
|
|
36386
|
-
* The
|
|
36387
|
-
*
|
|
36388
|
-
*
|
|
36389
|
-
*
|
|
36489
|
+
* The address notification links are flagged with. `baseUrl: null` means
|
|
36490
|
+
* AUTO, which is the CamStack app link (D709): viewer taps go through
|
|
36491
|
+
* `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the app. Any
|
|
36492
|
+
* hub address the palette lists can be flagged instead; then viewer taps,
|
|
36493
|
+
* attachment links and action buttons all use it. Signed media and
|
|
36494
|
+
* buttons never use the app link — with it flagged (or AUTO) they keep
|
|
36495
|
+
* the ranked hub ladder (a configured origin, a connected tunnel, then
|
|
36496
|
+
* the LAN), never loopback.
|
|
36390
36497
|
*
|
|
36391
36498
|
* Why an explicit marker: the automatic ranking cannot know which of
|
|
36392
36499
|
* several reachable addresses the RECIPIENT can actually open. A link is
|
|
@@ -36800,7 +36907,7 @@ var MeshPeerSchema = z.object({
|
|
|
36800
36907
|
tags: z.array(z.string()).readonly(),
|
|
36801
36908
|
/** True when the peer advertises itself as an exit-node candidate. */
|
|
36802
36909
|
exitNodeOption: z.boolean(),
|
|
36803
|
-
/** Subnet routes the peer advertises (e.g. `["192.168.
|
|
36910
|
+
/** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
|
|
36804
36911
|
advertisedRoutes: z.array(z.string()).readonly(),
|
|
36805
36912
|
/** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
|
|
36806
36913
|
userLogin: z.string().nullable(),
|
|
@@ -58617,12 +58724,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
58617
58724
|
{
|
|
58618
58725
|
id: "addons",
|
|
58619
58726
|
family: "system",
|
|
58620
|
-
label: "Addons",
|
|
58621
|
-
kinds: [
|
|
58622
|
-
|
|
58623
|
-
|
|
58624
|
-
|
|
58625
|
-
|
|
58727
|
+
label: "Addons stopped",
|
|
58728
|
+
kinds: ["addon-crash-loop"]
|
|
58729
|
+
},
|
|
58730
|
+
{
|
|
58731
|
+
id: "addon-updates",
|
|
58732
|
+
family: "system",
|
|
58733
|
+
label: "Addon updates",
|
|
58734
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
58626
58735
|
},
|
|
58627
58736
|
{
|
|
58628
58737
|
id: "updates",
|
|
@@ -58782,13 +58891,15 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
58782
58891
|
},
|
|
58783
58892
|
{
|
|
58784
58893
|
name: "summaryAddons",
|
|
58785
|
-
label: "Summary: addons",
|
|
58786
|
-
example: "
|
|
58787
|
-
kinds: [
|
|
58788
|
-
|
|
58789
|
-
|
|
58790
|
-
|
|
58791
|
-
|
|
58894
|
+
label: "Summary: addons stopped",
|
|
58895
|
+
example: "hub — recorder stopped after repeated crashes",
|
|
58896
|
+
kinds: ["addon-crash-loop"]
|
|
58897
|
+
},
|
|
58898
|
+
{
|
|
58899
|
+
name: "summaryAddonUpdates",
|
|
58900
|
+
label: "Summary: addon updates",
|
|
58901
|
+
example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
|
|
58902
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
58792
58903
|
},
|
|
58793
58904
|
{
|
|
58794
58905
|
name: "summaryUpdates",
|
|
@@ -58872,6 +58983,7 @@ var STATE_SUMMARY_VARS = [
|
|
|
58872
58983
|
[...RULE_BODY_ONLY],
|
|
58873
58984
|
[...RULE_TEXT],
|
|
58874
58985
|
([...RULE_TEXT], [...DEVICE_EVENTS]),
|
|
58986
|
+
([...RULE_TEXT], [...COMBINED_ALARM]),
|
|
58875
58987
|
([...RULE_TEXT], [...DEVICE_EVENTS]),
|
|
58876
58988
|
([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
|
|
58877
58989
|
([...RULE_TEXT], [...CONSUMABLE]),
|
|
@@ -59597,4 +59709,4 @@ function enumerateInferenceDevices(hw) {
|
|
|
59597
59709
|
return out;
|
|
59598
59710
|
}
|
|
59599
59711
|
//#endregion
|
|
59600
|
-
export {
|
|
59712
|
+
export { calendarsCapability as $, DEVICE_SETTINGS_CONTRIBUTION_METHODS as $n, normalizeCoreBlockWrite as $t, MOTION_CLOSE_AFTER_MS as A, validateComposition as An, foldSnapshotByFunction as At, StorageLocationTypeSchema as B, compositionFeatureEnabled as Bn, legacyModeOf as Bt, FieldClaimModeSchema as C, storageCapability as Cn, enumerateItemArrayFields as Ct, LocationIconIdSchema as D, streamCatalogCapability as Dn, expandContainer as Dt, LegacyStorageLocationDefaultSchema as E, storageProviderCapability as En, evictionPolicyOfLocation as Et, STORAGE_ACCESS_FALLBACK as F, COMPOSER_ADDON_ID as Fn, isLocationEnabled as Ft, addonWidgetsCapability as G, disarmRoseMemory as Gn, logLevelAtMost as Gt, UserRecordSchema as H, compositionSliceKey as Hn, localNetworkCapability as Ht, STREAM_PROFILE_META as I, buildFfmpegArgs as In, isObjectInput as It, backupCapability as J, DeviceRole as Jn, mayWriteToLocation as Jt, alertsCapability as K, toExpressionValue as Kn, looseSchema as Kt, ScopedTokenSchema as L, cloneStatefulExpressionMemory as Ln, isVoidInput as Lt, REDACTED_SECRET as M, vectorIndexDimConflictError as Mn, gbToBytes as Mt, RUNTIME_DEFAULTS as N, vectorStoreCapability as Nn, isArrayOutputSchema as Nt, METHOD_ACCESS_MAP as O, streamQualityLabel as On, extractNestedAddonId as Ot, RecordingStatusSchema as P, withLocationMode as Pn, isCollectionArrayMethod as Pt, buildStreamParamsConfigSchema as Q, DATAPLANE_SECRET_HEADER as Qn, motionCapability as Qt, StorageCleanupJobSchema as R, composedDeviceRef as Rn, kebabToCamel as Rt, FIRST_LEVEL_MACRO_CLASSES as S, snapshotCapability as Sn, EventCategory as Sr, enumerateInferenceDevices as St, LOG_LEVEL_RANK as T, storageOccupancyCapability as Tn, evaluateCompositionField as Tt, addonPagesCapability as U, compositionSourceKey as Un, locationIconKey as Ut, StorageMigrationJobSchema as V, compositionItemFieldPath as Vn, lifecycleJobSchema as Vt, addonSettingsCapability as W, createStatefulExpressionMemory as Wn, logDestinationCapability as Wt, batteryCapability as X, errMsg as Xn, metricsProviderCapability as Xt, bareAddonId as Y, DeviceType as Yn, memoizePinnedFfmpeg as Yt, buildCapabilityLookup as Z, BaseAddon as Zn, modeMayWrite as Zt, DATABASE_SNAPSHOT_TIMEOUT_MS as _, scopesAllowAddon as _n, readinessKey as _r, describeComposableCaps as _t, BatteryStatusSchema as a, planComposition as an, asNumber as ar, coreBlockAddonId as at, DeclaredDevices as b, settingsStoreCapability as bn, sleep as br, deviceStateCapability as bt, CAP_NAMES_WITH_STATUS as c, ptzAutotrackCapability as cn, emitDownForOwnedCaps as cr, coreBlockSourceKind as ct, CORE_BLOCKS_ADDON_ID as d, resolveBucketMs as dn, hydrateSchema as dr, dataStoreProviderCapability as dt, normalizeUnit as en, DEVICE_STATUS_METHOD as er, cameraGridLayoutCapability as et, CORE_BLOCK_ADDON_PREFIX as f, resolveCoreBlockEntry as fn, isDeviceConfigCap as fr, databaseSnapshotCapability as ft, DATABASE_SNAPSHOT_SUFFIX as g, runtimeStatePolicyFor as gn, parseJsonUnknown as gr, deriveBatteryPresence as gt, DATABASE_SNAPSHOT_PARTIAL_SUFFIX as h, resolveMethodAuth as hn, parseJsonObject as hr, defineExtensionSlotProvider as ht, BaseDevice as i, pickAppLinkHub as in, asJsonObject as ir, compositionSourceRefs as it, RECORDING_SOURCE_CAMSTACK_ADDON as j, vectorDimFromBase64 as jn, formatMinutes as jt, MINUTES_PER_DAY as k, userManagementCapability as kn, filesystemBrowseCapability as kt, COMPOSED_ITEM_FIXED_FIELDS as l, reducePoints as ln, emitReadiness as lr, coreBlocksCapability as lt, CoreBlockSchema as m, resolveLocationMode as mn, nodePin as mr, decodeVectorBase64 as mt, AlertSchema as n, objectInputDeclaresRequiredDeviceId as nn, ReadinessTimeoutError as nr, composerCapability as nt, CAMERA_SWITCH_ORDER as o, platformProbeCapability as on, asString$1 as or, coreBlockComposition as ot, CalendarPreferencesSchema as p, resolveCoreBlockFiles as pn, isEvent as pr, declarationOwnerNodeId as pt, authProviderCapability as q, DeviceFeature as qn, mayReadLocation as qt, ApiKeyRecordSchema as r, parseStreamParamsFormPatch as rn, WELL_KNOWN_TAB_MAP as rr, compositionFieldKey as rt, CAMSTACK_APP_LINK_ORIGIN as s, procedureAuthKey as sn, createEvent as sr, coreBlockIdFromAddonId as st, ALL_CAPABILITY_DEFINITIONS as t, objectInputDeclaresAddonId as tn, ReadinessRegistry as tr, collectSecretConfigKeys as tt, COMPOSER_RUNNER_ID as u, replacedFieldKeys as un, expandCapMethods as ur, createDeviceExtensionProvider as ut, DAY_NAMES as v, scopesAllowDeviceCap as vn, resolveCapMount as vr, deviceExtensionCapability as vt, FieldClaimSchema as w, storageMigrationCapability as wn, enumerateSchemaFields as wt, DeviceStatusSchema as x, siteZoneKey as xn, toNodeId as xr, deviceStatusCapability as xt, DERIVED_CAMERA_SILENCED_CAP_NAMES as y, scoreRuntimes as yn, scopeKey as yr, deviceManagerCapability as yt, StorageLocationModeSchema as z, composedDeviceStableId as zn, legacyAutoLinkIds as zt };
|
|
@@ -14169,7 +14169,7 @@ var detectionPipelineCapability = {
|
|
|
14169
14169
|
* This matters here more than anywhere else in the repo, because every provider
|
|
14170
14170
|
* that knows a device's host knows its PASSWORD too: `{ host, port, username,
|
|
14171
14171
|
* password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
|
|
14172
|
-
* and `http://admin:hunter2@192.168.
|
|
14172
|
+
* and `http://admin:hunter2@192.168.60.139/` is a URL a browser accepts. The
|
|
14173
14173
|
* camera's own page will ask for its own login. That is correct, and pre-
|
|
14174
14174
|
* filling it is the operator's business, not ours.
|
|
14175
14175
|
*
|
|
@@ -21164,8 +21164,9 @@ var NcRuleSchema = NcRuleInputSchema.extend({
|
|
|
21164
21164
|
disabledTargetIds: zod.z.array(zod.z.string()).default([])
|
|
21165
21165
|
});
|
|
21166
21166
|
/**
|
|
21167
|
-
* The state-summary SECTIONS (D647 / D698): the D637 kind groups that
|
|
21168
|
-
* still-true state. `
|
|
21167
|
+
* The state-summary SECTIONS (D647 / D698 / D708): the D637 kind groups that
|
|
21168
|
+
* report a still-true state. `addons` is the crash-looped addons only and
|
|
21169
|
+
* `addon-updates` the addons that are behind (D708 split them). `backups-exports` and `alarm` are not sections — a completed
|
|
21169
21170
|
* job is not an open state, and the alarm stays instant.
|
|
21170
21171
|
*/
|
|
21171
21172
|
var NcStateSummarySectionIdSchema = zod.z.enum([
|
|
@@ -21177,6 +21178,7 @@ var NcStateSummarySectionIdSchema = zod.z.enum([
|
|
|
21177
21178
|
"detection-blind",
|
|
21178
21179
|
"nodes",
|
|
21179
21180
|
"addons",
|
|
21181
|
+
"addon-updates",
|
|
21180
21182
|
"updates"
|
|
21181
21183
|
]);
|
|
21182
21184
|
/** One section of a previewed state summary. `unavailable` = its state could not be read. */
|
|
@@ -21671,7 +21673,19 @@ var NcAlarmModeDelaysSchema = zod.z.object({
|
|
|
21671
21673
|
* When this mode may be armed. Absent / null = always allowed (same as a
|
|
21672
21674
|
* rule with no `schedule`). Evaluated with {@link isScheduleActive}.
|
|
21673
21675
|
*/
|
|
21674
|
-
schedule: NcScheduleSchema.optional()
|
|
21676
|
+
schedule: NcScheduleSchema.optional(),
|
|
21677
|
+
/**
|
|
21678
|
+
* D706: while this mode's ENTRY DELAY runs, do the alarm rules' own pushes go out (as an
|
|
21679
|
+
* intrusion naming the locations)? Absent = false — the entry-delay notification is the
|
|
21680
|
+
* only one, and the matches ride the triggered notification's mosaic (D705).
|
|
21681
|
+
*/
|
|
21682
|
+
notifyDuringEntryDelay: zod.z.boolean().optional(),
|
|
21683
|
+
/**
|
|
21684
|
+
* D706: notify "watched again" when a sensor this arm bypassed closes and opens again.
|
|
21685
|
+
* Absent = false (logged, not sent). Even when true it is not sent when that same sensor
|
|
21686
|
+
* is the one that starts the entry delay — the entry-delay notification already names it.
|
|
21687
|
+
*/
|
|
21688
|
+
notifySensorRewatched: zod.z.boolean().optional()
|
|
21675
21689
|
});
|
|
21676
21690
|
var NcAlarmModeDelaysListSchema = zod.z.array(NcAlarmModeDelaysSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one entry per arm mode" });
|
|
21677
21691
|
/**
|
|
@@ -21686,7 +21700,11 @@ var NcAlarmModeDelaysEditSchema = zod.z.object({
|
|
|
21686
21700
|
triggeredDurationSec: NcAlarmTriggeredSecSchema.nullable().optional(),
|
|
21687
21701
|
postTriggeredAction: NcAlarmPostTriggeredActionSchema.nullable().optional(),
|
|
21688
21702
|
/** Set a schedule, or `null` to clear (mode always allowed again). */
|
|
21689
|
-
schedule: NcScheduleSchema.nullable().optional()
|
|
21703
|
+
schedule: NcScheduleSchema.nullable().optional(),
|
|
21704
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
21705
|
+
notifyDuringEntryDelay: zod.z.boolean().nullable().optional(),
|
|
21706
|
+
/** D706: set the switch, or `null` to clear it (back to the default, false). */
|
|
21707
|
+
notifySensorRewatched: zod.z.boolean().nullable().optional()
|
|
21690
21708
|
});
|
|
21691
21709
|
var NcAlarmModeDelaysEditListSchema = zod.z.array(NcAlarmModeDelaysEditSchema).max(8).refine(uniqueModes, { message: "modeDelays: at most one edit per arm mode" });
|
|
21692
21710
|
/** One switch of the alarm table: put ONE device on, or take it off, ONE mode's list. */
|
|
@@ -26630,6 +26648,22 @@ var MotionSourceEnum = zod.z.enum([
|
|
|
26630
26648
|
"device-activity"
|
|
26631
26649
|
]);
|
|
26632
26650
|
/**
|
|
26651
|
+
* What opened an on-motion detection SESSION: the motion source that passed the
|
|
26652
|
+
* camera's `motionSources` gate, and what raised it (the camera itself, or a
|
|
26653
|
+
* sensor the operator attached — D672). `sensorName` is the attached sensor's
|
|
26654
|
+
* device name as the orchestrator's camera-sensors resolution last read it;
|
|
26655
|
+
* absent when unknown or when the camera itself triggered.
|
|
26656
|
+
*
|
|
26657
|
+
* Carried on the session attach ONLY so the runner's `DetectionPhaseTransition`
|
|
26658
|
+
* can say what started the session (D672 rule 11, amended 2026-10-06). The
|
|
26659
|
+
* runner never decides anything on it.
|
|
26660
|
+
*/
|
|
26661
|
+
var SessionTriggerSchema = zod.z.object({
|
|
26662
|
+
source: MotionSourceEnum,
|
|
26663
|
+
triggeredBy: MotionTriggeredBySchema,
|
|
26664
|
+
sensorName: zod.z.string().optional()
|
|
26665
|
+
});
|
|
26666
|
+
/**
|
|
26633
26667
|
* List of motion sources active on a camera. Empty array is valid:
|
|
26634
26668
|
* "no source" — happens for battery cams without firmware motion when
|
|
26635
26669
|
* the operator hasn't opted into the SW analyzer (would hold the
|
|
@@ -26881,6 +26915,14 @@ var RunnerCameraConfigSchema = zod.z.object({
|
|
|
26881
26915
|
*/
|
|
26882
26916
|
motionSources: MotionSourcesSchema.default(["analyzer"]),
|
|
26883
26917
|
/**
|
|
26918
|
+
* What opened this attach, on a SESSION attach only (see
|
|
26919
|
+
* {@link SessionTriggerSchema}). OPTIONAL with no default: absent on a
|
|
26920
|
+
* standing attach, an occupancy burst, a re-dispatch with no motion event
|
|
26921
|
+
* behind it, and every attach from an orchestrator older than the field — the
|
|
26922
|
+
* runner then names no source on the phase event.
|
|
26923
|
+
*/
|
|
26924
|
+
sessionTrigger: SessionTriggerSchema.optional(),
|
|
26925
|
+
/**
|
|
26884
26926
|
* WHICH root detector runs for this camera. The detection counterpart of
|
|
26885
26927
|
* {@link motionSources}, same shape and same discipline: a per-camera list
|
|
26886
26928
|
* of sources the system understands, vendor-agnostic, owned here.
|
|
@@ -31445,6 +31487,50 @@ var videoclipsCapability = {
|
|
|
31445
31487
|
})
|
|
31446
31488
|
}
|
|
31447
31489
|
};
|
|
31490
|
+
/** The central link domain the viewer app claims (Universal Links / App Links). */
|
|
31491
|
+
var CAMSTACK_APP_LINK_ORIGIN = "https://camstack.zentik.app";
|
|
31492
|
+
/**
|
|
31493
|
+
* Reduce a base URL to the bare origin the central page accepts as `hub=`,
|
|
31494
|
+
* or `null` when it cannot be one: not http(s), carries credentials, or does
|
|
31495
|
+
* not parse. A path/query/fragment is dropped — the central page mounts the
|
|
31496
|
+
* viewer under the origin itself.
|
|
31497
|
+
*/
|
|
31498
|
+
function toAppLinkHubOrigin(baseUrl) {
|
|
31499
|
+
let parsed;
|
|
31500
|
+
try {
|
|
31501
|
+
parsed = new URL(baseUrl);
|
|
31502
|
+
} catch {
|
|
31503
|
+
return null;
|
|
31504
|
+
}
|
|
31505
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
|
|
31506
|
+
if (parsed.username !== "" || parsed.password !== "") return null;
|
|
31507
|
+
if (parsed.hostname === "") return null;
|
|
31508
|
+
return parsed.origin;
|
|
31509
|
+
}
|
|
31510
|
+
/**
|
|
31511
|
+
* The hub address an app link carries as `hub=`, chosen from the hub's OWN
|
|
31512
|
+
* advertised palette so it always agrees with what the Network page lists:
|
|
31513
|
+
* the public tunnel first, then the mesh (Tailscale MagicDNS) — HTTPS only,
|
|
31514
|
+
* because the app and the hosted viewer reach it from off the LAN. `null`
|
|
31515
|
+
* when the hub advertises neither.
|
|
31516
|
+
*/
|
|
31517
|
+
function pickAppLinkHub(endpoints) {
|
|
31518
|
+
const rank = (e) => {
|
|
31519
|
+
if (e.kind !== "public" || !e.baseUrl.startsWith("https://")) return null;
|
|
31520
|
+
if (e.interfaceKind === "public") return 0;
|
|
31521
|
+
if (e.interfaceKind === "vpn") return 1;
|
|
31522
|
+
return null;
|
|
31523
|
+
};
|
|
31524
|
+
return endpoints.flatMap((e) => {
|
|
31525
|
+
const r = rank(e);
|
|
31526
|
+
const origin = toAppLinkHubOrigin(e.baseUrl);
|
|
31527
|
+
return r === null || origin === null ? [] : [{
|
|
31528
|
+
r,
|
|
31529
|
+
p: e.priority,
|
|
31530
|
+
origin
|
|
31531
|
+
}];
|
|
31532
|
+
}).toSorted((a, b) => a.r - b.r || a.p - b.p)[0]?.origin ?? null;
|
|
31533
|
+
}
|
|
31448
31534
|
/**
|
|
31449
31535
|
* Optional client-side hints sent at session creation to help the provider
|
|
31450
31536
|
* pick the best native source. All fields optional — a viewer that knows
|
|
@@ -36148,7 +36234,7 @@ var LocalInterfaceSchema = zod.z.object({
|
|
|
36148
36234
|
name: zod.z.string(),
|
|
36149
36235
|
family: zod.z.enum(["IPv4", "IPv6"]),
|
|
36150
36236
|
address: zod.z.string(),
|
|
36151
|
-
/** CIDR shorthand (e.g. `192.168.
|
|
36237
|
+
/** CIDR shorthand (e.g. `192.168.10.10/24`). Empty when OS doesn't expose. */
|
|
36152
36238
|
cidr: zod.z.string(),
|
|
36153
36239
|
/** OS netmask. Stable across calls so the SDK can hash on it. */
|
|
36154
36240
|
netmask: zod.z.string(),
|
|
@@ -36202,7 +36288,8 @@ var ConnectionEndpointSchema = zod.z.object({
|
|
|
36202
36288
|
"lan-ipv4",
|
|
36203
36289
|
"lan-ipv6",
|
|
36204
36290
|
"public",
|
|
36205
|
-
"loopback"
|
|
36291
|
+
"loopback",
|
|
36292
|
+
"app-link"
|
|
36206
36293
|
]),
|
|
36207
36294
|
/**
|
|
36208
36295
|
* Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
|
|
@@ -36271,15 +36358,27 @@ var GetConnectionEndpointsResultSchema = zod.z.object({
|
|
|
36271
36358
|
localPort: AdvertisedLocalPortSchema
|
|
36272
36359
|
});
|
|
36273
36360
|
/**
|
|
36274
|
-
* The
|
|
36275
|
-
*
|
|
36276
|
-
*
|
|
36361
|
+
* The address flagged for notification links. `baseUrl: null` = AUTO, which
|
|
36362
|
+
* since D709 is the CamStack app link; `resolved` reports the effective value,
|
|
36363
|
+
* so the UI can show it either way.
|
|
36277
36364
|
*/
|
|
36278
36365
|
var NotificationEndpointSchema = zod.z.object({
|
|
36279
36366
|
/** The operator's explicit choice, or null for AUTO. */
|
|
36280
36367
|
baseUrl: zod.z.string().nullable(),
|
|
36281
|
-
/**
|
|
36282
|
-
|
|
36368
|
+
/**
|
|
36369
|
+
* The effective flagged address: the explicit choice, else (AUTO) the
|
|
36370
|
+
* CamStack app link `https://camstack.zentik.app` (D709). A pre-D709 hub
|
|
36371
|
+
* answered the public tunnel / mesh here, or null.
|
|
36372
|
+
*/
|
|
36373
|
+
resolved: zod.z.string().nullable(),
|
|
36374
|
+
/**
|
|
36375
|
+
* The hub origin an app link carries as `hub=` (D709): the hub's best
|
|
36376
|
+
* public HTTPS address — the tunnel, then the mesh (Tailscale MagicDNS) —
|
|
36377
|
+
* picked from this cap's own palette by `pickAppLinkHub`. `null` when the
|
|
36378
|
+
* hub advertises neither; the app link is then minted without `hub=`.
|
|
36379
|
+
* Absent on a pre-D709 hub.
|
|
36380
|
+
*/
|
|
36381
|
+
appLinkHub: zod.z.string().nullable()
|
|
36283
36382
|
});
|
|
36284
36383
|
/**
|
|
36285
36384
|
* The URLs the SDK / viewer should race for API access. `baseUrls` empty =
|
|
@@ -36347,7 +36446,7 @@ var localNetworkCapability = {
|
|
|
36347
36446
|
* every client a second authority on a socket only the hub binds. A viewer
|
|
36348
36447
|
* configured with a port-less public URL (`https://camstack.example.top`)
|
|
36349
36448
|
* infers 443 from the scheme, asks with 443, and was handed
|
|
36350
|
-
* `https://192.168.
|
|
36449
|
+
* `https://192.168.10.9:443` for a hub listening on 4443. That candidate
|
|
36351
36450
|
* cannot ever answer, and losing its race reads in the log exactly like
|
|
36352
36451
|
* "the LAN was tried and it was slower" — so an operator sitting on his own
|
|
36353
36452
|
* WiFi stayed on the public tunnel for weeks, with the LAN candidate born
|
|
@@ -36380,13 +36479,21 @@ var localNetworkCapability = {
|
|
|
36380
36479
|
* Pass `'https'` when the caller is itself loaded over HTTPS
|
|
36381
36480
|
* to avoid mixed-content blocks in the browser. The public
|
|
36382
36481
|
* tunnel always emits `https://` regardless. */
|
|
36383
|
-
scheme: zod.z.enum(["http", "https"]).optional()
|
|
36482
|
+
scheme: zod.z.enum(["http", "https"]).optional(),
|
|
36483
|
+
/** Append the CamStack app link entry (`kind: 'app-link'`, D709) —
|
|
36484
|
+
* an address notification links can be flagged with, not a hub
|
|
36485
|
+
* route. Default `false`: racers and rankers never see it. */
|
|
36486
|
+
includeAppLink: zod.z.boolean().optional()
|
|
36384
36487
|
}), GetConnectionEndpointsResultSchema),
|
|
36385
36488
|
/**
|
|
36386
|
-
* The
|
|
36387
|
-
*
|
|
36388
|
-
*
|
|
36389
|
-
*
|
|
36489
|
+
* The address notification links are flagged with. `baseUrl: null` means
|
|
36490
|
+
* AUTO, which is the CamStack app link (D709): viewer taps go through
|
|
36491
|
+
* `https://camstack.zentik.app/…?hub=<appLinkHub>` and open the app. Any
|
|
36492
|
+
* hub address the palette lists can be flagged instead; then viewer taps,
|
|
36493
|
+
* attachment links and action buttons all use it. Signed media and
|
|
36494
|
+
* buttons never use the app link — with it flagged (or AUTO) they keep
|
|
36495
|
+
* the ranked hub ladder (a configured origin, a connected tunnel, then
|
|
36496
|
+
* the LAN), never loopback.
|
|
36390
36497
|
*
|
|
36391
36498
|
* Why an explicit marker: the automatic ranking cannot know which of
|
|
36392
36499
|
* several reachable addresses the RECIPIENT can actually open. A link is
|
|
@@ -36800,7 +36907,7 @@ var MeshPeerSchema = zod.z.object({
|
|
|
36800
36907
|
tags: zod.z.array(zod.z.string()).readonly(),
|
|
36801
36908
|
/** True when the peer advertises itself as an exit-node candidate. */
|
|
36802
36909
|
exitNodeOption: zod.z.boolean(),
|
|
36803
|
-
/** Subnet routes the peer advertises (e.g. `["192.168.
|
|
36910
|
+
/** Subnet routes the peer advertises (e.g. `["192.168.10.0/24"]`). */
|
|
36804
36911
|
advertisedRoutes: zod.z.array(zod.z.string()).readonly(),
|
|
36805
36912
|
/** Owner account login (e.g. `foo@example.com`). Null for tagged peers. */
|
|
36806
36913
|
userLogin: zod.z.string().nullable(),
|
|
@@ -58617,12 +58724,14 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
58617
58724
|
{
|
|
58618
58725
|
id: "addons",
|
|
58619
58726
|
family: "system",
|
|
58620
|
-
label: "Addons",
|
|
58621
|
-
kinds: [
|
|
58622
|
-
|
|
58623
|
-
|
|
58624
|
-
|
|
58625
|
-
|
|
58727
|
+
label: "Addons stopped",
|
|
58728
|
+
kinds: ["addon-crash-loop"]
|
|
58729
|
+
},
|
|
58730
|
+
{
|
|
58731
|
+
id: "addon-updates",
|
|
58732
|
+
family: "system",
|
|
58733
|
+
label: "Addon updates",
|
|
58734
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
58626
58735
|
},
|
|
58627
58736
|
{
|
|
58628
58737
|
id: "updates",
|
|
@@ -58782,13 +58891,15 @@ var STATE_SUMMARY_SECTION_VARS = [
|
|
|
58782
58891
|
},
|
|
58783
58892
|
{
|
|
58784
58893
|
name: "summaryAddons",
|
|
58785
|
-
label: "Summary: addons",
|
|
58786
|
-
example: "
|
|
58787
|
-
kinds: [
|
|
58788
|
-
|
|
58789
|
-
|
|
58790
|
-
|
|
58791
|
-
|
|
58894
|
+
label: "Summary: addons stopped",
|
|
58895
|
+
example: "hub — recorder stopped after repeated crashes",
|
|
58896
|
+
kinds: ["addon-crash-loop"]
|
|
58897
|
+
},
|
|
58898
|
+
{
|
|
58899
|
+
name: "summaryAddonUpdates",
|
|
58900
|
+
label: "Summary: addon updates",
|
|
58901
|
+
example: "hub:\n• @camstack/addon-recorder 1.2.3 → 1.2.4",
|
|
58902
|
+
kinds: ["addon-update-available", "addon-updated"]
|
|
58792
58903
|
},
|
|
58793
58904
|
{
|
|
58794
58905
|
name: "summaryUpdates",
|
|
@@ -58872,6 +58983,7 @@ var STATE_SUMMARY_VARS = [
|
|
|
58872
58983
|
[...RULE_BODY_ONLY],
|
|
58873
58984
|
[...RULE_TEXT],
|
|
58874
58985
|
([...RULE_TEXT], [...DEVICE_EVENTS]),
|
|
58986
|
+
([...RULE_TEXT], [...COMBINED_ALARM]),
|
|
58875
58987
|
([...RULE_TEXT], [...DEVICE_EVENTS]),
|
|
58876
58988
|
([...RULE_TEXT], [...BATTERY, ...CONSUMABLE]),
|
|
58877
58989
|
([...RULE_TEXT], [...CONSUMABLE]),
|
|
@@ -59639,6 +59751,12 @@ Object.defineProperty(exports, "CAMERA_SWITCH_ORDER", {
|
|
|
59639
59751
|
return CAMERA_SWITCH_ORDER;
|
|
59640
59752
|
}
|
|
59641
59753
|
});
|
|
59754
|
+
Object.defineProperty(exports, "CAMSTACK_APP_LINK_ORIGIN", {
|
|
59755
|
+
enumerable: true,
|
|
59756
|
+
get: function() {
|
|
59757
|
+
return CAMSTACK_APP_LINK_ORIGIN;
|
|
59758
|
+
}
|
|
59759
|
+
});
|
|
59642
59760
|
Object.defineProperty(exports, "CAP_NAMES_WITH_STATUS", {
|
|
59643
59761
|
enumerable: true,
|
|
59644
59762
|
get: function() {
|
|
@@ -60473,6 +60591,12 @@ Object.defineProperty(exports, "parseStreamParamsFormPatch", {
|
|
|
60473
60591
|
return parseStreamParamsFormPatch;
|
|
60474
60592
|
}
|
|
60475
60593
|
});
|
|
60594
|
+
Object.defineProperty(exports, "pickAppLinkHub", {
|
|
60595
|
+
enumerable: true,
|
|
60596
|
+
get: function() {
|
|
60597
|
+
return pickAppLinkHub;
|
|
60598
|
+
}
|
|
60599
|
+
});
|
|
60476
60600
|
Object.defineProperty(exports, "planComposition", {
|
|
60477
60601
|
enumerable: true,
|
|
60478
60602
|
get: function() {
|