@camstack/types 1.2.364 → 1.2.365

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.
package/dist/index.js CHANGED
@@ -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.
@@ -13549,6 +13873,224 @@ var keychainCapability = {
13549
13873
  }
13550
13874
  };
13551
13875
  //#endregion
13876
+ //#region src/capabilities/device-credentials.cap.ts
13877
+ var DeviceCaStatusSchema = zod.z.discriminatedUnion("state", [
13878
+ zod.z.object({ state: zod.z.literal("absent") }),
13879
+ zod.z.object({
13880
+ state: zod.z.literal("ready"),
13881
+ subject: zod.z.string(),
13882
+ fingerprintSha256: zod.z.string(),
13883
+ validTo: zod.z.string()
13884
+ }),
13885
+ zod.z.object({
13886
+ state: zod.z.literal("unavailable"),
13887
+ reason: zod.z.string()
13888
+ })
13889
+ ]);
13890
+ var DeviceCertificateSettingsSchema = zod.z.object({ selfEnrollment: zod.z.enum(["allowed", "disabled"]) });
13891
+ /**
13892
+ * `device-credentials` — the admin surface of device certificates (D855).
13893
+ *
13894
+ * Everything a device does ITSELF — completing an enrollment, getting a
13895
+ * challenge, signing in, renewing — is a PUBLIC procedure of the hub's `auth`
13896
+ * router (`auth.completeEnrollment`, `getDeviceChallenge`,
13897
+ * `loginWithDeviceCertificate`, `renewDeviceCertificate`): those legs are
13898
+ * proofs of possession, not capability calls, and must not be reachable as
13899
+ * cap methods. This cap holds only what an operator does about them.
13900
+ *
13901
+ * Provider: `local-auth`, which also owns the device CA and the registry.
13902
+ * The hub is the only node that persists device credentials.
13903
+ */
13904
+ var deviceCredentialsCapability = {
13905
+ name: "device-credentials",
13906
+ scope: "system",
13907
+ mode: "singleton",
13908
+ methods: {
13909
+ /**
13910
+ * Every enrolled device, newest first; `userId` narrows to one user.
13911
+ * `status` is derived: revoked wins over expired.
13912
+ */
13913
+ listDeviceCredentials: require_sleep.method(zod.z.object({
13914
+ userId: zod.z.string().min(1).optional(),
13915
+ includeRevoked: zod.z.boolean().default(false)
13916
+ }), zod.z.array(DeviceCredentialSchema).readonly(), { auth: "admin" }),
13917
+ /**
13918
+ * Mint a one-shot enrollment code for `userId` and a device name: 128-bit
13919
+ * random, single use, 10 minutes, kept only as a hash. Returns the code
13920
+ * once, with the `camstack://enroll?hub=…&code=…` link a QR carries.
13921
+ * `caller` (the admin) is recorded in the audit trail.
13922
+ */
13923
+ startEnrollment: require_sleep.method(zod.z.object({
13924
+ userId: zod.z.string().min(1),
13925
+ deviceName: zod.z.string().min(1).max(80)
13926
+ }), StartEnrollmentOutputSchema, {
13927
+ kind: "mutation",
13928
+ auth: "admin",
13929
+ caller: "required"
13930
+ }),
13931
+ /**
13932
+ * Revoke a credential: its certificate stops logging in at once, and every
13933
+ * session it opened ends (an open session also dies at its next refresh
13934
+ * even if this call raced it). Idempotent.
13935
+ */
13936
+ revokeDeviceCredential: require_sleep.method(zod.z.object({ id: zod.z.string().min(1) }), zod.z.object({
13937
+ revoked: zod.z.boolean(),
13938
+ sessionsEnded: zod.z.number().int(),
13939
+ status: DeviceCredentialStatusSchema
13940
+ }), {
13941
+ kind: "mutation",
13942
+ auth: "admin",
13943
+ caller: "required"
13944
+ }),
13945
+ /**
13946
+ * Hub-wide device-certificate settings. `selfEnrollment`: `allowed`
13947
+ * (default) lets a signed-in user enroll their own device after a step-up
13948
+ * sign-in; `disabled` makes `auth.enrollSelf` refuse. The admin QR path is
13949
+ * unaffected. Hub-wide only (no per-role switch).
13950
+ */
13951
+ getDeviceCertificateSettings: require_sleep.method(zod.z.object({}), DeviceCertificateSettingsSchema, { auth: "admin" }),
13952
+ setDeviceCertificateSettings: require_sleep.method(DeviceCertificateSettingsSchema, DeviceCertificateSettingsSchema, {
13953
+ kind: "mutation",
13954
+ auth: "admin"
13955
+ }),
13956
+ /**
13957
+ * Delete the registry row of a REVOKED credential (clean-up; the audit trail
13958
+ * keeps the revocation). Refuses a live credential: revoke it first. After
13959
+ * the row is gone the device's next call answers `unknown-credential`.
13960
+ */
13961
+ deleteDeviceCredential: require_sleep.method(zod.z.object({ id: zod.z.string().min(1) }), zod.z.object({ result: zod.z.enum([
13962
+ "deleted",
13963
+ "live",
13964
+ "unknown"
13965
+ ]) }), {
13966
+ kind: "mutation",
13967
+ auth: "admin",
13968
+ caller: "required"
13969
+ }),
13970
+ /**
13971
+ * The device CA: `absent` until the first enrollment creates it (lazily,
13972
+ * never rotated on boot), `unavailable` while the keychain cannot answer.
13973
+ */
13974
+ getDeviceCaStatus: require_sleep.method(zod.z.object({}), DeviceCaStatusSchema, { auth: "admin" }),
13975
+ /** Rename a credential (the label only; the certificate is unchanged). */
13976
+ renameDeviceCredential: require_sleep.method(zod.z.object({
13977
+ id: zod.z.string().min(1),
13978
+ deviceName: zod.z.string().min(1).max(80)
13979
+ }), zod.z.object({ renamed: zod.z.boolean() }), {
13980
+ kind: "mutation",
13981
+ auth: "admin"
13982
+ })
13983
+ }
13984
+ };
13985
+ //#endregion
13986
+ //#region src/capabilities/node-certificates.cap.ts
13987
+ /**
13988
+ * `node-certificates` - what a node holds and the two renewals the hub drives
13989
+ * (D856): the node's MESH leaf (mutual TLS to the hub) and its HTTPS leaf (issued
13990
+ * from the hub's local CA so a device that trusts the hub root trusts the node).
13991
+ *
13992
+ * Provided by the AGENT RUNTIME (the synthetic `agent-runtime` addon id, like
13993
+ * `server-management`): the hub reaches it through the ordinary node-pinned
13994
+ * capability call - no new Moleculer action. The hub's own certificates are
13995
+ * handled in-process by the hub (`certificates` router), so this cap has no hub
13996
+ * provider.
13997
+ *
13998
+ * No private key ever crosses the mesh: the node generates its key pair, sends a
13999
+ * CSR, and the hub returns only the signed certificate.
14000
+ */
14001
+ var MeshLeafInfoSchema = zod.z.object({
14002
+ cn: zod.z.string(),
14003
+ serial: zod.z.string(),
14004
+ fingerprintSha256: zod.z.string(),
14005
+ notBefore: zod.z.number(),
14006
+ notAfter: zod.z.number()
14007
+ });
14008
+ var HttpsLeafInfoSchema = zod.z.object({
14009
+ fingerprintSha256: zod.z.string(),
14010
+ issuer: zod.z.string(),
14011
+ sans: zod.z.array(zod.z.string()),
14012
+ notBefore: zod.z.number(),
14013
+ notAfter: zod.z.number()
14014
+ });
14015
+ var NodeHttpsStateSchema = zod.z.discriminatedUnion("state", [zod.z.object({
14016
+ state: zod.z.literal("served"),
14017
+ leaf: HttpsLeafInfoSchema
14018
+ }), zod.z.object({
14019
+ state: zod.z.literal("not-issued"),
14020
+ reason: zod.z.string()
14021
+ })]);
14022
+ var nodeCertificatesCapability = {
14023
+ name: "node-certificates",
14024
+ scope: "system",
14025
+ mode: "singleton",
14026
+ internal: true,
14027
+ methods: {
14028
+ /** The node's current mesh leaf (`null` when it is not enrolled on mTLS) and HTTPS state. */
14029
+ getCertificates: require_sleep.method(zod.z.object({}), zod.z.object({
14030
+ nodeId: zod.z.string(),
14031
+ mesh: MeshLeafInfoSchema.nullable(),
14032
+ https: NodeHttpsStateSchema
14033
+ }), { auth: "admin" }),
14034
+ /** Generate a NEW mesh key pair on the node; return the CSR (CN = node id). The key stays here. */
14035
+ prepareMeshRenewal: require_sleep.method(zod.z.object({}), zod.z.object({ csrPem: zod.z.string() }), {
14036
+ kind: "mutation",
14037
+ auth: "admin"
14038
+ }),
14039
+ /**
14040
+ * Install the hub-signed leaf for the key made by `prepareMeshRenewal`: persist it
14041
+ * (keeping the previous one), then reconnect to the hub with it. The node reverts to
14042
+ * the previous leaf by itself unless `confirmMeshLeaf` arrives within `confirmWithinMs`.
14043
+ */
14044
+ installMeshLeaf: require_sleep.method(zod.z.object({
14045
+ certPem: zod.z.string().min(1),
14046
+ caCertPem: zod.z.string().min(1),
14047
+ confirmWithinMs: zod.z.number().int().min(1e4).max(6e5)
14048
+ }), zod.z.object({
14049
+ fingerprintSha256: zod.z.string(),
14050
+ serial: zod.z.string()
14051
+ }), {
14052
+ kind: "mutation",
14053
+ auth: "admin"
14054
+ }),
14055
+ /** The hub saw the node reconnect with the new leaf: keep it, forget the previous one. */
14056
+ confirmMeshLeaf: require_sleep.method(zod.z.object({ fingerprintSha256: zod.z.string() }), zod.z.object({ confirmed: zod.z.boolean() }), {
14057
+ kind: "mutation",
14058
+ auth: "admin"
14059
+ }),
14060
+ /** Go back to the previous leaf now. `false` when there is none to go back to. */
14061
+ rollbackMeshLeaf: require_sleep.method(zod.z.object({}), zod.z.object({ rolledBack: zod.z.boolean() }), {
14062
+ kind: "mutation",
14063
+ auth: "admin"
14064
+ }),
14065
+ /** A key pair + CSR for the node's HTTPS leaf, and the names the node reports for itself. */
14066
+ prepareHttpsCertificate: require_sleep.method(zod.z.object({}), zod.z.object({
14067
+ csrPem: zod.z.string(),
14068
+ hostnames: zod.z.array(zod.z.string()),
14069
+ addresses: zod.z.array(zod.z.string()),
14070
+ /** SHA-256 of the hub local CA this node pinned at its first install; `null` before one. */
14071
+ pinnedCaFingerprintSha256: zod.z.string().nullable()
14072
+ }), {
14073
+ kind: "mutation",
14074
+ auth: "admin"
14075
+ }),
14076
+ /** Install the hub-signed HTTPS leaf and hot-swap the serving context (no restart). */
14077
+ installHttpsCertificate: require_sleep.method(zod.z.object({
14078
+ certPem: zod.z.string().min(1),
14079
+ caCertPem: zod.z.string().min(1),
14080
+ /**
14081
+ * The hub signals that its local CA was rotated (D227) and this leaf chains to the NEW
14082
+ * one. Only the hub, over the authenticated mesh, can say so; a leaf with a different CA
14083
+ * and no signal is refused.
14084
+ */
14085
+ caRotation: zod.z.boolean().optional()
14086
+ }), HttpsLeafInfoSchema, {
14087
+ kind: "mutation",
14088
+ auth: "admin"
14089
+ })
14090
+ },
14091
+ mount: { kind: "skip" }
14092
+ };
14093
+ //#endregion
13552
14094
  //#region src/capabilities/keychain-admin.cap.ts
13553
14095
  /**
13554
14096
  * `keychain-admin` — the operator's view of the keychain (System → Secrets).
@@ -76263,6 +76805,54 @@ var METHOD_ACCESS_MAP = Object.freeze({
76263
76805
  addonId: null,
76264
76806
  access: "create"
76265
76807
  },
76808
+ "deviceCredentials.deleteDeviceCredential": {
76809
+ capName: "device-credentials",
76810
+ capScope: "system",
76811
+ addonId: null,
76812
+ access: "delete"
76813
+ },
76814
+ "deviceCredentials.getDeviceCaStatus": {
76815
+ capName: "device-credentials",
76816
+ capScope: "system",
76817
+ addonId: null,
76818
+ access: "view"
76819
+ },
76820
+ "deviceCredentials.getDeviceCertificateSettings": {
76821
+ capName: "device-credentials",
76822
+ capScope: "system",
76823
+ addonId: null,
76824
+ access: "view"
76825
+ },
76826
+ "deviceCredentials.listDeviceCredentials": {
76827
+ capName: "device-credentials",
76828
+ capScope: "system",
76829
+ addonId: null,
76830
+ access: "view"
76831
+ },
76832
+ "deviceCredentials.renameDeviceCredential": {
76833
+ capName: "device-credentials",
76834
+ capScope: "system",
76835
+ addonId: null,
76836
+ access: "create"
76837
+ },
76838
+ "deviceCredentials.revokeDeviceCredential": {
76839
+ capName: "device-credentials",
76840
+ capScope: "system",
76841
+ addonId: null,
76842
+ access: "delete"
76843
+ },
76844
+ "deviceCredentials.setDeviceCertificateSettings": {
76845
+ capName: "device-credentials",
76846
+ capScope: "system",
76847
+ addonId: null,
76848
+ access: "create"
76849
+ },
76850
+ "deviceCredentials.startEnrollment": {
76851
+ capName: "device-credentials",
76852
+ capScope: "system",
76853
+ addonId: null,
76854
+ access: "create"
76855
+ },
76266
76856
  "deviceDiscovery.adoptDevice": {
76267
76857
  capName: "device-discovery",
76268
76858
  capScope: "device",
@@ -78423,6 +79013,48 @@ var METHOD_ACCESS_MAP = Object.freeze({
78423
79013
  addonId: null,
78424
79014
  access: "create"
78425
79015
  },
79016
+ "nodeCertificates.confirmMeshLeaf": {
79017
+ capName: "node-certificates",
79018
+ capScope: "system",
79019
+ addonId: null,
79020
+ access: "create"
79021
+ },
79022
+ "nodeCertificates.getCertificates": {
79023
+ capName: "node-certificates",
79024
+ capScope: "system",
79025
+ addonId: null,
79026
+ access: "view"
79027
+ },
79028
+ "nodeCertificates.installHttpsCertificate": {
79029
+ capName: "node-certificates",
79030
+ capScope: "system",
79031
+ addonId: null,
79032
+ access: "create"
79033
+ },
79034
+ "nodeCertificates.installMeshLeaf": {
79035
+ capName: "node-certificates",
79036
+ capScope: "system",
79037
+ addonId: null,
79038
+ access: "create"
79039
+ },
79040
+ "nodeCertificates.prepareHttpsCertificate": {
79041
+ capName: "node-certificates",
79042
+ capScope: "system",
79043
+ addonId: null,
79044
+ access: "create"
79045
+ },
79046
+ "nodeCertificates.prepareMeshRenewal": {
79047
+ capName: "node-certificates",
79048
+ capScope: "system",
79049
+ addonId: null,
79050
+ access: "create"
79051
+ },
79052
+ "nodeCertificates.rollbackMeshLeaf": {
79053
+ capName: "node-certificates",
79054
+ capScope: "system",
79055
+ addonId: null,
79056
+ access: "create"
79057
+ },
78426
79058
  "nodes.clusterAddonStatus": {
78427
79059
  capName: "nodes",
78428
79060
  capScope: "system",
@@ -82700,6 +83332,7 @@ var KNOWN_CAP_NAMES = [
82700
83332
  "detection-pipeline",
82701
83333
  "device-admin-link",
82702
83334
  "device-adoption",
83335
+ "device-credentials",
82703
83336
  "device-discovery",
82704
83337
  "device-export",
82705
83338
  "device-extension",
@@ -82751,6 +83384,7 @@ var KNOWN_CAP_NAMES = [
82751
83384
  "network-access",
82752
83385
  "network-link",
82753
83386
  "network-quality",
83387
+ "node-certificates",
82754
83388
  "nodes",
82755
83389
  "notification-output",
82756
83390
  "notification-rules",
@@ -82938,6 +83572,7 @@ var SYSTEM_CAP_NAMES = [
82938
83572
  "database-snapshot",
82939
83573
  "decoder",
82940
83574
  "device-adoption",
83575
+ "device-credentials",
82941
83576
  "device-export",
82942
83577
  "device-manager",
82943
83578
  "device-provider",
@@ -82963,6 +83598,7 @@ var SYSTEM_CAP_NAMES = [
82963
83598
  "mqtt-broker",
82964
83599
  "network-access",
82965
83600
  "network-quality",
83601
+ "node-certificates",
82966
83602
  "nodes",
82967
83603
  "notification-output",
82968
83604
  "notification-rules",
@@ -84964,6 +85600,7 @@ var CAPABILITY_NAMES = {
84964
85600
  detectionPipeline: "detection-pipeline",
84965
85601
  deviceAdminLink: "device-admin-link",
84966
85602
  deviceAdoption: "device-adoption",
85603
+ deviceCredentials: "device-credentials",
84967
85604
  deviceDiscovery: "device-discovery",
84968
85605
  deviceExport: "device-export",
84969
85606
  deviceExtension: "device-extension",
@@ -85015,6 +85652,7 @@ var CAPABILITY_NAMES = {
85015
85652
  networkAccess: "network-access",
85016
85653
  networkLink: "network-link",
85017
85654
  networkQuality: "network-quality",
85655
+ nodeCertificates: "node-certificates",
85018
85656
  nodes: "nodes",
85019
85657
  notificationOutput: "notification-output",
85020
85658
  notificationRules: "notification-rules",
@@ -85287,6 +85925,10 @@ var CAPABILITY_ROUTER_KEYS = [
85287
85925
  key: "deviceAdoption",
85288
85926
  name: "device-adoption"
85289
85927
  },
85928
+ {
85929
+ key: "deviceCredentials",
85930
+ name: "device-credentials"
85931
+ },
85290
85932
  {
85291
85933
  key: "deviceDiscovery",
85292
85934
  name: "device-discovery"
@@ -85491,6 +86133,10 @@ var CAPABILITY_ROUTER_KEYS = [
85491
86133
  key: "networkQuality",
85492
86134
  name: "network-quality"
85493
86135
  },
86136
+ {
86137
+ key: "nodeCertificates",
86138
+ name: "node-certificates"
86139
+ },
85494
86140
  {
85495
86141
  key: "nodes",
85496
86142
  name: "nodes"
@@ -85828,6 +86474,7 @@ var ALL_CAPABILITY_DEFINITIONS = [
85828
86474
  detectionPipelineCapability,
85829
86475
  deviceAdminLinkCapability,
85830
86476
  deviceAdoptionCapability,
86477
+ deviceCredentialsCapability,
85831
86478
  deviceDiscoveryCapability,
85832
86479
  deviceExportCapability,
85833
86480
  deviceExtensionCapability,
@@ -85879,6 +86526,7 @@ var ALL_CAPABILITY_DEFINITIONS = [
85879
86526
  networkAccessCapability,
85880
86527
  networkLinkCapability,
85881
86528
  networkQualityCapability,
86529
+ nodeCertificatesCapability,
85882
86530
  nodesCapability,
85883
86531
  notificationOutputCapability,
85884
86532
  notificationRulesCapability,
@@ -89384,6 +90032,16 @@ function createSystemProxy(api) {
89384
90032
  release: (input) => dispatch("deviceAdoption", "release", "mutation", input),
89385
90033
  resync: (input) => dispatch("deviceAdoption", "resync", "mutation", input)
89386
90034
  },
90035
+ deviceCredentials: {
90036
+ listDeviceCredentials: (input) => dispatch("deviceCredentials", "listDeviceCredentials", "query", input),
90037
+ startEnrollment: (input) => dispatch("deviceCredentials", "startEnrollment", "mutation", input),
90038
+ revokeDeviceCredential: (input) => dispatch("deviceCredentials", "revokeDeviceCredential", "mutation", input),
90039
+ getDeviceCertificateSettings: (input) => dispatch("deviceCredentials", "getDeviceCertificateSettings", "query", input),
90040
+ setDeviceCertificateSettings: (input) => dispatch("deviceCredentials", "setDeviceCertificateSettings", "mutation", input),
90041
+ deleteDeviceCredential: (input) => dispatch("deviceCredentials", "deleteDeviceCredential", "mutation", input),
90042
+ getDeviceCaStatus: (input) => dispatch("deviceCredentials", "getDeviceCaStatus", "query", input),
90043
+ renameDeviceCredential: (input) => dispatch("deviceCredentials", "renameDeviceCredential", "mutation", input)
90044
+ },
89387
90045
  deviceExport: {
89388
90046
  getStatus: (input) => dispatch("deviceExport", "getStatus", "query", input),
89389
90047
  listSupportedDeviceKinds: (input) => dispatch("deviceExport", "listSupportedDeviceKinds", "query", input),
@@ -98718,6 +99376,9 @@ exports.ClusterModelChoiceSchema = ClusterModelChoiceSchema;
98718
99376
  exports.CollectionColumnSchema = CollectionColumnSchema;
98719
99377
  exports.CollectionIndexSchema = CollectionIndexSchema;
98720
99378
  exports.ColorStatusSchema = ColorStatusSchema;
99379
+ exports.CompleteEnrollmentInputSchema = CompleteEnrollmentInputSchema;
99380
+ exports.CompleteEnrollmentOutputSchema = CompleteEnrollmentOutputSchema;
99381
+ exports.CompleteEnrollmentResultSchema = CompleteEnrollmentResultSchema;
98721
99382
  exports.ComposableCapabilitiesSchema = ComposableCapabilitiesSchema;
98722
99383
  exports.ComposableCapabilitySchema = ComposableCapabilitySchema;
98723
99384
  exports.ComposableFieldSchema = ComposableFieldSchema;
@@ -98835,6 +99496,7 @@ exports.DEFAULT_SESSION_PLACEMENT_POLICY = DEFAULT_SESSION_PLACEMENT_POLICY;
98835
99496
  exports.DEFAULT_SHARE_SOURCE = DEFAULT_SHARE_SOURCE;
98836
99497
  exports.DEFAULT_TIMELAPSE_PREVIEW_TEXT = DEFAULT_TIMELAPSE_PREVIEW_TEXT;
98837
99498
  exports.DEFAULT_TOKEN_EXPIRY = require_sleep.DEFAULT_TOKEN_EXPIRY;
99499
+ exports.DEFINITIVE_DEVICE_REFUSALS = DEFINITIVE_DEVICE_REFUSALS;
98838
99500
  exports.DERIVED_CAMERA_SILENCED_CAP_NAMES = DERIVED_CAMERA_SILENCED_CAP_NAMES;
98839
99501
  exports.DETAIL_CROP_PADDING_FIELD = DETAIL_CROP_PADDING_FIELD;
98840
99502
  exports.DETAIL_CROP_PADDING_KEY = DETAIL_CROP_PADDING_KEY;
@@ -98846,14 +99508,24 @@ exports.DETECTOR_ACCURACY = DETECTOR_ACCURACY;
98846
99508
  exports.DETECTOR_PERF = DETECTOR_PERF;
98847
99509
  exports.DEVICE_BACKEND_TO_FORMAT = DEVICE_BACKEND_TO_FORMAT;
98848
99510
  exports.DEVICE_CAP_NAMES = DEVICE_CAP_NAMES;
99511
+ exports.DEVICE_CERT_RENEW_WINDOW_DAYS = DEVICE_CERT_RENEW_WINDOW_DAYS;
99512
+ exports.DEVICE_CERT_SIGNATURE = DEVICE_CERT_SIGNATURE;
99513
+ exports.DEVICE_CERT_VALIDITY_DAYS = DEVICE_CERT_VALIDITY_DAYS;
98849
99514
  exports.DEVICE_CHILDREN_BATCH_MAX = require_sleep.DEVICE_CHILDREN_BATCH_MAX;
99515
+ exports.DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE = DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE;
98850
99516
  exports.DEVICE_DO_ACTIONS = DEVICE_DO_ACTIONS;
99517
+ exports.DEVICE_ENROLLMENT_TTL_MS = DEVICE_ENROLLMENT_TTL_MS;
99518
+ exports.DEVICE_NONCE_TTL_MS = DEVICE_NONCE_TTL_MS;
98851
99519
  exports.DEVICE_PROFILES = DEVICE_PROFILES;
98852
99520
  exports.DEVICE_RAMP = DEVICE_RAMP;
99521
+ exports.DEVICE_REFRESH_REFUSAL_PREFIX = DEVICE_REFRESH_REFUSAL_PREFIX;
98853
99522
  exports.DEVICE_RESTORE_RETRY_CONCURRENCY = DEVICE_RESTORE_RETRY_CONCURRENCY;
98854
99523
  exports.DEVICE_RESTORE_RETRY_DELAYS_MS = DEVICE_RESTORE_RETRY_DELAYS_MS;
99524
+ exports.DEVICE_SAN_CREDENTIAL_PREFIX = DEVICE_SAN_CREDENTIAL_PREFIX;
99525
+ exports.DEVICE_SAN_USER_PREFIX = DEVICE_SAN_USER_PREFIX;
98855
99526
  exports.DEVICE_SCOPED_CAPS = require_sleep.DEVICE_SCOPED_CAPS;
98856
99527
  exports.DEVICE_SETTINGS_CONTRIBUTION_METHODS = require_sleep.DEVICE_SETTINGS_CONTRIBUTION_METHODS;
99528
+ exports.DEVICE_SIGNATURE_MESSAGE_VERSION = DEVICE_SIGNATURE_MESSAGE_VERSION;
98857
99529
  exports.DEVICE_STATE_READERS = DEVICE_STATE_READERS;
98858
99530
  exports.DEVICE_STATUS_METHOD = require_sleep.DEVICE_STATUS_METHOD;
98859
99531
  exports.DEVICE_TYPE_CONTROL_KIND = DEVICE_TYPE_CONTROL_KIND;
@@ -98881,9 +99553,17 @@ exports.DetectionSourceSchema = DetectionSourceSchema;
98881
99553
  exports.DetectionSourcesSchema = DetectionSourcesSchema;
98882
99554
  exports.DetectorStoreClearSchema = DetectorStoreClearSchema;
98883
99555
  exports.DeviceAdminLinkSchema = DeviceAdminLinkSchema;
99556
+ exports.DeviceCaStatusSchema = DeviceCaStatusSchema;
99557
+ exports.DeviceCertificateLoginMethodSchema = DeviceCertificateLoginMethodSchema;
99558
+ exports.DeviceCertificateSettingsSchema = DeviceCertificateSettingsSchema;
99559
+ exports.DeviceChallengeResultSchema = DeviceChallengeResultSchema;
99560
+ exports.DeviceChallengeSchema = DeviceChallengeSchema;
98884
99561
  exports.DeviceCodeSeveritySchema = DeviceCodeSeveritySchema;
98885
99562
  exports.DeviceConfig = DeviceConfig;
99563
+ exports.DeviceCredentialSchema = DeviceCredentialSchema;
99564
+ exports.DeviceCredentialStatusSchema = DeviceCredentialStatusSchema;
98886
99565
  exports.DeviceDiscoveryStatusSchema = DeviceDiscoveryStatusSchema;
99566
+ exports.DeviceEnrollProofSchema = DeviceEnrollProofSchema;
98887
99567
  exports.DeviceExportExposeInputSchema = ExposeInputSchema;
98888
99568
  exports.DeviceExportStatusSchema = DeviceExportStatusSchema;
98889
99569
  exports.DeviceExportUnexposeInputSchema = UnexposeInputSchema;
@@ -98891,11 +99571,16 @@ exports.DeviceFeature = require_err_msg.DeviceFeature;
98891
99571
  exports.DeviceInfoSchema = DeviceInfoSchema;
98892
99572
  exports.DeviceModelChoiceSchema = DeviceModelChoiceSchema;
98893
99573
  exports.DeviceNetworkStatsSchema = DeviceNetworkStatsSchema;
99574
+ exports.DevicePlatformSchema = DevicePlatformSchema;
99575
+ exports.DeviceProofInputSchema = DeviceProofInputSchema;
98894
99576
  exports.DeviceRecommendationSchema = DeviceRecommendationSchema;
99577
+ exports.DeviceRefusalReasonSchema = DeviceRefusalReasonSchema;
99578
+ exports.DeviceRefusalSchema = DeviceRefusalSchema;
98895
99579
  exports.DeviceRestoreRetryScheduler = DeviceRestoreRetryScheduler;
98896
99580
  exports.DeviceRole = require_err_msg.DeviceRole;
98897
99581
  exports.DeviceRuntimeState = DeviceRuntimeState;
98898
99582
  exports.DeviceSelectorSchema = DeviceSelectorSchema;
99583
+ exports.DeviceSignaturePurposeSchema = DeviceSignaturePurposeSchema;
98899
99584
  exports.DeviceStatusSchema = DeviceStatusSchema;
98900
99585
  exports.DeviceType = require_err_msg.DeviceType;
98901
99586
  exports.DiagnosticIdSchema = DiagnosticIdSchema;
@@ -98948,6 +99633,7 @@ exports.EmbeddingResultSchema = EmbeddingResultSchema;
98948
99633
  exports.EmbeddingTowerSchema = EmbeddingTowerSchema;
98949
99634
  exports.EncodeProfileSchema = EncodeProfileSchema;
98950
99635
  exports.EnrichedWidgetMetadataSchema = EnrichedWidgetMetadataSchema;
99636
+ exports.EnrollSelfInputSchema = EnrollSelfInputSchema;
98951
99637
  exports.EnumSensorDateTimeFormatSchema = EnumSensorDateTimeFormatSchema;
98952
99638
  exports.EnumSensorStatusSchema = EnumSensorStatusSchema;
98953
99639
  exports.EventCategory = require_event_category.EventCategory;
@@ -99056,6 +99742,7 @@ exports.HealthStatusSchema = HealthStatusSchema;
99056
99742
  exports.HfModelResolutionSchema = HfModelResolutionSchema;
99057
99743
  exports.HistoryPointSchema = HistoryPointSchema;
99058
99744
  exports.HistoryResolutionEnum = HistoryResolutionEnum;
99745
+ exports.HttpsLeafInfoSchema = HttpsLeafInfoSchema;
99059
99746
  exports.HubAddressRoleSchema = HubAddressRoleSchema;
99060
99747
  exports.HumidifierStatusSchema = HumidifierStatusSchema;
99061
99748
  exports.HumiditySensorStatusSchema = HumiditySensorStatusSchema;
@@ -99251,6 +99938,7 @@ exports.MediaPlayerStateSchema = MediaPlayerStateSchema;
99251
99938
  exports.MediaPlayerStatusSchema = MediaPlayerStatusSchema;
99252
99939
  exports.MediaPresenceOwnerKindSchema = MediaPresenceOwnerKindSchema;
99253
99940
  exports.MediaRelocateModeSchema = MediaRelocateModeSchema;
99941
+ exports.MeshLeafInfoSchema = MeshLeafInfoSchema;
99254
99942
  exports.MeshPeerSchema = MeshPeerSchema;
99255
99943
  exports.MeshStatusSchema = MeshStatusSchema;
99256
99944
  exports.MethodAccessSchema = MethodAccessSchema;
@@ -99540,6 +100228,7 @@ exports.NodeColorIdSchema = require_node_color.NodeColorIdSchema;
99540
100228
  exports.NodeDeviceChangeSchema = NodeDeviceChangeSchema;
99541
100229
  exports.NodeDirectoryEntrySchema = NodeDirectoryEntrySchema;
99542
100230
  exports.NodeDirectorySchema = NodeDirectorySchema;
100231
+ exports.NodeHttpsStateSchema = NodeHttpsStateSchema;
99543
100232
  exports.NodeRecommendationSchema = NodeRecommendationSchema;
99544
100233
  exports.NotificationActionIconSchema = NotificationActionIconSchema;
99545
100234
  exports.NotificationActionSchema = NotificationActionSchema;
@@ -99758,6 +100447,8 @@ exports.RelocateMediaInputSchema = RelocateMediaInputSchema;
99758
100447
  exports.RelocateResidueInputSchema = RelocateResidueInputSchema;
99759
100448
  exports.RelocateResidueSchema = RelocateResidueSchema;
99760
100449
  exports.RenderedAsSchema = RenderedAsSchema;
100450
+ exports.RenewDeviceCertificateOutputSchema = RenewDeviceCertificateOutputSchema;
100451
+ exports.RenewDeviceCertificateResultSchema = RenewDeviceCertificateResultSchema;
99761
100452
  exports.ReportMotionInputSchema = ReportMotionInputSchema;
99762
100453
  exports.ReportedFailureContributionSchema = ReportedFailureContributionSchema;
99763
100454
  exports.ReportedLoadContributionSchema = ReportedLoadContributionSchema;
@@ -99809,6 +100500,7 @@ exports.RetrainTrackSchema = RetrainTrackSchema;
99809
100500
  exports.RetrainTrainingCorpusResolveResultSchema = RetrainTrainingCorpusResolveResultSchema;
99810
100501
  exports.RetrainTrainingCorpusSelectionSchema = RetrainTrainingCorpusSelectionSchema;
99811
100502
  exports.RetrainTransitionResultSchema = RetrainTransitionResultSchema;
100503
+ exports.RevokeOwnDeviceCertificateResultSchema = RevokeOwnDeviceCertificateResultSchema;
99812
100504
  exports.RingBuffer = RingBuffer;
99813
100505
  exports.RootStepSupplySchema = RootStepSupplySchema;
99814
100506
  exports.RtpSourceSchema = RtpSourceSchema;
@@ -99912,6 +100604,7 @@ exports.SpatialDetectionSchema = SpatialDetectionSchema;
99912
100604
  exports.SsoBridgeClaimsSchema = SsoBridgeClaimsSchema;
99913
100605
  exports.StaleDevicePinSchema = StaleDevicePinSchema;
99914
100606
  exports.StartEmbeddedInputSchema = StartEmbeddedInputSchema;
100607
+ exports.StartEnrollmentOutputSchema = StartEnrollmentOutputSchema;
99915
100608
  exports.StationaryObjectSchema = StationaryObjectSchema;
99916
100609
  exports.StorageAbortUploadInputSchema = AbortUploadInputSchema;
99917
100610
  exports.StorageAccessSchema = StorageAccessSchema;
@@ -100160,6 +100853,7 @@ exports.addonWidgetsCapability = addonWidgetsCapability;
100160
100853
  exports.addonWidgetsSourceCapability = addonWidgetsSourceCapability;
100161
100854
  exports.addonsCapability = addonsCapability;
100162
100855
  exports.adminUiCapability = require_sleep.adminUiCapability;
100856
+ exports.advertisedHubOrigins = advertisedHubOrigins;
100163
100857
  exports.airQualitySensorCapability = airQualitySensorCapability;
100164
100858
  exports.alarmDeviceBlocksArming = alarmDeviceBlocksArming;
100165
100859
  exports.alarmDeviceSecureOnArm = alarmDeviceSecureOnArm;
@@ -100212,6 +100906,8 @@ exports.buildAudioArgs = require_composition.buildAudioArgs;
100212
100906
  exports.buildBenchStepTree = buildBenchStepTree;
100213
100907
  exports.buildCapabilityLookup = buildCapabilityLookup;
100214
100908
  exports.buildDeviceAdminUrl = buildDeviceAdminUrl;
100909
+ exports.buildDeviceEnrollmentLink = buildDeviceEnrollmentLink;
100910
+ exports.buildDeviceSignatureMessage = buildDeviceSignatureMessage;
100215
100911
  exports.buildDoorbellCompositionFeature = buildDoorbellCompositionFeature;
100216
100912
  exports.buildEventKindDescriptor = buildEventKindDescriptor;
100217
100913
  exports.buildFfmpegArgs = require_composition.buildFfmpegArgs;
@@ -100244,6 +100940,7 @@ exports.capacitySessionsOf = capacitySessionsOf;
100244
100940
  exports.carbonMonoxideCapability = carbonMonoxideCapability;
100245
100941
  exports.cellsToRects = cellsToRects;
100246
100942
  exports.checkRoleAddress = checkRoleAddress;
100943
+ exports.claimedRequestOrigins = claimedRequestOrigins;
100247
100944
  exports.classifyBearerPrincipal = classifyBearerPrincipal;
100248
100945
  exports.classifyCamerasForBenchmark = classifyCamerasForBenchmark;
100249
100946
  exports.classifyInferenceHardware = classifyInferenceHardware;
@@ -100365,6 +101062,7 @@ exports.detectionPipelineCapability = detectionPipelineCapability;
100365
101062
  exports.deviceAdminLinkCapability = deviceAdminLinkCapability;
100366
101063
  exports.deviceAdoptionCapability = deviceAdoptionCapability;
100367
101064
  exports.deviceBackendToFormat = deviceBackendToFormat;
101065
+ exports.deviceCredentialsCapability = deviceCredentialsCapability;
100368
101066
  exports.deviceCustomAction = require_sleep.deviceCustomAction;
100369
101067
  exports.deviceDiscoveryCapability = deviceDiscoveryCapability;
100370
101068
  exports.deviceDoFamily = deviceDoFamily;
@@ -100374,6 +101072,7 @@ exports.deviceManagerCapability = deviceManagerCapability;
100374
101072
  exports.deviceMatchesProfile = deviceMatchesProfile;
100375
101073
  exports.deviceOpsCapability = require_sleep.deviceOpsCapability;
100376
101074
  exports.deviceProviderCapability = deviceProviderCapability;
101075
+ exports.deviceRefusalFromMessage = deviceRefusalFromMessage;
100377
101076
  exports.deviceSelectorMatches = deviceSelectorMatches;
100378
101077
  exports.deviceStateCapability = deviceStateCapability;
100379
101078
  exports.deviceStatusCapability = deviceStatusCapability;
@@ -100450,6 +101149,7 @@ exports.findTimezone = findTimezone;
100450
101149
  exports.floodCapability = floodCapability;
100451
101150
  exports.foldSnapshotByFunction = foldSnapshotByFunction;
100452
101151
  exports.forgetKnownSecret = require_sleep.forgetKnownSecret;
101152
+ exports.formatDeviceRevoker = formatDeviceRevoker;
100453
101153
  exports.formatForRuntime = formatForRuntime;
100454
101154
  exports.formatMediaOwnerKey = formatMediaOwnerKey;
100455
101155
  exports.formatMinutes = formatMinutes;
@@ -100509,6 +101209,7 @@ exports.isClusterScopedStep = isClusterScopedStep;
100509
101209
  exports.isCollectionArrayMethod = isCollectionArrayMethod;
100510
101210
  exports.isDefaultAlarmProfileId = isDefaultAlarmProfileId;
100511
101211
  exports.isDefaultAppConnectionEndpoint = isDefaultAppConnectionEndpoint;
101212
+ exports.isDefinitiveDeviceRefusal = isDefinitiveDeviceRefusal;
100512
101213
  exports.isDeployableToAgent = isDeployableToAgent;
100513
101214
  exports.isDetectionMacroClass = isDetectionMacroClass;
100514
101215
  exports.isDeviceConfigCap = require_sleep.isDeviceConfigCap;
@@ -100631,6 +101332,7 @@ exports.networkAccessCapability = networkAccessCapability;
100631
101332
  exports.networkLinkCapability = networkLinkCapability;
100632
101333
  exports.networkQualityCapability = networkQualityCapability;
100633
101334
  exports.nodeBenchmarkRefusals = nodeBenchmarkRefusals;
101335
+ exports.nodeCertificatesCapability = nodeCertificatesCapability;
100634
101336
  exports.nodePickerItems = nodePickerItems;
100635
101337
  exports.nodePin = require_sleep.nodePin;
100636
101338
  exports.nodesCapability = nodesCapability;
@@ -100638,6 +101340,7 @@ exports.normalizeAddonInitResult = require_sleep.normalizeAddonInitResult;
100638
101340
  exports.normalizeAudioLabel = normalizeAudioLabel;
100639
101341
  exports.normalizeCoreBlockWrite = normalizeCoreBlockWrite;
100640
101342
  exports.normalizeNodeId = require_sleep.normalizeNodeId;
101343
+ exports.normalizeOrigin = normalizeOrigin;
100641
101344
  exports.normalizeSecretOwner = require_sleep.normalizeSecretOwner;
100642
101345
  exports.normalizeTokenScopes = normalizeTokenScopes;
100643
101346
  exports.normalizeUnit = normalizeUnit;
@@ -100659,6 +101362,7 @@ exports.packagePickerItems = packagePickerItems;
100659
101362
  exports.parseAdminBase = parseAdminBase;
100660
101363
  exports.parseAppAuthCallback = parseAppAuthCallback;
100661
101364
  exports.parseCameraStreamConfig = parseCameraStreamConfig;
101365
+ exports.parseDeviceEnrollmentLink = parseDeviceEnrollmentLink;
100662
101366
  exports.parseExpression = require_composition.parseExpression;
100663
101367
  exports.parseJsonArray = require_sleep.parseJsonArray;
100664
101368
  exports.parseJsonObject = require_sleep.parseJsonObject;
@@ -100685,6 +101389,7 @@ exports.pickDetailCropConvention = pickDetailCropConvention;
100685
101389
  exports.pickInvalidClusterStepModels = pickInvalidClusterStepModels;
100686
101390
  exports.pickNativeLeaseOverride = pickNativeLeaseOverride;
100687
101391
  exports.pickPreferredRtspEntry = pickPreferredRtspEntry;
101392
+ exports.pickRequestOrigin = pickRequestOrigin;
100688
101393
  exports.pickRestartCandidate = pickRestartCandidate;
100689
101394
  exports.pickVideoEncoder = require_composition.pickVideoEncoder;
100690
101395
  exports.pickerForCondition = pickerForCondition;
@@ -100738,6 +101443,7 @@ exports.reducePoints = reducePoints;
100738
101443
  exports.registerKnownSecret = require_sleep.registerKnownSecret;
100739
101444
  exports.renameAlarmProfile = renameAlarmProfile;
100740
101445
  exports.replacedFieldKeys = replacedFieldKeys;
101446
+ exports.requestMountPrefix = requestMountPrefix;
100741
101447
  exports.requiredTopLevelKeys = requiredTopLevelKeys;
100742
101448
  exports.requiresPython = requiresPython;
100743
101449
  exports.reservedSourceOwner = reservedSourceOwner;