@agent-native/core 0.146.0 → 0.146.1

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 (112) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/turn-into-app/SKILL.md +4 -0
  3. package/corpus/templates/analytics/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  4. package/corpus/templates/analytics/actions/compose-dashboard.ts +2 -27
  5. package/corpus/templates/analytics/actions/get-sql-dashboard.ts +7 -8
  6. package/corpus/templates/analytics/actions/migrate-first-party-analytics-to-bigquery.ts +18 -2
  7. package/corpus/templates/analytics/actions/mutate-dashboard.ts +16 -24
  8. package/corpus/templates/analytics/actions/rename-dashboard.ts +2 -24
  9. package/corpus/templates/analytics/actions/reorder-dashboard-panels.ts +2 -24
  10. package/corpus/templates/analytics/actions/restore-dashboard-revision.ts +2 -25
  11. package/corpus/templates/analytics/actions/update-dashboard.ts +4 -32
  12. package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +1 -40
  13. package/corpus/templates/analytics/changelog/2026-08-07-language-selection-now-lives-in-settings-instead-of-the-comm.md +6 -0
  14. package/corpus/templates/analytics/netlify.toml +7 -0
  15. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +13 -13
  16. package/corpus/templates/analytics/server/jobs/analytics-bigquery-backfill.ts +4 -2
  17. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +0 -35
  18. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +5 -3
  19. package/corpus/templates/analytics/server/lib/dashboard-collab-sync.ts +77 -0
  20. package/corpus/templates/analytics/server/lib/demo-dashboards.ts +2 -23
  21. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +28 -74
  22. package/corpus/templates/analytics/server/routes/api/dashboard-agent-context.json.get.ts +5 -9
  23. package/corpus/templates/assets/.agents/skills/turn-into-app/SKILL.md +4 -0
  24. package/corpus/templates/assets/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  25. package/corpus/templates/brain/.agents/skills/turn-into-app/SKILL.md +4 -0
  26. package/corpus/templates/brain/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  27. package/corpus/templates/calendar/.agents/skills/turn-into-app/SKILL.md +4 -0
  28. package/corpus/templates/calendar/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  29. package/corpus/templates/chat/.agents/skills/turn-into-app/SKILL.md +4 -0
  30. package/corpus/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  31. package/corpus/templates/clips/.agents/skills/turn-into-app/SKILL.md +4 -0
  32. package/corpus/templates/clips/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  33. package/corpus/templates/clips/app/components/player/video-player.tsx +1 -1
  34. package/corpus/templates/clips/changelog/2026-08-07-fixed-trimmed-clips-durations-so-the-main-player-display-mat.md +6 -0
  35. package/corpus/templates/clips/chrome-extension/STORE_DRAFT.md +1 -1
  36. package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
  37. package/corpus/templates/content/.agents/skills/turn-into-app/SKILL.md +4 -0
  38. package/corpus/templates/content/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  39. package/corpus/templates/crm/.agents/skills/turn-into-app/SKILL.md +4 -0
  40. package/corpus/templates/crm/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  41. package/corpus/templates/design/.agents/skills/turn-into-app/SKILL.md +4 -0
  42. package/corpus/templates/design/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  43. package/corpus/templates/dispatch/.agents/skills/turn-into-app/SKILL.md +4 -0
  44. package/corpus/templates/dispatch/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  45. package/corpus/templates/dispatch/changelog/2026-08-07-language-selection-now-lives-in-settings-instead-of-the-disp.md +6 -0
  46. package/corpus/templates/factory/.agents/skills/turn-into-app/SKILL.md +4 -0
  47. package/corpus/templates/factory/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  48. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +59 -22
  49. package/corpus/templates/forms/.agents/skills/turn-into-app/SKILL.md +4 -0
  50. package/corpus/templates/forms/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  51. package/corpus/templates/macros/.agents/skills/turn-into-app/SKILL.md +4 -0
  52. package/corpus/templates/macros/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  53. package/corpus/templates/mail/.agents/skills/turn-into-app/SKILL.md +4 -0
  54. package/corpus/templates/mail/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  55. package/corpus/templates/plan/.agents/skills/turn-into-app/SKILL.md +4 -0
  56. package/corpus/templates/plan/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  57. package/corpus/templates/slides/.agents/skills/image-generation-via-a2a/SKILL.md +10 -1
  58. package/corpus/templates/slides/.agents/skills/slide-images/SKILL.md +10 -3
  59. package/corpus/templates/slides/.agents/skills/turn-into-app/SKILL.md +4 -0
  60. package/corpus/templates/slides/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  61. package/corpus/templates/slides/actions/generate-image-api.ts +123 -0
  62. package/corpus/templates/slides/app/components/deck/DeckCard.tsx +10 -2
  63. package/corpus/templates/slides/app/components/editor/ImageGenPanel.tsx +1 -1
  64. package/corpus/templates/slides/changelog/2026-08-07-deleting-a-deck-no-longer-freezes-the-slides-browser.md +6 -0
  65. package/corpus/templates/slides/changelog/2026-08-07-slides-verify-generated-images-are-persisted-on-the-target-s.md +6 -0
  66. package/corpus/templates/slides/server/lib/slide-image-insertion.ts +141 -0
  67. package/corpus/templates/slides/server/plugins/agent-chat.ts +2 -0
  68. package/corpus/templates/tasks/.agents/skills/turn-into-app/SKILL.md +4 -0
  69. package/corpus/templates/tasks/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  70. package/dist/client/AgentPanel.d.ts +10 -4
  71. package/dist/client/AgentPanel.js +29 -82
  72. package/dist/collab/awareness.d.ts +2 -2
  73. package/dist/collab/struct-routes.d.ts +1 -1
  74. package/dist/db/migrations.js +22 -4
  75. package/dist/deploy/build.d.ts +1 -0
  76. package/dist/deploy/build.js +27 -22
  77. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  78. package/dist/notifications/routes.d.ts +1 -1
  79. package/dist/observability/routes.d.ts +1 -1
  80. package/dist/resources/handlers.d.ts +1 -1
  81. package/dist/server/builder-browser.d.ts +34 -0
  82. package/dist/server/builder-browser.js +179 -0
  83. package/dist/server/core-routes-plugin.d.ts +5 -0
  84. package/dist/server/core-routes-plugin.js +24 -8
  85. package/dist/server/index.d.ts +1 -1
  86. package/dist/server/index.js +1 -1
  87. package/dist/shared/cache-control.d.ts +2 -2
  88. package/dist/shared/cache-control.js +2 -2
  89. package/dist/templates/chat/.agents/skills/turn-into-app/SKILL.md +4 -0
  90. package/dist/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  91. package/dist/templates/default/.agents/skills/turn-into-app/SKILL.md +4 -0
  92. package/dist/templates/default/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  93. package/dist/templates/headless/.agents/skills/turn-into-app/SKILL.md +4 -0
  94. package/dist/templates/headless/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  95. package/dist/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +4 -0
  96. package/dist/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  97. package/dist/vite/client.js +13 -1
  98. package/docs/content/drop-in-agent.mdx +3 -3
  99. package/docs/content/getting-started-actions.mdx +1 -2
  100. package/docs/content/getting-started-pages.mdx +1 -2
  101. package/docs/content/getting-started.mdx +0 -4
  102. package/docs/content/what-is-agent-native.mdx +4 -4
  103. package/package.json +3 -3
  104. package/src/templates/chat/.agents/skills/turn-into-app/SKILL.md +4 -0
  105. package/src/templates/chat/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  106. package/src/templates/default/.agents/skills/turn-into-app/SKILL.md +4 -0
  107. package/src/templates/default/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  108. package/src/templates/headless/.agents/skills/turn-into-app/SKILL.md +4 -0
  109. package/src/templates/headless/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  110. package/src/templates/workspace-core/.agents/skills/turn-into-app/SKILL.md +4 -0
  111. package/src/templates/workspace-core/.agents/skills/turn-into-app/references/fresh-project.md +8 -0
  112. package/docs/content/getting-started-database.mdx +0 -173
@@ -2406,9 +2406,17 @@ function getConfiguredAppBasePath() {
2406
2406
  return { appBasePath, base };
2407
2407
  }
2408
2408
  function createNitroDevPlugin(options, appBasePath) {
2409
+ const nitroOptions = options.nitro ?? {};
2409
2410
  return nitroVitePlugin({
2410
2411
  serverDir: "./server",
2411
- ...(options.nitro ?? {}),
2412
+ ...nitroOptions,
2413
+ replace: {
2414
+ ...nitroOptions.replace,
2415
+ // Netlify's netlify.toml environment is available to the build but not
2416
+ // injected into deployed Functions. Nitro is a separate server build,
2417
+ // so it needs the release ownership decision in its own replacement map.
2418
+ "process.env.AGENT_NATIVE_RELEASE_MIGRATIONS": JSON.stringify(process.env.AGENT_NATIVE_RELEASE_MIGRATIONS?.trim() || ""),
2419
+ },
2412
2420
  // Never auto-load test files as server handlers/plugins/middleware.
2413
2421
  // Nitro scans server/{plugins,middleware,routes,api}/*; a co-located
2414
2422
  // *.spec.ts would otherwise be loaded at runtime and crash the server
@@ -2739,6 +2747,10 @@ function createAgentNativeConfig(options = {}, command, userConfig = {}, mode =
2739
2747
  __AGENT_NATIVE_APP_CONFIG__: JSON.stringify(appConfig),
2740
2748
  __AGENT_NATIVE_BUILD_GA_MEASUREMENT_ID__: JSON.stringify(process.env.GA_MEASUREMENT_ID?.trim() || ""),
2741
2749
  "process.env.AGENT_NATIVE_BUILD_GA_MEASUREMENT_ID": JSON.stringify(process.env.GA_MEASUREMENT_ID?.trim() || ""),
2750
+ // The release migration owner is configured at build time. Netlify's
2751
+ // netlify.toml environment is available to the build but not injected
2752
+ // into deployed Functions, so embed the decision in the server bundle.
2753
+ "process.env.AGENT_NATIVE_RELEASE_MIGRATIONS": JSON.stringify(process.env.AGENT_NATIVE_RELEASE_MIGRATIONS?.trim() || ""),
2742
2754
  __AGENT_NATIVE_BUILD_GTM_CONTAINER_ID__: JSON.stringify(process.env.GTM_CONTAINER_ID?.trim() || ""),
2743
2755
  "process.env.AGENT_NATIVE_BUILD_GTM_CONTAINER_ID": JSON.stringify(process.env.GTM_CONTAINER_ID?.trim() || ""),
2744
2756
  // Framework route warmup controls how SSR `.data` routes are fetched:
@@ -142,11 +142,11 @@ children stays in the main app area. The agent chat is the side panel.
142
142
  ]}
143
143
  />
144
144
 
145
- That's it. The user now has a toggleable agent on every page — with chat history, resources tab, CLI terminal, voice input, and a fullscreen mode. State persists across reloads via `localStorage`.
145
+ That's it. The user now has a toggleable agent on every page — with chat history, resources tab, CLI terminal, voice input, and a wider drawer. State persists across reloads via `localStorage`.
146
146
 
147
147
  ### Props
148
148
 
149
- - **`children`** — your app's normal layout and routes. Rendered in the main area; the agent panel mounts beside it on desktop and over it on mobile/fullscreen.
149
+ - **`children`** — your app's normal layout and routes. Rendered in the main area; the agent panel mounts beside it on desktop and over it on mobile.
150
150
  - **`emptyStateText`** — greeting shown when the chat has no messages. Default: `"How can I help you?"`.
151
151
  - **`suggestions`** — starter prompts rendered as clickable chips when empty.
152
152
  - **`dynamicSuggestions`** — context-aware prompt chips merged with `suggestions`. Enabled by default; pass `false` to show only static suggestions, or `{ max, includeStatic, getSuggestions }` to customize.
@@ -177,7 +177,7 @@ export default function AgentRoute() {
177
177
  - **`defaultMode`** — `"chat"` or `"cli"`. Default: `"chat"`.
178
178
  - **`className`** — CSS class for the outer container.
179
179
  - **`onCollapse`** — if provided, a collapse button appears in the header.
180
- - **`isFullscreen`** / **`onToggleFullscreen`** — wire up external fullscreen state if you want a Claude-style centered column.
180
+ - **`isFullscreen`** — set this when you want a Claude-style centered column for a page-level or custom panel surface. The sidebar uses the wider drawer instead.
181
181
  - **`storageKey`** — namespace for `localStorage` keys. Useful when you render multiple panels (different app instances or workspaces) in the same page.
182
182
 
183
183
  Full props: `AgentPanelProps` in `@agent-native/core/client`.
@@ -89,5 +89,4 @@ custom native components, see [Native Chat UI](/docs/native-chat-ui).
89
89
  ## Continue
90
90
 
91
91
  Continue with [Add a Page](/docs/getting-started-pages) to use the same action
92
- outside the transcript. When results need to survive conversations, return to
93
- [Persist Data in SQL](/docs/getting-started-database).
92
+ outside the transcript.
@@ -71,6 +71,5 @@ patterns, see [Context Awareness](/docs/context-awareness).
71
71
  ## Continue
72
72
 
73
73
  You've built a chat app with an action and a page that calls the same source of
74
- truth. Continue with [Persist Data in SQL](/docs/getting-started-database) when
75
- results need to persist, or explore [Key Concepts](/docs/key-concepts) and
74
+ truth. Continue with [Key Concepts](/docs/key-concepts) or
76
75
  [Agent Surfaces](/docs/agent-surfaces).
@@ -26,10 +26,6 @@ Define a typed text analyzer and render its result as a chart in the chat.
26
26
 
27
27
  Build a React route that calls the same action outside the transcript.
28
28
 
29
- ### Persist data in SQL (optional)
30
-
31
- Add a table and persistence actions when results need to survive conversations.
32
-
33
29
  </Steps>
34
30
 
35
31
  ## 1. Create a chat app {#create-your-app}
@@ -79,10 +79,10 @@ Every operation is defined as a typed **action**: a name, a schema, and a `run`
79
79
 
80
80
  ```mermaid
81
81
  graph TD
82
- UI_IN["👤 Click a button"]
83
- AG_IN["🤖 Type a message to the agent"]
84
- ACTION["⚡ Same typed action"]
85
- DB["🗄️ Shared database"]
82
+ UI_IN["Click a button"]
83
+ AG_IN["Type a message to the agent"]
84
+ ACTION["Same typed action"]
85
+ DB["Shared database"]
86
86
  UI_OUT["UI updates instantly"]
87
87
  AG_OUT["Agent sees the change"]
88
88
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.146.0",
3
+ "version": "0.146.1",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -412,8 +412,8 @@
412
412
  "y-protocols": "^1.0.7",
413
413
  "yjs": "^13.6.31",
414
414
  "zod": "^4.3.6",
415
- "@agent-native/toolkit": "^0.13.4",
416
- "@agent-native/recap-cli": "0.5.3"
415
+ "@agent-native/recap-cli": "0.5.3",
416
+ "@agent-native/toolkit": "^0.13.4"
417
417
  },
418
418
  "devDependencies": {
419
419
  "@ai-sdk/anthropic": "^3.0.71",
@@ -27,6 +27,10 @@ The build location depends on the host. Treat this as a hard routing rule:
27
27
  `resourceIds` when available. This is the Builder handoff.
28
28
  - Do not substitute the generic `create_workspace_app` MCP tool in an online
29
29
  host. That tool is a local workspace scaffolder, not the Builder handoff.
30
+ - Connect the Agent-Native Dispatch MCP connector only. Dispatch uses the
31
+ authenticated Builder Projects API to reuse or provision the workspace
32
+ project before starting the Builder Cloud Agent; a separate Builder CMS MCP
33
+ connection is not required for this workflow.
30
34
  - If `start-workspace-app-creation` is not available or Dispatch is not
31
35
  authenticated, stop with the connector setup needed. Do not fall back to a
32
36
  local build or claim that the app exists.
@@ -50,6 +50,14 @@ skills. For a ChatGPT Project or any host that exposes only the MCP connector,
50
50
  also place the skill instructions or this reference in the Project
51
51
  instructions/knowledge files. Then add and authenticate the Dispatch MCP
52
52
  connector from the packaged `adapters/chatgpt-mcp/connector.json`.
53
+ This single connector is enough: Dispatch provisions or reuses the Builder
54
+ project through the Builder Projects API, so do not ask the user to add a
55
+ separate Builder CMS MCP for app creation.
56
+ Builder's separate Fusion MCP is available as a custom remote connector at
57
+ `https://mcp.builder.io/mcp/fusion` for direct Builder work. It can run an
58
+ existing project, but it cannot provision the repo-backed Agent-Native
59
+ workspace project, so it is optional and not a replacement for the Dispatch
60
+ handoff in this skill. Do not add Builder's CMS MCP for this workflow.
53
61
 
54
62
  For Claude Web, ChatGPT Web, and their web Projects, the host is an
55
63
  orchestrator, not the build environment. After forming the source brief, call
@@ -27,6 +27,10 @@ The build location depends on the host. Treat this as a hard routing rule:
27
27
  `resourceIds` when available. This is the Builder handoff.
28
28
  - Do not substitute the generic `create_workspace_app` MCP tool in an online
29
29
  host. That tool is a local workspace scaffolder, not the Builder handoff.
30
+ - Connect the Agent-Native Dispatch MCP connector only. Dispatch uses the
31
+ authenticated Builder Projects API to reuse or provision the workspace
32
+ project before starting the Builder Cloud Agent; a separate Builder CMS MCP
33
+ connection is not required for this workflow.
30
34
  - If `start-workspace-app-creation` is not available or Dispatch is not
31
35
  authenticated, stop with the connector setup needed. Do not fall back to a
32
36
  local build or claim that the app exists.
@@ -50,6 +50,14 @@ skills. For a ChatGPT Project or any host that exposes only the MCP connector,
50
50
  also place the skill instructions or this reference in the Project
51
51
  instructions/knowledge files. Then add and authenticate the Dispatch MCP
52
52
  connector from the packaged `adapters/chatgpt-mcp/connector.json`.
53
+ This single connector is enough: Dispatch provisions or reuses the Builder
54
+ project through the Builder Projects API, so do not ask the user to add a
55
+ separate Builder CMS MCP for app creation.
56
+ Builder's separate Fusion MCP is available as a custom remote connector at
57
+ `https://mcp.builder.io/mcp/fusion` for direct Builder work. It can run an
58
+ existing project, but it cannot provision the repo-backed Agent-Native
59
+ workspace project, so it is optional and not a replacement for the Dispatch
60
+ handoff in this skill. Do not add Builder's CMS MCP for this workflow.
53
61
 
54
62
  For Claude Web, ChatGPT Web, and their web Projects, the host is an
55
63
  orchestrator, not the build environment. After forming the source brief, call
@@ -27,6 +27,10 @@ The build location depends on the host. Treat this as a hard routing rule:
27
27
  `resourceIds` when available. This is the Builder handoff.
28
28
  - Do not substitute the generic `create_workspace_app` MCP tool in an online
29
29
  host. That tool is a local workspace scaffolder, not the Builder handoff.
30
+ - Connect the Agent-Native Dispatch MCP connector only. Dispatch uses the
31
+ authenticated Builder Projects API to reuse or provision the workspace
32
+ project before starting the Builder Cloud Agent; a separate Builder CMS MCP
33
+ connection is not required for this workflow.
30
34
  - If `start-workspace-app-creation` is not available or Dispatch is not
31
35
  authenticated, stop with the connector setup needed. Do not fall back to a
32
36
  local build or claim that the app exists.
@@ -50,6 +50,14 @@ skills. For a ChatGPT Project or any host that exposes only the MCP connector,
50
50
  also place the skill instructions or this reference in the Project
51
51
  instructions/knowledge files. Then add and authenticate the Dispatch MCP
52
52
  connector from the packaged `adapters/chatgpt-mcp/connector.json`.
53
+ This single connector is enough: Dispatch provisions or reuses the Builder
54
+ project through the Builder Projects API, so do not ask the user to add a
55
+ separate Builder CMS MCP for app creation.
56
+ Builder's separate Fusion MCP is available as a custom remote connector at
57
+ `https://mcp.builder.io/mcp/fusion` for direct Builder work. It can run an
58
+ existing project, but it cannot provision the repo-backed Agent-Native
59
+ workspace project, so it is optional and not a replacement for the Dispatch
60
+ handoff in this skill. Do not add Builder's CMS MCP for this workflow.
53
61
 
54
62
  For Claude Web, ChatGPT Web, and their web Projects, the host is an
55
63
  orchestrator, not the build environment. After forming the source brief, call
@@ -27,6 +27,10 @@ The build location depends on the host. Treat this as a hard routing rule:
27
27
  `resourceIds` when available. This is the Builder handoff.
28
28
  - Do not substitute the generic `create_workspace_app` MCP tool in an online
29
29
  host. That tool is a local workspace scaffolder, not the Builder handoff.
30
+ - Connect the Agent-Native Dispatch MCP connector only. Dispatch uses the
31
+ authenticated Builder Projects API to reuse or provision the workspace
32
+ project before starting the Builder Cloud Agent; a separate Builder CMS MCP
33
+ connection is not required for this workflow.
30
34
  - If `start-workspace-app-creation` is not available or Dispatch is not
31
35
  authenticated, stop with the connector setup needed. Do not fall back to a
32
36
  local build or claim that the app exists.
@@ -50,6 +50,14 @@ skills. For a ChatGPT Project or any host that exposes only the MCP connector,
50
50
  also place the skill instructions or this reference in the Project
51
51
  instructions/knowledge files. Then add and authenticate the Dispatch MCP
52
52
  connector from the packaged `adapters/chatgpt-mcp/connector.json`.
53
+ This single connector is enough: Dispatch provisions or reuses the Builder
54
+ project through the Builder Projects API, so do not ask the user to add a
55
+ separate Builder CMS MCP for app creation.
56
+ Builder's separate Fusion MCP is available as a custom remote connector at
57
+ `https://mcp.builder.io/mcp/fusion` for direct Builder work. It can run an
58
+ existing project, but it cannot provision the repo-backed Agent-Native
59
+ workspace project, so it is optional and not a replacement for the Dispatch
60
+ handoff in this skill. Do not add Builder's CMS MCP for this workflow.
53
61
 
54
62
  For Claude Web, ChatGPT Web, and their web Projects, the host is an
55
63
  orchestrator, not the build environment. After forming the source brief, call
@@ -1,173 +0,0 @@
1
- ---
2
- title: "Persist Data in SQL"
3
- description: "Persist action results in SQL when they need to survive conversations."
4
- ---
5
-
6
- # Persist Data in SQL
7
-
8
- This is the optional fourth part of the Getting Started series. In [Add a Page](/docs/getting-started-pages)
9
- you used `analyze-text` directly from a route. Here you'll add app-owned SQL
10
- data when results need to survive conversations.
11
-
12
- ## Add a table {#persist-data}
13
-
14
- Chat already includes the SQL runtime, framework tables, and a local SQLite file
15
- by default. You do not need to install a database, set `DATABASE_URL`, or add a
16
- migration for Chat's built-in tables. For a new app-owned table, add these three
17
- server files:
18
-
19
- 1. `server/plugins/db.ts` creates the table with an additive migration.
20
- 2. `server/db/schema.ts` describes the table for typed queries.
21
- 3. `server/db/index.ts` creates the app's typed database client.
22
-
23
- Create `server/plugins/db.ts`:
24
-
25
- ```ts filename="server/plugins/db.ts"
26
- import { runMigrations } from "@agent-native/core/db";
27
-
28
- export default runMigrations(
29
- [
30
- {
31
- version: 1,
32
- name: "create-text-analyses",
33
- sql: `CREATE TABLE IF NOT EXISTS text_analyses (
34
- id TEXT PRIMARY KEY,
35
- input TEXT NOT NULL,
36
- char_count INTEGER NOT NULL,
37
- word_count INTEGER NOT NULL,
38
- sentence_count INTEGER NOT NULL,
39
- paragraph_count INTEGER NOT NULL,
40
- owner_email TEXT NOT NULL,
41
- created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP
42
- )`,
43
- },
44
- ],
45
- { table: "text_analyses_migrations" },
46
- );
47
- ```
48
-
49
- Create `server/db/schema.ts`:
50
-
51
- ```ts filename="server/db/schema.ts"
52
- import { integer, now, table, text } from "@agent-native/core/db/schema";
53
-
54
- export const textAnalyses = table("text_analyses", {
55
- id: text("id").primaryKey(),
56
- input: text("input").notNull(),
57
- charCount: integer("char_count").notNull(),
58
- wordCount: integer("word_count").notNull(),
59
- sentenceCount: integer("sentence_count").notNull(),
60
- paragraphCount: integer("paragraph_count").notNull(),
61
- ownerEmail: text("owner_email").notNull(),
62
- createdAt: text("created_at").notNull().default(now()),
63
- });
64
- ```
65
-
66
- Create `server/db/index.ts`:
67
-
68
- ```ts filename="server/db/index.ts"
69
- import { createGetDb } from "@agent-native/core/db";
70
- import * as schema from "./schema.js";
71
-
72
- export const getDb = createGetDb(schema);
73
- export { schema };
74
- ```
75
-
76
- Restart `pnpm dev` once so the migration runs. Keep future migrations additive,
77
- and give each one a new `version` and `name`.
78
-
79
- ## Add save and list actions
80
-
81
- Keep `analyze-text` read-only and make saving explicit with a separate action.
82
- Create `actions/save-text-analysis.ts`:
83
-
84
- ```ts filename="actions/save-text-analysis.ts"
85
- import { defineAction } from "@agent-native/core/action";
86
- import { z } from "zod";
87
-
88
- import { getDb, schema } from "../server/db/index.js";
89
-
90
- export default defineAction({
91
- description: "Save a text analysis result to the database.",
92
- schema: z.object({
93
- input: z.string().min(1),
94
- charCount: z.number(),
95
- wordCount: z.number(),
96
- sentenceCount: z.number(),
97
- paragraphCount: z.number(),
98
- }),
99
- run: async (
100
- { input, charCount, wordCount, sentenceCount, paragraphCount },
101
- ctx,
102
- ) => {
103
- const ownerEmail = ctx?.userEmail;
104
- if (!ownerEmail) throw new Error("Sign in before saving analyses.");
105
-
106
- const id = crypto.randomUUID();
107
- await getDb().insert(schema.textAnalyses).values({
108
- id,
109
- input,
110
- charCount,
111
- wordCount,
112
- sentenceCount,
113
- paragraphCount,
114
- ownerEmail,
115
- });
116
-
117
- return { id };
118
- },
119
- });
120
- ```
121
-
122
- Create `actions/list-text-analyses.ts`:
123
-
124
- ```ts filename="actions/list-text-analyses.ts"
125
- import { defineAction } from "@agent-native/core/action";
126
- import { desc, eq } from "drizzle-orm";
127
- import { z } from "zod";
128
-
129
- import { getDb, schema } from "../server/db/index.js";
130
-
131
- export default defineAction({
132
- description: "List the signed-in user's saved text analyses, newest first.",
133
- schema: z.object({}),
134
- http: { method: "GET" },
135
- readOnly: true,
136
- run: async (_, ctx) => {
137
- const ownerEmail = ctx?.userEmail;
138
- if (!ownerEmail) throw new Error("Sign in before listing analyses.");
139
-
140
- return getDb()
141
- .select({
142
- id: schema.textAnalyses.id,
143
- input: schema.textAnalyses.input,
144
- charCount: schema.textAnalyses.charCount,
145
- wordCount: schema.textAnalyses.wordCount,
146
- sentenceCount: schema.textAnalyses.sentenceCount,
147
- paragraphCount: schema.textAnalyses.paragraphCount,
148
- createdAt: schema.textAnalyses.createdAt,
149
- })
150
- .from(schema.textAnalyses)
151
- .where(eq(schema.textAnalyses.ownerEmail, ownerEmail))
152
- .orderBy(desc(schema.textAnalyses.createdAt));
153
- },
154
- });
155
- ```
156
-
157
- The actions use the typed Drizzle client for app reads and writes. Raw SQL is
158
- only needed here for the additive migration. Skip this page until your action
159
- needs durable domain data.
160
-
161
- ## Try it
162
-
163
- In chat, ask the agent to do the whole flow:
164
-
165
- > Run analyze-text on "Hello world", save the result with save-text-analysis, then list my saved text analyses.
166
-
167
- The saved row is now available to the agent and to any page that reads
168
- `list-text-analyses`.
169
-
170
- ## Continue
171
-
172
- You now have durable app data. Continue with [Key Concepts](/docs/key-concepts)
173
- to learn how actions, SQL, and pages fit together.