@agent-native/core 0.7.82 → 0.8.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 (265) hide show
  1. package/dist/action.js +1 -1
  2. package/dist/action.js.map +1 -1
  3. package/dist/agent/production-agent.d.ts.map +1 -1
  4. package/dist/agent/production-agent.js +8 -8
  5. package/dist/agent/production-agent.js.map +1 -1
  6. package/dist/agent/run-manager.d.ts +2 -0
  7. package/dist/agent/run-manager.d.ts.map +1 -1
  8. package/dist/agent/run-manager.js +44 -18
  9. package/dist/agent/run-manager.js.map +1 -1
  10. package/dist/agent/types.d.ts +1 -1
  11. package/dist/agent/types.d.ts.map +1 -1
  12. package/dist/agent/types.js.map +1 -1
  13. package/dist/cli/create.d.ts +1 -1
  14. package/dist/cli/create.d.ts.map +1 -1
  15. package/dist/cli/create.js +87 -19
  16. package/dist/cli/create.js.map +1 -1
  17. package/dist/cli/workspacify.d.ts.map +1 -1
  18. package/dist/cli/workspacify.js +12 -9
  19. package/dist/cli/workspacify.js.map +1 -1
  20. package/dist/client/AgentPanel.d.ts +1 -1
  21. package/dist/client/AgentPanel.d.ts.map +1 -1
  22. package/dist/client/AgentPanel.js +22 -1
  23. package/dist/client/AgentPanel.js.map +1 -1
  24. package/dist/client/FeedbackButton.d.ts +3 -2
  25. package/dist/client/FeedbackButton.d.ts.map +1 -1
  26. package/dist/client/FeedbackButton.js +18 -14
  27. package/dist/client/FeedbackButton.js.map +1 -1
  28. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  29. package/dist/client/agent-chat-adapter.js +254 -29
  30. package/dist/client/agent-chat-adapter.js.map +1 -1
  31. package/dist/client/agent-chat.d.ts +2 -0
  32. package/dist/client/agent-chat.d.ts.map +1 -1
  33. package/dist/client/agent-chat.js +11 -2
  34. package/dist/client/agent-chat.js.map +1 -1
  35. package/dist/client/builder-frame.d.ts +11 -0
  36. package/dist/client/builder-frame.d.ts.map +1 -1
  37. package/dist/client/builder-frame.js +40 -9
  38. package/dist/client/builder-frame.js.map +1 -1
  39. package/dist/client/composer/ComposerPlusMenu.js +1 -1
  40. package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
  41. package/dist/client/composer/PromptComposer.d.ts +2 -0
  42. package/dist/client/composer/PromptComposer.d.ts.map +1 -1
  43. package/dist/client/composer/PromptComposer.js +3 -3
  44. package/dist/client/composer/PromptComposer.js.map +1 -1
  45. package/dist/client/composer/TiptapComposer.d.ts +3 -1
  46. package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
  47. package/dist/client/composer/TiptapComposer.js +25 -13
  48. package/dist/client/composer/TiptapComposer.js.map +1 -1
  49. package/dist/client/composer/types.d.ts +1 -1
  50. package/dist/client/composer/types.d.ts.map +1 -1
  51. package/dist/client/composer/types.js.map +1 -1
  52. package/dist/client/extensions/EmbeddedExtension.d.ts +20 -0
  53. package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -0
  54. package/dist/client/{tools/EmbeddedTool.js → extensions/EmbeddedExtension.js} +41 -41
  55. package/dist/client/extensions/EmbeddedExtension.js.map +1 -0
  56. package/dist/client/extensions/ExtensionEditor.d.ts +5 -0
  57. package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -0
  58. package/dist/client/extensions/ExtensionEditor.js +129 -0
  59. package/dist/client/extensions/ExtensionEditor.js.map +1 -0
  60. package/dist/client/{tools → extensions}/ExtensionSlot.d.ts +3 -3
  61. package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -0
  62. package/dist/client/{tools → extensions}/ExtensionSlot.js +14 -14
  63. package/dist/client/extensions/ExtensionSlot.js.map +1 -0
  64. package/dist/client/extensions/ExtensionViewer.d.ts +5 -0
  65. package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -0
  66. package/dist/client/{tools/ToolViewer.js → extensions/ExtensionViewer.js} +67 -65
  67. package/dist/client/extensions/ExtensionViewer.js.map +1 -0
  68. package/dist/client/extensions/ExtensionViewerPage.d.ts +2 -0
  69. package/dist/client/extensions/ExtensionViewerPage.d.ts.map +1 -0
  70. package/dist/client/{tools/ToolViewerPage.js → extensions/ExtensionViewerPage.js} +8 -8
  71. package/dist/client/extensions/ExtensionViewerPage.js.map +1 -0
  72. package/dist/client/extensions/ExtensionsListPage.d.ts +2 -0
  73. package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -0
  74. package/dist/client/extensions/ExtensionsListPage.js +67 -0
  75. package/dist/client/extensions/ExtensionsListPage.js.map +1 -0
  76. package/dist/client/extensions/ExtensionsSidebarSection.d.ts +2 -0
  77. package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -0
  78. package/dist/client/{tools/ToolsSidebarSection.js → extensions/ExtensionsSidebarSection.js} +58 -58
  79. package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -0
  80. package/dist/client/{tools/tool-order.d.ts → extensions/extension-order.d.ts} +2 -2
  81. package/dist/client/extensions/extension-order.d.ts.map +1 -0
  82. package/dist/client/{tools/tool-order.js → extensions/extension-order.js} +3 -3
  83. package/dist/client/extensions/extension-order.js.map +1 -0
  84. package/dist/client/{tools → extensions}/iframe-bridge.d.ts +11 -11
  85. package/dist/client/extensions/iframe-bridge.d.ts.map +1 -0
  86. package/dist/client/{tools → extensions}/iframe-bridge.js +24 -24
  87. package/dist/client/extensions/iframe-bridge.js.map +1 -0
  88. package/dist/client/extensions/index.d.ts +14 -0
  89. package/dist/client/extensions/index.d.ts.map +1 -0
  90. package/dist/client/extensions/index.js +19 -0
  91. package/dist/client/extensions/index.js.map +1 -0
  92. package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
  93. package/dist/client/integrations/IntegrationsPanel.js +4 -1
  94. package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
  95. package/dist/client/sse-event-processor.d.ts +2 -1
  96. package/dist/client/sse-event-processor.d.ts.map +1 -1
  97. package/dist/client/sse-event-processor.js +87 -6
  98. package/dist/client/sse-event-processor.js.map +1 -1
  99. package/dist/extensions/actions.d.ts +3 -0
  100. package/dist/extensions/actions.d.ts.map +1 -0
  101. package/dist/{tools → extensions}/actions.js +54 -51
  102. package/dist/extensions/actions.js.map +1 -0
  103. package/dist/{tools → extensions}/fetch-tool.d.ts +4 -0
  104. package/dist/extensions/fetch-tool.d.ts.map +1 -0
  105. package/dist/{tools → extensions}/fetch-tool.js +12 -7
  106. package/dist/extensions/fetch-tool.js.map +1 -0
  107. package/dist/extensions/html-shell.d.ts +56 -0
  108. package/dist/extensions/html-shell.d.ts.map +1 -0
  109. package/dist/{tools → extensions}/html-shell.js +101 -83
  110. package/dist/extensions/html-shell.js.map +1 -0
  111. package/dist/{tools → extensions}/proxy-security.d.ts +2 -2
  112. package/dist/extensions/proxy-security.d.ts.map +1 -0
  113. package/dist/{tools → extensions}/proxy-security.js +3 -3
  114. package/dist/extensions/proxy-security.js.map +1 -0
  115. package/dist/extensions/routes.d.ts +2 -0
  116. package/dist/extensions/routes.d.ts.map +1 -0
  117. package/dist/{tools → extensions}/routes.js +73 -69
  118. package/dist/extensions/routes.js.map +1 -0
  119. package/dist/{tools → extensions}/schema.d.ts +44 -38
  120. package/dist/extensions/schema.d.ts.map +1 -0
  121. package/dist/{tools → extensions}/schema.js +41 -34
  122. package/dist/extensions/schema.js.map +1 -0
  123. package/dist/extensions/slots/routes.d.ts +15 -0
  124. package/dist/extensions/slots/routes.d.ts.map +1 -0
  125. package/dist/{tools → extensions}/slots/routes.js +26 -26
  126. package/dist/extensions/slots/routes.js.map +1 -0
  127. package/dist/{tools → extensions}/slots/schema.d.ts +24 -21
  128. package/dist/extensions/slots/schema.d.ts.map +1 -0
  129. package/dist/extensions/slots/schema.js +79 -0
  130. package/dist/extensions/slots/schema.js.map +1 -0
  131. package/dist/extensions/slots/store.d.ts +66 -0
  132. package/dist/extensions/slots/store.d.ts.map +1 -0
  133. package/dist/extensions/slots/store.js +238 -0
  134. package/dist/extensions/slots/store.js.map +1 -0
  135. package/dist/extensions/store.d.ts +40 -0
  136. package/dist/extensions/store.d.ts.map +1 -0
  137. package/dist/{tools → extensions}/store.js +59 -54
  138. package/dist/extensions/store.js.map +1 -0
  139. package/dist/extensions/theme.d.ts.map +1 -0
  140. package/dist/extensions/theme.js.map +1 -0
  141. package/dist/{tools → extensions}/url-safety.d.ts +5 -3
  142. package/dist/extensions/url-safety.d.ts.map +1 -0
  143. package/dist/{tools → extensions}/url-safety.js +11 -4
  144. package/dist/extensions/url-safety.js.map +1 -0
  145. package/dist/server/action-discovery.d.ts +15 -0
  146. package/dist/server/action-discovery.d.ts.map +1 -1
  147. package/dist/server/action-discovery.js +45 -0
  148. package/dist/server/action-discovery.js.map +1 -1
  149. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  150. package/dist/server/agent-chat-plugin.js +12 -10
  151. package/dist/server/agent-chat-plugin.js.map +1 -1
  152. package/dist/server/auth.d.ts +5 -4
  153. package/dist/server/auth.d.ts.map +1 -1
  154. package/dist/server/auth.js +80 -28
  155. package/dist/server/auth.js.map +1 -1
  156. package/dist/server/core-routes-plugin.d.ts +15 -0
  157. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  158. package/dist/server/core-routes-plugin.js +65 -13
  159. package/dist/server/core-routes-plugin.js.map +1 -1
  160. package/dist/server/csrf.d.ts +3 -2
  161. package/dist/server/csrf.d.ts.map +1 -1
  162. package/dist/server/csrf.js +3 -2
  163. package/dist/server/csrf.js.map +1 -1
  164. package/dist/server/google-oauth.d.ts.map +1 -1
  165. package/dist/server/google-oauth.js +15 -3
  166. package/dist/server/google-oauth.js.map +1 -1
  167. package/dist/server/index.d.ts +2 -2
  168. package/dist/server/index.d.ts.map +1 -1
  169. package/dist/server/index.js +1 -1
  170. package/dist/server/index.js.map +1 -1
  171. package/dist/shared/workspace-app-id.d.ts +1 -1
  172. package/dist/shared/workspace-app-id.d.ts.map +1 -1
  173. package/dist/shared/workspace-app-id.js +5 -1
  174. package/dist/shared/workspace-app-id.js.map +1 -1
  175. package/dist/templates/workspace-root/README.md +5 -4
  176. package/dist/usage/store.d.ts +1 -1
  177. package/dist/usage/store.d.ts.map +1 -1
  178. package/dist/usage/store.js +1 -1
  179. package/dist/usage/store.js.map +1 -1
  180. package/dist/vite/client.d.ts.map +1 -1
  181. package/dist/vite/client.js +17 -1
  182. package/dist/vite/client.js.map +1 -1
  183. package/docs/content/actions.md +10 -10
  184. package/docs/content/extensions.md +230 -0
  185. package/docs/content/key-concepts.md +2 -2
  186. package/docs/content/server.md +13 -13
  187. package/docs/content/sharing.md +2 -2
  188. package/docs/content/template-analytics.md +10 -0
  189. package/docs/content/template-calendar.md +10 -0
  190. package/docs/content/template-clips.md +10 -0
  191. package/docs/content/template-content.md +10 -0
  192. package/docs/content/template-dispatch.md +15 -0
  193. package/docs/content/template-forms.md +10 -0
  194. package/docs/content/template-mail.md +10 -0
  195. package/docs/content/template-slides.md +11 -1
  196. package/docs/content/template-starter.md +10 -0
  197. package/docs/content/template-video.md +10 -0
  198. package/docs/content/what-is-agent-native.md +1 -1
  199. package/package.json +22 -17
  200. package/src/templates/workspace-root/README.md +5 -4
  201. package/dist/client/tools/EmbeddedTool.d.ts +0 -20
  202. package/dist/client/tools/EmbeddedTool.d.ts.map +0 -1
  203. package/dist/client/tools/EmbeddedTool.js.map +0 -1
  204. package/dist/client/tools/ExtensionSlot.d.ts.map +0 -1
  205. package/dist/client/tools/ExtensionSlot.js.map +0 -1
  206. package/dist/client/tools/ToolEditor.d.ts +0 -5
  207. package/dist/client/tools/ToolEditor.d.ts.map +0 -1
  208. package/dist/client/tools/ToolEditor.js +0 -129
  209. package/dist/client/tools/ToolEditor.js.map +0 -1
  210. package/dist/client/tools/ToolViewer.d.ts +0 -5
  211. package/dist/client/tools/ToolViewer.d.ts.map +0 -1
  212. package/dist/client/tools/ToolViewer.js.map +0 -1
  213. package/dist/client/tools/ToolViewerPage.d.ts +0 -2
  214. package/dist/client/tools/ToolViewerPage.d.ts.map +0 -1
  215. package/dist/client/tools/ToolViewerPage.js.map +0 -1
  216. package/dist/client/tools/ToolsListPage.d.ts +0 -2
  217. package/dist/client/tools/ToolsListPage.d.ts.map +0 -1
  218. package/dist/client/tools/ToolsListPage.js +0 -67
  219. package/dist/client/tools/ToolsListPage.js.map +0 -1
  220. package/dist/client/tools/ToolsSidebarSection.d.ts +0 -2
  221. package/dist/client/tools/ToolsSidebarSection.d.ts.map +0 -1
  222. package/dist/client/tools/ToolsSidebarSection.js.map +0 -1
  223. package/dist/client/tools/iframe-bridge.d.ts.map +0 -1
  224. package/dist/client/tools/iframe-bridge.js.map +0 -1
  225. package/dist/client/tools/index.d.ts +0 -8
  226. package/dist/client/tools/index.d.ts.map +0 -1
  227. package/dist/client/tools/index.js +0 -8
  228. package/dist/client/tools/index.js.map +0 -1
  229. package/dist/client/tools/tool-order.d.ts.map +0 -1
  230. package/dist/client/tools/tool-order.js.map +0 -1
  231. package/dist/tools/actions.d.ts +0 -3
  232. package/dist/tools/actions.d.ts.map +0 -1
  233. package/dist/tools/actions.js.map +0 -1
  234. package/dist/tools/fetch-tool.d.ts.map +0 -1
  235. package/dist/tools/fetch-tool.js.map +0 -1
  236. package/dist/tools/html-shell.d.ts +0 -45
  237. package/dist/tools/html-shell.d.ts.map +0 -1
  238. package/dist/tools/html-shell.js.map +0 -1
  239. package/dist/tools/proxy-security.d.ts.map +0 -1
  240. package/dist/tools/proxy-security.js.map +0 -1
  241. package/dist/tools/routes.d.ts +0 -2
  242. package/dist/tools/routes.d.ts.map +0 -1
  243. package/dist/tools/routes.js.map +0 -1
  244. package/dist/tools/schema.d.ts.map +0 -1
  245. package/dist/tools/schema.js.map +0 -1
  246. package/dist/tools/slots/routes.d.ts +0 -15
  247. package/dist/tools/slots/routes.d.ts.map +0 -1
  248. package/dist/tools/slots/routes.js.map +0 -1
  249. package/dist/tools/slots/schema.d.ts.map +0 -1
  250. package/dist/tools/slots/schema.js +0 -76
  251. package/dist/tools/slots/schema.js.map +0 -1
  252. package/dist/tools/slots/store.d.ts +0 -66
  253. package/dist/tools/slots/store.d.ts.map +0 -1
  254. package/dist/tools/slots/store.js +0 -227
  255. package/dist/tools/slots/store.js.map +0 -1
  256. package/dist/tools/store.d.ts +0 -40
  257. package/dist/tools/store.d.ts.map +0 -1
  258. package/dist/tools/store.js.map +0 -1
  259. package/dist/tools/theme.d.ts.map +0 -1
  260. package/dist/tools/theme.js.map +0 -1
  261. package/dist/tools/url-safety.d.ts.map +0 -1
  262. package/dist/tools/url-safety.js.map +0 -1
  263. package/docs/content/tools.md +0 -205
  264. /package/dist/{tools → extensions}/theme.d.ts +0 -0
  265. /package/dist/{tools → extensions}/theme.js +0 -0
@@ -0,0 +1,230 @@
1
+ ---
2
+ title: "Extensions"
3
+ description: "Lightweight interactive apps — dashboards, widgets, calculators, monitors — that the agent creates for you instantly, without changing your app's code."
4
+ ---
5
+
6
+ # Extensions
7
+
8
+ Extensions are lightweight interactive apps that live inside your agent-native app. Think dashboards, widgets, calculators, API monitors, data lookups — anything you'd otherwise build by hand.
9
+
10
+ The key difference from the rest of your app: **extensions don't require code changes.** The agent creates and updates them at runtime, they're stored in the database, and they're ready to use immediately. No deploys, no builds, no pull requests.
11
+
12
+ ## Extensions vs. LLM tools {#extensions-vs-llm-tools}
13
+
14
+ The word "tools" gets used in two different ways in this codebase, so we use distinct names to keep them clear:
15
+
16
+ - **Extensions** (this primitive) — sandboxed Alpine.js mini-apps, rendered inside an iframe. They have a UI the user can interact with, persistent storage, and the ability to call your app's actions and external APIs. The rest of this page is about extensions.
17
+ - **LLM tools / agent tools** — the function calls the agent makes during a turn (the things you define with `defineAction`, MCP tools, or that show up in `tools/list` / `tools/call`). These are not user-facing apps; they're the function-call surface area the model sees. When you read `tool: { description, parameters }` on an `ActionEntry`, "agent's tools", or "tool calls" elsewhere in these docs, that's the LLM-tools sense.
18
+
19
+ Both senses can show up on the same page (extensions can _call_ agent actions, which the agent also sees as tools), so when in doubt: if it has a UI inside an iframe, it's an extension; if it's a function-call name on a model turn, it's an LLM tool.
20
+
21
+ ## Extensions vs. editing the app {#extensions-vs-code}
22
+
23
+ Your agent-native app has a full codebase — React components, routes, actions, styles. When the agent edits that code, it's changing the app itself. That's powerful, but it requires a build step and a deploy.
24
+
25
+ Extensions are different:
26
+
27
+ | | App code | Extensions |
28
+ | --------------------- | --------------------------------------- | -------------------------------------------------- |
29
+ | **Created by** | Developer or agent editing source files | Agent or user, instantly from chat |
30
+ | **Stored in** | Git repository | Database |
31
+ | **Requires a build** | Yes | No |
32
+ | **Requires a deploy** | Yes | No |
33
+ | **Scope** | Part of the app for all users | Private by default, shareable |
34
+ | **Best for** | Core app features | Personal dashboards, utilities, quick integrations |
35
+
36
+ Use app code for features that are core to the product. Use extensions for everything else — one-off utilities, personal dashboards, quick integrations, monitors, and things you want to spin up in seconds.
37
+
38
+ ## When to build an extension vs. a template feature {#when-to-build}
39
+
40
+ A quick decision rubric:
41
+
42
+ **Build an extension when:**
43
+
44
+ - It's for one user or one team, not the whole product.
45
+ - It's a quick utility, dashboard, or widget you want now, not next sprint.
46
+ - No new database schema is needed (or per-extension key-value storage is enough).
47
+ - You want to ship it inside a single chat turn, no deploy.
48
+
49
+ **Add a template feature when:**
50
+
51
+ - Every user of the template should get it.
52
+ - It needs new SQL tables, migrations, or shared schema changes.
53
+ - The UI is complex enough to warrant React components, routes, and proper testing.
54
+ - It's part of the product surface — something you'd advertise on a landing page.
55
+
56
+ When in doubt, start as an extension. Promoting an extension to a template feature later is straightforward; rolling back a half-shipped product feature is not.
57
+
58
+ ## Creating an extension {#creating}
59
+
60
+ ### From the sidebar
61
+
62
+ Click the **+** button in the Extensions section of the sidebar. Describe what you want in plain language — "a dashboard that shows my open GitHub PRs" — and the agent builds it for you.
63
+
64
+ ### From chat
65
+
66
+ Just ask: "Create an extension that monitors our API health" or "Make me a calculator for shipping costs." The agent handles the rest.
67
+
68
+ ### Updating an extension
69
+
70
+ Ask the agent: "Update my PR dashboard to also show draft PRs" or "Add a dark mode toggle to the weather widget." The agent makes surgical edits without regenerating the whole thing.
71
+
72
+ ## What extensions can do {#capabilities}
73
+
74
+ Extensions are fully capable despite being lightweight. They can:
75
+
76
+ - **Call external APIs** — GitHub, Stripe, weather services, any REST API. Requests go through a secure server-side proxy that keeps your API keys safe.
77
+ - **Call your app's actions** — anything your agent can do, an extension can trigger.
78
+ - **Query your app's database** — read and write data directly.
79
+ - **Store their own data** — each extension has built-in persistent storage, no setup required. Save notes, preferences, cached results — whatever the extension needs.
80
+ - **Call any endpoint in your app** — hit custom API routes, webhooks, or internal services.
81
+
82
+ All of this works out of the box. No configuration, no new files, no schema changes.
83
+
84
+ ## Layout defaults {#layout}
85
+
86
+ Extensions render with modest canvas padding by default so simple widgets and dashboards do not hug the iframe edge. For full-bleed experiences such as maps, canvases, or custom editors, set `data-tool-layout="full-bleed"` or `data-tool-padding="none"` on the outermost element. (The `data-tool-*` attribute names are kept for backward compatibility — `data-extension-layout` / `data-extension-padding` aliases are also accepted.)
87
+
88
+ ## Persistent storage {#persistent-storage}
89
+
90
+ Every extension has access to a built-in key-value store via the `extensionData` helper (also exposed as `toolData` for backward compatibility). Data is automatically scoped per extension and per user — your data stays yours.
91
+
92
+ When you ask the agent to "add persistence" or "remember state" in an extension, it uses this built-in storage. No database tables to create, no migrations to run.
93
+
94
+ ### Scopes
95
+
96
+ All `extensionData` methods accept an optional `{ scope }` option:
97
+
98
+ - `'user'` (default) — private to the current user.
99
+ - `'org'` — shared across the user's organization.
100
+ - `'all'` — list/get only; returns both user-scoped and org-scoped items.
101
+
102
+ ```html
103
+ <script>
104
+ // Private to me
105
+ await extensionData.set('notes', 'note-1', { title: 'My Note' });
106
+
107
+ // Shared with my org
108
+ await extensionData.set('notes', 'team-note', { title: 'Team Note' }, { scope: 'org' });
109
+
110
+ // List my notes (default)
111
+ const mine = await extensionData.list('notes');
112
+
113
+ // List both mine and the org's
114
+ const everything = await extensionData.list('notes', { scope: 'all' });
115
+ </script>
116
+ ```
117
+
118
+ > **Legacy alias.** The original helper was named `toolData`; both `toolData` and `extensionData` resolve to the same store and accept identical arguments. New extensions should use `extensionData`; existing code using `toolData` keeps working.
119
+
120
+ ## API keys and secrets {#secrets}
121
+
122
+ When an extension needs an API key (for GitHub, OpenAI, a weather service, etc.), the agent will tell you what's needed and where to get it. You add the key through the Settings UI in the agent sidebar.
123
+
124
+ Keys are encrypted and stored securely. Each key is restricted to specific domains — a GitHub token can only be sent to `api.github.com`, never anywhere else.
125
+
126
+ ### Secrets in extensions {#secrets-in-extensions}
127
+
128
+ Extensions reference secrets in `extensionFetch()` calls (legacy alias: `toolFetch()`) using the `${keys.NAME}` template pattern. The proxy substitutes the encrypted value server-side; the actual key never reaches the browser.
129
+
130
+ ```html
131
+ <script>
132
+ const res = await extensionFetch('https://api.github.com/user', {
133
+ headers: {
134
+ Authorization: 'Bearer ${keys.GITHUB_TOKEN}',
135
+ },
136
+ });
137
+ </script>
138
+ ```
139
+
140
+ When an extension needs a one-off key, the agent can register an ad-hoc secret via `POST /_agent-native/secrets/adhoc` with a `urlAllowlist` that pins which domains the secret may be sent to. A request to any other host is rejected before the proxy fires. Combined with SSRF and private-network protections, this means a leaked extension can't exfiltrate secrets to an attacker-controlled URL.
141
+
142
+ ## Sharing {#sharing}
143
+
144
+ Extensions are **private by default** — only you can see and use an extension you create.
145
+
146
+ You can share extensions with your team:
147
+
148
+ - **Org-visible** — everyone in your organization can use it.
149
+ - **Per-user sharing** — grant access to specific people as viewers, editors, or admins.
150
+
151
+ Shared extensions have their own URLs, so you can link to them directly.
152
+
153
+ Under the hood, extensions use the same ownable-resource model as the rest of the framework — `ownableColumns()` on the `extensions` Drizzle export (physical SQL table: `tools`) and a standard `createSharesTable()` for grants (physical table: `tool_shares`, exported as `extensionShares`). That means extensions plug into the same share dialog, access checks, and audit surfaces as documents, decks, dashboards, and any other shareable resource. See [Security](/docs/security) for the full access model.
154
+
155
+ ## Security {#security}
156
+
157
+ Extensions run in a secure sandbox:
158
+
159
+ - **Isolated** — extensions can't access your app's cookies, session, or page content.
160
+ - **API keys stay server-side** — secrets are injected by the server, never exposed to the browser.
161
+ - **Domain-restricted secrets** — each API key can only be sent to its approved domains.
162
+ - **Private network protection** — extensions can't reach internal/private network addresses.
163
+ - **Authentication required** — only logged-in users can use extensions.
164
+
165
+ ## Extension API reference {#api-reference}
166
+
167
+ Every extension runs inside a sandboxed iframe with the following helpers injected on `window`. They are the complete surface area — anything else an extension needs has to go through one of these.
168
+
169
+ | Helper | Purpose | Example |
170
+ | ------------------------------------------------ | -------------------------- | ------------------------------------------------- |
171
+ | `extensionData.set(collection, id, data, opts?)` | Persist data per-extension | `extensionData.set('notes', id, { text: '...' })` |
172
+ | `extensionData.list(collection, opts?)` | List persisted items | `extensionData.list('notes', { scope: 'all' })` |
173
+ | `extensionData.get(collection, id, opts?)` | Get a single item | `extensionData.get('notes', 'note-1')` |
174
+ | `extensionData.remove(collection, id, opts?)` | Delete persisted item | `extensionData.remove('notes', 'note-1')` |
175
+ | `appAction(name, params)` | Call any app action | `appAction('list-emails', { view: 'inbox' })` |
176
+ | `dbQuery(sql, args)` | Read from SQL | `dbQuery('SELECT * FROM tools')` |
177
+ | `dbExec(sql, args)` | Write to SQL | `dbExec('INSERT INTO ...')` |
178
+ | `appFetch(path, options)` | Call any app endpoint | `appFetch('/api/settings')` |
179
+ | `extensionFetch(url, options)` | External API via proxy | `extensionFetch('https://api.github.com/...')` |
180
+
181
+ `appAction` is the preferred way to trigger app behavior — it routes through the same actions the agent and the frontend use, so authorization and access scoping happen automatically. Drop down to `dbQuery`/`dbExec` only when there's no action that fits.
182
+
183
+ > **Legacy aliases and physical names.** `toolData` and `toolFetch` are kept as aliases for `extensionData` and `extensionFetch`. The physical SQL tables (`tools`, `tool_data`, `tool_shares`) and the `tool_id` foreign-key column also keep their original names — only the public Drizzle/TypeScript exports (`extensions`, `extensionData`, `extensionShares`) and the iframe globals were renamed.
184
+
185
+ ### Routes {#routes}
186
+
187
+ The framework mounts the following endpoints under `/_agent-native/extensions/`. Extensions themselves rarely call these directly — they're useful when integrating extensions with external scripts or custom UI. The legacy `/_agent-native/tools/*` paths still resolve and are kept for backward compatibility.
188
+
189
+ | Method | Path | Purpose |
190
+ | ------ | -------------------------------------- | ------------------------------------------------- |
191
+ | GET | `/_agent-native/extensions` | List extensions (filtered by ownership + sharing) |
192
+ | POST | `/_agent-native/extensions` | Create an extension |
193
+ | GET | `/_agent-native/extensions/:id` | Get a single extension |
194
+ | PUT | `/_agent-native/extensions/:id` | Update (supports `patches` for diffing) |
195
+ | DELETE | `/_agent-native/extensions/:id` | Delete an extension |
196
+ | GET | `/_agent-native/extensions/:id/render` | Render the iframe HTML |
197
+ | POST | `/_agent-native/extensions/proxy` | Authenticated proxy with secret injection |
198
+
199
+ ### Agent actions {#agent-actions}
200
+
201
+ The agent uses three actions to manage extensions on your behalf:
202
+
203
+ | Action | What it does |
204
+ | ------------------ | ------------------------------------------------------------------------- |
205
+ | `create-extension` | Create a new extension (name, description, Alpine.js HTML content) |
206
+ | `update-extension` | Update an extension — use `patches` array for find/replace diffs |
207
+ | `navigate` | Navigate to `--view=extensions` or `--view=extensions --extensionId=<id>` |
208
+
209
+ > **Legacy action names.** `create-tool` and `update-tool` continue to work as aliases for `create-extension` and `update-extension`. New code should use the `*-extension` names.
210
+
211
+ ## Examples {#examples}
212
+
213
+ Here are some things people build as extensions:
214
+
215
+ - **GitHub PR dashboard** — see open PRs, review status, and CI checks at a glance
216
+ - **API health monitor** — check if your services are up with a single click
217
+ - **Weather widget** — quick weather lookup for any city
218
+ - **Stripe payment lookup** — search recent payments and refunds
219
+ - **Database explorer** — browse and query your app's data
220
+ - **Shipping cost calculator** — compute rates based on weight and destination
221
+ - **Meeting notes summarizer** — paste notes, get action items
222
+ - **Social media scheduler** — draft and schedule posts across platforms
223
+
224
+ To create any of these, just describe what you want in the agent chat.
225
+
226
+ ## What's next
227
+
228
+ - [**Actions**](/docs/actions) — the operations that extensions (and the agent) can call
229
+ - [**Workspace**](/docs/workspace) — the broader workspace system extensions live alongside
230
+ - [**Security**](/docs/security) — the framework's data scoping and access control
@@ -270,9 +270,9 @@ Every user gets a personal **workspace** — instructions, skills, memory, custo
270
270
 
271
271
  **Dispatch** is the workspace control plane: a central inbox for Slack/email/Telegram, a shared secrets vault, scheduled jobs, and an orchestrator agent that delegates domain work to specialist apps over A2A. Run it alongside your domain apps when you have more than one. See [Dispatch](/docs/dispatch).
272
272
 
273
- ## Tools {#tools}
273
+ ## Extensions {#extensions}
274
274
 
275
- **Tools** are sandboxed mini-apps the agent can create at runtime — Alpine.js HTML rendered inside an iframe, with built-in helpers for persistent storage (`toolData`), calling app actions (`appAction`), and proxied external APIs (`toolFetch`). No source-code changes, no schema migrations. See [Tools](/docs/tools).
275
+ **Extensions** are sandboxed mini-apps the agent can create at runtime — Alpine.js HTML rendered inside an iframe, with built-in helpers for persistent storage (`extensionData`), calling app actions (`appAction`), and proxied external APIs (`extensionFetch`). No source-code changes, no schema migrations. (Distinct from LLM "tools" — the function-call surface area the agent uses, e.g. `defineAction` entries and MCP tools. See [Extensions](/docs/extensions).)
276
276
 
277
277
  ## A2A {#a2a}
278
278
 
@@ -116,19 +116,19 @@ Migrations must be additive. Never put destructive SQL in startup plugins.
116
116
 
117
117
  The framework mounts its own routes under `/_agent-native/`. Treat that namespace as reserved.
118
118
 
119
- | Route prefix | Purpose |
120
- | -------------------------------- | ------------------------------------ |
121
- | `/_agent-native/actions/:name` | Action HTTP endpoints |
122
- | `/_agent-native/agent-chat` | Agent chat loop |
123
- | `/_agent-native/poll` | SQL-backed UI sync |
124
- | `/_agent-native/resources/*` | Workspace resources |
125
- | `/_agent-native/tools/*` | Runtime tools and tool proxy |
126
- | `/_agent-native/integrations/*` | Messaging/webhook integrations |
127
- | `/_agent-native/a2a` | Agent-to-agent JSON-RPC |
128
- | `/_agent-native/mcp` | MCP endpoint |
129
- | `/_agent-native/onboarding/*` | Setup checklist |
130
- | `/_agent-native/observability/*` | Traces, feedback, evals, experiments |
131
- | `/_agent-native/file-upload` | File upload provider endpoint |
119
+ | Route prefix | Purpose |
120
+ | -------------------------------- | ------------------------------------------------------------------------------- |
121
+ | `/_agent-native/actions/:name` | Action HTTP endpoints |
122
+ | `/_agent-native/agent-chat` | Agent chat loop |
123
+ | `/_agent-native/poll` | SQL-backed UI sync |
124
+ | `/_agent-native/resources/*` | Workspace resources |
125
+ | `/_agent-native/extensions/*` | Runtime extensions and extension proxy (legacy alias: `/_agent-native/tools/*`) |
126
+ | `/_agent-native/integrations/*` | Messaging/webhook integrations |
127
+ | `/_agent-native/a2a` | Agent-to-agent JSON-RPC |
128
+ | `/_agent-native/mcp` | MCP endpoint |
129
+ | `/_agent-native/onboarding/*` | Setup checklist |
130
+ | `/_agent-native/observability/*` | Traces, feedback, evals, experiments |
131
+ | `/_agent-native/file-upload` | File upload provider endpoint |
132
132
 
133
133
  Custom app routes should use `/api/*`, public app paths, or provider-specific callback paths that do not collide with `/_agent-native/`.
134
134
 
@@ -51,7 +51,7 @@ Every template that stores user-authored work uses this model. Concretely:
51
51
  - **Forms** — form definitions
52
52
  - **Calendar** — events and booking links
53
53
  - **Analytics** — dashboards (rolling out — see the analytics template's `AGENTS.md`)
54
- - **Tools** — sandboxed mini-apps (see [Tools](/docs/tools#sharing))
54
+ - **Extensions** — sandboxed mini-apps (see [Extensions](/docs/extensions#sharing))
55
55
 
56
56
  Every one of these uses the same `ownableColumns()` schema helper, the same `share-resource` action, and the same `<ShareButton>` UI. Move from one template to another and the share dialog looks identical.
57
57
 
@@ -151,5 +151,5 @@ See [Security & Data Scoping](/docs/security) for the full model and threat surf
151
151
 
152
152
  - [Security & Data Scoping](/docs/security) — the access-filter and ownership model that sharing rides on.
153
153
  - [Authentication](/docs/authentication) — sessions, organizations, and how identity flows into the request context.
154
- - [Tools](/docs/tools#sharing) — sharing in the sandboxed mini-app surface.
154
+ - [Extensions](/docs/extensions#sharing) — sharing in the sandboxed mini-app surface.
155
155
  - [Creating Templates](/docs/creating-templates) — wiring `ownableColumns` into a new template's schema.
@@ -7,6 +7,16 @@ description: "Ask analytics questions in plain English, get charts and dashboard
7
7
 
8
8
  Ask analytics questions in plain English, get charts and dashboards back. The agent connects to BigQuery, GA4, Amplitude, the built-in first-party event collector, HubSpot, Jira, and a dozen other sources, writes the query for you, validates it, and renders the answer as a chart, table, or saved dashboard panel.
9
9
 
10
+ <!-- screenshot:
11
+ app: analytics
12
+ view: /adhoc/<dashboard-id>
13
+ shows: Adhoc dashboard with 3 KPI cards (Weekly active users 24,318 / New signups 1,842 / Revenue MRR $48,210), Weekly active users line chart and Revenue over time area chart side by side, Signups by source bar chart below
14
+ account: screenshot-account (dashboard authored on this account against a seeded warehouse)
15
+ capture: 1400x800 viewport, cropped 90px from bottom (final 1400x710)
16
+ -->
17
+
18
+ ![Analytics dashboard with KPIs and charts](/screenshots/analytics.png)
19
+
10
20
  It's an open-source replacement for Amplitude, Mixpanel, and Looker — for teams that want to own the code, the queries, and the data.
11
21
 
12
22
  ## What you can do with it
@@ -7,6 +7,16 @@ description: "An agent-powered calendar with Google Calendar sync and Calendly-s
7
7
 
8
8
  An agent-powered calendar app. Connect your Google Calendar and the agent can read your schedule, find free slots, create events, and manage Calendly-style booking links — all in plain English. It replaces the Google Calendar + Calendly combo with one app you own.
9
9
 
10
+ <!-- screenshot:
11
+ app: calendar
12
+ view: / (week)
13
+ shows: Calendar week view (May 3-9) with ~17 events scattered across the week (All-hands kickoff, Q3 launch sync, Design review, 1:1 with Marcus, Coffee w/ Hannah, Eng standup, Lunch block, Customer call - Acme, Design crit, Focus block, Roadmap planning, Skip-level w/ Priya, Friday demo, All-hands) — events render in the default blue tone — and the agent sidebar with calendar-aware suggestions
14
+ account: screenshot-account (Google Calendar connected and a representative week populated via create-event)
15
+ capture: 1400x800 viewport, cropped 90px from bottom (final 1400x710)
16
+ -->
17
+
18
+ ![Calendar week view with a populated week and the agent sidebar](/screenshots/calendar.png)
19
+
10
20
  When you open the app, you'll see your calendar in the middle and the agent in the sidebar. The agent always knows which day, week, or event you're looking at, so you can say "schedule a 30-minute call with Alex on this day" without spelling everything out.
11
21
 
12
22
  ## What you can do with it
@@ -7,6 +7,16 @@ description: "Async screen recording (Loom-style), calendar-synced meeting notes
7
7
 
8
8
  A capture-everything app: screen recordings (Loom-style), meeting notes from your calendar (Granola-style), and Fn-hold voice dictation (Wisprflow-style). The agent transcribes, titles, summarizes, and indexes all of it — then lets you ask "find the clip where we discussed the rollout plan" and searches across every transcript you've ever made.
9
9
 
10
+ <!-- screenshot:
11
+ app: clips
12
+ view: /library
13
+ shows: Library with Acme Co. organization, folders (Onboarding videos / Customer calls / Bug repros) and spaces (Engineering / Design / Sales) in the sidebar, six recordings in a 3-column grid (Q3 OKRs review meeting, Walkthrough of new onboarding flow, Eng standup May 4, Dictation - Ideas for landing page copy, Customer call - Acme Corp pricing review, Bug repro - drag-and-drop in Safari)
14
+ account: screenshot-account (recordings imported into this org via the standard upload + meetings flow)
15
+ capture: 1400x800 viewport, cropped 90px from bottom (final 1400x710)
16
+ -->
17
+
18
+ ![Clips library with recordings, folders, and spaces](/screenshots/clips.png)
19
+
10
20
  Think along the lines of Loom + Granola + Wisprflow rolled into one app — but the agent is a first-class editor across every surface, and the recordings, meetings, and dictations are yours, not a SaaS vendor's.
11
21
 
12
22
  ## What you can do with it
@@ -7,6 +7,16 @@ description: "A Notion-style document editor with an AI agent that can read, wri
7
7
 
8
8
  A Notion-style document workspace where the agent can read, write, reorganize, and publish pages for you. Open a doc, ask "rewrite this paragraph to be more concise" or "create a page called Q4 Planning with sub-pages for Goals, Metrics, and Risks" — same result whether you do it yourself or ask.
9
9
 
10
+ <!-- screenshot:
11
+ app: content
12
+ view: /<doc-id>
13
+ shows: Workspace with sidebar tree (Q3 Roadmap favorited and expanded with Goals/Metrics/Risks, Engineering Wiki with On-call playbook + Architecture overview + Deployment guide, Personal section with Reading list and Ideas, Weekly sync — May 1) and the Q3 Roadmap document open in the editor with the agent sidebar
14
+ account: screenshot-account (page tree authored on this account; the doc body should NOT begin with the page title — the page chrome already renders it)
15
+ capture: 1400x800 viewport, cropped 90px from bottom (final 1400x710)
16
+ -->
17
+
18
+ ![Content workspace with the page tree, an open document, and the agent sidebar](/screenshots/content.png)
19
+
10
20
  When you open the app, you'll see a sidebar tree of pages on the left, the editor in the middle, and the agent in the sidebar on the right. The agent always knows which page you're viewing and what text you have selected.
11
21
 
12
22
  ## What you can do with it
@@ -9,6 +9,16 @@ description: "Dispatch is the workspace control plane — central inbox, cross-a
9
9
 
10
10
  Dispatch is the **workspace control plane**. Where other templates are domain apps (Mail, Calendar, Analytics), Dispatch is the app you run _alongside_ them to coordinate everything: a central inbox, a secrets vault, scheduled jobs, Slack/Telegram integration, and an orchestrator agent that delegates domain work to the right specialist app over [A2A](/docs/a2a-protocol).
11
11
 
12
+ <!-- screenshot:
13
+ app: dispatch
14
+ view: /overview
15
+ shows: Overview with "What should we do next?" composer, prompt suggestions (Create a lightweight customer onboarding app / Ask Slides to draft a board update from our latest metrics / Schedule a Monday morning analytics digest), and the Workspace apps grid (Mail / Calendar / Slides / Analytics / Forms / Content + Create app placeholder) showing each mounted path + description
16
+ account: screenshot-account (workspace seeded with the six sibling apps registered as A2A peers)
17
+ capture: 1400x900 viewport, cropped 90px from bottom (final 1400x810)
18
+ -->
19
+
20
+ ![Dispatch overview with the orchestrator chat and workspace apps grid](/screenshots/dispatch.png)
21
+
12
22
  If you're running an [multi-app workspace](/docs/multi-app-workspace) with many apps, Dispatch is the glue.
13
23
 
14
24
  ## What it does {#what-it-does}
@@ -65,6 +75,11 @@ Dispatch is usually scaffolded into a workspace alongside the apps it coordinate
65
75
 
66
76
  Dispatch is a full cloneable SaaS like any other template — see [Cloneable SaaS](/docs/cloneable-saas). Ask the agent to "add a new integration for Datadog" or "route Slack DMs from channel X to the issues agent" and it'll edit the routing config, add the webhook handler, and wire it up.
67
77
 
78
+ For workspace-specific management screens, add local React Router pages and
79
+ register them in `app/dispatch-extensions.tsx`. The generated workspace owns
80
+ only the extra tab and route; `@agent-native/dispatch` keeps owning the shell,
81
+ sidebar, built-in pages, and future package updates.
82
+
68
83
  ## What's next
69
84
 
70
85
  - [**Messaging**](/docs/messaging) — connecting Slack, email, and Telegram so you can talk to your agent from anywhere
@@ -7,6 +7,16 @@ description: "Agent-native form builder — create, edit, publish, and route for
7
7
 
8
8
  Forms is an agent-native form builder. Describe the form you want, refine it in the editor, and publish a public form that stores submissions in your own SQL database.
9
9
 
10
+ <!-- screenshot:
11
+ app: forms
12
+ view: /forms/<id>
13
+ shows: Editor for a "Beta signup" form — sidebar with 5 forms (Beta signup selected, Customer feedback Q3, Job application Engineering, Event RSVP, New customer onboarding); editor pane with title, description, and field cards (Full name, Work email, Your role, Team size, What problem are you hoping to solve?); Edit/Results/Settings/Integrations tabs and Share + Unpublish buttons; agent sidebar with form-related suggestions
14
+ account: screenshot-account (forms authored on this account via the standard build flow, with realistic response counts seeded by submitting through the public URL)
15
+ capture: 1400x800 viewport, cropped 90px from bottom (final 1400x710)
16
+ -->
17
+
18
+ ![Forms editor with a form open and the agent sidebar](/screenshots/forms.png)
19
+
10
20
  When you open the app, you see your forms, the current editor, and a live preview. The agent can create a form from a prompt, update field labels and options, change validation, and connect submission destinations using the same actions the UI uses.
11
21
 
12
22
  ## What you can do with it
@@ -7,6 +7,16 @@ description: "An agent-powered email client. Connect your Gmail and the agent ca
7
7
 
8
8
  An agent-powered email client. Connect your Gmail account and the agent can read, draft, send, and organize email for you — alongside a fast, keyboard-first inbox you can drive yourself. Think Superhuman, but the agent is a first-class citizen and the codebase is yours to own.
9
9
 
10
+ <!-- screenshot:
11
+ app: mail
12
+ view: /inbox
13
+ shows: Inbox listing (Priya Mehta, Acme Billing, Marcus Tang, GitHub, Sasha Park, Linear, Hannah Reyes, Acme Recruiting, Notion, Stripe, Vercel, Calendly, Olivia Brennan, AWS Billing, Dan Kim, Figma) with the agent sidebar open and suggestion chips visible
14
+ account: screenshot-account (seeded with the email set above via the standard inbound flow)
15
+ capture: 1400x800 viewport, cropped 90px from bottom (final 1400x710)
16
+ -->
17
+
18
+ ![Mail inbox with the agent sidebar](/screenshots/mail.png)
19
+
10
20
  When you open the app, you'll see your inbox on the left, the open thread in the middle, and the agent in the sidebar on the right. The agent always knows which view you're in and which thread you have open, so you can say "archive this" or "draft a friendly decline" without explaining what "this" is.
11
21
 
12
22
  ## What you can do with it
@@ -7,7 +7,17 @@ description: "Generate decks from a prompt, edit visually, and present full-scre
7
7
 
8
8
  Generate full presentation decks from a prompt, edit slides visually, and present full-screen. Ask the agent for "a 10-slide pitch deck for a coffee subscription service" and watch it stream slide-by-slide into the editor in seconds. An open-source replacement for Google Slides, Pitch, and PowerPoint.
9
9
 
10
- When you open the app, you'll see your deck list. Click into a deck and you get a slide editor in the middle, a sidebar of slides on the left, and the agent on the right.
10
+ <!-- screenshot:
11
+ app: slides
12
+ view: /deck/<id>
13
+ shows: Deck editor with a "Q3 Board Update" deck open — collapsed left icon rail (Decks / Design Systems / Team), slides thumbnail strip (6 slides — title, agenda, metrics, what we shipped, what we're watching), main slide preview showing the title slide by Maya Chen CEO, speaker notes pane, and the agent chat sidebar with deck-aware suggestions
14
+ account: screenshot-account (deck authored on this account via the standard create-deck + add-slide flow)
15
+ capture: 1400x800 viewport, cropped 90px from bottom (final 1400x710); collapse the left rail before capture
16
+ -->
17
+
18
+ ![Slides deck editor with a deck open and slide thumbnails on the left](/screenshots/slides.png)
19
+
20
+ When you open a deck, you get a slide editor in the middle, a sidebar of slides on the left, and the agent on the right.
11
21
 
12
22
  ## What you can do with it
13
23
 
@@ -7,6 +7,16 @@ description: "The minimal agent-native scaffold — agent chat, actions, applica
7
7
 
8
8
  Starter is the minimum viable agent-native app. You get the six-rules architecture, the agent sidebar, the workspace tab, polling sync, auth, and exactly one example action. Nothing else. Build from there.
9
9
 
10
+ <!-- screenshot:
11
+ app: starter
12
+ view: /
13
+ shows: Blank-slate app with sidebar (Starter brand, Home / New App / Observability), centered "Blank app" card with Start building prompt button + 3 quick-action tiles (New app / Documentation / Theme), agent chat panel on the right
14
+ account: screenshot-account (no domain data needed — starter ships with no seed schema)
15
+ capture: 1400x800 viewport, cropped 90px from bottom (final 1400x710)
16
+ -->
17
+
18
+ ![Starter scaffold with the agent sidebar and a clean blank-slate UI](/screenshots/starter.png)
19
+
10
20
  Pick Starter when you're not sure which domain template fits, or when you want to learn the framework by doing — there's almost nothing to delete.
11
21
 
12
22
  ## What's in it {#whats-in-it}
@@ -7,6 +7,16 @@ description: "A programmatic video studio for motion graphics, product demos, an
7
7
 
8
8
  A programmatic video studio for the kind of motion graphics, product demos, and kinetic-text videos that are a pain to keyframe by hand. Ask the agent for "a 6-second logo reveal that fades in at 2 seconds" and it builds the animation. Tune timing, easing, and camera moves on a timeline, then render to MP4 or WebM.
9
9
 
10
+ <!-- screenshot:
11
+ app: video
12
+ view: /c/<composition-id>
13
+ shows: Video studio with 4 compositions (Logo reveal, Q3 product demo, Pricing animation, Onboarding walkthrough) in the sidebar; Logo reveal loaded with timeline + Remotion preview + camera tools and the agent chat sidebar
14
+ account: screenshot-account (compositions authored on this account)
15
+ capture: 1400x800 viewport, cropped 90px from bottom (final 1400x710)
16
+ -->
17
+
18
+ ![Video studio with timeline, composition, and agent sidebar](/screenshots/videos.png)
19
+
10
20
  When you open the studio, you'll see a list of compositions on the home screen. Click into one and you get a player on top, a timeline at the bottom, and a properties panel on the right. The agent always knows which composition you have open.
11
21
 
12
22
  ## What you can do with it
@@ -179,5 +179,5 @@ One action, four surfaces: the agent calls it as a tool, the UI calls it as a ty
179
179
  - [**Cloneable SaaS**](/docs/cloneable-saas) — templates as complete products you own
180
180
  - [**Workspace**](/docs/workspace) — the per-user customization layer (skills, memory, instructions, MCP) backed by SQL, not files
181
181
  - [**Dispatch**](/docs/dispatch) — the workspace control plane: secrets vault, Slack/email inbox, cross-app delegation
182
- - [**Tools**](/docs/tools) — sandboxed mini-apps the agent creates instantly without code changes
182
+ - [**Extensions**](/docs/extensions) — sandboxed mini-apps the agent creates instantly without code changes
183
183
  - [**Drop-in Agent**](/docs/drop-in-agent) — mount `<AgentPanel>` into any React app
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.7.82",
3
+ "version": "0.8.0",
4
4
  "type": "module",
5
5
  "description": "Framework for agent-native application development — where AI agents and UI share state via files",
6
6
  "license": "MIT",
@@ -13,6 +13,10 @@
13
13
  "url": "https://github.com/BuilderIO/agent-native/issues"
14
14
  },
15
15
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
16
+ "publishConfig": {
17
+ "access": "public",
18
+ "provenance": true
19
+ },
16
20
  "bin": {
17
21
  "agent-native": "dist/cli/index.js"
18
22
  },
@@ -40,8 +44,9 @@
40
44
  "./settings": "./dist/settings/index.js",
41
45
  "./credentials": "./dist/credentials/index.js",
42
46
  "./event-bus": "./dist/event-bus/index.js",
43
- "./fetch-tool": "./dist/tools/fetch-tool.js",
44
- "./tools/url-safety": "./dist/tools/url-safety.js",
47
+ "./fetch-tool": "./dist/extensions/fetch-tool.js",
48
+ "./extensions/url-safety": "./dist/extensions/url-safety.js",
49
+ "./tools/url-safety": "./dist/extensions/url-safety.js",
45
50
  "./file-upload": "./dist/file-upload/index.js",
46
51
  "./resources": "./dist/resources/index.js",
47
52
  "./resources/store": "./dist/resources/store.js",
@@ -56,7 +61,8 @@
56
61
  "./sharing/actions/list-resource-shares": "./dist/sharing/actions/list-resource-shares.js",
57
62
  "./sharing/actions/set-resource-visibility": "./dist/sharing/actions/set-resource-visibility.js",
58
63
  "./client/sharing": "./dist/client/sharing/index.js",
59
- "./client/tools": "./dist/client/tools/index.js",
64
+ "./client/extensions": "./dist/client/extensions/index.js",
65
+ "./client/tools": "./dist/client/extensions/index.js",
60
66
  "./client/transcription/use-live-transcription": "./dist/client/transcription/use-live-transcription.js",
61
67
  "./client/transcription/BuilderTranscriptionCta": "./dist/client/transcription/BuilderTranscriptionCta.js",
62
68
  "./transcription/builder": "./dist/transcription/builder-transcription.js",
@@ -67,6 +73,7 @@
67
73
  "./mcp": "./dist/mcp/index.js",
68
74
  "./mcp-client": "./dist/mcp-client/index.js",
69
75
  "./tracking": "./dist/tracking/index.js",
76
+ "./usage": "./dist/usage/store.js",
70
77
  "./notifications": "./dist/notifications/index.js",
71
78
  "./client/notifications": "./dist/client/notifications/index.js",
72
79
  "./progress": "./dist/progress/index.js",
@@ -85,15 +92,6 @@
85
92
  "tsconfig.base.json",
86
93
  "src/templates"
87
94
  ],
88
- "scripts": {
89
- "build": "tsc && node scripts/finalize-build.mjs",
90
- "dev": "tsc --watch",
91
- "typecheck": "tsc --noEmit",
92
- "test": "vitest --run src",
93
- "prepack": "cp ../../README.md ./README.md",
94
- "prepublishOnly": "npm run build",
95
- "release": "npm version patch && npm publish --access public"
96
- },
97
95
  "dependencies": {
98
96
  "@amplitude/analytics-browser": "^2.41.1",
99
97
  "@anthropic-ai/sdk": "^0.90.0",
@@ -263,7 +261,7 @@
263
261
  "@react-router/fs-routes": "^7.13.1",
264
262
  "@supabase/supabase-js": "^2.49.0",
265
263
  "@tabler/icons-react": "^3.40.0",
266
- "@tailwindcss/vite": "catalog:",
264
+ "@tailwindcss/vite": "^4.2.4",
267
265
  "@tanstack/react-query": "^5.99.2",
268
266
  "@types/better-sqlite3": "^7.6.13",
269
267
  "@types/diff-match-patch": "^1.0.36",
@@ -283,10 +281,17 @@
283
281
  "node-pty": "^1.1.0",
284
282
  "react": "^19.2.5",
285
283
  "react-router": "^7.13.1",
286
- "tailwindcss": "catalog:",
284
+ "tailwindcss": "^4.2.4",
287
285
  "typescript": "^6.0.3",
288
- "vite": "catalog:",
286
+ "vite": "8.0.3",
289
287
  "vitest": "^4.1.5",
290
288
  "ws": "^8.18.0"
289
+ },
290
+ "scripts": {
291
+ "build": "tsc && node scripts/finalize-build.mjs",
292
+ "dev": "tsc --watch",
293
+ "typecheck": "tsc --noEmit",
294
+ "test": "vitest --run src",
295
+ "release": "npm version patch && npm publish --access public"
291
296
  }
292
- }
297
+ }
@@ -39,12 +39,13 @@ the shared package (`@{{APP_NAME}}/shared`).
39
39
  pnpm install
40
40
  cp .env.example .env # fill in DATABASE_URL, BETTER_AUTH_SECRET, and an LLM provider key
41
41
  pnpm repair:workspace-org -- --name "Example Co" --domain example.com --owner-email owner@example.com
42
- pnpm dev # starts the workspace gateway and opens Dispatch
42
+ pnpm dev # starts the workspace gateway; opens Dispatch when present
43
43
  ```
44
44
 
45
- The dev gateway serves Dispatch at `/dispatch` and every app at its own path
46
- such as `/starter`. It watches `apps/`, so newly-created apps are detected and
47
- started without restarting `pnpm dev`.
45
+ The dev gateway serves Dispatch at `/dispatch` when you keep the recommended
46
+ Dispatch app selected, and every app at its own path such as `/starter`. It
47
+ watches `apps/`, so newly-created apps are detected and started without
48
+ restarting `pnpm dev`.
48
49
 
49
50
  ## Workspace org identity
50
51