@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.
Files changed (70) hide show
  1. package/dist/addon-runner.js +1 -1
  2. package/dist/addon-runner.mjs +1 -1
  3. package/dist/auth/user-manager.d.ts +43 -2
  4. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.js +1 -1
  5. package/dist/builtins/addon-pages-aggregator/addon-pages-aggregator.addon.mjs +1 -1
  6. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.js +1 -1
  7. package/dist/builtins/addon-widgets-aggregator/addon-widgets-aggregator.addon.mjs +1 -1
  8. package/dist/builtins/alerts/alerts.addon.js +1 -1
  9. package/dist/builtins/alerts/alerts.addon.mjs +1 -1
  10. package/dist/builtins/autotrack/index.js +2 -2
  11. package/dist/builtins/autotrack/index.mjs +2 -2
  12. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.js +1 -1
  13. package/dist/builtins/backup-orchestrator/backup-orchestrator.addon.mjs +1 -1
  14. package/dist/builtins/calendars/calendars.addon.js +1 -1
  15. package/dist/builtins/calendars/calendars.addon.mjs +1 -1
  16. package/dist/builtins/camera-grid/index.js +1 -1
  17. package/dist/builtins/camera-grid/index.mjs +1 -1
  18. package/dist/builtins/composer/composer.addon.js +8 -8
  19. package/dist/builtins/composer/composer.addon.mjs +8 -8
  20. package/dist/builtins/console-logging/index.js +1 -1
  21. package/dist/builtins/console-logging/index.mjs +1 -1
  22. package/dist/builtins/core-blocks/core-blocks.addon.js +2 -2
  23. package/dist/builtins/core-blocks/core-blocks.addon.mjs +2 -2
  24. package/dist/builtins/device-manager/device-manager.addon.js +9 -9
  25. package/dist/builtins/device-manager/device-manager.addon.mjs +9 -9
  26. package/dist/builtins/hub-forwarder/index.js +1 -1
  27. package/dist/builtins/hub-forwarder/index.mjs +1 -1
  28. package/dist/builtins/liveness-monitor/liveness-monitor.addon.js +1 -1
  29. package/dist/builtins/liveness-monitor/liveness-monitor.addon.mjs +1 -1
  30. package/dist/builtins/local-auth/admin-account-boot.d.ts +27 -0
  31. package/dist/builtins/local-auth/auth-schema.d.ts +3 -2
  32. package/dist/builtins/local-auth/local-auth.addon.js +281 -8
  33. package/dist/builtins/local-auth/local-auth.addon.mjs +291 -22
  34. package/dist/builtins/local-network/address-book.d.ts +69 -0
  35. package/dist/builtins/local-network/local-network.addon.d.ts +44 -32
  36. package/dist/builtins/local-network/local-network.addon.js +368 -55
  37. package/dist/builtins/local-network/local-network.addon.mjs +369 -54
  38. package/dist/builtins/loki-logging/index.js +1 -1
  39. package/dist/builtins/loki-logging/index.mjs +1 -1
  40. package/dist/builtins/native-metrics/native-metrics.addon.js +1 -1
  41. package/dist/builtins/native-metrics/native-metrics.addon.mjs +1 -1
  42. package/dist/builtins/platform-probe/index.js +1 -1
  43. package/dist/builtins/platform-probe/index.mjs +1 -1
  44. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.js +1 -1
  45. package/dist/builtins/remote-access-orchestrator/remote-access-orchestrator.addon.mjs +1 -1
  46. package/dist/builtins/snapshot/index.js +1 -1
  47. package/dist/builtins/snapshot/index.mjs +1 -1
  48. package/dist/builtins/sqlite-storage/filesystem-storage.addon.js +1 -1
  49. package/dist/builtins/sqlite-storage/filesystem-storage.addon.mjs +1 -1
  50. package/dist/builtins/sqlite-storage/sqlite-settings.addon.js +0 -0
  51. package/dist/builtins/sqlite-storage/sqlite-settings.addon.mjs +0 -0
  52. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.js +1 -1
  53. package/dist/builtins/storage-orchestrator/storage-orchestrator.addon.mjs +1 -1
  54. package/dist/builtins/system-config/system-config.addon.js +1 -1
  55. package/dist/builtins/system-config/system-config.addon.mjs +1 -1
  56. package/dist/builtins/winston-logging/index.js +1 -1
  57. package/dist/builtins/winston-logging/index.mjs +1 -1
  58. package/dist/{child-cap-dispatch-BcRHQBKW.mjs → child-cap-dispatch-Dm1TRDCr.mjs} +2 -2
  59. package/dist/{child-cap-dispatch-wbIQJctP.js → child-cap-dispatch-t61ohDpb.js} +2 -2
  60. package/dist/{composition-sources-CeO0K2cl.js → composition-sources-CCU_KizO.js} +1 -1
  61. package/dist/{composition-sources-BBfqepyT.mjs → composition-sources-CHlfWHl6.mjs} +1 -1
  62. package/dist/{dist-CFVOy8VT.js → dist-W_X44h-s.js} +669 -121
  63. package/dist/{dist-B7WRgEZY.mjs → dist-pTfD_M-U.mjs} +628 -122
  64. package/dist/index.js +6 -141
  65. package/dist/index.mjs +4 -139
  66. package/dist/kernel/config-manager.d.ts +1 -1
  67. package/dist/kernel/config-schema.d.ts +6 -1
  68. package/dist/{retired-settings-keys-DKRjfz0U.mjs → retired-settings-keys-CK_ifret.mjs} +1 -1
  69. package/dist/{retired-settings-keys-CRlTzxaS.js → retired-settings-keys-jglEzgWR.js} +1 -1
  70. 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-DXKLNFvA.mjs
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 = zod.z.enum([
7867
7867
  "balanced",
7868
7868
  "strict"
7869
7869
  ]);
7870
- new Set([
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 = zod.z.object({
8051
8009
  * `camstack/docs` → `/docs/detection/models`.
8052
8010
  */
8053
8011
  var ModelLicenseSchema = zod.z.preprocess((value) => typeof value === "string" ? { weights: value } : value, ModelLicenseRecordSchema);
8054
- /** One `fillsClassifierEffects` entry — see `ModelCatalogEntry.fillsClassifierEffects`. */
8055
- var FillsClassifierEffectSchema = zod.z.object({
8056
- stepId: zod.z.enum(FILLABLE_STEP_IDS),
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 = zod.z.discriminatedUnion("kind", [zod.z.object({
8024
+ kind: zod.z.literal("label"),
8025
+ stepId: zod.z.enum(LABEL_SUPPLY_STEP_IDS),
8057
8026
  labelToEffect: zod.z.record(zod.z.string(), zod.z.string()),
8058
8027
  uncovered: zod.z.array(zod.z.string()).readonly()
8059
- });
8028
+ }), zod.z.object({
8029
+ kind: zod.z.literal("crop"),
8030
+ stepId: zod.z.enum(CROP_SUPPLY_STEP_IDS),
8031
+ rootLabels: zod.z.array(zod.z.string()).readonly(),
8032
+ parentMacro: zod.z.enum(["vehicle", "person"]),
8033
+ childClass: zod.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: zod.z.number().int().positive().optional()
8040
+ })]);
8060
8041
  var ModelCatalogEntrySchema = zod.z.object({
8061
8042
  id: zod.z.string(),
8062
8043
  name: zod.z.string(),
@@ -8183,15 +8164,15 @@ var ModelCatalogEntrySchema = zod.z.object({
8183
8164
  */
8184
8165
  classMap: DetectionCatalogClassMapSchema.optional(),
8185
8166
  /**
8186
- * The pipeline steps this ROOT detector already does the work of (D715):
8187
- * its labels name the effect the step exists to produce (`deer` for
8188
- * `animal-classifier`, `package` for `package-detection`). Derived from the
8189
- * labelmap by `deriveClassifierFills`, never hand-written; a COCO model
8190
- * declares none. Whether a declaration is honoured is the step's own
8191
- * `labelLink` policy (`resolveLabelLink`). `labelToEffect` values are in
8192
- * `FILLABLE_STEP_VOCABULARIES` (guard `check-label-link-vocabulary`).
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
- fillsClassifierEffects: zod.z.array(FillsClassifierEffectSchema).readonly().optional(),
8175
+ suppliesSteps: zod.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 (D393, D663)`)
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 = zod.z.object({
25819
+ stepId: zod.z.string(),
25820
+ /** The root model that drew the boxes — stamped on the result. */
25821
+ modelId: zod.z.string(),
25822
+ detections: zod.z.array(zod.z.object({
25823
+ /** `[x1, y1, x2, y2]` in the pixels of the call's image. */
25824
+ bbox: zod.z.tuple([
25825
+ zod.z.number(),
25826
+ zod.z.number(),
25827
+ zod.z.number(),
25828
+ zod.z.number()
25829
+ ]),
25830
+ score: zod.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: zod.z.array(zod.z.object({
25837
+ x: zod.z.number(),
25838
+ y: zod.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 = zod.z.object({
25644
25971
  legacy: zod.z.boolean().optional(),
25645
25972
  provider: ModelProviderIdSchema.optional(),
25646
25973
  defaultConfidence: zod.z.number().optional(),
25647
- fillsClassifierEffects: zod.z.array(FillsClassifierEffectSchema).readonly().optional()
25974
+ suppliesSteps: zod.z.array(RootStepSupplySchema).readonly().optional()
25648
25975
  });
25649
25976
  var ConfigFieldBridge = zod.z.custom();
25650
25977
  var PipelineAddonSchemaSchema = zod.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: zod.z.literal(true).optional()
26378
+ replay: zod.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: zod.z.string().optional(),
27363
27699
  parent: DetailParentSchema,
27364
- steps: zod.z.array(zod.z.string()).optional()
27700
+ steps: zod.z.array(zod.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: zod.z.object({
27709
+ stepId: zod.z.string(),
27710
+ modelId: zod.z.string(),
27711
+ boxes: zod.z.array(zod.z.object({
27712
+ bbox: NativeCropBboxSchema,
27713
+ score: zod.z.number()
27714
+ })).min(1)
27715
+ }).optional()
27365
27716
  }), zod.z.object({ details: zod.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: zod.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(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
+ /**
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 = zod.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 = zod.z.object({
36416
36753
  /** What the ranking currently resolves to (may be empty if nothing is up). */
36417
36754
  resolved: zod.z.array(zod.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 = zod.z.object({
36762
+ override: zod.z.string().nullable(),
36763
+ resolved: zod.z.string().nullable(),
36764
+ source: zod.z.enum([
36765
+ "override",
36766
+ "auto",
36767
+ "none"
36768
+ ])
36769
+ });
36770
+ var HubAddressesSchema = zod.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 = 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
+ });
36419
36832
  var AllowedAddressesSchema = zod.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(zod.z.void(), NotificationEndpointSchema),
36530
36943
  /**
36531
- * Mark which endpoint notification artifacts use. `baseUrl: null` restores
36532
- * AUTO. The value is stored verbatim (not an index into the candidate
36533
- * list): interfaces come and go, and an index would silently re-point at a
36534
- * different address after a reboot.
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(zod.z.object({ baseUrl: zod.z.string().nullable() }), NotificationEndpointSchema, { kind: "mutation" }),
36537
36950
  /**
36538
- * The endpoints the SDK / viewer races for API access. Empty `baseUrls`
36539
- * means AUTO: every LAN IPv4 address plus the public tunnel, never IPv6,
36540
- * never mesh, never loopback. `resolved` is that set (or the operator's
36541
- * explicit subset) as it stands right now.
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(zod.z.void(), ViewerEndpointsSchema),
36544
36958
  /**
36545
- * Replace the viewer race set. Empty `baseUrls` restores AUTO. Stored
36546
- * verbatim (not indices) so a temporarily-down tunnel is not silently
36547
- * dropped from the operator's choice.
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(zod.z.object({ baseUrls: zod.z.array(zod.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(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
+ }),
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(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, {
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(zod.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 (D698); on a summary sent as one message, every section it reports, comma-separated.",
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"],
@@ -60162,6 +60668,12 @@ Object.defineProperty(exports, "cameraGridLayoutCapability", {
60162
60668
  return cameraGridLayoutCapability;
60163
60669
  }
60164
60670
  });
60671
+ Object.defineProperty(exports, "checkRoleAddress", {
60672
+ enumerable: true,
60673
+ get: function() {
60674
+ return checkRoleAddress;
60675
+ }
60676
+ });
60165
60677
  Object.defineProperty(exports, "cloneStatefulExpressionMemory", {
60166
60678
  enumerable: true,
60167
60679
  get: function() {
@@ -60450,6 +60962,12 @@ Object.defineProperty(exports, "hydrateSchema", {
60450
60962
  return hydrateSchema;
60451
60963
  }
60452
60964
  });
60965
+ Object.defineProperty(exports, "isAppLinkBase", {
60966
+ enumerable: true,
60967
+ get: function() {
60968
+ return isAppLinkBase;
60969
+ }
60970
+ });
60453
60971
  Object.defineProperty(exports, "isArrayOutputSchema", {
60454
60972
  enumerable: true,
60455
60973
  get: function() {
@@ -60462,6 +60980,12 @@ Object.defineProperty(exports, "isCollectionArrayMethod", {
60462
60980
  return isCollectionArrayMethod;
60463
60981
  }
60464
60982
  });
60983
+ Object.defineProperty(exports, "isDefaultViewerEndpoint", {
60984
+ enumerable: true,
60985
+ get: function() {
60986
+ return isDefaultViewerEndpoint;
60987
+ }
60988
+ });
60465
60989
  Object.defineProperty(exports, "isDeviceConfigCap", {
60466
60990
  enumerable: true,
60467
60991
  get: function() {
@@ -60702,6 +61226,12 @@ Object.defineProperty(exports, "resolveCoreBlockFiles", {
60702
61226
  return resolveCoreBlockFiles;
60703
61227
  }
60704
61228
  });
61229
+ Object.defineProperty(exports, "resolveHubAddressRoles", {
61230
+ enumerable: true,
61231
+ get: function() {
61232
+ return resolveHubAddressRoles;
61233
+ }
61234
+ });
60705
61235
  Object.defineProperty(exports, "resolveLocationMode", {
60706
61236
  enumerable: true,
60707
61237
  get: function() {
@@ -60714,6 +61244,18 @@ Object.defineProperty(exports, "resolveMethodAuth", {
60714
61244
  return resolveMethodAuth;
60715
61245
  }
60716
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
+ });
60717
61259
  Object.defineProperty(exports, "runtimeStatePolicyFor", {
60718
61260
  enumerable: true,
60719
61261
  get: function() {
@@ -60828,6 +61370,12 @@ Object.defineProperty(exports, "validateComposition", {
60828
61370
  return validateComposition;
60829
61371
  }
60830
61372
  });
61373
+ Object.defineProperty(exports, "validateCustomAddress", {
61374
+ enumerable: true,
61375
+ get: function() {
61376
+ return validateCustomAddress;
61377
+ }
61378
+ });
60831
61379
  Object.defineProperty(exports, "vectorDimFromBase64", {
60832
61380
  enumerable: true,
60833
61381
  get: function() {