@agent-native/core 0.7.4 → 0.7.7
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/README.md +6 -5
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +8 -4
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/types.d.ts +1 -1
- package/dist/agent/engine/types.d.ts.map +1 -1
- package/dist/agent/production-agent.d.ts +7 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +153 -118
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts +4 -0
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +46 -25
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +12 -3
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +25 -4
- package/dist/agent/run-store.js.map +1 -1
- package/dist/chat-threads/store.d.ts +13 -0
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +66 -10
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +8 -1
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +8 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/info.d.ts +2 -0
- package/dist/cli/info.d.ts.map +1 -0
- package/dist/cli/info.js +103 -0
- package/dist/cli/info.js.map +1 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +249 -85
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +12 -1
- package/dist/client/agent-chat-adapter.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 +46 -2
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/VoiceButton.d.ts +21 -0
- package/dist/client/composer/VoiceButton.d.ts.map +1 -0
- package/dist/client/composer/VoiceButton.js +51 -0
- package/dist/client/composer/VoiceButton.js.map +1 -0
- package/dist/client/composer/useVoiceDictation.d.ts +38 -0
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -0
- package/dist/client/composer/useVoiceDictation.js +398 -0
- package/dist/client/composer/useVoiceDictation.js.map +1 -0
- package/dist/client/onboarding/OnboardingPanel.js +2 -2
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts +5 -4
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +90 -24
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/resources/McpServerDetail.d.ts +15 -0
- package/dist/client/resources/McpServerDetail.d.ts.map +1 -0
- package/dist/client/resources/McpServerDetail.js +65 -0
- package/dist/client/resources/McpServerDetail.js.map +1 -0
- package/dist/client/resources/ResourceEditor.js +1 -1
- package/dist/client/resources/ResourceEditor.js.map +1 -1
- package/dist/client/resources/ResourceTree.d.ts +6 -1
- package/dist/client/resources/ResourceTree.d.ts.map +1 -1
- package/dist/client/resources/ResourceTree.js +18 -7
- package/dist/client/resources/ResourceTree.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +191 -20
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/resources/use-mcp-servers.d.ts +68 -0
- package/dist/client/resources/use-mcp-servers.d.ts.map +1 -0
- package/dist/client/resources/use-mcp-servers.js +83 -0
- package/dist/client/resources/use-mcp-servers.js.map +1 -0
- package/dist/client/resources/use-resources.d.ts +39 -1
- package/dist/client/resources/use-resources.d.ts.map +1 -1
- package/dist/client/resources/use-resources.js +102 -0
- package/dist/client/resources/use-resources.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +3 -2
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts +14 -0
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -0
- package/dist/client/settings/VoiceTranscriptionSection.js +111 -0
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -0
- package/dist/client/sharing/ShareButton.d.ts +6 -4
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +299 -34
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.d.ts +22 -4
- package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
- package/dist/client/sharing/ShareDialog.js +170 -148
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/client/sharing/VisibilityBadge.d.ts.map +1 -1
- package/dist/client/sharing/VisibilityBadge.js +1 -2
- package/dist/client/sharing/VisibilityBadge.js.map +1 -1
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +20 -1
- package/dist/client/use-action.js.map +1 -1
- package/dist/db/migrations.d.ts +18 -3
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +25 -3
- package/dist/db/migrations.js.map +1 -1
- package/dist/deploy/workspace-core.js +2 -2
- package/dist/mcp-client/config.d.ts +20 -1
- package/dist/mcp-client/config.d.ts.map +1 -1
- package/dist/mcp-client/config.js +28 -11
- package/dist/mcp-client/config.js.map +1 -1
- package/dist/mcp-client/hub-client.d.ts +38 -0
- package/dist/mcp-client/hub-client.d.ts.map +1 -0
- package/dist/mcp-client/hub-client.js +147 -0
- package/dist/mcp-client/hub-client.js.map +1 -0
- package/dist/mcp-client/hub-routes.d.ts +42 -0
- package/dist/mcp-client/hub-routes.d.ts.map +1 -0
- package/dist/mcp-client/hub-routes.js +114 -0
- package/dist/mcp-client/hub-routes.js.map +1 -0
- package/dist/mcp-client/index.d.ts +15 -0
- package/dist/mcp-client/index.d.ts.map +1 -1
- package/dist/mcp-client/index.js +35 -0
- package/dist/mcp-client/index.js.map +1 -1
- package/dist/mcp-client/manager.d.ts +54 -8
- package/dist/mcp-client/manager.d.ts.map +1 -1
- package/dist/mcp-client/manager.js +276 -59
- package/dist/mcp-client/manager.js.map +1 -1
- package/dist/mcp-client/remote-store.d.ts +102 -0
- package/dist/mcp-client/remote-store.d.ts.map +1 -0
- package/dist/mcp-client/remote-store.js +200 -0
- package/dist/mcp-client/remote-store.js.map +1 -0
- package/dist/mcp-client/routes.d.ts +55 -0
- package/dist/mcp-client/routes.d.ts.map +1 -0
- package/dist/mcp-client/routes.js +384 -0
- package/dist/mcp-client/routes.js.map +1 -0
- package/dist/mcp-client/visibility.d.ts +16 -0
- package/dist/mcp-client/visibility.d.ts.map +1 -0
- package/dist/mcp-client/visibility.js +45 -0
- package/dist/mcp-client/visibility.js.map +1 -0
- package/dist/org/context.js +2 -2
- package/dist/org/context.js.map +1 -1
- package/dist/org/handlers.js +2 -2
- package/dist/org/handlers.js.map +1 -1
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +30 -0
- package/dist/resources/handlers.js.map +1 -1
- package/dist/secrets/register-framework-secrets.d.ts +13 -0
- package/dist/secrets/register-framework-secrets.d.ts.map +1 -0
- package/dist/secrets/register-framework-secrets.js +59 -0
- package/dist/secrets/register-framework-secrets.js.map +1 -0
- package/dist/secrets/register.d.ts.map +1 -1
- package/dist/secrets/register.js +8 -1
- package/dist/secrets/register.js.map +1 -1
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +22 -2
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +16 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +237 -70
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/app-url.d.ts.map +1 -1
- package/dist/server/app-url.js +11 -3
- package/dist/server/app-url.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +50 -0
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +99 -4
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +44 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +6 -0
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/date-utils.d.ts +15 -0
- package/dist/server/date-utils.d.ts.map +1 -0
- package/dist/server/date-utils.js +41 -0
- package/dist/server/date-utils.js.map +1 -0
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts +3 -0
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +13 -3
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/request-context.d.ts +9 -0
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js +10 -0
- package/dist/server/request-context.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +26 -0
- package/dist/server/transcribe-voice.d.ts.map +1 -0
- package/dist/server/transcribe-voice.js +143 -0
- package/dist/server/transcribe-voice.js.map +1 -0
- package/dist/styles/agent-native.css +111 -0
- package/dist/tailwind.preset.d.ts +2 -2
- package/dist/tailwind.preset.d.ts.map +1 -1
- package/dist/tailwind.preset.js +27 -7
- package/dist/tailwind.preset.js.map +1 -1
- package/dist/templates/default/app/global.css +65 -68
- package/dist/templates/default/components.json +1 -1
- package/dist/templates/default/package.json +2 -4
- package/dist/templates/default/vite.config.ts +3 -0
- package/dist/templates/workspace-core/package.json +1 -4
- package/dist/templates/workspace-core/src/index.ts +1 -1
- package/dist/templates/workspace-core/styles/tokens.css +22 -0
- package/dist/templates/workspace-core/tsconfig.json +1 -1
- package/dist/vite/client.d.ts +6 -0
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +18 -1
- package/dist/vite/client.js.map +1 -1
- package/docs/content/actions.md +169 -74
- package/docs/content/agent-teams.md +139 -0
- package/docs/content/cloneable-saas.md +98 -0
- package/docs/content/creating-templates.md +9 -11
- package/docs/content/deployment.md +2 -9
- package/docs/content/drop-in-agent.md +200 -0
- package/docs/content/enterprise-workspace.md +22 -10
- package/docs/content/getting-started.md +34 -19
- package/docs/content/integrations.md +3 -3
- package/docs/content/key-concepts.md +50 -23
- package/docs/content/mcp-clients.md +71 -0
- package/docs/content/pure-agent-apps.md +69 -0
- package/docs/content/recurring-jobs.md +123 -0
- package/docs/content/skills-guide.md +8 -0
- package/docs/content/template-analytics.md +190 -0
- package/docs/content/template-calendar.md +151 -0
- package/docs/content/template-clips.md +55 -0
- package/docs/content/template-content.md +141 -0
- package/docs/content/template-dispatch.md +58 -0
- package/docs/content/template-forms.md +51 -0
- package/docs/content/template-mail.md +169 -0
- package/docs/content/template-slides.md +218 -0
- package/docs/content/template-starter.md +68 -0
- package/docs/content/template-video.md +162 -0
- package/docs/content/voice-input.md +59 -0
- package/docs/content/what-is-agent-native.md +142 -45
- package/docs/content/workspace-management.md +1 -0
- package/docs/content/{resources.md → workspace.md} +94 -42
- package/package.json +9 -16
- package/src/templates/default/app/global.css +65 -68
- package/src/templates/default/components.json +1 -1
- package/src/templates/default/package.json +2 -4
- package/src/templates/default/vite.config.ts +3 -0
- package/src/templates/workspace-core/package.json +1 -4
- package/src/templates/workspace-core/src/index.ts +1 -1
- package/src/templates/workspace-core/styles/tokens.css +22 -0
- package/src/templates/workspace-core/tsconfig.json +1 -1
- package/dist/templates/default/postcss.config.js +0 -6
- package/dist/templates/default/tailwind.config.ts +0 -7
- package/dist/templates/workspace-core/tailwind.preset.ts +0 -34
- package/src/templates/default/postcss.config.js +0 -6
- package/src/templates/default/tailwind.config.ts +0 -7
- package/src/templates/workspace-core/tailwind.preset.ts +0 -34
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Starter Template"
|
|
3
|
+
description: "The minimal agent-native scaffold — agent chat, actions, application state, polling, auth — wired up, with no domain code. Build from scratch."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Starter
|
|
7
|
+
|
|
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
|
+
|
|
10
|
+
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
|
+
|
|
12
|
+
## What's in it {#whats-in-it}
|
|
13
|
+
|
|
14
|
+
- **Agent sidebar** (`<AgentSidebar>`) wired into `app/root.tsx`. Chat, CLI, workspace tabs all present.
|
|
15
|
+
- **Agent chat plugin** pre-configured so the chat actually talks to Claude (once `ANTHROPIC_API_KEY` is set).
|
|
16
|
+
- **Auth** via Better Auth — login, signup, sessions, organizations. Local-mode fallback (`local@localhost`) for first-run dev.
|
|
17
|
+
- **Actions directory** with one example (`actions/hello-world.ts`) and the `view-screen` / `navigate` standard actions wired up.
|
|
18
|
+
- **Drizzle schema** with the framework's core tables (application_state, settings, oauth_tokens, sessions, resources).
|
|
19
|
+
- **Polling sync** (`useDbSync`) already wired so UI auto-refreshes when the agent writes to the database.
|
|
20
|
+
- **AGENTS.md** with the framework-wide rules the agent reads on every turn.
|
|
21
|
+
- **One route** at `/` that says hi and renders the sidebar toggle. That's it.
|
|
22
|
+
|
|
23
|
+
## What's _not_ in it {#not-in-it}
|
|
24
|
+
|
|
25
|
+
- No domain tables (no emails, no events, no forms)
|
|
26
|
+
- No fancy UI — no dashboards, no lists, no charts
|
|
27
|
+
- No template-specific actions beyond the stubs
|
|
28
|
+
- No integrations (Slack, SendGrid, etc.)
|
|
29
|
+
|
|
30
|
+
That's the point. Ship whatever belongs to _your_ app, not someone else's.
|
|
31
|
+
|
|
32
|
+
## When to pick it {#when-to-pick}
|
|
33
|
+
|
|
34
|
+
- **Building a pure-agent app** — the kind where the UI is mostly "let me see what the agent did." See [Pure-Agent Apps](/docs/pure-agent-apps).
|
|
35
|
+
- **Learning the framework** — this is the smallest surface to wrap your head around.
|
|
36
|
+
- **An internal tool** with a unique domain that doesn't match any of the other templates.
|
|
37
|
+
- **A prototype** — ship the agent now, add real UI later.
|
|
38
|
+
|
|
39
|
+
Pick a domain template ([Mail](/docs/template-mail), [Calendar](/docs/template-calendar), [Content](/docs/template-content), [Forms](/docs/template-forms), [Analytics](/docs/template-analytics), etc.) when there's an existing product shape that fits.
|
|
40
|
+
|
|
41
|
+
## Scaffolding {#scaffolding}
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pnpm dlx @agent-native/core create my-app --template starter --standalone
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Or, in a workspace:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
pnpm dlx @agent-native/core create my-platform # pick "Starter" (pre-selected by default) plus any others
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## First edits {#first-edits}
|
|
54
|
+
|
|
55
|
+
After scaffolding:
|
|
56
|
+
|
|
57
|
+
1. Ask the agent: "Add a data model for `notes` — a note has an id, title, body, owner. Render a list of notes at `/notes` and let the user create one."
|
|
58
|
+
2. The agent adds the Drizzle schema, the `create-note` and `list-notes` actions, and the new route. You watch it happen.
|
|
59
|
+
3. `pnpm dev`, navigate to `/notes`, add a note through the UI. Ask the agent "draft a note summarizing yesterday's standup." Watch it use your new action.
|
|
60
|
+
|
|
61
|
+
That's the loop.
|
|
62
|
+
|
|
63
|
+
## What's next
|
|
64
|
+
|
|
65
|
+
- [**Getting Started**](/docs) — the broader CLI + workspace flow
|
|
66
|
+
- [**Key Concepts**](/docs/key-concepts) — the six rules and what you get for free
|
|
67
|
+
- [**Actions**](/docs/actions) — the action system you'll add to
|
|
68
|
+
- [**Adding a Feature**](/docs/key-concepts#four-area-checklist) — the four-area checklist every new feature should update
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Video Template"
|
|
3
|
+
description: "A Remotion-based animation studio where compositions are React components, animations are timeline tracks, and the agent edits alongside you."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Video Template
|
|
7
|
+
|
|
8
|
+
The Video template is a programmatic video studio built on [Remotion](https://remotion.dev). Compositions are React components, animations are tracks on a timeline, and renders output to MP4 or WebM. It replaces point-and-click editors like After Effects, Premiere, and Veed for the kind of motion graphics, product demos, and kinetic text videos that are a pain to keyframe by hand.
|
|
9
|
+
|
|
10
|
+
## Overview {#overview}
|
|
11
|
+
|
|
12
|
+
Everything you see in the studio is code. A composition is a `CompositionEntry` in `app/remotion/registry.ts` that points at a React component in `app/remotion/compositions/`. Every animation in that component reads from an `AnimationTrack` so users can drag, resize, and retime it in the timeline UI. The agent can create new compositions, add tracks, tune easing, and write whole React components that plug into the registry.
|
|
13
|
+
|
|
14
|
+
The studio runs on Remotion's `<Player>` for preview and the Remotion CLI for final render. Output defaults to 1920x1080 at 30fps.
|
|
15
|
+
|
|
16
|
+
## Quick start {#quick-start}
|
|
17
|
+
|
|
18
|
+
Create a workspace with the Video app scaffolded:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx @agent-native/core create my-video-app
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
During the picker, select **Video**. Then:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
cd my-video-app
|
|
28
|
+
pnpm install
|
|
29
|
+
pnpm dev
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Open the studio in your browser and pick a composition from the home screen. Ask the agent something like "add a logo reveal that fades in at 2 seconds" and it will edit the registry and the composition for you.
|
|
33
|
+
|
|
34
|
+
Live demo: [videos.agent-native.com](https://videos.agent-native.com).
|
|
35
|
+
|
|
36
|
+
## Key features {#key-features}
|
|
37
|
+
|
|
38
|
+
### React-based compositions
|
|
39
|
+
|
|
40
|
+
Every video is a React component built on Remotion primitives (`AbsoluteFill`, `useCurrentFrame`, `useVideoConfig`). Twelve example compositions ship by default — kinetic text, logo reveals, particle bursts, interactive UI demos, slideshows. Add new ones by dropping a `.tsx` file in `app/remotion/compositions/` and registering it in `app/remotion/registry.ts`.
|
|
41
|
+
|
|
42
|
+
### Timeline tracks
|
|
43
|
+
|
|
44
|
+
Animations are tracks, not hardcoded frame checks. A track has `startFrame`, `endFrame`, `easing`, and a list of `animatedProps` (`opacity`, `translateY`, `scale`, rotation, colors, etc.). Three track shapes:
|
|
45
|
+
|
|
46
|
+
- **Duration tracks** — bars you can drag and resize in the timeline.
|
|
47
|
+
- **Keyframe tracks** — diamond markers at specific frames for instant state changes (`startFrame === endFrame`).
|
|
48
|
+
- **Expression tracks** — programmatic animations (typing reveals, particle bursts) flagged with `programmatic: true` and shown with a purple `fx` badge.
|
|
49
|
+
|
|
50
|
+
Helper utilities in `app/remotion/trackAnimation.ts` (`findTrack`, `trackProgress`, `getPropValue`) wire a track's values into a component's render.
|
|
51
|
+
|
|
52
|
+
### Easing curves
|
|
53
|
+
|
|
54
|
+
30+ easing curves ship in `app/types.ts` — linear, power1-4 in/out/inOut, back, bounce, circ, elastic, expo, sine, and Remotion's `spring`. The Properties panel shows a visual preview of the curve shape for each one.
|
|
55
|
+
|
|
56
|
+
### Camera controls
|
|
57
|
+
|
|
58
|
+
Each composition has a dedicated `camera` track with six animatable properties: `translateX`, `translateY`, `scale`, `rotateX`, `rotateY`, `perspective`. The camera toolbar above the player has pan, zoom, and tilt tools — click a tool, drag on the preview, and a keyframe is auto-created at the current frame. `CameraHost` (in `app/remotion/CameraHost.tsx`) applies the chained CSS 3D transform to everything inside.
|
|
59
|
+
|
|
60
|
+
### Multi-keyframe editing
|
|
61
|
+
|
|
62
|
+
Every animated property supports an optional `keyframes` array. Interpolation is linear between keyframes, with hold-at-first and hold-at-last at the edges. In the timeline you can box-select keyframes, shift-click to add or remove, and drag groups while keeping relative timing.
|
|
63
|
+
|
|
64
|
+
### Adjustable parameters
|
|
65
|
+
|
|
66
|
+
Programmatic animations expose internal magic numbers as user-editable `parameters` — character width, drift distance, particle count, stagger delay. Inputs appear in the Properties panel with min/max/step bounds and save to localStorage automatically.
|
|
67
|
+
|
|
68
|
+
### Interactive cursor system
|
|
69
|
+
|
|
70
|
+
The `cursor` track drives a visible cursor that moves across the composition. Hover zones on interactive elements (buttons, tabs, inputs, cards) change the cursor appearance — arrow, pointer, or I-beam. See `app/remotion/hooks/useInteractiveComponent.ts` and `app/remotion/ui-components/InteractiveCard.tsx`.
|
|
71
|
+
|
|
72
|
+
### View range and repeat playback
|
|
73
|
+
|
|
74
|
+
The timeline has a range navigator at the bottom (AE-style triangular handles). Drag to zoom and pan the visible time window. Playback in the player is constrained to that range, with a repeat toggle that loops inside it.
|
|
75
|
+
|
|
76
|
+
### Render output
|
|
77
|
+
|
|
78
|
+
Composition size, fps, and render quality are per-composition in the Properties panel. Render quality is supersampling — 1x, 2x, or 3x internal resolution to keep text and vectors crisp during camera zoom. Final render happens via the Remotion CLI to MP4 or WebM.
|
|
79
|
+
|
|
80
|
+
### Composition persistence
|
|
81
|
+
|
|
82
|
+
User edits (track values, parameter values, prop overrides, composition settings) persist to localStorage per composition. The **Save** button in the top-right of the composition view writes the current state back to `app/remotion/registry.ts` as TypeScript — so new users and sessions pick up the changes.
|
|
83
|
+
|
|
84
|
+
## Working with the agent {#working-with-the-agent}
|
|
85
|
+
|
|
86
|
+
The agent always knows which composition you have open. Navigation state (`{ view, compositionId }`) is written to the framework's `application_state` table, and the `view-screen` action returns it plus a hint pointing at `app/remotion/registry.ts`. You don't have to tell the agent which composition you're on — ask it to act on "this one" and it will.
|
|
87
|
+
|
|
88
|
+
Example prompts:
|
|
89
|
+
|
|
90
|
+
- "Add a title card that fades in at 2 seconds and holds until 5."
|
|
91
|
+
- "Change the camera to zoom 2x on the logo between frames 60 and 90."
|
|
92
|
+
- "Make the typing reveal slower — 40% longer."
|
|
93
|
+
- "The particle burst is too dense. Drop the count to 12."
|
|
94
|
+
- "Create a new composition called intro-loop, 1080x1080, 6 seconds."
|
|
95
|
+
- "Add a click animation on the button zone and animate the cursor to it."
|
|
96
|
+
- "Give this track a spring easing instead of ease-out."
|
|
97
|
+
|
|
98
|
+
Under the hood the agent calls actions like `navigate`, `create-composition`, `generate-animated-component`, and edits `app/remotion/registry.ts` and `app/remotion/compositions/*.tsx` directly. Every change shows up in the timeline.
|
|
99
|
+
|
|
100
|
+
If you select a track in the UI and hit Cmd+I to focus the agent, it sees which track you've selected — "make this one snappier" just works.
|
|
101
|
+
|
|
102
|
+
## Data model {#data-model}
|
|
103
|
+
|
|
104
|
+
Server-side schema is in `templates/videos/server/db/schema.ts`:
|
|
105
|
+
|
|
106
|
+
- `compositions` — id, title, type, `data` (full composition JSON blob), ownership columns, timestamps.
|
|
107
|
+
- `composition_shares` — standard share grants produced by `createSharesTable()`.
|
|
108
|
+
|
|
109
|
+
The registry in `app/remotion/registry.ts` is the in-code source of truth for what ships with the template. The SQL table stores user-created compositions and overrides. Studio state (per-composition track edits, prop overrides, composition settings) is mirrored to `localStorage` under `videos-tracks:<id>`, `videos-props:<id>`, and `videos-comp-settings:<id>`, and deep-merged back onto the registry defaults on load.
|
|
110
|
+
|
|
111
|
+
Core TypeScript shapes (`app/types.ts`):
|
|
112
|
+
|
|
113
|
+
- `AnimationTrack` — `id`, `label`, `startFrame`, `endFrame`, `easing`, `animatedProps[]`.
|
|
114
|
+
- `AnimatedProp` — `property`, `from`, `to`, `unit`, plus optional `keyframes`, `programmatic`, `description`, `codeSnippet`, `parameters`, `parameterValues`.
|
|
115
|
+
- `CompositionEntry` — `id`, `title`, `description`, `component`, `durationInFrames`, `fps`, `width`, `height`, `defaultProps`, `tracks`.
|
|
116
|
+
|
|
117
|
+
Compositions are private by default. Visibility can be `private`, `org`, or `public`, and share grants give `viewer`, `editor`, or `admin` roles — wired through the framework's sharing primitive.
|
|
118
|
+
|
|
119
|
+
## Customizing it {#customizing-it}
|
|
120
|
+
|
|
121
|
+
The template folder is `templates/videos/` (the user-facing slug is `video`, but the folder is plural).
|
|
122
|
+
|
|
123
|
+
**Actions** — `templates/videos/actions/`
|
|
124
|
+
|
|
125
|
+
- `view-screen.ts` — returns current navigation state for the agent.
|
|
126
|
+
- `navigate.ts` — navigate to a composition (`--compositionId <id>`) or the home view (`--view home`).
|
|
127
|
+
- `create-composition.ts` — scaffold a new composition with the standard camera and cursor tracks.
|
|
128
|
+
- `generate-animated-component.ts` — generate a new animated component file with boilerplate.
|
|
129
|
+
- `validate-compositions.ts` — check all registered compositions for structural problems.
|
|
130
|
+
- `list-compositions.ts`, `get-composition.ts`, `update-composition.ts`, `delete-composition.ts`, `save-composition.ts` — CRUD over the SQL table.
|
|
131
|
+
|
|
132
|
+
**Routes** — `templates/videos/app/routes/`
|
|
133
|
+
|
|
134
|
+
- `_index.tsx` — studio home; renders the shell and composition list.
|
|
135
|
+
- `c.$compositionId.tsx` — composition editor (timeline, player, properties panel).
|
|
136
|
+
- `components.tsx` — component library browser.
|
|
137
|
+
- `team.tsx` — team management.
|
|
138
|
+
|
|
139
|
+
**Remotion internals** — `templates/videos/app/remotion/`
|
|
140
|
+
|
|
141
|
+
- `registry.ts` — the authoritative composition list.
|
|
142
|
+
- `compositions/` — one `.tsx` per composition, plus an `index.ts` barrel.
|
|
143
|
+
- `trackAnimation.ts` — `trackProgress`, `getPropValue`, `findTrack`, `getPropValueKeyframed`.
|
|
144
|
+
- `CameraHost.tsx` — wraps composition content with the camera transform.
|
|
145
|
+
- `hooks/`, `ui-components/`, `components/` — interactive element helpers, cursor rendering, animated element wrappers.
|
|
146
|
+
|
|
147
|
+
**Studio UI** — `templates/videos/app/components/`
|
|
148
|
+
|
|
149
|
+
- `Timeline.tsx` — the fully-controlled timeline (`viewStart` / `viewEnd` own no state internally).
|
|
150
|
+
- `VideoPlayer.tsx` — Remotion `<Player>` wrapper with range-constrained playback.
|
|
151
|
+
- `TrackPropertiesPanel.tsx`, `CompSettingsEditor.tsx`, `PropsEditor.tsx` — the right-side panels.
|
|
152
|
+
- `CameraToolbar.tsx`, `CameraControls.tsx` — camera tools and numeric controls.
|
|
153
|
+
|
|
154
|
+
**Agent instructions** — `templates/videos/AGENTS.md` is the long-form guide the agent reads. It covers the animation-as-track rule, camera system, cursor system, CSS filter units, interactive component registration, UI spacing, and checklists for creating or editing compositions.
|
|
155
|
+
|
|
156
|
+
**Skills** — `templates/videos/.agents/skills/`
|
|
157
|
+
|
|
158
|
+
- `composition-management/SKILL.md` — how to create and register compositions.
|
|
159
|
+
- `animation-tracks/SKILL.md` — how to edit tracks and animated props.
|
|
160
|
+
- Plus the standard framework skills: `actions`, `self-modifying-code`, `delegate-to-agent`, `storing-data`, `security`, `frontend-design`, `create-skill`, `capture-learnings`.
|
|
161
|
+
|
|
162
|
+
To add a new composition, follow the checklist in `AGENTS.md`: create the component, declare `FALLBACK_TRACKS`, use `findTrack` / `trackProgress` / `getPropValue` (never hardcode frames), export from `compositions/index.ts`, add a `CompositionEntry` to the registry, and run `pnpm typecheck`.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Voice Input"
|
|
3
|
+
description: "Voice dictation in the agent chat composer — OpenAI Whisper with a browser Web Speech fallback."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Voice Input
|
|
7
|
+
|
|
8
|
+
Every agent-native app has a microphone in the chat composer. Click it, talk, and your words get transcribed into the prompt. Useful on mobile, useful for long prompts, useful when your hands are on something else.
|
|
9
|
+
|
|
10
|
+
The framework handles all of this automatically — no setup on your end other than an OpenAI API key for best-quality transcription.
|
|
11
|
+
|
|
12
|
+
## How it works {#how-it-works}
|
|
13
|
+
|
|
14
|
+
The composer's voice button records audio in the browser, then picks a provider:
|
|
15
|
+
|
|
16
|
+
1. **OpenAI Whisper (preferred).** If an `OPENAI_API_KEY` is configured, the browser POSTs the audio to `/_agent-native/transcribe-voice`, which proxies to Whisper and returns the transcript. Hard 25 MB limit per clip (Whisper's).
|
|
17
|
+
2. **Browser Web Speech API (fallback).** If no key is available, the composer falls back to the browser's built-in speech recognition. Works in Chromium-based browsers (Chrome, Edge, Arc) and Safari. Less accurate; streams live.
|
|
18
|
+
|
|
19
|
+
Provider choice is stored in application state under `settings.voiceTranscriptionProvider` (`"openai"` or `"browser"`) so the user can force one or the other in the sidebar settings.
|
|
20
|
+
|
|
21
|
+
The route is **same-origin only** — cross-site POSTs are rejected so an attacker can't burn your OpenAI credits from an external page.
|
|
22
|
+
|
|
23
|
+
## Enabling Whisper {#enabling-whisper}
|
|
24
|
+
|
|
25
|
+
Two ways to provide an OpenAI key:
|
|
26
|
+
|
|
27
|
+
### Per-user (recommended for SaaS)
|
|
28
|
+
|
|
29
|
+
The user sets their own key via the agent sidebar settings UI. It's stored as a user-scoped encrypted secret (via `readAppSecret`). Each user pays for their own transcription; zero cost to the host.
|
|
30
|
+
|
|
31
|
+
### Shared (for internal tools)
|
|
32
|
+
|
|
33
|
+
Set `OPENAI_API_KEY` as an environment variable or in the `settings` table. Every user's transcription hits the shared key.
|
|
34
|
+
|
|
35
|
+
The route checks user-scope first, then falls back to the shared credential — so a power user with their own key can override the shared one.
|
|
36
|
+
|
|
37
|
+
If no key is configured at all, the route returns a 400 the composer recognizes, and silently falls back to Web Speech.
|
|
38
|
+
|
|
39
|
+
## The route {#route}
|
|
40
|
+
|
|
41
|
+
`POST /_agent-native/transcribe-voice`
|
|
42
|
+
|
|
43
|
+
- **Body:** multipart form with a single `audio` part (webm/opus by default).
|
|
44
|
+
- **Response:** `{ text }` on success, `{ error }` on failure.
|
|
45
|
+
- **Auth:** requires an active session (Better Auth cookie).
|
|
46
|
+
- **Origin check:** same-origin only.
|
|
47
|
+
- **Max size:** 25 MB (Whisper's hard limit).
|
|
48
|
+
|
|
49
|
+
You don't need to call this directly — the composer does. But if you're building a custom input surface and want the same transcription, POST a `FormData` with an `audio` blob to the same route.
|
|
50
|
+
|
|
51
|
+
## Customizing the provider {#customizing}
|
|
52
|
+
|
|
53
|
+
The provider field is a plain application-state key, so the agent can change it on request (`"use the browser speech recognizer instead"`). If you're building a template with different requirements — say, an on-prem Whisper deployment — swap the route handler by registering your own `transcribe-voice` route before the framework mounts the default.
|
|
54
|
+
|
|
55
|
+
## What's next
|
|
56
|
+
|
|
57
|
+
- [**Drop-in Agent**](/docs/drop-in-agent) — the composer that exposes the voice button
|
|
58
|
+
- [**Onboarding**](/docs/onboarding) — registering the OpenAI key as a setup step
|
|
59
|
+
- [**Security & Data Scoping**](/docs/security) — how encrypted secrets are stored per user
|
|
@@ -1,61 +1,152 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "What Is Agent-Native?"
|
|
3
|
-
description: "
|
|
3
|
+
description: "The ladder from a naked llm() call to a full agent-native app — and why every agent needs a UI (and every app benefits from an agent)."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# What Is Agent-Native?
|
|
7
7
|
|
|
8
|
-
Agent-native is a way of building software where the AI agent and the UI are equal partners
|
|
8
|
+
Agent-native is a way of building software where the AI agent and the UI are **equal partners**. Everything the agent can do, the UI can do. Everything the UI can do, the agent can do. They share the same database, the same state, and they stay in sync.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
If you only remember one thing from this page, remember this: most AI apps today stop at the first rung of the ladder, and it's the biggest mistake in the space right now.
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
## The ladder {#the-ladder}
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
Here's the progression. Most teams stop at rung 1. Agent-native is rung 3.
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
### Rung 1 — a single LLM call (the anti-pattern) {#rung-one}
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
```ts
|
|
19
|
+
const output = await llm(prompt);
|
|
20
|
+
```
|
|
19
21
|
|
|
20
|
-
A
|
|
22
|
+
A text box sends a prompt, you get a string back, maybe you parse it, and you render it. There's no way for the user to course-correct, no way for the LLM to take action, no way to inspect what happened. Non-deterministic output → deterministic pipeline. It breaks the moment reality gets messy.
|
|
21
23
|
|
|
22
|
-
|
|
23
|
-
- **Workflows** — structured flows for common tasks like composing emails, creating events, or building forms
|
|
24
|
-
- **Visualization** — charts, calendars, email threads, and slide decks are better as visual interfaces than text
|
|
25
|
-
- **Persistence** — a dashboard to come back to, data that doesn't disappear between sessions
|
|
26
|
-
- **Shareability** — share a form link, a slide deck URL, or a report with your team
|
|
27
|
-
- **Speed** — clicking a button is faster than typing a prompt for routine tasks
|
|
24
|
+
You see this everywhere: "AI features" bolted onto SaaS that are basically `fetch('/summarize')` with a spinner. That's not AI product; that's a toy.
|
|
28
25
|
|
|
29
|
-
|
|
26
|
+
### Rung 2 — tools and a loop {#rung-two}
|
|
27
|
+
|
|
28
|
+
```ts
|
|
29
|
+
const loop = query({ prompt, tools });
|
|
30
|
+
for await (const msg of loop) {
|
|
31
|
+
if (msg.type === "tool_use") {
|
|
32
|
+
// run the tool, feed the result back into the loop
|
|
33
|
+
}
|
|
34
|
+
if (msg.type === "result") {
|
|
35
|
+
output = msg.text;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Now the LLM can _do things_. You give it tools (`draftEmail`, `searchEmails`, `queryData`) and run a loop: LLM requests a tool → your code runs it → result goes back → loop continues until the task is done. This is what Claude Code, Codex, and the Anthropic/OpenAI agent SDKs all do under the hood.
|
|
41
|
+
|
|
42
|
+
This is a real step up. But on its own it still assumes the agent is correct. When it's not, the user has no steering wheel.
|
|
43
|
+
|
|
44
|
+
So the next move is obvious: stream the agent's work into a chat UI where the user can watch, interrupt, give feedback, queue the next message. That's the state of the art today — and it's still not enough for a real product.
|
|
45
|
+
|
|
46
|
+
### Rung 3 — `<Agent />` + actions + workspace {#rung-three}
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
// actions/reply-to-email.ts
|
|
50
|
+
import { defineAction } from "@agent-native/core";
|
|
51
|
+
import { z } from "zod";
|
|
52
|
+
|
|
53
|
+
export default defineAction({
|
|
54
|
+
description: "Reply to an email thread",
|
|
55
|
+
schema: z.object({
|
|
56
|
+
emailId: z.string(),
|
|
57
|
+
body: z.string(),
|
|
58
|
+
}),
|
|
59
|
+
run: async ({ emailId, body }) => {
|
|
60
|
+
await db.replies.insert({ emailId, body });
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
```tsx
|
|
66
|
+
// Anywhere in your React app
|
|
67
|
+
import { AgentSidebar } from "@agent-native/core/client";
|
|
68
|
+
|
|
69
|
+
<AgentSidebar />;
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
// The same action, typesafe, from a button
|
|
74
|
+
const { mutate } = useActionMutation("replyToEmail");
|
|
75
|
+
|
|
76
|
+
<Button onClick={() => mutate({ emailId, body: "Thanks!" })}>
|
|
77
|
+
Send Reply
|
|
78
|
+
</Button>;
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
One action. The agent calls it as a tool. The UI calls it as an HTTP endpoint. External agents call it over [A2A](/docs/a2a-protocol). Claude Desktop calls it as an [MCP server](/docs/mcp-protocol). Four surfaces, one implementation.
|
|
82
|
+
|
|
83
|
+
And you didn't just add buttons to a chatbot — you added an agent to an app. The user has a real UI with dashboards, lists, forms, and keyboard shortcuts. The agent has real tools, real memory, and real context. Both write to the same database; both see the same state.
|
|
84
|
+
|
|
85
|
+
That's rung 3. That's agent-native.
|
|
86
|
+
|
|
87
|
+
## Why every agent needs a UI {#why-every-agent-needs-a-ui}
|
|
88
|
+
|
|
89
|
+
The hot take floating around right now is "apps are dead, agents will replace UIs, everyone will just text an agent in Telegram." That's wrong.
|
|
90
|
+
|
|
91
|
+
Every agent eventually needs a UI. Even if the agent does all the _work_, humans still need to:
|
|
92
|
+
|
|
93
|
+
- **See what it's doing** — progress, tool calls, intermediate output
|
|
94
|
+
- **Steer it** — give feedback, interrupt, queue the next task
|
|
95
|
+
- **Manage it** — edit its instructions, skills, memory, scheduled jobs, connected accounts
|
|
96
|
+
- **Inspect its work** — review drafts, audit trails, rollbacks
|
|
97
|
+
- **Share its output** — dashboards, reports, forms, links
|
|
98
|
+
|
|
99
|
+
At minimum, "a UI for the agent" is an observability + management interface. At maximum, it's a full SaaS app with an agent embedded in it. Both ends of that spectrum are agent-native — see [Pure-Agent Apps](/docs/pure-agent-apps) for the minimal end and [Cloneable SaaS](/docs/cloneable-saas) for the maximal end.
|
|
100
|
+
|
|
101
|
+
## Why every app benefits from an agent {#why-every-app-benefits-from-an-agent}
|
|
102
|
+
|
|
103
|
+
The flip side is equally important. Existing SaaS products hit a wall: 80% of what you need, and 20% you can't change. Bolting a sidebar chat onto a SaaS app rarely works because the chat can't actually _do_ the things the UI can.
|
|
104
|
+
|
|
105
|
+
Agent-native flips that. Because every action in the app is defined once and exposed as both a UI handler and an agent tool, the agent can do everything the buttons can — and a lot more — without a separate "AI world" to maintain. Natural language becomes a first-class input alongside clicks.
|
|
106
|
+
|
|
107
|
+
The argument isn't "agents replace UI." It's "**agents belong inside applications, with a UI on top, as equal partners**." Neither can stand alone.
|
|
30
108
|
|
|
31
109
|
## Agent + UI parity {#agent-ui-parity}
|
|
32
110
|
|
|
33
|
-
This is the defining principle.
|
|
111
|
+
This is the defining principle.
|
|
34
112
|
|
|
35
|
-
> **From the UI** —
|
|
113
|
+
> **From the UI** — click buttons, fill forms, navigate views. The UI writes to the database; the agent sees the results.
|
|
36
114
|
>
|
|
37
|
-
> **From the agent** —
|
|
115
|
+
> **From the agent** — natural language, other agents via A2A, Slack, Telegram. The agent writes to the database; the UI updates automatically.
|
|
38
116
|
|
|
39
|
-
When the agent creates a draft email, it appears in the UI. When the user clicks "Send," the agent knows it was sent. There's no separate "agent world" and "UI world" — it's one system.
|
|
117
|
+
When the agent creates a draft email, it appears in the UI. When the user clicks "Send," the agent knows it was sent. There's no separate "agent world" and "UI world" — it's one system. See [Key Concepts](/docs/key-concepts) for the architecture that makes this work.
|
|
40
118
|
|
|
41
|
-
##
|
|
119
|
+
## Customization that's usually reserved for Claude Code {#workspace-customization}
|
|
42
120
|
|
|
43
|
-
|
|
121
|
+
The reason tools like Claude Code and Codex are so powerful isn't the model — it's the **customization layer**: per-project instructions, skills, memory files, sub-agents, connected MCP servers. You can shape the agent to your codebase, your preferences, your team.
|
|
122
|
+
|
|
123
|
+
Agent-native ships the same customization layer as a first-class part of every app — the **workspace**. Each app includes:
|
|
124
|
+
|
|
125
|
+
- `AGENTS.md` — team-wide rules (shared)
|
|
126
|
+
- `learnings.md` — per-user memory the agent writes to automatically (personal)
|
|
127
|
+
- `skills/` — reusable how-to guides (`/slash` commands)
|
|
128
|
+
- `agents/` — custom sub-agent profiles (invoked with `@mentions`)
|
|
129
|
+
- `jobs/` — scheduled tasks that run on a cron
|
|
130
|
+
- MCP servers — local _or_ remote, per-user or per-org
|
|
131
|
+
|
|
132
|
+
The twist: it's **SQL-backed, not filesystem-backed.** There's no dev-box to spin up, no container per user, no files to sync. Every user gets their own full workspace — personal memory, personal MCP servers, personal skills — for essentially free, because it's all rows in a database. That makes this model viable for real SaaS: multi-tenant, deployable to any serverless or edge host, with Claude-Code-level flexibility per user.
|
|
133
|
+
|
|
134
|
+
See [Workspace](/docs/workspace) for the full concept.
|
|
135
|
+
|
|
136
|
+
## What makes it different {#what-makes-it-different}
|
|
44
137
|
|
|
45
138
|
| Approach | Description |
|
|
46
139
|
| -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
|
|
47
140
|
| **Traditional apps with AI bolted on** | The AI is an afterthought. Limited to autocomplete, summaries, or a chat sidebar that can't actually do anything in the app. |
|
|
141
|
+
| **Pure chat / agent interfaces** | Powerful but inaccessible. No dashboards, no workflows, no persistence. Non-developers can't use them effectively. |
|
|
142
|
+
| **Claude Code / Codex for SaaS** | Great for devs on their own machines. Doesn't translate to multi-tenant SaaS — one codebase per user on a dev-box doesn't scale. |
|
|
48
143
|
| **Agent-native apps** | The agent is a first-class citizen. It shares the same database, the same state, and can do everything the UI can do — and vice versa. |
|
|
49
|
-
| **Pure chat/agent interfaces** | Powerful but inaccessible. No dashboards, no workflows, no persistence. Non-developers can't use them effectively. |
|
|
50
|
-
| **Agent-native apps** | Full application UI with discoverability, workflows, and visualization — plus the agent for anything that needs AI. |
|
|
51
|
-
|
|
52
|
-
The argument is simple: make your agents composable, think of them as applications. An analytics application, a slide generation application, a document application. Each one is a complete tool that humans and agents can both use.
|
|
53
144
|
|
|
54
145
|
## What is agent-native development? {#what-is-agent-native-development}
|
|
55
146
|
|
|
56
|
-
Agent-native development means building with agents first.
|
|
147
|
+
Agent-native development means building with agents first. Projects are structured so any AI coding tool — Claude Code, Codex, Cursor, Windsurf, Builder.io — reads the same instructions and follows the same patterns.
|
|
57
148
|
|
|
58
|
-
The
|
|
149
|
+
The payoff: the agent tends to do _better_ than a human developer because you can encode rules like "when you add a feature, also add a skill for it" — the kind of thing humans skip when they're tired or rushed.
|
|
59
150
|
|
|
60
151
|
## Agents as first-class developers {#agents-as-first-class-developers}
|
|
61
152
|
|
|
@@ -63,38 +154,44 @@ In an agent-native project:
|
|
|
63
154
|
|
|
64
155
|
- **AGENTS.md** gives every AI coding tool the same instructions — Claude Code, Cursor, Windsurf, and others all read the same file
|
|
65
156
|
- **Skills** teach the agent patterns for specific tasks — adding features, storing data, wiring real-time sync
|
|
66
|
-
- **Agent PR reviewers**
|
|
67
|
-
- **Auto-maintained docs and tests** — agents
|
|
157
|
+
- **Agent PR reviewers** validate the four-area checklist, that skills were updated, and that code matches conventions
|
|
158
|
+
- **Auto-maintained docs and tests** — agents are instructed to keep docs current and tests passing
|
|
68
159
|
|
|
69
|
-
This is
|
|
160
|
+
This is the shift from desktop-first to mobile-first applied to development. Mobile-first didn't mean "no desktop" — it meant designing for mobile constraints first. Agent-native development means designing for agent workflows first, then ensuring humans work effectively too.
|
|
70
161
|
|
|
71
162
|
## Whole-team development {#whole-team-development}
|
|
72
163
|
|
|
73
|
-
Agent-native development isn't just for developers
|
|
164
|
+
Agent-native development isn't just for developers:
|
|
74
165
|
|
|
75
|
-
- **Designers**
|
|
76
|
-
- **Product managers**
|
|
77
|
-
- **QA**
|
|
78
|
-
- **Anyone on the team**
|
|
166
|
+
- **Designers** update designs directly in the code through the agent
|
|
167
|
+
- **Product managers** update functionalities and requirements
|
|
168
|
+
- **QA** tests and prompts for fixes
|
|
169
|
+
- **Anyone on the team** contributes through natural language
|
|
79
170
|
|
|
80
|
-
The vision
|
|
171
|
+
The vision: reduce handoffs, enable one-person-to-full-team productivity.
|
|
81
172
|
|
|
82
173
|
## Fork and customize {#fork-and-customize}
|
|
83
174
|
|
|
84
|
-
Agent-native apps follow a fork-and-customize model. You start from a template —
|
|
175
|
+
Agent-native apps follow a fork-and-customize model. You start from a **cloneable SaaS** template — Mail, Calendar, Analytics, Slides, Clips, Forms, Dispatch — and make it yours:
|
|
85
176
|
|
|
86
|
-
1. Pick a template on [
|
|
87
|
-
2.
|
|
88
|
-
3. Fork it when you want to customize — "connect
|
|
177
|
+
1. Pick a template on [agent-native.com](/templates)
|
|
178
|
+
2. Use it immediately as a hosted app (e.g. mail.agent-native.com)
|
|
179
|
+
3. Fork it when you want to customize — "connect our Stripe account," "add a cohort chart"
|
|
89
180
|
4. The agent modifies the code to match your needs
|
|
90
|
-
5. Deploy your fork to your own domain
|
|
181
|
+
5. Deploy your fork to your own domain — or stay on agent-native.com
|
|
91
182
|
|
|
92
|
-
Because it's
|
|
183
|
+
Because it's _your_ app, not shared infrastructure, the agent can safely evolve the code. Your app keeps improving as you use it. See [Cloneable SaaS](/docs/cloneable-saas) for the full story.
|
|
93
184
|
|
|
94
185
|
## Composable agents {#composable-agents}
|
|
95
186
|
|
|
96
|
-
Agent-native apps
|
|
187
|
+
Agent-native apps talk to each other over the [A2A protocol](/docs/a2a-protocol). From the mail app, you can tag the analytics agent to query data and include the results in a draft email. Agents discover what other agents are available, call them over the protocol, and show results in the UI.
|
|
188
|
+
|
|
189
|
+
Every action you define is also a tool exposed over A2A _and_ as an MCP server, so external tools like Claude Desktop can drive your app directly. Same definition, four surfaces.
|
|
97
190
|
|
|
98
|
-
|
|
191
|
+
## What's next
|
|
99
192
|
|
|
100
|
-
|
|
193
|
+
- [**Key Concepts**](/docs/key-concepts) — the architecture: SQL, actions, polling sync, context awareness, portability
|
|
194
|
+
- [**Cloneable SaaS**](/docs/cloneable-saas) — templates as complete products you own
|
|
195
|
+
- [**Workspace**](/docs/workspace) — the per-user customization layer (skills, memory, instructions, MCP)
|
|
196
|
+
- [**Drop-in Agent**](/docs/drop-in-agent) — mount `<AgentPanel>` into any React app
|
|
197
|
+
- [**Getting Started**](/docs) — scaffold your first app
|
|
@@ -222,3 +222,4 @@ For a new workspace, after running `agent-native create`:
|
|
|
222
222
|
- [ ] Configure the approval policy and approver emails
|
|
223
223
|
- [ ] Set up SendGrid (`SENDGRID_API_KEY`, `SENDGRID_FROM_EMAIL`) for admin notifications
|
|
224
224
|
- [ ] Connect Slack or Telegram for workspace messaging
|
|
225
|
+
- [ ] Configure shared MCP servers — drop `mcp.config.json` at the workspace root, or enable Dispatch as the workspace [MCP hub](/docs/mcp-clients#hub) so every app inherits the same server list
|