@agent-native/core 0.227.0-nightly-20261110032437 → 0.227.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 (68) hide show
  1. package/dist/agent/default-agent-engine.d.ts +1 -0
  2. package/dist/agent/default-agent-engine.js +6 -3
  3. package/dist/agent/engine/builder-engine.js +10 -6
  4. package/dist/agent/engine/chat-model-availability.d.ts +9 -0
  5. package/dist/agent/engine/chat-model-availability.js +39 -0
  6. package/dist/agent/optional-placeholders.d.ts +1 -0
  7. package/dist/agent/optional-placeholders.js +3 -0
  8. package/dist/cli/create.js +0 -49
  9. package/dist/cli/index.js +1 -1
  10. package/dist/cli/react-router-command.js +13 -7
  11. package/dist/client/chat/agentkit-protocol.js +259 -200
  12. package/dist/client/chat/run-outcome.d.ts +48 -0
  13. package/dist/client/chat/run-outcome.js +50 -0
  14. package/dist/collab/routes.d.ts +1 -1
  15. package/dist/collab/struct-routes.d.ts +1 -1
  16. package/dist/deploy/build.d.ts +1 -0
  17. package/dist/deploy/build.js +30 -1
  18. package/dist/framework-package-versions.json +11 -11
  19. package/dist/jobs/run-now.js +9 -1
  20. package/dist/notifications/routes.d.ts +3 -3
  21. package/dist/org/index.d.ts +1 -1
  22. package/dist/org/migrations.d.ts +1 -1
  23. package/dist/provider-api/actions/provider-api.d.ts +1 -1
  24. package/dist/resources/handlers.d.ts +1 -1
  25. package/dist/scripts/agent-engines/list-agent-engines.js +9 -5
  26. package/dist/server/auth.d.ts +3 -1
  27. package/dist/server/auth.js +29 -9
  28. package/dist/server/builder-signup-experiment.d.ts +89 -42
  29. package/dist/server/builder-signup-experiment.js +36 -14
  30. package/dist/server/core-routes-plugin.js +5 -3
  31. package/dist/server/index.d.ts +2 -1
  32. package/dist/server/index.js +2 -1
  33. package/dist/server/onboarding-html.d.ts +2 -0
  34. package/dist/server/onboarding-html.js +9 -5
  35. package/dist/server/release-migrations.d.ts +3 -1
  36. package/dist/server/release-migrations.js +8 -6
  37. package/dist/shared/mcp-embed-headers.js +8 -2
  38. package/dist/templates/builder-code-starter/AGENTS.md.patch +1 -1
  39. package/dist/templates/builder-code-starter/server/plugins/auth.ts.patch +2 -1
  40. package/dist/templates/chat/AGENTS.md +1 -1
  41. package/dist/templates/chat/app/components/layout/Sidebar.tsx +1 -1
  42. package/dist/templates/chat/scripts/migrate-production.ts +1 -1
  43. package/dist/templates/chat/server/plugins/auth.ts +1 -0
  44. package/dist/templates/default/pnpm-workspace.yaml +0 -41
  45. package/dist/templates/default/scripts/migrate-production.ts +1 -1
  46. package/dist/templates/workspace-root/pnpm-workspace.yaml +0 -41
  47. package/dist/tracking/providers.js +20 -8
  48. package/dist/triggers/actions/list-automations.js +7 -1
  49. package/docs/content/agent-web-surfaces.mdx +54 -42
  50. package/docs/content/authentication.mdx +14 -0
  51. package/docs/content/client-agent-chat.mdx +2 -0
  52. package/docs/content/client-routing.mdx +2 -0
  53. package/docs/content/create-with-an-agent.mdx +1 -1
  54. package/docs/content/environment-variables.mdx +2 -0
  55. package/docs/content/extensions.mdx +8 -9
  56. package/docs/content/external-agents.mdx +8 -0
  57. package/docs/content/upgrading-core-ui.mdx +2 -0
  58. package/docs/content/vercel.mdx +2 -0
  59. package/package.json +4 -4
  60. package/src/templates/builder-code-starter/AGENTS.md.patch +1 -1
  61. package/src/templates/builder-code-starter/server/plugins/auth.ts.patch +2 -1
  62. package/src/templates/chat/AGENTS.md +1 -1
  63. package/src/templates/chat/app/components/layout/Sidebar.tsx +1 -1
  64. package/src/templates/chat/scripts/migrate-production.ts +1 -1
  65. package/src/templates/chat/server/plugins/auth.ts +1 -0
  66. package/src/templates/default/pnpm-workspace.yaml +0 -41
  67. package/src/templates/default/scripts/migrate-production.ts +1 -1
  68. package/src/templates/workspace-root/pnpm-workspace.yaml +0 -41
@@ -17,7 +17,7 @@ The docs site is the reference implementation. Today it ships:
17
17
  - JSON-LD for base organization, website, and page metadata.
18
18
  - An audit CLI (`npx @agent-native/core@latest audit-agent-web`) that checks all of the above.
19
19
 
20
- Setting `publicMcp: true` additionally exposes opted-in actions as a public MCP endpoint, allowing external agents to call them directly (see [MCP Protocol](/docs/mcp-protocol)).
20
+ Publishing these files never exposes an action. An action reaches external agents only through its own `publicAgent` opt-in; see [Expose to public agents](/docs/actions-access-control#public-agent).
21
21
 
22
22
  <Diagram id="doc-block-1guzidr" title="What a public route publishes" summary={"A public route fans out into agent-friendly representations. Reading the route is separate from calling tools — tool access stays opt-in."}>
23
23
 
@@ -25,7 +25,7 @@ Setting `publicMcp: true` additionally exposes opted-in actions as a public MCP
25
25
  <div class="diagram-web">
26
26
  <div class="diagram-box" data-rough>
27
27
  Public route<br /><small class="diagram-muted"
28
- >derived from route access settings</small
28
+ >from the page list you pass</small
29
29
  >
30
30
  </div>
31
31
  <div class="diagram-arrow diagram-muted" aria-hidden="true">&rarr;</div>
@@ -40,9 +40,7 @@ Setting `publicMcp: true` additionally exposes opted-in actions as a public MCP
40
40
  <div class="diagram-arrow diagram-muted" aria-hidden="true">&rarr;</div>
41
41
  <div class="diagram-col gate">
42
42
  <span class="diagram-pill warn">Tools stay private</span
43
- ><small class="diagram-muted"
44
- >publicMcp + publicAgent.expose required</small
45
- >
43
+ ><small class="diagram-muted">publicAgent.expose required</small>
46
44
  </div>
47
45
  </div>
48
46
  ```
@@ -75,45 +73,57 @@ Setting `publicMcp: true` additionally exposes opted-in actions as a public MCP
75
73
 
76
74
  ## Configuration {#config}
77
75
 
78
- Add `agentWeb` under the existing workspace app config (in your app's `package.json` under the `agent-native` key — or equivalently `workspace.agentWeb`, `agentWeb`, or `root.agentWeb`). The public route list is still derived from the app's route access settings; `agentWeb` controls how that public surface is represented to agents.
79
-
80
- ```json
81
- {
82
- "agent-native": {
83
- "workspaceApp": {
84
- "audience": "public",
85
- "protectedPaths": ["/admin/*"],
86
- "agentWeb": {
87
- "discoverable": true,
88
- "markdownTwins": true,
89
- "llmsTxt": true,
90
- "jsonLd": true,
91
- "publicAgentCard": true,
92
- "publicMcp": false,
93
- "crawlerPolicy": "discoverable-no-training",
94
- "crawlers": {
95
- "training": "disallow",
96
- "search": "allow",
97
- "userTriggered": "allow",
98
- "codingAgents": "allow",
99
- "autonomousAgents": "allow"
100
- }
101
- }
102
- }
103
- }
104
- }
76
+ `createAgentWebVitePlugin` from `@agent-native/core/vite` writes these files during a production build. Add it to your Vite config with the pages agents should read:
77
+
78
+ ```ts
79
+ // vite.config.ts
80
+ import { defineConfig } from "vite";
81
+ import { createAgentWebVitePlugin } from "@agent-native/core/vite";
82
+
83
+ export default defineConfig({
84
+ plugins: [
85
+ // ...your existing plugins
86
+ createAgentWebVitePlugin({
87
+ siteName: "My Agent-Native App",
88
+ siteUrl: "https://example.com",
89
+ pages: [
90
+ {
91
+ path: "/pricing",
92
+ title: "Pricing",
93
+ description: "Plans and limits.",
94
+ markdown: "Plans and limits.\n",
95
+ },
96
+ ],
97
+ agentWeb: { crawlerPolicy: "discoverable-no-training" },
98
+ }),
99
+ ],
100
+ });
105
101
  ```
106
102
 
107
- For most apps, leave the defaults alone. If an app has any public route, `discoverable` defaults on. The default crawler policy is "discoverable, not trainable": search, user-triggered retrieval, coding agents, and autonomous browsing agents are allowed; training crawlers are disallowed.
103
+ The plugin publishes the pages you list and nothing else. It doesn't read your route access settings, and it doesn't read `agentWeb` from `package.json` unless you pass it in. To keep the settings in `package.json` under `agent-native.workspaceApp.agentWeb`, pass `agentWeb: agentWebConfigFromPackageJson(pkg)`, imported from `@agent-native/core/agent-web`.
104
+
105
+ | Option | Default | What it does |
106
+ | --------------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
107
+ | `discoverable` | On when `pages` isn't empty | `false` writes no files. |
108
+ | `llmsTxt` | `true` | Writes `/llms.txt` and `/llms-full.txt`. |
109
+ | `markdownTwins` | `true` | Writes a `.md` copy of each page that has `markdown`. |
110
+ | `crawlerPolicy` | `"discoverable-no-training"` | Sets the `robots.txt` rules: `"discoverable-no-training"`, `"allow-all"`, or `"disallow-all"`. |
111
+ | `crawlers` | None | Overrides individual crawler categories: `training`, `search`, `userTriggered`, `codingAgents`, or `autonomousAgents`, each `"allow"` or `"disallow"`. |
112
+
113
+ The default crawler policy is "discoverable, not trainable": search, user-triggered retrieval, coding agents, and autonomous browsing agents are allowed; training crawlers are disallowed.
114
+
115
+ `jsonLd`, `publicAgentCard`, and `publicMcp` are accepted, but nothing reads them yet. For JSON-LD, render `buildBaseJsonLd` and `buildPageJsonLd` from `@agent-native/core/agent-web` into your pages yourself.
108
116
 
109
117
  ## Route source of truth {#route-source}
110
118
 
111
- Agent Web discovery follows the route access model:
119
+ The page list is the source of truth: agents get the pages you pass, and only those. Build it from pages that are already public:
120
+
121
+ - In a public app, every route except `protectedPaths`.
122
+ - In an internal app, only `publicPaths`.
123
+ - Public share and form pages that agents should be able to read.
124
+ - Never submitted private data, authenticated dashboards, or user or org state, even when a nearby page is public.
112
125
 
113
- - Public apps expose every route except `protectedPaths`.
114
- - Internal apps expose only `publicPaths`.
115
- - Public share and form pages can be readable by agents.
116
- - Submitted private data, authenticated dashboards, and user/org state are never included just because a nearby page is public.
126
+ To start from your access settings, `deriveAgentWebPublicRoutes` from `@agent-native/core/agent-web` takes your app's `audience`, `publicPaths`, `protectedPaths`, and `routes`, and returns the routes those settings make public. Each page still needs its own title and Markdown.
117
127
 
118
128
  This keeps mixed apps natural. A forms app can expose a public form page and keep submissions private. A content app can expose published posts and keep the editor private. A docs site can expose everything except admin tools.
119
129
 
@@ -123,7 +133,7 @@ Public page access and public tool access are separate. A route being public onl
123
133
 
124
134
  <Callout id="doc-block-s50w8y" tone="warning">
125
135
 
126
- **A public page is not a public tool.** Making a route crawlable never exposes an action. Tool access requires an explicit `publicAgent.expose` opt-in on the action _and_ `publicMcp: true` on the app.
136
+ **A public page is not a public tool.** Making a route crawlable never exposes an action. Tool access requires an explicit `publicAgent.expose` opt-in on the action.
127
137
 
128
138
  </Callout>
129
139
 
@@ -151,7 +161,7 @@ To expose an action through a public agent protocol, the action must opt in:
151
161
  ]}
152
162
  />
153
163
 
154
- `agentWeb.publicMcp` stays `false` by default. When public MCP is enabled, the server should expose only actions with `publicAgent.expose === true`, and should still exclude consequential or write actions unless the action and auth policy explicitly allow them.
164
+ No `agentWeb` setting exposes an action, and `publicMcp` has no effect today. See [Expose to public agents](/docs/actions-access-control#public-agent) for what `publicAgent` opts an action into and the checks that still apply.
155
165
 
156
166
  ## Build-time files {#build-time}
157
167
 
@@ -186,7 +196,9 @@ const files = buildAgentWebStaticFiles({
186
196
  });
187
197
  ```
188
198
 
189
- Vite apps can use `createAgentWebVitePlugin` from `@agent-native/core/vite` to write those files into `public`, `dist`, `dist/client`, `dist/server/public`, or `build/client` during production builds.
199
+ `createAgentWebVitePlugin` calls `buildAgentWebStaticFiles` for you and writes the files into whichever of `public`, `dist`, `dist/client`, `dist/server/public`, and `build/client` exist. With another build tool, call the utilities directly.
200
+
201
+ Neither one answers `Accept: text/markdown` on a page's own URL: the Markdown copy is only at its `.md` URL. To answer that header, add a server route that returns the page's Markdown with the headers from `buildMarkdownResponseHeaders`, as the docs site does. Without that route, the audit below fails its `Accept: text/markdown` check.
190
202
 
191
203
  Pass `sitemapGroup` to `buildAgentWebStaticFiles` or `createAgentWebVitePlugin` to split a large sitemap. It maps each page to a group key, such as its locale, and `sitemap.xml` becomes a sitemap index with one `sitemap-<group>.xml` per group.
192
204
 
@@ -215,5 +227,5 @@ The audit exits non-zero if a required public surface is missing.
215
227
  ## What's next
216
228
 
217
229
  - [**Actions**](/docs/actions-overview) — how to opt actions into the public agent protocol
218
- - [**MCP Protocol**](/docs/mcp-protocol) — the MCP surface that `publicMcp: true` enables
230
+ - [**MCP Protocol**](/docs/mcp-protocol) — the MCP server external agents connect to
219
231
  - [**Deployment**](/docs/deployment) — where these static files are written during builds
@@ -537,6 +537,20 @@ The default `/_agent-native/google/auth-url` route does this automatically — o
537
537
  | `ACCESS_TOKENS` | Comma-separated static bearer fallbacks for MCP/connect clients; not browser auth |
538
538
  | `A2A_SECRET` | Shared secret for JWT-signed A2A cross-app identity verification and, when present, MCP OAuth access-token signing |
539
539
 
540
+ ## Auth page customization
541
+
542
+ The Chat template sets `marketing: false` in `server/plugins/auth.ts`. Replace it with a marketing object to enable the panel. It appears below the form on mobile. `AuthMarketingProps` describes the rendered page props, while the plugin accepts the `marketing` fields shown below. `authHeadHtml` appends trusted app-authored HTML after the built-in styles. Do not pass user input to it.
543
+
544
+ ```ts filename="server/plugins/auth.ts"
545
+ import { createToolkitAuthPlugin } from "@agent-native/toolkit/app/auth/server";
546
+
547
+ export default createToolkitAuthPlugin({
548
+ rootAuth: true,
549
+ marketing: { appName: "My app", tagline: "Make work easier" },
550
+ authHeadHtml: "<style>.auth-root { font-family: sans-serif; }</style>",
551
+ });
552
+ ```
553
+
540
554
  ## What's next
541
555
 
542
556
  - [**Organizations, Teams & Permissions**](/docs/organizations-teams-permissions) — the org-role vs. resource-role RBAC model, and a practical multi-user setup sequence
@@ -202,6 +202,8 @@ sendToAgentChat({
202
202
  });
203
203
  ```
204
204
 
205
+ `sendToAgentChat()` returns a tab ID, not a delivery receipt. For a local submitted message that must be acknowledged, use `sendToAgentChatAndConfirm({ message, chatTarget: "local" })` and handle `delivered: false` and its `reason`. It waits for the local chat to acknowledge submission and cancels a timed-out submission. This helper does not support draft-only or code-target requests.
206
+
205
207
  ### AgentChatMessage {#agentchatmessage}
206
208
 
207
209
  | Option | Type | Description |
@@ -53,6 +53,8 @@ This page covers client routes, the pages rendered in the browser from `app/rout
53
53
 
54
54
  </Diagram>
55
55
 
56
+ In Chat, `rootAuth: true` can serve the sign-in page at `/` before React Router reaches `_index.tsx`, depending on the configured home path. Change the auth plugin when customizing that response.
57
+
56
58
  ## File-based routing {#file-based-routing}
57
59
 
58
60
  ### File → URL mapping
@@ -34,7 +34,7 @@ it. Use that name wherever a step below says APP_NAME.
34
34
  --standalone --template chat
35
35
  3. In the new APP_NAME folder, run `pnpm install`.
36
36
  4. Read APP_NAME/AGENTS.md so you know how the app is laid out.
37
- 5. Start the app with `pnpm dev` and keep it running in the background.
37
+ 5. Start the app with `pnpm dev --no-open` and keep it running in the background.
38
38
  6. Read the local URL that `pnpm dev` prints. Check that it responds,
39
39
  for example with `curl -I <url>`. Do not open a browser and do not
40
40
  use headless browser tools. I will open the app myself.
@@ -28,6 +28,8 @@ typed/JSON config and also becomes part of the public browser bundle. Do not
28
28
  create another standalone Vite-prefixed or Agent-Native-prefixed variable for
29
29
  a public setting already represented by the config guide.
30
30
 
31
+ To select OpenRouter explicitly, set `AGENT_ENGINE=ai-sdk:openrouter` and configure its credential through a [workspace connection](/docs/workspace-connections). Model IDs use the provider/model form.
32
+
31
33
  ## Start with Agent-Native app configuration
32
34
 
33
35
  The typed config is the primary documentation and default source for public
@@ -506,18 +506,17 @@ The gallery above describes _what_ an extension does. Slots describe _where_ it
506
506
 
507
507
  By default, an extension lives on its own page in the Extensions list — open it like a small app. That's fine for dashboards, calculators, and standalone widgets.
508
508
 
509
- But the most QBO-shaped use case is different: the user wants their widget pinned _inside_ the template's UI — under the contact info in Mail's sidebar, in the corner of an Analytics dashboard, on the right side of a Calendar event. That's what **slots** are for.
509
+ Named slots exist where the host app renders `<ExtensionSlot>` and supplies its current-page context. Slot targets and installs connect extensions to those existing locations. They do not create a panel, tab, or route.
510
510
 
511
- A slot is a named widget area a template ships:
511
+ A slot is a named widget area the host app places in its UI:
512
512
 
513
- | Template | Example slot | Where it shows up |
514
- | ------------- | ------------------------------ | -------------------------------------------- |
515
- | **Mail** | `mail.contact-sidebar.bottom` | Below the contact info on every email thread |
516
- | **Analytics** | `analytics.dashboard.tiles` | Alongside the dashboard's built-in panels |
517
- | **Calendar** | `calendar.event-detail.bottom` | Below the open event |
518
- | **Clips** | `clips.right-panel.tabs` | A new tab in the clip review panel |
513
+ | Template | Example slot | Where it shows up |
514
+ | ------------ | ------------------------------ | -------------------------------------------- |
515
+ | **Mail** | `mail.contact-sidebar.bottom` | Below the contact info on every email thread |
516
+ | **Calendar** | `calendar.event-detail.bottom` | Below the open event |
517
+ | **Content** | `content.sidebar.bottom` | At the bottom of the document sidebar |
519
518
 
520
- When an extension is **installed into a slot**, the host pushes the relevant context — the contact's email, the dashboard id, the event id — into the iframe. The extension reads `window.slotContext` to know what the user is looking at.
519
+ When an extension is **installed into a slot**, the host pushes its chosen context, such as a contact email, event id, or document id, into the iframe. The extension reads `window.slotContext` to know what the user is looking at.
521
520
 
522
521
  <Diagram id="doc-block-18p3btl" title="Slots push context into the widget" summary={"The host template owns named slots; installing an extension into one feeds it window.slotContext for whatever the user is currently viewing."}>
523
522
 
@@ -166,6 +166,14 @@ invalid document ID. Verify the link and connected account's access before
166
166
  changing permissions. Reinstalling the connector or changing the public share
167
167
  link does not resolve a confirmed account permission denial.
168
168
 
169
+ Images uploaded into a private document are stored in its body as
170
+ `/api/private-media/<id>` links, which load only with a Content sign-in.
171
+ When an agent reads the document over MCP, `get-document`, and `pull-document`
172
+ in Markdown, also return `privateMediaLinks`: each stored link paired with a
173
+ URL that opens that one image without signing in, for one hour. One read links
174
+ at most 200 images; `omitted` counts the rest. Read the document again for
175
+ fresh links. Keep the stored links when editing the body.
176
+
169
177
  <a id="access-tab"></a>
170
178
 
171
179
  ### The in-app MCP setting {#mcp-settings}
@@ -11,6 +11,8 @@ before starting, and check remote deployment settings separately: the CLI can
11
11
  read local environment files, but it cannot inspect remote environments or
12
12
  database-backed feature settings.
13
13
 
14
+ Desktop GitHub releases use their own `v` tags. They do not identify the published `@agent-native/core` npm version. Run `npm view @agent-native/core version` for the latest published Core version and `npm ls @agent-native/core` for the installed version.
15
+
14
16
  ## 1. Preview the upgrade and import codemods
15
17
 
16
18
  Use the CLI shipped with Core 0.198.0 so it loads that release's migration
@@ -23,6 +23,8 @@ Node.js `22.22+` is required.
23
23
  You also need a Vercel account. Run the commands in this guide on your own
24
24
  computer. The Vercel CLI uploads the finished build to Vercel for you.
25
25
 
26
+ Agent turns are subject to Vercel Function duration limits, including streamed response time. Configure the project’s Function Max Duration and check the effective deployment settings and [Vercel limits](https://vercel.com/docs/functions/configuring-functions/duration). A longer limit does not guarantee a turn completes.
27
+
26
28
  ## Step 1: Create the app
27
29
 
28
30
  Create your new standalone app. The example below creates an app from the Chat
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.227.0-nightly-20261110032437",
3
+ "version": "0.227.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": {
@@ -769,8 +769,8 @@
769
769
  "yaml": "^2.9.0",
770
770
  "yjs": "^13.6.33",
771
771
  "zod": "^4.3.6",
772
- "@agent-native/agentkit": "^0.227.0-nightly-20261110032437",
773
- "@agent-native/recap-cli": "^0.5.99"
772
+ "@agent-native/agentkit": "^0.227.0",
773
+ "@agent-native/recap-cli": "^0.5.100"
774
774
  },
775
775
  "devDependencies": {
776
776
  "@ai-sdk/anthropic": "^3.0.71",
@@ -843,7 +843,7 @@
843
843
  "xlsx": "^0.18.5"
844
844
  },
845
845
  "peerDependencies": {
846
- "@agent-native/core-corpus": "0.227.0-nightly-20261110032437",
846
+ "@agent-native/core-corpus": ">=0.196.0",
847
847
  "@ai-sdk/anthropic": ">=3",
848
848
  "@ai-sdk/cohere": ">=3",
849
849
  "@ai-sdk/google": ">=3",
@@ -41,7 +41,7 @@
41
41
  -Choose the primary workflow and route before editing. Add a domain route under `app/routes/` and set `app.homePath` in `server/plugins/agent-native-email-branding.ts` with `defineAppConfig`. The default Get started page lives at `/home`, and Chat stays at `/chat`; edit `app/routes/home.tsx` when replacing that page with a domain-specific home. Add a static link in `app/components/layout/Sidebar.tsx` before `ChatThreadsSection`; `Header.tsx` uses `APP_TITLE` elsewhere. Shared sidebar and AgentInspector remain.
42
42
  +Choose the primary workflow and route before editing. Build on the blank canvas in `app/routes/_index.tsx` or add domain routes under `app/routes/`. This starter has no Chat route, sidebar, header, or agent rail; add only the navigation the product needs. Set `app.homePath` in the existing `defineAppConfig` in `server/plugins/config.ts` as `DEVELOPING.md` describes.
43
43
 
44
- -Use `adding-a-feature` for functional parity and `frontend-design` for a user-facing screen. Keep feature guidance here; do not rewrite `README.md` or `DESIGN.md`. After all edits, run one typecheck, one doctor check, and one browser smoke of the primary workflow, including overlap rejection, cancellation freeing the slot, and authenticated landing. Skip production build and extra test suites.
44
+ -Use `adding-a-feature` for functional parity and `frontend-design` for a user-facing screen. Keep feature guidance here; do not rewrite `README.md` or `DESIGN.md`. After all edits, run one typecheck, one doctor check, and one browser smoke of the primary workflow and its authenticated landing. Skip production build and extra test suites.
45
45
  +Use `adding-a-feature` for functional parity and `frontend-design` for a user-facing screen. Keep feature guidance here and update `README.md` as `DEVELOPING.md` describes. After all edits, run one typecheck, one doctor check, and one browser smoke of the primary workflow and its authenticated landing. Skip production build and extra test suites.
46
46
 
47
47
  Before building common workspace or agent UI, read `agent-native-toolkit`; for supported customization, read `customizing-agent-native`.
@@ -1,13 +1,14 @@
1
1
  ===================================================================
2
2
  --- a/server/plugins/auth.ts
3
3
  +++ b/server/plugins/auth.ts
4
- @@ -1,7 +1,8 @@
4
+ @@ -1,8 +1,8 @@
5
5
  -import { createToolkitAuthPlugin } from "@agent-native/toolkit/app/auth/server";
6
6
  +import { createAuthPlugin } from "@agent-native/core/server";
7
7
 
8
8
  -export default createToolkitAuthPlugin({
9
9
  - workspaceAppPublicPaths: ["/"],
10
10
  - rootAuth: true,
11
+ - // Remove this option to use built-in marketing, or supply an object for custom copy.
11
12
  - marketing: false,
12
13
  +// Email/password auth with optional Google OAuth (enabled automatically when
13
14
  +// GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET are set). No marketing copy — a
@@ -26,6 +26,6 @@ For custom branding, keep `server/plugins/agent-native-email-branding.ts` aligne
26
26
 
27
27
  Choose the primary workflow and route before editing. Add a domain route under `app/routes/` and set `app.homePath` in `server/plugins/agent-native-email-branding.ts` with `defineAppConfig`. The default Get started page lives at `/home`, and Chat stays at `/chat`; edit `app/routes/home.tsx` when replacing that page with a domain-specific home. Add a static link in `app/components/layout/Sidebar.tsx` before `ChatThreadsSection`; `Header.tsx` uses `APP_TITLE` elsewhere. Shared sidebar and AgentInspector remain.
28
28
 
29
- Use `adding-a-feature` for functional parity and `frontend-design` for a user-facing screen. Keep feature guidance here; do not rewrite `README.md` or `DESIGN.md`. After all edits, run one typecheck, one doctor check, and one browser smoke of the primary workflow, including overlap rejection, cancellation freeing the slot, and authenticated landing. Skip production build and extra test suites.
29
+ Use `adding-a-feature` for functional parity and `frontend-design` for a user-facing screen. Keep feature guidance here; do not rewrite `README.md` or `DESIGN.md`. After all edits, run one typecheck, one doctor check, and one browser smoke of the primary workflow and its authenticated landing. Skip production build and extra test suites.
30
30
 
31
31
  Before building common workspace or agent UI, read `agent-native-toolkit`; for supported customization, read `customizing-agent-native`.
@@ -403,7 +403,7 @@ export function Sidebar({
403
403
  <nav
404
404
  aria-label={t("navigation.navigation")}
405
405
  className={cn(
406
- "flex min-h-0 flex-1 flex-col",
406
+ "flex min-h-0 flex-1 flex-col overflow-y-auto",
407
407
  collapsed ? "items-center gap-1 px-1 py-2" : "pt-1",
408
408
  )}
409
409
  >
@@ -9,7 +9,7 @@ loadEnv();
9
9
 
10
10
  async function main(): Promise<void> {
11
11
  await withMigrationRuntime(async () => {
12
- await runFrameworkReleaseMigrations(null);
12
+ await runFrameworkReleaseMigrations(null, { requirePostgres: true });
13
13
  await runAppReleaseMigrations();
14
14
  });
15
15
  }
@@ -3,5 +3,6 @@ import { createToolkitAuthPlugin } from "@agent-native/toolkit/app/auth/server";
3
3
  export default createToolkitAuthPlugin({
4
4
  workspaceAppPublicPaths: ["/"],
5
5
  rootAuth: true,
6
+ // Remove this option to use built-in marketing, or supply an object for custom copy.
6
7
  marketing: false,
7
8
  });
@@ -2,47 +2,6 @@ overrides:
2
2
  "@assistant-ui/store": ">=0.2.9 <0.2.14"
3
3
  "@assistant-ui/tap": "^0.5.14"
4
4
  nf3: "0.3.17"
5
- "@tiptap/core": "3.28.0"
6
- "@tiptap/extension-blockquote": "3.28.0"
7
- "@tiptap/extension-bold": "3.28.0"
8
- "@tiptap/extension-bubble-menu": "3.28.0"
9
- "@tiptap/extension-bullet-list": "3.28.0"
10
- "@tiptap/extension-code": "3.28.0"
11
- "@tiptap/extension-code-block": "3.28.0"
12
- "@tiptap/extension-code-block-lowlight": "3.28.0"
13
- "@tiptap/extension-collaboration": "3.28.0"
14
- "@tiptap/extension-collaboration-caret": "3.28.0"
15
- "@tiptap/extension-color": "3.28.0"
16
- "@tiptap/extension-document": "3.28.0"
17
- "@tiptap/extension-dropcursor": "3.28.0"
18
- "@tiptap/extension-floating-menu": "3.28.0"
19
- "@tiptap/extension-gapcursor": "3.28.0"
20
- "@tiptap/extension-hard-break": "3.28.0"
21
- "@tiptap/extension-heading": "3.28.0"
22
- "@tiptap/extension-horizontal-rule": "3.28.0"
23
- "@tiptap/extension-image": "3.28.0"
24
- "@tiptap/extension-italic": "3.28.0"
25
- "@tiptap/extension-link": "3.28.0"
26
- "@tiptap/extension-list": "3.28.0"
27
- "@tiptap/extension-list-item": "3.28.0"
28
- "@tiptap/extension-list-keymap": "3.28.0"
29
- "@tiptap/extension-ordered-list": "3.28.0"
30
- "@tiptap/extension-paragraph": "3.28.0"
31
- "@tiptap/extension-placeholder": "3.28.0"
32
- "@tiptap/extension-strike": "3.28.0"
33
- "@tiptap/extension-table": "3.28.0"
34
- "@tiptap/extension-table-cell": "3.28.0"
35
- "@tiptap/extension-table-header": "3.28.0"
36
- "@tiptap/extension-table-row": "3.28.0"
37
- "@tiptap/extension-task-item": "3.28.0"
38
- "@tiptap/extension-task-list": "3.28.0"
39
- "@tiptap/extension-text": "3.28.0"
40
- "@tiptap/extension-text-style": "3.28.0"
41
- "@tiptap/extension-underline": "3.28.0"
42
- "@tiptap/extensions": "3.28.0"
43
- "@tiptap/pm": "3.28.0"
44
- "@tiptap/react": "3.28.0"
45
- "@tiptap/starter-kit": "3.28.0"
46
5
 
47
6
  allowBuilds:
48
7
  esbuild: true
@@ -9,7 +9,7 @@ loadEnv();
9
9
 
10
10
  async function main(): Promise<void> {
11
11
  await withMigrationRuntime(async () => {
12
- await runFrameworkReleaseMigrations(null);
12
+ await runFrameworkReleaseMigrations(null, { requirePostgres: true });
13
13
  await runAppReleaseMigrations();
14
14
  });
15
15
  }
@@ -27,47 +27,6 @@ overrides:
27
27
  esbuild: "^0.28.1"
28
28
  srvx: "^0.12.4"
29
29
  zod: "^4.4.3"
30
- "@tiptap/core": "3.28.0"
31
- "@tiptap/extension-blockquote": "3.28.0"
32
- "@tiptap/extension-bold": "3.28.0"
33
- "@tiptap/extension-bubble-menu": "3.28.0"
34
- "@tiptap/extension-bullet-list": "3.28.0"
35
- "@tiptap/extension-code": "3.28.0"
36
- "@tiptap/extension-code-block": "3.28.0"
37
- "@tiptap/extension-code-block-lowlight": "3.28.0"
38
- "@tiptap/extension-collaboration": "3.28.0"
39
- "@tiptap/extension-collaboration-caret": "3.28.0"
40
- "@tiptap/extension-color": "3.28.0"
41
- "@tiptap/extension-document": "3.28.0"
42
- "@tiptap/extension-dropcursor": "3.28.0"
43
- "@tiptap/extension-floating-menu": "3.28.0"
44
- "@tiptap/extension-gapcursor": "3.28.0"
45
- "@tiptap/extension-hard-break": "3.28.0"
46
- "@tiptap/extension-heading": "3.28.0"
47
- "@tiptap/extension-horizontal-rule": "3.28.0"
48
- "@tiptap/extension-image": "3.28.0"
49
- "@tiptap/extension-italic": "3.28.0"
50
- "@tiptap/extension-link": "3.28.0"
51
- "@tiptap/extension-list": "3.28.0"
52
- "@tiptap/extension-list-item": "3.28.0"
53
- "@tiptap/extension-list-keymap": "3.28.0"
54
- "@tiptap/extension-ordered-list": "3.28.0"
55
- "@tiptap/extension-paragraph": "3.28.0"
56
- "@tiptap/extension-placeholder": "3.28.0"
57
- "@tiptap/extension-strike": "3.28.0"
58
- "@tiptap/extension-table": "3.28.0"
59
- "@tiptap/extension-table-cell": "3.28.0"
60
- "@tiptap/extension-table-header": "3.28.0"
61
- "@tiptap/extension-table-row": "3.28.0"
62
- "@tiptap/extension-task-item": "3.28.0"
63
- "@tiptap/extension-task-list": "3.28.0"
64
- "@tiptap/extension-text": "3.28.0"
65
- "@tiptap/extension-text-style": "3.28.0"
66
- "@tiptap/extension-underline": "3.28.0"
67
- "@tiptap/extensions": "3.28.0"
68
- "@tiptap/pm": "3.28.0"
69
- "@tiptap/react": "3.28.0"
70
- "@tiptap/starter-kit": "3.28.0"
71
30
 
72
31
  packageExtensions:
73
32
  "node-pty@*":