@camstack/types 1.2.327 → 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 (71) 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 +1 -0
  6. package/dist/addon.js +52 -4
  7. package/dist/addon.mjs +27 -5
  8. package/dist/capabilities/addons.cap.d.ts +4 -4
  9. package/dist/capabilities/alerts.cap.d.ts +5 -5
  10. package/dist/capabilities/control.cap.d.ts +11 -11
  11. package/dist/capabilities/day-night.cap.d.ts +8 -8
  12. package/dist/capabilities/device-manager.cap.d.ts +2 -0
  13. package/dist/capabilities/enum-sensor.cap.d.ts +4 -4
  14. package/dist/capabilities/index.d.ts +6 -2
  15. package/dist/capabilities/integrations.cap.d.ts +6 -3
  16. package/dist/capabilities/keychain-admin.cap.d.ts +312 -0
  17. package/dist/capabilities/keychain.cap.d.ts +180 -0
  18. package/dist/capabilities/lawn-mower-control.cap.d.ts +4 -4
  19. package/dist/capabilities/log-channels.cap.d.ts +1 -1
  20. package/dist/capabilities/log-destination.cap.d.ts +5 -5
  21. package/dist/capabilities/notification-rules.cap.d.ts +30 -30
  22. package/dist/capabilities/osd-manager.cap.d.ts +11 -11
  23. package/dist/capabilities/osd.cap.d.ts +5 -5
  24. package/dist/capabilities/pipeline-analytics.cap.d.ts +996 -118
  25. package/dist/capabilities/pipeline-orchestrator.cap.d.ts +384 -0
  26. package/dist/capabilities/pipeline-runner.cap.d.ts +145 -2
  27. package/dist/capabilities/storage.cap.d.ts +1 -1
  28. package/dist/capabilities/system.cap.d.ts +16 -16
  29. package/dist/capabilities/webrtc-session.cap.d.ts +3 -3
  30. package/dist/client.js +32 -1
  31. package/dist/client.mjs +32 -1
  32. package/dist/device/device-context.d.ts +11 -1
  33. package/dist/device/index.d.ts +1 -1
  34. package/dist/enums/event-category.d.ts +7 -0
  35. package/dist/enums.js +1 -1
  36. package/dist/enums.mjs +1 -1
  37. package/dist/{event-category-CtBAl88K.js → event-category-CHduMGvg.js} +7 -0
  38. package/dist/{event-category-B_0XEcLF.mjs → event-category-DaIZi00R.mjs} +7 -0
  39. package/dist/generated/addon-api.d.ts +254 -0
  40. package/dist/generated/cap-input-defaults.d.ts +1 -1
  41. package/dist/generated/capability-router-map.d.ts +8 -2
  42. package/dist/generated/method-access-map.d.ts +1 -1
  43. package/dist/generated/method-device-selectors.d.ts +1 -1
  44. package/dist/generated/system-proxy.d.ts +4 -2
  45. package/dist/health/wiring-health.d.ts +8 -8
  46. package/dist/index.d.ts +6 -2
  47. package/dist/index.js +1736 -101
  48. package/dist/index.mjs +1625 -98
  49. package/dist/interfaces/addon.d.ts +25 -0
  50. package/dist/interfaces/config-ui-secrets.d.ts +12 -0
  51. package/dist/interfaces/config-ui.d.ts +29 -1
  52. package/dist/interfaces/event-bus.d.ts +11 -0
  53. package/dist/interfaces/pipeline-runner-capability.d.ts +18 -0
  54. package/dist/keychain/index.d.ts +5 -0
  55. package/dist/keychain/known-secrets.d.ts +31 -0
  56. package/dist/keychain/resolve-secret-views.d.ts +2 -0
  57. package/dist/keychain/secret-marker.d.ts +52 -0
  58. package/dist/keychain/secret-ref.d.ts +62 -0
  59. package/dist/keychain/secrets-access.d.ts +77 -0
  60. package/dist/logging/log-channel.d.ts +2 -2
  61. package/dist/pipeline/auto-tune/plan-schemas.d.ts +123 -0
  62. package/dist/pipeline/auto-tune/recommend.d.ts +26 -1
  63. package/dist/pipeline/load-balancing/schemas.d.ts +8 -7
  64. package/dist/pipeline/node-benchmark/benchmark-mode.d.ts +57 -0
  65. package/dist/pipeline/node-benchmark/index.d.ts +9 -0
  66. package/dist/pipeline/node-benchmark/results.d.ts +52 -0
  67. package/dist/pipeline/node-benchmark/schemas.d.ts +848 -0
  68. package/dist/pipeline/node-benchmark/step-tree.d.ts +23 -0
  69. package/dist/{sleep-B0JG7-_F.mjs → sleep-Cr5YOk3m.mjs} +1335 -121
  70. package/dist/{sleep-az1qiFzK.js → sleep-i3kl-0Na.js} +1575 -121
  71. 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-az1qiFzK.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
@@ -14319,7 +14527,11 @@ var DeviceRegisterPayloadSchema = zod.z.object({
14319
14527
  var DeviceRemovePayloadSchema = zod.z.object({ deviceId: zod.z.number() });
14320
14528
  var DevicePersistConfigPayloadSchema = zod.z.object({
14321
14529
  deviceId: zod.z.number(),
14322
- 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()
14323
14535
  });
14324
14536
  /** What a migration actually did, per switch. `unreachable` is a first-class
14325
14537
  * answer: a camera that could not be asked is not a camera that was silenced. */
@@ -24706,8 +24918,23 @@ var RetrainMacroClassSchema = zod.z.enum([
24706
24918
  ]);
24707
24919
  /** A subject to learn, or a phantom to unlearn (taught by OMISSION). */
24708
24920
  var RetrainAnnotationKindSchema = zod.z.enum(["subject", "model_error"]);
24709
- /** Did a human draw this box, or did the assist propose it? */
24710
- 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
+ ]);
24711
24938
  /** Normalised `[0,1]` rectangle against the FULL frame — the canonical form. */
24712
24939
  var RetrainBboxSchema = zod.z.object({
24713
24940
  x: zod.z.number(),
@@ -24725,7 +24952,8 @@ var RetrainBboxSchema = zod.z.object({
24725
24952
  */
24726
24953
  var RetrainAnnotationSchema = zod.z.object({
24727
24954
  id: zod.z.string(),
24728
- trackId: zod.z.string(),
24955
+ /** The frame's track. Absent on a recording still, which has none. */
24956
+ trackId: zod.z.string().optional(),
24729
24957
  deviceId: zod.z.number(),
24730
24958
  /** The COPY in retrain storage — never the source track's media key. */
24731
24959
  mediaKey: zod.z.string(),
@@ -24774,13 +25002,47 @@ var RetrainFrameCandidateSchema = zod.z.object({
24774
25002
  * fail, whatever became of the original. */
24775
25003
  copied: zod.z.boolean()
24776
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"]);
24777
25034
  /** A frame the dataset OWNS: bytes copied at selection time. */
24778
25035
  var RetrainFrameSchema = zod.z.object({
24779
25036
  frameId: zod.z.string(),
24780
25037
  deviceId: zod.z.number(),
24781
- trackId: zod.z.string(),
24782
- /** Provenance only. It may already point at nothing — that is expected. */
24783
- 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(),
24784
25046
  sourceKind: MediaFileKindEnum,
24785
25047
  sizeBytes: zod.z.number().int(),
24786
25048
  width: zod.z.number().int(),
@@ -24791,7 +25053,12 @@ var RetrainFrameSchema = zod.z.object({
24791
25053
  /** The operator's "every subject in this frame is boxed". Detector
24792
25054
  * evaluation keeps only complete frames: an unboxed subject would count as
24793
25055
  * a false positive. */
24794
- complete: zod.z.boolean()
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()
24795
25062
  });
24796
25063
  /** Why a copy-on-select could not be honoured — named, never a silent skip. */
24797
25064
  var RetrainCopyRefusalSchema = zod.z.enum([
@@ -24822,6 +25089,8 @@ var RetrainFrameListSchema = zod.z.object({
24822
25089
  var RetrainExportFilterSchema = zod.z.object({
24823
25090
  deviceIds: zod.z.array(zod.z.number()).optional(),
24824
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(),
24825
25094
  batchId: zod.z.string().optional(),
24826
25095
  /** Only frames the operator marked complete (all subjects boxed). */
24827
25096
  completeOnly: zod.z.boolean().optional()
@@ -24886,6 +25155,109 @@ var RetrainAssistResultSchema = zod.z.discriminatedUnion("kind", [zod.z.object({
24886
25155
  reason: zod.z.string(),
24887
25156
  detail: zod.z.string().optional()
24888
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
+ })]);
24889
25261
  /** The outcome of a lifecycle move owned by the retrain page. */
24890
25262
  var RetrainTransitionResultSchema = zod.z.object({
24891
25263
  trackId: zod.z.string(),
@@ -26121,7 +26493,7 @@ var pipelineAnalyticsCapability = {
26121
26493
  * a frame leaves the dataset before export. */
26122
26494
  deselectRetrainFrame: require_sleep.method(zod.z.object({
26123
26495
  deviceId: zod.z.number(),
26124
- trackId: zod.z.string(),
26496
+ trackId: zod.z.string().optional(),
26125
26497
  frameId: zod.z.string()
26126
26498
  }), zod.z.object({
26127
26499
  removed: zod.z.boolean(),
@@ -26164,7 +26536,8 @@ var pipelineAnalyticsCapability = {
26164
26536
  */
26165
26537
  proposeRetrainAnnotations: require_sleep.method(zod.z.object({
26166
26538
  deviceId: zod.z.number(),
26167
- trackId: zod.z.string(),
26539
+ /** The frame's track, when it has one — checked against the frame. */
26540
+ trackId: zod.z.string().optional(),
26168
26541
  frameId: zod.z.string(),
26169
26542
  subject: RetrainAssistSubjectSchema,
26170
26543
  /** Which node runs it. Absent ⇒ wherever an unowned call lands. */
@@ -26173,8 +26546,12 @@ var pipelineAnalyticsCapability = {
26173
26546
  kind: "mutation",
26174
26547
  auth: "admin"
26175
26548
  }),
26176
- /** Every annotation on a track, oldest first. */
26177
- 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(), {
26178
26555
  kind: "query",
26179
26556
  auth: "admin"
26180
26557
  }),
@@ -26193,7 +26570,8 @@ var pipelineAnalyticsCapability = {
26193
26570
  */
26194
26571
  saveRetrainAnnotations: require_sleep.method(zod.z.object({
26195
26572
  deviceId: zod.z.number(),
26196
- trackId: zod.z.string(),
26573
+ /** The frame's track, when it has one — checked against the frame. */
26574
+ trackId: zod.z.string().optional(),
26197
26575
  frameId: zod.z.string(),
26198
26576
  annotations: zod.z.array(RetrainAnnotationDraftSchema)
26199
26577
  }), zod.z.array(RetrainAnnotationSchema).readonly(), {
@@ -26256,7 +26634,7 @@ var pipelineAnalyticsCapability = {
26256
26634
  */
26257
26635
  setRetrainFrameComplete: require_sleep.method(zod.z.object({
26258
26636
  deviceId: zod.z.number(),
26259
- trackId: zod.z.string(),
26637
+ trackId: zod.z.string().optional(),
26260
26638
  frameId: zod.z.string(),
26261
26639
  complete: zod.z.boolean()
26262
26640
  }), RetrainFrameSchema, {
@@ -26279,6 +26657,115 @@ var pipelineAnalyticsCapability = {
26279
26657
  auth: "admin",
26280
26658
  timeoutMs: 60 * 6e4
26281
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(), {
26766
+ kind: "query",
26767
+ auth: "admin"
26768
+ }),
26282
26769
  /**
26283
26770
  * The media an EVENT owns.
26284
26771
  *
@@ -27225,13 +27712,31 @@ var RecommendationReasonSchema = zod.z.discriminatedUnion("kind", [
27225
27712
  zod.z.object({
27226
27713
  kind: zod.z.literal("no-family-build"),
27227
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()
27228
27720
  })
27229
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
+ })]);
27230
27733
  var DeviceModelChoiceSchema = zod.z.object({
27231
27734
  modelId: zod.z.string(),
27232
27735
  p50Ms: zod.z.number(),
27233
27736
  fps: zod.z.number(),
27234
27737
  measured: zod.z.boolean(),
27738
+ /** Absent on a plan from before D791 — read as the table. */
27739
+ source: LatencySourceSchema.optional(),
27235
27740
  /** Parallel sessions at the camera rate with the headroom kept free: ⌊fps × (1 − headroom) / camera fps⌋. */
27236
27741
  capacitySessions: zod.z.number(),
27237
27742
  personRecall: zod.z.number()
@@ -27242,6 +27747,8 @@ var DeviceRecommendationSchema = zod.z.object({
27242
27747
  enabled: zod.z.boolean(),
27243
27748
  available: zod.z.boolean(),
27244
27749
  chosen: DeviceModelChoiceSchema.nullable(),
27750
+ /** Present when the device is kept as is: Apply writes nothing on it. */
27751
+ kept: KeptReasonSchema.optional(),
27245
27752
  reasons: zod.z.array(RecommendationReasonSchema).readonly()
27246
27753
  });
27247
27754
  var NodeRecommendationSchema = zod.z.object({
@@ -27295,6 +27802,17 @@ var AutoTuneWarningSchema = zod.z.discriminatedUnion("kind", [
27295
27802
  kind: zod.z.literal("coral-enabled"),
27296
27803
  nodeId: zod.z.string(),
27297
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()
27298
27816
  })
27299
27817
  ]);
27300
27818
  var AutoTuneOptionsSchema = zod.z.object({
@@ -27487,13 +28005,14 @@ var SuggestSharesResultSchema = zod.z.object({
27487
28005
  nodes: zod.z.array(SuggestedNodeShareSchema).readonly()
27488
28006
  });
27489
28007
  /**
27490
- * Where the node and device shares come from (D750, D755).
27491
- * - `hardware` (default) — computed by the system from each node's static
27492
- * capacity (its accelerators at their Auto tune models, from the measured
27493
- * latency table), recomputed whenever a node or device joins, leaves, is
27494
- * switched on or off, or changes model. No load input.
27495
- * - `benchmark` — the same, from each node's measured capacity (node
27496
- * 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.
27497
28016
  * - `manual` — the operator's stored sliders.
27498
28017
  * Either way a node or device that cannot take sessions gives its share to
27499
28018
  * the others in proportion; the stored values are never rewritten for that.
@@ -27503,7 +28022,7 @@ var ShareSourceSchema = zod.z.enum([
27503
28022
  "benchmark",
27504
28023
  "manual"
27505
28024
  ]);
27506
- var DEFAULT_SHARE_SOURCE = "hardware";
28025
+ var DEFAULT_SHARE_SOURCE = "benchmark";
27507
28026
  /** `hardware` or `benchmark`: the system computes the shares. */
27508
28027
  function isAutomaticShareSource(source) {
27509
28028
  return source !== "manual";
@@ -27517,6 +28036,7 @@ var SHARE_SOURCE_SETTING_KEY = "shareSource";
27517
28036
  * D755 split it) reads as `hardware` — that is what it computed.
27518
28037
  */
27519
28038
  function parseShareSource(value) {
28039
+ if (value === "auto") return "hardware";
27520
28040
  const parsed = ShareSourceSchema.safeParse(value);
27521
28041
  return parsed.success ? parsed.data : DEFAULT_SHARE_SOURCE;
27522
28042
  }
@@ -27561,6 +28081,371 @@ var EffectiveSharesSchema = zod.z.object({
27561
28081
  deviceWeights: zod.z.record(zod.z.string(), zod.z.record(zod.z.string(), zod.z.number()))
27562
28082
  });
27563
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
27564
28449
  //#region src/capabilities/schemas/orchestrator-metrics.ts
27565
28450
  /** Shared Zod schemas for the runtime pipeline orchestrator metrics. */
27566
28451
  var OrchestratorMetricsSchema = zod.z.object({
@@ -29078,7 +29963,30 @@ var pipelineRunnerCapability = {
29078
29963
  releaseParkedTrackFrames: require_sleep.method(zod.z.object({
29079
29964
  deviceId: zod.z.number(),
29080
29965
  trackId: zod.z.string()
29081
- }), 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
+ })
29082
29990
  }
29083
29991
  };
29084
29992
  //#endregion
@@ -30054,6 +30962,51 @@ var pipelineOrchestratorCapability = {
30054
30962
  kind: "mutation",
30055
30963
  auth: "admin"
30056
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
+ }),
30057
31010
  /** Read one camera's settings. Null when never touched (inherits agent defaults fully). */
30058
31011
  getCameraSettings: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), CameraPipelineSettingsSchema.nullable()),
30059
31012
  /** Set or clear the 3-state toggle for one (camera, addonId). Pass `enabled: null` to clear and revert to agent default. */
@@ -38162,6 +39115,9 @@ var CreateIntegrationInputSchema = zod.z.object({
38162
39115
  enabled: zod.z.boolean().optional(),
38163
39116
  info: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
38164
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(),
38165
39121
  skipRestart: zod.z.boolean().optional()
38166
39122
  });
38167
39123
  var UpdateIntegrationInputSchema = zod.z.object({
@@ -38197,7 +39153,9 @@ var integrationsCapability = {
38197
39153
  getSettings: require_sleep.method(zod.z.object({ id: zod.z.string() }), zod.z.record(zod.z.string(), zod.z.unknown()), { auth: "admin" }),
38198
39154
  setSettings: require_sleep.method(zod.z.object({
38199
39155
  id: zod.z.string(),
38200
- 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()
38201
39159
  }), zod.z.object({ success: zod.z.boolean() }), {
38202
39160
  kind: "mutation",
38203
39161
  auth: "admin"
@@ -49891,7 +50849,8 @@ var BaseDevice = class {
49891
50849
  this.role = options.role;
49892
50850
  this.parentDeviceId = ctx.parentDeviceId;
49893
50851
  const seedData = ctx.persistedConfig ?? {};
49894
- 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 }) => {
49895
50854
  ctx.logger.warn("Device config recovery: dropping invalid persisted fields", {
49896
50855
  tags: {
49897
50856
  deviceId: ctx.id,
@@ -54395,6 +55354,90 @@ var METHOD_ACCESS_MAP = Object.freeze({
54395
55354
  addonId: null,
54396
55355
  access: "create"
54397
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
+ },
54398
55441
  "lawnMowerControl.dock": {
54399
55442
  capName: "lawn-mower-control",
54400
55443
  capScope: "device",
@@ -55769,6 +56812,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
55769
56812
  addonId: null,
55770
56813
  access: "create"
55771
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
+ },
55772
56827
  "pipelineAnalytics.applyDeviceSettingsPatch": {
55773
56828
  capName: "pipeline-analytics",
55774
56829
  capScope: "device",
@@ -55817,12 +56872,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
55817
56872
  addonId: null,
55818
56873
  access: "view"
55819
56874
  },
56875
+ "pipelineAnalytics.createRetrainCollection": {
56876
+ capName: "pipeline-analytics",
56877
+ capScope: "device",
56878
+ addonId: null,
56879
+ access: "create"
56880
+ },
55820
56881
  "pipelineAnalytics.deleteDeviceEvents": {
55821
56882
  capName: "pipeline-analytics",
55822
56883
  capScope: "device",
55823
56884
  addonId: null,
55824
56885
  access: "delete"
55825
56886
  },
56887
+ "pipelineAnalytics.deleteRetrainCollection": {
56888
+ capName: "pipeline-analytics",
56889
+ capScope: "device",
56890
+ addonId: null,
56891
+ access: "delete"
56892
+ },
55826
56893
  "pipelineAnalytics.deleteTracks": {
55827
56894
  capName: "pipeline-analytics",
55828
56895
  capScope: "device",
@@ -56027,6 +57094,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
56027
57094
  addonId: null,
56028
57095
  access: "view"
56029
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
+ },
56030
57115
  "pipelineAnalytics.listRetrainFrames": {
56031
57116
  capName: "pipeline-analytics",
56032
57117
  capScope: "device",
@@ -56075,6 +57160,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56075
57160
  addonId: null,
56076
57161
  access: "create"
56077
57162
  },
57163
+ "pipelineAnalytics.proposeRetrainAnnotationsWithLlm": {
57164
+ capName: "pipeline-analytics",
57165
+ capScope: "device",
57166
+ addonId: null,
57167
+ access: "create"
57168
+ },
56078
57169
  "pipelineAnalytics.pruneEvents": {
56079
57170
  capName: "pipeline-analytics",
56080
57171
  capScope: "device",
@@ -56129,6 +57220,18 @@ var METHOD_ACCESS_MAP = Object.freeze({
56129
57220
  addonId: null,
56130
57221
  access: "create"
56131
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
+ },
56132
57235
  "pipelineAnalytics.restageRetrainTrack": {
56133
57236
  capName: "pipeline-analytics",
56134
57237
  capScope: "device",
@@ -56417,6 +57520,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56417
57520
  addonId: null,
56418
57521
  access: "view"
56419
57522
  },
57523
+ "pipelineOrchestrator.abortNodeBenchmark": {
57524
+ capName: "pipeline-orchestrator",
57525
+ capScope: "system",
57526
+ addonId: null,
57527
+ access: "create"
57528
+ },
56420
57529
  "pipelineOrchestrator.applyAutoTune": {
56421
57530
  capName: "pipeline-orchestrator",
56422
57531
  capScope: "system",
@@ -56441,6 +57550,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56441
57550
  addonId: null,
56442
57551
  access: "create"
56443
57552
  },
57553
+ "pipelineOrchestrator.deleteNodeBenchmarkResult": {
57554
+ capName: "pipeline-orchestrator",
57555
+ capScope: "system",
57556
+ addonId: null,
57557
+ access: "delete"
57558
+ },
56444
57559
  "pipelineOrchestrator.getAgentLoad": {
56445
57560
  capName: "pipeline-orchestrator",
56446
57561
  capScope: "system",
@@ -56549,6 +57664,24 @@ var METHOD_ACCESS_MAP = Object.freeze({
56549
57664
  addonId: null,
56550
57665
  access: "view"
56551
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
+ },
56552
57685
  "pipelineOrchestrator.getNodeInferenceDevices": {
56553
57686
  capName: "pipeline-orchestrator",
56554
57687
  capScope: "system",
@@ -56591,6 +57724,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56591
57724
  addonId: null,
56592
57725
  access: "view"
56593
57726
  },
57727
+ "pipelineOrchestrator.listNodeBenchmarkResults": {
57728
+ capName: "pipeline-orchestrator",
57729
+ capScope: "system",
57730
+ addonId: null,
57731
+ access: "view"
57732
+ },
56594
57733
  "pipelineOrchestrator.pauseForStorageMigration": {
56595
57734
  capName: "pipeline-orchestrator",
56596
57735
  capScope: "system",
@@ -56735,6 +57874,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56735
57874
  addonId: null,
56736
57875
  access: "create"
56737
57876
  },
57877
+ "pipelineOrchestrator.startNodeBenchmark": {
57878
+ capName: "pipeline-orchestrator",
57879
+ capScope: "system",
57880
+ addonId: null,
57881
+ access: "create"
57882
+ },
56738
57883
  "pipelineOrchestrator.suggestShares": {
56739
57884
  capName: "pipeline-orchestrator",
56740
57885
  capScope: "system",
@@ -56753,6 +57898,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56753
57898
  addonId: null,
56754
57899
  access: "create"
56755
57900
  },
57901
+ "pipelineRunner.abortNodeBench": {
57902
+ capName: "pipeline-runner",
57903
+ capScope: "system",
57904
+ addonId: null,
57905
+ access: "create"
57906
+ },
56756
57907
  "pipelineRunner.attachCamera": {
56757
57908
  capName: "pipeline-runner",
56758
57909
  capScope: "system",
@@ -56801,6 +57952,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56801
57952
  addonId: null,
56802
57953
  access: "view"
56803
57954
  },
57955
+ "pipelineRunner.getNodeBenchStatus": {
57956
+ capName: "pipeline-runner",
57957
+ capScope: "system",
57958
+ addonId: null,
57959
+ access: "view"
57960
+ },
56804
57961
  "pipelineRunner.getParkedTrackFrame": {
56805
57962
  capName: "pipeline-runner",
56806
57963
  capScope: "system",
@@ -56843,6 +58000,12 @@ var METHOD_ACCESS_MAP = Object.freeze({
56843
58000
  addonId: null,
56844
58001
  access: "create"
56845
58002
  },
58003
+ "pipelineRunner.startNodeBench": {
58004
+ capName: "pipeline-runner",
58005
+ capScope: "system",
58006
+ addonId: null,
58007
+ access: "create"
58008
+ },
56846
58009
  "plateGallery.assignPlate": {
56847
58010
  capName: "plate-gallery",
56848
58011
  capScope: "system",
@@ -59189,6 +60352,8 @@ var KNOWN_CAP_NAMES = [
59189
60352
  "image-settings",
59190
60353
  "integrations",
59191
60354
  "intercom",
60355
+ "keychain",
60356
+ "keychain-admin",
59192
60357
  "lawn-mower-control",
59193
60358
  "llm",
59194
60359
  "llm-runtime",
@@ -59406,6 +60571,8 @@ var SYSTEM_CAP_NAMES = [
59406
60571
  "failure-contribution",
59407
60572
  "filesystem-browse",
59408
60573
  "integrations",
60574
+ "keychain",
60575
+ "keychain-admin",
59409
60576
  "llm",
59410
60577
  "llm-runtime",
59411
60578
  "load-contribution",
@@ -62875,6 +64042,8 @@ var CAPABILITY_NAMES = {
62875
64042
  imageSettings: "image-settings",
62876
64043
  integrations: "integrations",
62877
64044
  intercom: "intercom",
64045
+ keychain: "keychain",
64046
+ keychainAdmin: "keychain-admin",
62878
64047
  lawnMowerControl: "lawn-mower-control",
62879
64048
  llm: "llm",
62880
64049
  llmRuntime: "llm-runtime",
@@ -63268,6 +64437,14 @@ var CAPABILITY_ROUTER_KEYS = [
63268
64437
  key: "intercom",
63269
64438
  name: "intercom"
63270
64439
  },
64440
+ {
64441
+ key: "keychain",
64442
+ name: "keychain"
64443
+ },
64444
+ {
64445
+ key: "keychainAdmin",
64446
+ name: "keychain-admin"
64447
+ },
63271
64448
  {
63272
64449
  key: "lawnMowerControl",
63273
64450
  name: "lawn-mower-control"
@@ -63714,6 +64891,8 @@ var ALL_CAPABILITY_DEFINITIONS = [
63714
64891
  imageSettingsCapability,
63715
64892
  integrationsCapability,
63716
64893
  intercomCapability,
64894
+ keychainCapability,
64895
+ keychainAdminCapability,
63717
64896
  lawnMowerControlCapability,
63718
64897
  llmCapability,
63719
64898
  llmRuntimeCapability,
@@ -65142,6 +66321,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
65142
66321
  form: "single",
65143
66322
  optional: false
65144
66323
  }],
66324
+ "pipelineAnalytics.addRetrainFrameFromRecording": [{
66325
+ name: "deviceId",
66326
+ form: "single",
66327
+ optional: false
66328
+ }],
65145
66329
  "pipelineAnalytics.applyDeviceSettingsPatch": [{
65146
66330
  name: "deviceId",
65147
66331
  form: "single",
@@ -65332,6 +66516,11 @@ var METHOD_DEVICE_SELECTORS = Object.freeze({
65332
66516
  form: "single",
65333
66517
  optional: false
65334
66518
  }],
66519
+ "pipelineAnalytics.proposeRetrainAnnotationsWithLlm": [{
66520
+ name: "deviceId",
66521
+ form: "single",
66522
+ optional: false
66523
+ }],
65335
66524
  "pipelineAnalytics.pruneEventsBefore": [{
65336
66525
  name: "deviceId",
65337
66526
  form: "single",
@@ -67297,6 +68486,17 @@ function createSystemProxy(api) {
67297
68486
  getAvailableTypes: (input) => dispatch("integrations", "getAvailableTypes", "query", input),
67298
68487
  testConnection: (input) => dispatch("integrations", "testConnection", "mutation", input)
67299
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
+ },
67300
68500
  llm: {
67301
68501
  generate: (input) => dispatch("llm", "generate", "mutation", input),
67302
68502
  generateVision: (input) => dispatch("llm", "generateVision", "mutation", input),
@@ -67516,6 +68716,13 @@ function createSystemProxy(api) {
67516
68716
  suggestShares: (input) => dispatch("pipelineOrchestrator", "suggestShares", "query", input),
67517
68717
  getEffectiveShares: (input) => dispatch("pipelineOrchestrator", "getEffectiveShares", "query", input),
67518
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),
67519
68726
  getCameraStatuses: (input) => dispatch("pipelineOrchestrator", "getCameraStatuses", "query", input),
67520
68727
  setCameraSensors: (input) => dispatch("pipelineOrchestrator", "setCameraSensors", "mutation", input),
67521
68728
  reconcileFromDisk: (input) => dispatch("pipelineOrchestrator", "reconcileFromDisk", "mutation", input),
@@ -67529,7 +68736,10 @@ function createSystemProxy(api) {
67529
68736
  getAllCameraMetrics: (input) => dispatch("pipelineRunner", "getAllCameraMetrics", "query", input),
67530
68737
  getLocalCameras: (input) => dispatch("pipelineRunner", "getLocalCameras", "query", input),
67531
68738
  getNativeCrop: (input) => dispatch("pipelineRunner", "getNativeCrop", "query", input),
67532
- 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)
67533
68743
  },
67534
68744
  plateGallery: {
67535
68745
  getPlateMedia: (input) => dispatch("plateGallery", "getPlateMedia", "query", input),
@@ -73116,6 +74326,22 @@ function capacitySessionsOf(fps, headroom, cameraFps) {
73116
74326
  if (!(fps > 0) || !(cameraFps > 0)) return 0;
73117
74327
  return Math.max(0, Math.floor(fps * (1 - headroom) / cameraFps + 1e-9));
73118
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
+ }
73119
74345
  function round(value, digits = 3) {
73120
74346
  const f = 10 ** digits;
73121
74347
  return Math.round(value * f) / f;
@@ -73188,6 +74414,7 @@ function choiceOn(ctx, modelId, sizing) {
73188
74414
  p50Ms: cell.p50Ms,
73189
74415
  fps: cell.fps,
73190
74416
  measured: cell.measured,
74417
+ source: cell.source ?? { kind: "table" },
73191
74418
  capacitySessions: sessionsOn(cell, sizing),
73192
74419
  personRecall: DETECTOR_ACCURACY[modelId]?.personRecall ?? 0
73193
74420
  };
@@ -73236,11 +74463,14 @@ function recommendNode(input) {
73236
74463
  if (node.hardware === null) return skippedNode(node, { kind: "no-hardware-facts" }, null);
73237
74464
  const hardware = node.hardware;
73238
74465
  const { hardwareClass, cpuModel } = classifyInferenceHardware(hardware);
73239
- const classTable = perf[hardwareClass];
73240
- 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, {
73241
74470
  kind: "no-measured-data",
73242
74471
  hardwareClass
73243
74472
  }, hardwareClass);
74473
+ const classTable = knownTable ?? {};
73244
74474
  const devices = node.devices.toSorted((a, b) => a.key.localeCompare(b.key));
73245
74475
  const contexts = /* @__PURE__ */ new Map();
73246
74476
  const early = /* @__PURE__ */ new Map();
@@ -73258,7 +74488,7 @@ function recommendNode(input) {
73258
74488
  early.set(device.key, [{ kind: "device-unavailable" }]);
73259
74489
  continue;
73260
74490
  }
73261
- const column = accelerator === null ? void 0 : classTable[accelerator];
74491
+ const column = accelerator === null ? void 0 : overlayMeasured(classTable[accelerator], measured[device.key]);
73262
74492
  if (accelerator === null || column === void 0) {
73263
74493
  early.set(device.key, [{
73264
74494
  kind: "no-family-build",
@@ -73273,13 +74503,28 @@ function recommendNode(input) {
73273
74503
  });
73274
74504
  }
73275
74505
  const isCpu = (a) => a === "x86-cpu" || a === "arm-cpu";
73276
- const accelerators = [...contexts.values()].filter((c) => !isCpu(c.accelerator));
73277
- 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);
73278
74522
  const chosenByKey = /* @__PURE__ */ new Map();
73279
74523
  const reasonsByKey = /* @__PURE__ */ new Map();
73280
74524
  const nodeReasons = [];
73281
74525
  let acceleratorModelId = null;
73282
74526
  const groupPick = accelerators.length > 0 ? pickForGroup(accelerators, node.formatsByModel, sizing) : null;
74527
+ if (acceleratorKept !== null) nodeReasons.push(acceleratorKept);
73283
74528
  if (groupPick !== null) {
73284
74529
  acceleratorModelId = groupPick.modelId;
73285
74530
  nodeReasons.push(...groupPick.reasons);
@@ -73323,7 +74568,8 @@ function recommendNode(input) {
73323
74568
  enabled: device.enabled,
73324
74569
  available: device.available,
73325
74570
  chosen: chosenByKey.get(device.key) ?? null,
73326
- 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) ?? []
73327
74573
  })),
73328
74574
  reasons: nodeReasons
73329
74575
  };
@@ -73573,6 +74819,287 @@ function computeCapacityShares(input) {
73573
74819
  };
73574
74820
  }
73575
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
73576
75103
  //#region src/pipeline/root-face-crop.ts
73577
75104
  /** Side of the square, as a multiple of the face box's longer side. */
73578
75105
  var ROOT_FACE_REFINE_SCALE = 1.6;
@@ -75723,6 +77250,7 @@ exports.AcceleratorKindSchema = AcceleratorKindSchema;
75723
77250
  exports.AccessoriesStatusSchema = AccessoriesStatusSchema;
75724
77251
  exports.AccessoryKind = AccessoryKind;
75725
77252
  exports.AddBrokerInputSchema = AddBrokerInputSchema;
77253
+ exports.AddRetrainFrameFromRecordingResultSchema = AddRetrainFrameFromRecordingResultSchema;
75726
77254
  exports.AddonAutoUpdateSchema = AddonAutoUpdateSchema;
75727
77255
  exports.AddonListItemSchema = AddonListItemSchema;
75728
77256
  exports.AddonPageDeclarationSchema = AddonPageDeclarationSchema;
@@ -75804,6 +77332,7 @@ exports.BASE_DEVICE_CAPS = BASE_DEVICE_CAPS;
75804
77332
  exports.BASE_LIVE_EGRESS_PROFILE = BASE_LIVE_EGRESS_PROFILE;
75805
77333
  exports.BATTERY_DEVICE_PROFILE = BATTERY_DEVICE_PROFILE;
75806
77334
  exports.BATTERY_UNREACHABLE_AFTER_MS = BATTERY_UNREACHABLE_AFTER_MS;
77335
+ exports.BENCH_ROOT_STEP_ID = BENCH_ROOT_STEP_ID;
75807
77336
  exports.BIRTH_DECISION_DEFAULT_LIMIT = BIRTH_DECISION_DEFAULT_LIMIT;
75808
77337
  exports.BOOT_RECOVERY_BACKOFF_MS = require_sleep.BOOT_RECOVERY_BACKOFF_MS;
75809
77338
  exports.BUILTIN_RESULT_KINDS = BUILTIN_RESULT_KINDS;
@@ -76112,6 +77641,7 @@ exports.DEVICE_CAP_NAMES = DEVICE_CAP_NAMES;
76112
77641
  exports.DEVICE_CHILDREN_BATCH_MAX = require_sleep.DEVICE_CHILDREN_BATCH_MAX;
76113
77642
  exports.DEVICE_DO_ACTIONS = DEVICE_DO_ACTIONS;
76114
77643
  exports.DEVICE_PROFILES = DEVICE_PROFILES;
77644
+ exports.DEVICE_RAMP = DEVICE_RAMP;
76115
77645
  exports.DEVICE_RESTORE_RETRY_CONCURRENCY = DEVICE_RESTORE_RETRY_CONCURRENCY;
76116
77646
  exports.DEVICE_RESTORE_RETRY_DELAYS_MS = DEVICE_RESTORE_RETRY_DELAYS_MS;
76117
77647
  exports.DEVICE_SCOPED_CAPS = require_sleep.DEVICE_SCOPED_CAPS;
@@ -76334,8 +77864,24 @@ exports.IntegrationLiteSchema = IntegrationLiteSchema;
76334
77864
  exports.IntegrationWithStateSchema = IntegrationWithStateSchema;
76335
77865
  exports.IntercomAbilitySchema = IntercomAbilitySchema;
76336
77866
  exports.IntercomStatusSchema = IntercomStatusSchema;
77867
+ exports.KEYCHAIN_MAX_REFS_PER_CALL = KEYCHAIN_MAX_REFS_PER_CALL;
77868
+ exports.KEYCHAIN_RESET_CONFIRMATION = KEYCHAIN_RESET_CONFIRMATION;
76337
77869
  exports.KNOWN_CAP_NAMES = KNOWN_CAP_NAMES;
77870
+ exports.KeptReasonSchema = KeptReasonSchema;
76338
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;
76339
77885
  exports.LABEL_SUPPLY_MACRO = LABEL_SUPPLY_MACRO;
76340
77886
  exports.LABEL_SUPPLY_STEP_IDS = LABEL_SUPPLY_STEP_IDS;
76341
77887
  exports.LABEL_SUPPLY_VOCABULARIES = LABEL_SUPPLY_VOCABULARIES;
@@ -76353,6 +77899,7 @@ exports.LTS_SCOPE_CLASS_SEPARATOR = LTS_SCOPE_CLASS_SEPARATOR;
76353
77899
  exports.LabelAttributionSchema = LabelAttributionSchema;
76354
77900
  exports.LabelDefinitionSchema = LabelDefinitionSchema;
76355
77901
  exports.LabelTierSchema = LabelTierSchema;
77902
+ exports.LatencySourceSchema = LatencySourceSchema;
76356
77903
  exports.LawnMowerActivitySchema = LawnMowerActivitySchema;
76357
77904
  exports.LawnMowerControlStatusSchema = LawnMowerControlStatusSchema;
76358
77905
  exports.LedgerWalkDeviceReportSchema = LedgerWalkDeviceReportSchema;
@@ -76365,6 +77912,7 @@ exports.LegacyStorageLocationDefaultSchema = LegacyStorageLocationDefaultSchema;
76365
77912
  exports.LinkedDeviceSchema = LinkedDeviceSchema;
76366
77913
  exports.LinkedDevicesModeSchema = LinkedDevicesModeSchema;
76367
77914
  exports.LinkedDevicesSlotValueSchema = LinkedDevicesSlotValueSchema;
77915
+ exports.ListNodeBenchmarkResultsInputSchema = ListNodeBenchmarkResultsInputSchema;
76368
77916
  exports.ListTrackRelationsInputSchema = ListTrackRelationsInputSchema;
76369
77917
  exports.ListTrackRelationsResultSchema = ListTrackRelationsResultSchema;
76370
77918
  exports.LlmDefaultSchema = LlmDefaultSchema;
@@ -76452,6 +78000,7 @@ exports.MEDIA_PRESENCE_OWNER_KINDS = MEDIA_PRESENCE_OWNER_KINDS;
76452
78000
  exports.METHOD_ACCESS_MAP = METHOD_ACCESS_MAP;
76453
78001
  exports.METHOD_DEVICE_SELECTORS = METHOD_DEVICE_SELECTORS;
76454
78002
  exports.MINUTES_PER_DAY = MINUTES_PER_DAY;
78003
+ exports.MIN_SCRUBBED_LENGTH = require_sleep.MIN_SCRUBBED_LENGTH;
76455
78004
  exports.MIN_SESSIONS_PER_DEVICE_RANGE = MIN_SESSIONS_PER_DEVICE_RANGE;
76456
78005
  exports.MODEL_FORMATS = MODEL_FORMATS;
76457
78006
  exports.MODEL_HOSTING = MODEL_HOSTING;
@@ -76615,6 +78164,7 @@ exports.NC_TEMPLATE_VARS = NC_TEMPLATE_VARS;
76615
78164
  exports.NC_UPDATE_EVENT_PACKAGE_NAMES = NC_UPDATE_EVENT_PACKAGE_NAMES;
76616
78165
  exports.NETWORK_LINK_TYPES = NETWORK_LINK_TYPES;
76617
78166
  exports.NETWORK_LINK_UNKNOWN = NETWORK_LINK_UNKNOWN;
78167
+ exports.NODE_BENCHMARK_DEFAULTS = NODE_BENCHMARK_DEFAULTS;
76618
78168
  exports.NO_MEASURED_CAPACITY = NO_MEASURED_CAPACITY;
76619
78169
  exports.NativeCropBboxSchema = NativeCropBboxSchema;
76620
78170
  exports.NativeCropRefSchema = NativeCropRefSchema;
@@ -76736,6 +78286,33 @@ exports.NetworkAccessStatusSchema = NetworkAccessStatusSchema;
76736
78286
  exports.NetworkAddressSchema = NetworkAddressSchema;
76737
78287
  exports.NetworkEndpointSchema = NetworkEndpointSchema;
76738
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;
76739
78316
  exports.NodeDeviceChangeSchema = NodeDeviceChangeSchema;
76740
78317
  exports.NodeDirectoryEntrySchema = NodeDirectoryEntrySchema;
76741
78318
  exports.NodeDirectorySchema = NodeDirectorySchema;
@@ -76796,6 +78373,7 @@ exports.PET_FEEDER_MANUAL_FEED_MIN = PET_FEEDER_MANUAL_FEED_MIN;
76796
78373
  exports.PIPELINE_ANALYTICS_CAP_NAME = PIPELINE_ANALYTICS_CAP_NAME;
76797
78374
  exports.PIPELINE_FLOW_CAPABILITY_NAMES = PIPELINE_FLOW_CAPABILITY_NAMES;
76798
78375
  exports.PIPELINE_OWNER_CAPABILITY_NAMES = PIPELINE_OWNER_CAPABILITY_NAMES;
78376
+ exports.PIPELINE_RAMP = PIPELINE_RAMP;
76799
78377
  exports.PRIVACY_MASK_CAP_NAME = PRIVACY_MASK_CAP_NAME;
76800
78378
  exports.PROVIDER_KIND_CAP_NAMES = PROVIDER_KIND_CAP_NAMES;
76801
78379
  exports.PROVIDER_PIN_FIELD = require_sleep.PROVIDER_PIN_FIELD;
@@ -76872,11 +78450,12 @@ exports.RECORDING_EXPORT_MAX_READ_BYTES = RECORDING_EXPORT_MAX_READ_BYTES;
76872
78450
  exports.RECORDING_SOURCE_CAMSTACK = RECORDING_SOURCE_CAMSTACK;
76873
78451
  exports.RECORDING_SOURCE_CAMSTACK_ADDON = RECORDING_SOURCE_CAMSTACK_ADDON;
76874
78452
  exports.RECORDING_TIMELINE_BATCH_MAX = RECORDING_TIMELINE_BATCH_MAX;
76875
- exports.REDACTED_SECRET = REDACTED_SECRET;
78453
+ exports.REDACTED_SECRET = require_sleep.REDACTED_SECRET;
76876
78454
  exports.REMOVED_MODEL_IDS = REMOVED_MODEL_IDS;
76877
78455
  exports.RESERVED_BINDING_NAMES = require_composition.RESERVED_BINDING_NAMES;
76878
78456
  exports.RESERVED_COLLECTION_SOURCES = RESERVED_COLLECTION_SOURCES;
76879
78457
  exports.RESTORED_CAP_NAMES = RESTORED_CAP_NAMES;
78458
+ exports.REVALIDATE_AFTER_MS = require_sleep.REVALIDATE_AFTER_MS;
76880
78459
  exports.ROOM_EXAMPLE_MOTION_SOURCES = ROOM_EXAMPLE_MOTION_SOURCES;
76881
78460
  exports.ROOM_EXAMPLE_TEMPERATURE_SOURCES = ROOM_EXAMPLE_TEMPERATURE_SOURCES;
76882
78461
  exports.ROOM_OCCUPANCY_WINDOW_MS = ROOM_OCCUPANCY_WINDOW_MS;
@@ -76960,16 +78539,25 @@ exports.RetrainAnnotationSchema = RetrainAnnotationSchema;
76960
78539
  exports.RetrainAnnotationSourceSchema = RetrainAnnotationSourceSchema;
76961
78540
  exports.RetrainArchiveResultSchema = RetrainArchiveResultSchema;
76962
78541
  exports.RetrainArchiveTargetSchema = RetrainArchiveTargetSchema;
78542
+ exports.RetrainAssistProfileSchema = RetrainAssistProfileSchema;
76963
78543
  exports.RetrainAssistResultSchema = RetrainAssistResultSchema;
76964
78544
  exports.RetrainAssistSubjectSchema = RetrainAssistSubjectSchema;
78545
+ exports.RetrainCollectionCreateResultSchema = RetrainCollectionCreateResultSchema;
78546
+ exports.RetrainCollectionRenameResultSchema = RetrainCollectionRenameResultSchema;
78547
+ exports.RetrainCollectionSchema = RetrainCollectionSchema;
76965
78548
  exports.RetrainCopyRefusalSchema = RetrainCopyRefusalSchema;
76966
78549
  exports.RetrainExportFilterSchema = RetrainExportFilterSchema;
76967
78550
  exports.RetrainExportLayoutSchema = RetrainExportLayoutSchema;
76968
78551
  exports.RetrainFrameCandidateSchema = RetrainFrameCandidateSchema;
76969
78552
  exports.RetrainFrameListSchema = RetrainFrameListSchema;
78553
+ exports.RetrainFrameOriginSchema = RetrainFrameOriginSchema;
76970
78554
  exports.RetrainFrameSchema = RetrainFrameSchema;
76971
78555
  exports.RetrainFrameSelectionSchema = RetrainFrameSelectionSchema;
78556
+ exports.RetrainLlmAssistResultSchema = RetrainLlmAssistResultSchema;
78557
+ exports.RetrainLlmProposalSchema = RetrainLlmProposalSchema;
78558
+ exports.RetrainLlmReviewSchema = RetrainLlmReviewSchema;
76972
78559
  exports.RetrainMacroClassSchema = RetrainMacroClassSchema;
78560
+ exports.RetrainPipelineBoxSchema = RetrainPipelineBoxSchema;
76973
78561
  exports.RetrainStatusSchema = RetrainStatusSchema;
76974
78562
  exports.RetrainTrackSchema = RetrainTrackSchema;
76975
78563
  exports.RetrainTransitionResultSchema = RetrainTransitionResultSchema;
@@ -76995,7 +78583,9 @@ exports.SCENE_DEFAULT_UNCOVERED_POLICY = SCENE_DEFAULT_UNCOVERED_POLICY;
76995
78583
  exports.SCENE_DIVERGED = SCENE_DIVERGED;
76996
78584
  exports.SCENE_RESET_RECAPTURES = SCENE_RESET_RECAPTURES;
76997
78585
  exports.SCOPE_PRESETS = SCOPE_PRESETS;
78586
+ exports.SECRET_CLEAR = require_sleep.SECRET_CLEAR;
76998
78587
  exports.SECRET_META = require_sleep.SECRET_META;
78588
+ exports.SECRET_REF_SCHEME = require_sleep.SECRET_REF_SCHEME;
76999
78589
  exports.SENSOR_FEATURES = SENSOR_FEATURES;
77000
78590
  exports.SENSOR_MAP = SENSOR_MAP;
77001
78591
  exports.SESSION_PLACEMENT_SETTING_KEY = SESSION_PLACEMENT_SETTING_KEY;
@@ -77302,6 +78892,7 @@ exports.applyModeDeviceListEdit = applyModeDeviceListEdit;
77302
78892
  exports.applyModelBoundSettings = applyModelBoundSettings;
77303
78893
  exports.applyNonBlockingEdit = applyNonBlockingEdit;
77304
78894
  exports.applySecureOnArmEdit = applySecureOnArmEdit;
78895
+ exports.arrayItemFieldPath = require_sleep.arrayItemFieldPath;
77305
78896
  exports.asBoolean = require_sleep.asBoolean;
77306
78897
  exports.asJsonArray = require_sleep.asJsonArray;
77307
78898
  exports.asJsonObject = require_sleep.asJsonObject;
@@ -77333,6 +78924,7 @@ exports.brightnessCapability = brightnessCapability;
77333
78924
  exports.brokerCapability = brokerCapability;
77334
78925
  exports.buildAddonRouteProvider = buildAddonRouteProvider;
77335
78926
  exports.buildAudioArgs = require_composition.buildAudioArgs;
78927
+ exports.buildBenchStepTree = buildBenchStepTree;
77336
78928
  exports.buildCapabilityLookup = buildCapabilityLookup;
77337
78929
  exports.buildDeviceAdminUrl = buildDeviceAdminUrl;
77338
78930
  exports.buildDoorbellCompositionFeature = buildDoorbellCompositionFeature;
@@ -77343,6 +78935,7 @@ exports.buildInputArgs = require_composition.buildInputArgs;
77343
78935
  exports.buildModelVariantGroups = buildModelVariantGroups;
77344
78936
  exports.buildNcTaxonomy = buildNcTaxonomy;
77345
78937
  exports.buildRoleScopes = buildRoleScopes;
78938
+ exports.buildSecretRef = require_sleep.buildSecretRef;
77346
78939
  exports.buildStreamParamsConfigSchema = buildStreamParamsConfigSchema;
77347
78940
  exports.buildVideoArgs = require_composition.buildVideoArgs;
77348
78941
  exports.buildViewerLink = buildViewerLink;
@@ -77363,9 +78956,12 @@ exports.carbonMonoxideCapability = carbonMonoxideCapability;
77363
78956
  exports.cellsToRects = cellsToRects;
77364
78957
  exports.checkRoleAddress = checkRoleAddress;
77365
78958
  exports.classifyBearerPrincipal = classifyBearerPrincipal;
78959
+ exports.classifyCamerasForBenchmark = classifyCamerasForBenchmark;
77366
78960
  exports.classifyInferenceHardware = classifyInferenceHardware;
78961
+ exports.classifySecretWrite = require_sleep.classifySecretWrite;
77367
78962
  exports.classifyStream = classifyStream;
77368
78963
  exports.classifyStreams = classifyStreams;
78964
+ exports.clearKnownSecrets = require_sleep.clearKnownSecrets;
77369
78965
  exports.clearModelBoundOverrides = clearModelBoundOverrides;
77370
78966
  exports.clearModelBoundSetting = clearModelBoundSetting;
77371
78967
  exports.climateControlCapability = climateControlCapability;
@@ -77380,8 +78976,10 @@ exports.clusterStepSettingKey = clusterStepSettingKey;
77380
78976
  exports.codecIsAccepted = codecIsAccepted;
77381
78977
  exports.collectHydratedFieldEntries = require_sleep.collectHydratedFieldEntries;
77382
78978
  exports.collectHydratedFieldValues = require_sleep.collectHydratedFieldValues;
78979
+ exports.collectKeychainStoredKeys = require_sleep.collectKeychainStoredKeys;
77383
78980
  exports.collectModelBoundKeys = collectModelBoundKeys;
77384
- exports.collectSecretConfigKeys = collectSecretConfigKeys;
78981
+ exports.collectSecretConfigKeys = require_sleep.collectSecretConfigKeys;
78982
+ exports.collectSecretMarkerRefs = require_sleep.collectSecretMarkerRefs;
77385
78983
  exports.collectZodSecretPaths = require_sleep.collectZodSecretPaths;
77386
78984
  exports.colorCapability = colorCapability;
77387
78985
  exports.colorForKind = colorForKind;
@@ -77434,6 +79032,7 @@ exports.createLazyTrpcSource = require_sleep.createLazyTrpcSource;
77434
79032
  exports.createLogChannelsProvider = createLogChannelsProvider;
77435
79033
  exports.createMirrorSource = require_sleep.createMirrorSource;
77436
79034
  exports.createRuntimeStateBridge = createRuntimeStateBridge;
79035
+ exports.createSecretsAccess = require_sleep.createSecretsAccess;
77437
79036
  exports.createSliceHandle = require_sleep.createSliceHandle;
77438
79037
  exports.createStatefulExpressionMemory = require_composition.createStatefulExpressionMemory;
77439
79038
  exports.createSystemProxy = createSystemProxy;
@@ -77500,6 +79099,7 @@ exports.effectiveStepSettings = effectiveStepSettings;
77500
79099
  exports.egressTranscodeSharingKey = egressTranscodeSharingKey;
77501
79100
  exports.egressTransportFromRequest = egressTransportFromRequest;
77502
79101
  exports.electByShare = electByShare;
79102
+ exports.eligibleUnderBenchmark = eligibleUnderBenchmark;
77503
79103
  exports.embeddingEncoderCapability = embeddingEncoderCapability;
77504
79104
  exports.embeddingModelFailedError = embeddingModelFailedError;
77505
79105
  exports.embeddingModelFailedOf = embeddingModelFailedOf;
@@ -77517,6 +79117,7 @@ exports.enumerateInferenceDevices = enumerateInferenceDevices;
77517
79117
  exports.enumerateItemArrayFields = enumerateItemArrayFields;
77518
79118
  exports.enumerateSchemaFields = enumerateSchemaFields;
77519
79119
  exports.errMsg = require_err_msg.errMsg;
79120
+ exports.estimateNodeBenchmarkDurationMs = estimateNodeBenchmarkDurationMs;
77520
79121
  exports.evaluateAst = require_composition.evaluateAst;
77521
79122
  exports.evaluateCompositionField = evaluateCompositionField;
77522
79123
  exports.evaluateCount = require_composition.evaluateCount;
@@ -77560,10 +79161,13 @@ exports.findCompositionCycles = findCompositionCycles;
77560
79161
  exports.findTimezone = findTimezone;
77561
79162
  exports.floodCapability = floodCapability;
77562
79163
  exports.foldSnapshotByFunction = foldSnapshotByFunction;
79164
+ exports.forgetKnownSecret = require_sleep.forgetKnownSecret;
77563
79165
  exports.formatForRuntime = formatForRuntime;
77564
79166
  exports.formatMediaOwnerKey = formatMediaOwnerKey;
77565
79167
  exports.formatMinutes = formatMinutes;
77566
79168
  exports.formatParkedFor = formatParkedFor;
79169
+ exports.formatSecretScope = require_sleep.formatSecretScope;
79170
+ exports.freshResults = freshResults;
77567
79171
  exports.frigateDefaultClassFloors = frigateDefaultClassFloors;
77568
79172
  exports.frigateLabelFields = frigateLabelFields;
77569
79173
  exports.gasCapability = gasCapability;
@@ -77577,6 +79181,7 @@ exports.getTaxonomyEntry = getTaxonomyEntry;
77577
79181
  exports.gifDeriveSpeed = gifDeriveSpeed;
77578
79182
  exports.gifFilterComplex = gifFilterComplex;
77579
79183
  exports.gifFromMp4Args = gifFromMp4Args;
79184
+ exports.globalSecretScope = require_sleep.globalSecretScope;
77580
79185
  exports.hasModelBoundOverrides = hasModelBoundOverrides;
77581
79186
  exports.hasMotionTrigger = hasMotionTrigger;
77582
79187
  exports.hfModelUrl = hfModelUrl;
@@ -77626,6 +79231,7 @@ exports.isEventOwnerType = isEventOwnerType;
77626
79231
  exports.isFirstLevelMacroClass = isFirstLevelMacroClass;
77627
79232
  exports.isHeldBackTemplateVar = isHeldBackTemplateVar;
77628
79233
  exports.isIsolatedBuiltin = isIsolatedBuiltin;
79234
+ exports.isKeychainStoredField = require_sleep.isKeychainStoredField;
77629
79235
  exports.isKnownTemplateVar = isKnownTemplateVar;
77630
79236
  exports.isLabelSupplyStepId = isLabelSupplyStepId;
77631
79237
  exports.isLocationEnabled = isLocationEnabled;
@@ -77640,7 +79246,12 @@ exports.isRetiredClearKey = isRetiredClearKey;
77640
79246
  exports.isRootSuppliableStepId = isRootSuppliableStepId;
77641
79247
  exports.isSameAddonId = isSameAddonId;
77642
79248
  exports.isScheduleActive = isScheduleActive;
77643
- 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;
77644
79255
  exports.isSingleHubAddressRole = isSingleHubAddressRole;
77645
79256
  exports.isSoftwareDecode = require_composition.isSoftwareDecode;
77646
79257
  exports.isSourceCap = require_composition.isSourceCap;
@@ -77657,8 +79268,11 @@ exports.isZodSecret = require_sleep.isZodSecret;
77657
79268
  exports.ituDbfsFromPreEpoch = ituDbfsFromPreEpoch;
77658
79269
  exports.jobKindSchema = jobKindSchema;
77659
79270
  exports.kebabToCamel = kebabToCamel;
79271
+ exports.keychainAdminCapability = keychainAdminCapability;
79272
+ exports.keychainCapability = keychainCapability;
77660
79273
  exports.kindOfValue = kindOfValue;
77661
79274
  exports.kindsForDiscriminator = kindsForDiscriminator;
79275
+ exports.knownSecretCount = require_sleep.knownSecretCount;
77662
79276
  exports.knownValues = knownValues;
77663
79277
  exports.lawnMowerControlCapability = lawnMowerControlCapability;
77664
79278
  exports.legacyAutoLinkIds = legacyAutoLinkIds;
@@ -77669,6 +79283,7 @@ exports.lifecycleJobStateSchema = lifecycleJobStateSchema;
77669
79283
  exports.lifecycleTaskSchema = lifecycleTaskSchema;
77670
79284
  exports.linkedLabelStepId = linkedLabelStepId;
77671
79285
  exports.linkedStepOf = linkedStepOf;
79286
+ exports.listBenchDetailSteps = listBenchDetailSteps;
77672
79287
  exports.llmCapability = llmCapability;
77673
79288
  exports.llmRuntimeCapability = llmRuntimeCapability;
77674
79289
  exports.loadContributionCapability = loadContributionCapability;
@@ -77683,6 +79298,7 @@ exports.logLevelAtMost = logLevelAtMost;
77683
79298
  exports.loginMethodCapability = loginMethodCapability;
77684
79299
  exports.looseSchema = looseSchema;
77685
79300
  exports.makeProfileBrokerId = require_sleep.makeProfileBrokerId;
79301
+ exports.makeSecretMarker = require_sleep.makeSecretMarker;
77686
79302
  exports.makeSourceBrokerId = require_sleep.makeSourceBrokerId;
77687
79303
  exports.mapAudioLabelToMacro = mapAudioLabelToMacro;
77688
79304
  exports.markdownToHtmlLite = markdownToHtmlLite;
@@ -77691,8 +79307,11 @@ exports.maskUrlCredentials = maskUrlCredentials;
77691
79307
  exports.matchDoAction = matchDoAction;
77692
79308
  exports.mayReadLocation = mayReadLocation;
77693
79309
  exports.mayWriteToLocation = mayWriteToLocation;
79310
+ exports.measuredCapacityFromResults = measuredCapacityFromResults;
79311
+ exports.measuredDetectorCells = measuredDetectorCells;
77694
79312
  exports.mediaPlayerCapability = mediaPlayerCapability;
77695
79313
  exports.memoizePinnedFfmpeg = memoizePinnedFfmpeg;
79314
+ exports.mergeSecretStatePaths = require_sleep.mergeSecretStatePaths;
77696
79315
  exports.mergeSettingsBags = mergeSettingsBags;
77697
79316
  exports.mergeSourceInfo = mergeSourceInfo;
77698
79317
  exports.meshNetworkCapability = meshNetworkCapability;
@@ -77719,6 +79338,7 @@ exports.ncAlarmSystemDefaultSettings = ncAlarmSystemDefaultSettings;
77719
79338
  exports.networkAccessCapability = networkAccessCapability;
77720
79339
  exports.networkLinkCapability = networkLinkCapability;
77721
79340
  exports.networkQualityCapability = networkQualityCapability;
79341
+ exports.nodeBenchmarkRefusals = nodeBenchmarkRefusals;
77722
79342
  exports.nodePickerItems = nodePickerItems;
77723
79343
  exports.nodePin = require_sleep.nodePin;
77724
79344
  exports.nodesCapability = nodesCapability;
@@ -77726,6 +79346,7 @@ exports.normalizeAddonInitResult = require_sleep.normalizeAddonInitResult;
77726
79346
  exports.normalizeAudioLabel = normalizeAudioLabel;
77727
79347
  exports.normalizeCoreBlockWrite = normalizeCoreBlockWrite;
77728
79348
  exports.normalizeNodeId = require_sleep.normalizeNodeId;
79349
+ exports.normalizeSecretOwner = require_sleep.normalizeSecretOwner;
77729
79350
  exports.normalizeTokenScopes = normalizeTokenScopes;
77730
79351
  exports.normalizeUnit = normalizeUnit;
77731
79352
  exports.notificationOutputCapability = notificationOutputCapability;
@@ -77753,6 +79374,8 @@ exports.parseOccupancyScope = parseOccupancyScope;
77753
79374
  exports.parseProcStatus = parseProcStatus;
77754
79375
  exports.parseProfileBrokerId = require_sleep.parseProfileBrokerId;
77755
79376
  exports.parseRuleSection = parseRuleSection;
79377
+ exports.parseSecretRef = require_sleep.parseSecretRef;
79378
+ exports.parseSecretStatePath = require_sleep.parseSecretStatePath;
77756
79379
  exports.parseSessionPlacementPolicy = parseSessionPlacementPolicy;
77757
79380
  exports.parseShareSource = parseShareSource;
77758
79381
  exports.parseStreamParamsFormPatch = parseStreamParamsFormPatch;
@@ -77770,6 +79393,7 @@ exports.pickRestartCandidate = pickRestartCandidate;
77770
79393
  exports.pickVideoEncoder = require_composition.pickVideoEncoder;
77771
79394
  exports.pickerForCondition = pickerForCondition;
77772
79395
  exports.pickerForRuleClasses = pickerForRuleClasses;
79396
+ exports.pinUnderBenchmark = pinUnderBenchmark;
77773
79397
  exports.pipelineAnalyticsCapability = pipelineAnalyticsCapability;
77774
79398
  exports.pipelineExecutorCapability = pipelineExecutorCapability;
77775
79399
  exports.pipelineOrchestratorCapability = pipelineOrchestratorCapability;
@@ -77815,6 +79439,7 @@ exports.recordingOnboardCapability = recordingOnboardCapability;
77815
79439
  exports.recordingSignalCapability = recordingSignalCapability;
77816
79440
  exports.rectsToCells = rectsToCells;
77817
79441
  exports.reducePoints = reducePoints;
79442
+ exports.registerKnownSecret = require_sleep.registerKnownSecret;
77818
79443
  exports.renameAlarmProfile = renameAlarmProfile;
77819
79444
  exports.replacedFieldKeys = replacedFieldKeys;
77820
79445
  exports.requiredTopLevelKeys = requiredTopLevelKeys;
@@ -77856,9 +79481,13 @@ exports.resolvePublicEndpoint = resolvePublicEndpoint;
77856
79481
  exports.resolveRecordingProfiles = resolveRecordingProfiles;
77857
79482
  exports.resolveRootSupply = resolveRootSupply;
77858
79483
  exports.resolveRunnerId = resolveRunnerId;
79484
+ exports.resolveSecretMarkers = require_sleep.resolveSecretMarkers;
79485
+ exports.resolveSecretViewsIn = require_sleep.resolveSecretViewsIn;
77859
79486
  exports.resolveStreamMaps = require_composition.resolveStreamMaps;
77860
79487
  exports.resolveVariantModelId = resolveVariantModelId;
77861
79488
  exports.resolveViewableDeviceIds = resolveViewableDeviceIds;
79489
+ exports.resultCellKey = resultCellKey;
79490
+ exports.resultStandings = resultStandings;
77862
79491
  exports.roleSpec = roleSpec;
77863
79492
  exports.roomCompositionExample = roomCompositionExample;
77864
79493
  exports.rootSuppliesOf = rootSuppliesOf;
@@ -77882,14 +79511,17 @@ exports.runtimeStatePolicyFor = runtimeStatePolicyFor;
77882
79511
  exports.sameDoFamily = sameDoFamily;
77883
79512
  exports.sceneMonitorCapability = sceneMonitorCapability;
77884
79513
  exports.scheduleForSendTimes = scheduleForSendTimes;
77885
- exports.schemaDeclaresAnyField = schemaDeclaresAnyField;
79514
+ exports.schemaDeclaresAnyField = require_sleep.schemaDeclaresAnyField;
77886
79515
  exports.scopeInherits = scopeInherits;
77887
79516
  exports.scopeKey = require_sleep.scopeKey;
77888
79517
  exports.scopesAllowAddon = scopesAllowAddon;
77889
79518
  exports.scopesAllowDeviceCap = scopesAllowDeviceCap;
77890
79519
  exports.scoreRuntimes = scoreRuntimes;
77891
79520
  exports.scriptRunnerCapability = scriptRunnerCapability;
79521
+ exports.scrubKnownSecrets = require_sleep.scrubKnownSecrets;
77892
79522
  exports.searchDisplayIcons = searchDisplayIcons;
79523
+ exports.secretTreeFromPaths = require_sleep.secretTreeFromPaths;
79524
+ exports.secretTreeFromSchema = require_sleep.secretTreeFromSchema;
77893
79525
  exports.secureActuationFor = secureActuationFor;
77894
79526
  exports.selectAppConnectionEndpoints = selectAppConnectionEndpoints;
77895
79527
  exports.selectAssignedProfileSlots = require_sleep.selectAssignedProfileSlots;
@@ -77904,6 +79536,7 @@ exports.setByPath = setByPath;
77904
79536
  exports.settingValuesEqual = settingValuesEqual;
77905
79537
  exports.settingsBelow = settingsBelow;
77906
79538
  exports.settingsStoreCapability = settingsStoreCapability;
79539
+ exports.shortSecretRefHash = require_sleep.shortSecretRefHash;
77907
79540
  exports.signalPercentFromBars = signalPercentFromBars;
77908
79541
  exports.signalPercentFromRssi = signalPercentFromRssi;
77909
79542
  exports.siteZoneKey = siteZoneKey;
@@ -77972,11 +79605,13 @@ exports.toDeviceSummary = toDeviceSummary;
77972
79605
  exports.toExpressionValue = require_composition.toExpressionValue;
77973
79606
  exports.toNodeId = require_sleep.toNodeId;
77974
79607
  exports.toPercentShares = toPercentShares;
79608
+ exports.toSecretFieldView = require_sleep.toSecretFieldView;
77975
79609
  exports.toStreamSourceEntry = toStreamSourceEntry;
77976
79610
  exports.toastCapability = toastCapability;
77977
79611
  exports.toggleAudioLabel = toggleAudioLabel;
77978
79612
  exports.tokenize = require_composition.tokenize;
77979
79613
  exports.transcodeBody = transcodeBody;
79614
+ exports.transformSecretWrite = require_sleep.transformSecretWrite;
77980
79615
  exports.tryConvertUnit = tryConvertUnit;
77981
79616
  exports.turnProviderCapability = turnProviderCapability;
77982
79617
  exports.unitDimension = unitDimension;