@camstack/system 1.2.358 → 1.2.359
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 +2 -2
- package/dist/builtins/composer/composer.addon.mjs +2 -2
- 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 +2 -2
- package/dist/builtins/device-manager/device-manager.addon.mjs +2 -2
- 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/address-book.d.ts +69 -0
- package/dist/builtins/local-network/local-network.addon.d.ts +38 -45
- package/dist/builtins/local-network/local-network.addon.js +359 -76
- package/dist/builtins/local-network/local-network.addon.mjs +360 -75
- 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 +1 -1
- package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
- 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-C2dFiu87.mjs → child-cap-dispatch-Dm1TRDCr.mjs} +1 -1
- package/dist/{child-cap-dispatch-BWk99kmA.js → child-cap-dispatch-t61ohDpb.js} +1 -1
- package/dist/{composition-sources-BaHPH661.js → composition-sources-CCU_KizO.js} +1 -1
- package/dist/{composition-sources-D8Hapyav.mjs → composition-sources-CHlfWHl6.mjs} +1 -1
- package/dist/{dist-DzAHit0a.js → dist-W_X44h-s.js} +386 -106
- package/dist/{dist-D3bhbMY3.mjs → dist-pTfD_M-U.mjs} +353 -103
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{retired-settings-keys-B6AFmtlO.mjs → retired-settings-keys-CK_ifret.mjs} +1 -1
- package/dist/{retired-settings-keys-CkXoPjKy.js → retired-settings-keys-jglEzgWR.js} +1 -1
- package/package.json +1 -1
|
@@ -710,7 +710,7 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
710
710
|
return EventCategory;
|
|
711
711
|
}({});
|
|
712
712
|
//#endregion
|
|
713
|
-
//#region ../types/dist/sleep-
|
|
713
|
+
//#region ../types/dist/sleep-C16NCZR2.mjs
|
|
714
714
|
/**
|
|
715
715
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
716
716
|
* window to float samples (D455).
|
|
@@ -17178,6 +17178,59 @@ var filesystemBrowseCapability = {
|
|
|
17178
17178
|
})
|
|
17179
17179
|
}
|
|
17180
17180
|
};
|
|
17181
|
+
/** The central link domain the viewer app claims (Universal Links / App Links). */
|
|
17182
|
+
var CAMSTACK_APP_LINK_ORIGIN = "https://camstack.zentik.app";
|
|
17183
|
+
/** True when `baseUrl` names the CamStack app link rather than a hub address. */
|
|
17184
|
+
function isAppLinkBase(baseUrl) {
|
|
17185
|
+
if (baseUrl === null || baseUrl === void 0 || baseUrl === "") return false;
|
|
17186
|
+
try {
|
|
17187
|
+
return new URL(baseUrl).origin === CAMSTACK_APP_LINK_ORIGIN;
|
|
17188
|
+
} catch {
|
|
17189
|
+
return false;
|
|
17190
|
+
}
|
|
17191
|
+
}
|
|
17192
|
+
/**
|
|
17193
|
+
* Reduce a base URL to the bare origin the central page accepts as `hub=`,
|
|
17194
|
+
* or `null` when it cannot be one: not http(s), carries credentials, or does
|
|
17195
|
+
* not parse. A path/query/fragment is dropped — the central page mounts the
|
|
17196
|
+
* viewer under the origin itself.
|
|
17197
|
+
*/
|
|
17198
|
+
function toAppLinkHubOrigin(baseUrl) {
|
|
17199
|
+
let parsed;
|
|
17200
|
+
try {
|
|
17201
|
+
parsed = new URL(baseUrl);
|
|
17202
|
+
} catch {
|
|
17203
|
+
return null;
|
|
17204
|
+
}
|
|
17205
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
|
|
17206
|
+
if (parsed.username !== "" || parsed.password !== "") return null;
|
|
17207
|
+
if (parsed.hostname === "") return null;
|
|
17208
|
+
return parsed.origin;
|
|
17209
|
+
}
|
|
17210
|
+
/**
|
|
17211
|
+
* The hub address an app link carries as `hub=`, chosen from the hub's OWN
|
|
17212
|
+
* advertised palette so it always agrees with what the Network page lists:
|
|
17213
|
+
* the public tunnel first, then the mesh (Tailscale MagicDNS) — HTTPS only,
|
|
17214
|
+
* because the app and the hosted viewer reach it from off the LAN. `null`
|
|
17215
|
+
* when the hub advertises neither.
|
|
17216
|
+
*/
|
|
17217
|
+
function pickAppLinkHub(endpoints) {
|
|
17218
|
+
const rank = (e) => {
|
|
17219
|
+
if (e.kind !== "public" || !e.baseUrl.startsWith("https://")) return null;
|
|
17220
|
+
if (e.interfaceKind === "public") return 0;
|
|
17221
|
+
if (e.interfaceKind === "vpn") return 1;
|
|
17222
|
+
return null;
|
|
17223
|
+
};
|
|
17224
|
+
return endpoints.flatMap((e) => {
|
|
17225
|
+
const r = rank(e);
|
|
17226
|
+
const origin = toAppLinkHubOrigin(e.baseUrl);
|
|
17227
|
+
return r === null || origin === null ? [] : [{
|
|
17228
|
+
r,
|
|
17229
|
+
p: e.priority,
|
|
17230
|
+
origin
|
|
17231
|
+
}];
|
|
17232
|
+
}).toSorted((a, b) => a.r - b.r || a.p - b.p)[0]?.origin ?? null;
|
|
17233
|
+
}
|
|
17181
17234
|
var IPV4_LITERAL = /^\d{1,3}(?:\.\d{1,3}){3}$/;
|
|
17182
17235
|
function hostnameOf(baseUrl) {
|
|
17183
17236
|
try {
|
|
@@ -17187,6 +17240,9 @@ function hostnameOf(baseUrl) {
|
|
|
17187
17240
|
return null;
|
|
17188
17241
|
}
|
|
17189
17242
|
}
|
|
17243
|
+
function trimSlash(baseUrl) {
|
|
17244
|
+
return baseUrl.replace(/\/+$/, "");
|
|
17245
|
+
}
|
|
17190
17246
|
function isMesh(endpoint) {
|
|
17191
17247
|
return endpoint.kind === "public" && endpoint.interfaceKind === "vpn";
|
|
17192
17248
|
}
|
|
@@ -17201,11 +17257,11 @@ function isLanIpv4Literal(endpoint) {
|
|
|
17201
17257
|
const host = hostnameOf(endpoint.baseUrl);
|
|
17202
17258
|
return host !== null && IPV4_LITERAL.test(host);
|
|
17203
17259
|
}
|
|
17204
|
-
/** Lower = better; `null` = never this
|
|
17205
|
-
function
|
|
17206
|
-
if (endpoint.kind === "loopback" || endpoint.kind === "app-link") return null;
|
|
17260
|
+
/** Lower = better; `null` = never this role's AUTOMATIC answer. */
|
|
17261
|
+
function autoRankFor(role, endpoint) {
|
|
17262
|
+
if (endpoint.kind === "loopback" || endpoint.kind === "app-link" || endpoint.kind === "custom") return null;
|
|
17207
17263
|
if (hostnameOf(endpoint.baseUrl) === null) return null;
|
|
17208
|
-
if (
|
|
17264
|
+
if (role === "agents") {
|
|
17209
17265
|
if (isLanIpv4Literal(endpoint)) return 0;
|
|
17210
17266
|
if (isPlausibleLan(endpoint)) return 1;
|
|
17211
17267
|
if (isMesh(endpoint)) return 2;
|
|
@@ -17231,11 +17287,11 @@ function isLoopbackHost(hostname) {
|
|
|
17231
17287
|
return /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(h);
|
|
17232
17288
|
}
|
|
17233
17289
|
/**
|
|
17234
|
-
* Validate an operator-typed
|
|
17290
|
+
* Validate an operator-typed address: an http(s) URL with a host, no
|
|
17235
17291
|
* credentials, no path, and never loopback (it would name whoever dials it).
|
|
17236
17292
|
* Answers the normalised origin (`scheme://host[:port]`).
|
|
17237
17293
|
*/
|
|
17238
|
-
function
|
|
17294
|
+
function validateCustomAddress(raw) {
|
|
17239
17295
|
const trimmed = raw.trim();
|
|
17240
17296
|
if (trimmed === "") return {
|
|
17241
17297
|
ok: false,
|
|
@@ -17275,33 +17331,125 @@ function validateHubAddressOverride(raw) {
|
|
|
17275
17331
|
baseUrl: parsed.origin
|
|
17276
17332
|
};
|
|
17277
17333
|
}
|
|
17278
|
-
/**
|
|
17279
|
-
|
|
17280
|
-
|
|
17281
|
-
|
|
17282
|
-
|
|
17283
|
-
|
|
17284
|
-
|
|
17285
|
-
|
|
17286
|
-
|
|
17287
|
-
|
|
17288
|
-
|
|
17289
|
-
|
|
17290
|
-
|
|
17291
|
-
|
|
17292
|
-
|
|
17334
|
+
/** The reason a plain-http sign-in address is refused unless accepted. */
|
|
17335
|
+
var SIGN_IN_HTTP_REASON = "Sign-in needs an https:// address: passkeys and most identity providers refuse a plain-http origin. Accept http only for a sign-in that never leaves your own network.";
|
|
17336
|
+
/**
|
|
17337
|
+
* May `baseUrl` carry `role`? The address check above, plus two role rules:
|
|
17338
|
+
* the app link carries `notifications` only (it is not a hub address), and a
|
|
17339
|
+
* plain-http address carries `signIn` only when the operator explicitly
|
|
17340
|
+
* accepted it (`acceptInsecureHttp`) — a LAN-only password or magic-link
|
|
17341
|
+
* sign-in works over http, a passkey or an OIDC callback does not.
|
|
17342
|
+
*/
|
|
17343
|
+
function checkRoleAddress(role, baseUrl, options = {}) {
|
|
17344
|
+
if (isAppLinkBase(baseUrl)) return role === "notifications" ? {
|
|
17345
|
+
ok: true,
|
|
17346
|
+
baseUrl: CAMSTACK_APP_LINK_ORIGIN
|
|
17347
|
+
} : {
|
|
17348
|
+
ok: false,
|
|
17349
|
+
reason: "The CamStack app link is not a hub address — only notifications can use it."
|
|
17293
17350
|
};
|
|
17351
|
+
const check = validateCustomAddress(baseUrl);
|
|
17352
|
+
if (!check.ok) return check;
|
|
17353
|
+
if (role === "signIn" && check.baseUrl.startsWith("http:") && options.acceptInsecureHttp !== true) return {
|
|
17354
|
+
ok: false,
|
|
17355
|
+
reason: SIGN_IN_HTTP_REASON
|
|
17356
|
+
};
|
|
17357
|
+
return check;
|
|
17294
17358
|
}
|
|
17295
|
-
|
|
17359
|
+
/** A stored flag that still validates (stored values are external data). */
|
|
17360
|
+
function validFlag(role, flag) {
|
|
17361
|
+
if (flag === null || flag === "") return null;
|
|
17362
|
+
const check = checkRoleAddress(role, flag, { acceptInsecureHttp: true });
|
|
17363
|
+
return check.ok ? check.baseUrl : null;
|
|
17364
|
+
}
|
|
17365
|
+
function pickAuto(endpoints, role) {
|
|
17296
17366
|
const best = endpoints.flatMap((endpoint) => {
|
|
17297
|
-
const rank =
|
|
17367
|
+
const rank = autoRankFor(role, endpoint);
|
|
17298
17368
|
return rank === null ? [] : [{
|
|
17299
17369
|
rank,
|
|
17300
17370
|
priority: endpoint.priority,
|
|
17301
17371
|
endpoint
|
|
17302
17372
|
}];
|
|
17303
17373
|
}).toSorted((a, b) => a.rank - b.rank || a.priority - b.priority)[0];
|
|
17304
|
-
return best === void 0 ? null : best.endpoint.baseUrl
|
|
17374
|
+
return best === void 0 ? null : trimSlash(best.endpoint.baseUrl);
|
|
17375
|
+
}
|
|
17376
|
+
function resolveHubRole(endpoints, role, flag) {
|
|
17377
|
+
const flagged = validFlag(role, flag);
|
|
17378
|
+
if (flagged !== null) return {
|
|
17379
|
+
flagged,
|
|
17380
|
+
resolved: flagged,
|
|
17381
|
+
source: "flagged"
|
|
17382
|
+
};
|
|
17383
|
+
const auto = pickAuto(endpoints, role);
|
|
17384
|
+
return {
|
|
17385
|
+
flagged: null,
|
|
17386
|
+
resolved: auto,
|
|
17387
|
+
source: auto === null ? "none" : "auto"
|
|
17388
|
+
};
|
|
17389
|
+
}
|
|
17390
|
+
/** `agents`: what agents and LAN devices pull from. */
|
|
17391
|
+
function resolveAgentsAddress(endpoints, flags) {
|
|
17392
|
+
return resolveHubRole(endpoints, "agents", flags.agents);
|
|
17393
|
+
}
|
|
17394
|
+
/** `signIn`: sign-in links, OIDC callbacks, the relying party, OAuth2. */
|
|
17395
|
+
function resolveSignInAddress(endpoints, flags) {
|
|
17396
|
+
return resolveHubRole(endpoints, "signIn", flags.signIn);
|
|
17397
|
+
}
|
|
17398
|
+
/** `notifications`: the flagged address, else the CamStack app link (D709). */
|
|
17399
|
+
function resolveNotificationsAddress(flags) {
|
|
17400
|
+
const flagged = validFlag("notifications", flags.notifications);
|
|
17401
|
+
if (flagged !== null && !isAppLinkBase(flagged)) return {
|
|
17402
|
+
flagged,
|
|
17403
|
+
resolved: flagged,
|
|
17404
|
+
source: "flagged"
|
|
17405
|
+
};
|
|
17406
|
+
return {
|
|
17407
|
+
flagged: null,
|
|
17408
|
+
resolved: CAMSTACK_APP_LINK_ORIGIN,
|
|
17409
|
+
source: "auto"
|
|
17410
|
+
};
|
|
17411
|
+
}
|
|
17412
|
+
/** AUTO viewer race: LAN IPv4 + the public tunnel. Never IPv6, mesh, loopback or custom. */
|
|
17413
|
+
function isDefaultViewerEndpoint(endpoint) {
|
|
17414
|
+
if (endpoint.kind === "lan-ipv4") return true;
|
|
17415
|
+
return endpoint.kind === "public" && endpoint.interfaceKind === "public";
|
|
17416
|
+
}
|
|
17417
|
+
/**
|
|
17418
|
+
* The endpoints the apps race: the flagged ones that are in `endpoints`
|
|
17419
|
+
* (which carries the custom addresses flagged `viewer`), else AUTO. A flagged
|
|
17420
|
+
* set none of which is currently up falls back to AUTO rather than racing
|
|
17421
|
+
* nothing.
|
|
17422
|
+
*/
|
|
17423
|
+
function selectViewerEndpoints(endpoints, flags) {
|
|
17424
|
+
const auto = endpoints.filter(isDefaultViewerEndpoint);
|
|
17425
|
+
if (flags.viewer.length === 0) return auto;
|
|
17426
|
+
const wanted = new Set(flags.viewer);
|
|
17427
|
+
const explicit = endpoints.filter((e) => wanted.has(e.baseUrl));
|
|
17428
|
+
return explicit.length > 0 ? explicit : auto;
|
|
17429
|
+
}
|
|
17430
|
+
/** `viewer`: what the apps race and connect to. */
|
|
17431
|
+
function resolveViewerAddresses(endpoints, flags) {
|
|
17432
|
+
const wanted = new Set(flags.viewer);
|
|
17433
|
+
const selected = selectViewerEndpoints(endpoints, flags);
|
|
17434
|
+
const usedFlags = selected.some((e) => wanted.has(e.baseUrl));
|
|
17435
|
+
return {
|
|
17436
|
+
flagged: flags.viewer,
|
|
17437
|
+
resolved: selected.map((e) => e.baseUrl),
|
|
17438
|
+
source: selected.length === 0 ? "none" : usedFlags ? "flagged" : "auto"
|
|
17439
|
+
};
|
|
17440
|
+
}
|
|
17441
|
+
/**
|
|
17442
|
+
* Every role at once, each through its own resolver. `viewerPalette` is what
|
|
17443
|
+
* the apps race (it carries the custom addresses flagged `viewer`);
|
|
17444
|
+
* `hubPalette` is the detected HTTPS palette agents and sign-in resolve over.
|
|
17445
|
+
*/
|
|
17446
|
+
function resolveHubAddressRoles(viewerPalette, hubPalette, flags) {
|
|
17447
|
+
return {
|
|
17448
|
+
viewer: resolveViewerAddresses(viewerPalette, flags),
|
|
17449
|
+
notifications: resolveNotificationsAddress(flags),
|
|
17450
|
+
agents: resolveAgentsAddress(hubPalette, flags),
|
|
17451
|
+
signIn: resolveSignInAddress(hubPalette, flags)
|
|
17452
|
+
};
|
|
17305
17453
|
}
|
|
17306
17454
|
/**
|
|
17307
17455
|
* Transport bounds for AI capability methods.
|
|
@@ -31715,50 +31863,6 @@ var videoclipsCapability = {
|
|
|
31715
31863
|
})
|
|
31716
31864
|
}
|
|
31717
31865
|
};
|
|
31718
|
-
/** The central link domain the viewer app claims (Universal Links / App Links). */
|
|
31719
|
-
var CAMSTACK_APP_LINK_ORIGIN = "https://camstack.zentik.app";
|
|
31720
|
-
/**
|
|
31721
|
-
* Reduce a base URL to the bare origin the central page accepts as `hub=`,
|
|
31722
|
-
* or `null` when it cannot be one: not http(s), carries credentials, or does
|
|
31723
|
-
* not parse. A path/query/fragment is dropped — the central page mounts the
|
|
31724
|
-
* viewer under the origin itself.
|
|
31725
|
-
*/
|
|
31726
|
-
function toAppLinkHubOrigin(baseUrl) {
|
|
31727
|
-
let parsed;
|
|
31728
|
-
try {
|
|
31729
|
-
parsed = new URL(baseUrl);
|
|
31730
|
-
} catch {
|
|
31731
|
-
return null;
|
|
31732
|
-
}
|
|
31733
|
-
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
|
|
31734
|
-
if (parsed.username !== "" || parsed.password !== "") return null;
|
|
31735
|
-
if (parsed.hostname === "") return null;
|
|
31736
|
-
return parsed.origin;
|
|
31737
|
-
}
|
|
31738
|
-
/**
|
|
31739
|
-
* The hub address an app link carries as `hub=`, chosen from the hub's OWN
|
|
31740
|
-
* advertised palette so it always agrees with what the Network page lists:
|
|
31741
|
-
* the public tunnel first, then the mesh (Tailscale MagicDNS) — HTTPS only,
|
|
31742
|
-
* because the app and the hosted viewer reach it from off the LAN. `null`
|
|
31743
|
-
* when the hub advertises neither.
|
|
31744
|
-
*/
|
|
31745
|
-
function pickAppLinkHub(endpoints) {
|
|
31746
|
-
const rank = (e) => {
|
|
31747
|
-
if (e.kind !== "public" || !e.baseUrl.startsWith("https://")) return null;
|
|
31748
|
-
if (e.interfaceKind === "public") return 0;
|
|
31749
|
-
if (e.interfaceKind === "vpn") return 1;
|
|
31750
|
-
return null;
|
|
31751
|
-
};
|
|
31752
|
-
return endpoints.flatMap((e) => {
|
|
31753
|
-
const r = rank(e);
|
|
31754
|
-
const origin = toAppLinkHubOrigin(e.baseUrl);
|
|
31755
|
-
return r === null || origin === null ? [] : [{
|
|
31756
|
-
r,
|
|
31757
|
-
p: e.priority,
|
|
31758
|
-
origin
|
|
31759
|
-
}];
|
|
31760
|
-
}).toSorted((a, b) => a.r - b.r || a.p - b.p)[0]?.origin ?? null;
|
|
31761
|
-
}
|
|
31762
31866
|
/**
|
|
31763
31867
|
* Optional client-side hints sent at session creation to help the provider
|
|
31764
31868
|
* pick the best native source. All fields optional — a viewer that knows
|
|
@@ -32234,6 +32338,35 @@ var webrtcSessionCapability = {
|
|
|
32234
32338
|
alive: zod.z.boolean()
|
|
32235
32339
|
})),
|
|
32236
32340
|
/**
|
|
32341
|
+
* The viewer's downlink probe, for ONE live session (D733).
|
|
32342
|
+
*
|
|
32343
|
+
* The player measures `/adaptive-probe` after the session's first decoded
|
|
32344
|
+
* frame (D635). It used to act on the reading itself, by opening a SECOND
|
|
32345
|
+
* session with `hints.downlinkMbps` — every adaptive live open became two
|
|
32346
|
+
* sessions, two ICE + DTLS handshakes and two server pipelines. It now
|
|
32347
|
+
* hands the measurement to the session it already has; the provider picks
|
|
32348
|
+
* the rung exactly as it would from an offer's hints (same viewport
|
|
32349
|
+
* ceiling) and moves the session there — in place when the negotiated
|
|
32350
|
+
* codec carries the new rendition, by the existing re-offer
|
|
32351
|
+
* (`getSessionState.pendingRenegotiation`) when it cannot.
|
|
32352
|
+
*
|
|
32353
|
+
* A MEASUREMENT, never a tier: the client does not choose. A probe only
|
|
32354
|
+
* raises the rung; lowering it stays the ladder's call on delivery.
|
|
32355
|
+
* `held` answers why nothing moved (`not-adaptive`, `pinned`,
|
|
32356
|
+
* `already-there`, `recorded`, …) — a client that gets ANY answer must not
|
|
32357
|
+
* fall back to a reconnect; only a provider that does not know the method
|
|
32358
|
+
* (an older hub) leaves the client its legacy second session.
|
|
32359
|
+
*/
|
|
32360
|
+
applyDownlinkProbe: method(zod.z.object({
|
|
32361
|
+
deviceId: zod.z.number().int().nonnegative(),
|
|
32362
|
+
sessionId: zod.z.string(),
|
|
32363
|
+
downlinkMbps: zod.z.number().nonnegative()
|
|
32364
|
+
}), zod.z.object({
|
|
32365
|
+
outcome: zod.z.enum(["switching", "held"]),
|
|
32366
|
+
tier: CamProfileSchema.nullable(),
|
|
32367
|
+
reason: zod.z.string()
|
|
32368
|
+
}), { kind: "mutation" }),
|
|
32369
|
+
/**
|
|
32237
32370
|
* The SERVER's half of the stream-debug overlay, for one live session.
|
|
32238
32371
|
*
|
|
32239
32372
|
* The client can measure its own transport (`getStats()`); it cannot see
|
|
@@ -36517,7 +36650,8 @@ var ConnectionEndpointSchema = zod.z.object({
|
|
|
36517
36650
|
"lan-ipv6",
|
|
36518
36651
|
"public",
|
|
36519
36652
|
"loopback",
|
|
36520
|
-
"app-link"
|
|
36653
|
+
"app-link",
|
|
36654
|
+
"custom"
|
|
36521
36655
|
]),
|
|
36522
36656
|
/**
|
|
36523
36657
|
* Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
|
|
@@ -36620,13 +36754,12 @@ var ViewerEndpointsSchema = zod.z.object({
|
|
|
36620
36754
|
resolved: zod.z.array(zod.z.string()).readonly()
|
|
36621
36755
|
});
|
|
36622
36756
|
/**
|
|
36623
|
-
*
|
|
36624
|
-
*
|
|
36757
|
+
* DEPRECATED compatibility shape of `getHubAddresses` (D729 amendment, kept
|
|
36758
|
+
* one release for addons built against it): `cluster` is the `agents` role,
|
|
36759
|
+
* `browser` the `signIn` role; `override` is the flagged address.
|
|
36625
36760
|
*/
|
|
36626
36761
|
var HubAddressSnapshotSchema = zod.z.object({
|
|
36627
|
-
/** The operator's override, or null for automatic. */
|
|
36628
36762
|
override: zod.z.string().nullable(),
|
|
36629
|
-
/** The address in use, or null when nothing qualifies (never loopback). */
|
|
36630
36763
|
resolved: zod.z.string().nullable(),
|
|
36631
36764
|
source: zod.z.enum([
|
|
36632
36765
|
"override",
|
|
@@ -36635,11 +36768,67 @@ var HubAddressSnapshotSchema = zod.z.object({
|
|
|
36635
36768
|
])
|
|
36636
36769
|
});
|
|
36637
36770
|
var HubAddressesSchema = zod.z.object({
|
|
36638
|
-
/** "Hub address for agents" — agents' bundle/model pulls, LAN devices. */
|
|
36639
36771
|
cluster: HubAddressSnapshotSchema,
|
|
36640
|
-
/** "Public address for sign-in links" — e-mail links, OIDC, WebAuthn, OAuth2. */
|
|
36641
36772
|
browser: HubAddressSnapshotSchema
|
|
36642
36773
|
});
|
|
36774
|
+
/**
|
|
36775
|
+
* What an address is used for (`hub-address.ts`). `viewer` is many-valued;
|
|
36776
|
+
* `notifications`, `agents` and `signIn` are carried by at most one address.
|
|
36777
|
+
*/
|
|
36778
|
+
var HubAddressRoleSchema = zod.z.enum([
|
|
36779
|
+
"viewer",
|
|
36780
|
+
"notifications",
|
|
36781
|
+
"agents",
|
|
36782
|
+
"signIn"
|
|
36783
|
+
]);
|
|
36784
|
+
var RoleSourceSchema = zod.z.enum([
|
|
36785
|
+
"flagged",
|
|
36786
|
+
"auto",
|
|
36787
|
+
"none"
|
|
36788
|
+
]);
|
|
36789
|
+
/** One single-valued role: the flagged address, the one in use, and why. */
|
|
36790
|
+
var HubAddressRoleResolutionSchema = zod.z.object({
|
|
36791
|
+
/** The address carrying the flag, or null = automatic. */
|
|
36792
|
+
flagged: zod.z.string().nullable(),
|
|
36793
|
+
/** The address in use, or null when nothing qualifies (never loopback). */
|
|
36794
|
+
resolved: zod.z.string().nullable(),
|
|
36795
|
+
source: RoleSourceSchema
|
|
36796
|
+
});
|
|
36797
|
+
var HubViewerResolutionSchema = zod.z.object({
|
|
36798
|
+
/** The addresses flagged `viewer`, or empty = automatic. */
|
|
36799
|
+
flagged: zod.z.array(zod.z.string()).readonly(),
|
|
36800
|
+
/** What the apps race right now. */
|
|
36801
|
+
resolved: zod.z.array(zod.z.string()).readonly(),
|
|
36802
|
+
source: RoleSourceSchema
|
|
36803
|
+
});
|
|
36804
|
+
/**
|
|
36805
|
+
* One row of the Network page's Addresses table: a detected endpoint, an
|
|
36806
|
+
* operator-entered custom address, or the CamStack app link — flagged the
|
|
36807
|
+
* same way. A URL that is both detected and entered is ONE row.
|
|
36808
|
+
*/
|
|
36809
|
+
var HubAddressRowSchema = ConnectionEndpointSchema.extend({
|
|
36810
|
+
/** In the hub's detected palette right now. */
|
|
36811
|
+
detected: zod.z.boolean(),
|
|
36812
|
+
/** Entered by the operator (removable). */
|
|
36813
|
+
custom: zod.z.boolean(),
|
|
36814
|
+
/** The roles explicitly flagged on this address. */
|
|
36815
|
+
flags: zod.z.array(HubAddressRoleSchema).readonly(),
|
|
36816
|
+
/** The roles this address serves right now — flagged or automatic. */
|
|
36817
|
+
inUse: zod.z.array(HubAddressRoleSchema).readonly(),
|
|
36818
|
+
/** The roles this address may be flagged with. */
|
|
36819
|
+
eligible: zod.z.array(HubAddressRoleSchema).readonly()
|
|
36820
|
+
});
|
|
36821
|
+
var HubAddressBookSchema = zod.z.object({
|
|
36822
|
+
rows: zod.z.array(HubAddressRowSchema).readonly(),
|
|
36823
|
+
roles: zod.z.object({
|
|
36824
|
+
viewer: HubViewerResolutionSchema,
|
|
36825
|
+
notifications: HubAddressRoleResolutionSchema,
|
|
36826
|
+
agents: HubAddressRoleResolutionSchema,
|
|
36827
|
+
signIn: HubAddressRoleResolutionSchema
|
|
36828
|
+
}),
|
|
36829
|
+
/** The `hub=` an app link carries (D709), or null. */
|
|
36830
|
+
appLinkHub: zod.z.string().nullable()
|
|
36831
|
+
});
|
|
36643
36832
|
var AllowedAddressesSchema = zod.z.object({
|
|
36644
36833
|
/**
|
|
36645
36834
|
* Allowlist of interface addresses operators have explicitly opted
|
|
@@ -36752,46 +36941,78 @@ var localNetworkCapability = {
|
|
|
36752
36941
|
*/
|
|
36753
36942
|
getNotificationEndpoint: method(zod.z.void(), NotificationEndpointSchema),
|
|
36754
36943
|
/**
|
|
36755
|
-
*
|
|
36756
|
-
*
|
|
36757
|
-
*
|
|
36758
|
-
*
|
|
36944
|
+
* @deprecated Use `setAddressRole({ role: 'notifications', … })`. Kept so
|
|
36945
|
+
* an older admin UI keeps working: it writes the same `notifications`
|
|
36946
|
+
* flag, with the same validation. `baseUrl: null` restores automatic; an
|
|
36947
|
+
* address that is not detected becomes a custom address.
|
|
36759
36948
|
*/
|
|
36760
36949
|
setNotificationEndpoint: method(zod.z.object({ baseUrl: zod.z.string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
|
|
36761
36950
|
/**
|
|
36762
|
-
* The
|
|
36763
|
-
*
|
|
36764
|
-
*
|
|
36765
|
-
*
|
|
36951
|
+
* The `viewer` role as shipped apps read it: the flagged addresses
|
|
36952
|
+
* (detected or custom), or empty for AUTO — every LAN IPv4 address plus
|
|
36953
|
+
* the public tunnel, never IPv6, mesh, loopback or a custom address.
|
|
36954
|
+
* `resolved` is the set as it stands right now; the custom ones in it are
|
|
36955
|
+
* also in `getConnectionEndpoints`, which the apps filter by it.
|
|
36766
36956
|
*/
|
|
36767
36957
|
getViewerEndpoints: method(zod.z.void(), ViewerEndpointsSchema),
|
|
36768
36958
|
/**
|
|
36769
|
-
*
|
|
36770
|
-
*
|
|
36771
|
-
*
|
|
36959
|
+
* @deprecated Use `setAddressRole({ role: 'viewer', … })`. Kept so an
|
|
36960
|
+
* older admin UI keeps working: it replaces the same `viewer` flags.
|
|
36961
|
+
* Empty `baseUrls` restores automatic.
|
|
36772
36962
|
*/
|
|
36773
36963
|
setViewerEndpoints: method(zod.z.object({ baseUrls: zod.z.array(zod.z.string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
|
|
36774
36964
|
/**
|
|
36775
|
-
* The
|
|
36776
|
-
*
|
|
36777
|
-
*
|
|
36778
|
-
*
|
|
36779
|
-
*
|
|
36965
|
+
* The Network page's Addresses table and every role's answer — the ONE
|
|
36966
|
+
* reading of "which address is this hub reached at, for what": detected
|
|
36967
|
+
* endpoints and custom addresses with their role flags, and per role the
|
|
36968
|
+
* flagged address, the one in use and whether it is automatic. Agent
|
|
36969
|
+
* deliveries, sign-in and LAN devices read `roles.agents` / `roles.signIn`
|
|
36970
|
+
* here; nothing ranks the palette itself. `scheme` is the one the caller
|
|
36971
|
+
* shows LAN rows in (as `getConnectionEndpoints`); agents and sign-in are
|
|
36972
|
+
* always resolved over the HTTPS palette.
|
|
36780
36973
|
*/
|
|
36781
|
-
|
|
36974
|
+
getAddresses: method(zod.z.object({ scheme: zod.z.enum(["http", "https"]).optional() }).optional(), HubAddressBookSchema),
|
|
36975
|
+
/**
|
|
36976
|
+
* Add a custom address. Validated: an http(s) origin with a host, no
|
|
36977
|
+
* credentials, no path, never loopback — an invalid one is refused with
|
|
36978
|
+
* the reason and nothing is stored. Adding an address that already exists
|
|
36979
|
+
* only updates its label.
|
|
36980
|
+
*/
|
|
36981
|
+
addCustomAddress: method(zod.z.object({
|
|
36982
|
+
baseUrl: zod.z.string(),
|
|
36983
|
+
label: zod.z.string().max(80)
|
|
36984
|
+
}), HubAddressBookSchema, {
|
|
36985
|
+
kind: "mutation",
|
|
36986
|
+
auth: "admin"
|
|
36987
|
+
}),
|
|
36988
|
+
/** Remove a custom address. Its role flags go with it (those roles turn automatic). */
|
|
36989
|
+
removeCustomAddress: method(zod.z.object({ baseUrl: zod.z.string() }), HubAddressBookSchema, {
|
|
36990
|
+
kind: "mutation",
|
|
36991
|
+
auth: "admin"
|
|
36992
|
+
}),
|
|
36782
36993
|
/**
|
|
36783
|
-
*
|
|
36784
|
-
*
|
|
36785
|
-
*
|
|
36994
|
+
* Flag (`enabled: true`) or unflag an address for a role. For a
|
|
36995
|
+
* single-valued role, flagging moves the flag off every other address.
|
|
36996
|
+
* `baseUrl: null` returns the role to automatic. The address must be a row
|
|
36997
|
+
* of the table (detected, custom, or the app link for notifications);
|
|
36998
|
+
* `signIn` on a plain-http address is refused unless `acceptInsecureHttp`.
|
|
36786
36999
|
*/
|
|
36787
|
-
|
|
36788
|
-
|
|
36789
|
-
baseUrl: zod.z.string().nullable()
|
|
36790
|
-
|
|
37000
|
+
setAddressRole: method(zod.z.object({
|
|
37001
|
+
role: HubAddressRoleSchema,
|
|
37002
|
+
baseUrl: zod.z.string().nullable(),
|
|
37003
|
+
enabled: zod.z.boolean(),
|
|
37004
|
+
acceptInsecureHttp: zod.z.boolean().optional()
|
|
37005
|
+
}), HubAddressBookSchema, {
|
|
36791
37006
|
kind: "mutation",
|
|
36792
37007
|
auth: "admin"
|
|
36793
37008
|
}),
|
|
36794
37009
|
/**
|
|
37010
|
+
* @deprecated Read `getAddresses().roles.agents` / `.signIn`. Kept one
|
|
37011
|
+
* release so an addon built against the D729 amendment keeps resolving:
|
|
37012
|
+
* `cluster` = the `agents` role, `browser` = the `signIn` role.
|
|
37013
|
+
*/
|
|
37014
|
+
getHubAddresses: method(zod.z.void(), HubAddressesSchema),
|
|
37015
|
+
/**
|
|
36795
37016
|
* Read the operator's allowlist. Empty = "auto" (no filter). Used
|
|
36796
37017
|
* by the admin UI's address selector to seed its checkbox state.
|
|
36797
37018
|
*/
|
|
@@ -49886,12 +50107,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
49886
50107
|
addonId: null,
|
|
49887
50108
|
access: "view"
|
|
49888
50109
|
},
|
|
50110
|
+
"localNetwork.addCustomAddress": {
|
|
50111
|
+
capName: "local-network",
|
|
50112
|
+
capScope: "system",
|
|
50113
|
+
addonId: null,
|
|
50114
|
+
access: "create"
|
|
50115
|
+
},
|
|
49889
50116
|
"localNetwork.downloadCa": {
|
|
49890
50117
|
capName: "local-network",
|
|
49891
50118
|
capScope: "system",
|
|
49892
50119
|
addonId: null,
|
|
49893
50120
|
access: "view"
|
|
49894
50121
|
},
|
|
50122
|
+
"localNetwork.getAddresses": {
|
|
50123
|
+
capName: "local-network",
|
|
50124
|
+
capScope: "system",
|
|
50125
|
+
addonId: null,
|
|
50126
|
+
access: "view"
|
|
50127
|
+
},
|
|
49895
50128
|
"localNetwork.getAllowedAddresses": {
|
|
49896
50129
|
capName: "local-network",
|
|
49897
50130
|
capScope: "system",
|
|
@@ -49946,6 +50179,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
49946
50179
|
addonId: null,
|
|
49947
50180
|
access: "create"
|
|
49948
50181
|
},
|
|
50182
|
+
"localNetwork.removeCustomAddress": {
|
|
50183
|
+
capName: "local-network",
|
|
50184
|
+
capScope: "system",
|
|
50185
|
+
addonId: null,
|
|
50186
|
+
access: "delete"
|
|
50187
|
+
},
|
|
49949
50188
|
"localNetwork.resetAllowlistToBestMatch": {
|
|
49950
50189
|
capName: "local-network",
|
|
49951
50190
|
capScope: "system",
|
|
@@ -49958,13 +50197,13 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
49958
50197
|
addonId: null,
|
|
49959
50198
|
access: "create"
|
|
49960
50199
|
},
|
|
49961
|
-
"localNetwork.
|
|
50200
|
+
"localNetwork.setAddressRole": {
|
|
49962
50201
|
capName: "local-network",
|
|
49963
50202
|
capScope: "system",
|
|
49964
50203
|
addonId: null,
|
|
49965
50204
|
access: "create"
|
|
49966
50205
|
},
|
|
49967
|
-
"localNetwork.
|
|
50206
|
+
"localNetwork.setAllowedAddresses": {
|
|
49968
50207
|
capName: "local-network",
|
|
49969
50208
|
capScope: "system",
|
|
49970
50209
|
addonId: null,
|
|
@@ -54218,6 +54457,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
54218
54457
|
addonId: null,
|
|
54219
54458
|
access: "create"
|
|
54220
54459
|
},
|
|
54460
|
+
"webrtcSession.applyDownlinkProbe": {
|
|
54461
|
+
capName: "webrtc-session",
|
|
54462
|
+
capScope: "device",
|
|
54463
|
+
addonId: null,
|
|
54464
|
+
access: "create"
|
|
54465
|
+
},
|
|
54221
54466
|
"webrtcSession.closeSession": {
|
|
54222
54467
|
capName: "webrtc-session",
|
|
54223
54468
|
capScope: "device",
|
|
@@ -58395,6 +58640,11 @@ Object.freeze({
|
|
|
58395
58640
|
form: "single",
|
|
58396
58641
|
optional: false
|
|
58397
58642
|
}],
|
|
58643
|
+
"webrtcSession.applyDownlinkProbe": [{
|
|
58644
|
+
name: "deviceId",
|
|
58645
|
+
form: "single",
|
|
58646
|
+
optional: false
|
|
58647
|
+
}],
|
|
58398
58648
|
"webrtcSession.closeSession": [{
|
|
58399
58649
|
name: "deviceId",
|
|
58400
58650
|
form: "single",
|
|
@@ -60418,6 +60668,12 @@ Object.defineProperty(exports, "cameraGridLayoutCapability", {
|
|
|
60418
60668
|
return cameraGridLayoutCapability;
|
|
60419
60669
|
}
|
|
60420
60670
|
});
|
|
60671
|
+
Object.defineProperty(exports, "checkRoleAddress", {
|
|
60672
|
+
enumerable: true,
|
|
60673
|
+
get: function() {
|
|
60674
|
+
return checkRoleAddress;
|
|
60675
|
+
}
|
|
60676
|
+
});
|
|
60421
60677
|
Object.defineProperty(exports, "cloneStatefulExpressionMemory", {
|
|
60422
60678
|
enumerable: true,
|
|
60423
60679
|
get: function() {
|
|
@@ -60706,6 +60962,12 @@ Object.defineProperty(exports, "hydrateSchema", {
|
|
|
60706
60962
|
return hydrateSchema;
|
|
60707
60963
|
}
|
|
60708
60964
|
});
|
|
60965
|
+
Object.defineProperty(exports, "isAppLinkBase", {
|
|
60966
|
+
enumerable: true,
|
|
60967
|
+
get: function() {
|
|
60968
|
+
return isAppLinkBase;
|
|
60969
|
+
}
|
|
60970
|
+
});
|
|
60709
60971
|
Object.defineProperty(exports, "isArrayOutputSchema", {
|
|
60710
60972
|
enumerable: true,
|
|
60711
60973
|
get: function() {
|
|
@@ -60718,6 +60980,12 @@ Object.defineProperty(exports, "isCollectionArrayMethod", {
|
|
|
60718
60980
|
return isCollectionArrayMethod;
|
|
60719
60981
|
}
|
|
60720
60982
|
});
|
|
60983
|
+
Object.defineProperty(exports, "isDefaultViewerEndpoint", {
|
|
60984
|
+
enumerable: true,
|
|
60985
|
+
get: function() {
|
|
60986
|
+
return isDefaultViewerEndpoint;
|
|
60987
|
+
}
|
|
60988
|
+
});
|
|
60721
60989
|
Object.defineProperty(exports, "isDeviceConfigCap", {
|
|
60722
60990
|
enumerable: true,
|
|
60723
60991
|
get: function() {
|
|
@@ -60958,10 +61226,10 @@ Object.defineProperty(exports, "resolveCoreBlockFiles", {
|
|
|
60958
61226
|
return resolveCoreBlockFiles;
|
|
60959
61227
|
}
|
|
60960
61228
|
});
|
|
60961
|
-
Object.defineProperty(exports, "
|
|
61229
|
+
Object.defineProperty(exports, "resolveHubAddressRoles", {
|
|
60962
61230
|
enumerable: true,
|
|
60963
61231
|
get: function() {
|
|
60964
|
-
return
|
|
61232
|
+
return resolveHubAddressRoles;
|
|
60965
61233
|
}
|
|
60966
61234
|
});
|
|
60967
61235
|
Object.defineProperty(exports, "resolveLocationMode", {
|
|
@@ -60976,6 +61244,18 @@ Object.defineProperty(exports, "resolveMethodAuth", {
|
|
|
60976
61244
|
return resolveMethodAuth;
|
|
60977
61245
|
}
|
|
60978
61246
|
});
|
|
61247
|
+
Object.defineProperty(exports, "resolveNotificationsAddress", {
|
|
61248
|
+
enumerable: true,
|
|
61249
|
+
get: function() {
|
|
61250
|
+
return resolveNotificationsAddress;
|
|
61251
|
+
}
|
|
61252
|
+
});
|
|
61253
|
+
Object.defineProperty(exports, "resolveViewerAddresses", {
|
|
61254
|
+
enumerable: true,
|
|
61255
|
+
get: function() {
|
|
61256
|
+
return resolveViewerAddresses;
|
|
61257
|
+
}
|
|
61258
|
+
});
|
|
60979
61259
|
Object.defineProperty(exports, "runtimeStatePolicyFor", {
|
|
60980
61260
|
enumerable: true,
|
|
60981
61261
|
get: function() {
|
|
@@ -61090,10 +61370,10 @@ Object.defineProperty(exports, "validateComposition", {
|
|
|
61090
61370
|
return validateComposition;
|
|
61091
61371
|
}
|
|
61092
61372
|
});
|
|
61093
|
-
Object.defineProperty(exports, "
|
|
61373
|
+
Object.defineProperty(exports, "validateCustomAddress", {
|
|
61094
61374
|
enumerable: true,
|
|
61095
61375
|
get: function() {
|
|
61096
|
-
return
|
|
61376
|
+
return validateCustomAddress;
|
|
61097
61377
|
}
|
|
61098
61378
|
});
|
|
61099
61379
|
Object.defineProperty(exports, "vectorDimFromBase64", {
|