@camstack/types 1.2.364 → 1.2.366

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 (93) hide show
  1. package/dist/addon.js +3 -2
  2. package/dist/addon.mjs +3 -2
  3. package/dist/auth/device-certificate.d.ts +372 -0
  4. package/dist/auth/request-origin.d.ts +43 -0
  5. package/dist/capabilities/air-quality-sensor.cap.d.ts +32 -0
  6. package/dist/capabilities/alarm-panel.cap.d.ts +4 -0
  7. package/dist/capabilities/ambient-light-sensor.cap.d.ts +13 -0
  8. package/dist/capabilities/audio-metrics.cap.d.ts +4 -0
  9. package/dist/capabilities/automation-control.cap.d.ts +4 -0
  10. package/dist/capabilities/battery.cap.d.ts +11 -0
  11. package/dist/capabilities/binary.cap.d.ts +10 -0
  12. package/dist/capabilities/brightness.cap.d.ts +12 -0
  13. package/dist/capabilities/camera-streams.cap.d.ts +4 -0
  14. package/dist/capabilities/capability-definition.d.ts +70 -0
  15. package/dist/capabilities/carbon-monoxide.cap.d.ts +10 -0
  16. package/dist/capabilities/climate-control.cap.d.ts +32 -0
  17. package/dist/capabilities/color.cap.d.ts +4 -0
  18. package/dist/capabilities/connectivity.cap.d.ts +4 -0
  19. package/dist/capabilities/consumables.cap.d.ts +4 -0
  20. package/dist/capabilities/contact.cap.d.ts +10 -0
  21. package/dist/capabilities/control.cap.d.ts +4 -0
  22. package/dist/capabilities/cover.cap.d.ts +12 -0
  23. package/dist/capabilities/day-night.cap.d.ts +4 -0
  24. package/dist/capabilities/device-credentials.cap.d.ts +174 -0
  25. package/dist/capabilities/device-discovery.cap.d.ts +4 -0
  26. package/dist/capabilities/device-status.cap.d.ts +10 -0
  27. package/dist/capabilities/doorbell.cap.d.ts +4 -0
  28. package/dist/capabilities/enum-sensor.cap.d.ts +4 -0
  29. package/dist/capabilities/event-emitter.cap.d.ts +4 -0
  30. package/dist/capabilities/fan-control.cap.d.ts +15 -0
  31. package/dist/capabilities/feature-probe.cap.d.ts +4 -0
  32. package/dist/capabilities/flood.cap.d.ts +10 -0
  33. package/dist/capabilities/gas.cap.d.ts +10 -0
  34. package/dist/capabilities/humidifier.cap.d.ts +15 -0
  35. package/dist/capabilities/humidity-sensor.cap.d.ts +12 -0
  36. package/dist/capabilities/image-settings.cap.d.ts +4 -0
  37. package/dist/capabilities/image.cap.d.ts +4 -0
  38. package/dist/capabilities/index.d.ts +7 -3
  39. package/dist/capabilities/intercom.cap.d.ts +4 -0
  40. package/dist/capabilities/lawn-mower-control.cap.d.ts +12 -0
  41. package/dist/capabilities/lock-control.cap.d.ts +4 -0
  42. package/dist/capabilities/media-player.cap.d.ts +4 -0
  43. package/dist/capabilities/motion-trigger.cap.d.ts +4 -0
  44. package/dist/capabilities/motion-zones.cap.d.ts +4 -0
  45. package/dist/capabilities/motion.cap.d.ts +11 -0
  46. package/dist/capabilities/native-object-detection.cap.d.ts +4 -0
  47. package/dist/capabilities/navigation.cap.d.ts +4 -0
  48. package/dist/capabilities/network-link.cap.d.ts +19 -0
  49. package/dist/capabilities/node-certificates.cap.d.ts +128 -0
  50. package/dist/capabilities/notifier.cap.d.ts +4 -0
  51. package/dist/capabilities/numeric-sensor.cap.d.ts +12 -0
  52. package/dist/capabilities/pet-feeder.cap.d.ts +25 -0
  53. package/dist/capabilities/power-meter.cap.d.ts +43 -0
  54. package/dist/capabilities/presence.cap.d.ts +12 -0
  55. package/dist/capabilities/pressure-sensor.cap.d.ts +12 -0
  56. package/dist/capabilities/privacy-mask.cap.d.ts +4 -0
  57. package/dist/capabilities/ptz-autotrack.cap.d.ts +4 -0
  58. package/dist/capabilities/recording-onboard.cap.d.ts +4 -0
  59. package/dist/capabilities/recording-signal.cap.d.ts +4 -0
  60. package/dist/capabilities/scene-monitor.cap.d.ts +4 -0
  61. package/dist/capabilities/script-runner.cap.d.ts +4 -0
  62. package/dist/capabilities/smoke.cap.d.ts +10 -0
  63. package/dist/capabilities/stream-catalog.cap.d.ts +4 -0
  64. package/dist/capabilities/stream-params.cap.d.ts +4 -0
  65. package/dist/capabilities/stream-signals.cap.d.ts +4 -0
  66. package/dist/capabilities/switch.cap.d.ts +10 -0
  67. package/dist/capabilities/tamper.cap.d.ts +10 -0
  68. package/dist/capabilities/temperature-sensor.cap.d.ts +12 -0
  69. package/dist/capabilities/update.cap.d.ts +4 -0
  70. package/dist/capabilities/vacuum-control.cap.d.ts +32 -0
  71. package/dist/capabilities/valve.cap.d.ts +12 -0
  72. package/dist/capabilities/vibration.cap.d.ts +10 -0
  73. package/dist/capabilities/water-heater.cap.d.ts +17 -0
  74. package/dist/capabilities/weather.cap.d.ts +27 -0
  75. package/dist/capabilities/zone-analytics.cap.d.ts +4 -0
  76. package/dist/capabilities/zone-rules.cap.d.ts +4 -0
  77. package/dist/capabilities/zones.cap.d.ts +4 -0
  78. package/dist/client.d.ts +1 -1
  79. package/dist/client.js +255 -0
  80. package/dist/client.mjs +245 -1
  81. package/dist/generated/addon-api.d.ts +797 -4
  82. package/dist/generated/cap-input-defaults.d.ts +1 -1
  83. package/dist/generated/capability-router-map.d.ts +8 -2
  84. package/dist/generated/history-catalog.d.ts +11 -0
  85. package/dist/generated/method-access-map.d.ts +1 -1
  86. package/dist/generated/system-proxy.d.ts +2 -0
  87. package/dist/index.d.ts +3 -0
  88. package/dist/index.js +1574 -34
  89. package/dist/index.mjs +1522 -35
  90. package/dist/interfaces/auth.d.ts +6 -0
  91. package/dist/{sleep-BBF1iXUi.mjs → sleep-DxJdzHni.mjs} +26 -1
  92. package/dist/{sleep-BBXNq778.js → sleep-NZlEFYGX.js} +37 -0
  93. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-BBXNq778.js");
2
+ const require_sleep = require("./sleep-NZlEFYGX.js");
3
3
  const require_event_category = require("./event-category-T43rdQWR.js");
4
4
  const require_composition = require("./composition-DCYnv4I6.js");
5
5
  const require_node_color = require("./node-color.js");
@@ -6658,6 +6658,330 @@ var SSO_STATE_COOKIE = "camstack_sso_state";
6658
6658
  /** Seconds the state cookie lives — the pending IdP state lasts 5 minutes, the bridge 5 more. */
6659
6659
  var SSO_STATE_COOKIE_MAX_AGE_SEC = 600;
6660
6660
  //#endregion
6661
+ //#region src/auth/device-certificate.ts
6662
+ /**
6663
+ * Device certificates (D855) — the wire contract shared by the hub, the admin
6664
+ * UI and the native viewer.
6665
+ *
6666
+ * A device (a phone) generates its OWN P-256 key pair in hardware (Secure
6667
+ * Enclave / Android Keystore / a non-extractable WebCrypto key). The private
6668
+ * key never travels. The hub signs the PUBLIC key into an X.509 leaf under a
6669
+ * dedicated device CA; the device later proves possession of the key by
6670
+ * signing a hub-issued nonce, and the hub answers with the same session a
6671
+ * password login opens.
6672
+ *
6673
+ * Everything on the wire is a small string (a PEM, a base64url signature):
6674
+ * D613 is about bulk bytes, and a certificate is ~600 bytes.
6675
+ */
6676
+ /** Signature algorithm of every device credential: ECDSA, curve P-256, SHA-256. */
6677
+ var DEVICE_CERT_SIGNATURE = "ecdsa-p256-sha256";
6678
+ /** First line of every signed message; a change of format bumps the version. */
6679
+ var DEVICE_SIGNATURE_MESSAGE_VERSION = "camstack-device-cert-v1";
6680
+ /** What a signature is for. A login signature can never be replayed as a renewal. */
6681
+ var DeviceSignaturePurposeSchema = zod.z.enum([
6682
+ "login",
6683
+ "renew",
6684
+ "revoke"
6685
+ ]);
6686
+ /** Leaf lifetime and the window in which the app renews it. */
6687
+ var DEVICE_CERT_VALIDITY_DAYS = 365;
6688
+ var DEVICE_CERT_RENEW_WINDOW_DAYS = 30;
6689
+ /** One-shot enrollment code and login nonce lifetimes. */
6690
+ var DEVICE_ENROLLMENT_TTL_MS = 10 * 6e4;
6691
+ var DEVICE_NONCE_TTL_MS = 6e4;
6692
+ /** SAN URI prefixes of a device leaf. */
6693
+ var DEVICE_SAN_CREDENTIAL_PREFIX = "camstack:credential:";
6694
+ var DEVICE_SAN_USER_PREFIX = "camstack:user:";
6695
+ /**
6696
+ * The exact bytes a device signs (UTF-8, `\n` separators, no trailing newline):
6697
+ *
6698
+ * camstack-device-cert-v1
6699
+ * <login|renew>
6700
+ * <origin> the hub origin returned by `getDeviceChallenge`
6701
+ * <nonce>
6702
+ *
6703
+ * The origin is part of the message so a signature collected by a look-alike
6704
+ * hub is worthless on the real one; the hub additionally binds the nonce to
6705
+ * the origin it issued it for and refuses any other.
6706
+ */
6707
+ function buildDeviceSignatureMessage(input) {
6708
+ return [
6709
+ DEVICE_SIGNATURE_MESSAGE_VERSION,
6710
+ input.purpose,
6711
+ input.origin,
6712
+ input.nonce
6713
+ ].join("\n");
6714
+ }
6715
+ /** The deep link a QR carries: `camstack://enroll?hub=<origin>&code=<code>`. */
6716
+ function buildDeviceEnrollmentLink(input) {
6717
+ const query = new URLSearchParams();
6718
+ if (input.hub !== void 0) query.set("hub", input.hub);
6719
+ query.set("code", input.code);
6720
+ return `${input.scheme ?? "camstack"}://enroll?${query.toString()}`;
6721
+ }
6722
+ /** Parse an enrollment deep link; `null` when it is not one. `hub` is absent when the link names none. */
6723
+ function parseDeviceEnrollmentLink(raw) {
6724
+ let url;
6725
+ try {
6726
+ url = new URL(raw);
6727
+ } catch {
6728
+ return null;
6729
+ }
6730
+ if (url.protocol !== "camstack:" && url.protocol !== "camstack.dev:") return null;
6731
+ if (url.hostname !== "enroll") return null;
6732
+ const code = url.searchParams.get("code");
6733
+ if (code === null || code === "") return null;
6734
+ const hub = url.searchParams.get("hub");
6735
+ return {
6736
+ hub: hub === null || hub === "" ? null : hub,
6737
+ code
6738
+ };
6739
+ }
6740
+ var DevicePlatformSchema = zod.z.enum([
6741
+ "ios",
6742
+ "android",
6743
+ "web",
6744
+ "other"
6745
+ ]);
6746
+ var Base64UrlSchema = zod.z.string().min(1).max(4096).regex(/^[A-Za-z0-9_-]+$/);
6747
+ var PemSchema = zod.z.string().min(1).max(16384);
6748
+ /**
6749
+ * Why a device-certificate endpoint said no. Distinct from a transport / 5xx
6750
+ * failure: those carry no reason and mean "try again", never "the credential is
6751
+ * dead". The viewer switches on this exhaustively.
6752
+ */
6753
+ var DeviceRefusalReasonSchema = zod.z.enum([
6754
+ "revoked",
6755
+ "unknown-credential",
6756
+ "expired",
6757
+ "bad-signature",
6758
+ "nonce-invalid",
6759
+ "rate-limited",
6760
+ "invalid-certificate",
6761
+ "superseded",
6762
+ "user-gone",
6763
+ "unavailable",
6764
+ "code-invalid",
6765
+ "self-enrollment-disabled",
6766
+ "step-up-required",
6767
+ "bad-public-key"
6768
+ ]);
6769
+ /** The only answers after which the app may count towards deleting its credential. */
6770
+ var DEFINITIVE_DEVICE_REFUSALS = [
6771
+ "revoked",
6772
+ "unknown-credential",
6773
+ "user-gone"
6774
+ ];
6775
+ /** Consecutive DEFINITIVE answers before the app deletes its key and certificate. */
6776
+ var DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE = 3;
6777
+ function isDefinitiveDeviceRefusal(reason) {
6778
+ return DEFINITIVE_DEVICE_REFUSALS.includes(reason);
6779
+ }
6780
+ var DeviceRefusalSchema = zod.z.object({
6781
+ ok: zod.z.literal(false),
6782
+ reason: DeviceRefusalReasonSchema,
6783
+ definitive: zod.z.boolean(),
6784
+ retryAfterSeconds: zod.z.number().optional()
6785
+ });
6786
+ /**
6787
+ * A credential-bound session that can no longer refresh answers
6788
+ * `auth.refreshSession` with UNAUTHORIZED whose message is this prefix + the
6789
+ * reason; {@link deviceRefusalFromMessage} reads it back.
6790
+ */
6791
+ var DEVICE_REFRESH_REFUSAL_PREFIX = "device-credential:";
6792
+ function deviceRefusalFromMessage(message) {
6793
+ if (!message.startsWith("device-credential:")) return null;
6794
+ const parsed = DeviceRefusalReasonSchema.safeParse(message.slice(18));
6795
+ return parsed.success ? parsed.data : null;
6796
+ }
6797
+ var CompleteEnrollmentInputSchema = zod.z.object({
6798
+ code: zod.z.string().min(1).max(256),
6799
+ /** SubjectPublicKeyInfo DER of the device's P-256 public key, base64url. */
6800
+ publicKeySpki: Base64UrlSchema,
6801
+ deviceName: zod.z.string().min(1).max(80).optional(),
6802
+ platform: DevicePlatformSchema
6803
+ });
6804
+ var CompleteEnrollmentOutputSchema = zod.z.object({
6805
+ credentialId: zod.z.string(),
6806
+ certPem: PemSchema,
6807
+ /** The device CA certificate the leaf chains to. */
6808
+ chainPem: PemSchema,
6809
+ notAfter: zod.z.number(),
6810
+ user: zod.z.object({
6811
+ id: zod.z.string(),
6812
+ username: zod.z.string()
6813
+ })
6814
+ });
6815
+ var CompleteEnrollmentResultSchema = zod.z.discriminatedUnion("ok", [CompleteEnrollmentOutputSchema.extend({ ok: zod.z.literal(true) }), DeviceRefusalSchema]);
6816
+ var EnrollSelfInputSchema = zod.z.object({
6817
+ /** The single-use step-up proof (`auth.deviceEnrollProofFrom…`). */
6818
+ proof: zod.z.string().min(1).max(512),
6819
+ publicKeySpki: Base64UrlSchema,
6820
+ deviceName: zod.z.string().min(1).max(80),
6821
+ platform: DevicePlatformSchema
6822
+ });
6823
+ var DeviceEnrollProofSchema = zod.z.object({
6824
+ proof: zod.z.string(),
6825
+ expiresAt: zod.z.number()
6826
+ });
6827
+ var DeviceChallengeSchema = zod.z.object({
6828
+ nonce: zod.z.string(),
6829
+ /** The origin to put in the signed message. The app compares it to the hub it dialled. */
6830
+ origin: zod.z.string(),
6831
+ expiresAt: zod.z.number(),
6832
+ signature: zod.z.literal(DEVICE_CERT_SIGNATURE)
6833
+ });
6834
+ var DeviceChallengeResultSchema = zod.z.discriminatedUnion("ok", [DeviceChallengeSchema.extend({ ok: zod.z.literal(true) }), DeviceRefusalSchema]);
6835
+ var DeviceProofInputSchema = zod.z.object({
6836
+ certPem: PemSchema,
6837
+ nonce: zod.z.string().min(1).max(256),
6838
+ /** ECDSA P-256 SHA-256 over {@link buildDeviceSignatureMessage}; raw r||s or DER, base64url. */
6839
+ signature: Base64UrlSchema
6840
+ });
6841
+ var RenewDeviceCertificateOutputSchema = zod.z.object({
6842
+ credentialId: zod.z.string(),
6843
+ certPem: PemSchema,
6844
+ chainPem: PemSchema,
6845
+ notAfter: zod.z.number()
6846
+ });
6847
+ var RenewDeviceCertificateResultSchema = zod.z.discriminatedUnion("ok", [RenewDeviceCertificateOutputSchema.extend({ ok: zod.z.literal(true) }), DeviceRefusalSchema]);
6848
+ var RevokeOwnDeviceCertificateResultSchema = zod.z.discriminatedUnion("ok", [zod.z.object({
6849
+ ok: zod.z.literal(true),
6850
+ credentialId: zod.z.string(),
6851
+ sessionsEnded: zod.z.number().int()
6852
+ }), DeviceRefusalSchema]);
6853
+ function formatDeviceRevoker(revoker) {
6854
+ return revoker.kind === "device" ? "device" : `${revoker.kind}:${revoker.userId}`;
6855
+ }
6856
+ var DeviceCredentialStatusSchema = zod.z.enum([
6857
+ "active",
6858
+ "expired",
6859
+ "revoked"
6860
+ ]);
6861
+ var DeviceCredentialSchema = zod.z.object({
6862
+ id: zod.z.string(),
6863
+ userId: zod.z.string(),
6864
+ username: zod.z.string().nullable(),
6865
+ deviceName: zod.z.string(),
6866
+ platform: DevicePlatformSchema,
6867
+ enrolledVia: zod.z.enum(["qr", "self"]),
6868
+ /** SHA-256 of the leaf certificate DER, colon-hex. */
6869
+ fingerprint: zod.z.string(),
6870
+ issuedAt: zod.z.number(),
6871
+ expiresAt: zod.z.number(),
6872
+ lastUsedAt: zod.z.number().nullable(),
6873
+ lastUsedFrom: zod.z.string().nullable(),
6874
+ revokedAt: zod.z.number().nullable(),
6875
+ /** `admin:<userId>` | `user:<userId>` | `device` | `user-deleted`. */
6876
+ revokedBy: zod.z.string().nullable(),
6877
+ status: DeviceCredentialStatusSchema
6878
+ });
6879
+ var StartEnrollmentOutputSchema = zod.z.object({
6880
+ /** Shown once; only its hash is kept. */
6881
+ code: zod.z.string(),
6882
+ expiresAt: zod.z.number(),
6883
+ /** `camstack://enroll?hub=…&code=…` — what the QR encodes. */
6884
+ enrollUrl: zod.z.string(),
6885
+ /** The hub origin in the link, or `null` when the hub could not name one (the link then has no `hub`). */
6886
+ hubOrigin: zod.z.string().nullable(),
6887
+ /** Every origin the apps may try (role `appConnections`). */
6888
+ hubOrigins: zod.z.array(zod.z.string())
6889
+ });
6890
+ /** The `device-certificate` arm of `auth.listLoginMethods`. */
6891
+ var DeviceCertificateLoginMethodSchema = zod.z.object({
6892
+ kind: zod.z.literal("device-certificate"),
6893
+ id: zod.z.literal("device-certificate"),
6894
+ label: zod.z.string(),
6895
+ stage: zod.z.literal("primary"),
6896
+ /** tRPC paths under the hub's `auth` router, so a client names no literal. */
6897
+ challengePath: zod.z.literal("auth.getDeviceChallenge"),
6898
+ revokePath: zod.z.literal("auth.revokeOwnDeviceCertificate"),
6899
+ enrollSelfPath: zod.z.literal("auth.enrollSelf"),
6900
+ loginPath: zod.z.literal("auth.loginWithDeviceCertificate"),
6901
+ renewPath: zod.z.literal("auth.renewDeviceCertificate"),
6902
+ signature: zod.z.literal(DEVICE_CERT_SIGNATURE),
6903
+ messageVersion: zod.z.literal(DEVICE_SIGNATURE_MESSAGE_VERSION),
6904
+ /** Which clients can execute it: a native app silently, a browser with a non-extractable WebCrypto key. */
6905
+ clients: zod.z.array(zod.z.enum(["native", "web"]))
6906
+ });
6907
+ //#endregion
6908
+ //#region src/auth/request-origin.ts
6909
+ /** host[:port] — a DNS name, IPv4 or bracketed IPv6. No userinfo, path or spaces. */
6910
+ var AUTHORITY_RE = /^(?:[a-z0-9.-]+|\[[0-9a-f:.]+\])(?::\d{1,5})?$/i;
6911
+ /** Same grammar as the hub's `parseForwardedPrefix` (spa-mount.ts). */
6912
+ var PREFIX_RE = /^\/[A-Za-z0-9_\-.]+(?:\/[A-Za-z0-9_\-.]+)*$/;
6913
+ var MAX_PREFIX_LENGTH = 512;
6914
+ /** First value of a possibly comma-joined forwarded header (the client-most proxy). */
6915
+ function firstValue(value) {
6916
+ if (value === void 0) return null;
6917
+ const first = value.split(",")[0]?.trim() ?? "";
6918
+ return first.length === 0 ? null : first;
6919
+ }
6920
+ /** `scheme://host[:port]` normalised by WHATWG URL, or `null` if it is not an http(s) origin. */
6921
+ function normalizeOrigin(value) {
6922
+ try {
6923
+ const url = new URL(value);
6924
+ if (url.protocol !== "https:" && url.protocol !== "http:") return null;
6925
+ if (url.username !== "" || url.password !== "") return null;
6926
+ return url.origin;
6927
+ } catch {
6928
+ return null;
6929
+ }
6930
+ }
6931
+ /** The mount prefix the relay named (no trailing slash), or `''`. Invalid = absent. */
6932
+ function requestMountPrefix(headers) {
6933
+ const raw = headers["x-forwarded-prefix"];
6934
+ if (raw === void 0 || raw.length === 0 || raw.length > MAX_PREFIX_LENGTH) return "";
6935
+ const trimmed = raw.endsWith("/") ? raw.slice(0, -1) : raw;
6936
+ if (trimmed === "" || !PREFIX_RE.test(trimmed)) return "";
6937
+ if (trimmed.split("/").some((segment) => segment === ".." || segment === ".")) return "";
6938
+ return trimmed;
6939
+ }
6940
+ /**
6941
+ * The origins the request CLAIMS, most specific first: the proxy's
6942
+ * `X-Forwarded-Host` over `Host`; the named `X-Forwarded-Proto`, or https
6943
+ * then http when none is named (the hub terminates TLS itself on 4443).
6944
+ */
6945
+ function claimedRequestOrigins(headers) {
6946
+ const authority = firstValue(headers["x-forwarded-host"]) ?? firstValue(headers["host"]);
6947
+ if (authority === null || !AUTHORITY_RE.test(authority)) return [];
6948
+ const proto = firstValue(headers["x-forwarded-proto"])?.toLowerCase() ?? null;
6949
+ const schemes = proto === "https" || proto === "http" ? [proto] : proto === null ? ["https", "http"] : [];
6950
+ const out = [];
6951
+ for (const scheme of schemes) {
6952
+ const origin = normalizeOrigin(`${scheme}://${authority}`);
6953
+ if (origin !== null) out.push(origin);
6954
+ }
6955
+ return out;
6956
+ }
6957
+ /** Every origin the hub advertises itself at, normalised. Never the app link, never loopback. */
6958
+ function advertisedHubOrigins(book) {
6959
+ const candidates = [];
6960
+ for (const row of book.rows) {
6961
+ if (row.kind === "app-link" || row.kind === "loopback") continue;
6962
+ candidates.push(row.baseUrl);
6963
+ }
6964
+ const { publicEndpoint, internal, appConnections } = book.roles;
6965
+ if (publicEndpoint.resolved !== null) candidates.push(publicEndpoint.resolved);
6966
+ if (internal.resolved !== null) candidates.push(internal.resolved);
6967
+ candidates.push(...appConnections.resolved);
6968
+ candidates.push(...book.listenerOrigins ?? []);
6969
+ const out = /* @__PURE__ */ new Set();
6970
+ for (const candidate of candidates) {
6971
+ const origin = normalizeOrigin(candidate);
6972
+ if (origin !== null) out.add(origin);
6973
+ }
6974
+ return out;
6975
+ }
6976
+ /**
6977
+ * The origin to send the browser back to: the first claimed origin that is in
6978
+ * `allowed`, or `null` (the caller then uses its default address).
6979
+ */
6980
+ function pickRequestOrigin(headers, allowed) {
6981
+ for (const origin of claimedRequestOrigins(headers)) if (allowed.has(origin)) return origin;
6982
+ return null;
6983
+ }
6984
+ //#endregion
6661
6985
  //#region src/expression/binding-source.ts
6662
6986
  /**
6663
6987
  * What an expression's named bindings READ from.
@@ -11068,7 +11392,11 @@ var cameraStreamsCapability = {
11068
11392
  * See `RuntimeStateDurability`. Enforced by
11069
11393
  * `scripts/check-runtime-state-durability.ts`.
11070
11394
  */
11071
- durability: "session"
11395
+ durability: "session",
11396
+ /**
11397
+ * History (D850): none — `online` duplicates device-status.online (one authority); slot data is nested enum/string.
11398
+ */
11399
+ history: "none"
11072
11400
  };
11073
11401
  //#endregion
11074
11402
  //#region src/capabilities/cap-router-predicates.ts
@@ -13549,6 +13877,224 @@ var keychainCapability = {
13549
13877
  }
13550
13878
  };
13551
13879
  //#endregion
13880
+ //#region src/capabilities/device-credentials.cap.ts
13881
+ var DeviceCaStatusSchema = zod.z.discriminatedUnion("state", [
13882
+ zod.z.object({ state: zod.z.literal("absent") }),
13883
+ zod.z.object({
13884
+ state: zod.z.literal("ready"),
13885
+ subject: zod.z.string(),
13886
+ fingerprintSha256: zod.z.string(),
13887
+ validTo: zod.z.string()
13888
+ }),
13889
+ zod.z.object({
13890
+ state: zod.z.literal("unavailable"),
13891
+ reason: zod.z.string()
13892
+ })
13893
+ ]);
13894
+ var DeviceCertificateSettingsSchema = zod.z.object({ selfEnrollment: zod.z.enum(["allowed", "disabled"]) });
13895
+ /**
13896
+ * `device-credentials` — the admin surface of device certificates (D855).
13897
+ *
13898
+ * Everything a device does ITSELF — completing an enrollment, getting a
13899
+ * challenge, signing in, renewing — is a PUBLIC procedure of the hub's `auth`
13900
+ * router (`auth.completeEnrollment`, `getDeviceChallenge`,
13901
+ * `loginWithDeviceCertificate`, `renewDeviceCertificate`): those legs are
13902
+ * proofs of possession, not capability calls, and must not be reachable as
13903
+ * cap methods. This cap holds only what an operator does about them.
13904
+ *
13905
+ * Provider: `local-auth`, which also owns the device CA and the registry.
13906
+ * The hub is the only node that persists device credentials.
13907
+ */
13908
+ var deviceCredentialsCapability = {
13909
+ name: "device-credentials",
13910
+ scope: "system",
13911
+ mode: "singleton",
13912
+ methods: {
13913
+ /**
13914
+ * Every enrolled device, newest first; `userId` narrows to one user.
13915
+ * `status` is derived: revoked wins over expired.
13916
+ */
13917
+ listDeviceCredentials: require_sleep.method(zod.z.object({
13918
+ userId: zod.z.string().min(1).optional(),
13919
+ includeRevoked: zod.z.boolean().default(false)
13920
+ }), zod.z.array(DeviceCredentialSchema).readonly(), { auth: "admin" }),
13921
+ /**
13922
+ * Mint a one-shot enrollment code for `userId` and a device name: 128-bit
13923
+ * random, single use, 10 minutes, kept only as a hash. Returns the code
13924
+ * once, with the `camstack://enroll?hub=…&code=…` link a QR carries.
13925
+ * `caller` (the admin) is recorded in the audit trail.
13926
+ */
13927
+ startEnrollment: require_sleep.method(zod.z.object({
13928
+ userId: zod.z.string().min(1),
13929
+ deviceName: zod.z.string().min(1).max(80)
13930
+ }), StartEnrollmentOutputSchema, {
13931
+ kind: "mutation",
13932
+ auth: "admin",
13933
+ caller: "required"
13934
+ }),
13935
+ /**
13936
+ * Revoke a credential: its certificate stops logging in at once, and every
13937
+ * session it opened ends (an open session also dies at its next refresh
13938
+ * even if this call raced it). Idempotent.
13939
+ */
13940
+ revokeDeviceCredential: require_sleep.method(zod.z.object({ id: zod.z.string().min(1) }), zod.z.object({
13941
+ revoked: zod.z.boolean(),
13942
+ sessionsEnded: zod.z.number().int(),
13943
+ status: DeviceCredentialStatusSchema
13944
+ }), {
13945
+ kind: "mutation",
13946
+ auth: "admin",
13947
+ caller: "required"
13948
+ }),
13949
+ /**
13950
+ * Hub-wide device-certificate settings. `selfEnrollment`: `allowed`
13951
+ * (default) lets a signed-in user enroll their own device after a step-up
13952
+ * sign-in; `disabled` makes `auth.enrollSelf` refuse. The admin QR path is
13953
+ * unaffected. Hub-wide only (no per-role switch).
13954
+ */
13955
+ getDeviceCertificateSettings: require_sleep.method(zod.z.object({}), DeviceCertificateSettingsSchema, { auth: "admin" }),
13956
+ setDeviceCertificateSettings: require_sleep.method(DeviceCertificateSettingsSchema, DeviceCertificateSettingsSchema, {
13957
+ kind: "mutation",
13958
+ auth: "admin"
13959
+ }),
13960
+ /**
13961
+ * Delete the registry row of a REVOKED credential (clean-up; the audit trail
13962
+ * keeps the revocation). Refuses a live credential: revoke it first. After
13963
+ * the row is gone the device's next call answers `unknown-credential`.
13964
+ */
13965
+ deleteDeviceCredential: require_sleep.method(zod.z.object({ id: zod.z.string().min(1) }), zod.z.object({ result: zod.z.enum([
13966
+ "deleted",
13967
+ "live",
13968
+ "unknown"
13969
+ ]) }), {
13970
+ kind: "mutation",
13971
+ auth: "admin",
13972
+ caller: "required"
13973
+ }),
13974
+ /**
13975
+ * The device CA: `absent` until the first enrollment creates it (lazily,
13976
+ * never rotated on boot), `unavailable` while the keychain cannot answer.
13977
+ */
13978
+ getDeviceCaStatus: require_sleep.method(zod.z.object({}), DeviceCaStatusSchema, { auth: "admin" }),
13979
+ /** Rename a credential (the label only; the certificate is unchanged). */
13980
+ renameDeviceCredential: require_sleep.method(zod.z.object({
13981
+ id: zod.z.string().min(1),
13982
+ deviceName: zod.z.string().min(1).max(80)
13983
+ }), zod.z.object({ renamed: zod.z.boolean() }), {
13984
+ kind: "mutation",
13985
+ auth: "admin"
13986
+ })
13987
+ }
13988
+ };
13989
+ //#endregion
13990
+ //#region src/capabilities/node-certificates.cap.ts
13991
+ /**
13992
+ * `node-certificates` - what a node holds and the two renewals the hub drives
13993
+ * (D856): the node's MESH leaf (mutual TLS to the hub) and its HTTPS leaf (issued
13994
+ * from the hub's local CA so a device that trusts the hub root trusts the node).
13995
+ *
13996
+ * Provided by the AGENT RUNTIME (the synthetic `agent-runtime` addon id, like
13997
+ * `server-management`): the hub reaches it through the ordinary node-pinned
13998
+ * capability call - no new Moleculer action. The hub's own certificates are
13999
+ * handled in-process by the hub (`certificates` router), so this cap has no hub
14000
+ * provider.
14001
+ *
14002
+ * No private key ever crosses the mesh: the node generates its key pair, sends a
14003
+ * CSR, and the hub returns only the signed certificate.
14004
+ */
14005
+ var MeshLeafInfoSchema = zod.z.object({
14006
+ cn: zod.z.string(),
14007
+ serial: zod.z.string(),
14008
+ fingerprintSha256: zod.z.string(),
14009
+ notBefore: zod.z.number(),
14010
+ notAfter: zod.z.number()
14011
+ });
14012
+ var HttpsLeafInfoSchema = zod.z.object({
14013
+ fingerprintSha256: zod.z.string(),
14014
+ issuer: zod.z.string(),
14015
+ sans: zod.z.array(zod.z.string()),
14016
+ notBefore: zod.z.number(),
14017
+ notAfter: zod.z.number()
14018
+ });
14019
+ var NodeHttpsStateSchema = zod.z.discriminatedUnion("state", [zod.z.object({
14020
+ state: zod.z.literal("served"),
14021
+ leaf: HttpsLeafInfoSchema
14022
+ }), zod.z.object({
14023
+ state: zod.z.literal("not-issued"),
14024
+ reason: zod.z.string()
14025
+ })]);
14026
+ var nodeCertificatesCapability = {
14027
+ name: "node-certificates",
14028
+ scope: "system",
14029
+ mode: "singleton",
14030
+ internal: true,
14031
+ methods: {
14032
+ /** The node's current mesh leaf (`null` when it is not enrolled on mTLS) and HTTPS state. */
14033
+ getCertificates: require_sleep.method(zod.z.object({}), zod.z.object({
14034
+ nodeId: zod.z.string(),
14035
+ mesh: MeshLeafInfoSchema.nullable(),
14036
+ https: NodeHttpsStateSchema
14037
+ }), { auth: "admin" }),
14038
+ /** Generate a NEW mesh key pair on the node; return the CSR (CN = node id). The key stays here. */
14039
+ prepareMeshRenewal: require_sleep.method(zod.z.object({}), zod.z.object({ csrPem: zod.z.string() }), {
14040
+ kind: "mutation",
14041
+ auth: "admin"
14042
+ }),
14043
+ /**
14044
+ * Install the hub-signed leaf for the key made by `prepareMeshRenewal`: persist it
14045
+ * (keeping the previous one), then reconnect to the hub with it. The node reverts to
14046
+ * the previous leaf by itself unless `confirmMeshLeaf` arrives within `confirmWithinMs`.
14047
+ */
14048
+ installMeshLeaf: require_sleep.method(zod.z.object({
14049
+ certPem: zod.z.string().min(1),
14050
+ caCertPem: zod.z.string().min(1),
14051
+ confirmWithinMs: zod.z.number().int().min(1e4).max(6e5)
14052
+ }), zod.z.object({
14053
+ fingerprintSha256: zod.z.string(),
14054
+ serial: zod.z.string()
14055
+ }), {
14056
+ kind: "mutation",
14057
+ auth: "admin"
14058
+ }),
14059
+ /** The hub saw the node reconnect with the new leaf: keep it, forget the previous one. */
14060
+ confirmMeshLeaf: require_sleep.method(zod.z.object({ fingerprintSha256: zod.z.string() }), zod.z.object({ confirmed: zod.z.boolean() }), {
14061
+ kind: "mutation",
14062
+ auth: "admin"
14063
+ }),
14064
+ /** Go back to the previous leaf now. `false` when there is none to go back to. */
14065
+ rollbackMeshLeaf: require_sleep.method(zod.z.object({}), zod.z.object({ rolledBack: zod.z.boolean() }), {
14066
+ kind: "mutation",
14067
+ auth: "admin"
14068
+ }),
14069
+ /** A key pair + CSR for the node's HTTPS leaf, and the names the node reports for itself. */
14070
+ prepareHttpsCertificate: require_sleep.method(zod.z.object({}), zod.z.object({
14071
+ csrPem: zod.z.string(),
14072
+ hostnames: zod.z.array(zod.z.string()),
14073
+ addresses: zod.z.array(zod.z.string()),
14074
+ /** SHA-256 of the hub local CA this node pinned at its first install; `null` before one. */
14075
+ pinnedCaFingerprintSha256: zod.z.string().nullable()
14076
+ }), {
14077
+ kind: "mutation",
14078
+ auth: "admin"
14079
+ }),
14080
+ /** Install the hub-signed HTTPS leaf and hot-swap the serving context (no restart). */
14081
+ installHttpsCertificate: require_sleep.method(zod.z.object({
14082
+ certPem: zod.z.string().min(1),
14083
+ caCertPem: zod.z.string().min(1),
14084
+ /**
14085
+ * The hub signals that its local CA was rotated (D227) and this leaf chains to the NEW
14086
+ * one. Only the hub, over the authenticated mesh, can say so; a leaf with a different CA
14087
+ * and no signal is refused.
14088
+ */
14089
+ caRotation: zod.z.boolean().optional()
14090
+ }), HttpsLeafInfoSchema, {
14091
+ kind: "mutation",
14092
+ auth: "admin"
14093
+ })
14094
+ },
14095
+ mount: { kind: "skip" }
14096
+ };
14097
+ //#endregion
13552
14098
  //#region src/capabilities/keychain-admin.cap.ts
13553
14099
  /**
13554
14100
  * `keychain-admin` — the operator's view of the keychain (System → Secrets).
@@ -14417,6 +14963,10 @@ var deviceDiscoveryCapability = {
14417
14963
  * `scripts/check-runtime-state-durability.ts`.
14418
14964
  */
14419
14965
  durability: "session",
14966
+ /**
14967
+ * History (D850): none — inventory.
14968
+ */
14969
+ history: "none",
14420
14970
  methods: {
14421
14971
  /**
14422
14972
  * Snapshot of the current `discovered` list. Returns the
@@ -40936,6 +41486,10 @@ var alarmPanelCapability = {
40936
41486
  * `scripts/check-runtime-state-durability.ts`.
40937
41487
  */
40938
41488
  durability: "restored",
41489
+ /**
41490
+ * History (D850): none — enum state; arm/disarm history belongs in the events ledger.
41491
+ */
41492
+ history: "none",
40939
41493
  /** Clock fields: written, but excluded from the compare that decides
40940
41494
  * whether persisting is worth a SQLite commit. */
40941
41495
  volatileStateFields: ["lastChangedAt"]
@@ -49913,7 +50467,11 @@ var zonesCapability = {
49913
50467
  * See `RuntimeStateDurability`. Enforced by
49914
50468
  * `scripts/check-runtime-state-durability.ts`.
49915
50469
  */
49916
- durability: "restored"
50470
+ durability: "restored",
50471
+ /**
50472
+ * History (D850): none — configuration arrays.
50473
+ */
50474
+ history: "none"
49917
50475
  };
49918
50476
  //#endregion
49919
50477
  //#region src/capabilities/pipeline-runner.cap.ts
@@ -54033,6 +54591,10 @@ var streamSignalsCapability = {
54033
54591
  * `scripts/check-runtime-state-durability.ts`.
54034
54592
  */
54035
54593
  durability: "session",
54594
+ /**
54595
+ * History (D850): none — array state.
54596
+ */
54597
+ history: "none",
54036
54598
  methods: {
54037
54599
  /**
54038
54600
  * What this device can emit. Empty is a valid and common answer — most
@@ -57252,6 +57814,36 @@ var airQualitySensorCapability = {
57252
57814
  * `scripts/check-runtime-state-durability.ts`.
57253
57815
  */
57254
57816
  durability: "restored",
57817
+ /**
57818
+ * History (D850): recorded series.
57819
+ */
57820
+ history: { fields: {
57821
+ co2Ppm: {
57822
+ kind: "gauge",
57823
+ unit: "ppm",
57824
+ deadband: 5
57825
+ },
57826
+ vocPpb: {
57827
+ kind: "gauge",
57828
+ unit: "ppb",
57829
+ deadband: 5
57830
+ },
57831
+ pm25: {
57832
+ kind: "gauge",
57833
+ unit: "ug/m3",
57834
+ deadband: 1
57835
+ },
57836
+ pm10: {
57837
+ kind: "gauge",
57838
+ unit: "ug/m3",
57839
+ deadband: 1
57840
+ },
57841
+ aqi: {
57842
+ kind: "gauge",
57843
+ unit: "count",
57844
+ deadband: 1
57845
+ }
57846
+ } },
57255
57847
  /** Clock fields: written, but excluded from the compare that decides
57256
57848
  * whether persisting is worth a SQLite commit. */
57257
57849
  volatileStateFields: ["lastFetchedAt"]
@@ -57296,6 +57888,15 @@ var ambientLightSensorCapability = {
57296
57888
  * `scripts/check-runtime-state-durability.ts`.
57297
57889
  */
57298
57890
  durability: "restored",
57891
+ /**
57892
+ * History (D850): recorded series. Wide range, so a RELATIVE deadband (10 %).
57893
+ */
57894
+ history: { fields: { lux: {
57895
+ kind: "gauge",
57896
+ unit: "lx",
57897
+ deadbandPct: 10,
57898
+ minIntervalMs: 6e4
57899
+ } } },
57299
57900
  /** Clock fields: written, but excluded from the compare that decides
57300
57901
  * whether persisting is worth a SQLite commit. */
57301
57902
  volatileStateFields: ["lastFetchedAt"]
@@ -57434,7 +58035,11 @@ var audioMetricsCapability = {
57434
58035
  * See `RuntimeStateDurability`. Enforced by
57435
58036
  * `scripts/check-runtime-state-durability.ts`.
57436
58037
  */
57437
- durability: "session"
58038
+ durability: "session",
58039
+ /**
58040
+ * History (D850): none — the level is the addon series `pipeline-analytics/audio-level` (producer `record`); the other numbers move every inference window and duplicate it.
58041
+ */
58042
+ history: "none"
57438
58043
  };
57439
58044
  //#endregion
57440
58045
  //#region src/capabilities/automation-control.cap.ts
@@ -57505,7 +58110,11 @@ var automationControlCapability = {
57505
58110
  * See `RuntimeStateDurability`. Enforced by
57506
58111
  * `scripts/check-runtime-state-durability.ts`.
57507
58112
  */
57508
- durability: "session"
58113
+ durability: "session",
58114
+ /**
58115
+ * History (D850): none — configuration and transient run state.
58116
+ */
58117
+ history: "none"
57509
58118
  };
57510
58119
  //#endregion
57511
58120
  //#region src/capabilities/battery.cap.ts
@@ -57688,6 +58297,13 @@ onStatusChanged: { data: zod.z.object({
57688
58297
  * `scripts/check-runtime-state-durability.ts`.
57689
58298
  */
57690
58299
  durability: "restored",
58300
+ /**
58301
+ * History (D850): recorded series. The generic capture replaces the `battery` series of `pipeline-analytics:stats-5m`.
58302
+ */
58303
+ history: { fields: { percentage: {
58304
+ kind: "gauge",
58305
+ unit: "%"
58306
+ } } },
57691
58307
  /** Clock fields: written, but excluded from the compare that decides
57692
58308
  * whether persisting is worth a SQLite commit. */
57693
58309
  volatileStateFields: ["lastUpdated"]
@@ -57729,6 +58345,10 @@ var binaryCapability = {
57729
58345
  * `scripts/check-runtime-state-durability.ts`.
57730
58346
  */
57731
58347
  durability: "restored",
58348
+ /**
58349
+ * History (D850): recorded series.
58350
+ */
58351
+ history: { fields: { on: { kind: "boolean" } } },
57732
58352
  /** Clock fields: written, but excluded from the compare that decides
57733
58353
  * whether persisting is worth a SQLite commit. */
57734
58354
  volatileStateFields: ["lastChangedAt"]
@@ -57793,7 +58413,15 @@ onBrightnessChanged: { data: zod.z.object({
57793
58413
  * See `RuntimeStateDurability`. Enforced by
57794
58414
  * `scripts/check-runtime-state-durability.ts`.
57795
58415
  */
57796
- durability: "session"
58416
+ durability: "session",
58417
+ /**
58418
+ * History (D850): recorded series. Actuator tier: level keeps every change.
58419
+ */
58420
+ history: { fields: { percentage: {
58421
+ kind: "gauge",
58422
+ unit: "%",
58423
+ minIntervalMs: 0
58424
+ } } }
57797
58425
  };
57798
58426
  //#endregion
57799
58427
  //#region src/capabilities/button.cap.ts
@@ -58270,6 +58898,10 @@ var carbonMonoxideCapability = {
58270
58898
  * `scripts/check-runtime-state-durability.ts`.
58271
58899
  */
58272
58900
  durability: "restored",
58901
+ /**
58902
+ * History (D850): recorded series.
58903
+ */
58904
+ history: { fields: { detected: { kind: "boolean" } } },
58273
58905
  /** Clock fields: written, but excluded from the compare that decides
58274
58906
  * whether persisting is worth a SQLite commit. */
58275
58907
  volatileStateFields: ["lastChangedAt"]
@@ -58441,7 +59073,37 @@ var climateControlCapability = {
58441
59073
  * See `RuntimeStateDurability`. Enforced by
58442
59074
  * `scripts/check-runtime-state-durability.ts`.
58443
59075
  */
58444
- durability: "session"
59076
+ durability: "session",
59077
+ /**
59078
+ * History (D850): recorded series. Celsius by contract; setpoints keep every change (`minIntervalMs: 0`).
59079
+ */
59080
+ history: { fields: {
59081
+ currentTemp: {
59082
+ kind: "gauge",
59083
+ unit: "°C",
59084
+ deadband: .1
59085
+ },
59086
+ currentHumidity: {
59087
+ kind: "gauge",
59088
+ unit: "%",
59089
+ deadband: .5
59090
+ },
59091
+ target: {
59092
+ kind: "gauge",
59093
+ unit: "°C",
59094
+ minIntervalMs: 0
59095
+ },
59096
+ targetHigh: {
59097
+ kind: "gauge",
59098
+ unit: "°C",
59099
+ minIntervalMs: 0
59100
+ },
59101
+ targetLow: {
59102
+ kind: "gauge",
59103
+ unit: "°C",
59104
+ minIntervalMs: 0
59105
+ }
59106
+ } }
58445
59107
  };
58446
59108
  //#endregion
58447
59109
  //#region src/capabilities/color.cap.ts
@@ -58560,7 +59222,11 @@ onColorChanged: { data: zod.z.object({
58560
59222
  * See `RuntimeStateDurability`. Enforced by
58561
59223
  * `scripts/check-runtime-state-durability.ts`.
58562
59224
  */
58563
- durability: "session"
59225
+ durability: "session",
59226
+ /**
59227
+ * History (D850): none — nested and cosmetic.
59228
+ */
59229
+ history: "none"
58564
59230
  };
58565
59231
  //#endregion
58566
59232
  //#region src/capabilities/connection-test.cap.ts
@@ -58692,6 +59358,10 @@ var connectivityCapability = {
58692
59358
  * `scripts/check-runtime-state-durability.ts`.
58693
59359
  */
58694
59360
  durability: "restored",
59361
+ /**
59362
+ * History (D850): none — duplicates device-status.online (one authority for availability).
59363
+ */
59364
+ history: "none",
58695
59365
  /** Clock fields: written, but excluded from the compare that decides
58696
59366
  * whether persisting is worth a SQLite commit. */
58697
59367
  volatileStateFields: ["lastChangedAt"]
@@ -58818,6 +59488,10 @@ reset: require_sleep.method(zod.z.object({
58818
59488
  * `scripts/check-runtime-state-durability.ts`.
58819
59489
  */
58820
59490
  durability: "restored",
59491
+ /**
59492
+ * History (D850): none — `items` is an array keyed by runtime ids; a history path never enters it.
59493
+ */
59494
+ history: "none",
58821
59495
  /** Clocks, not content: a re-read that changed no item costs no commit. */
58822
59496
  volatileStateFields: ["lastChangedAt", "lastFetchedAt"]
58823
59497
  };
@@ -58860,6 +59534,10 @@ var contactCapability = {
58860
59534
  * `scripts/check-runtime-state-durability.ts`.
58861
59535
  */
58862
59536
  durability: "restored",
59537
+ /**
59538
+ * History (D850): recorded series.
59539
+ */
59540
+ history: { fields: { entryOpen: { kind: "boolean" } } },
58863
59541
  /** Clock fields: written, but excluded from the compare that decides
58864
59542
  * whether persisting is worth a SQLite commit. */
58865
59543
  volatileStateFields: ["lastChangedAt"]
@@ -59001,7 +59679,11 @@ var controlCapability = {
59001
59679
  * See `RuntimeStateDurability`. Enforced by
59002
59680
  * `scripts/check-runtime-state-durability.ts`.
59003
59681
  */
59004
- durability: "session"
59682
+ durability: "session",
59683
+ /**
59684
+ * History (D850): none — `value` is a number/string union; configuration entity.
59685
+ */
59686
+ history: "none"
59005
59687
  };
59006
59688
  //#endregion
59007
59689
  //#region src/capabilities/cover.cap.ts
@@ -59094,6 +59776,14 @@ var coverCapability = {
59094
59776
  * `scripts/check-runtime-state-durability.ts`.
59095
59777
  */
59096
59778
  durability: "restored",
59779
+ /**
59780
+ * History (D850): recorded series. Actuator tier: position keeps every tick of a movement.
59781
+ */
59782
+ history: { fields: { position: {
59783
+ kind: "gauge",
59784
+ unit: "%",
59785
+ minIntervalMs: 0
59786
+ } } },
59097
59787
  /** Clock fields: written, but excluded from the compare that decides
59098
59788
  * whether persisting is worth a SQLite commit. */
59099
59789
  volatileStateFields: ["lastChangedAt"]
@@ -59200,6 +59890,10 @@ var dayNightCapability = {
59200
59890
  * `scripts/check-runtime-state-durability.ts`.
59201
59891
  */
59202
59892
  durability: "restored",
59893
+ /**
59894
+ * History (D850): none — firmware configuration, not a measurement.
59895
+ */
59896
+ history: "none",
59203
59897
  /** Clock fields: written, but excluded from the compare that decides
59204
59898
  * whether persisting is worth a SQLite commit. */
59205
59899
  volatileStateFields: ["lastFetchedAt"]
@@ -59259,6 +59953,10 @@ onStatusChanged: { data: zod.z.object({
59259
59953
  * `scripts/check-runtime-state-durability.ts`.
59260
59954
  */
59261
59955
  durability: "restored",
59956
+ /**
59957
+ * History (D850): recorded series. The ONE availability series.
59958
+ */
59959
+ history: { fields: { online: { kind: "boolean" } } },
59262
59960
  /** Clock fields: written, but excluded from the compare that decides
59263
59961
  * whether persisting is worth a SQLite commit. */
59264
59962
  volatileStateFields: ["lastChangedAt"]
@@ -59327,7 +60025,11 @@ onPressed: {
59327
60025
  * See `RuntimeStateDurability`. Enforced by
59328
60026
  * `scripts/check-runtime-state-durability.ts`.
59329
60027
  */
59330
- durability: "restored"
60028
+ durability: "restored",
60029
+ /**
60030
+ * History (D850): none — `pressCountSinceStart` resets with the addon, so it is not a monotonic meter; presses live in the events ledger.
60031
+ */
60032
+ history: "none"
59331
60033
  };
59332
60034
  //#endregion
59333
60035
  //#region src/capabilities/enum-sensor.cap.ts
@@ -59377,6 +60079,10 @@ var enumSensorCapability = {
59377
60079
  * `scripts/check-runtime-state-durability.ts`.
59378
60080
  */
59379
60081
  durability: "restored",
60082
+ /**
60083
+ * History (D850): none — text/enum state has no history (non-goal).
60084
+ */
60085
+ history: "none",
59380
60086
  /** Clock fields: written, but excluded from the compare that decides
59381
60087
  * whether persisting is worth a SQLite commit. */
59382
60088
  volatileStateFields: ["lastFetchedAt"]
@@ -59424,7 +60130,11 @@ var eventEmitterCapability = {
59424
60130
  * See `RuntimeStateDurability`. Enforced by
59425
60131
  * `scripts/check-runtime-state-durability.ts`.
59426
60132
  */
59427
- durability: "session"
60133
+ durability: "session",
60134
+ /**
60135
+ * History (D850): none — `eventCountSinceStart` resets with the addon; events live in ledgers.
60136
+ */
60137
+ history: "none"
59428
60138
  };
59429
60139
  //#endregion
59430
60140
  //#region src/capabilities/face-gallery.cap.ts
@@ -59924,7 +60634,18 @@ var fanControlCapability = {
59924
60634
  * See `RuntimeStateDurability`. Enforced by
59925
60635
  * `scripts/check-runtime-state-durability.ts`.
59926
60636
  */
59927
- durability: "session"
60637
+ durability: "session",
60638
+ /**
60639
+ * History (D850): recorded series. Actuator tier: speed keeps every change.
60640
+ */
60641
+ history: { fields: {
60642
+ percentage: {
60643
+ kind: "gauge",
60644
+ unit: "%",
60645
+ minIntervalMs: 0
60646
+ },
60647
+ oscillating: { kind: "boolean" }
60648
+ } }
59928
60649
  };
59929
60650
  //#endregion
59930
60651
  //#region src/capabilities/feature-probe.cap.ts
@@ -60009,7 +60730,11 @@ onProbeChanged: { data: zod.z.object({
60009
60730
  * See `RuntimeStateDurability`. Enforced by
60010
60731
  * `scripts/check-runtime-state-durability.ts`.
60011
60732
  */
60012
- durability: "session"
60733
+ durability: "session",
60734
+ /**
60735
+ * History (D850): none — static identity and capability probe.
60736
+ */
60737
+ history: "none"
60013
60738
  };
60014
60739
  //#endregion
60015
60740
  //#region src/capabilities/flood.cap.ts
@@ -60046,6 +60771,10 @@ var floodCapability = {
60046
60771
  * `scripts/check-runtime-state-durability.ts`.
60047
60772
  */
60048
60773
  durability: "restored",
60774
+ /**
60775
+ * History (D850): recorded series.
60776
+ */
60777
+ history: { fields: { flooded: { kind: "boolean" } } },
60049
60778
  /** Clock fields: written, but excluded from the compare that decides
60050
60779
  * whether persisting is worth a SQLite commit. */
60051
60780
  volatileStateFields: ["lastChangedAt"]
@@ -60081,6 +60810,10 @@ var gasCapability = {
60081
60810
  * `scripts/check-runtime-state-durability.ts`.
60082
60811
  */
60083
60812
  durability: "restored",
60813
+ /**
60814
+ * History (D850): recorded series.
60815
+ */
60816
+ history: { fields: { detected: { kind: "boolean" } } },
60084
60817
  /** Clock fields: written, but excluded from the compare that decides
60085
60818
  * whether persisting is worth a SQLite commit. */
60086
60819
  volatileStateFields: ["lastChangedAt"]
@@ -60168,7 +60901,18 @@ var humidifierCapability = {
60168
60901
  * See `RuntimeStateDurability`. Enforced by
60169
60902
  * `scripts/check-runtime-state-durability.ts`.
60170
60903
  */
60171
- durability: "session"
60904
+ durability: "session",
60905
+ /**
60906
+ * History (D850): recorded series.
60907
+ */
60908
+ history: { fields: {
60909
+ currentHumidity: {
60910
+ kind: "gauge",
60911
+ unit: "%",
60912
+ deadband: .5
60913
+ },
60914
+ on: { kind: "boolean" }
60915
+ } }
60172
60916
  };
60173
60917
  //#endregion
60174
60918
  //#region src/capabilities/humidity-sensor.cap.ts
@@ -60214,6 +60958,14 @@ var humiditySensorCapability = {
60214
60958
  * `scripts/check-runtime-state-durability.ts`.
60215
60959
  */
60216
60960
  durability: "restored",
60961
+ /**
60962
+ * History (D850): recorded series.
60963
+ */
60964
+ history: { fields: { percent: {
60965
+ kind: "gauge",
60966
+ unit: "%",
60967
+ deadband: .5
60968
+ } } },
60217
60969
  /** Clock fields: written, but excluded from the compare that decides
60218
60970
  * whether persisting is worth a SQLite commit. */
60219
60971
  volatileStateFields: ["lastFetchedAt"]
@@ -60263,7 +61015,11 @@ var imageCapability = {
60263
61015
  * See `RuntimeStateDurability`. Enforced by
60264
61016
  * `scripts/check-runtime-state-durability.ts`.
60265
61017
  */
60266
- durability: "session"
61018
+ durability: "session",
61019
+ /**
61020
+ * History (D850): none — not numeric.
61021
+ */
61022
+ history: "none"
60267
61023
  };
60268
61024
  //#endregion
60269
61025
  //#region src/capabilities/image-settings.cap.ts
@@ -60422,6 +61178,10 @@ var imageSettingsCapability = {
60422
61178
  * `scripts/check-runtime-state-durability.ts`.
60423
61179
  */
60424
61180
  durability: "restored",
61181
+ /**
61182
+ * History (D850): none — camera image configuration (operator intent), not a trend.
61183
+ */
61184
+ history: "none",
60425
61185
  /** Clock fields: written, but excluded from the compare that decides
60426
61186
  * whether persisting is worth a SQLite commit. */
60427
61187
  volatileStateFields: ["lastFetchedAt"]
@@ -60829,7 +61589,11 @@ var intercomCapability = {
60829
61589
  * See `RuntimeStateDurability`. Enforced by
60830
61590
  * `scripts/check-runtime-state-durability.ts`.
60831
61591
  */
60832
- durability: "session"
61592
+ durability: "session",
61593
+ /**
61594
+ * History (D850): none — talk sessions are a ledger concern, not a trend.
61595
+ */
61596
+ history: "none"
60833
61597
  };
60834
61598
  //#endregion
60835
61599
  //#region src/capabilities/lawn-mower-control.cap.ts
@@ -60912,7 +61676,15 @@ var lawnMowerControlCapability = {
60912
61676
  * See `RuntimeStateDurability`. Enforced by
60913
61677
  * `scripts/check-runtime-state-durability.ts`.
60914
61678
  */
60915
- durability: "session"
61679
+ durability: "session",
61680
+ /**
61681
+ * History (D850): recorded series.
61682
+ */
61683
+ history: { fields: { batteryLevel: {
61684
+ kind: "gauge",
61685
+ unit: "%",
61686
+ deadband: 2
61687
+ } } }
60916
61688
  };
60917
61689
  //#endregion
60918
61690
  //#region src/capabilities/local-network.cap.ts
@@ -61507,6 +62279,10 @@ var lockControlCapability = {
61507
62279
  * `scripts/check-runtime-state-durability.ts`.
61508
62280
  */
61509
62281
  durability: "restored",
62282
+ /**
62283
+ * History (D850): none — enum state; lock events belong in the events ledger.
62284
+ */
62285
+ history: "none",
61510
62286
  /** Clock fields: written, but excluded from the compare that decides
61511
62287
  * whether persisting is worth a SQLite commit. */
61512
62288
  volatileStateFields: ["lastChangedAt"]
@@ -61680,7 +62456,11 @@ var mediaPlayerCapability = {
61680
62456
  * See `RuntimeStateDurability`. Enforced by
61681
62457
  * `scripts/check-runtime-state-durability.ts`.
61682
62458
  */
61683
- durability: "session"
62459
+ durability: "session",
62460
+ /**
62461
+ * History (D850): none — `positionMs` moves continuously while playing; volume is transient.
62462
+ */
62463
+ history: "none"
61684
62464
  };
61685
62465
  //#endregion
61686
62466
  //#region src/capabilities/mesh-network.cap.ts
@@ -62079,7 +62859,14 @@ onMotionChanged: { data: MotionOnMotionChangedDataSchema } },
62079
62859
  * See `RuntimeStateDurability`. Enforced by
62080
62860
  * `scripts/check-runtime-state-durability.ts`.
62081
62861
  */
62082
- durability: "session"
62862
+ durability: "session",
62863
+ /**
62864
+ * History (D850): recorded series. A PIR sensor is a series; a camera is not (its motion is an addon series and a ledger).
62865
+ */
62866
+ history: { fields: { detected: {
62867
+ kind: "boolean",
62868
+ excludeDeviceTypes: [require_err_msg.DeviceType.Camera]
62869
+ } } }
62083
62870
  };
62084
62871
  //#endregion
62085
62872
  //#region src/capabilities/motion-trigger.cap.ts
@@ -62153,7 +62940,11 @@ var motionTriggerCapability = {
62153
62940
  * See `RuntimeStateDurability`. Enforced by
62154
62941
  * `scripts/check-runtime-state-durability.ts`.
62155
62942
  */
62156
- durability: "session"
62943
+ durability: "session",
62944
+ /**
62945
+ * History (D850): none — configuration switch.
62946
+ */
62947
+ history: "none"
62157
62948
  };
62158
62949
  //#endregion
62159
62950
  //#region src/capabilities/motion-zones.cap.ts
@@ -62230,6 +63021,10 @@ var motionZonesCapability = {
62230
63021
  * `scripts/check-runtime-state-durability.ts`.
62231
63022
  */
62232
63023
  durability: "restored",
63024
+ /**
63025
+ * History (D850): none — configuration.
63026
+ */
63027
+ history: "none",
62233
63028
  /** Clock fields: written, but excluded from the compare that decides
62234
63029
  * whether persisting is worth a SQLite commit. */
62235
63030
  volatileStateFields: ["lastFetchedAt"]
@@ -62361,6 +63156,10 @@ var nativeObjectDetectionCapability = {
62361
63156
  * `scripts/check-runtime-state-durability.ts`.
62362
63157
  */
62363
63158
  durability: "restored",
63159
+ /**
63160
+ * History (D850): none — event-like and nested per class; detections live in the objects ledger.
63161
+ */
63162
+ history: "none",
62364
63163
  /** Clock fields: written, but excluded from the compare that decides
62365
63164
  * whether persisting is worth a SQLite commit. */
62366
63165
  volatileStateFields: ["lastFetchedAt"]
@@ -62788,7 +63587,11 @@ var navigationCapability = {
62788
63587
  * See `RuntimeStateDurability`. Enforced by
62789
63588
  * `scripts/check-runtime-state-durability.ts`.
62790
63589
  */
62791
- durability: "session"
63590
+ durability: "session",
63591
+ /**
63592
+ * History (D850): none — control state of a robotic camera, configuration-like.
63593
+ */
63594
+ history: "none"
62792
63595
  };
62793
63596
  //#endregion
62794
63597
  //#region src/capabilities/network-link.cap.ts
@@ -62905,6 +63708,23 @@ onStatusChanged: { data: zod.z.object({
62905
63708
  * `scripts/check-runtime-state-durability.ts`.
62906
63709
  */
62907
63710
  durability: "restored",
63711
+ /**
63712
+ * History (D850): recorded series.
63713
+ */
63714
+ history: { fields: {
63715
+ signalPercent: {
63716
+ kind: "gauge",
63717
+ unit: "%",
63718
+ deadband: 3,
63719
+ minIntervalMs: 6e4
63720
+ },
63721
+ rssiDbm: {
63722
+ kind: "gauge",
63723
+ unit: "dBm",
63724
+ deadband: 2,
63725
+ minIntervalMs: 6e4
63726
+ }
63727
+ } },
62908
63728
  /** Clock fields: written, but excluded from the compare that decides
62909
63729
  * whether persisting is worth a SQLite commit. */
62910
63730
  volatileStateFields: ["lastUpdated"]
@@ -63364,7 +64184,11 @@ onSent: { data: zod.z.object({
63364
64184
  * See `RuntimeStateDurability`. Enforced by
63365
64185
  * `scripts/check-runtime-state-durability.ts`.
63366
64186
  */
63367
- durability: "session"
64187
+ durability: "session",
64188
+ /**
64189
+ * History (D850): none — `queueDepth` is outbox operational state, not a device trend.
64190
+ */
64191
+ history: "none"
63368
64192
  };
63369
64193
  //#endregion
63370
64194
  //#region src/capabilities/numeric-sensor.cap.ts
@@ -63417,6 +64241,14 @@ var numericSensorCapability = {
63417
64241
  * `scripts/check-runtime-state-durability.ts`.
63418
64242
  */
63419
64243
  durability: "restored",
64244
+ /**
64245
+ * History (D850): recorded series. The unit is per device, read from the sibling `unit` field.
64246
+ */
64247
+ history: { fields: { value: {
64248
+ kind: "gauge",
64249
+ unitFrom: "unit",
64250
+ minIntervalMs: 3e4
64251
+ } } },
63420
64252
  /** Clock fields: written, but excluded from the compare that decides
63421
64253
  * whether persisting is worth a SQLite commit. */
63422
64254
  volatileStateFields: ["lastFetchedAt"]
@@ -64012,7 +64844,24 @@ var petFeederCapability = {
64012
64844
  * See `RuntimeStateDurability`. Enforced by
64013
64845
  * `scripts/check-runtime-state-durability.ts`.
64014
64846
  */
64015
- durability: "session"
64847
+ durability: "session",
64848
+ /**
64849
+ * History (D850): recorded series.
64850
+ */
64851
+ history: { fields: {
64852
+ foodLevel: { kind: "gauge" },
64853
+ food1: { kind: "gauge" },
64854
+ food2: { kind: "gauge" },
64855
+ batteryPower: {
64856
+ kind: "gauge",
64857
+ unit: "%",
64858
+ deadband: 2
64859
+ },
64860
+ desiccantLeftDays: {
64861
+ kind: "gauge",
64862
+ unit: "days"
64863
+ }
64864
+ } }
64016
64865
  };
64017
64866
  //#endregion
64018
64867
  //#region src/capabilities/plate-gallery.cap.ts
@@ -64441,6 +65290,47 @@ var powerMeterCapability = {
64441
65290
  * `scripts/check-runtime-state-durability.ts`.
64442
65291
  */
64443
65292
  durability: "restored",
65293
+ /**
65294
+ * History (D850): recorded series. Gauges are floored at 30 s; `kwhTotal` is the one monotonic meter (counter).
65295
+ */
65296
+ history: { fields: {
65297
+ watts: {
65298
+ kind: "gauge",
65299
+ unit: "W",
65300
+ deadband: 1,
65301
+ minIntervalMs: 3e4
65302
+ },
65303
+ kwhTotal: {
65304
+ kind: "counter",
65305
+ unit: "kWh",
65306
+ deadband: .01,
65307
+ minIntervalMs: 6e4
65308
+ },
65309
+ volts: {
65310
+ kind: "gauge",
65311
+ unit: "V",
65312
+ deadband: 1,
65313
+ minIntervalMs: 3e4
65314
+ },
65315
+ amps: {
65316
+ kind: "gauge",
65317
+ unit: "A",
65318
+ deadband: .05,
65319
+ minIntervalMs: 3e4
65320
+ },
65321
+ va: {
65322
+ kind: "gauge",
65323
+ unit: "VA",
65324
+ deadband: 1,
65325
+ minIntervalMs: 3e4
65326
+ },
65327
+ powerFactor: {
65328
+ kind: "gauge",
65329
+ unit: "ratio",
65330
+ deadband: .01,
65331
+ minIntervalMs: 6e4
65332
+ }
65333
+ } },
64444
65334
  /** Clock fields: written, but excluded from the compare that decides
64445
65335
  * whether persisting is worth a SQLite commit. */
64446
65336
  volatileStateFields: ["lastFetchedAt"]
@@ -64510,6 +65400,14 @@ var presenceCapability = {
64510
65400
  * `scripts/check-runtime-state-durability.ts`.
64511
65401
  */
64512
65402
  durability: "restored",
65403
+ /**
65404
+ * History (D850): recorded series.
65405
+ */
65406
+ history: { fields: { batteryPercent: {
65407
+ kind: "gauge",
65408
+ unit: "%",
65409
+ deadband: 1
65410
+ } } },
64513
65411
  /** Clock fields: written, but excluded from the compare that decides
64514
65412
  * whether persisting is worth a SQLite commit. */
64515
65413
  volatileStateFields: ["lastChangedAt"]
@@ -64558,6 +65456,14 @@ var pressureSensorCapability = {
64558
65456
  * `scripts/check-runtime-state-durability.ts`.
64559
65457
  */
64560
65458
  durability: "restored",
65459
+ /**
65460
+ * History (D850): recorded series.
65461
+ */
65462
+ history: { fields: { hpa: {
65463
+ kind: "gauge",
65464
+ unit: "hPa",
65465
+ deadband: .1
65466
+ } } },
64561
65467
  /** Clock fields: written, but excluded from the compare that decides
64562
65468
  * whether persisting is worth a SQLite commit. */
64563
65469
  volatileStateFields: ["lastFetchedAt"]
@@ -64719,6 +65625,10 @@ var privacyMaskCapability = {
64719
65625
  * `scripts/check-runtime-state-durability.ts`.
64720
65626
  */
64721
65627
  durability: "restored",
65628
+ /**
65629
+ * History (D850): none — configuration.
65630
+ */
65631
+ history: "none",
64722
65632
  /** Clock fields: written, but excluded from the compare that decides
64723
65633
  * whether persisting is worth a SQLite commit. */
64724
65634
  volatileStateFields: ["lastFetchedAt"]
@@ -65231,7 +66141,11 @@ var ptzAutotrackCapability = {
65231
66141
  * See `RuntimeStateDurability`. Enforced by
65232
66142
  * `scripts/check-runtime-state-durability.ts`.
65233
66143
  */
65234
- durability: "session"
66144
+ durability: "session",
66145
+ /**
66146
+ * History (D850): none — configuration and capability.
66147
+ */
66148
+ history: "none"
65235
66149
  };
65236
66150
  //#endregion
65237
66151
  //#region src/capabilities/reboot.cap.ts
@@ -67264,6 +68178,10 @@ var recordingOnboardCapability = {
67264
68178
  * `scripts/check-runtime-state-durability.ts`.
67265
68179
  */
67266
68180
  durability: "restored",
68181
+ /**
68182
+ * History (D850): none — SD-card configuration and window inventory; arrays.
68183
+ */
68184
+ history: "none",
67267
68185
  /** Clock fields: written, but excluded from the compare that decides
67268
68186
  * whether persisting is worth a SQLite commit. */
67269
68187
  volatileStateFields: ["lastFetchedAt"]
@@ -67600,7 +68518,11 @@ getStatus: require_sleep.method(zod.z.object({ deviceId: zod.z.number() }), Reco
67600
68518
  * See `RuntimeStateDurability`. Enforced by
67601
68519
  * `scripts/check-runtime-state-durability.ts`.
67602
68520
  */
67603
- durability: "session"
68521
+ durability: "session",
68522
+ /**
68523
+ * History (D850): none — recording intent is already in the recordings ledger.
68524
+ */
68525
+ history: "none"
67604
68526
  };
67605
68527
  //#endregion
67606
68528
  //#region src/capabilities/reserved-collection-sources.ts
@@ -68025,7 +68947,11 @@ var sceneMonitorCapability = {
68025
68947
  * See `RuntimeStateDurability`. Enforced by
68026
68948
  * `scripts/check-runtime-state-durability.ts`.
68027
68949
  */
68028
- durability: "session"
68950
+ durability: "session",
68951
+ /**
68952
+ * History (D850): none — nested configuration.
68953
+ */
68954
+ history: "none"
68029
68955
  };
68030
68956
  //#endregion
68031
68957
  //#region src/capabilities/schemas/zone-rule.ts
@@ -68184,7 +69110,11 @@ var scriptRunnerCapability = {
68184
69110
  * See `RuntimeStateDurability`. Enforced by
68185
69111
  * `scripts/check-runtime-state-durability.ts`.
68186
69112
  */
68187
- durability: "session"
69113
+ durability: "session",
69114
+ /**
69115
+ * History (D850): none — transient; run results belong in a ledger.
69116
+ */
69117
+ history: "none"
68188
69118
  };
68189
69119
  //#endregion
68190
69120
  //#region src/capabilities/smoke.cap.ts
@@ -68221,6 +69151,10 @@ var smokeCapability = {
68221
69151
  * `scripts/check-runtime-state-durability.ts`.
68222
69152
  */
68223
69153
  durability: "restored",
69154
+ /**
69155
+ * History (D850): recorded series.
69156
+ */
69157
+ history: { fields: { detected: { kind: "boolean" } } },
68224
69158
  /** Clock fields: written, but excluded from the compare that decides
68225
69159
  * whether persisting is worth a SQLite commit. */
68226
69160
  volatileStateFields: ["lastChangedAt"]
@@ -68322,6 +69256,10 @@ var streamCatalogCapability = {
68322
69256
  * `scripts/check-runtime-state-durability.ts`.
68323
69257
  */
68324
69258
  durability: "restored",
69259
+ /**
69260
+ * History (D850): none — stream inventory.
69261
+ */
69262
+ history: "none",
68325
69263
  /** Clock field: written, but excluded from the compare that decides whether
68326
69264
  * persisting is worth a SQLite commit — the descriptors are the value. */
68327
69265
  volatileStateFields: ["lastFetchedAt"]
@@ -68473,6 +69411,10 @@ var streamParamsCapability = {
68473
69411
  * `scripts/check-runtime-state-durability.ts`.
68474
69412
  */
68475
69413
  durability: "restored",
69414
+ /**
69415
+ * History (D850): none — encoder configuration.
69416
+ */
69417
+ history: "none",
68476
69418
  /** Clock fields: written, but excluded from the compare that decides
68477
69419
  * whether persisting is worth a SQLite commit. */
68478
69420
  volatileStateFields: ["lastFetchedAt"]
@@ -68789,6 +69731,10 @@ var switchCapability = {
68789
69731
  * `scripts/check-runtime-state-durability.ts`.
68790
69732
  */
68791
69733
  durability: "restored",
69734
+ /**
69735
+ * History (D850): recorded series.
69736
+ */
69737
+ history: { fields: { on: { kind: "boolean" } } },
68792
69738
  /** Clock fields: written, but excluded from the compare that decides
68793
69739
  * whether persisting is worth a SQLite commit. */
68794
69740
  volatileStateFields: ["lastChangedAt"],
@@ -69467,6 +70413,10 @@ var tamperCapability = {
69467
70413
  * `scripts/check-runtime-state-durability.ts`.
69468
70414
  */
69469
70415
  durability: "restored",
70416
+ /**
70417
+ * History (D850): recorded series.
70418
+ */
70419
+ history: { fields: { tampered: { kind: "boolean" } } },
69470
70420
  /** Clock fields: written, but excluded from the compare that decides
69471
70421
  * whether persisting is worth a SQLite commit. */
69472
70422
  volatileStateFields: ["lastChangedAt"]
@@ -69524,6 +70474,14 @@ var temperatureSensorCapability = {
69524
70474
  * `scripts/check-runtime-state-durability.ts`.
69525
70475
  */
69526
70476
  durability: "restored",
70477
+ /**
70478
+ * History (D850): recorded series.
70479
+ */
70480
+ history: { fields: { celsius: {
70481
+ kind: "gauge",
70482
+ unit: "°C",
70483
+ deadband: .1
70484
+ } } },
69527
70485
  /** Clock fields: written, but excluded from the compare that decides
69528
70486
  * whether persisting is worth a SQLite commit. */
69529
70487
  volatileStateFields: ["lastFetchedAt"]
@@ -69613,7 +70571,11 @@ var updateCapability = {
69613
70571
  * See `RuntimeStateDurability`. Enforced by
69614
70572
  * `scripts/check-runtime-state-durability.ts`.
69615
70573
  */
69616
- durability: "session"
70574
+ durability: "session",
70575
+ /**
70576
+ * History (D850): none — text and state.
70577
+ */
70578
+ history: "none"
69617
70579
  };
69618
70580
  //#endregion
69619
70581
  //#region src/capabilities/user-management.cap.ts
@@ -70009,7 +70971,37 @@ var vacuumControlCapability = {
70009
70971
  * See `RuntimeStateDurability`. Enforced by
70010
70972
  * `scripts/check-runtime-state-durability.ts`.
70011
70973
  */
70012
- durability: "session"
70974
+ durability: "session",
70975
+ /**
70976
+ * History (D850): recorded series. Tank levels are fixed-object paths (`cleanWater.level`, ...).
70977
+ */
70978
+ history: { fields: {
70979
+ batteryLevel: {
70980
+ kind: "gauge",
70981
+ unit: "%",
70982
+ deadband: 2
70983
+ },
70984
+ "cleanWater.level": {
70985
+ kind: "gauge",
70986
+ unit: "%",
70987
+ deadband: 2
70988
+ },
70989
+ "dirtyWater.level": {
70990
+ kind: "gauge",
70991
+ unit: "%",
70992
+ deadband: 2
70993
+ },
70994
+ "detergent.level": {
70995
+ kind: "gauge",
70996
+ unit: "%",
70997
+ deadband: 2
70998
+ },
70999
+ "dustBin.level": {
71000
+ kind: "gauge",
71001
+ unit: "%",
71002
+ deadband: 2
71003
+ }
71004
+ } }
70013
71005
  };
70014
71006
  //#endregion
70015
71007
  //#region src/capabilities/valve.cap.ts
@@ -70088,7 +71080,15 @@ var valveCapability = {
70088
71080
  * See `RuntimeStateDurability`. Enforced by
70089
71081
  * `scripts/check-runtime-state-durability.ts`.
70090
71082
  */
70091
- durability: "session"
71083
+ durability: "session",
71084
+ /**
71085
+ * History (D850): recorded series. Actuator tier: position keeps every change.
71086
+ */
71087
+ history: { fields: { position: {
71088
+ kind: "gauge",
71089
+ unit: "%",
71090
+ minIntervalMs: 0
71091
+ } } }
70092
71092
  };
70093
71093
  //#endregion
70094
71094
  //#region src/capabilities/vibration.cap.ts
@@ -70120,6 +71120,10 @@ var vibrationCapability = {
70120
71120
  * `scripts/check-runtime-state-durability.ts`.
70121
71121
  */
70122
71122
  durability: "restored",
71123
+ /**
71124
+ * History (D850): recorded series.
71125
+ */
71126
+ history: { fields: { detected: { kind: "boolean" } } },
70123
71127
  /** Clock fields: written, but excluded from the compare that decides
70124
71128
  * whether persisting is worth a SQLite commit. */
70125
71129
  volatileStateFields: ["lastChangedAt"]
@@ -70205,7 +71209,22 @@ var waterHeaterCapability = {
70205
71209
  * See `RuntimeStateDurability`. Enforced by
70206
71210
  * `scripts/check-runtime-state-durability.ts`.
70207
71211
  */
70208
- durability: "session"
71212
+ durability: "session",
71213
+ /**
71214
+ * History (D850): recorded series. The schema carries no unit; providers publish Celsius. Setpoint keeps every change.
71215
+ */
71216
+ history: { fields: {
71217
+ currentTemp: {
71218
+ kind: "gauge",
71219
+ unit: "°C",
71220
+ deadband: .5
71221
+ },
71222
+ targetTemp: {
71223
+ kind: "gauge",
71224
+ unit: "°C",
71225
+ minIntervalMs: 0
71226
+ }
71227
+ } }
70209
71228
  };
70210
71229
  //#endregion
70211
71230
  //#region src/capabilities/weather.cap.ts
@@ -70273,7 +71292,32 @@ var weatherCapability = {
70273
71292
  * See `RuntimeStateDurability`. Enforced by
70274
71293
  * `scripts/check-runtime-state-durability.ts`.
70275
71294
  */
70276
- durability: "session"
71295
+ durability: "session",
71296
+ /**
71297
+ * History (D850): recorded series. Units follow the sibling `*Unit` fields.
71298
+ */
71299
+ history: { fields: {
71300
+ temperature: {
71301
+ kind: "gauge",
71302
+ unitFrom: "temperatureUnit",
71303
+ deadband: .2
71304
+ },
71305
+ humidity: {
71306
+ kind: "gauge",
71307
+ unit: "%",
71308
+ deadband: 1
71309
+ },
71310
+ pressure: {
71311
+ kind: "gauge",
71312
+ unitFrom: "pressureUnit",
71313
+ deadband: .5
71314
+ },
71315
+ windSpeed: {
71316
+ kind: "gauge",
71317
+ unitFrom: "windSpeedUnit",
71318
+ deadband: .5
71319
+ }
71320
+ } }
70277
71321
  };
70278
71322
  //#endregion
70279
71323
  //#region src/capabilities/zone-analytics.cap.ts
@@ -70517,7 +71561,11 @@ var zoneAnalyticsCapability = {
70517
71561
  * See `RuntimeStateDurability`. Enforced by
70518
71562
  * `scripts/check-runtime-state-durability.ts`.
70519
71563
  */
70520
- durability: "session"
71564
+ durability: "session",
71565
+ /**
71566
+ * History (D850): none — occupancy is the addon series `pipeline-analytics/occupancy`; the rest is per-zone arrays keyed by runtime ids.
71567
+ */
71568
+ history: "none"
70521
71569
  };
70522
71570
  //#endregion
70523
71571
  //#region src/capabilities/zone-rules.cap.ts
@@ -70604,7 +71652,11 @@ var zoneRulesCapability = {
70604
71652
  * See `RuntimeStateDurability`. Enforced by
70605
71653
  * `scripts/check-runtime-state-durability.ts`.
70606
71654
  */
70607
- durability: "restored"
71655
+ durability: "restored",
71656
+ /**
71657
+ * History (D850): none — configuration arrays.
71658
+ */
71659
+ history: "none"
70608
71660
  };
70609
71661
  //#endregion
70610
71662
  //#region src/capabilities/training-provider.cap.ts
@@ -76263,6 +77315,54 @@ var METHOD_ACCESS_MAP = Object.freeze({
76263
77315
  addonId: null,
76264
77316
  access: "create"
76265
77317
  },
77318
+ "deviceCredentials.deleteDeviceCredential": {
77319
+ capName: "device-credentials",
77320
+ capScope: "system",
77321
+ addonId: null,
77322
+ access: "delete"
77323
+ },
77324
+ "deviceCredentials.getDeviceCaStatus": {
77325
+ capName: "device-credentials",
77326
+ capScope: "system",
77327
+ addonId: null,
77328
+ access: "view"
77329
+ },
77330
+ "deviceCredentials.getDeviceCertificateSettings": {
77331
+ capName: "device-credentials",
77332
+ capScope: "system",
77333
+ addonId: null,
77334
+ access: "view"
77335
+ },
77336
+ "deviceCredentials.listDeviceCredentials": {
77337
+ capName: "device-credentials",
77338
+ capScope: "system",
77339
+ addonId: null,
77340
+ access: "view"
77341
+ },
77342
+ "deviceCredentials.renameDeviceCredential": {
77343
+ capName: "device-credentials",
77344
+ capScope: "system",
77345
+ addonId: null,
77346
+ access: "create"
77347
+ },
77348
+ "deviceCredentials.revokeDeviceCredential": {
77349
+ capName: "device-credentials",
77350
+ capScope: "system",
77351
+ addonId: null,
77352
+ access: "delete"
77353
+ },
77354
+ "deviceCredentials.setDeviceCertificateSettings": {
77355
+ capName: "device-credentials",
77356
+ capScope: "system",
77357
+ addonId: null,
77358
+ access: "create"
77359
+ },
77360
+ "deviceCredentials.startEnrollment": {
77361
+ capName: "device-credentials",
77362
+ capScope: "system",
77363
+ addonId: null,
77364
+ access: "create"
77365
+ },
76266
77366
  "deviceDiscovery.adoptDevice": {
76267
77367
  capName: "device-discovery",
76268
77368
  capScope: "device",
@@ -78423,6 +79523,48 @@ var METHOD_ACCESS_MAP = Object.freeze({
78423
79523
  addonId: null,
78424
79524
  access: "create"
78425
79525
  },
79526
+ "nodeCertificates.confirmMeshLeaf": {
79527
+ capName: "node-certificates",
79528
+ capScope: "system",
79529
+ addonId: null,
79530
+ access: "create"
79531
+ },
79532
+ "nodeCertificates.getCertificates": {
79533
+ capName: "node-certificates",
79534
+ capScope: "system",
79535
+ addonId: null,
79536
+ access: "view"
79537
+ },
79538
+ "nodeCertificates.installHttpsCertificate": {
79539
+ capName: "node-certificates",
79540
+ capScope: "system",
79541
+ addonId: null,
79542
+ access: "create"
79543
+ },
79544
+ "nodeCertificates.installMeshLeaf": {
79545
+ capName: "node-certificates",
79546
+ capScope: "system",
79547
+ addonId: null,
79548
+ access: "create"
79549
+ },
79550
+ "nodeCertificates.prepareHttpsCertificate": {
79551
+ capName: "node-certificates",
79552
+ capScope: "system",
79553
+ addonId: null,
79554
+ access: "create"
79555
+ },
79556
+ "nodeCertificates.prepareMeshRenewal": {
79557
+ capName: "node-certificates",
79558
+ capScope: "system",
79559
+ addonId: null,
79560
+ access: "create"
79561
+ },
79562
+ "nodeCertificates.rollbackMeshLeaf": {
79563
+ capName: "node-certificates",
79564
+ capScope: "system",
79565
+ addonId: null,
79566
+ access: "create"
79567
+ },
78426
79568
  "nodes.clusterAddonStatus": {
78427
79569
  capName: "nodes",
78428
79570
  capScope: "system",
@@ -82700,6 +83842,7 @@ var KNOWN_CAP_NAMES = [
82700
83842
  "detection-pipeline",
82701
83843
  "device-admin-link",
82702
83844
  "device-adoption",
83845
+ "device-credentials",
82703
83846
  "device-discovery",
82704
83847
  "device-export",
82705
83848
  "device-extension",
@@ -82751,6 +83894,7 @@ var KNOWN_CAP_NAMES = [
82751
83894
  "network-access",
82752
83895
  "network-link",
82753
83896
  "network-quality",
83897
+ "node-certificates",
82754
83898
  "nodes",
82755
83899
  "notification-output",
82756
83900
  "notification-rules",
@@ -82938,6 +84082,7 @@ var SYSTEM_CAP_NAMES = [
82938
84082
  "database-snapshot",
82939
84083
  "decoder",
82940
84084
  "device-adoption",
84085
+ "device-credentials",
82941
84086
  "device-export",
82942
84087
  "device-manager",
82943
84088
  "device-provider",
@@ -82963,6 +84108,7 @@ var SYSTEM_CAP_NAMES = [
82963
84108
  "mqtt-broker",
82964
84109
  "network-access",
82965
84110
  "network-quality",
84111
+ "node-certificates",
82966
84112
  "nodes",
82967
84113
  "notification-output",
82968
84114
  "notification-rules",
@@ -84964,6 +86110,7 @@ var CAPABILITY_NAMES = {
84964
86110
  detectionPipeline: "detection-pipeline",
84965
86111
  deviceAdminLink: "device-admin-link",
84966
86112
  deviceAdoption: "device-adoption",
86113
+ deviceCredentials: "device-credentials",
84967
86114
  deviceDiscovery: "device-discovery",
84968
86115
  deviceExport: "device-export",
84969
86116
  deviceExtension: "device-extension",
@@ -85015,6 +86162,7 @@ var CAPABILITY_NAMES = {
85015
86162
  networkAccess: "network-access",
85016
86163
  networkLink: "network-link",
85017
86164
  networkQuality: "network-quality",
86165
+ nodeCertificates: "node-certificates",
85018
86166
  nodes: "nodes",
85019
86167
  notificationOutput: "notification-output",
85020
86168
  notificationRules: "notification-rules",
@@ -85287,6 +86435,10 @@ var CAPABILITY_ROUTER_KEYS = [
85287
86435
  key: "deviceAdoption",
85288
86436
  name: "device-adoption"
85289
86437
  },
86438
+ {
86439
+ key: "deviceCredentials",
86440
+ name: "device-credentials"
86441
+ },
85290
86442
  {
85291
86443
  key: "deviceDiscovery",
85292
86444
  name: "device-discovery"
@@ -85491,6 +86643,10 @@ var CAPABILITY_ROUTER_KEYS = [
85491
86643
  key: "networkQuality",
85492
86644
  name: "network-quality"
85493
86645
  },
86646
+ {
86647
+ key: "nodeCertificates",
86648
+ name: "node-certificates"
86649
+ },
85494
86650
  {
85495
86651
  key: "nodes",
85496
86652
  name: "nodes"
@@ -85828,6 +86984,7 @@ var ALL_CAPABILITY_DEFINITIONS = [
85828
86984
  detectionPipelineCapability,
85829
86985
  deviceAdminLinkCapability,
85830
86986
  deviceAdoptionCapability,
86987
+ deviceCredentialsCapability,
85831
86988
  deviceDiscoveryCapability,
85832
86989
  deviceExportCapability,
85833
86990
  deviceExtensionCapability,
@@ -85879,6 +87036,7 @@ var ALL_CAPABILITY_DEFINITIONS = [
85879
87036
  networkAccessCapability,
85880
87037
  networkLinkCapability,
85881
87038
  networkQualityCapability,
87039
+ nodeCertificatesCapability,
85882
87040
  nodesCapability,
85883
87041
  notificationOutputCapability,
85884
87042
  notificationRulesCapability,
@@ -89131,6 +90289,325 @@ var RESTORED_CAP_NAMES = [
89131
90289
  "zones"
89132
90290
  ];
89133
90291
  //#endregion
90292
+ //#region src/generated/history-catalog.ts
90293
+ /**
90294
+ * Cap history catalog, projected from every `*.cap.ts` `history` block.
90295
+ * 32 caps with series (60 series), 37 caps answered `'none'`.
90296
+ * Field keys are `runtimeState` paths (`a.b` into fixed objects only).
90297
+ */
90298
+ var HISTORY_CATALOG = {
90299
+ "air-quality-sensor": {
90300
+ "co2Ppm": {
90301
+ kind: "gauge",
90302
+ unit: "ppm",
90303
+ deadband: 5
90304
+ },
90305
+ "vocPpb": {
90306
+ kind: "gauge",
90307
+ unit: "ppb",
90308
+ deadband: 5
90309
+ },
90310
+ "pm25": {
90311
+ kind: "gauge",
90312
+ unit: "ug/m3",
90313
+ deadband: 1
90314
+ },
90315
+ "pm10": {
90316
+ kind: "gauge",
90317
+ unit: "ug/m3",
90318
+ deadband: 1
90319
+ },
90320
+ "aqi": {
90321
+ kind: "gauge",
90322
+ unit: "count",
90323
+ deadband: 1
90324
+ }
90325
+ },
90326
+ "ambient-light-sensor": { "lux": {
90327
+ kind: "gauge",
90328
+ unit: "lx",
90329
+ deadbandPct: 10,
90330
+ minIntervalMs: 6e4
90331
+ } },
90332
+ "battery": { "percentage": {
90333
+ kind: "gauge",
90334
+ unit: "%"
90335
+ } },
90336
+ "binary": { "on": { kind: "boolean" } },
90337
+ "brightness": { "percentage": {
90338
+ kind: "gauge",
90339
+ unit: "%",
90340
+ minIntervalMs: 0
90341
+ } },
90342
+ "carbon-monoxide": { "detected": { kind: "boolean" } },
90343
+ "climate-control": {
90344
+ "currentTemp": {
90345
+ kind: "gauge",
90346
+ unit: "°C",
90347
+ deadband: .1
90348
+ },
90349
+ "currentHumidity": {
90350
+ kind: "gauge",
90351
+ unit: "%",
90352
+ deadband: .5
90353
+ },
90354
+ "target": {
90355
+ kind: "gauge",
90356
+ unit: "°C",
90357
+ minIntervalMs: 0
90358
+ },
90359
+ "targetHigh": {
90360
+ kind: "gauge",
90361
+ unit: "°C",
90362
+ minIntervalMs: 0
90363
+ },
90364
+ "targetLow": {
90365
+ kind: "gauge",
90366
+ unit: "°C",
90367
+ minIntervalMs: 0
90368
+ }
90369
+ },
90370
+ "contact": { "entryOpen": { kind: "boolean" } },
90371
+ "cover": { "position": {
90372
+ kind: "gauge",
90373
+ unit: "%",
90374
+ minIntervalMs: 0
90375
+ } },
90376
+ "device-status": { "online": { kind: "boolean" } },
90377
+ "fan-control": {
90378
+ "percentage": {
90379
+ kind: "gauge",
90380
+ unit: "%",
90381
+ minIntervalMs: 0
90382
+ },
90383
+ "oscillating": { kind: "boolean" }
90384
+ },
90385
+ "flood": { "flooded": { kind: "boolean" } },
90386
+ "gas": { "detected": { kind: "boolean" } },
90387
+ "humidifier": {
90388
+ "currentHumidity": {
90389
+ kind: "gauge",
90390
+ unit: "%",
90391
+ deadband: .5
90392
+ },
90393
+ "on": { kind: "boolean" }
90394
+ },
90395
+ "humidity-sensor": { "percent": {
90396
+ kind: "gauge",
90397
+ unit: "%",
90398
+ deadband: .5
90399
+ } },
90400
+ "lawn-mower-control": { "batteryLevel": {
90401
+ kind: "gauge",
90402
+ unit: "%",
90403
+ deadband: 2
90404
+ } },
90405
+ "motion": { "detected": {
90406
+ kind: "boolean",
90407
+ excludeDeviceTypes: [require_err_msg.DeviceType.Camera]
90408
+ } },
90409
+ "network-link": {
90410
+ "signalPercent": {
90411
+ kind: "gauge",
90412
+ unit: "%",
90413
+ deadband: 3,
90414
+ minIntervalMs: 6e4
90415
+ },
90416
+ "rssiDbm": {
90417
+ kind: "gauge",
90418
+ unit: "dBm",
90419
+ deadband: 2,
90420
+ minIntervalMs: 6e4
90421
+ }
90422
+ },
90423
+ "numeric-sensor": { "value": {
90424
+ kind: "gauge",
90425
+ unitFrom: "unit",
90426
+ minIntervalMs: 3e4
90427
+ } },
90428
+ "pet-feeder": {
90429
+ "foodLevel": { kind: "gauge" },
90430
+ "food1": { kind: "gauge" },
90431
+ "food2": { kind: "gauge" },
90432
+ "batteryPower": {
90433
+ kind: "gauge",
90434
+ unit: "%",
90435
+ deadband: 2
90436
+ },
90437
+ "desiccantLeftDays": {
90438
+ kind: "gauge",
90439
+ unit: "days"
90440
+ }
90441
+ },
90442
+ "power-meter": {
90443
+ "watts": {
90444
+ kind: "gauge",
90445
+ unit: "W",
90446
+ deadband: 1,
90447
+ minIntervalMs: 3e4
90448
+ },
90449
+ "kwhTotal": {
90450
+ kind: "counter",
90451
+ unit: "kWh",
90452
+ deadband: .01,
90453
+ minIntervalMs: 6e4
90454
+ },
90455
+ "volts": {
90456
+ kind: "gauge",
90457
+ unit: "V",
90458
+ deadband: 1,
90459
+ minIntervalMs: 3e4
90460
+ },
90461
+ "amps": {
90462
+ kind: "gauge",
90463
+ unit: "A",
90464
+ deadband: .05,
90465
+ minIntervalMs: 3e4
90466
+ },
90467
+ "va": {
90468
+ kind: "gauge",
90469
+ unit: "VA",
90470
+ deadband: 1,
90471
+ minIntervalMs: 3e4
90472
+ },
90473
+ "powerFactor": {
90474
+ kind: "gauge",
90475
+ unit: "ratio",
90476
+ deadband: .01,
90477
+ minIntervalMs: 6e4
90478
+ }
90479
+ },
90480
+ "presence": { "batteryPercent": {
90481
+ kind: "gauge",
90482
+ unit: "%",
90483
+ deadband: 1
90484
+ } },
90485
+ "pressure-sensor": { "hpa": {
90486
+ kind: "gauge",
90487
+ unit: "hPa",
90488
+ deadband: .1
90489
+ } },
90490
+ "smoke": { "detected": { kind: "boolean" } },
90491
+ "switch": { "on": { kind: "boolean" } },
90492
+ "tamper": { "tampered": { kind: "boolean" } },
90493
+ "temperature-sensor": { "celsius": {
90494
+ kind: "gauge",
90495
+ unit: "°C",
90496
+ deadband: .1
90497
+ } },
90498
+ "vacuum-control": {
90499
+ "batteryLevel": {
90500
+ kind: "gauge",
90501
+ unit: "%",
90502
+ deadband: 2
90503
+ },
90504
+ "cleanWater.level": {
90505
+ kind: "gauge",
90506
+ unit: "%",
90507
+ deadband: 2
90508
+ },
90509
+ "dirtyWater.level": {
90510
+ kind: "gauge",
90511
+ unit: "%",
90512
+ deadband: 2
90513
+ },
90514
+ "detergent.level": {
90515
+ kind: "gauge",
90516
+ unit: "%",
90517
+ deadband: 2
90518
+ },
90519
+ "dustBin.level": {
90520
+ kind: "gauge",
90521
+ unit: "%",
90522
+ deadband: 2
90523
+ }
90524
+ },
90525
+ "valve": { "position": {
90526
+ kind: "gauge",
90527
+ unit: "%",
90528
+ minIntervalMs: 0
90529
+ } },
90530
+ "vibration": { "detected": { kind: "boolean" } },
90531
+ "water-heater": {
90532
+ "currentTemp": {
90533
+ kind: "gauge",
90534
+ unit: "°C",
90535
+ deadband: .5
90536
+ },
90537
+ "targetTemp": {
90538
+ kind: "gauge",
90539
+ unit: "°C",
90540
+ minIntervalMs: 0
90541
+ }
90542
+ },
90543
+ "weather": {
90544
+ "temperature": {
90545
+ kind: "gauge",
90546
+ unitFrom: "temperatureUnit",
90547
+ deadband: .2
90548
+ },
90549
+ "humidity": {
90550
+ kind: "gauge",
90551
+ unit: "%",
90552
+ deadband: 1
90553
+ },
90554
+ "pressure": {
90555
+ kind: "gauge",
90556
+ unitFrom: "pressureUnit",
90557
+ deadband: .5
90558
+ },
90559
+ "windSpeed": {
90560
+ kind: "gauge",
90561
+ unitFrom: "windSpeedUnit",
90562
+ deadband: .5
90563
+ }
90564
+ }
90565
+ };
90566
+ /** Caps that declared `history: 'none'`, sorted. */
90567
+ var HISTORY_NONE_CAPS = [
90568
+ "alarm-panel",
90569
+ "audio-metrics",
90570
+ "automation-control",
90571
+ "camera-streams",
90572
+ "color",
90573
+ "connectivity",
90574
+ "consumables",
90575
+ "control",
90576
+ "day-night",
90577
+ "device-discovery",
90578
+ "doorbell",
90579
+ "enum-sensor",
90580
+ "event-emitter",
90581
+ "feature-probe",
90582
+ "image",
90583
+ "image-settings",
90584
+ "intercom",
90585
+ "lock-control",
90586
+ "media-player",
90587
+ "motion-trigger",
90588
+ "motion-zones",
90589
+ "native-object-detection",
90590
+ "navigation",
90591
+ "notifier",
90592
+ "privacy-mask",
90593
+ "ptz-autotrack",
90594
+ "recording-onboard",
90595
+ "recording-signal",
90596
+ "scene-monitor",
90597
+ "script-runner",
90598
+ "stream-catalog",
90599
+ "stream-params",
90600
+ "stream-signals",
90601
+ "update",
90602
+ "zone-analytics",
90603
+ "zone-rules",
90604
+ "zones"
90605
+ ];
90606
+ /** The series specs of `capName`; empty for a `'none'` cap or an unknown one. */
90607
+ function historyFieldsFor(capName) {
90608
+ return HISTORY_CATALOG[capName] ?? {};
90609
+ }
90610
+ //#endregion
89134
90611
  //#region src/generated/scope-presets.ts
89135
90612
  var SCOPE_PRESETS = [
89136
90613
  {
@@ -89384,6 +90861,16 @@ function createSystemProxy(api) {
89384
90861
  release: (input) => dispatch("deviceAdoption", "release", "mutation", input),
89385
90862
  resync: (input) => dispatch("deviceAdoption", "resync", "mutation", input)
89386
90863
  },
90864
+ deviceCredentials: {
90865
+ listDeviceCredentials: (input) => dispatch("deviceCredentials", "listDeviceCredentials", "query", input),
90866
+ startEnrollment: (input) => dispatch("deviceCredentials", "startEnrollment", "mutation", input),
90867
+ revokeDeviceCredential: (input) => dispatch("deviceCredentials", "revokeDeviceCredential", "mutation", input),
90868
+ getDeviceCertificateSettings: (input) => dispatch("deviceCredentials", "getDeviceCertificateSettings", "query", input),
90869
+ setDeviceCertificateSettings: (input) => dispatch("deviceCredentials", "setDeviceCertificateSettings", "mutation", input),
90870
+ deleteDeviceCredential: (input) => dispatch("deviceCredentials", "deleteDeviceCredential", "mutation", input),
90871
+ getDeviceCaStatus: (input) => dispatch("deviceCredentials", "getDeviceCaStatus", "query", input),
90872
+ renameDeviceCredential: (input) => dispatch("deviceCredentials", "renameDeviceCredential", "mutation", input)
90873
+ },
89387
90874
  deviceExport: {
89388
90875
  getStatus: (input) => dispatch("deviceExport", "getStatus", "query", input),
89389
90876
  listSupportedDeviceKinds: (input) => dispatch("deviceExport", "listSupportedDeviceKinds", "query", input),
@@ -98718,6 +100205,9 @@ exports.ClusterModelChoiceSchema = ClusterModelChoiceSchema;
98718
100205
  exports.CollectionColumnSchema = CollectionColumnSchema;
98719
100206
  exports.CollectionIndexSchema = CollectionIndexSchema;
98720
100207
  exports.ColorStatusSchema = ColorStatusSchema;
100208
+ exports.CompleteEnrollmentInputSchema = CompleteEnrollmentInputSchema;
100209
+ exports.CompleteEnrollmentOutputSchema = CompleteEnrollmentOutputSchema;
100210
+ exports.CompleteEnrollmentResultSchema = CompleteEnrollmentResultSchema;
98721
100211
  exports.ComposableCapabilitiesSchema = ComposableCapabilitiesSchema;
98722
100212
  exports.ComposableCapabilitySchema = ComposableCapabilitySchema;
98723
100213
  exports.ComposableFieldSchema = ComposableFieldSchema;
@@ -98835,6 +100325,7 @@ exports.DEFAULT_SESSION_PLACEMENT_POLICY = DEFAULT_SESSION_PLACEMENT_POLICY;
98835
100325
  exports.DEFAULT_SHARE_SOURCE = DEFAULT_SHARE_SOURCE;
98836
100326
  exports.DEFAULT_TIMELAPSE_PREVIEW_TEXT = DEFAULT_TIMELAPSE_PREVIEW_TEXT;
98837
100327
  exports.DEFAULT_TOKEN_EXPIRY = require_sleep.DEFAULT_TOKEN_EXPIRY;
100328
+ exports.DEFINITIVE_DEVICE_REFUSALS = DEFINITIVE_DEVICE_REFUSALS;
98838
100329
  exports.DERIVED_CAMERA_SILENCED_CAP_NAMES = DERIVED_CAMERA_SILENCED_CAP_NAMES;
98839
100330
  exports.DETAIL_CROP_PADDING_FIELD = DETAIL_CROP_PADDING_FIELD;
98840
100331
  exports.DETAIL_CROP_PADDING_KEY = DETAIL_CROP_PADDING_KEY;
@@ -98846,14 +100337,24 @@ exports.DETECTOR_ACCURACY = DETECTOR_ACCURACY;
98846
100337
  exports.DETECTOR_PERF = DETECTOR_PERF;
98847
100338
  exports.DEVICE_BACKEND_TO_FORMAT = DEVICE_BACKEND_TO_FORMAT;
98848
100339
  exports.DEVICE_CAP_NAMES = DEVICE_CAP_NAMES;
100340
+ exports.DEVICE_CERT_RENEW_WINDOW_DAYS = DEVICE_CERT_RENEW_WINDOW_DAYS;
100341
+ exports.DEVICE_CERT_SIGNATURE = DEVICE_CERT_SIGNATURE;
100342
+ exports.DEVICE_CERT_VALIDITY_DAYS = DEVICE_CERT_VALIDITY_DAYS;
98849
100343
  exports.DEVICE_CHILDREN_BATCH_MAX = require_sleep.DEVICE_CHILDREN_BATCH_MAX;
100344
+ exports.DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE = DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE;
98850
100345
  exports.DEVICE_DO_ACTIONS = DEVICE_DO_ACTIONS;
100346
+ exports.DEVICE_ENROLLMENT_TTL_MS = DEVICE_ENROLLMENT_TTL_MS;
100347
+ exports.DEVICE_NONCE_TTL_MS = DEVICE_NONCE_TTL_MS;
98851
100348
  exports.DEVICE_PROFILES = DEVICE_PROFILES;
98852
100349
  exports.DEVICE_RAMP = DEVICE_RAMP;
100350
+ exports.DEVICE_REFRESH_REFUSAL_PREFIX = DEVICE_REFRESH_REFUSAL_PREFIX;
98853
100351
  exports.DEVICE_RESTORE_RETRY_CONCURRENCY = DEVICE_RESTORE_RETRY_CONCURRENCY;
98854
100352
  exports.DEVICE_RESTORE_RETRY_DELAYS_MS = DEVICE_RESTORE_RETRY_DELAYS_MS;
100353
+ exports.DEVICE_SAN_CREDENTIAL_PREFIX = DEVICE_SAN_CREDENTIAL_PREFIX;
100354
+ exports.DEVICE_SAN_USER_PREFIX = DEVICE_SAN_USER_PREFIX;
98855
100355
  exports.DEVICE_SCOPED_CAPS = require_sleep.DEVICE_SCOPED_CAPS;
98856
100356
  exports.DEVICE_SETTINGS_CONTRIBUTION_METHODS = require_sleep.DEVICE_SETTINGS_CONTRIBUTION_METHODS;
100357
+ exports.DEVICE_SIGNATURE_MESSAGE_VERSION = DEVICE_SIGNATURE_MESSAGE_VERSION;
98857
100358
  exports.DEVICE_STATE_READERS = DEVICE_STATE_READERS;
98858
100359
  exports.DEVICE_STATUS_METHOD = require_sleep.DEVICE_STATUS_METHOD;
98859
100360
  exports.DEVICE_TYPE_CONTROL_KIND = DEVICE_TYPE_CONTROL_KIND;
@@ -98881,9 +100382,17 @@ exports.DetectionSourceSchema = DetectionSourceSchema;
98881
100382
  exports.DetectionSourcesSchema = DetectionSourcesSchema;
98882
100383
  exports.DetectorStoreClearSchema = DetectorStoreClearSchema;
98883
100384
  exports.DeviceAdminLinkSchema = DeviceAdminLinkSchema;
100385
+ exports.DeviceCaStatusSchema = DeviceCaStatusSchema;
100386
+ exports.DeviceCertificateLoginMethodSchema = DeviceCertificateLoginMethodSchema;
100387
+ exports.DeviceCertificateSettingsSchema = DeviceCertificateSettingsSchema;
100388
+ exports.DeviceChallengeResultSchema = DeviceChallengeResultSchema;
100389
+ exports.DeviceChallengeSchema = DeviceChallengeSchema;
98884
100390
  exports.DeviceCodeSeveritySchema = DeviceCodeSeveritySchema;
98885
100391
  exports.DeviceConfig = DeviceConfig;
100392
+ exports.DeviceCredentialSchema = DeviceCredentialSchema;
100393
+ exports.DeviceCredentialStatusSchema = DeviceCredentialStatusSchema;
98886
100394
  exports.DeviceDiscoveryStatusSchema = DeviceDiscoveryStatusSchema;
100395
+ exports.DeviceEnrollProofSchema = DeviceEnrollProofSchema;
98887
100396
  exports.DeviceExportExposeInputSchema = ExposeInputSchema;
98888
100397
  exports.DeviceExportStatusSchema = DeviceExportStatusSchema;
98889
100398
  exports.DeviceExportUnexposeInputSchema = UnexposeInputSchema;
@@ -98891,11 +100400,16 @@ exports.DeviceFeature = require_err_msg.DeviceFeature;
98891
100400
  exports.DeviceInfoSchema = DeviceInfoSchema;
98892
100401
  exports.DeviceModelChoiceSchema = DeviceModelChoiceSchema;
98893
100402
  exports.DeviceNetworkStatsSchema = DeviceNetworkStatsSchema;
100403
+ exports.DevicePlatformSchema = DevicePlatformSchema;
100404
+ exports.DeviceProofInputSchema = DeviceProofInputSchema;
98894
100405
  exports.DeviceRecommendationSchema = DeviceRecommendationSchema;
100406
+ exports.DeviceRefusalReasonSchema = DeviceRefusalReasonSchema;
100407
+ exports.DeviceRefusalSchema = DeviceRefusalSchema;
98895
100408
  exports.DeviceRestoreRetryScheduler = DeviceRestoreRetryScheduler;
98896
100409
  exports.DeviceRole = require_err_msg.DeviceRole;
98897
100410
  exports.DeviceRuntimeState = DeviceRuntimeState;
98898
100411
  exports.DeviceSelectorSchema = DeviceSelectorSchema;
100412
+ exports.DeviceSignaturePurposeSchema = DeviceSignaturePurposeSchema;
98899
100413
  exports.DeviceStatusSchema = DeviceStatusSchema;
98900
100414
  exports.DeviceType = require_err_msg.DeviceType;
98901
100415
  exports.DiagnosticIdSchema = DiagnosticIdSchema;
@@ -98948,6 +100462,7 @@ exports.EmbeddingResultSchema = EmbeddingResultSchema;
98948
100462
  exports.EmbeddingTowerSchema = EmbeddingTowerSchema;
98949
100463
  exports.EncodeProfileSchema = EncodeProfileSchema;
98950
100464
  exports.EnrichedWidgetMetadataSchema = EnrichedWidgetMetadataSchema;
100465
+ exports.EnrollSelfInputSchema = EnrollSelfInputSchema;
98951
100466
  exports.EnumSensorDateTimeFormatSchema = EnumSensorDateTimeFormatSchema;
98952
100467
  exports.EnumSensorStatusSchema = EnumSensorStatusSchema;
98953
100468
  exports.EventCategory = require_event_category.EventCategory;
@@ -99043,6 +100558,10 @@ exports.HAP_AUDIO_VBV_KBITS = HAP_AUDIO_VBV_KBITS;
99043
100558
  exports.HAP_KEYFRAME_INTERVAL_SEC = HAP_KEYFRAME_INTERVAL_SEC;
99044
100559
  exports.HF_BASE_URL = require_sleep.HF_BASE_URL;
99045
100560
  exports.HF_REPO = require_sleep.HF_REPO;
100561
+ exports.HISTORY_CATALOG = HISTORY_CATALOG;
100562
+ exports.HISTORY_DEFAULT_MIN_INTERVAL_MS = require_sleep.HISTORY_DEFAULT_MIN_INTERVAL_MS;
100563
+ exports.HISTORY_NONE_CAPS = HISTORY_NONE_CAPS;
100564
+ exports.HISTORY_UNIT_LABELS = require_sleep.HISTORY_UNIT_LABELS;
99046
100565
  exports.HOURS_PER_DAY = HOURS_PER_DAY;
99047
100566
  exports.HUB_ADDRESS_ROLES = HUB_ADDRESS_ROLES;
99048
100567
  exports.HUB_MDNS_QUERY_NAME = HUB_MDNS_QUERY_NAME;
@@ -99056,6 +100575,7 @@ exports.HealthStatusSchema = HealthStatusSchema;
99056
100575
  exports.HfModelResolutionSchema = HfModelResolutionSchema;
99057
100576
  exports.HistoryPointSchema = HistoryPointSchema;
99058
100577
  exports.HistoryResolutionEnum = HistoryResolutionEnum;
100578
+ exports.HttpsLeafInfoSchema = HttpsLeafInfoSchema;
99059
100579
  exports.HubAddressRoleSchema = HubAddressRoleSchema;
99060
100580
  exports.HumidifierStatusSchema = HumidifierStatusSchema;
99061
100581
  exports.HumiditySensorStatusSchema = HumiditySensorStatusSchema;
@@ -99251,6 +100771,7 @@ exports.MediaPlayerStateSchema = MediaPlayerStateSchema;
99251
100771
  exports.MediaPlayerStatusSchema = MediaPlayerStatusSchema;
99252
100772
  exports.MediaPresenceOwnerKindSchema = MediaPresenceOwnerKindSchema;
99253
100773
  exports.MediaRelocateModeSchema = MediaRelocateModeSchema;
100774
+ exports.MeshLeafInfoSchema = MeshLeafInfoSchema;
99254
100775
  exports.MeshPeerSchema = MeshPeerSchema;
99255
100776
  exports.MeshStatusSchema = MeshStatusSchema;
99256
100777
  exports.MethodAccessSchema = MethodAccessSchema;
@@ -99540,6 +101061,7 @@ exports.NodeColorIdSchema = require_node_color.NodeColorIdSchema;
99540
101061
  exports.NodeDeviceChangeSchema = NodeDeviceChangeSchema;
99541
101062
  exports.NodeDirectoryEntrySchema = NodeDirectoryEntrySchema;
99542
101063
  exports.NodeDirectorySchema = NodeDirectorySchema;
101064
+ exports.NodeHttpsStateSchema = NodeHttpsStateSchema;
99543
101065
  exports.NodeRecommendationSchema = NodeRecommendationSchema;
99544
101066
  exports.NotificationActionIconSchema = NotificationActionIconSchema;
99545
101067
  exports.NotificationActionSchema = NotificationActionSchema;
@@ -99758,6 +101280,8 @@ exports.RelocateMediaInputSchema = RelocateMediaInputSchema;
99758
101280
  exports.RelocateResidueInputSchema = RelocateResidueInputSchema;
99759
101281
  exports.RelocateResidueSchema = RelocateResidueSchema;
99760
101282
  exports.RenderedAsSchema = RenderedAsSchema;
101283
+ exports.RenewDeviceCertificateOutputSchema = RenewDeviceCertificateOutputSchema;
101284
+ exports.RenewDeviceCertificateResultSchema = RenewDeviceCertificateResultSchema;
99761
101285
  exports.ReportMotionInputSchema = ReportMotionInputSchema;
99762
101286
  exports.ReportedFailureContributionSchema = ReportedFailureContributionSchema;
99763
101287
  exports.ReportedLoadContributionSchema = ReportedLoadContributionSchema;
@@ -99809,6 +101333,7 @@ exports.RetrainTrackSchema = RetrainTrackSchema;
99809
101333
  exports.RetrainTrainingCorpusResolveResultSchema = RetrainTrainingCorpusResolveResultSchema;
99810
101334
  exports.RetrainTrainingCorpusSelectionSchema = RetrainTrainingCorpusSelectionSchema;
99811
101335
  exports.RetrainTransitionResultSchema = RetrainTransitionResultSchema;
101336
+ exports.RevokeOwnDeviceCertificateResultSchema = RevokeOwnDeviceCertificateResultSchema;
99812
101337
  exports.RingBuffer = RingBuffer;
99813
101338
  exports.RootStepSupplySchema = RootStepSupplySchema;
99814
101339
  exports.RtpSourceSchema = RtpSourceSchema;
@@ -99912,6 +101437,7 @@ exports.SpatialDetectionSchema = SpatialDetectionSchema;
99912
101437
  exports.SsoBridgeClaimsSchema = SsoBridgeClaimsSchema;
99913
101438
  exports.StaleDevicePinSchema = StaleDevicePinSchema;
99914
101439
  exports.StartEmbeddedInputSchema = StartEmbeddedInputSchema;
101440
+ exports.StartEnrollmentOutputSchema = StartEnrollmentOutputSchema;
99915
101441
  exports.StationaryObjectSchema = StationaryObjectSchema;
99916
101442
  exports.StorageAbortUploadInputSchema = AbortUploadInputSchema;
99917
101443
  exports.StorageAccessSchema = StorageAccessSchema;
@@ -100160,6 +101686,7 @@ exports.addonWidgetsCapability = addonWidgetsCapability;
100160
101686
  exports.addonWidgetsSourceCapability = addonWidgetsSourceCapability;
100161
101687
  exports.addonsCapability = addonsCapability;
100162
101688
  exports.adminUiCapability = require_sleep.adminUiCapability;
101689
+ exports.advertisedHubOrigins = advertisedHubOrigins;
100163
101690
  exports.airQualitySensorCapability = airQualitySensorCapability;
100164
101691
  exports.alarmDeviceBlocksArming = alarmDeviceBlocksArming;
100165
101692
  exports.alarmDeviceSecureOnArm = alarmDeviceSecureOnArm;
@@ -100212,6 +101739,8 @@ exports.buildAudioArgs = require_composition.buildAudioArgs;
100212
101739
  exports.buildBenchStepTree = buildBenchStepTree;
100213
101740
  exports.buildCapabilityLookup = buildCapabilityLookup;
100214
101741
  exports.buildDeviceAdminUrl = buildDeviceAdminUrl;
101742
+ exports.buildDeviceEnrollmentLink = buildDeviceEnrollmentLink;
101743
+ exports.buildDeviceSignatureMessage = buildDeviceSignatureMessage;
100215
101744
  exports.buildDoorbellCompositionFeature = buildDoorbellCompositionFeature;
100216
101745
  exports.buildEventKindDescriptor = buildEventKindDescriptor;
100217
101746
  exports.buildFfmpegArgs = require_composition.buildFfmpegArgs;
@@ -100244,6 +101773,7 @@ exports.capacitySessionsOf = capacitySessionsOf;
100244
101773
  exports.carbonMonoxideCapability = carbonMonoxideCapability;
100245
101774
  exports.cellsToRects = cellsToRects;
100246
101775
  exports.checkRoleAddress = checkRoleAddress;
101776
+ exports.claimedRequestOrigins = claimedRequestOrigins;
100247
101777
  exports.classifyBearerPrincipal = classifyBearerPrincipal;
100248
101778
  exports.classifyCamerasForBenchmark = classifyCamerasForBenchmark;
100249
101779
  exports.classifyInferenceHardware = classifyInferenceHardware;
@@ -100365,6 +101895,7 @@ exports.detectionPipelineCapability = detectionPipelineCapability;
100365
101895
  exports.deviceAdminLinkCapability = deviceAdminLinkCapability;
100366
101896
  exports.deviceAdoptionCapability = deviceAdoptionCapability;
100367
101897
  exports.deviceBackendToFormat = deviceBackendToFormat;
101898
+ exports.deviceCredentialsCapability = deviceCredentialsCapability;
100368
101899
  exports.deviceCustomAction = require_sleep.deviceCustomAction;
100369
101900
  exports.deviceDiscoveryCapability = deviceDiscoveryCapability;
100370
101901
  exports.deviceDoFamily = deviceDoFamily;
@@ -100374,6 +101905,7 @@ exports.deviceManagerCapability = deviceManagerCapability;
100374
101905
  exports.deviceMatchesProfile = deviceMatchesProfile;
100375
101906
  exports.deviceOpsCapability = require_sleep.deviceOpsCapability;
100376
101907
  exports.deviceProviderCapability = deviceProviderCapability;
101908
+ exports.deviceRefusalFromMessage = deviceRefusalFromMessage;
100377
101909
  exports.deviceSelectorMatches = deviceSelectorMatches;
100378
101910
  exports.deviceStateCapability = deviceStateCapability;
100379
101911
  exports.deviceStatusCapability = deviceStatusCapability;
@@ -100450,6 +101982,7 @@ exports.findTimezone = findTimezone;
100450
101982
  exports.floodCapability = floodCapability;
100451
101983
  exports.foldSnapshotByFunction = foldSnapshotByFunction;
100452
101984
  exports.forgetKnownSecret = require_sleep.forgetKnownSecret;
101985
+ exports.formatDeviceRevoker = formatDeviceRevoker;
100453
101986
  exports.formatForRuntime = formatForRuntime;
100454
101987
  exports.formatMediaOwnerKey = formatMediaOwnerKey;
100455
101988
  exports.formatMinutes = formatMinutes;
@@ -100474,6 +102007,7 @@ exports.hasModelBoundOverrides = hasModelBoundOverrides;
100474
102007
  exports.hasMotionTrigger = hasMotionTrigger;
100475
102008
  exports.hasUrlScheme = hasUrlScheme;
100476
102009
  exports.hfModelUrl = require_sleep.hfModelUrl;
102010
+ exports.historyFieldsFor = historyFieldsFor;
100477
102011
  exports.htmlToText = htmlToText;
100478
102012
  exports.hubAddressHostname = hubAddressHostname;
100479
102013
  exports.hubMotionNativeProvider = hubMotionNativeProvider;
@@ -100509,6 +102043,7 @@ exports.isClusterScopedStep = isClusterScopedStep;
100509
102043
  exports.isCollectionArrayMethod = isCollectionArrayMethod;
100510
102044
  exports.isDefaultAlarmProfileId = isDefaultAlarmProfileId;
100511
102045
  exports.isDefaultAppConnectionEndpoint = isDefaultAppConnectionEndpoint;
102046
+ exports.isDefinitiveDeviceRefusal = isDefinitiveDeviceRefusal;
100512
102047
  exports.isDeployableToAgent = isDeployableToAgent;
100513
102048
  exports.isDetectionMacroClass = isDetectionMacroClass;
100514
102049
  exports.isDeviceConfigCap = require_sleep.isDeviceConfigCap;
@@ -100631,6 +102166,7 @@ exports.networkAccessCapability = networkAccessCapability;
100631
102166
  exports.networkLinkCapability = networkLinkCapability;
100632
102167
  exports.networkQualityCapability = networkQualityCapability;
100633
102168
  exports.nodeBenchmarkRefusals = nodeBenchmarkRefusals;
102169
+ exports.nodeCertificatesCapability = nodeCertificatesCapability;
100634
102170
  exports.nodePickerItems = nodePickerItems;
100635
102171
  exports.nodePin = require_sleep.nodePin;
100636
102172
  exports.nodesCapability = nodesCapability;
@@ -100638,6 +102174,7 @@ exports.normalizeAddonInitResult = require_sleep.normalizeAddonInitResult;
100638
102174
  exports.normalizeAudioLabel = normalizeAudioLabel;
100639
102175
  exports.normalizeCoreBlockWrite = normalizeCoreBlockWrite;
100640
102176
  exports.normalizeNodeId = require_sleep.normalizeNodeId;
102177
+ exports.normalizeOrigin = normalizeOrigin;
100641
102178
  exports.normalizeSecretOwner = require_sleep.normalizeSecretOwner;
100642
102179
  exports.normalizeTokenScopes = normalizeTokenScopes;
100643
102180
  exports.normalizeUnit = normalizeUnit;
@@ -100659,6 +102196,7 @@ exports.packagePickerItems = packagePickerItems;
100659
102196
  exports.parseAdminBase = parseAdminBase;
100660
102197
  exports.parseAppAuthCallback = parseAppAuthCallback;
100661
102198
  exports.parseCameraStreamConfig = parseCameraStreamConfig;
102199
+ exports.parseDeviceEnrollmentLink = parseDeviceEnrollmentLink;
100662
102200
  exports.parseExpression = require_composition.parseExpression;
100663
102201
  exports.parseJsonArray = require_sleep.parseJsonArray;
100664
102202
  exports.parseJsonObject = require_sleep.parseJsonObject;
@@ -100685,6 +102223,7 @@ exports.pickDetailCropConvention = pickDetailCropConvention;
100685
102223
  exports.pickInvalidClusterStepModels = pickInvalidClusterStepModels;
100686
102224
  exports.pickNativeLeaseOverride = pickNativeLeaseOverride;
100687
102225
  exports.pickPreferredRtspEntry = pickPreferredRtspEntry;
102226
+ exports.pickRequestOrigin = pickRequestOrigin;
100688
102227
  exports.pickRestartCandidate = pickRestartCandidate;
100689
102228
  exports.pickVideoEncoder = require_composition.pickVideoEncoder;
100690
102229
  exports.pickerForCondition = pickerForCondition;
@@ -100738,6 +102277,7 @@ exports.reducePoints = reducePoints;
100738
102277
  exports.registerKnownSecret = require_sleep.registerKnownSecret;
100739
102278
  exports.renameAlarmProfile = renameAlarmProfile;
100740
102279
  exports.replacedFieldKeys = replacedFieldKeys;
102280
+ exports.requestMountPrefix = requestMountPrefix;
100741
102281
  exports.requiredTopLevelKeys = requiredTopLevelKeys;
100742
102282
  exports.requiresPython = requiresPython;
100743
102283
  exports.reservedSourceOwner = reservedSourceOwner;