@agent-native/core 0.192.0-nightly-20260926081002 → 0.192.0

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 (139) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/CHANGELOG.md +17 -0
  3. package/corpus/templates/analytics/actions/get-sql-dashboard.ts +27 -3
  4. package/corpus/templates/analytics/app/components/AnalyticsReviewArtifactPreview.tsx +8 -2
  5. package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +14 -10
  6. package/corpus/templates/analytics/app/root.tsx +2 -4
  7. package/corpus/templates/analytics/app/routes/_index.tsx +1 -36
  8. package/corpus/templates/analytics/app/routes/home.tsx +1 -1
  9. package/corpus/templates/analytics/changelog/2026-09-25-human-review-previews-show-same-organization-dashboard-chart.md +6 -0
  10. package/corpus/templates/analytics/changelog/2026-09-25-human-review-skips-saved-bigquery-queries-in-previews.md +6 -0
  11. package/corpus/templates/analytics/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
  12. package/corpus/templates/analytics/server/lib/dashboards-store.ts +14 -0
  13. package/corpus/templates/analytics/server/plugins/auth.ts +0 -3
  14. package/corpus/templates/assets/CHANGELOG.md +16 -0
  15. package/corpus/templates/assets/app/root.tsx +2 -7
  16. package/corpus/templates/assets/app/routes/_index.tsx +1 -36
  17. package/corpus/templates/assets/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
  18. package/corpus/templates/assets/server/plugins/auth.ts +0 -3
  19. package/corpus/templates/brain/app/root.tsx +2 -13
  20. package/corpus/templates/brain/app/routes/_index.tsx +1 -35
  21. package/corpus/templates/brain/app/routes/home.tsx +1 -1
  22. package/corpus/templates/calendar/CHANGELOG.md +15 -0
  23. package/corpus/templates/calendar/app/root.tsx +2 -10
  24. package/corpus/templates/calendar/app/routes/_index.tsx +1 -34
  25. package/corpus/templates/calendar/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
  26. package/corpus/templates/calendar/server/plugins/auth.ts +0 -3
  27. package/corpus/templates/chat/AGENTS.md +3 -3
  28. package/corpus/templates/chat/app/root.tsx +3 -15
  29. package/corpus/templates/chat/app/routes/_index.tsx +1 -37
  30. package/corpus/templates/chat/server/plugins/auth.ts +0 -3
  31. package/corpus/templates/clips/CHANGELOG.md +10 -0
  32. package/corpus/templates/clips/app/root.tsx +2 -10
  33. package/corpus/templates/clips/app/routes/_index.tsx +1 -33
  34. package/corpus/templates/clips/app/routes/share.$shareId.tsx +2 -3
  35. package/corpus/templates/clips/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
  36. package/corpus/templates/clips/server/plugins/auth.ts +0 -3
  37. package/corpus/templates/content/app/root.tsx +2 -3
  38. package/corpus/templates/content/app/routes/_index.tsx +1 -33
  39. package/corpus/templates/content/server/plugins/auth.ts +0 -3
  40. package/corpus/templates/crm/app/root.tsx +3 -16
  41. package/corpus/templates/crm/app/routes/_index.tsx +1 -36
  42. package/corpus/templates/crm/app/routes/home.tsx +1 -1
  43. package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +30 -17
  44. package/corpus/templates/design/CHANGELOG.md +31 -0
  45. package/corpus/templates/design/actions/connect-localhost.ts +98 -37
  46. package/corpus/templates/design/actions/get-design.schema.ts +10 -0
  47. package/corpus/templates/design/actions/get-design.ts +25 -6
  48. package/corpus/templates/design/actions/publish-visual-edit-pending.ts +4 -59
  49. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +108 -49
  50. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +63 -21
  51. package/corpus/templates/design/app/components/design/types.ts +2 -0
  52. package/corpus/templates/design/app/pages/design-editor/commands/cross-screen-element-drop.ts +98 -9
  53. package/corpus/templates/design/app/pages/design-editor/commands/cross-screen-insert-timeout.ts +61 -6
  54. package/corpus/templates/design/app/pages/design-editor/commands/mode-change.ts +6 -5
  55. package/corpus/templates/design/app/pages/design-editor/commands/publish-visual-edit-pending.ts +21 -3
  56. package/corpus/templates/design/app/pages/design-editor/pending-edits.ts +4 -7
  57. package/corpus/templates/design/app/root.tsx +2 -20
  58. package/corpus/templates/design/app/routes/_index.tsx +1 -34
  59. package/corpus/templates/design/changelog/2026-09-25-fix-live-visual-edit-recovery-handoff-and-interaction-workfl.md +6 -0
  60. package/corpus/templates/design/changelog/2026-09-25-human-review-previews-show-the-actual-design-when-you-have-o.md +6 -0
  61. package/corpus/templates/design/changelog/2026-09-25-live-screens-recover-safely-from-interrupted-cross-screen-mo.md +6 -0
  62. package/corpus/templates/design/changelog/2026-09-26-canvas-focus-stays-on-toolbar-controls-when-a-live-preview-f.md +6 -0
  63. package/corpus/templates/design/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
  64. package/corpus/templates/design/server/plugins/auth.ts +0 -3
  65. package/corpus/templates/dispatch/app/root.tsx +2 -11
  66. package/corpus/templates/dispatch/app/routes/_index.tsx +1 -34
  67. package/corpus/templates/dispatch/server/plugins/setup-dispatch.ts +0 -3
  68. package/corpus/templates/factory/app/root.tsx +3 -15
  69. package/corpus/templates/factory/app/routes/_index.tsx +1 -34
  70. package/corpus/templates/factory/app/routes/home.tsx +1 -1
  71. package/corpus/templates/forms/AGENTS.md +1 -1
  72. package/corpus/templates/forms/app/root.tsx +2 -4
  73. package/corpus/templates/forms/app/routes/_index.tsx +1 -34
  74. package/corpus/templates/forms/server/plugins/auth.ts +0 -3
  75. package/corpus/templates/mail/CHANGELOG.md +8 -0
  76. package/corpus/templates/mail/app/root.tsx +2 -6
  77. package/corpus/templates/mail/app/routes/_index.tsx +1 -36
  78. package/corpus/templates/mail/app/routes/home.tsx +1 -1
  79. package/corpus/templates/mail/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
  80. package/corpus/templates/mail/server/plugins/auth.ts +0 -3
  81. package/corpus/templates/plan/app/root.tsx +7 -13
  82. package/corpus/templates/plan/app/routes/_index.tsx +1 -35
  83. package/corpus/templates/plan/app/routes/home.tsx +1 -1
  84. package/corpus/templates/plan/server/plugins/auth.ts +0 -3
  85. package/corpus/templates/slides/CHANGELOG.md +21 -0
  86. package/corpus/templates/slides/actions/get-deck.ts +49 -12
  87. package/corpus/templates/slides/app/root.tsx +1 -3
  88. package/corpus/templates/slides/app/routes/_index.tsx +1 -36
  89. package/corpus/templates/slides/app/routes/home.tsx +1 -1
  90. package/corpus/templates/slides/changelog/2026-09-25-human-review-previews-show-same-organization-slides-for-orga.md +6 -0
  91. package/corpus/templates/slides/changelog/2026-09-26-the-app-entry-now-opens-the-shared-sign-in-and-sign-up-scree.md +6 -0
  92. package/corpus/templates/slides/server/plugins/auth.ts +0 -3
  93. package/corpus/templates/tasks/AGENTS.md +1 -1
  94. package/corpus/templates/tasks/README.md +1 -1
  95. package/corpus/templates/tasks/app/root.tsx +2 -11
  96. package/corpus/templates/tasks/app/routes/_index.tsx +1 -37
  97. package/corpus/templates/tasks/app/routes/home.tsx +1 -1
  98. package/dist/cli/design-connect.d.ts +1 -0
  99. package/dist/cli/design-connect.js +94 -32
  100. package/dist/client/auth/AuthPage.d.ts +1 -17
  101. package/dist/client/auth/AuthPage.js +7 -49
  102. package/dist/client/observability/OutputPreview.js +8 -2
  103. package/dist/client/sign-in-landing.d.ts +1 -0
  104. package/dist/client/sign-in-landing.js +8 -0
  105. package/dist/collab/awareness.d.ts +2 -2
  106. package/dist/deploy/workspace-deploy.js +32 -8
  107. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  108. package/dist/provider-api/actions/custom-provider-registration.d.ts +7 -7
  109. package/dist/provider-api/actions/provider-api.d.ts +3 -3
  110. package/dist/server/auth-marketing.d.ts +0 -7
  111. package/dist/server/auth-marketing.js +0 -36
  112. package/dist/server/auth.d.ts +1 -10
  113. package/dist/server/index.d.ts +1 -1
  114. package/dist/server/index.js +1 -1
  115. package/dist/server/onboarding-html.d.ts +1 -12
  116. package/dist/server/onboarding-html.js +4 -817
  117. package/dist/shared/ssr-auth-redirect.d.ts +3 -3
  118. package/dist/shared/ssr-auth-redirect.js +4 -4
  119. package/dist/templates/chat/AGENTS.md +3 -3
  120. package/dist/templates/chat/app/root.tsx +3 -15
  121. package/dist/templates/chat/app/routes/_index.tsx +1 -37
  122. package/dist/templates/chat/server/plugins/auth.ts +0 -3
  123. package/dist/templates/default/AGENTS.md +2 -4
  124. package/dist/templates/default/DEVELOPING.md +3 -5
  125. package/dist/templates/default/app/root.tsx +2 -9
  126. package/dist/templates/default/app/routes/_index.tsx +8 -15
  127. package/package.json +5 -4
  128. package/src/templates/chat/AGENTS.md +3 -3
  129. package/src/templates/chat/app/root.tsx +3 -15
  130. package/src/templates/chat/app/routes/_index.tsx +1 -37
  131. package/src/templates/chat/server/plugins/auth.ts +0 -3
  132. package/src/templates/default/AGENTS.md +2 -4
  133. package/src/templates/default/DEVELOPING.md +3 -5
  134. package/src/templates/default/app/root.tsx +2 -9
  135. package/src/templates/default/app/routes/_index.tsx +8 -15
  136. package/dist/server/auth-marketing-locales.d.ts +0 -9
  137. package/dist/server/auth-marketing-locales.js +0 -1322
  138. package/dist/templates/chat/public/auth-marketing/chat.webp +0 -0
  139. package/src/templates/chat/public/auth-marketing/chat.webp +0 -0
@@ -70,7 +70,7 @@ async function persistBridgeToken(rootPath, token) {
70
70
  await fs.chmod(temporaryPath, 0o600);
71
71
  await fs.rename(temporaryPath, absolutePath);
72
72
  }
73
- async function resolveBridgeToken(rootPath, configuredToken) {
73
+ async function resolveBridgeToken(rootPath, configuredToken, persist = true) {
74
74
  const persistedToken = await readPersistedBridgeToken(rootPath);
75
75
  const bridgeToken = configuredToken ||
76
76
  process.env["AGENT_NATIVE_BRIDGE_TOKEN"] ||
@@ -80,10 +80,9 @@ async function resolveBridgeToken(rootPath, configuredToken) {
80
80
  throw new Error("AGENT_NATIVE_BRIDGE_TOKEN is a localhost connection ID, not a bridge token. " +
81
81
  "Start visual-edit with the bridgeToken returned by open-visual-edit, then restart the bridge.");
82
82
  }
83
- // Keep the durable daemon restart path paired with the connection row. An
84
- // explicit token wins so the server-minted token from open-visual-edit can
85
- // replace an older local credential before the first browser registration.
86
- if (configuredToken || !persistedToken) {
83
+ // The daemon path persists only after it proves the running or newly-started
84
+ // bridge accepted this token. A rejected token must not replace recovery data.
85
+ if (persist && (configuredToken || !persistedToken)) {
87
86
  await persistBridgeToken(rootPath, bridgeToken);
88
87
  }
89
88
  return bridgeToken;
@@ -443,28 +442,39 @@ function isDesignConnectManifest(value) {
443
442
  }
444
443
  async function fetchRunningBridgeManifest(bridgeUrl, previewToken) {
445
444
  const manifestUrl = new URL("/manifest.json", bridgeUrl);
446
- if (previewToken) {
447
- manifestUrl.searchParams.set("previewToken", previewToken);
448
- }
449
445
  const controller = new AbortController();
450
446
  const timeout = setTimeout(() => controller.abort(), 800);
451
447
  try {
452
448
  const response = await fetch(manifestUrl, {
453
449
  method: "GET",
450
+ headers: { "x-design-preview-token": previewToken },
454
451
  signal: controller.signal,
455
452
  });
456
453
  if (!response.ok)
457
- return null;
454
+ return { manifest: null, status: response.status };
458
455
  const body = (await response.json());
459
- return isDesignConnectManifest(body) ? body : null;
456
+ return {
457
+ manifest: isDesignConnectManifest(body) ? body : null,
458
+ status: response.status,
459
+ };
460
460
  }
461
461
  catch {
462
- return null;
462
+ return { manifest: null, status: null };
463
463
  }
464
464
  finally {
465
465
  clearTimeout(timeout);
466
466
  }
467
467
  }
468
+ async function inspectRunningBridge(manifest, bridgeToken) {
469
+ const [manifestResult, runningFingerprint] = await Promise.all([
470
+ fetchRunningBridgeManifest(manifest.bridgeUrl, deriveDesignPreviewToken(bridgeToken)),
471
+ fetchRunningBridgeFingerprint(manifest.bridgeUrl),
472
+ ]);
473
+ return {
474
+ ...manifestResult,
475
+ fingerprintMatches: runningFingerprint === designConnectAppFingerprint(manifest),
476
+ };
477
+ }
468
478
  export function designConnectManifestsTargetSameApp(running, requested) {
469
479
  let runningUrl = running.devServerUrl;
470
480
  let requestedUrl = requested.devServerUrl;
@@ -2201,14 +2211,18 @@ export async function startDesignConnectBridge(manifest, seedOrOptions) {
2201
2211
  ? { bridgeToken: seedOrOptions }
2202
2212
  : (seedOrOptions ?? {});
2203
2213
  const configuredBridgeToken = options.bridgeToken || process.env["AGENT_NATIVE_BRIDGE_TOKEN"];
2204
- const bridgeToken = await resolveBridgeToken(manifest.rootPath, configuredBridgeToken);
2205
- const configuredPreviewToken = options.previewToken || process.env["AGENT_NATIVE_PREVIEW_TOKEN"];
2214
+ const bridgeToken = await resolveBridgeToken(manifest.rootPath, configuredBridgeToken, false);
2215
+ const configuredPreviewToken = options.previewToken;
2206
2216
  const derivedPreviewToken = deriveDesignPreviewToken(bridgeToken);
2207
2217
  if (configuredPreviewToken &&
2208
2218
  configuredPreviewToken !== derivedPreviewToken) {
2209
2219
  throw new Error("previewToken must match the deterministic token derived from bridgeToken");
2210
2220
  }
2211
- const previewToken = configuredPreviewToken || derivedPreviewToken;
2221
+ if (process.env["AGENT_NATIVE_PREVIEW_TOKEN"] &&
2222
+ process.env["AGENT_NATIVE_PREVIEW_TOKEN"] !== derivedPreviewToken) {
2223
+ console.warn("Ignoring stale AGENT_NATIVE_PREVIEW_TOKEN; the current bridge token determines the preview token.");
2224
+ }
2225
+ const previewToken = derivedPreviewToken;
2212
2226
  const configuredOrigins = new Set((options.allowedOrigins ?? []).flatMap((raw) => {
2213
2227
  try {
2214
2228
  return [new URL(raw).origin];
@@ -3197,6 +3211,15 @@ export async function startDesignConnectBridge(manifest, seedOrOptions) {
3197
3211
  resolve();
3198
3212
  });
3199
3213
  });
3214
+ if (options.persistBridgeToken !== false) {
3215
+ try {
3216
+ await persistBridgeToken(manifest.rootPath, bridgeToken);
3217
+ }
3218
+ catch (error) {
3219
+ await new Promise((resolve) => server.close(() => resolve()));
3220
+ throw error;
3221
+ }
3222
+ }
3200
3223
  return { server, manifest, bridgeToken, previewToken, bridgeInstanceId };
3201
3224
  }
3202
3225
  /**
@@ -3319,7 +3342,7 @@ Options:
3319
3342
  --preview-token <token> Adopt the paired read-only browser preview token.
3320
3343
  Optional when --bridge-token is present: compatible
3321
3344
  clients derive the same one-way token automatically.
3322
- (also reads AGENT_NATIVE_PREVIEW_TOKEN env)
3345
+ (stale AGENT_NATIVE_PREVIEW_TOKEN values are ignored)
3323
3346
  --daemon Start the bridge detached, wait for /health, then exit
3324
3347
  --json Print the manifest JSON and exit
3325
3348
  --once Prepare/scaffold the manifest and exit
@@ -3372,20 +3395,33 @@ function resolveCurrentCliInvocation(argv) {
3372
3395
  args: [...cliPrefix, "design", ...removeDaemonFlag(argv)],
3373
3396
  };
3374
3397
  }
3375
- async function startDetachedDesignBridge(argv, manifest, previewToken) {
3398
+ async function startDetachedDesignBridge(argv, manifest, bridgeToken) {
3376
3399
  if (await waitForBridgeHealth(manifest.bridgeUrl, 800)) {
3377
- const [runningManifest, runningFingerprint] = await Promise.all([
3378
- fetchRunningBridgeManifest(manifest.bridgeUrl, previewToken),
3379
- fetchRunningBridgeFingerprint(manifest.bridgeUrl),
3380
- ]);
3381
- const fingerprintMatches = runningFingerprint === designConnectAppFingerprint(manifest);
3382
- if ((runningManifest &&
3383
- designConnectManifestsTargetSameApp(runningManifest, manifest)) ||
3384
- fingerprintMatches) {
3400
+ const manifestResult = await inspectRunningBridge(manifest, bridgeToken);
3401
+ const runningManifest = manifestResult.manifest;
3402
+ const { fingerprintMatches } = manifestResult;
3403
+ if (runningManifest &&
3404
+ designConnectManifestsTargetSameApp(runningManifest, manifest)) {
3405
+ await persistBridgeToken(manifest.rootPath, bridgeToken);
3385
3406
  console.error(`Design localhost bridge already running at ${manifest.bridgeUrl}`);
3386
- console.log(JSON.stringify(runningManifest ?? manifest, null, 2));
3407
+ console.log(JSON.stringify(runningManifest, null, 2));
3387
3408
  return 0;
3388
3409
  }
3410
+ if (fingerprintMatches && !runningManifest) {
3411
+ const errorMessage = manifestResult.status === 401
3412
+ ? "A Design localhost bridge for this app is already running, but it rejected the current bridge token (HTTP 401)."
3413
+ : "A Design localhost bridge for this app is already running, but its authenticated manifest could not be verified.";
3414
+ console.error([
3415
+ errorMessage,
3416
+ ...(manifestResult.status === 401
3417
+ ? [
3418
+ "If the token changed, stop only the bridge process you started, then rerun design connect with the bridgeToken returned by open-visual-edit via --bridge-token (or AGENT_NATIVE_BRIDGE_TOKEN).",
3419
+ ]
3420
+ : ["Retry after confirming the bridge is healthy."]),
3421
+ "The existing process was left running.",
3422
+ ].join("\n"));
3423
+ return 1;
3424
+ }
3389
3425
  console.error([
3390
3426
  `Design localhost bridge already running at ${manifest.bridgeUrl} for a different app.`,
3391
3427
  runningManifest
@@ -3406,17 +3442,35 @@ async function startDetachedDesignBridge(argv, manifest, previewToken) {
3406
3442
  const child = spawn(invocation.command, invocation.args, {
3407
3443
  cwd: process.cwd(),
3408
3444
  detached: true,
3409
- env: process.env,
3445
+ env: {
3446
+ ...process.env,
3447
+ AGENT_NATIVE_BRIDGE_TOKEN: bridgeToken,
3448
+ },
3410
3449
  stdio: ["ignore", logFd.fd, logFd.fd],
3411
3450
  shell: process.platform === "win32",
3412
3451
  });
3413
3452
  child.unref();
3414
3453
  if (await waitForBridgeHealth(manifest.bridgeUrl)) {
3454
+ const running = await inspectRunningBridge(manifest, bridgeToken);
3455
+ if (running.manifest &&
3456
+ designConnectManifestsTargetSameApp(running.manifest, manifest)) {
3457
+ await persistBridgeToken(manifest.rootPath, bridgeToken);
3458
+ await logFd.close();
3459
+ console.error(`Design localhost bridge running at ${manifest.bridgeUrl}`);
3460
+ console.error(`Bridge log: ${logPath}`);
3461
+ console.log(JSON.stringify(running.manifest, null, 2));
3462
+ return 0;
3463
+ }
3415
3464
  await logFd.close();
3416
- console.error(`Design localhost bridge running at ${manifest.bridgeUrl}`);
3417
- console.error(`Bridge log: ${logPath}`);
3418
- console.log(JSON.stringify(manifest, null, 2));
3419
- return 0;
3465
+ const authenticationFailed = running.fingerprintMatches && !running.manifest;
3466
+ console.error([
3467
+ authenticationFailed
3468
+ ? `A Design localhost bridge for this app became available at ${manifest.bridgeUrl}, but it rejected this invocation's bridge token (HTTP ${running.status ?? "unknown"}).`
3469
+ : `A Design localhost bridge became available at ${manifest.bridgeUrl} for a different app or could not be verified.`,
3470
+ "No bridge token was persisted; the running process was left untouched.",
3471
+ `Bridge log: ${logPath}`,
3472
+ ].join("\n"));
3473
+ return 1;
3420
3474
  }
3421
3475
  const tail = await readDaemonLogTail(logPath);
3422
3476
  await logFd.close();
@@ -3499,11 +3553,19 @@ export async function runDesign(argv) {
3499
3553
  const manifest = await prepareDesignConnectManifest(parsed);
3500
3554
  const seedBridgeToken = parsed.bridgeToken || process.env["AGENT_NATIVE_BRIDGE_TOKEN"] || undefined;
3501
3555
  const seedPreviewToken = parsed.previewToken ||
3502
- process.env["AGENT_NATIVE_PREVIEW_TOKEN"] ||
3503
3556
  (seedBridgeToken ? deriveDesignPreviewToken(seedBridgeToken) : undefined);
3504
3557
  const appUrl = resolveAppUrl(parsed.appUrl);
3505
3558
  if (parsed.daemon) {
3506
- return startDetachedDesignBridge(argv, manifest, seedPreviewToken);
3559
+ const bridgeToken = await resolveBridgeToken(manifest.rootPath, seedBridgeToken, false);
3560
+ const derivedPreviewToken = deriveDesignPreviewToken(bridgeToken);
3561
+ if (parsed.previewToken && parsed.previewToken !== derivedPreviewToken) {
3562
+ throw new Error("previewToken must match the deterministic token derived from bridgeToken");
3563
+ }
3564
+ if (process.env["AGENT_NATIVE_PREVIEW_TOKEN"] &&
3565
+ process.env["AGENT_NATIVE_PREVIEW_TOKEN"] !== derivedPreviewToken) {
3566
+ console.warn("Ignoring stale AGENT_NATIVE_PREVIEW_TOKEN; the current bridge token determines the preview token.");
3567
+ }
3568
+ return startDetachedDesignBridge(argv, manifest, bridgeToken);
3507
3569
  }
3508
3570
  if (parsed.json || parsed.once || parsed.dryRun) {
3509
3571
  console.log(JSON.stringify(manifest, null, 2));
@@ -1,18 +1,6 @@
1
1
  /** @jsxRuntime classic */
2
2
  import * as React from "react";
3
3
  export type AuthView = "signup" | "login" | "forgot" | "twoFactor" | "verification" | "magicLink" | "magicLinkSent" | "googleOnly";
4
- export interface AuthMarketingProps {
5
- appName: string;
6
- tagline?: string;
7
- description?: string;
8
- features?: string[];
9
- authHeadline?: string;
10
- authDescription?: string;
11
- screenshotSrc?: string;
12
- screenshotWidth?: number;
13
- screenshotHeight?: number;
14
- learnMoreUrl?: string;
15
- }
16
4
  export interface AuthLocaleOption {
17
5
  value: string;
18
6
  label: string;
@@ -43,11 +31,7 @@ export interface AuthPageProps {
43
31
  dir?: string;
44
32
  }>;
45
33
  localeOptions: AuthLocaleOption[];
46
- marketing?: AuthMarketingProps;
47
- marketingLocales: Record<string, AuthMarketingProps>;
48
- brandMarkSrc: string;
49
- brandMarkLightSrc?: string;
50
- githubUrl: string;
34
+ appName?: string;
51
35
  showGoogle: boolean;
52
36
  /** Show the organization SSO email-to-provider entry point. */
53
37
  organizationSsoEnabled?: boolean;
@@ -1,10 +1,8 @@
1
1
  /** @jsxRuntime classic */
2
- import { MarketingHome } from "@agent-native/toolkit/marketing";
3
2
  import { AuthForm } from "@agent-native/toolkit/onboarding";
4
3
  import * as React from "react";
5
4
  import { normalizeLocaleCode } from "../../localization/shared.js";
6
5
  import { canonicalTrackingEvent } from "../../shared/analytics-events.js";
7
- import { getAppStatus } from "../../shared/app-status.js";
8
6
  import { AUTH_SIGNUP_INVITE_ONLY_CODE } from "../../shared/auth-copy.js";
9
7
  import { toPublicFrameworkPath } from "../../shared/framework-route-prefix.js";
10
8
  import { isQaTestEmail } from "../../shared/qa-test-email.js";
@@ -12,7 +10,6 @@ import { signInJourney, } from "../../shared/sign-in-journey.js";
12
10
  import { isSyntheticTrafficValue } from "../../shared/test-traffic.js";
13
11
  import { frameworkRoutePrefix } from "../api-path.js";
14
12
  import { openOAuthPopup } from "../oauth-popup.js";
15
- import { OceanBackground } from "../ocean/OceanBackground.js";
16
13
  const EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
17
14
  const TAB_STORAGE_KEY = "an.onboarding.tab";
18
15
  const PENDING_SIGNUP_EMAIL_STORAGE_KEY = "an.onboarding.pendingSignupEmail";
@@ -483,7 +480,7 @@ export function shouldStartWithLocalDev(pathname, search) {
483
480
  !path.endsWith("/sign-in"));
484
481
  }
485
482
  export function AuthPage(props) {
486
- const { authMode, googleOnly, initialPrompt, appBasePath, homePath, initialResumeHref, workspaceRuntime, trackingApp, defaultLocale, localeStorageKey, locales, localeMetadata, localeOptions, marketing, marketingLocales, brandMarkSrc, brandMarkLightSrc, githubUrl, showGoogle, organizationSsoEnabled = false, googleViaIdentitySso = false, signupLegalNotice, signupLocalModeNote, docsAuthUrl, identitySsoEnabled = false, identitySsoAuto = false, publicOAuthOrigin, workspaceGatewayReturnOrigin, googleAuthMode, builderPreviewLocalDevEnabled, } = props;
483
+ const { authMode, googleOnly, appBasePath, homePath, initialResumeHref, workspaceRuntime, trackingApp, defaultLocale, localeStorageKey, locales, localeMetadata, localeOptions, appName, showGoogle, organizationSsoEnabled = false, googleViaIdentitySso = false, signupLegalNotice, signupLocalModeNote, docsAuthUrl, identitySsoEnabled = false, identitySsoAuto = false, publicOAuthOrigin, workspaceGatewayReturnOrigin, googleAuthMode, builderPreviewLocalDevEnabled, } = props;
487
484
  const [localePreference, setLocalePreference] = React.useState("system");
488
485
  const [locale, setLocale] = React.useState(defaultLocale);
489
486
  const [browserLocationReady, setBrowserLocationReady] = React.useState(false);
@@ -629,14 +626,14 @@ export function AuthPage(props) {
629
626
  };
630
627
  }, []);
631
628
  React.useEffect(() => {
632
- const nextTitle = marketing?.appName
633
- ? `${marketing.appName} — ${t("pageTitleSignIn")}`
629
+ const nextTitle = appName
630
+ ? `${appName} — ${t("pageTitleSignIn")}`
634
631
  : t("pageTitleWelcome");
635
632
  document.title = nextTitle;
636
633
  document.documentElement.lang = locale;
637
634
  document.documentElement.dir = localeMetadata[locale]?.dir || "ltr";
638
635
  document.documentElement.dataset.locale = locale;
639
- }, [locale, localeMetadata, marketing?.appName, t]);
636
+ }, [appName, locale, localeMetadata, t]);
640
637
  React.useEffect(() => {
641
638
  if (googleOnly)
642
639
  return;
@@ -1885,16 +1882,6 @@ export function AuthPage(props) {
1885
1882
  }
1886
1883
  }, [signupLocalModeNote]);
1887
1884
  const keys = headingKeys(view);
1888
- const marketingCopy = marketing
1889
- ? { ...marketing, ...(marketingLocales[locale] ?? {}) }
1890
- : undefined;
1891
- const marketingAppName = marketingCopy?.appName.replace(/^Agent-Native\s+/i, "") ?? "";
1892
- const marketingStatus = getAppStatus(trackingApp || marketingAppName);
1893
- const usesMarketingWelcome = !!marketingCopy &&
1894
- (view === "signup" ||
1895
- view === "login" ||
1896
- view === "magicLink" ||
1897
- view === "googleOnly");
1898
1885
  const cardClassName = [
1899
1886
  "card",
1900
1887
  view === "verification" ? "verifying" : "",
@@ -1972,12 +1959,8 @@ export function AuthPage(props) {
1972
1959
  legalNote,
1973
1960
  localModeNote), messageId: "s-msg", messageClassName: `msg ${messages.signup ? `${messages.signup.kind} show` : ""}`, message: messages.signup?.text }));
1974
1961
  const authCard = (React.createElement("div", { className: cardClassName },
1975
- React.createElement("h1", { id: "heading", "data-i18n": usesMarketingWelcome ? "welcomeToApp" : keys.heading, "data-auth-marketing-title": usesMarketingWelcome ? "true" : undefined }, usesMarketingWelcome
1976
- ? t("welcomeToApp").replace("{appName}", marketingAppName)
1977
- : t(keys.heading)),
1978
- React.createElement("p", { id: "subtitle", className: "subtitle", "data-i18n": usesMarketingWelcome ? undefined : keys.subtitle, "data-auth-marketing-subtitle": usesMarketingWelcome ? "true" : undefined, hidden: usesMarketingWelcome
1979
- ? false
1980
- : shouldHideAuthSubtitle(view, localDevAvailable) }, usesMarketingWelcome ? t("welcomeSubtitle") : t(keys.subtitle)),
1962
+ React.createElement("h1", { id: "heading", "data-i18n": keys.heading }, t(keys.heading)),
1963
+ React.createElement("p", { id: "subtitle", className: "subtitle", "data-i18n": keys.subtitle, hidden: shouldHideAuthSubtitle(view, localDevAvailable) }, t(keys.subtitle)),
1981
1964
  React.createElement("p", { className: `upgrade-note ${upgradeVisible ? "show" : ""}`, id: "upgrade-note", "data-upgrade-copy": t("upgradeCopy"), "data-i18n-data-upgrade-copy": "upgradeCopy" }, upgradeVisible ? t("upgradeCopy") : null),
1982
1965
  identitySsoEnabled && !googleOnly ? (React.createElement("div", { className: "identity-sso-entry", id: "identity-sso-entry" },
1983
1966
  React.createElement("a", { className: "btn-primary btn-identity-sso", id: "identity-sso-btn", href: identityLoginHref, "aria-describedby": "identity-sso-hint", "data-i18n": "continueWithAgentNative" }, t("continueWithAgentNative")),
@@ -2131,32 +2114,7 @@ export function AuthPage(props) {
2131
2114
  localeOptions.map((option) => (React.createElement("button", { type: "button", className: "locale-menu-item", role: "menuitemradio", "aria-checked": localePreference === option.value, "data-locale-value": option.value, key: option.value, onClick: () => selectLocale(option.value) },
2132
2115
  React.createElement("span", { className: "locale-menu-check", "aria-hidden": "true" }, "\u2713"),
2133
2116
  React.createElement("span", null, option.label)))))));
2134
- const marketingContent = marketingCopy ? (React.createElement("div", { className: "marketing-content" },
2135
- React.createElement("h2", { className: "app-name" },
2136
- React.createElement("picture", null,
2137
- brandMarkLightSrc ? (React.createElement("source", { media: "(prefers-color-scheme: light)", srcSet: brandMarkLightSrc })) : null,
2138
- React.createElement("img", { className: "brand-mark", src: brandMarkSrc, alt: "", "aria-hidden": "true" })),
2139
- React.createElement("span", { className: "app-name-label" }, marketingAppName),
2140
- React.createElement("span", { className: "app-status-badge" }, marketingStatus)),
2141
- React.createElement("div", { className: "marketing-copy" },
2142
- React.createElement("p", { className: "auth-marketing-headline", "data-marketing-field": "headline" }, marketingCopy.authHeadline ?? marketingCopy.tagline),
2143
- (marketingCopy.authDescription ?? marketingCopy.description) ||
2144
- marketingCopy.learnMoreUrl ? (React.createElement("p", { className: "auth-marketing-description", "data-marketing-field": "description" },
2145
- marketingCopy.authDescription ?? marketingCopy.description,
2146
- marketingCopy.learnMoreUrl ? (React.createElement(React.Fragment, null,
2147
- " ",
2148
- React.createElement("a", { className: "auth-marketing-description-link", href: marketingCopy.learnMoreUrl, target: "_blank", rel: "noreferrer" }, t("learnMore")))) : null)) : null,
2149
- React.createElement("div", { className: "marketing-actions" },
2150
- React.createElement("a", { className: "oss-badge", href: githubUrl, target: "_blank", rel: "noreferrer" },
2151
- React.createElement("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", width: 16, height: 16, fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round" },
2152
- React.createElement("path", { d: "M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5" })),
2153
- React.createElement("span", { "data-i18n": "openSource" }, t("openSource"))))))) : null;
2154
- const marketingSurface = marketingCopy ? (React.createElement(MarketingHome, { appName: marketingAppName, variant: "auth", background: null, auth: authCard, className: "auth-marketing-home" },
2155
- React.createElement("div", { className: "auth-marketing-visual" },
2156
- React.createElement("div", { className: "auth-marketing-screenshot-wrap" },
2157
- React.createElement(OceanBackground, { className: "auth-marketing-screenshot" })),
2158
- marketingContent))) : (React.createElement("div", { className: "auth-centered" }, authCard));
2159
2117
  return (React.createElement(React.Fragment, null,
2160
2118
  localePicker,
2161
- initialPrompt ? (React.createElement("div", { className: "auth-centered" }, authCard)) : (marketingSurface)));
2119
+ React.createElement("div", { className: "auth-centered" }, authCard)));
2162
2120
  }
@@ -59,7 +59,11 @@ function ReviewPreviewFrame({ url, artifactAppId, artifactId, previewLabel, comp
59
59
  const [safePreview, setSafePreview] = useState();
60
60
  const [rejectedPreviewSource, setRejectedPreviewSource] = useState();
61
61
  const [selectedSlideId, setSelectedSlideId] = useState(null);
62
- const designQuery = useActionQuery("get-design", { id: artifactId ?? "", includeFileContent: false }, {
62
+ const designQuery = useActionQuery("get-design", {
63
+ id: artifactId ?? "",
64
+ includeFileContent: false,
65
+ reviewPreview: true,
66
+ }, {
63
67
  enabled: mounted && artifactAppId === "design" && Boolean(artifactId),
64
68
  staleTime: 5 * 60_000,
65
69
  });
@@ -77,13 +81,14 @@ function ReviewPreviewFrame({ url, artifactAppId, artifactId, previewLabel, comp
77
81
  id: artifactId ?? "",
78
82
  fileId: designFileId ?? "",
79
83
  includeFileContent: true,
84
+ reviewPreview: true,
80
85
  }, {
81
86
  enabled: mounted &&
82
87
  artifactAppId === "design" &&
83
88
  Boolean(artifactId && designFileId),
84
89
  staleTime: 5 * 60_000,
85
90
  });
86
- const deckQuery = useActionQuery("get-deck", { id: artifactId ?? "", compact: "true" }, {
91
+ const deckQuery = useActionQuery("get-deck", { id: artifactId ?? "", compact: "true", reviewPreview: true }, {
87
92
  enabled: mounted && artifactAppId === "slides" && Boolean(artifactId),
88
93
  staleTime: 5 * 60_000,
89
94
  });
@@ -104,6 +109,7 @@ function ReviewPreviewFrame({ url, artifactAppId, artifactId, previewLabel, comp
104
109
  id: artifactId ?? "",
105
110
  slideId: activeSlideId ?? "",
106
111
  compact: "false",
112
+ reviewPreview: true,
107
113
  }, {
108
114
  enabled: mounted && artifactAppId === "slides" && Boolean(activeSlideId),
109
115
  staleTime: 5 * 60_000,
@@ -0,0 +1 @@
1
+ export declare function signInLandingLoader(homePath?: string): Response | null;
@@ -0,0 +1,8 @@
1
+ import { redirectDocument } from "react-router";
2
+ import { SIGN_IN_ENTRY_PATH } from "../shared/sign-in-journey.js";
3
+ import { appPath } from "./api-path.js";
4
+ export function signInLandingLoader(homePath) {
5
+ if (homePath === "/")
6
+ return null;
7
+ return redirectDocument(appPath(SIGN_IN_ENTRY_PATH));
8
+ }
@@ -62,11 +62,11 @@ export declare const postAwareness: import("h3").EventHandlerWithFetch<import("h
62
62
  error: string;
63
63
  states?: undefined;
64
64
  } | {
65
+ error?: undefined;
65
66
  states: {
66
67
  clientId: number;
67
68
  state: string;
68
69
  }[];
69
- error?: undefined;
70
70
  }>>;
71
71
  /**
72
72
  * GET /_agent-native/collab/:docId/users
@@ -77,9 +77,9 @@ export declare const getActiveUsers: import("h3").EventHandlerWithFetch<import("
77
77
  error: string;
78
78
  users?: undefined;
79
79
  } | {
80
+ error?: undefined;
80
81
  users: {
81
82
  clientId: number;
82
83
  lastSeen: number;
83
84
  }[];
84
- error?: undefined;
85
85
  }>>;
@@ -67,6 +67,7 @@ const NETLIFY_PUBLIC_ASSET_EXTENSIONS = new Set([
67
67
  const WORKSPACE_APPS_ENV_KEY = "AGENT_NATIVE_WORKSPACE_APPS_JSON";
68
68
  const WORKSPACE_APPS_MANIFEST_DIR = ".agent-native";
69
69
  const WORKSPACE_APPS_MANIFEST_FILE = "workspace-apps.json";
70
+ const WORKSPACE_ROOT_GOOGLE_CALLBACK_PATH = "/_agent-native/google/callback";
70
71
  const VERCEL_OUTPUT_DIR = ".vercel/output";
71
72
  const WORKSPACE_DIRECTORY_ENV_SNIPPET = `
72
73
  const directoryOrigin =
@@ -135,11 +136,11 @@ export async function runWorkspaceDeploy(opts = {}) {
135
136
  writeWorkspaceDirectoryPage(preset === "vercel" ? path.join(vercelOutputDir, "static") : distDir, workspaceApps);
136
137
  }
137
138
  if (preset === "netlify") {
138
- writeNetlifyRedirects(distDir, apps, workspaceRootPage);
139
+ writeNetlifyRedirects(distDir, apps, workspaceApps, workspaceRootPage);
139
140
  writeNetlifyHeaders(distDir, apps);
140
141
  }
141
142
  else {
142
- writeVercelBuildConfig(vercelOutputDir, apps, workspaceRootPage);
143
+ writeVercelBuildConfig(vercelOutputDir, apps, workspaceApps, workspaceRootPage);
143
144
  }
144
145
  if (buildOnly) {
145
146
  const outputDir = preset === "vercel" ? vercelOutputDir : distDir;
@@ -292,7 +293,10 @@ function workspaceOAuthDiscoveryRoutes(app) {
292
293
  },
293
294
  ];
294
295
  }
295
- function writeNetlifyRedirects(distDir, apps, rootPage) {
296
+ function workspaceOAuthCallbackApp(workspaceApps) {
297
+ return (workspaceApps.find((entry) => entry.isDispatch)?.id ?? workspaceApps[0]?.id);
298
+ }
299
+ function writeNetlifyRedirects(distDir, apps, workspaceApps, rootPage) {
296
300
  const lines = [
297
301
  "# Generated by agent-native deploy --preset netlify",
298
302
  "# Static app assets are stored under a safe namespace; dynamic app routes are handled by function route config.",
@@ -327,8 +331,14 @@ function writeNetlifyRedirects(distDir, apps, rootPage) {
327
331
  }
328
332
  lines.push("/apps/* /dispatch/apps/:splat 302");
329
333
  }
330
- else if (rootPage !== "directory") {
331
- lines.push(`/ /${apps[0]}/ 302`);
334
+ else {
335
+ const callbackApp = workspaceOAuthCallbackApp(workspaceApps);
336
+ if (callbackApp) {
337
+ lines.push(`${WORKSPACE_ROOT_GOOGLE_CALLBACK_PATH} /.netlify/functions/${callbackApp}-server 200`);
338
+ }
339
+ if (rootPage !== "directory") {
340
+ lines.push(`/ /${apps[0]}/ 302`);
341
+ }
332
342
  }
333
343
  fs.writeFileSync(path.join(distDir, "_redirects"), lines.join("\n") + "\n");
334
344
  }
@@ -350,7 +360,7 @@ function netlifyHeaderBlock(pathname) {
350
360
  ...Object.entries(IMMUTABLE_ASSET_CACHE_HEADERS).map(([name, value]) => ` ${name}: ${value}`),
351
361
  ].join("\n");
352
362
  }
353
- function writeVercelBuildConfig(outputDir, apps, rootPage) {
363
+ function writeVercelBuildConfig(outputDir, apps, workspaceApps, rootPage) {
354
364
  const routes = [
355
365
  ...vercelImmutableAssetHeaderRoutes(outputDir, apps),
356
366
  { handle: "filesystem" },
@@ -379,8 +389,17 @@ function writeVercelBuildConfig(outputDir, apps, rootPage) {
379
389
  }
380
390
  routes.push(vercelRedirect("/apps/(.*)", "/dispatch/apps/$1"));
381
391
  }
382
- else if (rootPage !== "directory") {
383
- routes.push(vercelRedirect("/", `/${apps[0]}/`));
392
+ else {
393
+ const callbackApp = workspaceOAuthCallbackApp(workspaceApps);
394
+ if (callbackApp) {
395
+ routes.push({
396
+ src: vercelRouteSrc(WORKSPACE_ROOT_GOOGLE_CALLBACK_PATH),
397
+ dest: `/${callbackApp}-server`,
398
+ });
399
+ }
400
+ if (rootPage !== "directory") {
401
+ routes.push(vercelRedirect("/", `/${apps[0]}/`));
402
+ }
384
403
  }
385
404
  for (const app of apps) {
386
405
  if (app !== "dispatch") {
@@ -862,6 +881,10 @@ function patchNetlifyFunctionEntry(functionDir, app, workspaceApps, staticDir, w
862
881
  const basePath = `/${app}`;
863
882
  const workspaceAppAudience = workspaceAppAudienceForApp(workspaceApps, app);
864
883
  const workspaceAppRouteAccess = workspaceAppRouteAccessForApp(workspaceApps, app);
884
+ const callbackApp = workspaceOAuthCallbackApp(workspaceApps);
885
+ const rootGoogleCallbackPath = app === callbackApp && app !== "dispatch"
886
+ ? [WORKSPACE_ROOT_GOOGLE_CALLBACK_PATH]
887
+ : [];
865
888
  const pathConfig = app === "dispatch"
866
889
  ? [
867
890
  `${workspaceFrameworkRoutePrefix()}/*`,
@@ -876,6 +899,7 @@ function patchNetlifyFunctionEntry(functionDir, app, workspaceApps, staticDir, w
876
899
  path,
877
900
  ...(descendants ? [`${path}/*`] : []),
878
901
  ]),
902
+ ...rootGoogleCallbackPath,
879
903
  ];
880
904
  const normalizeBasePathHelper = app === "dispatch"
881
905
  ? ""
@@ -44,9 +44,9 @@ declare const _default: import("../../action.js").ActionDefinition<{
44
44
  url: string;
45
45
  id: string;
46
46
  provider: string;
47
- error?: undefined;
48
47
  configured?: undefined;
49
48
  connectPath?: undefined;
49
+ error?: undefined;
50
50
  } | {
51
51
  url?: undefined;
52
52
  id?: undefined;
@@ -75,10 +75,9 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
75
75
  user: "user";
76
76
  }>>;
77
77
  }, z.core.$strip>>, {
78
- message?: undefined;
79
78
  id?: undefined;
80
- provider?: undefined;
81
79
  deleted?: undefined;
80
+ provider?: undefined;
82
81
  providers: {
83
82
  id: string;
84
83
  label: string;
@@ -92,8 +91,8 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
92
91
  found?: undefined;
93
92
  registered?: undefined;
94
93
  label?: undefined;
95
- } | {
96
94
  message?: undefined;
95
+ } | {
97
96
  id?: undefined;
98
97
  deleted?: undefined;
99
98
  count?: undefined;
@@ -102,18 +101,18 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
102
101
  provider: import("../custom-registry.js").CustomProviderConfig;
103
102
  registered?: undefined;
104
103
  label?: undefined;
105
- } | {
106
104
  message?: undefined;
107
- provider?: undefined;
105
+ } | {
108
106
  deleted?: undefined;
107
+ provider?: undefined;
109
108
  count?: undefined;
110
109
  providers?: undefined;
111
110
  found: boolean;
112
111
  id: string;
113
112
  registered?: undefined;
114
113
  label?: undefined;
115
- } | {
116
114
  message?: undefined;
115
+ } | {
117
116
  provider?: undefined;
118
117
  count?: undefined;
119
118
  providers?: undefined;
@@ -122,9 +121,10 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
122
121
  id: string;
123
122
  registered?: undefined;
124
123
  label?: undefined;
124
+ message?: undefined;
125
125
  } | {
126
- provider?: undefined;
127
126
  deleted?: undefined;
127
+ provider?: undefined;
128
128
  count?: undefined;
129
129
  providers?: undefined;
130
130
  found?: undefined;
@@ -311,9 +311,9 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
311
311
  notes?: string | undefined;
312
312
  scope?: "org" | "user" | undefined;
313
313
  }, {
314
+ provider?: undefined;
314
315
  id?: undefined;
315
316
  deleted?: undefined;
316
- provider?: undefined;
317
317
  providers: {
318
318
  id: string;
319
319
  label: string;
@@ -339,8 +339,8 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
339
339
  label?: undefined;
340
340
  message?: undefined;
341
341
  } | {
342
- deleted?: undefined;
343
342
  provider?: undefined;
343
+ deleted?: undefined;
344
344
  providers?: undefined;
345
345
  count?: undefined;
346
346
  found: boolean;
@@ -359,8 +359,8 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
359
359
  label?: undefined;
360
360
  message?: undefined;
361
361
  } | {
362
- deleted?: undefined;
363
362
  provider?: undefined;
363
+ deleted?: undefined;
364
364
  providers?: undefined;
365
365
  count?: undefined;
366
366
  found?: undefined;
@@ -5,14 +5,7 @@ export interface AuthMarketingContent {
5
5
  tagline: string;
6
6
  description?: string;
7
7
  features?: string[];
8
- authHeadline?: string;
9
- authDescription?: string;
10
- screenshotPath?: string;
11
- screenshotWidth?: number;
12
- screenshotHeight?: number;
13
8
  learnMoreUrl?: string;
14
- /** @deprecated Local execution is no longer offered from auth pages. */
15
- runLocalCommand?: string;
16
9
  signupLocalModeNote?: {
17
10
  text: string;
18
11
  command: string;