@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 = 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 = 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
- /** One `fillsClassifierEffects` entry — see `ModelCatalogEntry.fillsClassifierEffects`. */
8055
- var FillsClassifierEffectSchema = z.object({
8056
- stepId: 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 = 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 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: z.array(FillsClassifierEffectSchema).readonly().optional(),
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 (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 = 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
- fillsClassifierEffects: z.array(FillsClassifierEffectSchema).readonly().optional()
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
- * 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(z.object({ baseUrl: 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(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(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 (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"],
@@ -59742,4 +60248,4 @@ function enumerateInferenceDevices(hw) {
59742
60248
  return out;
59743
60249
  }
59744
60250
  //#endregion
59745
- export { calendarsCapability as $, DATAPLANE_SECRET_HEADER as $n, motionCapability as $t, MOTION_CLOSE_AFTER_MS as A, userManagementCapability as An, filesystemBrowseCapability as At, StorageLocationTypeSchema as B, composedDeviceStableId as Bn, legacyAutoLinkIds as Bt, FieldClaimModeSchema as C, snapshotCapability as Cn, EventCategory as Cr, enumerateItemArrayFields as Ct, LocationIconIdSchema as D, storageProviderCapability as Dn, expandContainer as Dt, LegacyStorageLocationDefaultSchema as E, storageOccupancyCapability as En, evictionPolicyOfLocation as Et, STORAGE_ACCESS_FALLBACK as F, withLocationMode as Fn, isCollectionArrayMethod as Ft, addonWidgetsCapability as G, createStatefulExpressionMemory as Gn, logDestinationCapability as Gt, UserRecordSchema as H, compositionItemFieldPath as Hn, lifecycleJobSchema as Ht, STREAM_PROFILE_META as I, COMPOSER_ADDON_ID as In, isLocationEnabled as It, backupCapability as J, DeviceFeature as Jn, mayReadLocation as Jt, alertsCapability as K, disarmRoseMemory as Kn, logLevelAtMost as Kt, ScopedTokenSchema as L, buildFfmpegArgs as Ln, isObjectInput as Lt, REDACTED_SECRET as M, vectorDimFromBase64 as Mn, formatMinutes as Mt, RUNTIME_DEFAULTS as N, vectorIndexDimConflictError as Nn, gbToBytes as Nt, METHOD_ACCESS_MAP as O, streamCatalogCapability as On, expressionContainsBuiltinCall as Ot, RecordingStatusSchema as P, vectorStoreCapability as Pn, isArrayOutputSchema as Pt, buildStreamParamsConfigSchema as Q, BaseAddon as Qn, modeMayWrite as Qt, StorageCleanupJobSchema as R, cloneStatefulExpressionMemory as Rn, isVoidInput as Rt, FIRST_LEVEL_MACRO_CLASSES as S, siteZoneKey as Sn, toNodeId as Sr, enumerateInferenceDevices as St, LOG_LEVEL_RANK as T, storageMigrationCapability as Tn, evaluateCompositionField as Tt, addonPagesCapability as U, compositionSliceKey as Un, localNetworkCapability as Ut, StorageMigrationJobSchema as V, compositionFeatureEnabled as Vn, legacyModeOf as Vt, addonSettingsCapability as W, compositionSourceKey as Wn, locationIconKey as Wt, batteryCapability as X, DeviceType as Xn, memoizePinnedFfmpeg as Xt, bareAddonId as Y, DeviceRole as Yn, mayWriteToLocation as Yt, buildCapabilityLookup as Z, errMsg as Zn, metricsProviderCapability as Zt, DATABASE_SNAPSHOT_TIMEOUT_MS as _, runtimeStatePolicyFor as _n, parseJsonUnknown as _r, describeComposableCaps as _t, BatteryStatusSchema as a, pickAppLinkHub as an, asJsonObject as ar, coreBlockAddonId as at, DeclaredDevices as b, scoreRuntimes as bn, scopeKey as br, deviceStateCapability as bt, CAP_NAMES_WITH_STATUS as c, procedureAuthKey as cn, createEvent as cr, coreBlockSourceKind as ct, CORE_BLOCKS_ADDON_ID as d, replacedFieldKeys as dn, expandCapMethods as dr, dataStoreProviderCapability as dt, normalizeCoreBlockWrite as en, DEVICE_SETTINGS_CONTRIBUTION_METHODS as er, cameraGridLayoutCapability as et, CORE_BLOCK_ADDON_PREFIX as f, resolveBucketMs as fn, hydrateSchema as fr, databaseSnapshotCapability as ft, DATABASE_SNAPSHOT_SUFFIX as g, resolveMethodAuth as gn, parseJsonObject as gr, deriveBatteryPresence as gt, DATABASE_SNAPSHOT_PARTIAL_SUFFIX as h, resolveLocationMode as hn, nodePin as hr, defineExtensionSlotProvider as ht, BaseDevice as i, parseStreamParamsFormPatch as in, WELL_KNOWN_TAB_MAP as ir, compositionSourceRefs as it, RECORDING_SOURCE_CAMSTACK_ADDON as j, validateComposition as jn, foldSnapshotByFunction as jt, MINUTES_PER_DAY as k, streamQualityLabel as kn, extractNestedAddonId as kt, COMPOSED_ITEM_FIXED_FIELDS as l, ptzAutotrackCapability as ln, emitDownForOwnedCaps as lr, coreBlocksCapability as lt, CoreBlockSchema as m, resolveCoreBlockFiles as mn, isEvent as mr, decodeVectorBase64 as mt, AlertSchema as n, objectInputDeclaresAddonId as nn, ReadinessRegistry as nr, composerCapability as nt, CAMERA_SWITCH_ORDER as o, planComposition as on, asNumber as or, coreBlockComposition as ot, CalendarPreferencesSchema as p, resolveCoreBlockEntry as pn, isDeviceConfigCap as pr, declarationOwnerNodeId as pt, authProviderCapability as q, toExpressionValue as qn, looseSchema as qt, ApiKeyRecordSchema as r, objectInputDeclaresRequiredDeviceId as rn, ReadinessTimeoutError as rr, compositionFieldKey as rt, CAMSTACK_APP_LINK_ORIGIN as s, platformProbeCapability as sn, asString$1 as sr, coreBlockIdFromAddonId as st, ALL_CAPABILITY_DEFINITIONS as t, normalizeUnit as tn, DEVICE_STATUS_METHOD as tr, collectSecretConfigKeys as tt, COMPOSER_RUNNER_ID as u, reducePoints as un, emitReadiness as ur, createDeviceExtensionProvider as ut, DAY_NAMES as v, scopesAllowAddon as vn, readinessKey as vr, deviceExtensionCapability as vt, FieldClaimSchema as w, storageCapability as wn, enumerateSchemaFields as wt, DeviceStatusSchema as x, settingsStoreCapability as xn, sleep as xr, deviceStatusCapability as xt, DERIVED_CAMERA_SILENCED_CAP_NAMES as y, scopesAllowDeviceCap as yn, resolveCapMount as yr, deviceManagerCapability as yt, StorageLocationModeSchema as z, composedDeviceRef as zn, kebabToCamel as zt };
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 };