@camstack/types 1.2.369 → 1.2.371

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.
@@ -12195,6 +12195,12 @@ export type AppRouter = TrpcCoreRouter<{
12195
12195
  stage: "primary" | "second-factor";
12196
12196
  icon?: string | undefined;
12197
12197
  linkable?: boolean | undefined;
12198
+ app?: {
12199
+ kind: "native";
12200
+ } | {
12201
+ kind: "browser";
12202
+ startPath: string;
12203
+ } | null | undefined;
12198
12204
  } | {
12199
12205
  kind: "widget";
12200
12206
  id: string;
@@ -12207,6 +12213,12 @@ export type AppRouter = TrpcCoreRouter<{
12207
12213
  };
12208
12214
  stage: "primary" | "second-factor";
12209
12215
  bundleUrl: string;
12216
+ app?: {
12217
+ kind: "native";
12218
+ } | {
12219
+ kind: "browser";
12220
+ startPath: string;
12221
+ } | null | undefined;
12210
12222
  } | {
12211
12223
  kind: "passkey";
12212
12224
  id: string;
@@ -12214,6 +12226,12 @@ export type AppRouter = TrpcCoreRouter<{
12214
12226
  stage: "primary" | "second-factor";
12215
12227
  rpId: string;
12216
12228
  origin: string | null;
12229
+ app?: {
12230
+ kind: "native";
12231
+ } | {
12232
+ kind: "browser";
12233
+ startPath: string;
12234
+ } | null | undefined;
12217
12235
  } | {
12218
12236
  kind: "device-certificate";
12219
12237
  id: "device-certificate";
@@ -12227,6 +12245,12 @@ export type AppRouter = TrpcCoreRouter<{
12227
12245
  signature: "ecdsa-p256-sha256";
12228
12246
  messageVersion: "camstack-device-cert-v1";
12229
12247
  clients: ("web" | "native")[];
12248
+ app: {
12249
+ kind: "native";
12250
+ } | {
12251
+ kind: "browser";
12252
+ startPath: string;
12253
+ } | null;
12230
12254
  })[];
12231
12255
  meta: object;
12232
12256
  }>;
@@ -13055,6 +13079,12 @@ export type AppRouter = TrpcCoreRouter<{
13055
13079
  stage: "primary" | "second-factor";
13056
13080
  icon?: string | undefined;
13057
13081
  linkable?: boolean | undefined;
13082
+ app?: {
13083
+ kind: "native";
13084
+ } | {
13085
+ kind: "browser";
13086
+ startPath: string;
13087
+ } | null | undefined;
13058
13088
  } | {
13059
13089
  kind: "widget";
13060
13090
  id: string;
@@ -13067,6 +13097,12 @@ export type AppRouter = TrpcCoreRouter<{
13067
13097
  };
13068
13098
  stage: "primary" | "second-factor";
13069
13099
  bundleUrl: string;
13100
+ app?: {
13101
+ kind: "native";
13102
+ } | {
13103
+ kind: "browser";
13104
+ startPath: string;
13105
+ } | null | undefined;
13070
13106
  } | {
13071
13107
  kind: "passkey";
13072
13108
  id: string;
@@ -13074,6 +13110,12 @@ export type AppRouter = TrpcCoreRouter<{
13074
13110
  stage: "primary" | "second-factor";
13075
13111
  rpId: string;
13076
13112
  origin: string | null;
13113
+ app?: {
13114
+ kind: "native";
13115
+ } | {
13116
+ kind: "browser";
13117
+ startPath: string;
13118
+ } | null | undefined;
13077
13119
  } | {
13078
13120
  kind: "device-certificate";
13079
13121
  id: "device-certificate";
@@ -13087,6 +13129,12 @@ export type AppRouter = TrpcCoreRouter<{
13087
13129
  signature: "ecdsa-p256-sha256";
13088
13130
  messageVersion: "camstack-device-cert-v1";
13089
13131
  clients: ("web" | "native")[];
13132
+ app: {
13133
+ kind: "native";
13134
+ } | {
13135
+ kind: "browser";
13136
+ startPath: string;
13137
+ } | null;
13090
13138
  })[];
13091
13139
  meta: object;
13092
13140
  }>;
package/dist/index.d.ts CHANGED
@@ -151,6 +151,7 @@ export * from './types/pipeline-step.js';
151
151
  export * from './types/tracked.js';
152
152
  export { type BearerPayloadShape, type BearerPrincipal, classifyBearerPrincipal, methodAccessForHttpMethod, type PrincipalAddonReachInput, type PrincipalAddonReachVerdict, principalMayReachAddon, scopesAllowAddon, scopesAllowDeviceCap, } from './auth/principal-scope.js';
153
153
  export { APP_AUTH_CALLBACK_MAX_LENGTH, APP_AUTH_CALLBACK_URLS, canonicalizeAppCallback, hasUrlScheme, parseAppAuthCallback, } from './auth/app-callback.js';
154
+ export { APP_FLOW_DEFAULT_REDIRECT, APP_FLOW_REFUSAL_MESSAGES, APP_FLOW_STATE_PREFIX, type AppFlowParse, type AppFlowPurpose, AppFlowPurposeSchema, type AppFlowRefusal, type AppFlowRequest, type AppLoginPath, AppLoginPathSchema, appFlowLocation, parseAppFlowRequest, } from './auth/app-flow.js';
154
155
  export { SSO_STATE_COOKIE, SSO_STATE_COOKIE_MAX_AGE_SEC } from './auth/sso-state.js';
155
156
  export { buildDeviceEnrollmentLink, buildDeviceSignatureMessage, type CompleteEnrollmentInput, CompleteEnrollmentInputSchema, type CompleteEnrollmentOutput, CompleteEnrollmentOutputSchema, DEVICE_CERT_RENEW_WINDOW_DAYS, DEVICE_CERT_SIGNATURE, DEVICE_CERT_VALIDITY_DAYS, DEVICE_ENROLLMENT_TTL_MS, DEVICE_NONCE_TTL_MS, DEVICE_SAN_CREDENTIAL_PREFIX, DEVICE_SAN_USER_PREFIX, DEVICE_SIGNATURE_MESSAGE_VERSION, type DeviceCertificateLoginMethod, DeviceCertificateLoginMethodSchema, type DeviceChallenge, DeviceChallengeSchema, type DeviceCredential, DeviceCredentialSchema, type DeviceCredentialStatus, DeviceCredentialStatusSchema, type DevicePlatform, DevicePlatformSchema, type DeviceProofInput, DeviceProofInputSchema, type CompleteEnrollmentResult, CompleteEnrollmentResultSchema, DEFINITIVE_DEVICE_REFUSALS, DEVICE_DEFINITIVE_REFUSALS_BEFORE_DELETE, DEVICE_REFRESH_REFUSAL_PREFIX, deviceRefusalFromMessage, type DeviceChallengeResult, DeviceChallengeResultSchema, DeviceEnrollProofSchema, type DeviceRefusal, type DeviceRefusalReason, DeviceRefusalReasonSchema, DeviceRefusalSchema, type DeviceRevoker, type EnrollSelfInput, EnrollSelfInputSchema, formatDeviceRevoker, isDefinitiveDeviceRefusal, type RenewDeviceCertificateResult, RenewDeviceCertificateResultSchema, type RevokeOwnDeviceCertificateResult, RevokeOwnDeviceCertificateResultSchema, type DeviceSignaturePurpose, DeviceSignaturePurposeSchema, type RenewDeviceCertificateOutput, RenewDeviceCertificateOutputSchema, type StartEnrollmentOutput, StartEnrollmentOutputSchema, parseDeviceEnrollmentLink, } from './auth/device-certificate.js';
156
157
  export { advertisedHubOrigins, claimedRequestOrigins, normalizeOrigin, pickRequestOrigin, type RequestHeaders, requestMountPrefix, } from './auth/request-origin.js';
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_sleep = require("./sleep-CXlc9YJ5.js");
2
+ const require_sleep = require("./sleep-DnQ5WsMI.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");
@@ -6640,6 +6640,103 @@ function hasUrlScheme(url) {
6640
6640
  return /^[a-z][a-z0-9+.-]*:/i.test(url);
6641
6641
  }
6642
6642
  //#endregion
6643
+ //#region src/auth/app-flow.ts
6644
+ /**
6645
+ * The native-app browser sign-in flows the hub serves itself (D858).
6646
+ *
6647
+ * The viewer app opens the system browser at a hub START route (OIDC
6648
+ * `/addon/auth-oidc/<id>/start`, the passkey page `/auth/app/passkey`) and gets
6649
+ * a one-shot handoff code back at its custom scheme. These helpers are the one
6650
+ * reading of the request every leg shares - the OIDC addon, the finish leg and
6651
+ * the passkey page - so a rule tightened for one is tightened for all:
6652
+ *
6653
+ * - PKCE is mandatory and S256 only (`code_challenge` = base64url of a SHA-256);
6654
+ * - `state` is echoed back exactly;
6655
+ * - the return URL is one of {@link APP_AUTH_CALLBACK_URLS}, never a free URL;
6656
+ * - the purpose is `new-session` or `step-up` (the legacy `renew` has no browser flow).
6657
+ *
6658
+ * Pure and dependency-free (zod only) so an addon, the backend and a spec read
6659
+ * the same code.
6660
+ */
6661
+ /** What the app redeems the code for. `step-up` yields a proof, never a session. */
6662
+ var AppFlowPurposeSchema = zod.z.enum(["new-session", "step-up"]);
6663
+ /** Where the app is sent when the request names no `redirect`. */
6664
+ var APP_FLOW_DEFAULT_REDIRECT = "camstack://auth-callback";
6665
+ /**
6666
+ * A browser OIDC flow started for an app carries this prefix on the IdP
6667
+ * `state` it generates, so a callback whose pending state is gone (expired,
6668
+ * replayed) can still be answered at the app and not on a hub error page. The
6669
+ * destination of that answer is the fixed default callback - the prefix
6670
+ * selects nothing the requester controls.
6671
+ */
6672
+ var APP_FLOW_STATE_PREFIX = "a.";
6673
+ /** S256 challenge: base64url of 32 bytes = 43 characters, no padding. */
6674
+ var CHALLENGE_PATTERN = /^[A-Za-z0-9_-]{43}$/;
6675
+ /** The app's own `state`: URL-safe characters only, bounded. */
6676
+ var STATE_PATTERN = /^[A-Za-z0-9._~-]{1,256}$/;
6677
+ /** Operator-facing words for a refusal (the "clear page", D858). */
6678
+ var APP_FLOW_REFUSAL_MESSAGES = {
6679
+ "bad-challenge": "The sign-in request has no valid PKCE challenge (S256).",
6680
+ "bad-challenge-method": "Only the S256 PKCE method is supported.",
6681
+ "bad-state": "The sign-in request has no valid state.",
6682
+ "bad-purpose": "The sign-in request names an unknown purpose.",
6683
+ "bad-redirect": "The sign-in request names a return address this hub does not accept."
6684
+ };
6685
+ /**
6686
+ * Read the app parameters off a start query: `code_challenge`,
6687
+ * `code_challenge_method`, `state`, `purpose`, `redirect`. Anything missing or
6688
+ * malformed is refused - there is no lenient default for PKCE or state.
6689
+ */
6690
+ function parseAppFlowRequest(query) {
6691
+ const challenge = query["code_challenge"];
6692
+ if (challenge === void 0 || !CHALLENGE_PATTERN.test(challenge)) return {
6693
+ ok: false,
6694
+ reason: "bad-challenge"
6695
+ };
6696
+ if (query["code_challenge_method"] !== "S256") return {
6697
+ ok: false,
6698
+ reason: "bad-challenge-method"
6699
+ };
6700
+ const state = query["state"];
6701
+ if (state === void 0 || !STATE_PATTERN.test(state)) return {
6702
+ ok: false,
6703
+ reason: "bad-state"
6704
+ };
6705
+ const purpose = AppFlowPurposeSchema.safeParse(query["purpose"]);
6706
+ if (!purpose.success) return {
6707
+ ok: false,
6708
+ reason: "bad-purpose"
6709
+ };
6710
+ const redirectParam = query["redirect"];
6711
+ const redirect = redirectParam === void 0 ? APP_FLOW_DEFAULT_REDIRECT : parseAppAuthCallback(redirectParam);
6712
+ if (redirect === null) return {
6713
+ ok: false,
6714
+ reason: "bad-redirect"
6715
+ };
6716
+ return {
6717
+ ok: true,
6718
+ request: {
6719
+ codeChallenge: challenge,
6720
+ state,
6721
+ purpose: purpose.data,
6722
+ redirect
6723
+ }
6724
+ };
6725
+ }
6726
+ /** The app's callback with `code` (success) or `error` (refusal), and the echoed `state` when known. */
6727
+ function appFlowLocation(redirect, result, state) {
6728
+ const params = new URLSearchParams();
6729
+ if ("code" in result) params.set("code", result.code);
6730
+ else params.set("error", result.error);
6731
+ if (state !== void 0) params.set("state", state);
6732
+ return `${redirect}?${params.toString()}`;
6733
+ }
6734
+ /** How a native app starts one login method (D858), as `auth.listLoginMethods` reports it. */
6735
+ var AppLoginPathSchema = zod.z.discriminatedUnion("kind", [zod.z.object({ kind: zod.z.literal("native") }), zod.z.object({
6736
+ kind: zod.z.literal("browser"),
6737
+ startPath: zod.z.string().startsWith("/")
6738
+ })]);
6739
+ //#endregion
6643
6740
  //#region src/auth/sso-state.ts
6644
6741
  /**
6645
6742
  * The cookie that binds an SSO sign-in to the browser that started it.
@@ -6902,7 +6999,9 @@ var DeviceCertificateLoginMethodSchema = zod.z.object({
6902
6999
  signature: zod.z.literal(DEVICE_CERT_SIGNATURE),
6903
7000
  messageVersion: zod.z.literal(DEVICE_SIGNATURE_MESSAGE_VERSION),
6904
7001
  /** 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"]))
7002
+ clients: zod.z.array(zod.z.enum(["native", "web"])),
7003
+ /** The app executes it itself, silently (D858). */
7004
+ app: AppLoginPathSchema.nullable()
6906
7005
  });
6907
7006
  //#endregion
6908
7007
  //#region src/auth/request-origin.ts
@@ -38200,10 +38299,14 @@ function isLanIpv4Literal(endpoint) {
38200
38299
  const host = hostnameOf(endpoint.baseUrl);
38201
38300
  return host !== null && IPV4_LITERAL.test(host);
38202
38301
  }
38302
+ function isUnstable(endpoint) {
38303
+ return endpoint.stable === false;
38304
+ }
38203
38305
  /** Lower = better; `null` = never this role's AUTOMATIC answer. */
38204
38306
  function autoRankFor(role, endpoint) {
38205
38307
  if (endpoint.kind === "loopback" || endpoint.kind === "app-link" || endpoint.kind === "custom") return null;
38206
38308
  if (hostnameOf(endpoint.baseUrl) === null) return null;
38309
+ if (isUnstable(endpoint)) return null;
38207
38310
  if (role === "internal") {
38208
38311
  if (isLanIpv4Literal(endpoint)) return 0;
38209
38312
  if (isPlausibleLan(endpoint)) return 1;
@@ -38358,6 +38461,7 @@ function resolveNotificationTapAddress(flags) {
38358
38461
  }
38359
38462
  /** AUTO app connections: LAN IPv4 + the public tunnel. Never IPv6, mesh, loopback or custom. */
38360
38463
  function isDefaultAppConnectionEndpoint(endpoint) {
38464
+ if (isUnstable(endpoint)) return false;
38361
38465
  if (endpoint.kind === "lan-ipv4") return true;
38362
38466
  return endpoint.kind === "public" && endpoint.interfaceKind === "public";
38363
38467
  }
@@ -38438,6 +38542,18 @@ var AGENT_MDNS_TXT_KEYS = {
38438
38542
  keyFingerprint: "fp"
38439
38543
  };
38440
38544
  //#endregion
38545
+ //#region src/capabilities/addon-catalog-href.ts
38546
+ /**
38547
+ * The Addons catalog filtered to the packages that declare `capability` — the
38548
+ * ONE spelling of that link (D860). It lives in `@camstack/types` so an addon's
38549
+ * own page (which may not import the admin UI) and the admin pages build it the
38550
+ * same way. `scripts/check-addon-install-links.ts` pins this file as the only
38551
+ * place the URL is written.
38552
+ */
38553
+ function addonCatalogHref(capability) {
38554
+ return `/system/addons?${new URLSearchParams({ capability }).toString()}`;
38555
+ }
38556
+ //#endregion
38441
38557
  //#region src/capabilities/ai-cap-timeouts.ts
38442
38558
  /**
38443
38559
  * Transport bounds for AI capability methods.
@@ -39524,7 +39640,13 @@ var RedirectLoginMethodSchema = zod.z.object({
39524
39640
  * `beginExternalLink` offer exactly the redirect methods that set this,
39525
39641
  * whatever their id. Absent / false — a login button only.
39526
39642
  */
39527
- linkable: zod.z.boolean().optional()
39643
+ linkable: zod.z.boolean().optional(),
39644
+ /**
39645
+ * How a NATIVE app starts this method (D858): `{ kind: 'browser', startPath }`
39646
+ * when the route understands the app flow query (`app=1&code_challenge=…`),
39647
+ * `null`/absent when there is no app path - the app hides the method.
39648
+ */
39649
+ app: AppLoginPathSchema.nullable().optional()
39528
39650
  });
39529
39651
  /**
39530
39652
  * A Module-Federation widget the login page mounts for an in-page
@@ -39543,7 +39665,9 @@ var WidgetLoginMethodSchema = zod.z.object({
39543
39665
  bundle: zod.z.string(),
39544
39666
  /** MF remote descriptor — `{ remoteName, exposedModule, componentKey }`. */
39545
39667
  remote: WidgetRemoteSchema,
39546
- stage: LoginStageEnum
39668
+ stage: LoginStageEnum,
39669
+ /** Widgets are web ceremonies: no native app path (D858). Absent reads as `null`. */
39670
+ app: AppLoginPathSchema.nullable().optional()
39547
39671
  });
39548
39672
  /**
39549
39673
  * A declarative WebAuthn ceremony the shell renders natively (no remote
@@ -39561,7 +39685,9 @@ var PasskeyLoginMethodSchema = zod.z.object({
39561
39685
  /** Effective WebAuthn RP ID (`resolveRpID()`) — the shell gates visibility on it. */
39562
39686
  rpId: zod.z.string(),
39563
39687
  /** Effective expected origin (`resolveOrigin()`), null when unconfigured. */
39564
- origin: zod.z.string().nullable()
39688
+ origin: zod.z.string().nullable(),
39689
+ /** Set by the hub for the primary arm; a second-factor passkey has no app path (D858). */
39690
+ app: AppLoginPathSchema.nullable().optional()
39565
39691
  });
39566
39692
  /** One login-method contribution — redirect button, pre-auth widget, or native passkey ceremony. */
39567
39693
  var LoginMethodContributionSchema = zod.z.discriminatedUnion("kind", [
@@ -40230,7 +40356,25 @@ var NetworkEndpointSchema = zod.z.object({
40230
40356
  url: zod.z.string(),
40231
40357
  hostname: zod.z.string(),
40232
40358
  port: zod.z.number(),
40233
- protocol: zod.z.enum(["http", "https"])
40359
+ protocol: zod.z.enum(["http", "https"]),
40360
+ /**
40361
+ * Whether this address survives a restart of its provider. `false` = it is
40362
+ * re-issued every time (a Quick tunnel's random `*.trycloudflare.com`); the
40363
+ * hub never selects such an address AUTOMATICALLY for a role (D860), though
40364
+ * it stays visible and an operator may still flag it. Absent = stable: every
40365
+ * provider except a Quick tunnel owns a name that does not change.
40366
+ */
40367
+ stable: zod.z.boolean().optional()
40368
+ });
40369
+ /**
40370
+ * `data` of a `network.tunnel.started` event — what `local-network` (which
40371
+ * tails the bus and cannot import a provider) learns about the new address.
40372
+ */
40373
+ var NetworkTunnelStartedDataSchema = zod.z.object({
40374
+ url: zod.z.string(),
40375
+ /** Mirrors {@link NetworkEndpointSchema} `stable`; absent = stable. */
40376
+ stable: zod.z.boolean().optional(),
40377
+ updated: zod.z.boolean().optional()
40234
40378
  });
40235
40379
  var NetworkAccessStatusSchema = zod.z.object({
40236
40380
  connected: zod.z.boolean(),
@@ -54215,7 +54359,20 @@ var SsoBridgeClaimsSchema = zod.z.object({
54215
54359
  * request to present the matching cookie — a login bridge is useless in
54216
54360
  * any other browser.
54217
54361
  */
54218
- browserBinding: zod.z.string().optional()
54362
+ browserBinding: zod.z.string().optional(),
54363
+ /**
54364
+ * The native app that started this sign-in (D858): its PKCE challenge,
54365
+ * `state`, purpose and allow-listed return URL, copied from the server-side
54366
+ * pending OIDC state. A bridge carrying it is finished ONLY at
54367
+ * `/api/auth/sso/finish-app` (which mints a handoff code, never a web
54368
+ * session); `/api/auth/sso/finish` refuses it.
54369
+ */
54370
+ app: zod.z.object({
54371
+ codeChallenge: zod.z.string(),
54372
+ state: zod.z.string(),
54373
+ purpose: zod.z.enum(["new-session", "step-up"]),
54374
+ redirect: zod.z.string()
54375
+ }).optional()
54219
54376
  });
54220
54377
  var ssoBridgeCapability = {
54221
54378
  name: "sso-bridge",
@@ -57585,7 +57742,12 @@ var SearchResultSchema = zod.z.object({
57585
57742
  publishedAt: zod.z.string(),
57586
57743
  author: zod.z.string(),
57587
57744
  installed: zod.z.boolean(),
57588
- installedVersion: zod.z.string().optional()
57745
+ installedVersion: zod.z.string().optional(),
57746
+ /**
57747
+ * Capability names the package's addons declare (from its published
57748
+ * manifest). `null` = the registry lookup failed — unknown, never `[]` (D393).
57749
+ */
57750
+ capabilities: zod.z.array(zod.z.string()).readonly().nullable()
57589
57751
  });
57590
57752
  var AutoUpdateSettingsSchema = zod.z.object({
57591
57753
  channel: ChannelSchema,
@@ -57804,7 +57966,11 @@ var addonsCapability = {
57804
57966
  kind: "mutation",
57805
57967
  auth: "admin"
57806
57968
  }),
57807
- searchAvailable: require_sleep.method(zod.z.object({ query: zod.z.string().optional() }), zod.z.array(SearchResultSchema)),
57969
+ searchAvailable: require_sleep.method(zod.z.object({
57970
+ query: zod.z.string().optional(),
57971
+ /** Only packages whose addons declare this capability (unknown ones excluded). */
57972
+ capability: zod.z.string().optional()
57973
+ }), zod.z.array(SearchResultSchema)),
57808
57974
  /**
57809
57975
  * Available package updates for a node. `nodeId` omitted (or
57810
57976
  * `'hub'`) checks the hub's own installed packages; an agent
@@ -62077,7 +62243,13 @@ var ConnectionEndpointSchema = zod.z.object({
62077
62243
  * calls so the client can sort even if the cap returns a new
62078
62244
  * ordering between polls.
62079
62245
  */
62080
- priority: zod.z.number()
62246
+ priority: zod.z.number(),
62247
+ /**
62248
+ * `false` = the address changes on its own (a Quick tunnel, re-issued on
62249
+ * every respawn). Automatic role resolution skips it (D860); an explicit
62250
+ * operator flag still honours it. Absent = stable.
62251
+ */
62252
+ stable: zod.z.boolean().optional()
62081
62253
  });
62082
62254
  /**
62083
62255
  * Where the advertised local port came from. Ordered most → least
@@ -100400,6 +100572,9 @@ exports.APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT = APPEARANCE_RESOLVES_AMBIGUITY_DE
100400
100572
  exports.APPLE_SA_TO_MACRO = APPLE_SA_TO_MACRO;
100401
100573
  exports.APP_AUTH_CALLBACK_MAX_LENGTH = APP_AUTH_CALLBACK_MAX_LENGTH;
100402
100574
  exports.APP_AUTH_CALLBACK_URLS = APP_AUTH_CALLBACK_URLS;
100575
+ exports.APP_FLOW_DEFAULT_REDIRECT = APP_FLOW_DEFAULT_REDIRECT;
100576
+ exports.APP_FLOW_REFUSAL_MESSAGES = APP_FLOW_REFUSAL_MESSAGES;
100577
+ exports.APP_FLOW_STATE_PREFIX = APP_FLOW_STATE_PREFIX;
100403
100578
  exports.ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT = ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT;
100404
100579
  exports.AUDIO_ANALYSIS_CAP_NAME = AUDIO_ANALYSIS_CAP_NAME;
100405
100580
  exports.AUDIO_BACKEND_CHOICES = AUDIO_BACKEND_CHOICES;
@@ -100447,6 +100622,8 @@ exports.AmbientLightSensorStatusSchema = AmbientLightSensorStatusSchema;
100447
100622
  exports.AnalyticsLtsSeriesSchema = AnalyticsLtsSeriesSchema;
100448
100623
  exports.ApiKeyRecordSchema = ApiKeyRecordSchema;
100449
100624
  exports.ApiKeySummarySchema = ApiKeySummarySchema;
100625
+ exports.AppFlowPurposeSchema = AppFlowPurposeSchema;
100626
+ exports.AppLoginPathSchema = AppLoginPathSchema;
100450
100627
  exports.AppleFmAvailabilitySchema = AppleFmAvailabilitySchema;
100451
100628
  exports.AppleFmUnavailableReasonSchema = AppleFmUnavailableReasonSchema;
100452
100629
  exports.ArchiveEntrySchema = ArchiveEntrySchema;
@@ -101512,6 +101689,7 @@ exports.NetworkAccessStatusSchema = NetworkAccessStatusSchema;
101512
101689
  exports.NetworkAddressSchema = NetworkAddressSchema;
101513
101690
  exports.NetworkEndpointSchema = NetworkEndpointSchema;
101514
101691
  exports.NetworkLinkStatusSchema = NetworkLinkStatusSchema;
101692
+ exports.NetworkTunnelStartedDataSchema = NetworkTunnelStartedDataSchema;
101515
101693
  exports.NodeBenchCellSchema = NodeBenchCellSchema;
101516
101694
  exports.NodeBenchClipSchema = NodeBenchClipSchema;
101517
101695
  exports.NodeBenchDeviceCellSchema = NodeBenchDeviceCellSchema;
@@ -102160,6 +102338,7 @@ exports.actionsForDevice = actionsForDevice;
102160
102338
  exports.actionsForDeviceType = actionsForDeviceType;
102161
102339
  exports.actionsForDevices = actionsForDevices;
102162
102340
  exports.activateAlarmProfile = activateAlarmProfile;
102341
+ exports.addonCatalogHref = addonCatalogHref;
102163
102342
  exports.addonPagesCapability = addonPagesCapability;
102164
102343
  exports.addonPagesSourceCapability = addonPagesSourceCapability;
102165
102344
  exports.addonRoutesCapability = addonRoutesCapability;
@@ -102179,6 +102358,7 @@ exports.alertsCapability = alertsCapability;
102179
102358
  exports.allDoActions = allDoActions;
102180
102359
  exports.allowedSuppliedEffect = allowedSuppliedEffect;
102181
102360
  exports.ambientLightSensorCapability = ambientLightSensorCapability;
102361
+ exports.appFlowLocation = appFlowLocation;
102182
102362
  exports.applyBlockingEdit = applyBlockingEdit;
102183
102363
  exports.applyModeDelaysEdits = applyModeDelaysEdits;
102184
102364
  exports.applyModeDeviceListEdit = applyModeDeviceListEdit;
@@ -102679,6 +102859,7 @@ exports.overlayClusterStepSettings = overlayClusterStepSettings;
102679
102859
  exports.packagePickerItems = packagePickerItems;
102680
102860
  exports.parseAdminBase = parseAdminBase;
102681
102861
  exports.parseAppAuthCallback = parseAppAuthCallback;
102862
+ exports.parseAppFlowRequest = parseAppFlowRequest;
102682
102863
  exports.parseCameraStreamConfig = parseCameraStreamConfig;
102683
102864
  exports.parseDeviceEnrollmentLink = parseDeviceEnrollmentLink;
102684
102865
  exports.parseExpression = require_composition.parseExpression;