@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
@@ -1,36 +1 @@
1
- import { appPath } from "@agent-native/core/client/api-path";
2
- import { MarketingHome } from "@agent-native/toolkit/marketing";
3
-
4
- const SEO_TITLE =
5
- "Mail - Open Source AI email client and Superhuman alternative";
6
- const SEO_DESCRIPTION =
7
- "Open Source AI email client for Gmail triage, drafting, organization, follow-ups, and inbox workflows built around shared actions.";
8
-
9
- export function meta() {
10
- return [
11
- { title: SEO_TITLE },
12
- { name: "description", content: SEO_DESCRIPTION },
13
- { property: "og:title", content: SEO_TITLE },
14
- { property: "og:description", content: SEO_DESCRIPTION },
15
- { name: "twitter:card", content: "summary" },
16
- { name: "twitter:title", content: SEO_TITLE },
17
- { name: "twitter:description", content: SEO_DESCRIPTION },
18
- ];
19
- }
20
-
21
- export default function MarketingHomeRoute() {
22
- return (
23
- <MarketingHome
24
- appName="Mail"
25
- tagline="Your AI agent reads, drafts, and organizes email alongside you."
26
- description={SEO_DESCRIPTION}
27
- valueProps={[
28
- "Draft replies that match your tone and style",
29
- "Manage multiple Gmail accounts in one unified inbox",
30
- "Automate triage, archiving, and follow-ups",
31
- ]}
32
- primaryActionHref={appPath("/home")}
33
- secondaryActionHref={appPath("/sign-in")}
34
- />
35
- );
36
- }
1
+ export { signInLandingLoader as loader } from "@agent-native/core/client/sign-in-landing";
@@ -87,7 +87,7 @@ export function HydrateFallback() {
87
87
  return <DefaultSpinner />;
88
88
  }
89
89
 
90
- // Private app entry retained at /home; / serves the public marketing page.
90
+ // Private app entry retained at /home; / redirects to shared sign-in/signup.
91
91
  export default function IndexRoute() {
92
92
  // Should never render — both loaders redirect to the inbox.
93
93
  return null;
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: changed
3
+ date: 2026-09-26
4
+ ---
5
+
6
+ The app entry now opens the shared sign-in and sign-up screen instead of a separate marketing page.
@@ -28,9 +28,6 @@ export default createAuthPlugin({
28
28
  ],
29
29
  marketing: {
30
30
  appName: "Mail",
31
- screenshotPath: "/auth-marketing/mail.webp",
32
- screenshotWidth: 927,
33
- screenshotHeight: 818,
34
31
  learnMoreUrl: "https://agent-native.com/apps/mail",
35
32
  tagline: "Your AI agent reads, drafts, and organizes email alongside you.",
36
33
  features: [
@@ -224,7 +224,6 @@ export default function Root() {
224
224
  const [queryClient] = useState(() => createAgentNativeQueryClient());
225
225
  const location = useLocation();
226
226
  const pathname = location.pathname.replace(/\/+$/, "") || "/";
227
- const isMarketingPath = pathname === "/";
228
227
  const sessionBypass =
229
228
  pathname === "/chat" ||
230
229
  pathname === "/plans" ||
@@ -241,23 +240,18 @@ export default function Root() {
241
240
  <AppToolkitProvider>
242
241
  <AppProviders
243
242
  queryClient={queryClient}
244
- isPublicPath={isMarketingPath}
245
243
  sessionBypass={sessionBypass}
246
244
  documentTitleFallback={APP_TITLE}
247
245
  toaster={<Toaster richColors position="bottom-left" />}
248
246
  i18n={{ catalog: i18nCatalog }}
249
247
  >
250
- {isMarketingPath ? (
251
- <Outlet />
252
- ) : (
253
- <div
254
- data-an-mask={localPlanPrivacyRoute ? "" : undefined}
255
- style={{ display: "contents" }}
256
- >
257
- <DbSyncSetup />
258
- <AppContent />
259
- </div>
260
- )}
248
+ <div
249
+ data-an-mask={localPlanPrivacyRoute ? "" : undefined}
250
+ style={{ display: "contents" }}
251
+ >
252
+ <DbSyncSetup />
253
+ <AppContent />
254
+ </div>
261
255
  </AppProviders>
262
256
  </AppToolkitProvider>
263
257
  );
@@ -1,35 +1 @@
1
- import { appPath } from "@agent-native/core/client/api-path";
2
- import { MarketingHome } from "@agent-native/toolkit/marketing";
3
-
4
- const SEO_TITLE = "Plan";
5
- const SEO_DESCRIPTION =
6
- "Visual plans, diagrams, wireframes, and shareable reviews for coding-agent work.";
7
-
8
- export function meta() {
9
- return [
10
- { title: SEO_TITLE },
11
- { name: "description", content: SEO_DESCRIPTION },
12
- { property: "og:title", content: SEO_TITLE },
13
- { property: "og:description", content: SEO_DESCRIPTION },
14
- { name: "twitter:card", content: "summary" },
15
- { name: "twitter:title", content: SEO_TITLE },
16
- { name: "twitter:description", content: SEO_DESCRIPTION },
17
- ];
18
- }
19
-
20
- export default function MarketingHomeRoute() {
21
- return (
22
- <MarketingHome
23
- appName="Plan"
24
- tagline="Turn coding-agent plans into visual, annotatable HTML before code changes happen."
25
- description={SEO_DESCRIPTION}
26
- valueProps={[
27
- "Create diagrams, wireframes, mockups, and prototype options from one prompt",
28
- "Annotate plans as a visual review surface",
29
- "Share account-backed review links when a plan needs outside feedback",
30
- ]}
31
- primaryActionHref={appPath("/home")}
32
- secondaryActionHref={appPath("/sign-in")}
33
- />
34
- );
35
- }
1
+ export { signInLandingLoader as loader } from "@agent-native/core/client/sign-in-landing";
@@ -5,7 +5,7 @@ export function loader() {
5
5
  return withSsrHtmlContentType(redirect("/plans"));
6
6
  }
7
7
 
8
- // Private app redirect retained at /home; / serves the public marketing page.
8
+ // Private app redirect retained at /home; / redirects to shared sign-in/signup.
9
9
  export default function IndexRedirect() {
10
10
  return null;
11
11
  }
@@ -65,9 +65,6 @@ export default createAuthPlugin({
65
65
  ],
66
66
  marketing: {
67
67
  appName: "Plan",
68
- screenshotPath: "/auth-marketing/plan.webp",
69
- screenshotWidth: 914,
70
- screenshotHeight: 818,
71
68
  learnMoreUrl: "https://agent-native.com/apps/plan",
72
69
  tagline:
73
70
  "Turn coding-agent plans into visual, annotatable HTML before code changes happen.",
@@ -3,21 +3,42 @@
3
3
  All notable user-facing changes to Agent-Native Slides are documented here. Open it any
4
4
  time from the command menu (Cmd+K → "What's new").
5
5
 
6
+ ## 2026-09-26
7
+
8
+ ### Changed
9
+
10
+ - The app entry now opens the shared sign-in and sign-up screen instead of a separate marketing page.
11
+
6
12
  ## 2026-09-25
7
13
 
8
14
  ### Added
9
15
 
16
+ - Open an editable presentation from a template in one click, or inspect every slide in a large modal preview without AI generation.
17
+ - Slides home quick actions now adapt to your onboarding role and appear only when an AI provider is ready.
10
18
  - Org admins can review agent runs from Settings
11
19
  - Chat messages can be reverted to their autosaved version, including a shortcut to restore the start of a chat.
12
20
 
13
21
  ### Improved
14
22
 
23
+ - Attach Figma frames and websites from focused dialogs while keeping prompt drafts and uploaded design.md files intact.
24
+ - Recent decks now use the same consistent library card layout as templates.
25
+ - Import PDF and PowerPoint files directly from the toolbar, paste Google Slides links in a compact popover, and find design and presentation references together under Design.
26
+ - Start presentations from a prompt or guided source, attach existing Design, Slides, and Figma references, and import decks independently from the home toolbar.
27
+ - Browse design systems and references from the shared context menu and open design-system setup without losing your presentation draft.
28
+ - Shared presentation links show the deck title and slide text in previews
29
+ - Use templates directly from full preview
30
+ - Use text-first menus for import and template actions
15
31
  - Keep empty deck lists clear of search and filter controls
16
32
  - Selected design-system source forms open directly beneath their row and Figma indexing shows upload and decode progress.
17
33
  - Improve Slides design system setup feedback
18
34
 
19
35
  ### Fixed
20
36
 
37
+ - Human Review previews show same-organization slides for organization admins without changing deck data.
38
+ - Searching presentations keeps the results panel visible even when your workspace has no owned decks.
39
+ - Shared-only presentations now open in Recent by default, copied templates wait for deck hydration, and retries remain idempotent.
40
+ - Successful template copies now open even when deck-list refresh is temporarily unavailable.
41
+ - Template copies no longer report success as a failure when deck-list hydration is superseded.
21
42
  - The agent recognizes blank slides and its slide prompts avoid duplicate wording.
22
43
  - Compact deck reads handle imported slides with invalid selectors.
23
44
  - Empty decks show a structured slide preview, and choices before generation are easier to read.
@@ -1,6 +1,12 @@
1
1
  import { defineAction, embedApp, fail } from "@agent-native/core";
2
- import { buildDeepLink } from "@agent-native/core/server";
3
- import { getRequestUserEmail } from "@agent-native/core/server/request-context";
2
+ import {
3
+ buildDeepLink,
4
+ currentRequestUserIsOrgAdmin,
5
+ } from "@agent-native/core/server";
6
+ import {
7
+ getRequestOrgId,
8
+ getRequestUserEmail,
9
+ } from "@agent-native/core/server/request-context";
4
10
  import { loadAgentDesignSystemContext } from "@agent-native/core/shared";
5
11
  import { resolveAccess } from "@agent-native/core/sharing";
6
12
  import { and, eq, isNull } from "drizzle-orm";
@@ -29,15 +35,30 @@ import { withDeckLock } from "./patch-deck.js";
29
35
 
30
36
  const MAX_REPAIR_ATTEMPTS = 3;
31
37
 
32
- async function readDeck(deckId: string) {
33
- const access = await resolveAccess("deck", deckId);
34
- if (!access) {
35
- // 404 rather than 403/500 so HTTP callers can't probe for decks they
36
- // can't see, and so the slide preview can tell "missing" from "broken".
37
- throw Object.assign(new Error("Deck not found"), { statusCode: 404 });
38
+ async function readDeck(deckId: string, reviewPreview = false) {
39
+ let row;
40
+ if (reviewPreview) {
41
+ const orgId = getRequestOrgId();
42
+ if (!orgId || !(await currentRequestUserIsOrgAdmin(orgId))) {
43
+ fail("Only organization owners and admins can preview reviewed decks.", {
44
+ statusCode: 403,
45
+ });
46
+ }
47
+ [row] = await getDb()
48
+ .select()
49
+ .from(schema.decks)
50
+ .where(and(eq(schema.decks.id, deckId), eq(schema.decks.orgId, orgId)))
51
+ .limit(1);
52
+ if (!row) fail("Deck not found.", { statusCode: 404 });
53
+ } else {
54
+ const access = await resolveAccess("deck", deckId);
55
+ if (!access) {
56
+ // 404 rather than 403/500 so HTTP callers can't probe for decks they
57
+ // can't see, and so the slide preview can tell "missing" from "broken".
58
+ throw Object.assign(new Error("Deck not found"), { statusCode: 404 });
59
+ }
60
+ row = access.resource;
38
61
  }
39
-
40
- const row = access.resource;
41
62
  const data = JSON.parse(row.data);
42
63
  const normalized = ensureUniqueSlideIds(
43
64
  Array.isArray(data?.slides) ? data.slides : [],
@@ -45,7 +66,14 @@ async function readDeck(deckId: string) {
45
66
  return { row, data, ...normalized };
46
67
  }
47
68
 
48
- async function loadDeckWithUniqueSlideIds(deckId: string) {
69
+ async function loadDeckWithUniqueSlideIds(
70
+ deckId: string,
71
+ reviewPreview = false,
72
+ ) {
73
+ if (reviewPreview) {
74
+ return { ...(await readDeck(deckId, true)), repaired: false };
75
+ }
76
+
49
77
  for (let attempt = 0; attempt < MAX_REPAIR_ATTEMPTS; attempt += 1) {
50
78
  const snapshot = await readDeck(deckId);
51
79
  if (!snapshot.changed) return { ...snapshot, repaired: false };
@@ -340,6 +368,12 @@ export default defineAction({
340
368
  .describe(
341
369
  "Set to 'true' to return full slide HTML formatted with Prettier for code-style patches. The contentHash still identifies the persisted source.",
342
370
  ),
371
+ reviewPreview: z
372
+ .boolean()
373
+ .optional()
374
+ .describe(
375
+ "Human Review only: read a deck in the current organization. Requires an organization owner or admin.",
376
+ ),
343
377
  })
344
378
  .superRefine((args, context) => {
345
379
  if (args.slideId !== undefined && args.slideIds !== undefined) {
@@ -379,7 +413,10 @@ export default defineAction({
379
413
  statusCode: 400,
380
414
  });
381
415
  }
382
- const { row, data, slides } = await loadDeckWithUniqueSlideIds(deckId);
416
+ const { row, data, slides } = await loadDeckWithUniqueSlideIds(
417
+ deckId,
418
+ args.reviewPreview,
419
+ );
383
420
  const ownerEmail = getRequestUserEmail();
384
421
  const normalizedOwnerEmail = normalizeOwnerEmail(ownerEmail);
385
422
  const selectedSlideIndex =
@@ -341,7 +341,6 @@ function AppContent() {
341
341
  export default function Root() {
342
342
  const [queryClient] = useState(() => createAgentNativeQueryClient());
343
343
  const location = useLocation();
344
- const isMarketingPath = location.pathname === "/";
345
344
 
346
345
  if (BARE_PREFIXES.some((p) => location.pathname.startsWith(p))) {
347
346
  return <Outlet />;
@@ -352,11 +351,10 @@ export default function Root() {
352
351
  <AppProviders
353
352
  queryClient={queryClient}
354
353
  defaultTheme="dark"
355
- isPublicPath={isMarketingPath}
356
354
  i18n={{ catalog: i18nCatalog }}
357
355
  sessionBypass={isShareableContentPath(location.pathname)}
358
356
  >
359
- {isMarketingPath ? <Outlet /> : <AppContent />}
357
+ <AppContent />
360
358
  </AppProviders>
361
359
  </AppToolkitProvider>
362
360
  );
@@ -1,36 +1 @@
1
- import { appPath } from "@agent-native/core/client/api-path";
2
- import { MarketingHome } from "@agent-native/toolkit/marketing";
3
-
4
- const SEO_TITLE =
5
- "Slides - Open Source AI presentation builder and Google Slides alternative";
6
- const SEO_DESCRIPTION =
7
- "Open Source AI presentation builder for generating, editing, refining, and exporting React decks as Google Slides-ready presentations.";
8
-
9
- export function meta() {
10
- return [
11
- { title: SEO_TITLE },
12
- { name: "description", content: SEO_DESCRIPTION },
13
- { property: "og:title", content: SEO_TITLE },
14
- { property: "og:description", content: SEO_DESCRIPTION },
15
- { name: "twitter:card", content: "summary" },
16
- { name: "twitter:title", content: SEO_TITLE },
17
- { name: "twitter:description", content: SEO_DESCRIPTION },
18
- ];
19
- }
20
-
21
- export default function MarketingHomeRoute() {
22
- return (
23
- <MarketingHome
24
- appName="Slides"
25
- tagline="Your AI agent builds, edits, and refines presentations alongside you."
26
- description={SEO_DESCRIPTION}
27
- valueProps={[
28
- "Generate entire decks from a single prompt",
29
- "Make surgical slide edits while you present or review",
30
- "Collaborate in real time with your agent",
31
- ]}
32
- primaryActionHref={appPath("/home")}
33
- secondaryActionHref={appPath("/sign-in")}
34
- />
35
- );
36
- }
1
+ export { signInLandingLoader as loader } from "@agent-native/core/client/sign-in-landing";
@@ -20,7 +20,7 @@ export function meta() {
20
20
  ];
21
21
  }
22
22
 
23
- // Private app entry retained at /home; / serves the public marketing page.
23
+ // Private app entry retained at /home; / redirects to shared sign-in/signup.
24
24
  export default function IndexRoute() {
25
25
  return <Index />;
26
26
  }
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-09-25
4
+ ---
5
+
6
+ Human Review previews show same-organization slides for organization admins without changing deck data.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: changed
3
+ date: 2026-09-26
4
+ ---
5
+
6
+ The app entry now opens the shared sign-in and sign-up screen instead of a separate marketing page.
@@ -6,9 +6,6 @@ export default createAuthPlugin({
6
6
  workspaceAppPublicPaths: ["/"],
7
7
  marketing: {
8
8
  appName: "Slides",
9
- screenshotPath: "/auth-marketing/slides.webp",
10
- screenshotWidth: 914,
11
- screenshotHeight: 818,
12
9
  learnMoreUrl: "https://agent-native.com/apps/slides",
13
10
  tagline:
14
11
  "Your AI agent builds, edits, and refines presentations alongside you.",
@@ -41,7 +41,7 @@ Default navigation shape on `/tasks`:
41
41
  - `includeDone` mirrors the task-list filter toggle (incomplete only vs show all).
42
42
  - `taskId` highlights a row when opened from a deep link; MVP has no detail page.
43
43
  - `fieldId` highlights a custom field when opened from a deep link; the Fields page manages definitions.
44
- - Chat lives at `/chat`. The public root `/` is the SSR marketing page, while
44
+ - Chat lives at `/chat`. The public root `/` redirects to shared sign-in/signup, while
45
45
  private app entry `/home` redirects to `/tasks`.
46
46
 
47
47
  ## Actions
@@ -1,6 +1,6 @@
1
1
  # agent-native-tasks
2
2
 
3
- Task-list-first agent-native app. The public root is a marketing page; private
3
+ Task-list-first agent-native app. The public root redirects to sign-in; private
4
4
  app entry `/home` opens the task list at `/tasks`, while chat handles capture
5
5
  and agent operations.
6
6
 
@@ -194,24 +194,15 @@ function AppContent() {
194
194
 
195
195
  export default function Root() {
196
196
  const [queryClient] = useState(() => createAgentNativeQueryClient());
197
- const location = useLocation();
198
- const isMarketingPath = location.pathname === "/";
199
197
  return (
200
198
  <AppProviders
201
199
  queryClient={queryClient}
202
- isPublicPath={isMarketingPath}
203
200
  toaster={<Toaster position="bottom-left" />}
204
201
  i18n={{ catalog: i18nCatalog }}
205
202
  >
206
203
  <AppToolkitProvider>
207
- {isMarketingPath ? (
208
- <Outlet />
209
- ) : (
210
- <>
211
- <DbSyncSetup />
212
- <AppContent />
213
- </>
214
- )}
204
+ <DbSyncSetup />
205
+ <AppContent />
215
206
  </AppToolkitProvider>
216
207
  </AppProviders>
217
208
  );
@@ -1,37 +1 @@
1
- import { appPath } from "@agent-native/core/client/api-path";
2
- import { MarketingHome } from "@agent-native/toolkit/marketing";
3
-
4
- import { APP_TITLE } from "@/lib/app-config";
5
-
6
- const SEO_TITLE = APP_TITLE + " - Open Source agent-native task workspace";
7
- const SEO_DESCRIPTION =
8
- "Open Source task workspace for inbox triage, ordered lists, custom fields, and agent-assisted follow-through.";
9
-
10
- export function meta() {
11
- return [
12
- { title: SEO_TITLE },
13
- { name: "description", content: SEO_DESCRIPTION },
14
- { property: "og:title", content: SEO_TITLE },
15
- { property: "og:description", content: SEO_DESCRIPTION },
16
- { name: "twitter:card", content: "summary" },
17
- { name: "twitter:title", content: SEO_TITLE },
18
- { name: "twitter:description", content: SEO_DESCRIPTION },
19
- ];
20
- }
21
-
22
- export default function MarketingHomeRoute() {
23
- return (
24
- <MarketingHome
25
- appName={APP_TITLE}
26
- tagline="Manage personal tasks from inbox to completion, with an agent that can do the work alongside you."
27
- description={SEO_DESCRIPTION}
28
- valueProps={[
29
- "Capture ideas in an inbox and promote them when they are ready",
30
- "Create, reorder, and complete tasks in the order you choose",
31
- "Track what matters with custom fields and selected values",
32
- ]}
33
- primaryActionHref={appPath("/home")}
34
- secondaryActionHref={appPath("/sign-in")}
35
- />
36
- );
37
- }
1
+ export { signInLandingLoader as loader } from "@agent-native/core/client/sign-in-landing";
@@ -18,7 +18,7 @@ export function loader() {
18
18
  return withSsrHtmlContentType(redirect("/tasks"));
19
19
  }
20
20
 
21
- // Private app redirect retained at /home; / serves the public marketing page.
21
+ // Private app redirect retained at /home; / redirects to shared sign-in/signup.
22
22
  export default function IndexRedirect() {
23
23
  return null;
24
24
  }
@@ -87,6 +87,7 @@ export interface DesignConnectBridge {
87
87
  export interface DesignConnectBridgeOptions {
88
88
  bridgeToken?: string;
89
89
  previewToken?: string;
90
+ persistBridgeToken?: boolean;
90
91
  /** Extra exact browser origins allowed to make CORS requests to the bridge.
91
92
  * The production Design origin and loopback development origins are always
92
93
  * recognized; custom deployments should pass their app origin here. */