@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,8 +1,8 @@
1
1
  /**
2
- * Inline browser handoff for the public marketing home.
2
+ * Inline browser handoff for the public root entry.
3
3
  *
4
4
  * The server only decides whether this script belongs on the root shell. The
5
- * browser owns the session check and redirect so the shell stays anonymous and
6
- * safe for a shared CDN cache.
5
+ * browser owns the session check and redirect so the root shell stays
6
+ * anonymous and safe for a shared CDN cache.
7
7
  */
8
8
  export declare function getSsrAuthRedirectScript(sessionHintCookieName?: string, appHomePath?: string, frameworkRoutePrefix?: string): string;
@@ -1,9 +1,9 @@
1
1
  /**
2
- * Inline browser handoff for the public marketing home.
2
+ * Inline browser handoff for the public root entry.
3
3
  *
4
4
  * The server only decides whether this script belongs on the root shell. The
5
- * browser owns the session check and redirect so the shell stays anonymous and
6
- * safe for a shared CDN cache.
5
+ * browser owns the session check and redirect so the root shell stays
6
+ * anonymous and safe for a shared CDN cache.
7
7
  */
8
8
  export function getSsrAuthRedirectScript(sessionHintCookieName = "an_session_hint", appHomePath = "/home", frameworkRoutePrefix = "/_agent-native") {
9
9
  if (appHomePath === "/")
@@ -52,7 +52,7 @@ export function getSsrAuthRedirectScript(sessionHintCookieName = "an_session_hin
52
52
  if (!session || typeof session.email !== "string" || session.error) return;
53
53
  return redirectToAppHome();
54
54
  }).catch(function () { // coercion-ok: auth probe intentionally fails open so marketing remains usable.
55
- // A transient session failure must leave the public marketing page usable.
55
+ // A transient session failure must leave the public root usable.
56
56
  });
57
57
  })();</script>`;
58
58
  }
@@ -1,7 +1,7 @@
1
1
  # Chat — Agent Guide
2
2
 
3
- Chat is the minimal chat-first agent-native app. The public root is a marketing
4
- surface; the authenticated chat app starts at `/home`. Actions carry the real
3
+ Chat is the minimal chat-first agent-native app. The public root redirects to
4
+ the shared sign-in/signup page; the authenticated chat app starts at `/home`. Actions carry the real
5
5
  capabilities, and screens exist only where a workflow needs durable UI around
6
6
  the conversation.
7
7
 
@@ -48,7 +48,7 @@ brand. Its `app.name` is used in transactional emails, and its optional
48
48
  ## Application State
49
49
 
50
50
  - `navigation` describes the current view and selected entity ids. The default
51
- chat view is `chat` at `/home`; `/` is the public SSR marketing page.
51
+ chat view is `chat` at `/home`; `/` opens the shared sign-in/signup page.
52
52
  - `navigate` moves the UI when the app supports it.
53
53
  - `view-screen` is the first tool to call when the user's visible context
54
54
  matters.
@@ -167,23 +167,11 @@ function AppContent() {
167
167
 
168
168
  export default function Root() {
169
169
  const [queryClient] = useState(() => createAgentNativeQueryClient());
170
- const location = useLocation();
171
- const isMarketingPath = location.pathname === "/";
172
170
  return (
173
171
  <AppToolkitProvider>
174
- <AppProviders
175
- queryClient={queryClient}
176
- isPublicPath={isMarketingPath}
177
- i18n={{ catalog: i18nCatalog }}
178
- >
179
- {isMarketingPath ? (
180
- <Outlet />
181
- ) : (
182
- <>
183
- <DbSyncSetup />
184
- <AppContent />
185
- </>
186
- )}
172
+ <AppProviders queryClient={queryClient} i18n={{ catalog: i18nCatalog }}>
173
+ <DbSyncSetup />
174
+ <AppContent />
187
175
  </AppProviders>
188
176
  </AppToolkitProvider>
189
177
  );
@@ -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 AI app starter with actions";
7
- const SEO_DESCRIPTION =
8
- "Open Source starter for agent-native apps with durable chat, shared actions, UI state, tools, and a backend your agent can extend.";
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="Start from a chat-first agent-native app and add actions, screens, and workflows as you grow."
27
- description={SEO_DESCRIPTION}
28
- valueProps={[
29
- "Full-page chat with durable threads and tool call history",
30
- "Use shared actions from chat, UI, HTTP, MCP, A2A, and CLI",
31
- "Plug in your own agent runtime or use the included app-agent loop",
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";
@@ -7,9 +7,6 @@ export default createAuthPlugin({
7
7
  workspaceAppPublicPaths: ["/"],
8
8
  marketing: {
9
9
  appName: appTitle,
10
- screenshotPath: "/auth-marketing/chat.webp",
11
- screenshotWidth: 914,
12
- screenshotHeight: 818,
13
10
  learnMoreUrl: "https://agent-native.com/apps/chat",
14
11
  tagline:
15
12
  "Start from a chat-first agent-native app and add actions, screens, and workflows as you grow.",
@@ -65,10 +65,8 @@ more, but both must agree on the key ones and name only real actions. See
65
65
 
66
66
  ## Public and private routes
67
67
 
68
- `app/routes/_index.tsx` is the public SSR marketing page: no sessions, cookies,
69
- or private data. Use Toolkit `MarketingHome` with value props, backgrounds,
70
- action slots, or `children` for a custom hero. Keep the browser-gated app
71
- under `/home`; never server-redirect `/` based on auth.
68
+ `app/routes/_index.tsx` document-redirects to the shared `/sign-in` page. Keep
69
+ authenticated app UI and data loads under `/home` or another private route.
72
70
 
73
71
  ## Lightweight defaults
74
72
 
@@ -4,7 +4,7 @@ This guide is for development-mode agents editing this app's source code. For ap
4
4
 
5
5
  ## Framework Basics
6
6
 
7
- **Public SSR, private CSR:** This app uses React Router v8 framework mode with `ssr: true`. The `/` route is a public, server-rendered marketing page and must stay free of session, cookie, and private-data reads. Authenticated app routes start at `/home` and render client-side behind the `ClientOnly` session gate in `root.tsx`; browser APIs are safe there.
7
+ **Shared auth entry, private app:** This app uses React Router v8 framework mode with `ssr: true`. The `/` route document-redirects to `/sign-in`. Authenticated app routes start at `/home` and render client-side behind the `ClientOnly` session gate in `root.tsx`; browser APIs are safe there.
8
8
 
9
9
  **Do NOT fetch data server-side** in route loaders unless the page genuinely needs SEO/OG content. The standard pattern is: SSR renders the shell, client hydrates, and React reads/writes normal app data through actions with `useActionQuery` / `useActionMutation`.
10
10
 
@@ -48,10 +48,8 @@ export default function MyPageRoute() {
48
48
  }
49
49
  ```
50
50
 
51
- The root route is the public marketing surface. Use `MarketingHome` from
52
- `@agent-native/toolkit/marketing` for a reusable SSR page with value props,
53
- background visuals, action links, and a custom `children` escape hatch. Put
54
- authenticated app UI and data loads under `/home` or another private route.
51
+ The root route must use the shared sign-in landing loader; put authenticated
52
+ app UI and data loads under `/home` or another private route.
55
53
 
56
54
  ## Adding App Data
57
55
 
@@ -20,7 +20,6 @@ import {
20
20
  ScrollRestoration,
21
21
  isRouteErrorResponse,
22
22
  Link,
23
- useLocation,
24
23
  useRouteError,
25
24
  } from "react-router";
26
25
 
@@ -255,16 +254,10 @@ function DbSyncSetup() {
255
254
 
256
255
  export default function Root() {
257
256
  const [queryClient] = useState(() => createAgentNativeQueryClient());
258
- const location = useLocation();
259
- const isMarketingHome = location.pathname === "/";
260
257
  return (
261
- <AppProviders
262
- queryClient={queryClient}
263
- isPublicPath={isMarketingHome}
264
- i18n={{ catalog: i18nCatalog }}
265
- >
258
+ <AppProviders queryClient={queryClient} i18n={{ catalog: i18nCatalog }}>
266
259
  <AppToolkitProvider>
267
- {isMarketingHome ? null : <DbSyncSetup />}
260
+ <DbSyncSetup />
268
261
  <Outlet />
269
262
  </AppToolkitProvider>
270
263
  </AppProviders>
@@ -1,18 +1,11 @@
1
- import { appPath } from "@agent-native/core/client/api-path";
2
- import { MarketingHome } from "@agent-native/toolkit/marketing";
1
+ import { signInLandingLoader } from "@agent-native/core/client/sign-in-landing";
2
+ import { getAppConfig, resolveAppHomePath } from "@agent-native/core/server";
3
3
 
4
- export function meta() {
5
- return [{ title: "{{APP_TITLE}}" }];
6
- }
4
+ import HomePage from "./home";
7
5
 
8
- export default function MarketingHomeRoute() {
9
- return (
10
- <MarketingHome
11
- appName="{{APP_TITLE}}"
12
- tagline="Build with your AI agent."
13
- description="A starter app for building Agent-Native workflows."
14
- primaryActionHref={appPath("/home")}
15
- secondaryActionHref={appPath("/sign-in")}
16
- />
17
- );
6
+ export function loader() {
7
+ const config = getAppConfig();
8
+ return signInLandingLoader(resolveAppHomePath(config.app, config.workspace));
18
9
  }
10
+
11
+ export default HomePage;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.192.0-nightly-20260926081002",
3
+ "version": "0.192.0",
4
4
  "description": "The agentic application framework for building autonomous agents with intuitive UIs",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -184,6 +184,7 @@
184
184
  "./client/AgentSidebar": "./dist/client/AgentSidebar.js",
185
185
  "./client/application-state": "./dist/client/application-state.js",
186
186
  "./client/api-path": "./dist/client/api-path.js",
187
+ "./client/sign-in-landing": "./dist/client/sign-in-landing.js",
187
188
  "./client/oauth-popup": "./dist/client/oauth-popup.js",
188
189
  "./client/clipboard": "./dist/client/clipboard.js",
189
190
  "./client/route-state": "./dist/client/route-state.js",
@@ -511,9 +512,9 @@
511
512
  "yaml": "^2.9.0",
512
513
  "yjs": "^13.6.32",
513
514
  "zod": "^4.3.6",
514
- "@agent-native/agentkit": "^0.3.0-nightly-20260926081002",
515
- "@agent-native/recap-cli": "0.5.43",
516
- "@agent-native/toolkit": "^0.22.0-nightly-20260926081002"
515
+ "@agent-native/agentkit": "^0.3.0",
516
+ "@agent-native/toolkit": "^0.22.0",
517
+ "@agent-native/recap-cli": "0.5.44"
517
518
  },
518
519
  "devDependencies": {
519
520
  "@ai-sdk/anthropic": "^3.0.71",
@@ -1,7 +1,7 @@
1
1
  # Chat — Agent Guide
2
2
 
3
- Chat is the minimal chat-first agent-native app. The public root is a marketing
4
- surface; the authenticated chat app starts at `/home`. Actions carry the real
3
+ Chat is the minimal chat-first agent-native app. The public root redirects to
4
+ the shared sign-in/signup page; the authenticated chat app starts at `/home`. Actions carry the real
5
5
  capabilities, and screens exist only where a workflow needs durable UI around
6
6
  the conversation.
7
7
 
@@ -48,7 +48,7 @@ brand. Its `app.name` is used in transactional emails, and its optional
48
48
  ## Application State
49
49
 
50
50
  - `navigation` describes the current view and selected entity ids. The default
51
- chat view is `chat` at `/home`; `/` is the public SSR marketing page.
51
+ chat view is `chat` at `/home`; `/` opens the shared sign-in/signup page.
52
52
  - `navigate` moves the UI when the app supports it.
53
53
  - `view-screen` is the first tool to call when the user's visible context
54
54
  matters.
@@ -167,23 +167,11 @@ function AppContent() {
167
167
 
168
168
  export default function Root() {
169
169
  const [queryClient] = useState(() => createAgentNativeQueryClient());
170
- const location = useLocation();
171
- const isMarketingPath = location.pathname === "/";
172
170
  return (
173
171
  <AppToolkitProvider>
174
- <AppProviders
175
- queryClient={queryClient}
176
- isPublicPath={isMarketingPath}
177
- i18n={{ catalog: i18nCatalog }}
178
- >
179
- {isMarketingPath ? (
180
- <Outlet />
181
- ) : (
182
- <>
183
- <DbSyncSetup />
184
- <AppContent />
185
- </>
186
- )}
172
+ <AppProviders queryClient={queryClient} i18n={{ catalog: i18nCatalog }}>
173
+ <DbSyncSetup />
174
+ <AppContent />
187
175
  </AppProviders>
188
176
  </AppToolkitProvider>
189
177
  );
@@ -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 AI app starter with actions";
7
- const SEO_DESCRIPTION =
8
- "Open Source starter for agent-native apps with durable chat, shared actions, UI state, tools, and a backend your agent can extend.";
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="Start from a chat-first agent-native app and add actions, screens, and workflows as you grow."
27
- description={SEO_DESCRIPTION}
28
- valueProps={[
29
- "Full-page chat with durable threads and tool call history",
30
- "Use shared actions from chat, UI, HTTP, MCP, A2A, and CLI",
31
- "Plug in your own agent runtime or use the included app-agent loop",
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";
@@ -7,9 +7,6 @@ export default createAuthPlugin({
7
7
  workspaceAppPublicPaths: ["/"],
8
8
  marketing: {
9
9
  appName: appTitle,
10
- screenshotPath: "/auth-marketing/chat.webp",
11
- screenshotWidth: 914,
12
- screenshotHeight: 818,
13
10
  learnMoreUrl: "https://agent-native.com/apps/chat",
14
11
  tagline:
15
12
  "Start from a chat-first agent-native app and add actions, screens, and workflows as you grow.",
@@ -65,10 +65,8 @@ more, but both must agree on the key ones and name only real actions. See
65
65
 
66
66
  ## Public and private routes
67
67
 
68
- `app/routes/_index.tsx` is the public SSR marketing page: no sessions, cookies,
69
- or private data. Use Toolkit `MarketingHome` with value props, backgrounds,
70
- action slots, or `children` for a custom hero. Keep the browser-gated app
71
- under `/home`; never server-redirect `/` based on auth.
68
+ `app/routes/_index.tsx` document-redirects to the shared `/sign-in` page. Keep
69
+ authenticated app UI and data loads under `/home` or another private route.
72
70
 
73
71
  ## Lightweight defaults
74
72
 
@@ -4,7 +4,7 @@ This guide is for development-mode agents editing this app's source code. For ap
4
4
 
5
5
  ## Framework Basics
6
6
 
7
- **Public SSR, private CSR:** This app uses React Router v8 framework mode with `ssr: true`. The `/` route is a public, server-rendered marketing page and must stay free of session, cookie, and private-data reads. Authenticated app routes start at `/home` and render client-side behind the `ClientOnly` session gate in `root.tsx`; browser APIs are safe there.
7
+ **Shared auth entry, private app:** This app uses React Router v8 framework mode with `ssr: true`. The `/` route document-redirects to `/sign-in`. Authenticated app routes start at `/home` and render client-side behind the `ClientOnly` session gate in `root.tsx`; browser APIs are safe there.
8
8
 
9
9
  **Do NOT fetch data server-side** in route loaders unless the page genuinely needs SEO/OG content. The standard pattern is: SSR renders the shell, client hydrates, and React reads/writes normal app data through actions with `useActionQuery` / `useActionMutation`.
10
10
 
@@ -48,10 +48,8 @@ export default function MyPageRoute() {
48
48
  }
49
49
  ```
50
50
 
51
- The root route is the public marketing surface. Use `MarketingHome` from
52
- `@agent-native/toolkit/marketing` for a reusable SSR page with value props,
53
- background visuals, action links, and a custom `children` escape hatch. Put
54
- authenticated app UI and data loads under `/home` or another private route.
51
+ The root route must use the shared sign-in landing loader; put authenticated
52
+ app UI and data loads under `/home` or another private route.
55
53
 
56
54
  ## Adding App Data
57
55
 
@@ -20,7 +20,6 @@ import {
20
20
  ScrollRestoration,
21
21
  isRouteErrorResponse,
22
22
  Link,
23
- useLocation,
24
23
  useRouteError,
25
24
  } from "react-router";
26
25
 
@@ -255,16 +254,10 @@ function DbSyncSetup() {
255
254
 
256
255
  export default function Root() {
257
256
  const [queryClient] = useState(() => createAgentNativeQueryClient());
258
- const location = useLocation();
259
- const isMarketingHome = location.pathname === "/";
260
257
  return (
261
- <AppProviders
262
- queryClient={queryClient}
263
- isPublicPath={isMarketingHome}
264
- i18n={{ catalog: i18nCatalog }}
265
- >
258
+ <AppProviders queryClient={queryClient} i18n={{ catalog: i18nCatalog }}>
266
259
  <AppToolkitProvider>
267
- {isMarketingHome ? null : <DbSyncSetup />}
260
+ <DbSyncSetup />
268
261
  <Outlet />
269
262
  </AppToolkitProvider>
270
263
  </AppProviders>
@@ -1,18 +1,11 @@
1
- import { appPath } from "@agent-native/core/client/api-path";
2
- import { MarketingHome } from "@agent-native/toolkit/marketing";
1
+ import { signInLandingLoader } from "@agent-native/core/client/sign-in-landing";
2
+ import { getAppConfig, resolveAppHomePath } from "@agent-native/core/server";
3
3
 
4
- export function meta() {
5
- return [{ title: "{{APP_TITLE}}" }];
6
- }
4
+ import HomePage from "./home";
7
5
 
8
- export default function MarketingHomeRoute() {
9
- return (
10
- <MarketingHome
11
- appName="{{APP_TITLE}}"
12
- tagline="Build with your AI agent."
13
- description="A starter app for building Agent-Native workflows."
14
- primaryActionHref={appPath("/home")}
15
- secondaryActionHref={appPath("/sign-in")}
16
- />
17
- );
6
+ export function loader() {
7
+ const config = getAppConfig();
8
+ return signInLandingLoader(resolveAppHomePath(config.app, config.workspace));
18
9
  }
10
+
11
+ export default HomePage;
@@ -1,9 +0,0 @@
1
- import type { LocaleCode } from "../localization/shared.js";
2
- export interface AuthMarketingLocaleCopy {
3
- tagline?: string;
4
- description?: string;
5
- features?: string[];
6
- authHeadline?: string;
7
- authDescription?: string;
8
- }
9
- export declare const AUTH_MARKETING_LOCALE_COPY: Partial<Record<LocaleCode, Record<string, AuthMarketingLocaleCopy>>>;