@camstack/system 1.2.357 → 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/auth/user-manager.d.ts +43 -2
- 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 +2 -2
- package/dist/builtins/autotrack/index.mjs +2 -2
- 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 +8 -8
- package/dist/builtins/composer/composer.addon.mjs +8 -8
- 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 +9 -9
- package/dist/builtins/device-manager/device-manager.addon.mjs +9 -9
- 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/admin-account-boot.d.ts +27 -0
- package/dist/builtins/local-auth/auth-schema.d.ts +3 -2
- package/dist/builtins/local-auth/local-auth.addon.js +281 -8
- package/dist/builtins/local-auth/local-auth.addon.mjs +291 -22
- package/dist/builtins/local-network/address-book.d.ts +69 -0
- package/dist/builtins/local-network/local-network.addon.d.ts +44 -32
- package/dist/builtins/local-network/local-network.addon.js +368 -55
- package/dist/builtins/local-network/local-network.addon.mjs +369 -54
- 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-BcRHQBKW.mjs → child-cap-dispatch-Dm1TRDCr.mjs} +2 -2
- package/dist/{child-cap-dispatch-wbIQJctP.js → child-cap-dispatch-t61ohDpb.js} +2 -2
- package/dist/{composition-sources-CeO0K2cl.js → composition-sources-CCU_KizO.js} +1 -1
- package/dist/{composition-sources-BBfqepyT.mjs → composition-sources-CHlfWHl6.mjs} +1 -1
- package/dist/{dist-CFVOy8VT.js → dist-W_X44h-s.js} +669 -121
- package/dist/{dist-B7WRgEZY.mjs → dist-pTfD_M-U.mjs} +628 -122
- package/dist/index.js +6 -141
- package/dist/index.mjs +4 -139
- package/dist/kernel/config-manager.d.ts +1 -1
- package/dist/kernel/config-schema.d.ts +6 -1
- package/dist/{retired-settings-keys-DKRjfz0U.mjs → retired-settings-keys-CK_ifret.mjs} +1 -1
- package/dist/{retired-settings-keys-CRlTzxaS.js → retired-settings-keys-jglEzgWR.js} +1 -1
- package/package.json +3 -3
|
@@ -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).
|
|
@@ -7867,57 +7867,15 @@ var ClipSearchStrictnessSchema = z.enum([
|
|
|
7867
7867
|
"balanced",
|
|
7868
7868
|
"strict"
|
|
7869
7869
|
]);
|
|
7870
|
-
|
|
7871
|
-
|
|
7872
|
-
id: "person",
|
|
7873
|
-
name: "Person"
|
|
7874
|
-
},
|
|
7875
|
-
{
|
|
7876
|
-
id: "vehicle",
|
|
7877
|
-
name: "Vehicle"
|
|
7878
|
-
},
|
|
7879
|
-
{
|
|
7880
|
-
id: "animal",
|
|
7881
|
-
name: "Animal"
|
|
7882
|
-
},
|
|
7883
|
-
{
|
|
7884
|
-
id: "package",
|
|
7885
|
-
name: "Package"
|
|
7886
|
-
}
|
|
7887
|
-
].map((l) => l.id));
|
|
7888
|
-
var COCO_TO_MACRO = {
|
|
7889
|
-
mapping: {
|
|
7890
|
-
person: "person",
|
|
7891
|
-
bicycle: "vehicle",
|
|
7892
|
-
car: "vehicle",
|
|
7893
|
-
motorcycle: "vehicle",
|
|
7894
|
-
airplane: "vehicle",
|
|
7895
|
-
bus: "vehicle",
|
|
7896
|
-
train: "vehicle",
|
|
7897
|
-
truck: "vehicle",
|
|
7898
|
-
boat: "vehicle",
|
|
7899
|
-
bird: "animal",
|
|
7900
|
-
cat: "animal",
|
|
7901
|
-
dog: "animal",
|
|
7902
|
-
horse: "animal",
|
|
7903
|
-
sheep: "animal",
|
|
7904
|
-
cow: "animal",
|
|
7905
|
-
elephant: "animal",
|
|
7906
|
-
bear: "animal",
|
|
7907
|
-
zebra: "animal",
|
|
7908
|
-
giraffe: "animal",
|
|
7909
|
-
suitcase: "package",
|
|
7910
|
-
backpack: "package",
|
|
7911
|
-
handbag: "package"
|
|
7912
|
-
},
|
|
7913
|
-
preserveOriginal: false
|
|
7914
|
-
};
|
|
7915
|
-
/** Steps a root detector may declare it fills. */
|
|
7916
|
-
var FILLABLE_STEP_IDS = [
|
|
7870
|
+
/** Steps whose effect a root label can BE. */
|
|
7871
|
+
var LABEL_SUPPLY_STEP_IDS = [
|
|
7917
7872
|
"animal-classifier",
|
|
7918
7873
|
"vehicle-classifier",
|
|
7919
7874
|
"package-detection"
|
|
7920
7875
|
];
|
|
7876
|
+
/** Steps whose box a root detection can BE. */
|
|
7877
|
+
var CROP_SUPPLY_STEP_IDS = ["plate-detection", "face-detection"];
|
|
7878
|
+
[...LABEL_SUPPLY_STEP_IDS, ...CROP_SUPPLY_STEP_IDS];
|
|
7921
7879
|
var MODEL_FORMATS = [
|
|
7922
7880
|
"onnx",
|
|
7923
7881
|
"coreml",
|
|
@@ -8051,12 +8009,35 @@ var ModelLicenseRecordSchema = z.object({
|
|
|
8051
8009
|
* `camstack/docs` → `/docs/detection/models`.
|
|
8052
8010
|
*/
|
|
8053
8011
|
var ModelLicenseSchema = z.preprocess((value) => typeof value === "string" ? { weights: value } : value, ModelLicenseRecordSchema);
|
|
8054
|
-
/**
|
|
8055
|
-
|
|
8056
|
-
|
|
8012
|
+
/**
|
|
8013
|
+
* One step a ROOT detector can supply from its own output (D730) — see
|
|
8014
|
+
* `ModelCatalogEntry.suppliesSteps`.
|
|
8015
|
+
*
|
|
8016
|
+
* - `label`: the root's raw class IS the step's answer. `labelToEffect` maps
|
|
8017
|
+
* the root's label to the step's vocabulary; `uncovered` is the vocabulary
|
|
8018
|
+
* the root cannot produce (shown as unavailable, never a blocker).
|
|
8019
|
+
* - `crop`: the root draws the box the step would have found (`license_plate`
|
|
8020
|
+
* for plate-detection, `face` for face-detection). The box becomes a detail
|
|
8021
|
+
* child of the `parentMacro` detection that contains it — never a track.
|
|
8022
|
+
*/
|
|
8023
|
+
var RootStepSupplySchema = z.discriminatedUnion("kind", [z.object({
|
|
8024
|
+
kind: z.literal("label"),
|
|
8025
|
+
stepId: z.enum(LABEL_SUPPLY_STEP_IDS),
|
|
8057
8026
|
labelToEffect: z.record(z.string(), z.string()),
|
|
8058
8027
|
uncovered: z.array(z.string()).readonly()
|
|
8059
|
-
})
|
|
8028
|
+
}), z.object({
|
|
8029
|
+
kind: z.literal("crop"),
|
|
8030
|
+
stepId: z.enum(CROP_SUPPLY_STEP_IDS),
|
|
8031
|
+
rootLabels: z.array(z.string()).readonly(),
|
|
8032
|
+
parentMacro: z.enum(["vehicle", "person"]),
|
|
8033
|
+
childClass: z.enum(["plate", "face"]),
|
|
8034
|
+
/**
|
|
8035
|
+
* The root's smaller input side, stamped on read by `rootSuppliesOf` from
|
|
8036
|
+
* the model entry — what a step's `minRootInputPx` gate judges. Never
|
|
8037
|
+
* stored by an import.
|
|
8038
|
+
*/
|
|
8039
|
+
rootInputPx: z.number().int().positive().optional()
|
|
8040
|
+
})]);
|
|
8060
8041
|
var ModelCatalogEntrySchema = z.object({
|
|
8061
8042
|
id: z.string(),
|
|
8062
8043
|
name: z.string(),
|
|
@@ -8183,15 +8164,15 @@ var ModelCatalogEntrySchema = z.object({
|
|
|
8183
8164
|
*/
|
|
8184
8165
|
classMap: DetectionCatalogClassMapSchema.optional(),
|
|
8185
8166
|
/**
|
|
8186
|
-
* The pipeline steps this ROOT detector
|
|
8187
|
-
* its labels name
|
|
8188
|
-
*
|
|
8189
|
-
* labelmap by `
|
|
8190
|
-
*
|
|
8191
|
-
*
|
|
8192
|
-
* `
|
|
8167
|
+
* The pipeline steps this ROOT detector can supply from its own output
|
|
8168
|
+
* (D730): its labels name a step's effect (`deer` for `animal-classifier`)
|
|
8169
|
+
* or draw a step's box (`license_plate` for `plate-detection`). Computed at
|
|
8170
|
+
* import from THIS model's labelmap by `deriveRootSupplies`, never written
|
|
8171
|
+
* by hand and never assumed per family; a row without it is derived on read
|
|
8172
|
+
* (`rootSuppliesOf`). Whether a camera uses it is the step's own
|
|
8173
|
+
* `useRootModel` flag (`resolveRootSupply`).
|
|
8193
8174
|
*/
|
|
8194
|
-
|
|
8175
|
+
suppliesSteps: z.array(RootStepSupplySchema).readonly().optional(),
|
|
8195
8176
|
/**
|
|
8196
8177
|
* The model's CLIP feature-space contract (text encoder, dimension, vector
|
|
8197
8178
|
* index, token window, search floor) — see `clip-model.ts`. Present ONLY on a
|
|
@@ -12298,7 +12279,7 @@ function unavailableFor(tf, role, mode, cap, at) {
|
|
|
12298
12279
|
};
|
|
12299
12280
|
return {
|
|
12300
12281
|
ok: false,
|
|
12301
|
-
problem: problem("not-replaceable", at, `\`${cap}.${tf.path}\` reads a source but can say neither null nor 'unknown', and an ADDED capability has no native reading to fall back to
|
|
12282
|
+
problem: problem("not-replaceable", at, `\`${cap}.${tf.path}\` reads a source but can say neither null nor 'unknown', and an ADDED capability has no native reading to fall back to`)
|
|
12302
12283
|
};
|
|
12303
12284
|
}
|
|
12304
12285
|
/** Item fields the composer writes itself, with the value it writes. */
|
|
@@ -17197,6 +17178,279 @@ var filesystemBrowseCapability = {
|
|
|
17197
17178
|
})
|
|
17198
17179
|
}
|
|
17199
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
|
+
}
|
|
17234
|
+
var IPV4_LITERAL = /^\d{1,3}(?:\.\d{1,3}){3}$/;
|
|
17235
|
+
function hostnameOf(baseUrl) {
|
|
17236
|
+
try {
|
|
17237
|
+
const host = new URL(baseUrl).hostname;
|
|
17238
|
+
return host.length > 0 ? host : null;
|
|
17239
|
+
} catch {
|
|
17240
|
+
return null;
|
|
17241
|
+
}
|
|
17242
|
+
}
|
|
17243
|
+
function trimSlash(baseUrl) {
|
|
17244
|
+
return baseUrl.replace(/\/+$/, "");
|
|
17245
|
+
}
|
|
17246
|
+
function isMesh(endpoint) {
|
|
17247
|
+
return endpoint.kind === "public" && endpoint.interfaceKind === "vpn";
|
|
17248
|
+
}
|
|
17249
|
+
function isTunnel(endpoint) {
|
|
17250
|
+
return endpoint.kind === "public" && endpoint.interfaceKind === "public";
|
|
17251
|
+
}
|
|
17252
|
+
function isPlausibleLan(endpoint) {
|
|
17253
|
+
return (endpoint.kind === "lan-ipv4" || endpoint.kind === "lan-ipv6") && endpoint.plausible;
|
|
17254
|
+
}
|
|
17255
|
+
function isLanIpv4Literal(endpoint) {
|
|
17256
|
+
if (endpoint.kind !== "lan-ipv4" || !endpoint.plausible) return false;
|
|
17257
|
+
const host = hostnameOf(endpoint.baseUrl);
|
|
17258
|
+
return host !== null && IPV4_LITERAL.test(host);
|
|
17259
|
+
}
|
|
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;
|
|
17263
|
+
if (hostnameOf(endpoint.baseUrl) === null) return null;
|
|
17264
|
+
if (role === "agents") {
|
|
17265
|
+
if (isLanIpv4Literal(endpoint)) return 0;
|
|
17266
|
+
if (isPlausibleLan(endpoint)) return 1;
|
|
17267
|
+
if (isMesh(endpoint)) return 2;
|
|
17268
|
+
return null;
|
|
17269
|
+
}
|
|
17270
|
+
if (isTunnel(endpoint)) return 0;
|
|
17271
|
+
if (isMesh(endpoint)) return 1;
|
|
17272
|
+
if (isLanIpv4Literal(endpoint)) return 2;
|
|
17273
|
+
if (isPlausibleLan(endpoint)) return 3;
|
|
17274
|
+
return null;
|
|
17275
|
+
}
|
|
17276
|
+
var LOOPBACK_HOSTS = new Set([
|
|
17277
|
+
"localhost",
|
|
17278
|
+
"0.0.0.0",
|
|
17279
|
+
"::1",
|
|
17280
|
+
"[::1]",
|
|
17281
|
+
"::",
|
|
17282
|
+
"[::]"
|
|
17283
|
+
]);
|
|
17284
|
+
function isLoopbackHost(hostname) {
|
|
17285
|
+
const h = hostname.toLowerCase();
|
|
17286
|
+
if (LOOPBACK_HOSTS.has(h) || h.endsWith(".localhost")) return true;
|
|
17287
|
+
return /^127\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(h);
|
|
17288
|
+
}
|
|
17289
|
+
/**
|
|
17290
|
+
* Validate an operator-typed address: an http(s) URL with a host, no
|
|
17291
|
+
* credentials, no path, and never loopback (it would name whoever dials it).
|
|
17292
|
+
* Answers the normalised origin (`scheme://host[:port]`).
|
|
17293
|
+
*/
|
|
17294
|
+
function validateCustomAddress(raw) {
|
|
17295
|
+
const trimmed = raw.trim();
|
|
17296
|
+
if (trimmed === "") return {
|
|
17297
|
+
ok: false,
|
|
17298
|
+
reason: "Enter an address, e.g. https://192.168.1.50:4443."
|
|
17299
|
+
};
|
|
17300
|
+
let parsed;
|
|
17301
|
+
try {
|
|
17302
|
+
parsed = new URL(trimmed);
|
|
17303
|
+
} catch {
|
|
17304
|
+
return {
|
|
17305
|
+
ok: false,
|
|
17306
|
+
reason: "Not a URL — include http:// or https://."
|
|
17307
|
+
};
|
|
17308
|
+
}
|
|
17309
|
+
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return {
|
|
17310
|
+
ok: false,
|
|
17311
|
+
reason: "Use an http:// or https:// address."
|
|
17312
|
+
};
|
|
17313
|
+
if (parsed.username !== "" || parsed.password !== "") return {
|
|
17314
|
+
ok: false,
|
|
17315
|
+
reason: "The address must not carry a user name or password."
|
|
17316
|
+
};
|
|
17317
|
+
if (parsed.hostname === "") return {
|
|
17318
|
+
ok: false,
|
|
17319
|
+
reason: "The address has no host."
|
|
17320
|
+
};
|
|
17321
|
+
if (isLoopbackHost(parsed.hostname)) return {
|
|
17322
|
+
ok: false,
|
|
17323
|
+
reason: "A loopback address names whoever dials it, never this hub — use an address other machines reach."
|
|
17324
|
+
};
|
|
17325
|
+
if (parsed.pathname !== "/" || parsed.search !== "" || parsed.hash !== "") return {
|
|
17326
|
+
ok: false,
|
|
17327
|
+
reason: "Enter only the address (scheme, host and port), without a path."
|
|
17328
|
+
};
|
|
17329
|
+
return {
|
|
17330
|
+
ok: true,
|
|
17331
|
+
baseUrl: parsed.origin
|
|
17332
|
+
};
|
|
17333
|
+
}
|
|
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."
|
|
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;
|
|
17358
|
+
}
|
|
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) {
|
|
17366
|
+
const best = endpoints.flatMap((endpoint) => {
|
|
17367
|
+
const rank = autoRankFor(role, endpoint);
|
|
17368
|
+
return rank === null ? [] : [{
|
|
17369
|
+
rank,
|
|
17370
|
+
priority: endpoint.priority,
|
|
17371
|
+
endpoint
|
|
17372
|
+
}];
|
|
17373
|
+
}).toSorted((a, b) => a.rank - b.rank || a.priority - b.priority)[0];
|
|
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
|
+
};
|
|
17453
|
+
}
|
|
17200
17454
|
/**
|
|
17201
17455
|
* Transport bounds for AI capability methods.
|
|
17202
17456
|
*
|
|
@@ -19280,6 +19534,51 @@ var notificationOutputCapability = {
|
|
|
19280
19534
|
})
|
|
19281
19535
|
}
|
|
19282
19536
|
};
|
|
19537
|
+
new Set([
|
|
19538
|
+
{
|
|
19539
|
+
id: "person",
|
|
19540
|
+
name: "Person"
|
|
19541
|
+
},
|
|
19542
|
+
{
|
|
19543
|
+
id: "vehicle",
|
|
19544
|
+
name: "Vehicle"
|
|
19545
|
+
},
|
|
19546
|
+
{
|
|
19547
|
+
id: "animal",
|
|
19548
|
+
name: "Animal"
|
|
19549
|
+
},
|
|
19550
|
+
{
|
|
19551
|
+
id: "package",
|
|
19552
|
+
name: "Package"
|
|
19553
|
+
}
|
|
19554
|
+
].map((l) => l.id));
|
|
19555
|
+
var COCO_TO_MACRO = {
|
|
19556
|
+
mapping: {
|
|
19557
|
+
person: "person",
|
|
19558
|
+
bicycle: "vehicle",
|
|
19559
|
+
car: "vehicle",
|
|
19560
|
+
motorcycle: "vehicle",
|
|
19561
|
+
airplane: "vehicle",
|
|
19562
|
+
bus: "vehicle",
|
|
19563
|
+
train: "vehicle",
|
|
19564
|
+
truck: "vehicle",
|
|
19565
|
+
boat: "vehicle",
|
|
19566
|
+
bird: "animal",
|
|
19567
|
+
cat: "animal",
|
|
19568
|
+
dog: "animal",
|
|
19569
|
+
horse: "animal",
|
|
19570
|
+
sheep: "animal",
|
|
19571
|
+
cow: "animal",
|
|
19572
|
+
elephant: "animal",
|
|
19573
|
+
bear: "animal",
|
|
19574
|
+
zebra: "animal",
|
|
19575
|
+
giraffe: "animal",
|
|
19576
|
+
suitcase: "package",
|
|
19577
|
+
backpack: "package",
|
|
19578
|
+
handbag: "package"
|
|
19579
|
+
},
|
|
19580
|
+
preserveOriginal: false
|
|
19581
|
+
};
|
|
19283
19582
|
var AUDIO_MACRO_LABELS = [
|
|
19284
19583
|
{
|
|
19285
19584
|
id: "speech",
|
|
@@ -25513,6 +25812,34 @@ var pipelineAnalyticsCapability = {
|
|
|
25513
25812
|
}
|
|
25514
25813
|
};
|
|
25515
25814
|
/**
|
|
25815
|
+
* A root model's boxes standing in for one crop-kind step's own inference
|
|
25816
|
+
* (D730) — see `runPipeline.suppliedRoot`.
|
|
25817
|
+
*/
|
|
25818
|
+
var SuppliedRootOutputSchema = z.object({
|
|
25819
|
+
stepId: z.string(),
|
|
25820
|
+
/** The root model that drew the boxes — stamped on the result. */
|
|
25821
|
+
modelId: z.string(),
|
|
25822
|
+
detections: z.array(z.object({
|
|
25823
|
+
/** `[x1, y1, x2, y2]` in the pixels of the call's image. */
|
|
25824
|
+
bbox: z.tuple([
|
|
25825
|
+
z.number(),
|
|
25826
|
+
z.number(),
|
|
25827
|
+
z.number(),
|
|
25828
|
+
z.number()
|
|
25829
|
+
]),
|
|
25830
|
+
score: z.number(),
|
|
25831
|
+
/**
|
|
25832
|
+
* Five facial landmarks in the same pixels — a face the step's own
|
|
25833
|
+
* detector already re-found inside a root face box (D730), so its
|
|
25834
|
+
* embedder child aligns it exactly as it aligns any detected face.
|
|
25835
|
+
*/
|
|
25836
|
+
landmarks: z.array(z.object({
|
|
25837
|
+
x: z.number(),
|
|
25838
|
+
y: z.number()
|
|
25839
|
+
})).optional()
|
|
25840
|
+
})).min(1)
|
|
25841
|
+
});
|
|
25842
|
+
/**
|
|
25516
25843
|
* Reference to the frame's retained NATIVE surface + the parent crop's placement
|
|
25517
25844
|
* within the frame, so the executor can re-cut a leaf child ROI at native
|
|
25518
25845
|
* resolution on the detail plane. See the `runPipeline` `nativeCropRef` field.
|
|
@@ -25644,7 +25971,7 @@ var PipelineModelOptionSchema = z.object({
|
|
|
25644
25971
|
legacy: z.boolean().optional(),
|
|
25645
25972
|
provider: ModelProviderIdSchema.optional(),
|
|
25646
25973
|
defaultConfidence: z.number().optional(),
|
|
25647
|
-
|
|
25974
|
+
suppliesSteps: z.array(RootStepSupplySchema).readonly().optional()
|
|
25648
25975
|
});
|
|
25649
25976
|
var ConfigFieldBridge = z.custom();
|
|
25650
25977
|
var PipelineAddonSchemaSchema = z.object({
|
|
@@ -26048,7 +26375,16 @@ var pipelineExecutorCapability = {
|
|
|
26048
26375
|
* `device-not-servable`), and nothing reaches the camera's live
|
|
26049
26376
|
* trace stream. Absent ⇒ unchanged behaviour.
|
|
26050
26377
|
*/
|
|
26051
|
-
replay: z.literal(true).optional()
|
|
26378
|
+
replay: z.literal(true).optional(),
|
|
26379
|
+
/**
|
|
26380
|
+
* Root-supplied detections for the tree's ROOT step (D730). Set by
|
|
26381
|
+
* `runDetailSubtree` when the camera's root model supplies a crop-kind
|
|
26382
|
+
* step (a Frigate+ `license_plate` for `plate-detection`): the step is
|
|
26383
|
+
* NOT inferred, these boxes are its output, and its children (the plate
|
|
26384
|
+
* reader) run on them through their own crop policy. Boxes are in the
|
|
26385
|
+
* PIXELS of the image this call carries. Absent ⇒ the root step runs.
|
|
26386
|
+
*/
|
|
26387
|
+
suppliedRoot: SuppliedRootOutputSchema.optional()
|
|
26052
26388
|
}), PipelineRunResultBridge, { kind: "mutation" }),
|
|
26053
26389
|
/**
|
|
26054
26390
|
* Batched run — N raw frames packed into one cap call. The provider
|
|
@@ -27361,7 +27697,22 @@ var pipelineRunnerCapability = {
|
|
|
27361
27697
|
*/
|
|
27362
27698
|
cropJpeg: z.string().optional(),
|
|
27363
27699
|
parent: DetailParentSchema,
|
|
27364
|
-
steps: z.array(z.string()).optional()
|
|
27700
|
+
steps: z.array(z.string()).optional(),
|
|
27701
|
+
/**
|
|
27702
|
+
* The camera's root model already drew this step's boxes (D730): a
|
|
27703
|
+
* `license_plate` inside the parent vehicle. The named step is NOT
|
|
27704
|
+
* inferred — these FRAME-space boxes are its output — and its
|
|
27705
|
+
* requested children (the plate reader) run on them. Absent ⇒ every
|
|
27706
|
+
* requested step infers as before.
|
|
27707
|
+
*/
|
|
27708
|
+
supplied: z.object({
|
|
27709
|
+
stepId: z.string(),
|
|
27710
|
+
modelId: z.string(),
|
|
27711
|
+
boxes: z.array(z.object({
|
|
27712
|
+
bbox: NativeCropBboxSchema,
|
|
27713
|
+
score: z.number()
|
|
27714
|
+
})).min(1)
|
|
27715
|
+
}).optional()
|
|
27365
27716
|
}), z.object({ details: z.array(DetailResultSchema) }).nullable(), { kind: "mutation" }),
|
|
27366
27717
|
/**
|
|
27367
27718
|
* Run ONE enrichment step against caller-supplied pixels, with NO camera
|
|
@@ -31512,50 +31863,6 @@ var videoclipsCapability = {
|
|
|
31512
31863
|
})
|
|
31513
31864
|
}
|
|
31514
31865
|
};
|
|
31515
|
-
/** The central link domain the viewer app claims (Universal Links / App Links). */
|
|
31516
|
-
var CAMSTACK_APP_LINK_ORIGIN = "https://camstack.zentik.app";
|
|
31517
|
-
/**
|
|
31518
|
-
* Reduce a base URL to the bare origin the central page accepts as `hub=`,
|
|
31519
|
-
* or `null` when it cannot be one: not http(s), carries credentials, or does
|
|
31520
|
-
* not parse. A path/query/fragment is dropped — the central page mounts the
|
|
31521
|
-
* viewer under the origin itself.
|
|
31522
|
-
*/
|
|
31523
|
-
function toAppLinkHubOrigin(baseUrl) {
|
|
31524
|
-
let parsed;
|
|
31525
|
-
try {
|
|
31526
|
-
parsed = new URL(baseUrl);
|
|
31527
|
-
} catch {
|
|
31528
|
-
return null;
|
|
31529
|
-
}
|
|
31530
|
-
if (parsed.protocol !== "https:" && parsed.protocol !== "http:") return null;
|
|
31531
|
-
if (parsed.username !== "" || parsed.password !== "") return null;
|
|
31532
|
-
if (parsed.hostname === "") return null;
|
|
31533
|
-
return parsed.origin;
|
|
31534
|
-
}
|
|
31535
|
-
/**
|
|
31536
|
-
* The hub address an app link carries as `hub=`, chosen from the hub's OWN
|
|
31537
|
-
* advertised palette so it always agrees with what the Network page lists:
|
|
31538
|
-
* the public tunnel first, then the mesh (Tailscale MagicDNS) — HTTPS only,
|
|
31539
|
-
* because the app and the hosted viewer reach it from off the LAN. `null`
|
|
31540
|
-
* when the hub advertises neither.
|
|
31541
|
-
*/
|
|
31542
|
-
function pickAppLinkHub(endpoints) {
|
|
31543
|
-
const rank = (e) => {
|
|
31544
|
-
if (e.kind !== "public" || !e.baseUrl.startsWith("https://")) return null;
|
|
31545
|
-
if (e.interfaceKind === "public") return 0;
|
|
31546
|
-
if (e.interfaceKind === "vpn") return 1;
|
|
31547
|
-
return null;
|
|
31548
|
-
};
|
|
31549
|
-
return endpoints.flatMap((e) => {
|
|
31550
|
-
const r = rank(e);
|
|
31551
|
-
const origin = toAppLinkHubOrigin(e.baseUrl);
|
|
31552
|
-
return r === null || origin === null ? [] : [{
|
|
31553
|
-
r,
|
|
31554
|
-
p: e.priority,
|
|
31555
|
-
origin
|
|
31556
|
-
}];
|
|
31557
|
-
}).toSorted((a, b) => a.r - b.r || a.p - b.p)[0]?.origin ?? null;
|
|
31558
|
-
}
|
|
31559
31866
|
/**
|
|
31560
31867
|
* Optional client-side hints sent at session creation to help the provider
|
|
31561
31868
|
* pick the best native source. All fields optional — a viewer that knows
|
|
@@ -32031,6 +32338,35 @@ var webrtcSessionCapability = {
|
|
|
32031
32338
|
alive: z.boolean()
|
|
32032
32339
|
})),
|
|
32033
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(z.object({
|
|
32361
|
+
deviceId: z.number().int().nonnegative(),
|
|
32362
|
+
sessionId: z.string(),
|
|
32363
|
+
downlinkMbps: z.number().nonnegative()
|
|
32364
|
+
}), z.object({
|
|
32365
|
+
outcome: z.enum(["switching", "held"]),
|
|
32366
|
+
tier: CamProfileSchema.nullable(),
|
|
32367
|
+
reason: z.string()
|
|
32368
|
+
}), { kind: "mutation" }),
|
|
32369
|
+
/**
|
|
32034
32370
|
* The SERVER's half of the stream-debug overlay, for one live session.
|
|
32035
32371
|
*
|
|
32036
32372
|
* The client can measure its own transport (`getStats()`); it cannot see
|
|
@@ -36314,7 +36650,8 @@ var ConnectionEndpointSchema = z.object({
|
|
|
36314
36650
|
"lan-ipv6",
|
|
36315
36651
|
"public",
|
|
36316
36652
|
"loopback",
|
|
36317
|
-
"app-link"
|
|
36653
|
+
"app-link",
|
|
36654
|
+
"custom"
|
|
36318
36655
|
]),
|
|
36319
36656
|
/**
|
|
36320
36657
|
* Originating-interface kind — `lan`/`wifi`/`docker`/`vpn`/`other`/
|
|
@@ -36416,6 +36753,82 @@ var ViewerEndpointsSchema = z.object({
|
|
|
36416
36753
|
/** What the ranking currently resolves to (may be empty if nothing is up). */
|
|
36417
36754
|
resolved: z.array(z.string()).readonly()
|
|
36418
36755
|
});
|
|
36756
|
+
/**
|
|
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.
|
|
36760
|
+
*/
|
|
36761
|
+
var HubAddressSnapshotSchema = z.object({
|
|
36762
|
+
override: z.string().nullable(),
|
|
36763
|
+
resolved: z.string().nullable(),
|
|
36764
|
+
source: z.enum([
|
|
36765
|
+
"override",
|
|
36766
|
+
"auto",
|
|
36767
|
+
"none"
|
|
36768
|
+
])
|
|
36769
|
+
});
|
|
36770
|
+
var HubAddressesSchema = z.object({
|
|
36771
|
+
cluster: HubAddressSnapshotSchema,
|
|
36772
|
+
browser: HubAddressSnapshotSchema
|
|
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 = z.enum([
|
|
36779
|
+
"viewer",
|
|
36780
|
+
"notifications",
|
|
36781
|
+
"agents",
|
|
36782
|
+
"signIn"
|
|
36783
|
+
]);
|
|
36784
|
+
var RoleSourceSchema = 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 = z.object({
|
|
36791
|
+
/** The address carrying the flag, or null = automatic. */
|
|
36792
|
+
flagged: z.string().nullable(),
|
|
36793
|
+
/** The address in use, or null when nothing qualifies (never loopback). */
|
|
36794
|
+
resolved: z.string().nullable(),
|
|
36795
|
+
source: RoleSourceSchema
|
|
36796
|
+
});
|
|
36797
|
+
var HubViewerResolutionSchema = z.object({
|
|
36798
|
+
/** The addresses flagged `viewer`, or empty = automatic. */
|
|
36799
|
+
flagged: z.array(z.string()).readonly(),
|
|
36800
|
+
/** What the apps race right now. */
|
|
36801
|
+
resolved: z.array(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: z.boolean(),
|
|
36812
|
+
/** Entered by the operator (removable). */
|
|
36813
|
+
custom: z.boolean(),
|
|
36814
|
+
/** The roles explicitly flagged on this address. */
|
|
36815
|
+
flags: z.array(HubAddressRoleSchema).readonly(),
|
|
36816
|
+
/** The roles this address serves right now — flagged or automatic. */
|
|
36817
|
+
inUse: z.array(HubAddressRoleSchema).readonly(),
|
|
36818
|
+
/** The roles this address may be flagged with. */
|
|
36819
|
+
eligible: z.array(HubAddressRoleSchema).readonly()
|
|
36820
|
+
});
|
|
36821
|
+
var HubAddressBookSchema = z.object({
|
|
36822
|
+
rows: z.array(HubAddressRowSchema).readonly(),
|
|
36823
|
+
roles: 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: z.string().nullable()
|
|
36831
|
+
});
|
|
36419
36832
|
var AllowedAddressesSchema = z.object({
|
|
36420
36833
|
/**
|
|
36421
36834
|
* Allowlist of interface addresses operators have explicitly opted
|
|
@@ -36528,26 +36941,78 @@ var localNetworkCapability = {
|
|
|
36528
36941
|
*/
|
|
36529
36942
|
getNotificationEndpoint: method(z.void(), NotificationEndpointSchema),
|
|
36530
36943
|
/**
|
|
36531
|
-
*
|
|
36532
|
-
*
|
|
36533
|
-
*
|
|
36534
|
-
*
|
|
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.
|
|
36535
36948
|
*/
|
|
36536
36949
|
setNotificationEndpoint: method(z.object({ baseUrl: z.string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
|
|
36537
36950
|
/**
|
|
36538
|
-
* The
|
|
36539
|
-
*
|
|
36540
|
-
*
|
|
36541
|
-
*
|
|
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.
|
|
36542
36956
|
*/
|
|
36543
36957
|
getViewerEndpoints: method(z.void(), ViewerEndpointsSchema),
|
|
36544
36958
|
/**
|
|
36545
|
-
*
|
|
36546
|
-
*
|
|
36547
|
-
*
|
|
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.
|
|
36548
36962
|
*/
|
|
36549
36963
|
setViewerEndpoints: method(z.object({ baseUrls: z.array(z.string()).readonly() }), ViewerEndpointsSchema, { kind: "mutation" }),
|
|
36550
36964
|
/**
|
|
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.
|
|
36973
|
+
*/
|
|
36974
|
+
getAddresses: method(z.object({ scheme: 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(z.object({
|
|
36982
|
+
baseUrl: z.string(),
|
|
36983
|
+
label: 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(z.object({ baseUrl: z.string() }), HubAddressBookSchema, {
|
|
36990
|
+
kind: "mutation",
|
|
36991
|
+
auth: "admin"
|
|
36992
|
+
}),
|
|
36993
|
+
/**
|
|
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`.
|
|
36999
|
+
*/
|
|
37000
|
+
setAddressRole: method(z.object({
|
|
37001
|
+
role: HubAddressRoleSchema,
|
|
37002
|
+
baseUrl: z.string().nullable(),
|
|
37003
|
+
enabled: z.boolean(),
|
|
37004
|
+
acceptInsecureHttp: z.boolean().optional()
|
|
37005
|
+
}), HubAddressBookSchema, {
|
|
37006
|
+
kind: "mutation",
|
|
37007
|
+
auth: "admin"
|
|
37008
|
+
}),
|
|
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(z.void(), HubAddressesSchema),
|
|
37015
|
+
/**
|
|
36551
37016
|
* Read the operator's allowlist. Empty = "auto" (no filter). Used
|
|
36552
37017
|
* by the admin UI's address selector to seed its checkbox state.
|
|
36553
37018
|
*/
|
|
@@ -49642,12 +50107,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
49642
50107
|
addonId: null,
|
|
49643
50108
|
access: "view"
|
|
49644
50109
|
},
|
|
50110
|
+
"localNetwork.addCustomAddress": {
|
|
50111
|
+
capName: "local-network",
|
|
50112
|
+
capScope: "system",
|
|
50113
|
+
addonId: null,
|
|
50114
|
+
access: "create"
|
|
50115
|
+
},
|
|
49645
50116
|
"localNetwork.downloadCa": {
|
|
49646
50117
|
capName: "local-network",
|
|
49647
50118
|
capScope: "system",
|
|
49648
50119
|
addonId: null,
|
|
49649
50120
|
access: "view"
|
|
49650
50121
|
},
|
|
50122
|
+
"localNetwork.getAddresses": {
|
|
50123
|
+
capName: "local-network",
|
|
50124
|
+
capScope: "system",
|
|
50125
|
+
addonId: null,
|
|
50126
|
+
access: "view"
|
|
50127
|
+
},
|
|
49651
50128
|
"localNetwork.getAllowedAddresses": {
|
|
49652
50129
|
capName: "local-network",
|
|
49653
50130
|
capScope: "system",
|
|
@@ -49660,6 +50137,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
49660
50137
|
addonId: null,
|
|
49661
50138
|
access: "view"
|
|
49662
50139
|
},
|
|
50140
|
+
"localNetwork.getHubAddresses": {
|
|
50141
|
+
capName: "local-network",
|
|
50142
|
+
capScope: "system",
|
|
50143
|
+
addonId: null,
|
|
50144
|
+
access: "view"
|
|
50145
|
+
},
|
|
49663
50146
|
"localNetwork.getNotificationEndpoint": {
|
|
49664
50147
|
capName: "local-network",
|
|
49665
50148
|
capScope: "system",
|
|
@@ -49696,6 +50179,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
49696
50179
|
addonId: null,
|
|
49697
50180
|
access: "create"
|
|
49698
50181
|
},
|
|
50182
|
+
"localNetwork.removeCustomAddress": {
|
|
50183
|
+
capName: "local-network",
|
|
50184
|
+
capScope: "system",
|
|
50185
|
+
addonId: null,
|
|
50186
|
+
access: "delete"
|
|
50187
|
+
},
|
|
49699
50188
|
"localNetwork.resetAllowlistToBestMatch": {
|
|
49700
50189
|
capName: "local-network",
|
|
49701
50190
|
capScope: "system",
|
|
@@ -49708,6 +50197,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
49708
50197
|
addonId: null,
|
|
49709
50198
|
access: "create"
|
|
49710
50199
|
},
|
|
50200
|
+
"localNetwork.setAddressRole": {
|
|
50201
|
+
capName: "local-network",
|
|
50202
|
+
capScope: "system",
|
|
50203
|
+
addonId: null,
|
|
50204
|
+
access: "create"
|
|
50205
|
+
},
|
|
49711
50206
|
"localNetwork.setAllowedAddresses": {
|
|
49712
50207
|
capName: "local-network",
|
|
49713
50208
|
capScope: "system",
|
|
@@ -53962,6 +54457,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
|
|
|
53962
54457
|
addonId: null,
|
|
53963
54458
|
access: "create"
|
|
53964
54459
|
},
|
|
54460
|
+
"webrtcSession.applyDownlinkProbe": {
|
|
54461
|
+
capName: "webrtc-session",
|
|
54462
|
+
capScope: "device",
|
|
54463
|
+
addonId: null,
|
|
54464
|
+
access: "create"
|
|
54465
|
+
},
|
|
53965
54466
|
"webrtcSession.closeSession": {
|
|
53966
54467
|
capName: "webrtc-session",
|
|
53967
54468
|
capScope: "device",
|
|
@@ -58139,6 +58640,11 @@ Object.freeze({
|
|
|
58139
58640
|
form: "single",
|
|
58140
58641
|
optional: false
|
|
58141
58642
|
}],
|
|
58643
|
+
"webrtcSession.applyDownlinkProbe": [{
|
|
58644
|
+
name: "deviceId",
|
|
58645
|
+
form: "single",
|
|
58646
|
+
optional: false
|
|
58647
|
+
}],
|
|
58142
58648
|
"webrtcSession.closeSession": [{
|
|
58143
58649
|
name: "deviceId",
|
|
58144
58650
|
form: "single",
|
|
@@ -58972,7 +59478,7 @@ var STATE_SUMMARY_VARS = [
|
|
|
58972
59478
|
{
|
|
58973
59479
|
name: "summarySection",
|
|
58974
59480
|
label: "Summary: this section",
|
|
58975
|
-
description: "The section a per-section summary row is about
|
|
59481
|
+
description: "The section a per-section summary row is about; on a summary sent as one message, every section it reports, comma-separated.",
|
|
58976
59482
|
example: "Batterie scariche",
|
|
58977
59483
|
group: "system",
|
|
58978
59484
|
families: ["rule"],
|
|
@@ -59742,4 +60248,4 @@ function enumerateInferenceDevices(hw) {
|
|
|
59742
60248
|
return out;
|
|
59743
60249
|
}
|
|
59744
60250
|
//#endregion
|
|
59745
|
-
export { calendarsCapability as $,
|
|
60251
|
+
export { calendarsCapability as $, disarmRoseMemory as $n, memoizePinnedFfmpeg as $t, MOTION_CLOSE_AFTER_MS as A, storageCapability as An, EventCategory as Ar, extractNestedAddonId as At, StorageLocationTypeSchema as B, vectorIndexDimConflictError as Bn, isObjectInput as Bt, FieldClaimModeSchema as C, runtimeStatePolicyFor as Cn, parseJsonObject as Cr, enumerateInferenceDevices as Ct, LocationIconIdSchema as D, settingsStoreCapability as Dn, scopeKey as Dr, evictionPolicyOfLocation as Dt, LegacyStorageLocationDefaultSchema as E, scoreRuntimes as En, resolveCapMount as Er, evaluateCompositionField as Et, STORAGE_ACCESS_FALLBACK as F, streamQualityLabel as Fn, isAppLinkBase as Ft, addonWidgetsCapability as G, cloneStatefulExpressionMemory as Gn, lifecycleJobSchema as Gt, UserRecordSchema as H, withLocationMode as Hn, kebabToCamel as Ht, STREAM_PROFILE_META as I, userManagementCapability as In, isArrayOutputSchema as It, backupCapability as J, compositionFeatureEnabled as Jn, logDestinationCapability as Jt, alertsCapability as K, composedDeviceRef as Kn, localNetworkCapability as Kt, ScopedTokenSchema as L, validateComposition as Ln, isCollectionArrayMethod as Lt, REDACTED_SECRET as M, storageOccupancyCapability as Mn, foldSnapshotByFunction as Mt, RUNTIME_DEFAULTS as N, storageProviderCapability as Nn, formatMinutes as Nt, METHOD_ACCESS_MAP as O, siteZoneKey as On, sleep as Or, expandContainer as Ot, RecordingStatusSchema as P, streamCatalogCapability as Pn, gbToBytes as Pt, buildStreamParamsConfigSchema as Q, createStatefulExpressionMemory as Qn, mayWriteToLocation as Qt, StorageCleanupJobSchema as R, validateCustomAddress as Rn, isDefaultViewerEndpoint as Rt, FIRST_LEVEL_MACRO_CLASSES as S, resolveViewerAddresses as Sn, nodePin as Sr, deviceStatusCapability as St, LOG_LEVEL_RANK as T, scopesAllowDeviceCap as Tn, readinessKey as Tr, enumerateSchemaFields as Tt, addonPagesCapability as U, COMPOSER_ADDON_ID as Un, legacyAutoLinkIds as Ut, StorageMigrationJobSchema as V, vectorStoreCapability as Vn, isVoidInput as Vt, addonSettingsCapability as W, buildFfmpegArgs as Wn, legacyModeOf as Wt, batteryCapability as X, compositionSliceKey as Xn, looseSchema as Xt, bareAddonId as Y, compositionItemFieldPath as Yn, logLevelAtMost as Yt, buildCapabilityLookup as Z, compositionSourceKey as Zn, mayReadLocation as Zt, DATABASE_SNAPSHOT_TIMEOUT_MS as _, resolveCoreBlockFiles as _n, emitReadiness as _r, deriveBatteryPresence as _t, BatteryStatusSchema as a, objectInputDeclaresAddonId as an, BaseAddon as ar, compositionSourceRefs as at, DeclaredDevices as b, resolveMethodAuth as bn, isDeviceConfigCap as br, deviceManagerCapability as bt, CAP_NAMES_WITH_STATUS as c, pickAppLinkHub as cn, DEVICE_STATUS_METHOD as cr, coreBlockIdFromAddonId as ct, CORE_BLOCKS_ADDON_ID as d, procedureAuthKey as dn, WELL_KNOWN_TAB_MAP as dr, createDeviceExtensionProvider as dt, metricsProviderCapability as en, toExpressionValue as er, cameraGridLayoutCapability as et, CORE_BLOCK_ADDON_PREFIX as f, ptzAutotrackCapability as fn, asJsonObject as fr, dataStoreProviderCapability as ft, DATABASE_SNAPSHOT_SUFFIX as g, resolveCoreBlockEntry as gn, emitDownForOwnedCaps as gr, defineExtensionSlotProvider as gt, DATABASE_SNAPSHOT_PARTIAL_SUFFIX as h, resolveBucketMs as hn, createEvent as hr, decodeVectorBase64 as ht, BaseDevice as i, normalizeUnit as in, errMsg as ir, compositionFieldKey as it, RECORDING_SOURCE_CAMSTACK_ADDON as j, storageMigrationCapability as jn, filesystemBrowseCapability as jt, MINUTES_PER_DAY as k, snapshotCapability as kn, toNodeId as kr, expressionContainsBuiltinCall as kt, COMPOSED_ITEM_FIXED_FIELDS as l, planComposition as ln, ReadinessRegistry as lr, coreBlockSourceKind as lt, CoreBlockSchema as m, replacedFieldKeys as mn, asString$1 as mr, declarationOwnerNodeId as mt, AlertSchema as n, motionCapability as nn, DeviceRole as nr, collectSecretConfigKeys as nt, CAMERA_SWITCH_ORDER as o, objectInputDeclaresRequiredDeviceId as on, DATAPLANE_SECRET_HEADER as or, coreBlockAddonId as ot, CalendarPreferencesSchema as p, reducePoints as pn, asNumber as pr, databaseSnapshotCapability as pt, authProviderCapability as q, composedDeviceStableId as qn, locationIconKey as qt, ApiKeyRecordSchema as r, normalizeCoreBlockWrite as rn, DeviceType as rr, composerCapability as rt, CAMSTACK_APP_LINK_ORIGIN as s, parseStreamParamsFormPatch as sn, DEVICE_SETTINGS_CONTRIBUTION_METHODS as sr, coreBlockComposition as st, ALL_CAPABILITY_DEFINITIONS as t, modeMayWrite as tn, DeviceFeature as tr, checkRoleAddress as tt, COMPOSER_RUNNER_ID as u, platformProbeCapability as un, ReadinessTimeoutError as ur, coreBlocksCapability as ut, DAY_NAMES as v, resolveHubAddressRoles as vn, expandCapMethods as vr, describeComposableCaps as vt, FieldClaimSchema as w, scopesAllowAddon as wn, parseJsonUnknown as wr, enumerateItemArrayFields as wt, DeviceStatusSchema as x, resolveNotificationsAddress as xn, isEvent as xr, deviceStateCapability as xt, DERIVED_CAMERA_SILENCED_CAP_NAMES as y, resolveLocationMode as yn, hydrateSchema as yr, deviceExtensionCapability as yt, StorageLocationModeSchema as z, vectorDimFromBase64 as zn, isLocationEnabled as zt };
|