@camstack/types 1.2.326 → 1.2.328

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 (80) hide show
  1. package/dist/addon/base-addon.d.ts +58 -0
  2. package/dist/addon/secret-aware-context.d.ts +27 -0
  3. package/dist/addon/secret-paths.d.ts +48 -0
  4. package/dist/addon/secret-settings-view.d.ts +80 -0
  5. package/dist/addon.d.ts +2 -0
  6. package/dist/addon.js +54 -4
  7. package/dist/addon.mjs +27 -5
  8. package/dist/capabilities/addon-routes.cap.d.ts +2 -2
  9. package/dist/capabilities/addons.cap.d.ts +4 -4
  10. package/dist/capabilities/alerts.cap.d.ts +5 -5
  11. package/dist/capabilities/control.cap.d.ts +11 -11
  12. package/dist/capabilities/day-night.cap.d.ts +8 -8
  13. package/dist/capabilities/device-manager.cap.d.ts +9 -0
  14. package/dist/capabilities/enum-sensor.cap.d.ts +4 -4
  15. package/dist/capabilities/index.d.ts +7 -3
  16. package/dist/capabilities/integrations.cap.d.ts +6 -3
  17. package/dist/capabilities/keychain-admin.cap.d.ts +312 -0
  18. package/dist/capabilities/keychain.cap.d.ts +180 -0
  19. package/dist/capabilities/lawn-mower-control.cap.d.ts +4 -4
  20. package/dist/capabilities/local-network.cap.d.ts +2 -2
  21. package/dist/capabilities/log-channels.cap.d.ts +1 -1
  22. package/dist/capabilities/log-destination.cap.d.ts +5 -5
  23. package/dist/capabilities/login-method.cap.d.ts +3 -0
  24. package/dist/capabilities/mesh-network.cap.d.ts +3 -3
  25. package/dist/capabilities/network-access.cap.d.ts +7 -7
  26. package/dist/capabilities/notification-rules.cap.d.ts +30 -30
  27. package/dist/capabilities/osd-manager.cap.d.ts +11 -11
  28. package/dist/capabilities/osd.cap.d.ts +5 -5
  29. package/dist/capabilities/pipeline-analytics.cap.d.ts +1127 -104
  30. package/dist/capabilities/pipeline-orchestrator.cap.d.ts +384 -0
  31. package/dist/capabilities/pipeline-runner.cap.d.ts +145 -2
  32. package/dist/capabilities/sso-bridge.cap.d.ts +6 -0
  33. package/dist/capabilities/storage.cap.d.ts +1 -1
  34. package/dist/capabilities/system.cap.d.ts +21 -21
  35. package/dist/capabilities/user-management.cap.d.ts +53 -1
  36. package/dist/capabilities/webrtc-session.cap.d.ts +3 -3
  37. package/dist/client.js +38 -1
  38. package/dist/client.mjs +38 -1
  39. package/dist/device/device-context.d.ts +11 -1
  40. package/dist/device/display-icon-vocabulary.d.ts +7 -0
  41. package/dist/device/index.d.ts +2 -1
  42. package/dist/device/zod-secret.d.ts +35 -0
  43. package/dist/enums/event-category.d.ts +7 -0
  44. package/dist/enums.js +1 -1
  45. package/dist/enums.mjs +1 -1
  46. package/dist/{event-category-CtBAl88K.js → event-category-CHduMGvg.js} +7 -0
  47. package/dist/{event-category-B_0XEcLF.mjs → event-category-DaIZi00R.mjs} +7 -0
  48. package/dist/generated/addon-api.d.ts +376 -0
  49. package/dist/generated/cap-input-defaults.d.ts +1 -1
  50. package/dist/generated/capability-router-map.d.ts +8 -2
  51. package/dist/generated/method-access-map.d.ts +1 -1
  52. package/dist/generated/method-device-selectors.d.ts +1 -1
  53. package/dist/generated/system-proxy.d.ts +5 -3
  54. package/dist/health/wiring-health.d.ts +8 -8
  55. package/dist/index.d.ts +8 -3
  56. package/dist/index.js +1970 -110
  57. package/dist/index.mjs +1849 -107
  58. package/dist/interfaces/addon.d.ts +25 -0
  59. package/dist/interfaces/config-ui-secrets.d.ts +12 -0
  60. package/dist/interfaces/config-ui.d.ts +60 -3
  61. package/dist/interfaces/event-bus.d.ts +11 -0
  62. package/dist/interfaces/pipeline-runner-capability.d.ts +18 -0
  63. package/dist/keychain/index.d.ts +5 -0
  64. package/dist/keychain/known-secrets.d.ts +31 -0
  65. package/dist/keychain/resolve-secret-views.d.ts +2 -0
  66. package/dist/keychain/secret-marker.d.ts +52 -0
  67. package/dist/keychain/secret-ref.d.ts +62 -0
  68. package/dist/keychain/secrets-access.d.ts +77 -0
  69. package/dist/logging/log-channel.d.ts +2 -2
  70. package/dist/pipeline/auto-tune/plan-schemas.d.ts +123 -0
  71. package/dist/pipeline/auto-tune/recommend.d.ts +26 -1
  72. package/dist/pipeline/load-balancing/schemas.d.ts +8 -7
  73. package/dist/pipeline/node-benchmark/benchmark-mode.d.ts +57 -0
  74. package/dist/pipeline/node-benchmark/index.d.ts +9 -0
  75. package/dist/pipeline/node-benchmark/results.d.ts +52 -0
  76. package/dist/pipeline/node-benchmark/schemas.d.ts +848 -0
  77. package/dist/pipeline/node-benchmark/step-tree.d.ts +23 -0
  78. package/dist/{sleep-BNeXenvr.mjs → sleep-Cr5YOk3m.mjs} +1337 -33
  79. package/dist/{sleep-DPar9AHl.js → sleep-i3kl-0Na.js} +1628 -66
  80. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-DPar9AHl.js");
3
- const require_event_category = require("./event-category-CtBAl88K.js");
2
+ const require_sleep = require("./sleep-i3kl-0Na.js");
3
+ const require_event_category = require("./event-category-CHduMGvg.js");
4
4
  const require_composition = require("./composition-BLWAivB2.js");
5
5
  const require_err_msg = require("./err-msg-Dx2Kor0g.js");
6
6
  const require_enums = require("./enums.js");
@@ -1632,69 +1632,6 @@ function composeSwitchedOff(input) {
1632
1632
  };
1633
1633
  }
1634
1634
  //#endregion
1635
- //#region src/interfaces/config-ui-secrets.ts
1636
- /**
1637
- * The value a redacted secret is replaced with on every read surface.
1638
- *
1639
- * It is also the WRITE-BACK token: an `upsertLocation` that sends this value
1640
- * back for a key means "keep what is stored", which is what lets an operator
1641
- * rename a location without retyping its password. A literal an operator could
1642
- * plausibly choose as a real password would turn that convenience into a way
1643
- * to lock yourself out, hence the sentinel shape.
1644
- */
1645
- var REDACTED_SECRET = "__camstack_redacted__";
1646
- /** Is this field's stored value a credential? */
1647
- function isSecretConfigField(field) {
1648
- if (field.type === "password") return true;
1649
- return "secret" in field && field.secret === true;
1650
- }
1651
- /**
1652
- * Every config key in `schema` whose value is a secret, including keys nested
1653
- * inside `group` / `sub-tabs` containers.
1654
- */
1655
- function collectSecretConfigKeys(schema) {
1656
- const keys = /* @__PURE__ */ new Set();
1657
- for (const section of sectionsOf(schema)) for (const field of fieldsOf(section)) walkField(field, keys);
1658
- return keys;
1659
- }
1660
- /**
1661
- * True when the value is a readable schema declaring at least one field of any
1662
- * kind. Lets a caller tell "this provider has no secrets" from "this provider's
1663
- * schema could not be read", which are the same empty set otherwise.
1664
- */
1665
- function schemaDeclaresAnyField(schema) {
1666
- for (const section of sectionsOf(schema)) if (fieldsOf(section).length > 0) return true;
1667
- return false;
1668
- }
1669
- function isRecord$3(value) {
1670
- return typeof value === "object" && value !== null && !Array.isArray(value);
1671
- }
1672
- function sectionsOf(schema) {
1673
- if (!isRecord$3(schema)) return [];
1674
- const sections = schema["sections"];
1675
- return Array.isArray(sections) ? sections : [];
1676
- }
1677
- function fieldsOf(node) {
1678
- if (!isRecord$3(node)) return [];
1679
- const fields = node["fields"];
1680
- return Array.isArray(fields) ? fields : [];
1681
- }
1682
- function walkField(field, out) {
1683
- if (!isRecord$3(field)) return;
1684
- const type = field["type"];
1685
- const key = field["key"];
1686
- if ((type === "password" || field["secret"] === true) && typeof key === "string" && key.length > 0) out.add(key);
1687
- if (type === "group") {
1688
- for (const child of fieldsOf(field)) walkField(child, out);
1689
- return;
1690
- }
1691
- if (type === "sub-tabs") {
1692
- const tabs = field["tabs"];
1693
- if (!Array.isArray(tabs)) return;
1694
- for (const tab of tabs) for (const child of fieldsOf(tab)) walkField(child, out);
1695
- }
1696
- }
1697
- //#endregion
1698
1635
  //#region src/interfaces/birth-decision-ledger.ts
1699
1636
  /**
1700
1637
  * Birth-decision ledger — one durable row per track-birth VERDICT (D409).
@@ -12591,6 +12528,277 @@ id: zod.z.union([zod.z.string(), zod.z.number()]) }), {
12591
12528
  }
12592
12529
  };
12593
12530
  //#endregion
12531
+ //#region src/capabilities/keychain.cap.ts
12532
+ /**
12533
+ * `keychain` — the hub's encrypted store of secret values (D787).
12534
+ *
12535
+ * Settings blobs never hold a secret: they hold a marker
12536
+ * `{"$secret":"secret://<owner>/<scope>/<fieldPath>","v":1}` and the value
12537
+ * lives here, AES-256-GCM under a data key that a master key wraps. This cap
12538
+ * is the OWNER's door to its own values: every method is owner-checked
12539
+ * against the CALLER, never against anything the caller claims.
12540
+ *
12541
+ * Who the caller is: the transport stamps `callerAddonId` into the args of a
12542
+ * call that crossed a process (the parent `LocalChildRegistry` from the UDS
12543
+ * connection, the agent from its child's connection carried in
12544
+ * `$hub-cap-fwd`'s envelope). A stamp always overwrites; a wire call with no
12545
+ * stamp has its claim stripped. Only a hub in-process caller may state its own
12546
+ * identity — `ctx.secrets` does that with the addon id closed over. This is
12547
+ * identity against BUGS and misrouting, not against a malicious addon (every
12548
+ * runner is the same OS user): see the threat model in
12549
+ * `docs/design/2026-10-08-secrets-keychain.md`.
12550
+ *
12551
+ * `callerAddonId` is deliberately NOT in any input schema: the tRPC router
12552
+ * parses the input, so a session can never supply it, and the internal mount
12553
+ * floors every method to admin anyway (D240).
12554
+ *
12555
+ * Internal: addons reach it through `ctx.secrets`, never directly.
12556
+ */
12557
+ /** Why a value cannot be served right now. Never folded into "missing". */
12558
+ var KeychainUnavailableReasonSchema = zod.z.enum([
12559
+ "key-missing",
12560
+ "wrong-key",
12561
+ "key-file-unreadable",
12562
+ "store-unavailable",
12563
+ "not-initialized",
12564
+ "decrypt-failed"
12565
+ ]);
12566
+ var KeychainStateSchema = zod.z.discriminatedUnion("state", [zod.z.object({ state: zod.z.literal("ready") }), zod.z.object({
12567
+ state: zod.z.literal("locked"),
12568
+ reason: KeychainUnavailableReasonSchema
12569
+ })]);
12570
+ var KeychainResolveEntrySchema = zod.z.discriminatedUnion("kind", [
12571
+ zod.z.object({
12572
+ kind: zod.z.literal("value"),
12573
+ value: zod.z.string(),
12574
+ version: zod.z.number().int()
12575
+ }),
12576
+ zod.z.object({ kind: zod.z.literal("missing") }),
12577
+ zod.z.object({
12578
+ kind: zod.z.literal("unavailable"),
12579
+ reason: KeychainUnavailableReasonSchema
12580
+ }),
12581
+ zod.z.object({ kind: zod.z.literal("forbidden") })
12582
+ ]);
12583
+ var KeychainResolveResultSchema = zod.z.record(zod.z.string(), KeychainResolveEntrySchema);
12584
+ /** Metadata of one stored value — never the value. */
12585
+ var KeychainSecretMetaSchema = zod.z.object({
12586
+ ref: zod.z.string(),
12587
+ owner: zod.z.string(),
12588
+ /** Formatted scope (`global`, `node/<id>`, `device/<id>`, …). */
12589
+ scope: zod.z.string(),
12590
+ fieldPath: zod.z.string(),
12591
+ version: zod.z.number().int(),
12592
+ createdAt: zod.z.number(),
12593
+ updatedAt: zod.z.number(),
12594
+ /** `addon:<id>` | `user:<id>` | `system`. */
12595
+ updatedBy: zod.z.string(),
12596
+ /** Coarse — written at most once an hour per ref. `null` = never read. */
12597
+ lastReadAt: zod.z.number().nullable()
12598
+ });
12599
+ /** A batch bound: one `resolveConfig` resolves every marker of one blob at once. */
12600
+ var KEYCHAIN_MAX_REFS_PER_CALL = 512;
12601
+ var RefListSchema = zod.z.array(zod.z.string().min(1)).max(512);
12602
+ var keychainCapability = {
12603
+ name: "keychain",
12604
+ scope: "system",
12605
+ mode: "singleton",
12606
+ internal: true,
12607
+ methods: {
12608
+ /** Store (or replace) the caller's value at `ref`. Refused while locked. */
12609
+ put: require_sleep.method(zod.z.object({
12610
+ ref: zod.z.string().min(1),
12611
+ value: zod.z.string().min(1)
12612
+ }), zod.z.object({
12613
+ ref: zod.z.string(),
12614
+ version: zod.z.number().int()
12615
+ }), {
12616
+ kind: "mutation",
12617
+ auth: "admin"
12618
+ }),
12619
+ /**
12620
+ * Resolve the caller's refs in one round-trip. A locked keychain answers
12621
+ * `unavailable` per ref — never `missing`, never an empty value.
12622
+ */
12623
+ resolve: require_sleep.method(zod.z.object({ refs: RefListSchema }), KeychainResolveResultSchema, { auth: "admin" }),
12624
+ /** Remove the caller's refs. Unknown refs are ignored. */
12625
+ delete: require_sleep.method(zod.z.object({ refs: RefListSchema }), zod.z.object({ deleted: zod.z.number().int() }), {
12626
+ kind: "mutation",
12627
+ auth: "admin"
12628
+ }),
12629
+ /** The caller's own refs, metadata only. */
12630
+ listMeta: require_sleep.method(zod.z.object({}), zod.z.array(KeychainSecretMetaSchema).readonly(), { auth: "admin" }),
12631
+ /** Whether values can be served — the save path refuses a write while locked. */
12632
+ getState: require_sleep.method(zod.z.object({}), KeychainStateSchema, { auth: "admin" })
12633
+ }
12634
+ };
12635
+ //#endregion
12636
+ //#region src/capabilities/keychain-admin.cap.ts
12637
+ /**
12638
+ * `keychain-admin` — the operator's view of the keychain (System → Secrets).
12639
+ *
12640
+ * Every method is `admin`. Two methods hand out material, each audited and
12641
+ * each named for exactly that: {@link keychainAdminCapability.methods.reveal}
12642
+ * (one value, shown briefly by the UI) and `downloadRecoveryKey` (the master
12643
+ * key itself, so the operator can keep a copy off the hub). Nothing else
12644
+ * returns a value.
12645
+ *
12646
+ * The master key's LOCATION is configuration, never an env var (D788):
12647
+ * `keychain.keyFile` in `config.yaml`, the OS keychain on a desktop hub, else
12648
+ * `<dataDir>/.keychain/master.key` — which sits beside the database in every
12649
+ * whole-volume backup, and the status says so.
12650
+ */
12651
+ /** Where the master key in use came from. */
12652
+ var KeychainKeySourceKindSchema = zod.z.enum([
12653
+ "config-file",
12654
+ "previous-config-file",
12655
+ "platform",
12656
+ "default-file"
12657
+ ]);
12658
+ var KeychainKeySourceSchema = zod.z.object({
12659
+ kind: KeychainKeySourceKindSchema,
12660
+ /** File sources only — a path is not a secret. */
12661
+ path: zod.z.string().optional(),
12662
+ /**
12663
+ * True when a whole-volume backup of the data directory carries this key
12664
+ * next to the database it protects (the default file). The page warns.
12665
+ */
12666
+ sharesBackupWithDatabase: zod.z.boolean()
12667
+ });
12668
+ var KeychainStatusSchema = zod.z.object({
12669
+ keychain: KeychainStateSchema,
12670
+ /** The source of the master key in use; `null` while locked. */
12671
+ keySource: KeychainKeySourceSchema.nullable(),
12672
+ /** The source configured to be primary — differs from `keySource` while a rotation is pending. */
12673
+ configuredSource: KeychainKeySourceSchema,
12674
+ /** Short fingerprint of the master key in use (`HMAC(KEK, label)`, 16 hex). */
12675
+ fingerprint: zod.z.string().nullable(),
12676
+ activeKeyId: zod.z.string().nullable(),
12677
+ /**
12678
+ * The keychain unlocked with a NON-primary source: the configured primary
12679
+ * key is not the one that wraps the data key yet. `rotateMasterKey` moves it.
12680
+ */
12681
+ rotationPending: zod.z.boolean(),
12682
+ /** Wrapped copies of the data key under a previous master key, kept until purged. */
12683
+ retiredWraps: zod.z.number().int(),
12684
+ recoveryKeyDownloadedAt: zod.z.number().nullable(),
12685
+ secretCount: zod.z.number().int()
12686
+ });
12687
+ /**
12688
+ * Whether a stored value is still pointed at by its owner's settings.
12689
+ * `unknown` is a first-class answer: a scope whose blob could not be read is
12690
+ * never reported as an orphan (and never deleted as one).
12691
+ */
12692
+ var KeychainSecretUsageSchema = zod.z.enum([
12693
+ "in-use",
12694
+ "orphan",
12695
+ "unknown"
12696
+ ]);
12697
+ var KeychainAdminSecretSchema = KeychainSecretMetaSchema.extend({ usage: KeychainSecretUsageSchema });
12698
+ var KeychainAuditActionSchema = zod.z.enum([
12699
+ "put",
12700
+ "delete",
12701
+ "reveal",
12702
+ "rotate-master-key",
12703
+ "purge-retired-keys",
12704
+ "download-recovery-key",
12705
+ "delete-orphans",
12706
+ "reset",
12707
+ "initialize"
12708
+ ]);
12709
+ var KeychainAuditEntrySchema = zod.z.object({
12710
+ id: zod.z.string(),
12711
+ at: zod.z.number(),
12712
+ action: KeychainAuditActionSchema,
12713
+ /** `addon:<id>` | `user:<id>` | `system`. */
12714
+ actor: zod.z.string(),
12715
+ ref: zod.z.string().nullable(),
12716
+ detail: zod.z.string().nullable()
12717
+ });
12718
+ var KEYCHAIN_RESET_CONFIRMATION = "RESET KEYCHAIN";
12719
+ var keychainAdminCapability = {
12720
+ name: "keychain-admin",
12721
+ scope: "system",
12722
+ mode: "singleton",
12723
+ methods: {
12724
+ status: require_sleep.method(zod.z.object({}), KeychainStatusSchema, { auth: "admin" }),
12725
+ listSecrets: require_sleep.method(zod.z.object({}), zod.z.array(KeychainAdminSecretSchema).readonly(), { auth: "admin" }),
12726
+ listAudit: require_sleep.method(zod.z.object({ limit: zod.z.number().int().min(1).max(500).optional() }), zod.z.array(KeychainAuditEntrySchema).readonly(), { auth: "admin" }),
12727
+ /**
12728
+ * Show one value to the operator. Audited. The UI hides it again after a
12729
+ * few seconds; nothing caches it.
12730
+ */
12731
+ reveal: require_sleep.method(zod.z.object({ ref: zod.z.string().min(1) }), zod.z.object({
12732
+ value: zod.z.string(),
12733
+ version: zod.z.number().int()
12734
+ }), {
12735
+ kind: "mutation",
12736
+ auth: "admin",
12737
+ caller: "required"
12738
+ }),
12739
+ /** Delete refs no owner points at any more. Re-checked here; `unknown` is kept. */
12740
+ deleteOrphans: require_sleep.method(zod.z.object({ refs: zod.z.array(zod.z.string().min(1)).max(1e3) }), zod.z.object({
12741
+ deleted: zod.z.array(zod.z.string()).readonly(),
12742
+ kept: zod.z.array(zod.z.object({
12743
+ ref: zod.z.string(),
12744
+ usage: KeychainSecretUsageSchema
12745
+ })).readonly()
12746
+ }), {
12747
+ kind: "mutation",
12748
+ auth: "admin",
12749
+ caller: "required"
12750
+ }),
12751
+ /**
12752
+ * Wrap the data key under the configured primary master key.
12753
+ *
12754
+ * Pending rotation (the keychain unlocked with a previous source): re-wrap
12755
+ * under the primary. Otherwise, with the default file as primary: generate
12756
+ * a new master key, write it there, re-wrap. A file or OS-keychain primary
12757
+ * that is already in use cannot be replaced from here — put the new key at
12758
+ * the source, keep the old one as `keychain.previousKeyFile`, restart, and
12759
+ * rotate. No value is re-encrypted either way; the previous wrap is kept
12760
+ * (retired) until purged.
12761
+ */
12762
+ rotateMasterKey: require_sleep.method(zod.z.object({}), zod.z.object({
12763
+ fingerprint: zod.z.string(),
12764
+ keySource: KeychainKeySourceSchema
12765
+ }), {
12766
+ kind: "mutation",
12767
+ auth: "admin",
12768
+ caller: "required"
12769
+ }),
12770
+ purgeRetiredKeys: require_sleep.method(zod.z.object({}), zod.z.object({ purged: zod.z.number().int() }), {
12771
+ kind: "mutation",
12772
+ auth: "admin",
12773
+ caller: "required"
12774
+ }),
12775
+ /** The master key, base64. Audited; marks the recovery copy as taken. */
12776
+ downloadRecoveryKey: require_sleep.method(zod.z.object({}), zod.z.object({
12777
+ key: zod.z.string(),
12778
+ fingerprint: zod.z.string(),
12779
+ keySource: KeychainKeySourceSchema
12780
+ }), {
12781
+ kind: "mutation",
12782
+ auth: "admin",
12783
+ caller: "required"
12784
+ }),
12785
+ /**
12786
+ * Lost-key recovery: archive every stored value into a
12787
+ * `keychain:secrets-orphaned-<ts>` table and start over with a new data
12788
+ * key. Every secret field then reads "not set". Requires the typed
12789
+ * confirmation {@link KEYCHAIN_RESET_CONFIRMATION}.
12790
+ */
12791
+ resetKeychain: require_sleep.method(zod.z.object({ confirm: zod.z.literal(KEYCHAIN_RESET_CONFIRMATION) }), zod.z.object({
12792
+ archivedCollection: zod.z.string().nullable(),
12793
+ archived: zod.z.number().int()
12794
+ }), {
12795
+ kind: "mutation",
12796
+ auth: "admin",
12797
+ caller: "required"
12798
+ })
12799
+ }
12800
+ };
12801
+ //#endregion
12594
12802
  //#region src/capabilities/decoder.cap.ts
12595
12803
  /**
12596
12804
  * Stable UI option list for the `hwaccel` setting. Decoder addons
@@ -14084,6 +14292,10 @@ var DeviceInfoSchema = zod.z.object({
14084
14292
  isCamera: zod.z.boolean(),
14085
14293
  /** Current config values — serializable snapshot */
14086
14294
  config: zod.z.record(zod.z.string(), zod.z.unknown()),
14295
+ /** Paths inside `config` the device's schema declares secret (D783) —
14296
+ * what the non-admin redaction withholds. Paths, never values. Absent
14297
+ * when the owning runner has not reported them. */
14298
+ secretConfigPaths: zod.z.array(zod.z.string()).optional(),
14087
14299
  /** Hardware + identity blob (manufacturer / model / firmware / sn /
14088
14300
  * uid / mac / …). Populated by drivers; editable via setMetadata. */
14089
14301
  metadata: zod.z.record(zod.z.string(), zod.z.unknown()).nullable().optional(),
@@ -14304,12 +14516,22 @@ var DeviceRegisterPayloadSchema = zod.z.object({
14304
14516
  * call (workers re-register on init), so probe-driven updates
14305
14517
  * (e.g. PTZ flag flipping after the abilities probe) propagate. */
14306
14518
  features: zod.z.array(zod.z.string()).optional(),
14307
- config: zod.z.record(zod.z.string(), zod.z.unknown())
14519
+ config: zod.z.record(zod.z.string(), zod.z.unknown()),
14520
+ /** Config paths the device's own schema DECLARES secret
14521
+ * (`.meta({ secret: true })` — dotted, `[]` for array items, e.g.
14522
+ * `connection.password`). Re-published on every register; the non-admin
14523
+ * redaction withholds them at any depth (D783). Optional: an older runner
14524
+ * omits it and the keyword backstop applies. */
14525
+ secretConfigPaths: zod.z.array(zod.z.string()).optional()
14308
14526
  });
14309
14527
  var DeviceRemovePayloadSchema = zod.z.object({ deviceId: zod.z.number() });
14310
14528
  var DevicePersistConfigPayloadSchema = zod.z.object({
14311
14529
  deviceId: zod.z.number(),
14312
- data: zod.z.record(zod.z.string(), zod.z.unknown())
14530
+ data: zod.z.record(zod.z.string(), zod.z.unknown()),
14531
+ /** The paths the device's schema declares secret (D783), when the caller
14532
+ * knows them — those values are kept in the keychain, not the blob (D787).
14533
+ * Absent: the paths the device last reported at `registerDevice` apply. */
14534
+ secretConfigPaths: zod.z.array(zod.z.string()).optional()
14313
14535
  });
14314
14536
  /** What a migration actually did, per switch. `unreachable` is a first-class
14315
14537
  * answer: a camera that could not be asked is not a camera that was silenced. */
@@ -17538,7 +17760,14 @@ var RedirectLoginMethodSchema = zod.z.object({
17538
17760
  icon: zod.z.string().optional(),
17539
17761
  /** Addon-owned HTTP route the button navigates to (GET). */
17540
17762
  startUrl: zod.z.string(),
17541
- stage: LoginStageEnum
17763
+ stage: LoginStageEnum,
17764
+ /**
17765
+ * The provider names an external identity a signed-in user can link to
17766
+ * their own account (D782): `auth.listLinkableProviders` /
17767
+ * `beginExternalLink` offer exactly the redirect methods that set this,
17768
+ * whatever their id. Absent / false — a login button only (magic-link).
17769
+ */
17770
+ linkable: zod.z.boolean().optional()
17542
17771
  });
17543
17772
  /**
17544
17773
  * A Module-Federation widget the login page mounts for an in-page
@@ -24689,8 +24918,23 @@ var RetrainMacroClassSchema = zod.z.enum([
24689
24918
  ]);
24690
24919
  /** A subject to learn, or a phantom to unlearn (taught by OMISSION). */
24691
24920
  var RetrainAnnotationKindSchema = zod.z.enum(["subject", "model_error"]);
24692
- /** Did a human draw this box, or did the assist propose it? */
24693
- var RetrainAnnotationSourceSchema = zod.z.enum(["operator", "assist"]);
24921
+ /**
24922
+ * Where a box came from. A machine-sourced box is a DRAFT on the page until
24923
+ * the operator confirms it; once saved it keeps its source as provenance.
24924
+ *
24925
+ * - `operator` — drawn by hand.
24926
+ * - `assist` — proposed by a detector run on the copy (the camera's own
24927
+ * model, or a larger teacher model).
24928
+ * - `pipeline` — the box the live pipeline actually drew on that frame, read
24929
+ * back from the track store (never a re-run).
24930
+ * - `llm` — proposed by a vision-capable LLM profile.
24931
+ */
24932
+ var RetrainAnnotationSourceSchema = zod.z.enum([
24933
+ "operator",
24934
+ "assist",
24935
+ "pipeline",
24936
+ "llm"
24937
+ ]);
24694
24938
  /** Normalised `[0,1]` rectangle against the FULL frame — the canonical form. */
24695
24939
  var RetrainBboxSchema = zod.z.object({
24696
24940
  x: zod.z.number(),
@@ -24708,7 +24952,8 @@ var RetrainBboxSchema = zod.z.object({
24708
24952
  */
24709
24953
  var RetrainAnnotationSchema = zod.z.object({
24710
24954
  id: zod.z.string(),
24711
- trackId: zod.z.string(),
24955
+ /** The frame's track. Absent on a recording still, which has none. */
24956
+ trackId: zod.z.string().optional(),
24712
24957
  deviceId: zod.z.number(),
24713
24958
  /** The COPY in retrain storage — never the source track's media key. */
24714
24959
  mediaKey: zod.z.string(),
@@ -24757,18 +25002,63 @@ var RetrainFrameCandidateSchema = zod.z.object({
24757
25002
  * fail, whatever became of the original. */
24758
25003
  copied: zod.z.boolean()
24759
25004
  });
25005
+ /**
25006
+ * One box the live pipeline drew on a copied frame — what a correction starts
25007
+ * from. Derived when the frame is listed, from the track store: the subject
25008
+ * box recorded on the source media row when there is one, else the track
25009
+ * position nearest the frame's capture time. Never stored as an annotation
25010
+ * until the operator confirms it.
25011
+ */
25012
+ var RetrainPipelineBoxSchema = zod.z.object({
25013
+ /** Normalised `[0,1]` against the full frame. */
25014
+ bbox: RetrainBboxSchema,
25015
+ macroClass: RetrainMacroClassSchema,
25016
+ label: zod.z.string().optional(),
25017
+ subLabel: zod.z.string().optional(),
25018
+ /** The detection score of the position used, when it was recorded. */
25019
+ score: zod.z.number().optional(),
25020
+ /** The root model that produced the track, when it was recorded. */
25021
+ modelId: zod.z.string().optional(),
25022
+ trackId: zod.z.string(),
25023
+ /** `subject-box`: recorded on this very frame. `position`: the track's
25024
+ * position nearest the capture time, `deltaMs` away. */
25025
+ basis: zod.z.enum(["subject-box", "position"]),
25026
+ deltaMs: zod.z.number()
25027
+ });
25028
+ /**
25029
+ * Where a retrain frame came from: a TRACK's stored media (copy-on-select),
25030
+ * or the RECORDING at an instant — the frame a model saw nothing in has no
25031
+ * track at all.
25032
+ */
25033
+ var RetrainFrameOriginSchema = zod.z.enum(["track", "recording"]);
24760
25034
  /** A frame the dataset OWNS: bytes copied at selection time. */
24761
25035
  var RetrainFrameSchema = zod.z.object({
24762
25036
  frameId: zod.z.string(),
24763
25037
  deviceId: zod.z.number(),
24764
- trackId: zod.z.string(),
24765
- /** Provenance only. It may already point at nothing — that is expected. */
24766
- sourceMediaId: zod.z.number().int(),
25038
+ origin: RetrainFrameOriginSchema,
25039
+ /** The track it was copied from. Absent on a recording still. */
25040
+ trackId: zod.z.string().optional(),
25041
+ /** Provenance only. It may already point at nothing — that is expected.
25042
+ * Absent on a recording still. */
25043
+ sourceMediaId: zod.z.number().int().optional(),
25044
+ /** A recording still: the playhead instant it was taken at. */
25045
+ epochMs: zod.z.number().optional(),
24767
25046
  sourceKind: MediaFileKindEnum,
24768
25047
  sizeBytes: zod.z.number().int(),
24769
25048
  width: zod.z.number().int(),
24770
25049
  height: zod.z.number().int(),
24771
- copiedAt: zod.z.number()
25050
+ copiedAt: zod.z.number(),
25051
+ /** When the CAMERA captured the frame. Absent on a copy taken before D785. */
25052
+ capturedAt: zod.z.number().optional(),
25053
+ /** The operator's "every subject in this frame is boxed". Detector
25054
+ * evaluation keeps only complete frames: an unboxed subject would count as
25055
+ * a false positive. */
25056
+ complete: zod.z.boolean(),
25057
+ /** The boxes the pipeline drew on this frame. Present on list answers;
25058
+ * empty when nothing the track store holds can be placed on it. */
25059
+ pipelineBoxes: zod.z.array(RetrainPipelineBoxSchema).readonly().optional(),
25060
+ /** The named collections this frame belongs to. Present on list answers. */
25061
+ collectionIds: zod.z.array(zod.z.string()).readonly().optional()
24772
25062
  });
24773
25063
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
24774
25064
  var RetrainCopyRefusalSchema = zod.z.enum([
@@ -24789,6 +25079,53 @@ var RetrainFrameListSchema = zod.z.object({
24789
25079
  /** What the page pre-selects — the native key frame when one survives. */
24790
25080
  autoPickMediaId: zod.z.number().int().optional()
24791
25081
  });
25082
+ /**
25083
+ * Which frames an annotated export carries. Every field narrows; an empty
25084
+ * filter is every annotated copy. A dataset VERSION is a frozen `frameIds`
25085
+ * list owned by whoever trains (the training orchestrator), so `frameIds` is
25086
+ * the primitive a version export uses; `batchId` re-selects what an earlier
25087
+ * export carried (`exportedInBatch`).
25088
+ */
25089
+ var RetrainExportFilterSchema = zod.z.object({
25090
+ deviceIds: zod.z.array(zod.z.number()).optional(),
25091
+ frameIds: zod.z.array(zod.z.string()).max(2e4).optional(),
25092
+ /** Only frames in at least one of these named collections. */
25093
+ collectionIds: zod.z.array(zod.z.string()).max(200).optional(),
25094
+ batchId: zod.z.string().optional(),
25095
+ /** Only frames the operator marked complete (all subjects boxed). */
25096
+ completeOnly: zod.z.boolean().optional()
25097
+ });
25098
+ /**
25099
+ * `frames`: the full frame copies, boxes in `annotations.json`.
25100
+ * `crops`: additionally one JPEG per subject, cut with the runtime detail-crop
25101
+ * convention — the classifier layout.
25102
+ */
25103
+ var RetrainExportLayoutSchema = zod.z.enum(["frames", "crops"]);
25104
+ /**
25105
+ * Where `writeRetrainArchive` streams the tar: one HTTP request whose body is
25106
+ * the archive, sent chunk by chunk. Covers a presigned PUT and a provider
25107
+ * addon's data-plane upload route alike. Headers are sent verbatim and never
25108
+ * logged.
25109
+ */
25110
+ var RetrainArchiveTargetSchema = zod.z.object({
25111
+ kind: zod.z.literal("http"),
25112
+ method: zod.z.enum(["PUT", "POST"]),
25113
+ url: zod.z.string().url(),
25114
+ headers: zod.z.record(zod.z.string(), zod.z.string()).optional()
25115
+ });
25116
+ var RetrainArchiveResultSchema = zod.z.object({
25117
+ batchId: zod.z.string(),
25118
+ frames: zod.z.number().int(),
25119
+ crops: zod.z.number().int(),
25120
+ annotations: zod.z.number().int(),
25121
+ /** Frames planned but not shipped (unreadable copy, path too long). */
25122
+ missing: zod.z.number().int(),
25123
+ bytes: zod.z.number().int(),
25124
+ /** sha256 of the exact bytes sent. */
25125
+ sha256: zod.z.string(),
25126
+ /** The target's HTTP status. */
25127
+ status: zod.z.number().int()
25128
+ });
24792
25129
  /** What the operator asked the assist to look for. */
24793
25130
  var RetrainAssistSubjectSchema = zod.z.discriminatedUnion("kind", [zod.z.object({
24794
25131
  kind: zod.z.literal("package"),
@@ -24818,6 +25155,109 @@ var RetrainAssistResultSchema = zod.z.discriminatedUnion("kind", [zod.z.object({
24818
25155
  reason: zod.z.string(),
24819
25156
  detail: zod.z.string().optional()
24820
25157
  })]);
25158
+ /** A named set over the retrain corpus — membership only, it owns no pixels. */
25159
+ var RetrainCollectionSchema = zod.z.object({
25160
+ id: zod.z.string(),
25161
+ name: zod.z.string(),
25162
+ createdAt: zod.z.number(),
25163
+ frameCount: zod.z.number().int()
25164
+ });
25165
+ var RetrainCollectionCreateResultSchema = zod.z.discriminatedUnion("kind", [zod.z.object({
25166
+ kind: zod.z.literal("created"),
25167
+ collection: RetrainCollectionSchema
25168
+ }), zod.z.object({
25169
+ kind: zod.z.literal("refused"),
25170
+ reason: zod.z.enum(["empty-name", "duplicate-name"])
25171
+ })]);
25172
+ var RetrainCollectionRenameResultSchema = zod.z.discriminatedUnion("kind", [zod.z.object({
25173
+ kind: zod.z.literal("renamed"),
25174
+ collection: RetrainCollectionSchema
25175
+ }), zod.z.object({
25176
+ kind: zod.z.literal("refused"),
25177
+ reason: zod.z.enum([
25178
+ "empty-name",
25179
+ "duplicate-name",
25180
+ "unknown-collection"
25181
+ ])
25182
+ })]);
25183
+ /**
25184
+ * The outcome of adding the frame at a recording instant. Every refusal is
25185
+ * named: `still-unavailable` (not recording, a gap, or an undecodable frame —
25186
+ * `detail` says which), `still-busy` (the recorder is at its decode bound; try
25187
+ * again), `unreadable-image`, `write-failed`, `unknown-collection`.
25188
+ */
25189
+ var AddRetrainFrameFromRecordingResultSchema = zod.z.discriminatedUnion("kind", [zod.z.object({
25190
+ kind: zod.z.literal("added"),
25191
+ collectionId: zod.z.string(),
25192
+ frame: RetrainFrameSchema,
25193
+ /** The moment was already in the dataset; nothing was decoded. */
25194
+ reused: zod.z.boolean()
25195
+ }), zod.z.object({
25196
+ kind: zod.z.literal("refused"),
25197
+ reason: zod.z.enum([
25198
+ "unknown-collection",
25199
+ "still-unavailable",
25200
+ "still-busy",
25201
+ "unreadable-image",
25202
+ "write-failed"
25203
+ ]),
25204
+ detail: zod.z.string().optional()
25205
+ })]);
25206
+ /** A vision LLM profile the AI assist may use, and where it sends the frame. */
25207
+ var RetrainAssistProfileSchema = zod.z.object({
25208
+ id: zod.z.string(),
25209
+ name: zod.z.string(),
25210
+ model: zod.z.string(),
25211
+ kind: zod.z.string(),
25212
+ /** `true` when the frame would leave the house (a cloud vendor, or an
25213
+ * endpoint that is not on the local network). The page confirms each such
25214
+ * run, and the provider refuses one without `allowCloud`. */
25215
+ leavesHouse: zod.z.boolean()
25216
+ });
25217
+ /** A box the AI assist proposed: a draft, plus the model's own reason. */
25218
+ var RetrainLlmProposalSchema = RetrainAnnotationDraftSchema.extend({ reason: zod.z.string() });
25219
+ /** What the AI assist said about a box that was already on the canvas. */
25220
+ var RetrainLlmReviewSchema = zod.z.object({
25221
+ /** The `ref` the page sent the box under. */
25222
+ ref: zod.z.string(),
25223
+ verdict: zod.z.enum([
25224
+ "confirmed",
25225
+ "wrong-class",
25226
+ "not-an-object",
25227
+ "uncertain"
25228
+ ]),
25229
+ suggestedClass: RetrainMacroClassSchema.optional(),
25230
+ reason: zod.z.string()
25231
+ });
25232
+ /**
25233
+ * The AI assist's answer. `proposed` carries drafts (`source: 'llm'`, the
25234
+ * model and its confidence) and reviews; items the model got wrong (a box off
25235
+ * the frame, an unasked class, an unknown ref) are dropped and counted in
25236
+ * `rejected`. A whole answer that is not the schema is `malformed-answer`.
25237
+ */
25238
+ var RetrainLlmAssistResultSchema = zod.z.discriminatedUnion("kind", [zod.z.object({
25239
+ kind: zod.z.literal("proposed"),
25240
+ profileId: zod.z.string(),
25241
+ model: zod.z.string(),
25242
+ /** The frame was sent outside the house for this answer. */
25243
+ leftHouse: zod.z.boolean(),
25244
+ proposals: zod.z.array(RetrainLlmProposalSchema).readonly(),
25245
+ reviews: zod.z.array(RetrainLlmReviewSchema).readonly(),
25246
+ rejected: zod.z.number().int()
25247
+ }), zod.z.object({
25248
+ kind: zod.z.literal("refused"),
25249
+ reason: zod.z.enum([
25250
+ "unknown-frame",
25251
+ "unreadable-frame",
25252
+ "unknown-profile",
25253
+ "profile-disabled",
25254
+ "no-vision",
25255
+ "cloud-not-confirmed",
25256
+ "llm-error",
25257
+ "malformed-answer"
25258
+ ]),
25259
+ detail: zod.z.string().optional()
25260
+ })]);
24821
25261
  /** The outcome of a lifecycle move owned by the retrain page. */
24822
25262
  var RetrainTransitionResultSchema = zod.z.object({
24823
25263
  trackId: zod.z.string(),
@@ -26053,7 +26493,7 @@ var pipelineAnalyticsCapability = {
26053
26493
  * a frame leaves the dataset before export. */
26054
26494
  deselectRetrainFrame: require_sleep.method(zod.z.object({
26055
26495
  deviceId: zod.z.number(),
26056
- trackId: zod.z.string(),
26496
+ trackId: zod.z.string().optional(),
26057
26497
  frameId: zod.z.string()
26058
26498
  }), zod.z.object({
26059
26499
  removed: zod.z.boolean(),
@@ -26096,7 +26536,8 @@ var pipelineAnalyticsCapability = {
26096
26536
  */
26097
26537
  proposeRetrainAnnotations: require_sleep.method(zod.z.object({
26098
26538
  deviceId: zod.z.number(),
26099
- trackId: zod.z.string(),
26539
+ /** The frame's track, when it has one — checked against the frame. */
26540
+ trackId: zod.z.string().optional(),
26100
26541
  frameId: zod.z.string(),
26101
26542
  subject: RetrainAssistSubjectSchema,
26102
26543
  /** Which node runs it. Absent ⇒ wherever an unowned call lands. */
@@ -26105,8 +26546,12 @@ var pipelineAnalyticsCapability = {
26105
26546
  kind: "mutation",
26106
26547
  auth: "admin"
26107
26548
  }),
26108
- /** Every annotation on a track, oldest first. */
26109
- listRetrainAnnotations: require_sleep.method(zod.z.object({ trackId: zod.z.string() }), zod.z.array(RetrainAnnotationSchema).readonly(), {
26549
+ /** Every annotation on a track, or on named frames (a recording still has
26550
+ * no track), oldest first. One of the two is required. */
26551
+ listRetrainAnnotations: require_sleep.method(zod.z.object({
26552
+ trackId: zod.z.string().optional(),
26553
+ frameIds: zod.z.array(zod.z.string()).max(2e3).optional()
26554
+ }), zod.z.array(RetrainAnnotationSchema).readonly(), {
26110
26555
  kind: "query",
26111
26556
  auth: "admin"
26112
26557
  }),
@@ -26125,7 +26570,8 @@ var pipelineAnalyticsCapability = {
26125
26570
  */
26126
26571
  saveRetrainAnnotations: require_sleep.method(zod.z.object({
26127
26572
  deviceId: zod.z.number(),
26128
- trackId: zod.z.string(),
26573
+ /** The frame's track, when it has one — checked against the frame. */
26574
+ trackId: zod.z.string().optional(),
26129
26575
  frameId: zod.z.string(),
26130
26576
  annotations: zod.z.array(RetrainAnnotationDraftSchema)
26131
26577
  }), zod.z.array(RetrainAnnotationSchema).readonly(), {
@@ -26177,7 +26623,146 @@ var pipelineAnalyticsCapability = {
26177
26623
  * out, so two crops of the same subject can never end up in one feature
26178
26624
  * space (D52).
26179
26625
  */
26180
- getRetrainExportUrl: require_sleep.method(zod.z.object({ deviceIds: zod.z.array(zod.z.number()).optional() }), zod.z.object({ url: zod.z.string() }), {
26626
+ getRetrainExportUrl: require_sleep.method(RetrainExportFilterSchema.extend({ layout: RetrainExportLayoutSchema.optional() }), zod.z.object({ url: zod.z.string() }), {
26627
+ kind: "query",
26628
+ auth: "admin"
26629
+ }),
26630
+ /**
26631
+ * The operator's "every subject in this frame is boxed" — set and cleared
26632
+ * by hand, never derived: a frame with no box may be a complete hard
26633
+ * negative, and a frame with three boxes may still miss a fourth person.
26634
+ */
26635
+ setRetrainFrameComplete: require_sleep.method(zod.z.object({
26636
+ deviceId: zod.z.number(),
26637
+ trackId: zod.z.string().optional(),
26638
+ frameId: zod.z.string(),
26639
+ complete: zod.z.boolean()
26640
+ }), RetrainFrameSchema, {
26641
+ kind: "mutation",
26642
+ auth: "admin"
26643
+ }),
26644
+ /**
26645
+ * Stream the annotated archive to a TARGET instead of a browser — the
26646
+ * same tar `getRetrainExportUrl` serves (manifest first, one JPEG in
26647
+ * memory at a time, paced), written chunk by chunk into one HTTP request.
26648
+ * The bytes never cross this cap and never land on the hub's disk; the
26649
+ * answer is what was sent, with its sha256.
26650
+ */
26651
+ writeRetrainArchive: require_sleep.method(zod.z.object({
26652
+ filter: RetrainExportFilterSchema,
26653
+ layout: RetrainExportLayoutSchema,
26654
+ target: RetrainArchiveTargetSchema
26655
+ }), RetrainArchiveResultSchema, {
26656
+ kind: "mutation",
26657
+ auth: "admin",
26658
+ timeoutMs: 60 * 6e4
26659
+ }),
26660
+ /** The enabled, vision-capable LLM profiles, each saying whether a frame
26661
+ * sent to it leaves the house. */
26662
+ listRetrainAssistProfiles: require_sleep.method(zod.z.object({}), zod.z.array(RetrainAssistProfileSchema).readonly(), {
26663
+ kind: "query",
26664
+ auth: "admin"
26665
+ }),
26666
+ /**
26667
+ * Ask a vision LLM (the `llm` capability) about ONE copied frame: list the
26668
+ * objects of `classes` with boxes, and review the boxes already on the
26669
+ * canvas (sent by `ref`). Answers drafts (`source: 'llm'`) and reviews —
26670
+ * nothing is stored, nothing is accepted. A profile that sends the frame
26671
+ * outside the house is refused unless `allowCloud` says the operator
26672
+ * confirmed this run.
26673
+ */
26674
+ proposeRetrainAnnotationsWithLlm: require_sleep.method(zod.z.object({
26675
+ deviceId: zod.z.number(),
26676
+ trackId: zod.z.string().optional(),
26677
+ frameId: zod.z.string(),
26678
+ profileId: zod.z.string(),
26679
+ classes: zod.z.array(RetrainMacroClassSchema).min(1),
26680
+ boxes: zod.z.array(zod.z.object({
26681
+ ref: zod.z.string(),
26682
+ bbox: RetrainBboxSchema,
26683
+ macroClass: RetrainMacroClassSchema,
26684
+ label: zod.z.string().optional()
26685
+ })).max(50),
26686
+ allowCloud: zod.z.boolean()
26687
+ }), RetrainLlmAssistResultSchema, {
26688
+ kind: "mutation",
26689
+ auth: "admin",
26690
+ timeoutMs: 18e4
26691
+ }),
26692
+ /**
26693
+ * Create a named collection — a set over the retrain corpus ("packages
26694
+ * porch night"). Names are unique case-insensitively and never empty;
26695
+ * both refusals are named.
26696
+ */
26697
+ createRetrainCollection: require_sleep.method(zod.z.object({ name: zod.z.string().max(120) }), RetrainCollectionCreateResultSchema, {
26698
+ kind: "mutation",
26699
+ auth: "admin"
26700
+ }),
26701
+ /** Every collection, newest first, with its frame count. */
26702
+ listRetrainCollections: require_sleep.method(zod.z.object({}), zod.z.array(RetrainCollectionSchema).readonly(), {
26703
+ kind: "query",
26704
+ auth: "admin"
26705
+ }),
26706
+ renameRetrainCollection: require_sleep.method(zod.z.object({
26707
+ id: zod.z.string(),
26708
+ name: zod.z.string().max(120)
26709
+ }), RetrainCollectionRenameResultSchema, {
26710
+ kind: "mutation",
26711
+ auth: "admin"
26712
+ }),
26713
+ /**
26714
+ * Delete a collection. Its recording stills that no other collection
26715
+ * holds are deleted with their annotations (nothing else reaches them);
26716
+ * frames copied from tracks always stay in the dataset.
26717
+ */
26718
+ deleteRetrainCollection: require_sleep.method(zod.z.object({ id: zod.z.string() }), zod.z.object({
26719
+ deleted: zod.z.boolean(),
26720
+ removedFrames: zod.z.number().int()
26721
+ }), {
26722
+ kind: "mutation",
26723
+ auth: "admin"
26724
+ }),
26725
+ /**
26726
+ * Add the frame at a recording instant to a collection — the frame the
26727
+ * model may have seen NOTHING in. The recorder re-decodes the native
26728
+ * frame at `epochMs`; the dataset copies it (trackless, durable). The same
26729
+ * moment twice is one copy. Every refusal is named.
26730
+ */
26731
+ addRetrainFrameFromRecording: require_sleep.method(zod.z.object({
26732
+ collectionId: zod.z.string(),
26733
+ deviceId: zod.z.number(),
26734
+ epochMs: zod.z.number()
26735
+ }), AddRetrainFrameFromRecordingResultSchema, {
26736
+ kind: "mutation",
26737
+ auth: "admin",
26738
+ timeoutMs: 6e4
26739
+ }),
26740
+ /** Add frames already in the dataset to a collection. */
26741
+ addRetrainFramesToCollection: require_sleep.method(zod.z.object({
26742
+ collectionId: zod.z.string(),
26743
+ frameIds: zod.z.array(zod.z.string()).min(1).max(500)
26744
+ }), zod.z.object({
26745
+ added: zod.z.number().int(),
26746
+ alreadyMember: zod.z.number().int(),
26747
+ unknownFrameIds: zod.z.array(zod.z.string()).readonly()
26748
+ }), {
26749
+ kind: "mutation",
26750
+ auth: "admin"
26751
+ }),
26752
+ /** Remove a frame from a collection. A recording still left in no
26753
+ * collection is deleted with its annotations (`deletedFrame`). */
26754
+ removeRetrainFrameFromCollection: require_sleep.method(zod.z.object({
26755
+ collectionId: zod.z.string(),
26756
+ frameId: zod.z.string()
26757
+ }), zod.z.object({
26758
+ removed: zod.z.boolean(),
26759
+ deletedFrame: zod.z.boolean()
26760
+ }), {
26761
+ kind: "mutation",
26762
+ auth: "admin"
26763
+ }),
26764
+ /** The frames of a collection, with their pipeline boxes. */
26765
+ listRetrainCollectionFrames: require_sleep.method(zod.z.object({ collectionId: zod.z.string() }), zod.z.array(RetrainFrameSchema).readonly(), {
26181
26766
  kind: "query",
26182
26767
  auth: "admin"
26183
26768
  }),
@@ -27127,13 +27712,31 @@ var RecommendationReasonSchema = zod.z.discriminatedUnion("kind", [
27127
27712
  zod.z.object({
27128
27713
  kind: zod.z.literal("no-family-build"),
27129
27714
  format: ModelFormatSchema$1
27715
+ }),
27716
+ zod.z.object({
27717
+ kind: zod.z.literal("kept-custom-pin"),
27718
+ modelId: zod.z.string(),
27719
+ deviceKey: zod.z.string()
27130
27720
  })
27131
27721
  ]);
27722
+ /** Why a device is left exactly as it is, whatever the plan would pick (D786). */
27723
+ var KeptReasonSchema = zod.z.enum(["custom-pin"]);
27724
+ /**
27725
+ * Where a choice's latency came from (D791): this node's own benchmark
27726
+ * result, or the hardware-class table. Measured on the node beats the table.
27727
+ */
27728
+ var LatencySourceSchema = zod.z.discriminatedUnion("kind", [zod.z.object({ kind: zod.z.literal("table") }), zod.z.object({
27729
+ kind: zod.z.literal("node-benchmark"),
27730
+ resultId: zod.z.string(),
27731
+ measuredAtMs: zod.z.number()
27732
+ })]);
27132
27733
  var DeviceModelChoiceSchema = zod.z.object({
27133
27734
  modelId: zod.z.string(),
27134
27735
  p50Ms: zod.z.number(),
27135
27736
  fps: zod.z.number(),
27136
27737
  measured: zod.z.boolean(),
27738
+ /** Absent on a plan from before D791 — read as the table. */
27739
+ source: LatencySourceSchema.optional(),
27137
27740
  /** Parallel sessions at the camera rate with the headroom kept free: ⌊fps × (1 − headroom) / camera fps⌋. */
27138
27741
  capacitySessions: zod.z.number(),
27139
27742
  personRecall: zod.z.number()
@@ -27144,6 +27747,8 @@ var DeviceRecommendationSchema = zod.z.object({
27144
27747
  enabled: zod.z.boolean(),
27145
27748
  available: zod.z.boolean(),
27146
27749
  chosen: DeviceModelChoiceSchema.nullable(),
27750
+ /** Present when the device is kept as is: Apply writes nothing on it. */
27751
+ kept: KeptReasonSchema.optional(),
27147
27752
  reasons: zod.z.array(RecommendationReasonSchema).readonly()
27148
27753
  });
27149
27754
  var NodeRecommendationSchema = zod.z.object({
@@ -27197,6 +27802,17 @@ var AutoTuneWarningSchema = zod.z.discriminatedUnion("kind", [
27197
27802
  kind: zod.z.literal("coral-enabled"),
27198
27803
  nodeId: zod.z.string(),
27199
27804
  deviceKey: zod.z.string()
27805
+ }),
27806
+ zod.z.object({
27807
+ kind: zod.z.literal("custom-pin-kept"),
27808
+ nodeId: zod.z.string(),
27809
+ deviceKey: zod.z.string().nullable(),
27810
+ deviceId: zod.z.number().nullable(),
27811
+ modelId: zod.z.string()
27812
+ }),
27813
+ zod.z.object({
27814
+ kind: zod.z.literal("custom-registry-unreadable"),
27815
+ error: zod.z.string()
27200
27816
  })
27201
27817
  ]);
27202
27818
  var AutoTuneOptionsSchema = zod.z.object({
@@ -27389,13 +28005,14 @@ var SuggestSharesResultSchema = zod.z.object({
27389
28005
  nodes: zod.z.array(SuggestedNodeShareSchema).readonly()
27390
28006
  });
27391
28007
  /**
27392
- * Where the node and device shares come from (D750, D755).
27393
- * - `hardware` (default) — computed by the system from each node's static
27394
- * capacity (its accelerators at their Auto tune models, from the measured
27395
- * latency table), recomputed whenever a node or device joins, leaves, is
27396
- * switched on or off, or changes model. No load input.
27397
- * - `benchmark` — the same, from each node's measured capacity (node
27398
- * benchmark results); a node without results falls back to `hardware`.
28008
+ * Where the node and device shares come from (D750, D755, D791).
28009
+ * - `benchmark` (default since D791) — each node's capacity as its own node
28010
+ * benchmark measured it; a node without fresh results is sized from
28011
+ * `hardware` and says so. Measured on the node beats the table.
28012
+ * - `hardware` — computed from each node's static capacity only (its
28013
+ * accelerators at their Auto tune models, from the latency table).
28014
+ * Both are recomputed whenever a node or device joins, leaves, is switched
28015
+ * on or off, changes model, or a benchmark result is written. No load input.
27399
28016
  * - `manual` — the operator's stored sliders.
27400
28017
  * Either way a node or device that cannot take sessions gives its share to
27401
28018
  * the others in proportion; the stored values are never rewritten for that.
@@ -27405,7 +28022,7 @@ var ShareSourceSchema = zod.z.enum([
27405
28022
  "benchmark",
27406
28023
  "manual"
27407
28024
  ]);
27408
- var DEFAULT_SHARE_SOURCE = "hardware";
28025
+ var DEFAULT_SHARE_SOURCE = "benchmark";
27409
28026
  /** `hardware` or `benchmark`: the system computes the shares. */
27410
28027
  function isAutomaticShareSource(source) {
27411
28028
  return source !== "manual";
@@ -27419,6 +28036,7 @@ var SHARE_SOURCE_SETTING_KEY = "shareSource";
27419
28036
  * D755 split it) reads as `hardware` — that is what it computed.
27420
28037
  */
27421
28038
  function parseShareSource(value) {
28039
+ if (value === "auto") return "hardware";
27422
28040
  const parsed = ShareSourceSchema.safeParse(value);
27423
28041
  return parsed.success ? parsed.data : DEFAULT_SHARE_SOURCE;
27424
28042
  }
@@ -27463,6 +28081,371 @@ var EffectiveSharesSchema = zod.z.object({
27463
28081
  deviceWeights: zod.z.record(zod.z.string(), zod.z.record(zod.z.string(), zod.z.number()))
27464
28082
  });
27465
28083
  //#endregion
28084
+ //#region src/pipeline/node-benchmark/schemas.ts
28085
+ /**
28086
+ * Wire shapes of the node benchmark (D791): the operator's plan, the
28087
+ * preflight the confirmation shows, the run the orchestrator owns, what the
28088
+ * measuring runner reports, and the result rows Auto tune and the automatic
28089
+ * shares read.
28090
+ *
28091
+ * ONE node at a time, owned by the pipeline orchestrator. While a run is
28092
+ * active the cluster is in BENCHMARK MODE for that node: it is not a
28093
+ * detection candidate, camera pins naming it are ignored so its sessions move
28094
+ * elsewhere, and both come back when the mode ends — after a crash or a hub
28095
+ * restart too (a persisted manifest, reconciled against the registry).
28096
+ *
28097
+ * Two measurements, both on the node, driven by its own runner (frames never
28098
+ * cross a process at frame rate, D9):
28099
+ * - `device` — one accelerator × one candidate detector, root only, open
28100
+ * loop: how many streams at the camera rate it carries inside the frame
28101
+ * interval;
28102
+ * - `pipeline` — the chosen detector plus the operator's detail steps
28103
+ * (faces, plates, classifiers, CLIP…), on varied frames from the bench
28104
+ * clip: how many parallel sessions the node carries before latency, drops,
28105
+ * CPU, RAM or the event loop give out.
28106
+ */
28107
+ /** Defaults and bounds, one place. */
28108
+ var NODE_BENCHMARK_DEFAULTS = {
28109
+ fpsPerStream: 10,
28110
+ budgetMinutes: 45,
28111
+ minBudgetMinutes: 10,
28112
+ maxBudgetMinutes: 120,
28113
+ /** A result older than this no longer beats the table. */
28114
+ staleAfterDays: 30,
28115
+ /** Warm-in per ramp step (not accounted). */
28116
+ settleSec: 5,
28117
+ /** Accounted window per ramp step. */
28118
+ measureSec: 20,
28119
+ /** Longest the drain may take before the run is refused. */
28120
+ drainTimeoutSec: 120,
28121
+ /** Candidate models per device in one run. */
28122
+ maxModelsPerDevice: 6
28123
+ };
28124
+ /** The two measurements a run can make. */
28125
+ var NodeBenchmarkPhaseSchema = zod.z.enum(["device", "pipeline"]);
28126
+ var NodeBenchmarkDevicePlanSchema = zod.z.object({
28127
+ /** `<backend>:<device>` — `openvino:npu`, `coreml:all`, `cpu`. */
28128
+ deviceKey: zod.z.string().min(1),
28129
+ /**
28130
+ * Root detector candidates for the `device` measurement, in the order
28131
+ * measured. The FIRST is the one the `pipeline` measurement runs.
28132
+ */
28133
+ modelIds: zod.z.array(zod.z.string().min(1)).min(1).max(NODE_BENCHMARK_DEFAULTS.maxModelsPerDevice)
28134
+ });
28135
+ /** What the operator confirmed. */
28136
+ var NodeBenchmarkPlanSchema = zod.z.object({
28137
+ nodeId: zod.z.string().min(1),
28138
+ devices: zod.z.array(NodeBenchmarkDevicePlanSchema).min(1),
28139
+ /** Which measurements run. At least one. */
28140
+ phases: zod.z.array(NodeBenchmarkPhaseSchema).min(1).default(["device", "pipeline"]),
28141
+ /**
28142
+ * Detail steps (catalog step ids under the root: faces, plates,
28143
+ * classifiers, CLIP…) the `pipeline` measurement enables. The root
28144
+ * detector always runs.
28145
+ */
28146
+ steps: zod.z.array(zod.z.string().min(1)).default([]),
28147
+ /** Offered rate of one stream / session. */
28148
+ fpsPerStream: zod.z.number().int().min(1).max(30).default(NODE_BENCHMARK_DEFAULTS.fpsPerStream),
28149
+ /** Hard deadline: the mode ends and the cluster is restored when it passes. */
28150
+ budgetMinutes: zod.z.number().int().min(NODE_BENCHMARK_DEFAULTS.minBudgetMinutes).max(NODE_BENCHMARK_DEFAULTS.maxBudgetMinutes).default(NODE_BENCHMARK_DEFAULTS.budgetMinutes),
28151
+ /** Keep the models the run downloaded (default: delete what was not installed before). */
28152
+ keepDownloadedModels: zod.z.boolean().default(false),
28153
+ /** Start although the other nodes' capacity does not cover the sessions running now. */
28154
+ acceptInsufficientHeadroom: zod.z.boolean().default(false)
28155
+ });
28156
+ /** Why a run cannot start. `overridable` ones are lifted by a plan flag. */
28157
+ var NodeBenchmarkRefusalKindSchema = zod.z.enum([
28158
+ "benchmark-active",
28159
+ "node-offline",
28160
+ "unknown-device",
28161
+ "no-phase",
28162
+ "insufficient-headroom"
28163
+ ]);
28164
+ var NodeBenchmarkRefusalSchema = zod.z.object({
28165
+ kind: NodeBenchmarkRefusalKindSchema,
28166
+ detail: zod.z.string(),
28167
+ overridable: zod.z.boolean()
28168
+ });
28169
+ /** A camera whose detection leaves the node for the run. */
28170
+ var NodeBenchmarkMovingCameraSchema = zod.z.object({
28171
+ deviceId: zod.z.number(),
28172
+ /** Placed on the node now (a standing attach or a running session). */
28173
+ placedOnNode: zod.z.boolean(),
28174
+ /** A node pin naming this node, ignored for the run. */
28175
+ pinnedToNode: zod.z.boolean()
28176
+ });
28177
+ /** A camera that cannot leave: no other node can obtain its frames. */
28178
+ var NodeBenchmarkStayingCameraSchema = zod.z.object({
28179
+ deviceId: zod.z.number(),
28180
+ reason: zod.z.literal("only-frame-source")
28181
+ });
28182
+ var NodeBenchmarkPreflightSchema = zod.z.object({
28183
+ nodeId: zod.z.string(),
28184
+ online: zod.z.boolean(),
28185
+ moving: zod.z.array(NodeBenchmarkMovingCameraSchema).readonly(),
28186
+ /** Keep running on the node during the run; the result is flagged contaminated. */
28187
+ staying: zod.z.array(NodeBenchmarkStayingCameraSchema).readonly(),
28188
+ estimatedDurationMs: zod.z.number(),
28189
+ /** The run ends and the cluster is restored at the latest after this long. */
28190
+ budgetMs: zod.z.number(),
28191
+ phases: zod.z.array(NodeBenchmarkPhaseSchema).readonly(),
28192
+ steps: zod.z.array(zod.z.string()).readonly(),
28193
+ devices: zod.z.array(NodeBenchmarkDevicePlanSchema).readonly(),
28194
+ /** Parallel sessions the cluster runs now, and what the other nodes can carry. */
28195
+ headroom: zod.z.object({
28196
+ sessionsNow: zod.z.number(),
28197
+ otherNodesCapacitySessions: zod.z.number().nullable()
28198
+ }),
28199
+ refusals: zod.z.array(NodeBenchmarkRefusalSchema).readonly(),
28200
+ canStart: zod.z.boolean()
28201
+ });
28202
+ /** Where the measuring runner is. */
28203
+ var NodeBenchProgressSchema = zod.z.object({
28204
+ phase: zod.z.enum([
28205
+ "preparing",
28206
+ "device",
28207
+ "pipeline",
28208
+ "cleanup"
28209
+ ]),
28210
+ deviceKey: zod.z.string().nullable(),
28211
+ modelId: zod.z.string().nullable(),
28212
+ /** Streams (device) or sessions (pipeline) of the step running now. */
28213
+ load: zod.z.number().nullable(),
28214
+ cellsDone: zod.z.number(),
28215
+ cellsTotal: zod.z.number(),
28216
+ message: zod.z.string()
28217
+ });
28218
+ /** What limited a ramp. `none` = the ramp ran out of steps still passing. */
28219
+ var NodeBenchLimitSchema = zod.z.enum([
28220
+ "p95",
28221
+ "drops",
28222
+ "errors",
28223
+ "stall",
28224
+ "cpu",
28225
+ "ram",
28226
+ "none"
28227
+ ]);
28228
+ var NodeBenchRampStepSchema = zod.z.object({
28229
+ load: zod.z.number(),
28230
+ pass: zod.z.boolean(),
28231
+ p95Ms: zod.z.number(),
28232
+ dropRatio: zod.z.number(),
28233
+ /** Completed frames per second over the accounted window. */
28234
+ fps: zod.z.number(),
28235
+ cpuPct: zod.z.number().nullable(),
28236
+ ramFreePct: zod.z.number().nullable(),
28237
+ failReasons: zod.z.array(zod.z.string()).readonly()
28238
+ });
28239
+ /** One measured device × detector (the `device` measurement). */
28240
+ var NodeBenchDeviceCellSchema = zod.z.object({
28241
+ phase: zod.z.literal("device"),
28242
+ deviceKey: zod.z.string(),
28243
+ modelId: zod.z.string(),
28244
+ /** Single-stream latency (the K = 1 step). */
28245
+ p50Ms: zod.z.number(),
28246
+ p95Ms: zod.z.number(),
28247
+ p99Ms: zod.z.number(),
28248
+ /** Frames per second sustained at the last passing step. */
28249
+ fps: zod.z.number(),
28250
+ /** Streams at the camera rate the device carried inside the frame interval; 0 = not even one. */
28251
+ kMax: zod.z.number(),
28252
+ limitedBy: NodeBenchLimitSchema,
28253
+ /** First call (model load + warm-up). */
28254
+ warmupMs: zod.z.number(),
28255
+ ramp: zod.z.array(NodeBenchRampStepSchema).readonly()
28256
+ });
28257
+ /** One measured pipeline (the `pipeline` measurement) on a device. */
28258
+ var NodeBenchPipelineCellSchema = zod.z.object({
28259
+ phase: zod.z.literal("pipeline"),
28260
+ deviceKey: zod.z.string(),
28261
+ modelId: zod.z.string(),
28262
+ steps: zod.z.array(zod.z.string()).readonly(),
28263
+ /** Parallel sessions at the camera rate the node carried; 0 = not even one. */
28264
+ maxSessions: zod.z.number(),
28265
+ limitedBy: NodeBenchLimitSchema,
28266
+ /** Detail steps that produced at least one result on the clip — a step that never fired measured nothing. */
28267
+ stepsFired: zod.z.array(zod.z.string()).readonly(),
28268
+ warmupMs: zod.z.number(),
28269
+ ramp: zod.z.array(NodeBenchRampStepSchema).readonly()
28270
+ });
28271
+ var NodeBenchCellSchema = zod.z.discriminatedUnion("phase", [NodeBenchDeviceCellSchema, NodeBenchPipelineCellSchema]);
28272
+ /**
28273
+ * What a result was measured ON. A result whose fingerprint no longer matches
28274
+ * the node no longer beats the table.
28275
+ */
28276
+ var NodeBenchFingerprintSchema = zod.z.object({
28277
+ pipelineVersion: zod.z.string().nullable(),
28278
+ cpuModel: zod.z.string().nullable(),
28279
+ ramGb: zod.z.number().nullable(),
28280
+ os: zod.z.string().nullable(),
28281
+ /** Per device: the pool the cells ran on (runtime + tuning). */
28282
+ pools: zod.z.record(zod.z.string(), zod.z.object({
28283
+ runtime: zod.z.string(),
28284
+ numWorkers: zod.z.number(),
28285
+ concurrency: zod.z.number(),
28286
+ batchMode: zod.z.string()
28287
+ })).default({})
28288
+ });
28289
+ /** The frames the run used. */
28290
+ var NodeBenchClipSchema = zod.z.object({
28291
+ /** `camstack-bench-v1` or `reference-images` (the fallback when the clip is not reachable). */
28292
+ id: zod.z.string(),
28293
+ revision: zod.z.string().nullable(),
28294
+ frames: zod.z.number(),
28295
+ width: zod.z.number(),
28296
+ height: zod.z.number()
28297
+ });
28298
+ var NodeBenchRunnerInputSchema = zod.z.object({
28299
+ runId: zod.z.string().min(1),
28300
+ devices: zod.z.array(NodeBenchmarkDevicePlanSchema).min(1),
28301
+ phases: zod.z.array(NodeBenchmarkPhaseSchema).min(1),
28302
+ /** The full detail step tree root for the `pipeline` measurement is built on the node from these ids. */
28303
+ steps: zod.z.array(zod.z.string()).default([]),
28304
+ fpsPerStream: zod.z.number().int().min(1).max(30),
28305
+ /** The runner stops on its own past this instant, whatever the hub does. */
28306
+ deadlineAtMs: zod.z.number(),
28307
+ settleSec: zod.z.number().min(0).max(60).default(NODE_BENCHMARK_DEFAULTS.settleSec),
28308
+ measureSec: zod.z.number().min(2).max(300).default(NODE_BENCHMARK_DEFAULTS.measureSec),
28309
+ keepDownloadedModels: zod.z.boolean().default(false)
28310
+ });
28311
+ var NodeBenchRunnerStateSchema = zod.z.enum([
28312
+ "running",
28313
+ "done",
28314
+ "failed",
28315
+ "aborted"
28316
+ ]);
28317
+ var NodeBenchRunnerStatusSchema = zod.z.object({
28318
+ runId: zod.z.string(),
28319
+ nodeId: zod.z.string(),
28320
+ state: NodeBenchRunnerStateSchema,
28321
+ progress: NodeBenchProgressSchema.nullable(),
28322
+ /** Every finished cell so far — a run stopped half way keeps what it measured. */
28323
+ cells: zod.z.array(NodeBenchCellSchema).readonly(),
28324
+ fingerprint: NodeBenchFingerprintSchema.nullable(),
28325
+ clip: NodeBenchClipSchema.nullable(),
28326
+ /** Cameras seen running on the node during the run (they share its pools). */
28327
+ activeCameraIds: zod.z.array(zod.z.number()).readonly(),
28328
+ /** Models the run downloaded and then deleted (not installed before). */
28329
+ deletedModels: zod.z.array(zod.z.string()).readonly(),
28330
+ error: zod.z.string().nullable(),
28331
+ startedAtMs: zod.z.number(),
28332
+ finishedAtMs: zod.z.number().nullable()
28333
+ });
28334
+ var NodeBenchmarkStateSchema = zod.z.enum([
28335
+ "draining",
28336
+ "measuring",
28337
+ "restoring",
28338
+ "done",
28339
+ "failed",
28340
+ "aborted"
28341
+ ]);
28342
+ /** Why a run ended. */
28343
+ var NodeBenchmarkEndReasonSchema = zod.z.enum([
28344
+ "completed",
28345
+ "operator-abort",
28346
+ "deadline",
28347
+ "node-lost",
28348
+ "runner-lost",
28349
+ "hub-restart",
28350
+ "drain-timeout",
28351
+ "failed"
28352
+ ]);
28353
+ var NodeBenchmarkRunSchema = zod.z.object({
28354
+ runId: zod.z.string(),
28355
+ nodeId: zod.z.string(),
28356
+ state: NodeBenchmarkStateSchema,
28357
+ plan: NodeBenchmarkPlanSchema,
28358
+ startedAtMs: zod.z.number(),
28359
+ deadlineAtMs: zod.z.number(),
28360
+ finishedAtMs: zod.z.number().nullable(),
28361
+ endReason: NodeBenchmarkEndReasonSchema.nullable(),
28362
+ error: zod.z.string().nullable(),
28363
+ /** Cameras moved off the node for the run. */
28364
+ moved: zod.z.array(zod.z.number()).readonly(),
28365
+ /** Cameras that stayed (their only frame source is the node). */
28366
+ staying: zod.z.array(zod.z.number()).readonly(),
28367
+ /** Something else ran on the node's pools during the run. */
28368
+ contaminated: zod.z.boolean(),
28369
+ progress: NodeBenchProgressSchema.nullable(),
28370
+ resultIds: zod.z.array(zod.z.string()).readonly()
28371
+ });
28372
+ /** `getNodeBenchmarkStatus`: the active run (or the last one), and whether benchmark mode is on. */
28373
+ var NodeBenchmarkStatusSchema = zod.z.object({
28374
+ /** The node the cluster is in benchmark mode for; null = none. */
28375
+ modeNodeId: zod.z.string().nullable(),
28376
+ run: NodeBenchmarkRunSchema.nullable()
28377
+ });
28378
+ /**
28379
+ * One stored measurement — the only authority Auto tune and the automatic
28380
+ * shares read measured capacity from. Written by the orchestrator when a run
28381
+ * ends, never by anyone else.
28382
+ */
28383
+ var NodeBenchmarkResultSchema = zod.z.object({
28384
+ id: zod.z.string(),
28385
+ runId: zod.z.string(),
28386
+ nodeId: zod.z.string(),
28387
+ cell: NodeBenchCellSchema,
28388
+ fpsPerStream: zod.z.number(),
28389
+ fingerprint: NodeBenchFingerprintSchema.nullable(),
28390
+ clip: NodeBenchClipSchema.nullable(),
28391
+ /** Other work shared the node's pools (a camera that could not move, or the hub's own duties). */
28392
+ contaminated: zod.z.boolean(),
28393
+ stayingCameras: zod.z.array(zod.z.number()).readonly(),
28394
+ /** The run ended early; the cell itself completed. */
28395
+ partialRun: zod.z.boolean(),
28396
+ measuredAtMs: zod.z.number()
28397
+ });
28398
+ var ListNodeBenchmarkResultsInputSchema = zod.z.object({
28399
+ nodeId: zod.z.string().optional(),
28400
+ deviceKey: zod.z.string().optional()
28401
+ });
28402
+ /** A result with its standing today: does it still beat the table? */
28403
+ var NodeBenchmarkResultViewSchema = NodeBenchmarkResultSchema.extend({
28404
+ /** `fresh` beats the table; `stale` falls back to it; `superseded` = a newer row covers the same cell. */
28405
+ standing: zod.z.enum([
28406
+ "fresh",
28407
+ "stale",
28408
+ "superseded"
28409
+ ]),
28410
+ staleWhy: zod.z.enum([
28411
+ "age",
28412
+ "runtime",
28413
+ "pool-tuning"
28414
+ ]).nullable()
28415
+ });
28416
+ /** The manifest persisted BEFORE benchmark mode changes anything; its presence means "restore". */
28417
+ var NodeBenchmarkManifestSchema = zod.z.object({
28418
+ runId: zod.z.string(),
28419
+ nodeId: zod.z.string(),
28420
+ startedAtMs: zod.z.number(),
28421
+ deadlineAtMs: zod.z.number(),
28422
+ plan: NodeBenchmarkPlanSchema,
28423
+ moved: zod.z.array(zod.z.number()).readonly(),
28424
+ staying: zod.z.array(zod.z.number()).readonly()
28425
+ });
28426
+ /** Candidate detectors per device, for the plan editor. */
28427
+ var NodeBenchmarkCandidatesSchema = zod.z.object({
28428
+ nodeId: zod.z.string(),
28429
+ reachable: zod.z.boolean(),
28430
+ devices: zod.z.array(zod.z.object({
28431
+ deviceKey: zod.z.string(),
28432
+ enabled: zod.z.boolean(),
28433
+ available: zod.z.boolean(),
28434
+ /** Ordered: what Auto tune would pick first, then the rest of the family by accuracy. */
28435
+ suggested: zod.z.array(zod.z.string()).readonly(),
28436
+ /** Every root detector the device has a build for. */
28437
+ all: zod.z.array(zod.z.string()).readonly(),
28438
+ /** The model the device runs now, when pinned. */
28439
+ currentModelId: zod.z.string().nullable()
28440
+ })).readonly(),
28441
+ /** Detail steps the node's catalog offers under the root (for the `pipeline` measurement). */
28442
+ steps: zod.z.array(zod.z.object({
28443
+ id: zod.z.string(),
28444
+ name: zod.z.string(),
28445
+ slot: zod.z.string()
28446
+ })).readonly()
28447
+ });
28448
+ //#endregion
27466
28449
  //#region src/capabilities/schemas/orchestrator-metrics.ts
27467
28450
  /** Shared Zod schemas for the runtime pipeline orchestrator metrics. */
27468
28451
  var OrchestratorMetricsSchema = zod.z.object({
@@ -28980,7 +29963,30 @@ var pipelineRunnerCapability = {
28980
29963
  releaseParkedTrackFrames: require_sleep.method(zod.z.object({
28981
29964
  deviceId: zod.z.number(),
28982
29965
  trackId: zod.z.string()
28983
- }), zod.z.object({ released: zod.z.number().int().nonnegative() }), { kind: "mutation" })
29966
+ }), zod.z.object({ released: zod.z.number().int().nonnegative() }), { kind: "mutation" }),
29967
+ /**
29968
+ * Start measuring THIS node for the orchestrator's node benchmark: the
29969
+ * bench clip decoded once into RAM, each device × candidate detector on an
29970
+ * open-loop ramp (`device`), then the chosen pipeline with the requested
29971
+ * detail steps (`pipeline`). Everything runs in-process with the executor
29972
+ * — no frame crosses a node (D9) — and writes nothing: no track, event,
29973
+ * media or notification. Reached by `nodePin(nodeId)`. Answers at once;
29974
+ * one run per node; the run stops itself at `deadlineAtMs`.
29975
+ */
29976
+ startNodeBench: require_sleep.method(NodeBenchRunnerInputSchema, zod.z.object({
29977
+ accepted: zod.z.literal(true),
29978
+ runId: zod.z.string()
29979
+ }), {
29980
+ kind: "mutation",
29981
+ auth: "admin"
29982
+ }),
29983
+ /** The run's progress and every finished cell; null when this runner does not know `runId`. */
29984
+ getNodeBenchStatus: require_sleep.method(zod.z.object({ runId: zod.z.string() }), NodeBenchRunnerStatusSchema.nullable(), { auth: "admin" }),
29985
+ /** Stop the run; what it finished is kept. */
29986
+ abortNodeBench: require_sleep.method(zod.z.object({ runId: zod.z.string() }), zod.z.object({ aborted: zod.z.boolean() }), {
29987
+ kind: "mutation",
29988
+ auth: "admin"
29989
+ })
28984
29990
  }
28985
29991
  };
28986
29992
  //#endregion
@@ -29956,6 +30962,51 @@ var pipelineOrchestratorCapability = {
29956
30962
  kind: "mutation",
29957
30963
  auth: "admin"
29958
30964
  }),
30965
+ /**
30966
+ * Node benchmark — what a run of this plan would do, without doing it:
30967
+ * the cameras that leave the node, those that cannot (the node is their
30968
+ * only frame source; they stay and flag the run), the estimated duration
30969
+ * and every reason it may not start. The confirmation shows this.
30970
+ */
30971
+ getNodeBenchmarkPreflight: require_sleep.method(NodeBenchmarkPlanSchema, NodeBenchmarkPreflightSchema, { auth: "admin" }),
30972
+ /**
30973
+ * Node benchmark — start ONE run (cluster-wide lock). The orchestrator
30974
+ * persists a restore manifest, enters benchmark mode for the node (out of
30975
+ * placement, its camera pins ignored, nothing rewritten), drains it, drives
30976
+ * the node's own runner, then restores — always, including after an
30977
+ * abort, a lost node or a hub restart. Answers at once; poll
30978
+ * `getNodeBenchmarkStatus`. Refused runs carry the preflight.
30979
+ */
30980
+ startNodeBenchmark: require_sleep.method(NodeBenchmarkPlanSchema, zod.z.discriminatedUnion("kind", [zod.z.object({
30981
+ kind: zod.z.literal("started"),
30982
+ runId: zod.z.string()
30983
+ }), zod.z.object({
30984
+ kind: zod.z.literal("refused"),
30985
+ preflight: NodeBenchmarkPreflightSchema
30986
+ })]), {
30987
+ kind: "mutation",
30988
+ auth: "admin"
30989
+ }),
30990
+ /** Node benchmark — the active run (or the last one) and the node in benchmark mode. */
30991
+ getNodeBenchmarkStatus: require_sleep.method(zod.z.void(), NodeBenchmarkStatusSchema, { auth: "admin" }),
30992
+ /** Node benchmark — stop the active run; the cluster is restored as it was. */
30993
+ abortNodeBenchmark: require_sleep.method(zod.z.object({ runId: zod.z.string() }), zod.z.object({ aborted: zod.z.boolean() }), {
30994
+ kind: "mutation",
30995
+ auth: "admin"
30996
+ }),
30997
+ /**
30998
+ * Node benchmark — root detector candidates per device (what Auto tune
30999
+ * would pick first, then the family) and the detail steps the node's
31000
+ * catalog offers, for the plan editor.
31001
+ */
31002
+ getNodeBenchmarkCandidates: require_sleep.method(zod.z.object({ nodeId: zod.z.string() }), NodeBenchmarkCandidatesSchema, { auth: "admin" }),
31003
+ /** Node benchmark — stored results, newest first, each with its standing today. */
31004
+ listNodeBenchmarkResults: require_sleep.method(ListNodeBenchmarkResultsInputSchema, zod.z.array(NodeBenchmarkResultViewSchema).readonly(), { auth: "admin" }),
31005
+ /** Node benchmark — delete one result; Auto tune and the shares stop reading it. */
31006
+ deleteNodeBenchmarkResult: require_sleep.method(zod.z.object({ id: zod.z.string() }), zod.z.object({ deleted: zod.z.boolean() }), {
31007
+ kind: "mutation",
31008
+ auth: "admin"
31009
+ }),
29959
31010
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
29960
31011
  getCameraSettings: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), CameraPipelineSettingsSchema.nullable()),
29961
31012
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -30951,7 +32002,19 @@ var SsoBridgeClaimsSchema = zod.z.object({
30951
32002
  * editing a descriptor must not retroactively extend or shorten a link the
30952
32003
  * operator already consented to.
30953
32004
  */
30954
- refreshTtl: zod.z.union([zod.z.number().int().positive(), zod.z.literal("never")]).optional()
32005
+ refreshTtl: zod.z.union([zod.z.number().int().positive(), zod.z.literal("never")]).optional(),
32006
+ /**
32007
+ * Opaque handle of a hub-side LINK intent (D782). Set by an OIDC callback
32008
+ * that was started from a signed-in user's "Link" button: the finish then
32009
+ * links this identity to the intent's user instead of signing anyone in.
32010
+ * The handle carries no user id — the hub resolves it, single-use.
32011
+ */
32012
+ linkIntent: zod.z.string().optional(),
32013
+ /**
32014
+ * Verified `iss` of the id_token behind an OIDC login bridge (D782). A
32015
+ * subject is unique only per issuer, so a link is bound to it.
32016
+ */
32017
+ issuer: zod.z.string().optional()
30955
32018
  });
30956
32019
  var ssoBridgeCapability = {
30957
32020
  name: "sso-bridge",
@@ -38052,6 +39115,9 @@ var CreateIntegrationInputSchema = zod.z.object({
38052
39115
  enabled: zod.z.boolean().optional(),
38053
39116
  info: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
38054
39117
  settings: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
39118
+ /** Keys of `settings` the form's schema declares secret (by type) — kept in
39119
+ * the keychain, not the table (D787). */
39120
+ secretKeys: zod.z.array(zod.z.string()).optional(),
38055
39121
  skipRestart: zod.z.boolean().optional()
38056
39122
  });
38057
39123
  var UpdateIntegrationInputSchema = zod.z.object({
@@ -38087,7 +39153,9 @@ var integrationsCapability = {
38087
39153
  getSettings: require_sleep.method(zod.z.object({ id: zod.z.string() }), zod.z.record(zod.z.string(), zod.z.unknown()), { auth: "admin" }),
38088
39154
  setSettings: require_sleep.method(zod.z.object({
38089
39155
  id: zod.z.string(),
38090
- settings: zod.z.record(zod.z.string(), zod.z.unknown())
39156
+ settings: zod.z.record(zod.z.string(), zod.z.unknown()),
39157
+ /** Keys the form's schema declares secret (by type) — keychain-stored (D787). */
39158
+ secretKeys: zod.z.array(zod.z.string()).optional()
38091
39159
  }), zod.z.object({ success: zod.z.boolean() }), {
38092
39160
  kind: "mutation",
38093
39161
  auth: "admin"
@@ -47165,6 +48233,22 @@ var TotpStatusSchema = zod.z.object({
47165
48233
  * delegation, structural caller-scope subset check goes inside the
47166
48234
  * provider.
47167
48235
  */
48236
+ var ExternalIdentitySchema = zod.z.object({
48237
+ /** Login-method id of the provider instance, e.g. `auth-oidc/authentik`. */
48238
+ provider: zod.z.string(),
48239
+ /** The IdP's stable subject (`sub`) for this account. */
48240
+ subject: zod.z.string(),
48241
+ /** The verified `iss` of the IdP the identity was linked under — `sub` is unique only per issuer. */
48242
+ issuer: zod.z.string(),
48243
+ userId: zod.z.string(),
48244
+ /** What the IdP called the account at link time (username / email) — display only. */
48245
+ label: zod.z.string().optional(),
48246
+ linkedAt: zod.z.number()
48247
+ });
48248
+ var ExternalIdentityKeySchema = zod.z.object({
48249
+ provider: zod.z.string().min(1),
48250
+ subject: zod.z.string().min(1)
48251
+ });
47168
48252
  var userManagementCapability = {
47169
48253
  name: "user-management",
47170
48254
  scope: "system",
@@ -47307,6 +48391,32 @@ var userManagementCapability = {
47307
48391
  username: zod.z.string(),
47308
48392
  scopes: zod.z.array(TokenScopeSchema)
47309
48393
  }).nullable(), { access: "view" }),
48394
+ listExternalIdentities: require_sleep.method(zod.z.object({ userId: zod.z.string() }), zod.z.array(ExternalIdentitySchema), { auth: "admin" }),
48395
+ /** The user an identity is linked to, or `null`. */
48396
+ findUserByExternalIdentity: require_sleep.method(ExternalIdentityKeySchema, zod.z.object({
48397
+ userId: zod.z.string(),
48398
+ issuer: zod.z.string()
48399
+ }).nullable(), { auth: "admin" }),
48400
+ /**
48401
+ * Link `(provider, subject)` to `userId`. Idempotent for the same user;
48402
+ * REFUSES (throws) an identity already linked to another user, and a
48403
+ * user that does not exist.
48404
+ */
48405
+ linkExternalIdentity: require_sleep.method(ExternalIdentityKeySchema.extend({
48406
+ userId: zod.z.string(),
48407
+ issuer: zod.z.string().min(1),
48408
+ label: zod.z.string().optional()
48409
+ }), zod.z.object({ success: zod.z.literal(true) }), {
48410
+ kind: "mutation",
48411
+ auth: "admin",
48412
+ access: "create"
48413
+ }),
48414
+ /** Remove one link of `userId`. `success: false` when it was not linked to that user. */
48415
+ unlinkExternalIdentity: require_sleep.method(ExternalIdentityKeySchema.extend({ userId: zod.z.string() }), zod.z.object({ success: zod.z.boolean() }), {
48416
+ kind: "mutation",
48417
+ auth: "admin",
48418
+ access: "delete"
48419
+ }),
47310
48420
  listOauthSessions: require_sleep.method(zod.z.void(), zod.z.array(OauthSessionSummarySchema), { auth: "admin" }),
47311
48421
  revokeOauthSession: require_sleep.method(zod.z.object({ id: zod.z.string() }), zod.z.object({ success: zod.z.boolean() }), {
47312
48422
  kind: "mutation",
@@ -49739,7 +50849,8 @@ var BaseDevice = class {
49739
50849
  this.role = options.role;
49740
50850
  this.parentDeviceId = ctx.parentDeviceId;
49741
50851
  const seedData = ctx.persistedConfig ?? {};
49742
- this.config = DeviceConfig.fromSchema(schema, (data) => ctx.persistConfig(data), seedData, ({ droppedKeys, issues }) => {
50852
+ const declaredSecretPaths = require_sleep.collectZodSecretPaths(schema);
50853
+ this.config = DeviceConfig.fromSchema(schema, (data) => ctx.persistConfig(data, { secretConfigPaths: declaredSecretPaths }), seedData, ({ droppedKeys, issues }) => {
49743
50854
  ctx.logger.warn("Device config recovery: dropping invalid persisted fields", {
49744
50855
  tags: {
49745
50856
  deviceId: ctx.id,
@@ -54243,6 +55354,90 @@ var METHOD_ACCESS_MAP = Object.freeze({
54243
55354
  addonId: null,
54244
55355
  access: "create"
54245
55356
  },
55357
+ "keychain.delete": {
55358
+ capName: "keychain",
55359
+ capScope: "system",
55360
+ addonId: null,
55361
+ access: "delete"
55362
+ },
55363
+ "keychain.getState": {
55364
+ capName: "keychain",
55365
+ capScope: "system",
55366
+ addonId: null,
55367
+ access: "view"
55368
+ },
55369
+ "keychain.listMeta": {
55370
+ capName: "keychain",
55371
+ capScope: "system",
55372
+ addonId: null,
55373
+ access: "view"
55374
+ },
55375
+ "keychain.put": {
55376
+ capName: "keychain",
55377
+ capScope: "system",
55378
+ addonId: null,
55379
+ access: "create"
55380
+ },
55381
+ "keychain.resolve": {
55382
+ capName: "keychain",
55383
+ capScope: "system",
55384
+ addonId: null,
55385
+ access: "view"
55386
+ },
55387
+ "keychainAdmin.deleteOrphans": {
55388
+ capName: "keychain-admin",
55389
+ capScope: "system",
55390
+ addonId: null,
55391
+ access: "delete"
55392
+ },
55393
+ "keychainAdmin.downloadRecoveryKey": {
55394
+ capName: "keychain-admin",
55395
+ capScope: "system",
55396
+ addonId: null,
55397
+ access: "create"
55398
+ },
55399
+ "keychainAdmin.listAudit": {
55400
+ capName: "keychain-admin",
55401
+ capScope: "system",
55402
+ addonId: null,
55403
+ access: "view"
55404
+ },
55405
+ "keychainAdmin.listSecrets": {
55406
+ capName: "keychain-admin",
55407
+ capScope: "system",
55408
+ addonId: null,
55409
+ access: "view"
55410
+ },
55411
+ "keychainAdmin.purgeRetiredKeys": {
55412
+ capName: "keychain-admin",
55413
+ capScope: "system",
55414
+ addonId: null,
55415
+ access: "delete"
55416
+ },
55417
+ "keychainAdmin.resetKeychain": {
55418
+ capName: "keychain-admin",
55419
+ capScope: "system",
55420
+ addonId: null,
55421
+ access: "delete"
55422
+ },
55423
+ "keychainAdmin.reveal": {
55424
+ capName: "keychain-admin",
55425
+ capScope: "system",
55426
+ addonId: null,
55427
+ access: "create"
55428
+ },
55429
+ "keychainAdmin.rotateMasterKey": {
55430
+ capName: "keychain-admin",
55431
+ capScope: "system",
55432
+ addonId: null,
55433
+ access: "create"
55434
+ },
55435
+ "keychainAdmin.status": {
55436
+ capName: "keychain-admin",
55437
+ capScope: "system",
55438
+ addonId: null,
55439
+ access: "view"
55440
+ },
54246
55441
  "lawnMowerControl.dock": {
54247
55442
  capName: "lawn-mower-control",
54248
55443
  capScope: "device",
@@ -55617,6 +56812,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
55617
56812
  addonId: null,
55618
56813
  access: "create"
55619
56814
  },
56815
+ "pipelineAnalytics.addRetrainFrameFromRecording": {
56816
+ capName: "pipeline-analytics",
56817
+ capScope: "device",
56818
+ addonId: null,
56819
+ access: "create"
56820
+ },
56821
+ "pipelineAnalytics.addRetrainFramesToCollection": {
56822
+ capName: "pipeline-analytics",
56823
+ capScope: "device",
56824
+ addonId: null,
56825
+ access: "create"
56826
+ },
55620
56827
  "pipelineAnalytics.applyDeviceSettingsPatch": {
55621
56828
  capName: "pipeline-analytics",
55622
56829
  capScope: "device",
@@ -55665,12 +56872,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
55665
56872
  addonId: null,
55666
56873
  access: "view"
55667
56874
  },
56875
+ "pipelineAnalytics.createRetrainCollection": {
56876
+ capName: "pipeline-analytics",
56877
+ capScope: "device",
56878
+ addonId: null,
56879
+ access: "create"
56880
+ },
55668
56881
  "pipelineAnalytics.deleteDeviceEvents": {
55669
56882
  capName: "pipeline-analytics",
55670
56883
  capScope: "device",
55671
56884
  addonId: null,
55672
56885
  access: "delete"
55673
56886
  },
56887
+ "pipelineAnalytics.deleteRetrainCollection": {
56888
+ capName: "pipeline-analytics",
56889
+ capScope: "device",
56890
+ addonId: null,
56891
+ access: "delete"
56892
+ },
55674
56893
  "pipelineAnalytics.deleteTracks": {
55675
56894
  capName: "pipeline-analytics",
55676
56895
  capScope: "device",
@@ -55875,6 +57094,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
55875
57094
  addonId: null,
55876
57095
  access: "view"
55877
57096
  },
57097
+ "pipelineAnalytics.listRetrainAssistProfiles": {
57098
+ capName: "pipeline-analytics",
57099
+ capScope: "device",
57100
+ addonId: null,
57101
+ access: "view"
57102
+ },
57103
+ "pipelineAnalytics.listRetrainCollectionFrames": {
57104
+ capName: "pipeline-analytics",
57105
+ capScope: "device",
57106
+ addonId: null,
57107
+ access: "view"
57108
+ },
57109
+ "pipelineAnalytics.listRetrainCollections": {
57110
+ capName: "pipeline-analytics",
57111
+ capScope: "device",
57112
+ addonId: null,
57113
+ access: "view"
57114
+ },
55878
57115
  "pipelineAnalytics.listRetrainFrames": {
55879
57116
  capName: "pipeline-analytics",
55880
57117
  capScope: "device",
@@ -55923,6 +57160,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
55923
57160
  addonId: null,
55924
57161
  access: "create"
55925
57162
  },
57163
+ "pipelineAnalytics.proposeRetrainAnnotationsWithLlm": {
57164
+ capName: "pipeline-analytics",
57165
+ capScope: "device",
57166
+ addonId: null,
57167
+ access: "create"
57168
+ },
55926
57169
  "pipelineAnalytics.pruneEvents": {
55927
57170
  capName: "pipeline-analytics",
55928
57171
  capScope: "device",
@@ -55977,6 +57220,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
55977
57220
  addonId: null,
55978
57221
  access: "create"
55979
57222
  },
57223
+ "pipelineAnalytics.removeRetrainFrameFromCollection": {
57224
+ capName: "pipeline-analytics",
57225
+ capScope: "device",
57226
+ addonId: null,
57227
+ access: "delete"
57228
+ },
57229
+ "pipelineAnalytics.renameRetrainCollection": {
57230
+ capName: "pipeline-analytics",
57231
+ capScope: "device",
57232
+ addonId: null,
57233
+ access: "create"
57234
+ },
55980
57235
  "pipelineAnalytics.restageRetrainTrack": {
55981
57236
  capName: "pipeline-analytics",
55982
57237
  capScope: "device",
@@ -56007,6 +57262,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56007
57262
  addonId: null,
56008
57263
  access: "create"
56009
57264
  },
57265
+ "pipelineAnalytics.setRetrainFrameComplete": {
57266
+ capName: "pipeline-analytics",
57267
+ capScope: "device",
57268
+ addonId: null,
57269
+ access: "create"
57270
+ },
56010
57271
  "pipelineAnalytics.setTrackFlags": {
56011
57272
  capName: "pipeline-analytics",
56012
57273
  capScope: "device",
@@ -56043,6 +57304,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56043
57304
  addonId: null,
56044
57305
  access: "delete"
56045
57306
  },
57307
+ "pipelineAnalytics.writeRetrainArchive": {
57308
+ capName: "pipeline-analytics",
57309
+ capScope: "device",
57310
+ addonId: null,
57311
+ access: "create"
57312
+ },
56046
57313
  "pipelineExecutor.cacheFrameInPool": {
56047
57314
  capName: "pipeline-executor",
56048
57315
  capScope: "system",
@@ -56253,6 +57520,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56253
57520
  addonId: null,
56254
57521
  access: "view"
56255
57522
  },
57523
+ "pipelineOrchestrator.abortNodeBenchmark": {
57524
+ capName: "pipeline-orchestrator",
57525
+ capScope: "system",
57526
+ addonId: null,
57527
+ access: "create"
57528
+ },
56256
57529
  "pipelineOrchestrator.applyAutoTune": {
56257
57530
  capName: "pipeline-orchestrator",
56258
57531
  capScope: "system",
@@ -56277,6 +57550,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56277
57550
  addonId: null,
56278
57551
  access: "create"
56279
57552
  },
57553
+ "pipelineOrchestrator.deleteNodeBenchmarkResult": {
57554
+ capName: "pipeline-orchestrator",
57555
+ capScope: "system",
57556
+ addonId: null,
57557
+ access: "delete"
57558
+ },
56280
57559
  "pipelineOrchestrator.getAgentLoad": {
56281
57560
  capName: "pipeline-orchestrator",
56282
57561
  capScope: "system",
@@ -56385,6 +57664,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
56385
57664
  addonId: null,
56386
57665
  access: "view"
56387
57666
  },
57667
+ "pipelineOrchestrator.getNodeBenchmarkCandidates": {
57668
+ capName: "pipeline-orchestrator",
57669
+ capScope: "system",
57670
+ addonId: null,
57671
+ access: "view"
57672
+ },
57673
+ "pipelineOrchestrator.getNodeBenchmarkPreflight": {
57674
+ capName: "pipeline-orchestrator",
57675
+ capScope: "system",
57676
+ addonId: null,
57677
+ access: "view"
57678
+ },
57679
+ "pipelineOrchestrator.getNodeBenchmarkStatus": {
57680
+ capName: "pipeline-orchestrator",
57681
+ capScope: "system",
57682
+ addonId: null,
57683
+ access: "view"
57684
+ },
56388
57685
  "pipelineOrchestrator.getNodeInferenceDevices": {
56389
57686
  capName: "pipeline-orchestrator",
56390
57687
  capScope: "system",
@@ -56427,6 +57724,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56427
57724
  addonId: null,
56428
57725
  access: "view"
56429
57726
  },
57727
+ "pipelineOrchestrator.listNodeBenchmarkResults": {
57728
+ capName: "pipeline-orchestrator",
57729
+ capScope: "system",
57730
+ addonId: null,
57731
+ access: "view"
57732
+ },
56430
57733
  "pipelineOrchestrator.pauseForStorageMigration": {
56431
57734
  capName: "pipeline-orchestrator",
56432
57735
  capScope: "system",
@@ -56571,6 +57874,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56571
57874
  addonId: null,
56572
57875
  access: "create"
56573
57876
  },
57877
+ "pipelineOrchestrator.startNodeBenchmark": {
57878
+ capName: "pipeline-orchestrator",
57879
+ capScope: "system",
57880
+ addonId: null,
57881
+ access: "create"
57882
+ },
56574
57883
  "pipelineOrchestrator.suggestShares": {
56575
57884
  capName: "pipeline-orchestrator",
56576
57885
  capScope: "system",
@@ -56589,6 +57898,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56589
57898
  addonId: null,
56590
57899
  access: "create"
56591
57900
  },
57901
+ "pipelineRunner.abortNodeBench": {
57902
+ capName: "pipeline-runner",
57903
+ capScope: "system",
57904
+ addonId: null,
57905
+ access: "create"
57906
+ },
56592
57907
  "pipelineRunner.attachCamera": {
56593
57908
  capName: "pipeline-runner",
56594
57909
  capScope: "system",
@@ -56637,6 +57952,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56637
57952
  addonId: null,
56638
57953
  access: "view"
56639
57954
  },
57955
+ "pipelineRunner.getNodeBenchStatus": {
57956
+ capName: "pipeline-runner",
57957
+ capScope: "system",
57958
+ addonId: null,
57959
+ access: "view"
57960
+ },
56640
57961
  "pipelineRunner.getParkedTrackFrame": {
56641
57962
  capName: "pipeline-runner",
56642
57963
  capScope: "system",
@@ -56679,6 +58000,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56679
58000
  addonId: null,
56680
58001
  access: "create"
56681
58002
  },
58003
+ "pipelineRunner.startNodeBench": {
58004
+ capName: "pipeline-runner",
58005
+ capScope: "system",
58006
+ addonId: null,
58007
+ access: "create"
58008
+ },
56682
58009
  "plateGallery.assignPlate": {
56683
58010
  capName: "plate-gallery",
56684
58011
  capScope: "system",
@@ -58395,18 +59722,36 @@ var METHOD_ACCESS_MAP = Object.freeze({
58395
59722
  addonId: null,
58396
59723
  access: "delete"
58397
59724
  },
59725
+ "userManagement.findUserByExternalIdentity": {
59726
+ capName: "user-management",
59727
+ capScope: "system",
59728
+ addonId: null,
59729
+ access: "view"
59730
+ },
58398
59731
  "userManagement.getTotpStatus": {
58399
59732
  capName: "user-management",
58400
59733
  capScope: "system",
58401
59734
  addonId: null,
58402
59735
  access: "view"
58403
59736
  },
59737
+ "userManagement.linkExternalIdentity": {
59738
+ capName: "user-management",
59739
+ capScope: "system",
59740
+ addonId: null,
59741
+ access: "create"
59742
+ },
58404
59743
  "userManagement.listApiKeys": {
58405
59744
  capName: "user-management",
58406
59745
  capScope: "system",
58407
59746
  addonId: null,
58408
59747
  access: "view"
58409
59748
  },
59749
+ "userManagement.listExternalIdentities": {
59750
+ capName: "user-management",
59751
+ capScope: "system",
59752
+ addonId: null,
59753
+ access: "view"
59754
+ },
58410
59755
  "userManagement.listOauthSessions": {
58411
59756
  capName: "user-management",
58412
59757
  capScope: "system",
@@ -58485,6 +59830,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
58485
59830
  addonId: null,
58486
59831
  access: "create"
58487
59832
  },
59833
+ "userManagement.unlinkExternalIdentity": {
59834
+ capName: "user-management",
59835
+ capScope: "system",
59836
+ addonId: null,
59837
+ access: "delete"
59838
+ },
58488
59839
  "userManagement.updateUser": {
58489
59840
  capName: "user-management",
58490
59841
  capScope: "system",
@@ -59001,6 +60352,8 @@ var KNOWN_CAP_NAMES = [
59001
60352
  "image-settings",
59002
60353
  "integrations",
59003
60354
  "intercom",
60355
+ "keychain",
60356
+ "keychain-admin",
59004
60357
  "lawn-mower-control",
59005
60358
  "llm",
59006
60359
  "llm-runtime",
@@ -59218,6 +60571,8 @@ var SYSTEM_CAP_NAMES = [
59218
60571
  "failure-contribution",
59219
60572
  "filesystem-browse",
59220
60573
  "integrations",
60574
+ "keychain",
60575
+ "keychain-admin",
59221
60576
  "llm",
59222
60577
  "llm-runtime",
59223
60578
  "load-contribution",
@@ -61350,6 +62705,15 @@ var ENTRY_BY_KEY = new Map(DISPLAY_ICON_VOCABULARY.map((e) => [e.key, e]));
61350
62705
  function isDisplayIconKey(value) {
61351
62706
  return typeof value === "string" && ENTRY_BY_KEY.has(value);
61352
62707
  }
62708
+ /**
62709
+ * A stored icon value as a vocabulary key: `value` when it IS one, `fallback`
62710
+ * otherwise. For an `icon` settings field (D780) whose stored value may
62711
+ * predate the vocabulary (a free-text lucide name) — the field's default is
62712
+ * drawn rather than nothing.
62713
+ */
62714
+ function resolveDisplayIconKey(value, fallback) {
62715
+ return typeof value === "string" && isDisplayIconKey(value) ? value : fallback;
62716
+ }
61353
62717
  /** The entry for a key, or `undefined` — never a guessed one. */
61354
62718
  function displayIconEntry(key) {
61355
62719
  return ENTRY_BY_KEY.get(key);
@@ -62438,6 +63802,11 @@ function zodToConfigField(key, schema, description) {
62438
63802
  description,
62439
63803
  default: defaultValue
62440
63804
  };
63805
+ if (inner instanceof zod.z.ZodString && require_sleep.isZodSecret(schema)) return {
63806
+ ...base,
63807
+ type: "password",
63808
+ showToggle: true
63809
+ };
62441
63810
  if (inner instanceof zod.z.ZodString) return buildStringField(key, base);
62442
63811
  if (inner instanceof zod.z.ZodNumber) return buildNumberField(inner, base);
62443
63812
  if (inner instanceof zod.z.ZodBoolean) return {
@@ -62445,12 +63814,16 @@ function zodToConfigField(key, schema, description) {
62445
63814
  type: "boolean"
62446
63815
  };
62447
63816
  if (inner instanceof zod.z.ZodEnum) return buildEnumField(inner, base);
62448
- if (inner instanceof zod.z.ZodArray || inner instanceof zod.z.ZodObject) return {
62449
- ...base,
62450
- type: "textarea",
62451
- rows: 6,
62452
- isJson: true
62453
- };
63817
+ if (inner instanceof zod.z.ZodArray || inner instanceof zod.z.ZodObject) {
63818
+ const holdsSecret = require_sleep.isZodSecret(schema) || require_sleep.collectZodSecretPaths(schema).length > 0;
63819
+ return {
63820
+ ...base,
63821
+ type: "textarea",
63822
+ rows: 6,
63823
+ isJson: true,
63824
+ ...holdsSecret ? { secret: true } : {}
63825
+ };
63826
+ }
62454
63827
  return {
62455
63828
  ...base,
62456
63829
  type: "text"
@@ -62669,6 +64042,8 @@ var CAPABILITY_NAMES = {
62669
64042
  imageSettings: "image-settings",
62670
64043
  integrations: "integrations",
62671
64044
  intercom: "intercom",
64045
+ keychain: "keychain",
64046
+ keychainAdmin: "keychain-admin",
62672
64047
  lawnMowerControl: "lawn-mower-control",
62673
64048
  llm: "llm",
62674
64049
  llmRuntime: "llm-runtime",
@@ -63062,6 +64437,14 @@ var CAPABILITY_ROUTER_KEYS = [
63062
64437
  key: "intercom",
63063
64438
  name: "intercom"
63064
64439
  },
64440
+ {
64441
+ key: "keychain",
64442
+ name: "keychain"
64443
+ },
64444
+ {
64445
+ key: "keychainAdmin",
64446
+ name: "keychain-admin"
64447
+ },
63065
64448
  {
63066
64449
  key: "lawnMowerControl",
63067
64450
  name: "lawn-mower-control"
@@ -63508,6 +64891,8 @@ var ALL_CAPABILITY_DEFINITIONS = [
63508
64891
  imageSettingsCapability,
63509
64892
  integrationsCapability,
63510
64893
  intercomCapability,
64894
+ keychainCapability,
64895
+ keychainAdminCapability,
63511
64896
  lawnMowerControlCapability,
63512
64897
  llmCapability,
63513
64898
  llmRuntimeCapability,
@@ -64936,6 +66321,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
64936
66321
  form: "single",
64937
66322
  optional: false
64938
66323
  }],
66324
+ "pipelineAnalytics.addRetrainFrameFromRecording": [{
66325
+ name: "deviceId",
66326
+ form: "single",
66327
+ optional: false
66328
+ }],
64939
66329
  "pipelineAnalytics.applyDeviceSettingsPatch": [{
64940
66330
  name: "deviceId",
64941
66331
  form: "single",
@@ -65126,6 +66516,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
65126
66516
  form: "single",
65127
66517
  optional: false
65128
66518
  }],
66519
+ "pipelineAnalytics.proposeRetrainAnnotationsWithLlm": [{
66520
+ name: "deviceId",
66521
+ form: "single",
66522
+ optional: false
66523
+ }],
65129
66524
  "pipelineAnalytics.pruneEventsBefore": [{
65130
66525
  name: "deviceId",
65131
66526
  form: "single",
@@ -65176,6 +66571,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
65176
66571
  form: "single",
65177
66572
  optional: false
65178
66573
  }],
66574
+ "pipelineAnalytics.setRetrainFrameComplete": [{
66575
+ name: "deviceId",
66576
+ form: "single",
66577
+ optional: false
66578
+ }],
65179
66579
  "pipelineAnalytics.setTrackFlags": [{
65180
66580
  name: "deviceId",
65181
66581
  form: "single",
@@ -67086,6 +68486,17 @@ function createSystemProxy(api) {
67086
68486
  getAvailableTypes: (input) => dispatch("integrations", "getAvailableTypes", "query", input),
67087
68487
  testConnection: (input) => dispatch("integrations", "testConnection", "mutation", input)
67088
68488
  },
68489
+ keychainAdmin: {
68490
+ status: (input) => dispatch("keychainAdmin", "status", "query", input),
68491
+ listSecrets: (input) => dispatch("keychainAdmin", "listSecrets", "query", input),
68492
+ listAudit: (input) => dispatch("keychainAdmin", "listAudit", "query", input),
68493
+ reveal: (input) => dispatch("keychainAdmin", "reveal", "mutation", input),
68494
+ deleteOrphans: (input) => dispatch("keychainAdmin", "deleteOrphans", "mutation", input),
68495
+ rotateMasterKey: (input) => dispatch("keychainAdmin", "rotateMasterKey", "mutation", input),
68496
+ purgeRetiredKeys: (input) => dispatch("keychainAdmin", "purgeRetiredKeys", "mutation", input),
68497
+ downloadRecoveryKey: (input) => dispatch("keychainAdmin", "downloadRecoveryKey", "mutation", input),
68498
+ resetKeychain: (input) => dispatch("keychainAdmin", "resetKeychain", "mutation", input)
68499
+ },
67089
68500
  llm: {
67090
68501
  generate: (input) => dispatch("llm", "generate", "mutation", input),
67091
68502
  generateVision: (input) => dispatch("llm", "generateVision", "mutation", input),
@@ -67305,6 +68716,13 @@ function createSystemProxy(api) {
67305
68716
  suggestShares: (input) => dispatch("pipelineOrchestrator", "suggestShares", "query", input),
67306
68717
  getEffectiveShares: (input) => dispatch("pipelineOrchestrator", "getEffectiveShares", "query", input),
67307
68718
  setShareSource: (input) => dispatch("pipelineOrchestrator", "setShareSource", "mutation", input),
68719
+ getNodeBenchmarkPreflight: (input) => dispatch("pipelineOrchestrator", "getNodeBenchmarkPreflight", "query", input),
68720
+ startNodeBenchmark: (input) => dispatch("pipelineOrchestrator", "startNodeBenchmark", "mutation", input),
68721
+ getNodeBenchmarkStatus: (input) => dispatch("pipelineOrchestrator", "getNodeBenchmarkStatus", "query", input),
68722
+ abortNodeBenchmark: (input) => dispatch("pipelineOrchestrator", "abortNodeBenchmark", "mutation", input),
68723
+ getNodeBenchmarkCandidates: (input) => dispatch("pipelineOrchestrator", "getNodeBenchmarkCandidates", "query", input),
68724
+ listNodeBenchmarkResults: (input) => dispatch("pipelineOrchestrator", "listNodeBenchmarkResults", "query", input),
68725
+ deleteNodeBenchmarkResult: (input) => dispatch("pipelineOrchestrator", "deleteNodeBenchmarkResult", "mutation", input),
67308
68726
  getCameraStatuses: (input) => dispatch("pipelineOrchestrator", "getCameraStatuses", "query", input),
67309
68727
  setCameraSensors: (input) => dispatch("pipelineOrchestrator", "setCameraSensors", "mutation", input),
67310
68728
  reconcileFromDisk: (input) => dispatch("pipelineOrchestrator", "reconcileFromDisk", "mutation", input),
@@ -67318,7 +68736,10 @@ function createSystemProxy(api) {
67318
68736
  getAllCameraMetrics: (input) => dispatch("pipelineRunner", "getAllCameraMetrics", "query", input),
67319
68737
  getLocalCameras: (input) => dispatch("pipelineRunner", "getLocalCameras", "query", input),
67320
68738
  getNativeCrop: (input) => dispatch("pipelineRunner", "getNativeCrop", "query", input),
67321
- runStatelessStep: (input) => dispatch("pipelineRunner", "runStatelessStep", "mutation", input)
68739
+ runStatelessStep: (input) => dispatch("pipelineRunner", "runStatelessStep", "mutation", input),
68740
+ startNodeBench: (input) => dispatch("pipelineRunner", "startNodeBench", "mutation", input),
68741
+ getNodeBenchStatus: (input) => dispatch("pipelineRunner", "getNodeBenchStatus", "query", input),
68742
+ abortNodeBench: (input) => dispatch("pipelineRunner", "abortNodeBench", "mutation", input)
67322
68743
  },
67323
68744
  plateGallery: {
67324
68745
  getPlateMedia: (input) => dispatch("plateGallery", "getPlateMedia", "query", input),
@@ -67512,6 +68933,10 @@ function createSystemProxy(api) {
67512
68933
  oauthExchangeCode: (input) => dispatch("userManagement", "oauthExchangeCode", "mutation", input),
67513
68934
  oauthRefresh: (input) => dispatch("userManagement", "oauthRefresh", "mutation", input),
67514
68935
  oauthVerifyAccessToken: (input) => dispatch("userManagement", "oauthVerifyAccessToken", "query", input),
68936
+ listExternalIdentities: (input) => dispatch("userManagement", "listExternalIdentities", "query", input),
68937
+ findUserByExternalIdentity: (input) => dispatch("userManagement", "findUserByExternalIdentity", "query", input),
68938
+ linkExternalIdentity: (input) => dispatch("userManagement", "linkExternalIdentity", "mutation", input),
68939
+ unlinkExternalIdentity: (input) => dispatch("userManagement", "unlinkExternalIdentity", "mutation", input),
67515
68940
  listOauthSessions: (input) => dispatch("userManagement", "listOauthSessions", "query", input),
67516
68941
  revokeOauthSession: (input) => dispatch("userManagement", "revokeOauthSession", "mutation", input)
67517
68942
  }
@@ -72901,6 +74326,22 @@ function capacitySessionsOf(fps, headroom, cameraFps) {
72901
74326
  if (!(fps > 0) || !(cameraFps > 0)) return 0;
72902
74327
  return Math.max(0, Math.floor(fps * (1 - headroom) / cameraFps + 1e-9));
72903
74328
  }
74329
+ /** The table column with the node's own measurements laid over it. */
74330
+ function overlayMeasured(table, measured) {
74331
+ if (measured === void 0 || Object.keys(measured).length === 0) return table;
74332
+ const out = { ...table };
74333
+ for (const [modelId, m] of Object.entries(measured)) out[modelId] = {
74334
+ p50Ms: m.p50Ms,
74335
+ fps: m.fps,
74336
+ measured: true,
74337
+ source: {
74338
+ kind: "node-benchmark",
74339
+ resultId: m.resultId,
74340
+ measuredAtMs: m.measuredAtMs
74341
+ }
74342
+ };
74343
+ return out;
74344
+ }
72904
74345
  function round(value, digits = 3) {
72905
74346
  const f = 10 ** digits;
72906
74347
  return Math.round(value * f) / f;
@@ -72973,6 +74414,7 @@ function choiceOn(ctx, modelId, sizing) {
72973
74414
  p50Ms: cell.p50Ms,
72974
74415
  fps: cell.fps,
72975
74416
  measured: cell.measured,
74417
+ source: cell.source ?? { kind: "table" },
72976
74418
  capacitySessions: sessionsOn(cell, sizing),
72977
74419
  personRecall: DETECTOR_ACCURACY[modelId]?.personRecall ?? 0
72978
74420
  };
@@ -73021,11 +74463,14 @@ function recommendNode(input) {
73021
74463
  if (node.hardware === null) return skippedNode(node, { kind: "no-hardware-facts" }, null);
73022
74464
  const hardware = node.hardware;
73023
74465
  const { hardwareClass, cpuModel } = classifyInferenceHardware(hardware);
73024
- const classTable = perf[hardwareClass];
73025
- if (hardwareClass === "unknown" || classTable === void 0) return skippedNode(node, {
74466
+ const measured = input.measured ?? {};
74467
+ const hasMeasured = Object.values(measured).some((m) => Object.keys(m).length > 0);
74468
+ const knownTable = hardwareClass === "unknown" ? void 0 : perf[hardwareClass];
74469
+ if (knownTable === void 0 && !hasMeasured) return skippedNode(node, {
73026
74470
  kind: "no-measured-data",
73027
74471
  hardwareClass
73028
74472
  }, hardwareClass);
74473
+ const classTable = knownTable ?? {};
73029
74474
  const devices = node.devices.toSorted((a, b) => a.key.localeCompare(b.key));
73030
74475
  const contexts = /* @__PURE__ */ new Map();
73031
74476
  const early = /* @__PURE__ */ new Map();
@@ -73043,7 +74488,7 @@ function recommendNode(input) {
73043
74488
  early.set(device.key, [{ kind: "device-unavailable" }]);
73044
74489
  continue;
73045
74490
  }
73046
- const column = accelerator === null ? void 0 : classTable[accelerator];
74491
+ const column = accelerator === null ? void 0 : overlayMeasured(classTable[accelerator], measured[device.key]);
73047
74492
  if (accelerator === null || column === void 0) {
73048
74493
  early.set(device.key, [{
73049
74494
  kind: "no-family-build",
@@ -73058,13 +74503,28 @@ function recommendNode(input) {
73058
74503
  });
73059
74504
  }
73060
74505
  const isCpu = (a) => a === "x86-cpu" || a === "arm-cpu";
73061
- const accelerators = [...contexts.values()].filter((c) => !isCpu(c.accelerator));
73062
- const cpus = [...contexts.values()].filter((c) => isCpu(c.accelerator));
74506
+ const keptByKey = /* @__PURE__ */ new Map();
74507
+ const keptReasonOf = (group) => {
74508
+ const pinned = group.find((c) => c.device.customPinModelId !== void 0);
74509
+ if (pinned?.device.customPinModelId === void 0) return null;
74510
+ const reason = {
74511
+ kind: "kept-custom-pin",
74512
+ modelId: pinned.device.customPinModelId,
74513
+ deviceKey: pinned.device.key
74514
+ };
74515
+ for (const c of group) keptByKey.set(c.device.key, [reason]);
74516
+ return reason;
74517
+ };
74518
+ const acceleratorGroup = [...contexts.values()].filter((c) => !isCpu(c.accelerator));
74519
+ const acceleratorKept = keptReasonOf(acceleratorGroup);
74520
+ const accelerators = acceleratorKept === null ? acceleratorGroup : [];
74521
+ const cpus = [...contexts.values()].filter((c) => isCpu(c.accelerator)).filter((c) => keptReasonOf([c]) === null);
73063
74522
  const chosenByKey = /* @__PURE__ */ new Map();
73064
74523
  const reasonsByKey = /* @__PURE__ */ new Map();
73065
74524
  const nodeReasons = [];
73066
74525
  let acceleratorModelId = null;
73067
74526
  const groupPick = accelerators.length > 0 ? pickForGroup(accelerators, node.formatsByModel, sizing) : null;
74527
+ if (acceleratorKept !== null) nodeReasons.push(acceleratorKept);
73068
74528
  if (groupPick !== null) {
73069
74529
  acceleratorModelId = groupPick.modelId;
73070
74530
  nodeReasons.push(...groupPick.reasons);
@@ -73108,7 +74568,8 @@ function recommendNode(input) {
73108
74568
  enabled: device.enabled,
73109
74569
  available: device.available,
73110
74570
  chosen: chosenByKey.get(device.key) ?? null,
73111
- reasons: early.get(device.key) ?? reasonsByKey.get(device.key) ?? []
74571
+ ...keptByKey.has(device.key) ? { kept: "custom-pin" } : {},
74572
+ reasons: early.get(device.key) ?? keptByKey.get(device.key) ?? reasonsByKey.get(device.key) ?? []
73112
74573
  })),
73113
74574
  reasons: nodeReasons
73114
74575
  };
@@ -73358,6 +74819,287 @@ function computeCapacityShares(input) {
73358
74819
  };
73359
74820
  }
73360
74821
  //#endregion
74822
+ //#region src/pipeline/node-benchmark/benchmark-mode.ts
74823
+ /**
74824
+ * Benchmark mode (D791) — the pure rules of "one node under test". Pure.
74825
+ *
74826
+ * While the cluster is in benchmark mode for node N:
74827
+ * - N is not a detection candidate for any camera that another node can
74828
+ * serve ({@link eligibleUnderBenchmark});
74829
+ * - a node pin naming N is ignored for such a camera
74830
+ * ({@link pinUnderBenchmark}) — the stored pin is never rewritten, so it
74831
+ * is "restored" the moment the mode ends;
74832
+ * - a camera whose ONLY frame source is N stays on N (never blind) and the
74833
+ * run is flagged contaminated.
74834
+ */
74835
+ /** The detection candidates of one camera while `benchNodeId` is under test. */
74836
+ function eligibleUnderBenchmark(eligible, benchNodeId) {
74837
+ if (benchNodeId === null || !eligible.includes(benchNodeId)) return eligible;
74838
+ const others = eligible.filter((n) => n !== benchNodeId);
74839
+ return others.length > 0 ? others : eligible;
74840
+ }
74841
+ /** A camera's node pin while `benchNodeId` is under test (null = no pin). */
74842
+ function pinUnderBenchmark(pin, benchNodeId, eligible) {
74843
+ if (pin === null || benchNodeId === null || pin !== benchNodeId) return pin;
74844
+ return eligible.some((n) => n !== benchNodeId) ? null : pin;
74845
+ }
74846
+ /** Which cameras leave the node for the run, and which cannot. */
74847
+ function classifyCamerasForBenchmark(nodeId, cameras) {
74848
+ const moving = [];
74849
+ const staying = [];
74850
+ for (const cam of cameras.toSorted((a, b) => a.deviceId - b.deviceId)) {
74851
+ const placedOnNode = cam.placedNodeId === nodeId;
74852
+ const pinnedToNode = cam.nodePin === nodeId;
74853
+ if (!placedOnNode && !pinnedToNode) continue;
74854
+ if (!cam.frameSourceNodes.some((n) => n !== nodeId)) staying.push({
74855
+ deviceId: cam.deviceId,
74856
+ reason: "only-frame-source"
74857
+ });
74858
+ else moving.push({
74859
+ deviceId: cam.deviceId,
74860
+ placedOnNode,
74861
+ pinnedToNode
74862
+ });
74863
+ }
74864
+ return {
74865
+ moving,
74866
+ staying
74867
+ };
74868
+ }
74869
+ /** Ramp steps the runner tries per cell, at most. */
74870
+ var DEVICE_RAMP = [
74871
+ 1,
74872
+ 2,
74873
+ 4,
74874
+ 6,
74875
+ 8,
74876
+ 12,
74877
+ 16,
74878
+ 24,
74879
+ 32
74880
+ ];
74881
+ var PIPELINE_RAMP = [
74882
+ 1,
74883
+ 2,
74884
+ 3,
74885
+ 4,
74886
+ 6,
74887
+ 8,
74888
+ 10,
74889
+ 12,
74890
+ 16
74891
+ ];
74892
+ /** Fixed costs around the measurement: drain, clip, warm-ups, restore. */
74893
+ var OVERHEAD_MS = 3 * 6e4;
74894
+ var WARMUP_PER_CELL_MS = 2e4;
74895
+ /**
74896
+ * An upper bound on how long the run takes: every ramp step of every cell,
74897
+ * plus the drain, the clip and the restore — capped at the budget, which is
74898
+ * the hard deadline anyway. A ramp usually stops well before its last step.
74899
+ */
74900
+ function estimateNodeBenchmarkDurationMs(plan, timing = {}) {
74901
+ const stepMs = ((timing.settleSec ?? NODE_BENCHMARK_DEFAULTS.settleSec) + (timing.measureSec ?? NODE_BENCHMARK_DEFAULTS.measureSec)) * 1e3;
74902
+ let total = OVERHEAD_MS;
74903
+ if (plan.phases.includes("device")) for (const device of plan.devices) total += device.modelIds.length * (WARMUP_PER_CELL_MS + DEVICE_RAMP.length * stepMs);
74904
+ if (plan.phases.includes("pipeline")) total += plan.devices.length * (WARMUP_PER_CELL_MS + PIPELINE_RAMP.length * stepMs);
74905
+ return Math.min(total, plan.budgetMinutes * 6e4);
74906
+ }
74907
+ /** Why a run cannot start, in the order the operator should read them. */
74908
+ function nodeBenchmarkRefusals(input) {
74909
+ const out = [];
74910
+ if (input.activeRunNodeId !== null) out.push({
74911
+ kind: "benchmark-active",
74912
+ detail: `A benchmark of ${input.activeRunNodeId} is running — one node at a time.`,
74913
+ overridable: false
74914
+ });
74915
+ if (!input.online) out.push({
74916
+ kind: "node-offline",
74917
+ detail: `${input.plan.nodeId} is not online.`,
74918
+ overridable: false
74919
+ });
74920
+ const unknown = input.plan.devices.map((d) => d.deviceKey).filter((k) => !input.knownDeviceKeys.includes(k));
74921
+ if (unknown.length > 0) out.push({
74922
+ kind: "unknown-device",
74923
+ detail: `${input.plan.nodeId} reports no device ${unknown.join(", ")}.`,
74924
+ overridable: false
74925
+ });
74926
+ if (input.plan.phases.length === 0) out.push({
74927
+ kind: "no-phase",
74928
+ detail: "Choose at least one measurement.",
74929
+ overridable: false
74930
+ });
74931
+ const capacity = input.otherNodesCapacitySessions;
74932
+ if (capacity !== null && input.sessionsNow > capacity && !input.plan.acceptInsufficientHeadroom) out.push({
74933
+ kind: "insufficient-headroom",
74934
+ detail: `The cluster runs ${input.sessionsNow} sessions now; the other nodes can carry ${capacity}.`,
74935
+ overridable: true
74936
+ });
74937
+ return out;
74938
+ }
74939
+ //#endregion
74940
+ //#region src/pipeline/node-benchmark/results.ts
74941
+ /** The cell a row measures — two rows with the same key measure the same thing. */
74942
+ function resultCellKey(row) {
74943
+ const { cell } = row;
74944
+ const steps = cell.phase === "pipeline" ? cell.steps.toSorted().join(",") : "";
74945
+ return [
74946
+ row.nodeId,
74947
+ cell.deviceKey,
74948
+ cell.phase,
74949
+ cell.modelId,
74950
+ steps
74951
+ ].join("|");
74952
+ }
74953
+ function staleWhy(row, ctx) {
74954
+ const bound = ctx.staleAfterMs ?? NODE_BENCHMARK_DEFAULTS.staleAfterDays * 864e5;
74955
+ if (ctx.nowMs - row.measuredAtMs > bound) return "age";
74956
+ const now = ctx.currentPools[row.nodeId]?.[row.cell.deviceKey];
74957
+ const then = row.fingerprint?.pools[row.cell.deviceKey];
74958
+ if (now === void 0 || then === void 0) return null;
74959
+ if (now.runtime !== then.runtime) return "runtime";
74960
+ if (now.numWorkers !== then.numWorkers || now.concurrency !== then.concurrency || now.batchMode !== then.batchMode) return "pool-tuning";
74961
+ return null;
74962
+ }
74963
+ /** The standing of every row, by id. */
74964
+ function resultStandings(rows, ctx) {
74965
+ const newest = /* @__PURE__ */ new Map();
74966
+ for (const row of rows) {
74967
+ const key = resultCellKey(row);
74968
+ const held = newest.get(key);
74969
+ if (held === void 0 || row.measuredAtMs > held.measuredAtMs) newest.set(key, row);
74970
+ }
74971
+ const out = /* @__PURE__ */ new Map();
74972
+ for (const row of rows) {
74973
+ if (newest.get(resultCellKey(row))?.id !== row.id) {
74974
+ out.set(row.id, {
74975
+ standing: "superseded",
74976
+ staleWhy: null
74977
+ });
74978
+ continue;
74979
+ }
74980
+ const why = staleWhy(row, ctx);
74981
+ out.set(row.id, why === null ? {
74982
+ standing: "fresh",
74983
+ staleWhy: null
74984
+ } : {
74985
+ standing: "stale",
74986
+ staleWhy: why
74987
+ });
74988
+ }
74989
+ return out;
74990
+ }
74991
+ /** Rows that beat the table today. */
74992
+ function freshResults(rows, ctx) {
74993
+ const standings = resultStandings(rows, ctx);
74994
+ return rows.filter((r) => standings.get(r.id)?.standing === "fresh");
74995
+ }
74996
+ /** deviceKey → modelId → the fresh `device` measurement on `nodeId`. */
74997
+ function measuredDetectorCells(rows, nodeId, ctx) {
74998
+ const out = {};
74999
+ for (const row of freshResults(rows, ctx)) {
75000
+ if (row.nodeId !== nodeId || row.cell.phase !== "device") continue;
75001
+ const perDevice = out[row.cell.deviceKey] ?? {};
75002
+ perDevice[row.cell.modelId] = {
75003
+ p50Ms: Math.round(row.cell.p50Ms * 100) / 100,
75004
+ fps: row.cell.fps,
75005
+ resultId: row.id,
75006
+ measuredAtMs: row.measuredAtMs
75007
+ };
75008
+ out[row.cell.deviceKey] = perDevice;
75009
+ }
75010
+ return out;
75011
+ }
75012
+ /**
75013
+ * Per node, each device at its newest fresh `pipeline` measurement — the
75014
+ * `NodeCapacitySource` answer the automatic shares read.
75015
+ */
75016
+ function measuredCapacityFromResults(rows, nodeIds, ctx) {
75017
+ const byNode = /* @__PURE__ */ new Map();
75018
+ for (const row of freshResults(rows, ctx)) {
75019
+ if (!nodeIds.includes(row.nodeId) || row.cell.phase !== "pipeline") continue;
75020
+ const devices = byNode.get(row.nodeId) ?? /* @__PURE__ */ new Map();
75021
+ const held = devices.get(row.cell.deviceKey);
75022
+ if (held === void 0 || row.measuredAtMs > held.measuredAtMs) devices.set(row.cell.deviceKey, row);
75023
+ byNode.set(row.nodeId, devices);
75024
+ }
75025
+ const out = /* @__PURE__ */ new Map();
75026
+ for (const nodeId of nodeIds) {
75027
+ const devices = byNode.get(nodeId);
75028
+ if (devices === void 0) continue;
75029
+ out.set(nodeId, {
75030
+ nodeId,
75031
+ devices: [...devices.values()].toSorted((a, b) => a.cell.deviceKey.localeCompare(b.cell.deviceKey)).map((r) => ({
75032
+ deviceKey: r.cell.deviceKey,
75033
+ maxSessions: r.cell.phase === "pipeline" ? r.cell.maxSessions : 0,
75034
+ modelId: r.cell.modelId,
75035
+ measuredAtMs: r.measuredAtMs
75036
+ }))
75037
+ });
75038
+ }
75039
+ return out;
75040
+ }
75041
+ //#endregion
75042
+ //#region src/pipeline/node-benchmark/step-tree.ts
75043
+ var BENCH_ROOT_STEP_ID = "object-detection";
75044
+ function slotAddons(schema, slot) {
75045
+ return schema.slots.find((s) => s.id === slot)?.addons ?? [];
75046
+ }
75047
+ var feeds = (from, to) => to.inputClasses.some((c) => from.outputClasses.includes(c));
75048
+ function layout(schema) {
75049
+ const root = slotAddons(schema, "detector").find((a) => a.id === BENCH_ROOT_STEP_ID);
75050
+ if (root === void 0) return null;
75051
+ const classifiers = slotAddons(schema, "classifier");
75052
+ const croppers = slotAddons(schema, "cropper").filter((c) => feeds(root, c)).map((cropper) => ({
75053
+ cropper,
75054
+ recognizers: classifiers.filter((k) => feeds(cropper, k))
75055
+ }));
75056
+ const underCropper = new Set(croppers.flatMap((c) => c.recognizers.map((r) => r.id)));
75057
+ return {
75058
+ root,
75059
+ croppers,
75060
+ classifiers: classifiers.filter((k) => feeds(root, k) && !underCropper.has(k.id)),
75061
+ refiners: slotAddons(schema, "refiner")
75062
+ };
75063
+ }
75064
+ /** The detail steps the operator can choose, in tree order. */
75065
+ function listBenchDetailSteps(schema) {
75066
+ const l = layout(schema);
75067
+ if (l === null) return [];
75068
+ const of = (a) => ({
75069
+ id: a.id,
75070
+ name: a.name,
75071
+ slot: a.slot
75072
+ });
75073
+ return [
75074
+ ...l.croppers.flatMap((c) => [of(c.cropper), ...c.recognizers.map(of)]),
75075
+ ...l.classifiers.map(of),
75076
+ ...l.refiners.map(of)
75077
+ ];
75078
+ }
75079
+ /** Build the tree. Throws when the node's catalog has no object-detection root. */
75080
+ function buildBenchStepTree(schema, rootModelId, enabledStepIds) {
75081
+ const l = layout(schema);
75082
+ if (l === null) throw new Error(`the node's catalog has no ${BENCH_ROOT_STEP_ID} step`);
75083
+ const on = new Set(enabledStepIds);
75084
+ const step = (a, enabled) => ({
75085
+ addonId: a.id,
75086
+ enabled
75087
+ });
75088
+ return [{
75089
+ addonId: l.root.id,
75090
+ modelId: rootModelId,
75091
+ enabled: true,
75092
+ children: [
75093
+ ...l.croppers.map(({ cropper, recognizers }) => ({
75094
+ ...step(cropper, on.has(cropper.id) || recognizers.some((r) => on.has(r.id))),
75095
+ children: recognizers.map((r) => step(r, on.has(r.id)))
75096
+ })),
75097
+ ...l.classifiers.map((k) => step(k, on.has(k.id))),
75098
+ ...l.refiners.map((r) => step(r, on.has(r.id)))
75099
+ ]
75100
+ }];
75101
+ }
75102
+ //#endregion
73361
75103
  //#region src/pipeline/root-face-crop.ts
73362
75104
  /** Side of the square, as a multiple of the face box's longer side. */
73363
75105
  var ROOT_FACE_REFINE_SCALE = 1.6;
@@ -75508,6 +77250,7 @@ exports.AcceleratorKindSchema = AcceleratorKindSchema;
75508
77250
  exports.AccessoriesStatusSchema = AccessoriesStatusSchema;
75509
77251
  exports.AccessoryKind = AccessoryKind;
75510
77252
  exports.AddBrokerInputSchema = AddBrokerInputSchema;
77253
+ exports.AddRetrainFrameFromRecordingResultSchema = AddRetrainFrameFromRecordingResultSchema;
75511
77254
  exports.AddonAutoUpdateSchema = AddonAutoUpdateSchema;
75512
77255
  exports.AddonListItemSchema = AddonListItemSchema;
75513
77256
  exports.AddonPageDeclarationSchema = AddonPageDeclarationSchema;
@@ -75589,6 +77332,7 @@ exports.BASE_DEVICE_CAPS = BASE_DEVICE_CAPS;
75589
77332
  exports.BASE_LIVE_EGRESS_PROFILE = BASE_LIVE_EGRESS_PROFILE;
75590
77333
  exports.BATTERY_DEVICE_PROFILE = BATTERY_DEVICE_PROFILE;
75591
77334
  exports.BATTERY_UNREACHABLE_AFTER_MS = BATTERY_UNREACHABLE_AFTER_MS;
77335
+ exports.BENCH_ROOT_STEP_ID = BENCH_ROOT_STEP_ID;
75592
77336
  exports.BIRTH_DECISION_DEFAULT_LIMIT = BIRTH_DECISION_DEFAULT_LIMIT;
75593
77337
  exports.BOOT_RECOVERY_BACKOFF_MS = require_sleep.BOOT_RECOVERY_BACKOFF_MS;
75594
77338
  exports.BUILTIN_RESULT_KINDS = BUILTIN_RESULT_KINDS;
@@ -75897,6 +77641,7 @@ exports.DEVICE_CAP_NAMES = DEVICE_CAP_NAMES;
75897
77641
  exports.DEVICE_CHILDREN_BATCH_MAX = require_sleep.DEVICE_CHILDREN_BATCH_MAX;
75898
77642
  exports.DEVICE_DO_ACTIONS = DEVICE_DO_ACTIONS;
75899
77643
  exports.DEVICE_PROFILES = DEVICE_PROFILES;
77644
+ exports.DEVICE_RAMP = DEVICE_RAMP;
75900
77645
  exports.DEVICE_RESTORE_RETRY_CONCURRENCY = DEVICE_RESTORE_RETRY_CONCURRENCY;
75901
77646
  exports.DEVICE_RESTORE_RETRY_DELAYS_MS = DEVICE_RESTORE_RETRY_DELAYS_MS;
75902
77647
  exports.DEVICE_SCOPED_CAPS = require_sleep.DEVICE_SCOPED_CAPS;
@@ -76051,6 +77796,8 @@ exports.ExtensionSlotValueSchema = ExtensionSlotValueSchema;
76051
77796
  exports.ExtensionSourceAvailabilitySchema = ExtensionSourceAvailabilitySchema;
76052
77797
  exports.ExtensionSourceHealthSchema = ExtensionSourceHealthSchema;
76053
77798
  exports.ExtensionSourceSchema = ExtensionSourceSchema;
77799
+ exports.ExternalIdentityKeySchema = ExternalIdentityKeySchema;
77800
+ exports.ExternalIdentitySchema = ExternalIdentitySchema;
76054
77801
  exports.FEEDER_EXAMPLE_ADDON_ID = FEEDER_EXAMPLE_ADDON_ID;
76055
77802
  exports.FEEDER_EXAMPLE_HA_DEVICE_ID = FEEDER_EXAMPLE_HA_DEVICE_ID;
76056
77803
  exports.FFMPEG_PATH_ENV = require_composition.FFMPEG_PATH_ENV;
@@ -76117,8 +77864,24 @@ exports.IntegrationLiteSchema = IntegrationLiteSchema;
76117
77864
  exports.IntegrationWithStateSchema = IntegrationWithStateSchema;
76118
77865
  exports.IntercomAbilitySchema = IntercomAbilitySchema;
76119
77866
  exports.IntercomStatusSchema = IntercomStatusSchema;
77867
+ exports.KEYCHAIN_MAX_REFS_PER_CALL = KEYCHAIN_MAX_REFS_PER_CALL;
77868
+ exports.KEYCHAIN_RESET_CONFIRMATION = KEYCHAIN_RESET_CONFIRMATION;
76120
77869
  exports.KNOWN_CAP_NAMES = KNOWN_CAP_NAMES;
77870
+ exports.KeptReasonSchema = KeptReasonSchema;
76121
77871
  exports.KeyEventSchema = KeyEventSchema;
77872
+ exports.KeychainAdminSecretSchema = KeychainAdminSecretSchema;
77873
+ exports.KeychainAuditActionSchema = KeychainAuditActionSchema;
77874
+ exports.KeychainAuditEntrySchema = KeychainAuditEntrySchema;
77875
+ exports.KeychainKeySourceKindSchema = KeychainKeySourceKindSchema;
77876
+ exports.KeychainKeySourceSchema = KeychainKeySourceSchema;
77877
+ exports.KeychainResolveEntrySchema = KeychainResolveEntrySchema;
77878
+ exports.KeychainResolveResultSchema = KeychainResolveResultSchema;
77879
+ exports.KeychainSecretMetaSchema = KeychainSecretMetaSchema;
77880
+ exports.KeychainSecretUsageSchema = KeychainSecretUsageSchema;
77881
+ exports.KeychainStateSchema = KeychainStateSchema;
77882
+ exports.KeychainStatusSchema = KeychainStatusSchema;
77883
+ exports.KeychainUnavailableReasonSchema = KeychainUnavailableReasonSchema;
77884
+ exports.KeychainWriteRefusedError = require_sleep.KeychainWriteRefusedError;
76122
77885
  exports.LABEL_SUPPLY_MACRO = LABEL_SUPPLY_MACRO;
76123
77886
  exports.LABEL_SUPPLY_STEP_IDS = LABEL_SUPPLY_STEP_IDS;
76124
77887
  exports.LABEL_SUPPLY_VOCABULARIES = LABEL_SUPPLY_VOCABULARIES;
@@ -76136,6 +77899,7 @@ exports.LTS_SCOPE_CLASS_SEPARATOR = LTS_SCOPE_CLASS_SEPARATOR;
76136
77899
  exports.LabelAttributionSchema = LabelAttributionSchema;
76137
77900
  exports.LabelDefinitionSchema = LabelDefinitionSchema;
76138
77901
  exports.LabelTierSchema = LabelTierSchema;
77902
+ exports.LatencySourceSchema = LatencySourceSchema;
76139
77903
  exports.LawnMowerActivitySchema = LawnMowerActivitySchema;
76140
77904
  exports.LawnMowerControlStatusSchema = LawnMowerControlStatusSchema;
76141
77905
  exports.LedgerWalkDeviceReportSchema = LedgerWalkDeviceReportSchema;
@@ -76148,6 +77912,7 @@ exports.LegacyStorageLocationDefaultSchema = LegacyStorageLocationDefaultSchema;
76148
77912
  exports.LinkedDeviceSchema = LinkedDeviceSchema;
76149
77913
  exports.LinkedDevicesModeSchema = LinkedDevicesModeSchema;
76150
77914
  exports.LinkedDevicesSlotValueSchema = LinkedDevicesSlotValueSchema;
77915
+ exports.ListNodeBenchmarkResultsInputSchema = ListNodeBenchmarkResultsInputSchema;
76151
77916
  exports.ListTrackRelationsInputSchema = ListTrackRelationsInputSchema;
76152
77917
  exports.ListTrackRelationsResultSchema = ListTrackRelationsResultSchema;
76153
77918
  exports.LlmDefaultSchema = LlmDefaultSchema;
@@ -76235,6 +78000,7 @@ exports.MEDIA_PRESENCE_OWNER_KINDS = MEDIA_PRESENCE_OWNER_KINDS;
76235
78000
  exports.METHOD_ACCESS_MAP = METHOD_ACCESS_MAP;
76236
78001
  exports.METHOD_DEVICE_SELECTORS = METHOD_DEVICE_SELECTORS;
76237
78002
  exports.MINUTES_PER_DAY = MINUTES_PER_DAY;
78003
+ exports.MIN_SCRUBBED_LENGTH = require_sleep.MIN_SCRUBBED_LENGTH;
76238
78004
  exports.MIN_SESSIONS_PER_DEVICE_RANGE = MIN_SESSIONS_PER_DEVICE_RANGE;
76239
78005
  exports.MODEL_FORMATS = MODEL_FORMATS;
76240
78006
  exports.MODEL_HOSTING = MODEL_HOSTING;
@@ -76398,6 +78164,7 @@ exports.NC_TEMPLATE_VARS = NC_TEMPLATE_VARS;
76398
78164
  exports.NC_UPDATE_EVENT_PACKAGE_NAMES = NC_UPDATE_EVENT_PACKAGE_NAMES;
76399
78165
  exports.NETWORK_LINK_TYPES = NETWORK_LINK_TYPES;
76400
78166
  exports.NETWORK_LINK_UNKNOWN = NETWORK_LINK_UNKNOWN;
78167
+ exports.NODE_BENCHMARK_DEFAULTS = NODE_BENCHMARK_DEFAULTS;
76401
78168
  exports.NO_MEASURED_CAPACITY = NO_MEASURED_CAPACITY;
76402
78169
  exports.NativeCropBboxSchema = NativeCropBboxSchema;
76403
78170
  exports.NativeCropRefSchema = NativeCropRefSchema;
@@ -76519,6 +78286,33 @@ exports.NetworkAccessStatusSchema = NetworkAccessStatusSchema;
76519
78286
  exports.NetworkAddressSchema = NetworkAddressSchema;
76520
78287
  exports.NetworkEndpointSchema = NetworkEndpointSchema;
76521
78288
  exports.NetworkLinkStatusSchema = NetworkLinkStatusSchema;
78289
+ exports.NodeBenchCellSchema = NodeBenchCellSchema;
78290
+ exports.NodeBenchClipSchema = NodeBenchClipSchema;
78291
+ exports.NodeBenchDeviceCellSchema = NodeBenchDeviceCellSchema;
78292
+ exports.NodeBenchFingerprintSchema = NodeBenchFingerprintSchema;
78293
+ exports.NodeBenchLimitSchema = NodeBenchLimitSchema;
78294
+ exports.NodeBenchPipelineCellSchema = NodeBenchPipelineCellSchema;
78295
+ exports.NodeBenchProgressSchema = NodeBenchProgressSchema;
78296
+ exports.NodeBenchRampStepSchema = NodeBenchRampStepSchema;
78297
+ exports.NodeBenchRunnerInputSchema = NodeBenchRunnerInputSchema;
78298
+ exports.NodeBenchRunnerStateSchema = NodeBenchRunnerStateSchema;
78299
+ exports.NodeBenchRunnerStatusSchema = NodeBenchRunnerStatusSchema;
78300
+ exports.NodeBenchmarkCandidatesSchema = NodeBenchmarkCandidatesSchema;
78301
+ exports.NodeBenchmarkDevicePlanSchema = NodeBenchmarkDevicePlanSchema;
78302
+ exports.NodeBenchmarkEndReasonSchema = NodeBenchmarkEndReasonSchema;
78303
+ exports.NodeBenchmarkManifestSchema = NodeBenchmarkManifestSchema;
78304
+ exports.NodeBenchmarkMovingCameraSchema = NodeBenchmarkMovingCameraSchema;
78305
+ exports.NodeBenchmarkPhaseSchema = NodeBenchmarkPhaseSchema;
78306
+ exports.NodeBenchmarkPlanSchema = NodeBenchmarkPlanSchema;
78307
+ exports.NodeBenchmarkPreflightSchema = NodeBenchmarkPreflightSchema;
78308
+ exports.NodeBenchmarkRefusalKindSchema = NodeBenchmarkRefusalKindSchema;
78309
+ exports.NodeBenchmarkRefusalSchema = NodeBenchmarkRefusalSchema;
78310
+ exports.NodeBenchmarkResultSchema = NodeBenchmarkResultSchema;
78311
+ exports.NodeBenchmarkResultViewSchema = NodeBenchmarkResultViewSchema;
78312
+ exports.NodeBenchmarkRunSchema = NodeBenchmarkRunSchema;
78313
+ exports.NodeBenchmarkStateSchema = NodeBenchmarkStateSchema;
78314
+ exports.NodeBenchmarkStatusSchema = NodeBenchmarkStatusSchema;
78315
+ exports.NodeBenchmarkStayingCameraSchema = NodeBenchmarkStayingCameraSchema;
76522
78316
  exports.NodeDeviceChangeSchema = NodeDeviceChangeSchema;
76523
78317
  exports.NodeDirectoryEntrySchema = NodeDirectoryEntrySchema;
76524
78318
  exports.NodeDirectorySchema = NodeDirectorySchema;
@@ -76579,6 +78373,7 @@ exports.PET_FEEDER_MANUAL_FEED_MIN = PET_FEEDER_MANUAL_FEED_MIN;
76579
78373
  exports.PIPELINE_ANALYTICS_CAP_NAME = PIPELINE_ANALYTICS_CAP_NAME;
76580
78374
  exports.PIPELINE_FLOW_CAPABILITY_NAMES = PIPELINE_FLOW_CAPABILITY_NAMES;
76581
78375
  exports.PIPELINE_OWNER_CAPABILITY_NAMES = PIPELINE_OWNER_CAPABILITY_NAMES;
78376
+ exports.PIPELINE_RAMP = PIPELINE_RAMP;
76582
78377
  exports.PRIVACY_MASK_CAP_NAME = PRIVACY_MASK_CAP_NAME;
76583
78378
  exports.PROVIDER_KIND_CAP_NAMES = PROVIDER_KIND_CAP_NAMES;
76584
78379
  exports.PROVIDER_PIN_FIELD = require_sleep.PROVIDER_PIN_FIELD;
@@ -76655,11 +78450,12 @@ exports.RECORDING_EXPORT_MAX_READ_BYTES = RECORDING_EXPORT_MAX_READ_BYTES;
76655
78450
  exports.RECORDING_SOURCE_CAMSTACK = RECORDING_SOURCE_CAMSTACK;
76656
78451
  exports.RECORDING_SOURCE_CAMSTACK_ADDON = RECORDING_SOURCE_CAMSTACK_ADDON;
76657
78452
  exports.RECORDING_TIMELINE_BATCH_MAX = RECORDING_TIMELINE_BATCH_MAX;
76658
- exports.REDACTED_SECRET = REDACTED_SECRET;
78453
+ exports.REDACTED_SECRET = require_sleep.REDACTED_SECRET;
76659
78454
  exports.REMOVED_MODEL_IDS = REMOVED_MODEL_IDS;
76660
78455
  exports.RESERVED_BINDING_NAMES = require_composition.RESERVED_BINDING_NAMES;
76661
78456
  exports.RESERVED_COLLECTION_SOURCES = RESERVED_COLLECTION_SOURCES;
76662
78457
  exports.RESTORED_CAP_NAMES = RESTORED_CAP_NAMES;
78458
+ exports.REVALIDATE_AFTER_MS = require_sleep.REVALIDATE_AFTER_MS;
76663
78459
  exports.ROOM_EXAMPLE_MOTION_SOURCES = ROOM_EXAMPLE_MOTION_SOURCES;
76664
78460
  exports.ROOM_EXAMPLE_TEMPERATURE_SOURCES = ROOM_EXAMPLE_TEMPERATURE_SOURCES;
76665
78461
  exports.ROOM_OCCUPANCY_WINDOW_MS = ROOM_OCCUPANCY_WINDOW_MS;
@@ -76741,14 +78537,27 @@ exports.RetrainAnnotationDraftSchema = RetrainAnnotationDraftSchema;
76741
78537
  exports.RetrainAnnotationKindSchema = RetrainAnnotationKindSchema;
76742
78538
  exports.RetrainAnnotationSchema = RetrainAnnotationSchema;
76743
78539
  exports.RetrainAnnotationSourceSchema = RetrainAnnotationSourceSchema;
78540
+ exports.RetrainArchiveResultSchema = RetrainArchiveResultSchema;
78541
+ exports.RetrainArchiveTargetSchema = RetrainArchiveTargetSchema;
78542
+ exports.RetrainAssistProfileSchema = RetrainAssistProfileSchema;
76744
78543
  exports.RetrainAssistResultSchema = RetrainAssistResultSchema;
76745
78544
  exports.RetrainAssistSubjectSchema = RetrainAssistSubjectSchema;
78545
+ exports.RetrainCollectionCreateResultSchema = RetrainCollectionCreateResultSchema;
78546
+ exports.RetrainCollectionRenameResultSchema = RetrainCollectionRenameResultSchema;
78547
+ exports.RetrainCollectionSchema = RetrainCollectionSchema;
76746
78548
  exports.RetrainCopyRefusalSchema = RetrainCopyRefusalSchema;
78549
+ exports.RetrainExportFilterSchema = RetrainExportFilterSchema;
78550
+ exports.RetrainExportLayoutSchema = RetrainExportLayoutSchema;
76747
78551
  exports.RetrainFrameCandidateSchema = RetrainFrameCandidateSchema;
76748
78552
  exports.RetrainFrameListSchema = RetrainFrameListSchema;
78553
+ exports.RetrainFrameOriginSchema = RetrainFrameOriginSchema;
76749
78554
  exports.RetrainFrameSchema = RetrainFrameSchema;
76750
78555
  exports.RetrainFrameSelectionSchema = RetrainFrameSelectionSchema;
78556
+ exports.RetrainLlmAssistResultSchema = RetrainLlmAssistResultSchema;
78557
+ exports.RetrainLlmProposalSchema = RetrainLlmProposalSchema;
78558
+ exports.RetrainLlmReviewSchema = RetrainLlmReviewSchema;
76751
78559
  exports.RetrainMacroClassSchema = RetrainMacroClassSchema;
78560
+ exports.RetrainPipelineBoxSchema = RetrainPipelineBoxSchema;
76752
78561
  exports.RetrainStatusSchema = RetrainStatusSchema;
76753
78562
  exports.RetrainTrackSchema = RetrainTrackSchema;
76754
78563
  exports.RetrainTransitionResultSchema = RetrainTransitionResultSchema;
@@ -76774,6 +78583,9 @@ exports.SCENE_DEFAULT_UNCOVERED_POLICY = SCENE_DEFAULT_UNCOVERED_POLICY;
76774
78583
  exports.SCENE_DIVERGED = SCENE_DIVERGED;
76775
78584
  exports.SCENE_RESET_RECAPTURES = SCENE_RESET_RECAPTURES;
76776
78585
  exports.SCOPE_PRESETS = SCOPE_PRESETS;
78586
+ exports.SECRET_CLEAR = require_sleep.SECRET_CLEAR;
78587
+ exports.SECRET_META = require_sleep.SECRET_META;
78588
+ exports.SECRET_REF_SCHEME = require_sleep.SECRET_REF_SCHEME;
76777
78589
  exports.SENSOR_FEATURES = SENSOR_FEATURES;
76778
78590
  exports.SENSOR_MAP = SENSOR_MAP;
76779
78591
  exports.SESSION_PLACEMENT_SETTING_KEY = SESSION_PLACEMENT_SETTING_KEY;
@@ -77080,6 +78892,7 @@ exports.applyModeDeviceListEdit = applyModeDeviceListEdit;
77080
78892
  exports.applyModelBoundSettings = applyModelBoundSettings;
77081
78893
  exports.applyNonBlockingEdit = applyNonBlockingEdit;
77082
78894
  exports.applySecureOnArmEdit = applySecureOnArmEdit;
78895
+ exports.arrayItemFieldPath = require_sleep.arrayItemFieldPath;
77083
78896
  exports.asBoolean = require_sleep.asBoolean;
77084
78897
  exports.asJsonArray = require_sleep.asJsonArray;
77085
78898
  exports.asJsonObject = require_sleep.asJsonObject;
@@ -77111,6 +78924,7 @@ exports.brightnessCapability = brightnessCapability;
77111
78924
  exports.brokerCapability = brokerCapability;
77112
78925
  exports.buildAddonRouteProvider = buildAddonRouteProvider;
77113
78926
  exports.buildAudioArgs = require_composition.buildAudioArgs;
78927
+ exports.buildBenchStepTree = buildBenchStepTree;
77114
78928
  exports.buildCapabilityLookup = buildCapabilityLookup;
77115
78929
  exports.buildDeviceAdminUrl = buildDeviceAdminUrl;
77116
78930
  exports.buildDoorbellCompositionFeature = buildDoorbellCompositionFeature;
@@ -77121,6 +78935,7 @@ exports.buildInputArgs = require_composition.buildInputArgs;
77121
78935
  exports.buildModelVariantGroups = buildModelVariantGroups;
77122
78936
  exports.buildNcTaxonomy = buildNcTaxonomy;
77123
78937
  exports.buildRoleScopes = buildRoleScopes;
78938
+ exports.buildSecretRef = require_sleep.buildSecretRef;
77124
78939
  exports.buildStreamParamsConfigSchema = buildStreamParamsConfigSchema;
77125
78940
  exports.buildVideoArgs = require_composition.buildVideoArgs;
77126
78941
  exports.buildViewerLink = buildViewerLink;
@@ -77141,9 +78956,12 @@ exports.carbonMonoxideCapability = carbonMonoxideCapability;
77141
78956
  exports.cellsToRects = cellsToRects;
77142
78957
  exports.checkRoleAddress = checkRoleAddress;
77143
78958
  exports.classifyBearerPrincipal = classifyBearerPrincipal;
78959
+ exports.classifyCamerasForBenchmark = classifyCamerasForBenchmark;
77144
78960
  exports.classifyInferenceHardware = classifyInferenceHardware;
78961
+ exports.classifySecretWrite = require_sleep.classifySecretWrite;
77145
78962
  exports.classifyStream = classifyStream;
77146
78963
  exports.classifyStreams = classifyStreams;
78964
+ exports.clearKnownSecrets = require_sleep.clearKnownSecrets;
77147
78965
  exports.clearModelBoundOverrides = clearModelBoundOverrides;
77148
78966
  exports.clearModelBoundSetting = clearModelBoundSetting;
77149
78967
  exports.climateControlCapability = climateControlCapability;
@@ -77158,8 +78976,11 @@ exports.clusterStepSettingKey = clusterStepSettingKey;
77158
78976
  exports.codecIsAccepted = codecIsAccepted;
77159
78977
  exports.collectHydratedFieldEntries = require_sleep.collectHydratedFieldEntries;
77160
78978
  exports.collectHydratedFieldValues = require_sleep.collectHydratedFieldValues;
78979
+ exports.collectKeychainStoredKeys = require_sleep.collectKeychainStoredKeys;
77161
78980
  exports.collectModelBoundKeys = collectModelBoundKeys;
77162
- exports.collectSecretConfigKeys = collectSecretConfigKeys;
78981
+ exports.collectSecretConfigKeys = require_sleep.collectSecretConfigKeys;
78982
+ exports.collectSecretMarkerRefs = require_sleep.collectSecretMarkerRefs;
78983
+ exports.collectZodSecretPaths = require_sleep.collectZodSecretPaths;
77163
78984
  exports.colorCapability = colorCapability;
77164
78985
  exports.colorForKind = colorForKind;
77165
78986
  exports.commitWatchdogRestart = commitWatchdogRestart;
@@ -77211,6 +79032,7 @@ exports.createLazyTrpcSource = require_sleep.createLazyTrpcSource;
77211
79032
  exports.createLogChannelsProvider = createLogChannelsProvider;
77212
79033
  exports.createMirrorSource = require_sleep.createMirrorSource;
77213
79034
  exports.createRuntimeStateBridge = createRuntimeStateBridge;
79035
+ exports.createSecretsAccess = require_sleep.createSecretsAccess;
77214
79036
  exports.createSliceHandle = require_sleep.createSliceHandle;
77215
79037
  exports.createStatefulExpressionMemory = require_composition.createStatefulExpressionMemory;
77216
79038
  exports.createSystemProxy = createSystemProxy;
@@ -77277,6 +79099,7 @@ exports.effectiveStepSettings = effectiveStepSettings;
77277
79099
  exports.egressTranscodeSharingKey = egressTranscodeSharingKey;
77278
79100
  exports.egressTransportFromRequest = egressTransportFromRequest;
77279
79101
  exports.electByShare = electByShare;
79102
+ exports.eligibleUnderBenchmark = eligibleUnderBenchmark;
77280
79103
  exports.embeddingEncoderCapability = embeddingEncoderCapability;
77281
79104
  exports.embeddingModelFailedError = embeddingModelFailedError;
77282
79105
  exports.embeddingModelFailedOf = embeddingModelFailedOf;
@@ -77294,6 +79117,7 @@ exports.enumerateInferenceDevices = enumerateInferenceDevices;
77294
79117
  exports.enumerateItemArrayFields = enumerateItemArrayFields;
77295
79118
  exports.enumerateSchemaFields = enumerateSchemaFields;
77296
79119
  exports.errMsg = require_err_msg.errMsg;
79120
+ exports.estimateNodeBenchmarkDurationMs = estimateNodeBenchmarkDurationMs;
77297
79121
  exports.evaluateAst = require_composition.evaluateAst;
77298
79122
  exports.evaluateCompositionField = evaluateCompositionField;
77299
79123
  exports.evaluateCount = require_composition.evaluateCount;
@@ -77337,10 +79161,13 @@ exports.findCompositionCycles = findCompositionCycles;
77337
79161
  exports.findTimezone = findTimezone;
77338
79162
  exports.floodCapability = floodCapability;
77339
79163
  exports.foldSnapshotByFunction = foldSnapshotByFunction;
79164
+ exports.forgetKnownSecret = require_sleep.forgetKnownSecret;
77340
79165
  exports.formatForRuntime = formatForRuntime;
77341
79166
  exports.formatMediaOwnerKey = formatMediaOwnerKey;
77342
79167
  exports.formatMinutes = formatMinutes;
77343
79168
  exports.formatParkedFor = formatParkedFor;
79169
+ exports.formatSecretScope = require_sleep.formatSecretScope;
79170
+ exports.freshResults = freshResults;
77344
79171
  exports.frigateDefaultClassFloors = frigateDefaultClassFloors;
77345
79172
  exports.frigateLabelFields = frigateLabelFields;
77346
79173
  exports.gasCapability = gasCapability;
@@ -77354,6 +79181,7 @@ exports.getTaxonomyEntry = getTaxonomyEntry;
77354
79181
  exports.gifDeriveSpeed = gifDeriveSpeed;
77355
79182
  exports.gifFilterComplex = gifFilterComplex;
77356
79183
  exports.gifFromMp4Args = gifFromMp4Args;
79184
+ exports.globalSecretScope = require_sleep.globalSecretScope;
77357
79185
  exports.hasModelBoundOverrides = hasModelBoundOverrides;
77358
79186
  exports.hasMotionTrigger = hasMotionTrigger;
77359
79187
  exports.hfModelUrl = hfModelUrl;
@@ -77403,6 +79231,7 @@ exports.isEventOwnerType = isEventOwnerType;
77403
79231
  exports.isFirstLevelMacroClass = isFirstLevelMacroClass;
77404
79232
  exports.isHeldBackTemplateVar = isHeldBackTemplateVar;
77405
79233
  exports.isIsolatedBuiltin = isIsolatedBuiltin;
79234
+ exports.isKeychainStoredField = require_sleep.isKeychainStoredField;
77406
79235
  exports.isKnownTemplateVar = isKnownTemplateVar;
77407
79236
  exports.isLabelSupplyStepId = isLabelSupplyStepId;
77408
79237
  exports.isLocationEnabled = isLocationEnabled;
@@ -77417,7 +79246,12 @@ exports.isRetiredClearKey = isRetiredClearKey;
77417
79246
  exports.isRootSuppliableStepId = isRootSuppliableStepId;
77418
79247
  exports.isSameAddonId = isSameAddonId;
77419
79248
  exports.isScheduleActive = isScheduleActive;
77420
- exports.isSecretConfigField = isSecretConfigField;
79249
+ exports.isSecretClear = require_sleep.isSecretClear;
79250
+ exports.isSecretConfigField = require_sleep.isSecretConfigField;
79251
+ exports.isSecretFieldView = require_sleep.isSecretFieldView;
79252
+ exports.isSecretMarker = require_sleep.isSecretMarker;
79253
+ exports.isSecretMarkerLike = require_sleep.isSecretMarkerLike;
79254
+ exports.isSecretRef = require_sleep.isSecretRef;
77421
79255
  exports.isSingleHubAddressRole = isSingleHubAddressRole;
77422
79256
  exports.isSoftwareDecode = require_composition.isSoftwareDecode;
77423
79257
  exports.isSourceCap = require_composition.isSourceCap;
@@ -77430,11 +79264,15 @@ exports.isSystemEventSummaryRule = isSystemEventSummaryRule;
77430
79264
  exports.isSystemRuleKind = isSystemRuleKind;
77431
79265
  exports.isVectorIndexDimConflict = isVectorIndexDimConflict;
77432
79266
  exports.isVoidInput = isVoidInput;
79267
+ exports.isZodSecret = require_sleep.isZodSecret;
77433
79268
  exports.ituDbfsFromPreEpoch = ituDbfsFromPreEpoch;
77434
79269
  exports.jobKindSchema = jobKindSchema;
77435
79270
  exports.kebabToCamel = kebabToCamel;
79271
+ exports.keychainAdminCapability = keychainAdminCapability;
79272
+ exports.keychainCapability = keychainCapability;
77436
79273
  exports.kindOfValue = kindOfValue;
77437
79274
  exports.kindsForDiscriminator = kindsForDiscriminator;
79275
+ exports.knownSecretCount = require_sleep.knownSecretCount;
77438
79276
  exports.knownValues = knownValues;
77439
79277
  exports.lawnMowerControlCapability = lawnMowerControlCapability;
77440
79278
  exports.legacyAutoLinkIds = legacyAutoLinkIds;
@@ -77445,6 +79283,7 @@ exports.lifecycleJobStateSchema = lifecycleJobStateSchema;
77445
79283
  exports.lifecycleTaskSchema = lifecycleTaskSchema;
77446
79284
  exports.linkedLabelStepId = linkedLabelStepId;
77447
79285
  exports.linkedStepOf = linkedStepOf;
79286
+ exports.listBenchDetailSteps = listBenchDetailSteps;
77448
79287
  exports.llmCapability = llmCapability;
77449
79288
  exports.llmRuntimeCapability = llmRuntimeCapability;
77450
79289
  exports.loadContributionCapability = loadContributionCapability;
@@ -77459,6 +79298,7 @@ exports.logLevelAtMost = logLevelAtMost;
77459
79298
  exports.loginMethodCapability = loginMethodCapability;
77460
79299
  exports.looseSchema = looseSchema;
77461
79300
  exports.makeProfileBrokerId = require_sleep.makeProfileBrokerId;
79301
+ exports.makeSecretMarker = require_sleep.makeSecretMarker;
77462
79302
  exports.makeSourceBrokerId = require_sleep.makeSourceBrokerId;
77463
79303
  exports.mapAudioLabelToMacro = mapAudioLabelToMacro;
77464
79304
  exports.markdownToHtmlLite = markdownToHtmlLite;
@@ -77467,8 +79307,11 @@ exports.maskUrlCredentials = maskUrlCredentials;
77467
79307
  exports.matchDoAction = matchDoAction;
77468
79308
  exports.mayReadLocation = mayReadLocation;
77469
79309
  exports.mayWriteToLocation = mayWriteToLocation;
79310
+ exports.measuredCapacityFromResults = measuredCapacityFromResults;
79311
+ exports.measuredDetectorCells = measuredDetectorCells;
77470
79312
  exports.mediaPlayerCapability = mediaPlayerCapability;
77471
79313
  exports.memoizePinnedFfmpeg = memoizePinnedFfmpeg;
79314
+ exports.mergeSecretStatePaths = require_sleep.mergeSecretStatePaths;
77472
79315
  exports.mergeSettingsBags = mergeSettingsBags;
77473
79316
  exports.mergeSourceInfo = mergeSourceInfo;
77474
79317
  exports.meshNetworkCapability = meshNetworkCapability;
@@ -77495,6 +79338,7 @@ exports.ncAlarmSystemDefaultSettings = ncAlarmSystemDefaultSettings;
77495
79338
  exports.networkAccessCapability = networkAccessCapability;
77496
79339
  exports.networkLinkCapability = networkLinkCapability;
77497
79340
  exports.networkQualityCapability = networkQualityCapability;
79341
+ exports.nodeBenchmarkRefusals = nodeBenchmarkRefusals;
77498
79342
  exports.nodePickerItems = nodePickerItems;
77499
79343
  exports.nodePin = require_sleep.nodePin;
77500
79344
  exports.nodesCapability = nodesCapability;
@@ -77502,6 +79346,7 @@ exports.normalizeAddonInitResult = require_sleep.normalizeAddonInitResult;
77502
79346
  exports.normalizeAudioLabel = normalizeAudioLabel;
77503
79347
  exports.normalizeCoreBlockWrite = normalizeCoreBlockWrite;
77504
79348
  exports.normalizeNodeId = require_sleep.normalizeNodeId;
79349
+ exports.normalizeSecretOwner = require_sleep.normalizeSecretOwner;
77505
79350
  exports.normalizeTokenScopes = normalizeTokenScopes;
77506
79351
  exports.normalizeUnit = normalizeUnit;
77507
79352
  exports.notificationOutputCapability = notificationOutputCapability;
@@ -77529,6 +79374,8 @@ exports.parseOccupancyScope = parseOccupancyScope;
77529
79374
  exports.parseProcStatus = parseProcStatus;
77530
79375
  exports.parseProfileBrokerId = require_sleep.parseProfileBrokerId;
77531
79376
  exports.parseRuleSection = parseRuleSection;
79377
+ exports.parseSecretRef = require_sleep.parseSecretRef;
79378
+ exports.parseSecretStatePath = require_sleep.parseSecretStatePath;
77532
79379
  exports.parseSessionPlacementPolicy = parseSessionPlacementPolicy;
77533
79380
  exports.parseShareSource = parseShareSource;
77534
79381
  exports.parseStreamParamsFormPatch = parseStreamParamsFormPatch;
@@ -77546,6 +79393,7 @@ exports.pickRestartCandidate = pickRestartCandidate;
77546
79393
  exports.pickVideoEncoder = require_composition.pickVideoEncoder;
77547
79394
  exports.pickerForCondition = pickerForCondition;
77548
79395
  exports.pickerForRuleClasses = pickerForRuleClasses;
79396
+ exports.pinUnderBenchmark = pinUnderBenchmark;
77549
79397
  exports.pipelineAnalyticsCapability = pipelineAnalyticsCapability;
77550
79398
  exports.pipelineExecutorCapability = pipelineExecutorCapability;
77551
79399
  exports.pipelineOrchestratorCapability = pipelineOrchestratorCapability;
@@ -77591,6 +79439,7 @@ exports.recordingOnboardCapability = recordingOnboardCapability;
77591
79439
  exports.recordingSignalCapability = recordingSignalCapability;
77592
79440
  exports.rectsToCells = rectsToCells;
77593
79441
  exports.reducePoints = reducePoints;
79442
+ exports.registerKnownSecret = require_sleep.registerKnownSecret;
77594
79443
  exports.renameAlarmProfile = renameAlarmProfile;
77595
79444
  exports.replacedFieldKeys = replacedFieldKeys;
77596
79445
  exports.requiredTopLevelKeys = requiredTopLevelKeys;
@@ -77611,6 +79460,7 @@ exports.resolveCoreBlockFiles = resolveCoreBlockFiles;
77611
79460
  exports.resolveCreateExportSubject = resolveCreateExportSubject;
77612
79461
  exports.resolveDeviceControlKind = resolveDeviceControlKind;
77613
79462
  exports.resolveDeviceProfile = resolveDeviceProfile;
79463
+ exports.resolveDisplayIconKey = resolveDisplayIconKey;
77614
79464
  exports.resolveEffectiveShares = resolveEffectiveShares;
77615
79465
  exports.resolveEgressDecodeHwAccel = resolveEgressDecodeHwAccel;
77616
79466
  exports.resolveExportProfiles = resolveExportProfiles;
@@ -77631,9 +79481,13 @@ exports.resolvePublicEndpoint = resolvePublicEndpoint;
77631
79481
  exports.resolveRecordingProfiles = resolveRecordingProfiles;
77632
79482
  exports.resolveRootSupply = resolveRootSupply;
77633
79483
  exports.resolveRunnerId = resolveRunnerId;
79484
+ exports.resolveSecretMarkers = require_sleep.resolveSecretMarkers;
79485
+ exports.resolveSecretViewsIn = require_sleep.resolveSecretViewsIn;
77634
79486
  exports.resolveStreamMaps = require_composition.resolveStreamMaps;
77635
79487
  exports.resolveVariantModelId = resolveVariantModelId;
77636
79488
  exports.resolveViewableDeviceIds = resolveViewableDeviceIds;
79489
+ exports.resultCellKey = resultCellKey;
79490
+ exports.resultStandings = resultStandings;
77637
79491
  exports.roleSpec = roleSpec;
77638
79492
  exports.roomCompositionExample = roomCompositionExample;
77639
79493
  exports.rootSuppliesOf = rootSuppliesOf;
@@ -77657,14 +79511,17 @@ exports.runtimeStatePolicyFor = runtimeStatePolicyFor;
77657
79511
  exports.sameDoFamily = sameDoFamily;
77658
79512
  exports.sceneMonitorCapability = sceneMonitorCapability;
77659
79513
  exports.scheduleForSendTimes = scheduleForSendTimes;
77660
- exports.schemaDeclaresAnyField = schemaDeclaresAnyField;
79514
+ exports.schemaDeclaresAnyField = require_sleep.schemaDeclaresAnyField;
77661
79515
  exports.scopeInherits = scopeInherits;
77662
79516
  exports.scopeKey = require_sleep.scopeKey;
77663
79517
  exports.scopesAllowAddon = scopesAllowAddon;
77664
79518
  exports.scopesAllowDeviceCap = scopesAllowDeviceCap;
77665
79519
  exports.scoreRuntimes = scoreRuntimes;
77666
79520
  exports.scriptRunnerCapability = scriptRunnerCapability;
79521
+ exports.scrubKnownSecrets = require_sleep.scrubKnownSecrets;
77667
79522
  exports.searchDisplayIcons = searchDisplayIcons;
79523
+ exports.secretTreeFromPaths = require_sleep.secretTreeFromPaths;
79524
+ exports.secretTreeFromSchema = require_sleep.secretTreeFromSchema;
77668
79525
  exports.secureActuationFor = secureActuationFor;
77669
79526
  exports.selectAppConnectionEndpoints = selectAppConnectionEndpoints;
77670
79527
  exports.selectAssignedProfileSlots = require_sleep.selectAssignedProfileSlots;
@@ -77679,6 +79536,7 @@ exports.setByPath = setByPath;
77679
79536
  exports.settingValuesEqual = settingValuesEqual;
77680
79537
  exports.settingsBelow = settingsBelow;
77681
79538
  exports.settingsStoreCapability = settingsStoreCapability;
79539
+ exports.shortSecretRefHash = require_sleep.shortSecretRefHash;
77682
79540
  exports.signalPercentFromBars = signalPercentFromBars;
77683
79541
  exports.signalPercentFromRssi = signalPercentFromRssi;
77684
79542
  exports.siteZoneKey = siteZoneKey;
@@ -77747,11 +79605,13 @@ exports.toDeviceSummary = toDeviceSummary;
77747
79605
  exports.toExpressionValue = require_composition.toExpressionValue;
77748
79606
  exports.toNodeId = require_sleep.toNodeId;
77749
79607
  exports.toPercentShares = toPercentShares;
79608
+ exports.toSecretFieldView = require_sleep.toSecretFieldView;
77750
79609
  exports.toStreamSourceEntry = toStreamSourceEntry;
77751
79610
  exports.toastCapability = toastCapability;
77752
79611
  exports.toggleAudioLabel = toggleAudioLabel;
77753
79612
  exports.tokenize = require_composition.tokenize;
77754
79613
  exports.transcodeBody = transcodeBody;
79614
+ exports.transformSecretWrite = require_sleep.transformSecretWrite;
77755
79615
  exports.tryConvertUnit = tryConvertUnit;
77756
79616
  exports.turnProviderCapability = turnProviderCapability;
77757
79617
  exports.unitDimension = unitDimension;