@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.
- package/dist/action.js +1 -1
- package/dist/action.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +8 -8
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts +2 -0
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +44 -18
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/types.d.ts +1 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/create.d.ts +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +87 -19
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/workspacify.d.ts.map +1 -1
- package/dist/cli/workspacify.js +12 -9
- package/dist/cli/workspacify.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +22 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/FeedbackButton.d.ts +3 -2
- package/dist/client/FeedbackButton.d.ts.map +1 -1
- package/dist/client/FeedbackButton.js +18 -14
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +254 -29
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-chat.d.ts +2 -0
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +11 -2
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/builder-frame.d.ts +11 -0
- package/dist/client/builder-frame.d.ts.map +1 -1
- package/dist/client/builder-frame.js +40 -9
- package/dist/client/builder-frame.js.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.js +1 -1
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -1
- package/dist/client/composer/PromptComposer.d.ts +2 -0
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +3 -3
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +3 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +25 -13
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/types.d.ts +1 -1
- package/dist/client/composer/types.d.ts.map +1 -1
- package/dist/client/composer/types.js.map +1 -1
- package/dist/client/extensions/EmbeddedExtension.d.ts +20 -0
- package/dist/client/extensions/EmbeddedExtension.d.ts.map +1 -0
- package/dist/client/{tools/EmbeddedTool.js → extensions/EmbeddedExtension.js} +41 -41
- package/dist/client/extensions/EmbeddedExtension.js.map +1 -0
- package/dist/client/extensions/ExtensionEditor.d.ts +5 -0
- package/dist/client/extensions/ExtensionEditor.d.ts.map +1 -0
- package/dist/client/extensions/ExtensionEditor.js +129 -0
- package/dist/client/extensions/ExtensionEditor.js.map +1 -0
- package/dist/client/{tools → extensions}/ExtensionSlot.d.ts +3 -3
- package/dist/client/extensions/ExtensionSlot.d.ts.map +1 -0
- package/dist/client/{tools → extensions}/ExtensionSlot.js +14 -14
- package/dist/client/extensions/ExtensionSlot.js.map +1 -0
- package/dist/client/extensions/ExtensionViewer.d.ts +5 -0
- package/dist/client/extensions/ExtensionViewer.d.ts.map +1 -0
- package/dist/client/{tools/ToolViewer.js → extensions/ExtensionViewer.js} +67 -65
- package/dist/client/extensions/ExtensionViewer.js.map +1 -0
- package/dist/client/extensions/ExtensionViewerPage.d.ts +2 -0
- package/dist/client/extensions/ExtensionViewerPage.d.ts.map +1 -0
- package/dist/client/{tools/ToolViewerPage.js → extensions/ExtensionViewerPage.js} +8 -8
- package/dist/client/extensions/ExtensionViewerPage.js.map +1 -0
- package/dist/client/extensions/ExtensionsListPage.d.ts +2 -0
- package/dist/client/extensions/ExtensionsListPage.d.ts.map +1 -0
- package/dist/client/extensions/ExtensionsListPage.js +67 -0
- package/dist/client/extensions/ExtensionsListPage.js.map +1 -0
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts +2 -0
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -0
- package/dist/client/{tools/ToolsSidebarSection.js → extensions/ExtensionsSidebarSection.js} +58 -58
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -0
- package/dist/client/{tools/tool-order.d.ts → extensions/extension-order.d.ts} +2 -2
- package/dist/client/extensions/extension-order.d.ts.map +1 -0
- package/dist/client/{tools/tool-order.js → extensions/extension-order.js} +3 -3
- package/dist/client/extensions/extension-order.js.map +1 -0
- package/dist/client/{tools → extensions}/iframe-bridge.d.ts +11 -11
- package/dist/client/extensions/iframe-bridge.d.ts.map +1 -0
- package/dist/client/{tools → extensions}/iframe-bridge.js +24 -24
- package/dist/client/extensions/iframe-bridge.js.map +1 -0
- package/dist/client/extensions/index.d.ts +14 -0
- package/dist/client/extensions/index.d.ts.map +1 -0
- package/dist/client/extensions/index.js +19 -0
- package/dist/client/extensions/index.js.map +1 -0
- package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +4 -1
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +2 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +87 -6
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/extensions/actions.d.ts +3 -0
- package/dist/extensions/actions.d.ts.map +1 -0
- package/dist/{tools → extensions}/actions.js +54 -51
- package/dist/extensions/actions.js.map +1 -0
- package/dist/{tools → extensions}/fetch-tool.d.ts +4 -0
- package/dist/extensions/fetch-tool.d.ts.map +1 -0
- package/dist/{tools → extensions}/fetch-tool.js +12 -7
- package/dist/extensions/fetch-tool.js.map +1 -0
- package/dist/extensions/html-shell.d.ts +56 -0
- package/dist/extensions/html-shell.d.ts.map +1 -0
- package/dist/{tools → extensions}/html-shell.js +101 -83
- package/dist/extensions/html-shell.js.map +1 -0
- package/dist/{tools → extensions}/proxy-security.d.ts +2 -2
- package/dist/extensions/proxy-security.d.ts.map +1 -0
- package/dist/{tools → extensions}/proxy-security.js +3 -3
- package/dist/extensions/proxy-security.js.map +1 -0
- package/dist/extensions/routes.d.ts +2 -0
- package/dist/extensions/routes.d.ts.map +1 -0
- package/dist/{tools → extensions}/routes.js +73 -69
- package/dist/extensions/routes.js.map +1 -0
- package/dist/{tools → extensions}/schema.d.ts +44 -38
- package/dist/extensions/schema.d.ts.map +1 -0
- package/dist/{tools → extensions}/schema.js +41 -34
- package/dist/extensions/schema.js.map +1 -0
- package/dist/extensions/slots/routes.d.ts +15 -0
- package/dist/extensions/slots/routes.d.ts.map +1 -0
- package/dist/{tools → extensions}/slots/routes.js +26 -26
- package/dist/extensions/slots/routes.js.map +1 -0
- package/dist/{tools → extensions}/slots/schema.d.ts +24 -21
- package/dist/extensions/slots/schema.d.ts.map +1 -0
- package/dist/extensions/slots/schema.js +79 -0
- package/dist/extensions/slots/schema.js.map +1 -0
- package/dist/extensions/slots/store.d.ts +66 -0
- package/dist/extensions/slots/store.d.ts.map +1 -0
- package/dist/extensions/slots/store.js +238 -0
- package/dist/extensions/slots/store.js.map +1 -0
- package/dist/extensions/store.d.ts +40 -0
- package/dist/extensions/store.d.ts.map +1 -0
- package/dist/{tools → extensions}/store.js +59 -54
- package/dist/extensions/store.js.map +1 -0
- package/dist/extensions/theme.d.ts.map +1 -0
- package/dist/extensions/theme.js.map +1 -0
- package/dist/{tools → extensions}/url-safety.d.ts +5 -3
- package/dist/extensions/url-safety.d.ts.map +1 -0
- package/dist/{tools → extensions}/url-safety.js +11 -4
- package/dist/extensions/url-safety.js.map +1 -0
- package/dist/server/action-discovery.d.ts +15 -0
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +45 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +12 -10
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth.d.ts +5 -4
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +80 -28
- package/dist/server/auth.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +15 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +65 -13
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/csrf.d.ts +3 -2
- package/dist/server/csrf.d.ts.map +1 -1
- package/dist/server/csrf.js +3 -2
- package/dist/server/csrf.js.map +1 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +15 -3
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/shared/workspace-app-id.d.ts +1 -1
- package/dist/shared/workspace-app-id.d.ts.map +1 -1
- package/dist/shared/workspace-app-id.js +5 -1
- package/dist/shared/workspace-app-id.js.map +1 -1
- package/dist/templates/workspace-root/README.md +5 -4
- package/dist/usage/store.d.ts +1 -1
- package/dist/usage/store.d.ts.map +1 -1
- package/dist/usage/store.js +1 -1
- package/dist/usage/store.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +17 -1
- package/dist/vite/client.js.map +1 -1
- package/docs/content/actions.md +10 -10
- package/docs/content/extensions.md +230 -0
- package/docs/content/key-concepts.md +2 -2
- package/docs/content/server.md +13 -13
- package/docs/content/sharing.md +2 -2
- package/docs/content/template-analytics.md +10 -0
- package/docs/content/template-calendar.md +10 -0
- package/docs/content/template-clips.md +10 -0
- package/docs/content/template-content.md +10 -0
- package/docs/content/template-dispatch.md +15 -0
- package/docs/content/template-forms.md +10 -0
- package/docs/content/template-mail.md +10 -0
- package/docs/content/template-slides.md +11 -1
- package/docs/content/template-starter.md +10 -0
- package/docs/content/template-video.md +10 -0
- package/docs/content/what-is-agent-native.md +1 -1
- package/package.json +22 -17
- package/src/templates/workspace-root/README.md +5 -4
- package/dist/client/tools/EmbeddedTool.d.ts +0 -20
- package/dist/client/tools/EmbeddedTool.d.ts.map +0 -1
- package/dist/client/tools/EmbeddedTool.js.map +0 -1
- package/dist/client/tools/ExtensionSlot.d.ts.map +0 -1
- package/dist/client/tools/ExtensionSlot.js.map +0 -1
- package/dist/client/tools/ToolEditor.d.ts +0 -5
- package/dist/client/tools/ToolEditor.d.ts.map +0 -1
- package/dist/client/tools/ToolEditor.js +0 -129
- package/dist/client/tools/ToolEditor.js.map +0 -1
- package/dist/client/tools/ToolViewer.d.ts +0 -5
- package/dist/client/tools/ToolViewer.d.ts.map +0 -1
- package/dist/client/tools/ToolViewer.js.map +0 -1
- package/dist/client/tools/ToolViewerPage.d.ts +0 -2
- package/dist/client/tools/ToolViewerPage.d.ts.map +0 -1
- package/dist/client/tools/ToolViewerPage.js.map +0 -1
- package/dist/client/tools/ToolsListPage.d.ts +0 -2
- package/dist/client/tools/ToolsListPage.d.ts.map +0 -1
- package/dist/client/tools/ToolsListPage.js +0 -67
- package/dist/client/tools/ToolsListPage.js.map +0 -1
- package/dist/client/tools/ToolsSidebarSection.d.ts +0 -2
- package/dist/client/tools/ToolsSidebarSection.d.ts.map +0 -1
- package/dist/client/tools/ToolsSidebarSection.js.map +0 -1
- package/dist/client/tools/iframe-bridge.d.ts.map +0 -1
- package/dist/client/tools/iframe-bridge.js.map +0 -1
- package/dist/client/tools/index.d.ts +0 -8
- package/dist/client/tools/index.d.ts.map +0 -1
- package/dist/client/tools/index.js +0 -8
- package/dist/client/tools/index.js.map +0 -1
- package/dist/client/tools/tool-order.d.ts.map +0 -1
- package/dist/client/tools/tool-order.js.map +0 -1
- package/dist/tools/actions.d.ts +0 -3
- package/dist/tools/actions.d.ts.map +0 -1
- package/dist/tools/actions.js.map +0 -1
- package/dist/tools/fetch-tool.d.ts.map +0 -1
- package/dist/tools/fetch-tool.js.map +0 -1
- package/dist/tools/html-shell.d.ts +0 -45
- package/dist/tools/html-shell.d.ts.map +0 -1
- package/dist/tools/html-shell.js.map +0 -1
- package/dist/tools/proxy-security.d.ts.map +0 -1
- package/dist/tools/proxy-security.js.map +0 -1
- package/dist/tools/routes.d.ts +0 -2
- package/dist/tools/routes.d.ts.map +0 -1
- package/dist/tools/routes.js.map +0 -1
- package/dist/tools/schema.d.ts.map +0 -1
- package/dist/tools/schema.js.map +0 -1
- package/dist/tools/slots/routes.d.ts +0 -15
- package/dist/tools/slots/routes.d.ts.map +0 -1
- package/dist/tools/slots/routes.js.map +0 -1
- package/dist/tools/slots/schema.d.ts.map +0 -1
- package/dist/tools/slots/schema.js +0 -76
- package/dist/tools/slots/schema.js.map +0 -1
- package/dist/tools/slots/store.d.ts +0 -66
- package/dist/tools/slots/store.d.ts.map +0 -1
- package/dist/tools/slots/store.js +0 -227
- package/dist/tools/slots/store.js.map +0 -1
- package/dist/tools/store.d.ts +0 -40
- package/dist/tools/store.d.ts.map +0 -1
- package/dist/tools/store.js.map +0 -1
- package/dist/tools/theme.d.ts.map +0 -1
- package/dist/tools/theme.js.map +0 -1
- package/dist/tools/url-safety.d.ts.map +0 -1
- package/dist/tools/url-safety.js.map +0 -1
- package/docs/content/tools.md +0 -205
- /package/dist/{tools → extensions}/theme.d.ts +0 -0
- /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
|
-
##
|
|
273
|
+
## Extensions {#extensions}
|
|
274
274
|
|
|
275
|
-
**
|
|
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
|
|
package/docs/content/server.md
CHANGED
|
@@ -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/
|
|
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
|
|
package/docs/content/sharing.md
CHANGED
|
@@ -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
|
-
- **
|
|
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
|
-
- [
|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
-
|
|
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
|
+

|
|
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
|
+

|
|
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
|
+

|
|
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
|
-
- [**
|
|
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.
|
|
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/
|
|
44
|
-
"./
|
|
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/
|
|
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": "
|
|
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": "
|
|
284
|
+
"tailwindcss": "^4.2.4",
|
|
287
285
|
"typescript": "^6.0.3",
|
|
288
|
-
"vite": "
|
|
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
|
|
42
|
+
pnpm dev # starts the workspace gateway; opens Dispatch when present
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
The dev gateway serves Dispatch at `/dispatch`
|
|
46
|
-
|
|
47
|
-
|
|
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
|
|