@agent-native/core 0.7.11 → 0.7.13
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 +1 -1
- package/dist/action.js +30 -11
- package/dist/action.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +26 -8
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +19 -0
- package/dist/agent/engine/builder-engine.d.ts.map +1 -0
- package/dist/agent/engine/builder-engine.js +430 -0
- package/dist/agent/engine/builder-engine.js.map +1 -0
- package/dist/agent/engine/builtin.d.ts.map +1 -1
- package/dist/agent/engine/builtin.js +26 -10
- package/dist/agent/engine/builtin.js.map +1 -1
- package/dist/agent/engine/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/provider-env-vars.d.ts +21 -0
- package/dist/agent/engine/provider-env-vars.d.ts.map +1 -0
- package/dist/agent/engine/provider-env-vars.js +50 -0
- package/dist/agent/engine/provider-env-vars.js.map +1 -0
- package/dist/agent/engine/registry.d.ts +37 -0
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +102 -4
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/engine/types.d.ts +30 -0
- package/dist/agent/engine/types.d.ts.map +1 -1
- package/dist/agent/engine/types.js +19 -1
- package/dist/agent/engine/types.js.map +1 -1
- package/dist/agent/production-agent.d.ts +7 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +67 -15
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +11 -1
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts +4 -0
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +1 -0
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/types.d.ts +8 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/checkpoints/service.d.ts +1 -0
- package/dist/checkpoints/service.d.ts.map +1 -1
- package/dist/checkpoints/service.js +26 -2
- package/dist/checkpoints/service.js.map +1 -1
- package/dist/cli/create.d.ts +30 -0
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +127 -10
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +19 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/templates-meta.d.ts +2 -0
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +2 -0
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/cli/workspacify.d.ts.map +1 -1
- package/dist/cli/workspacify.js +7 -3
- package/dist/cli/workspacify.js.map +1 -1
- package/dist/client/AgentPanel.js +1 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +93 -37
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ConnectBuilderCard.d.ts +1 -7
- package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
- package/dist/client/ConnectBuilderCard.js +30 -132
- package/dist/client/ConnectBuilderCard.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +58 -26
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/analytics.d.ts +5 -8
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +53 -11
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/builder-mark.d.ts +9 -0
- package/dist/client/builder-mark.d.ts.map +1 -0
- package/dist/client/builder-mark.js +10 -0
- package/dist/client/builder-mark.js.map +1 -0
- package/dist/client/components/ui/popover.d.ts +8 -0
- package/dist/client/components/ui/popover.d.ts.map +1 -0
- package/dist/client/components/ui/popover.js +11 -0
- package/dist/client/components/ui/popover.js.map +1 -0
- package/dist/client/composer/ComposerPlusMenu.d.ts +2 -0
- package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -0
- package/dist/client/composer/ComposerPlusMenu.js +244 -0
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -0
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +25 -7
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +4 -2
- package/dist/client/composer/useVoiceDictation.js.map +1 -1
- package/dist/client/error-format.d.ts +2 -0
- package/dist/client/error-format.d.ts.map +1 -0
- package/dist/client/error-format.js +31 -0
- package/dist/client/error-format.js.map +1 -0
- package/dist/client/index.d.ts +3 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/observability/ObservabilityDashboard.d.ts +5 -0
- package/dist/client/observability/ObservabilityDashboard.d.ts.map +1 -0
- package/dist/client/observability/ObservabilityDashboard.js +169 -0
- package/dist/client/observability/ObservabilityDashboard.js.map +1 -0
- package/dist/client/observability/ThumbsFeedback.d.ts +8 -0
- package/dist/client/observability/ThumbsFeedback.d.ts.map +1 -0
- package/dist/client/observability/ThumbsFeedback.js +64 -0
- package/dist/client/observability/ThumbsFeedback.js.map +1 -0
- package/dist/client/observability/index.d.ts +4 -0
- package/dist/client/observability/index.d.ts.map +1 -0
- package/dist/client/observability/index.js +4 -0
- package/dist/client/observability/index.js.map +1 -0
- package/dist/client/observability/useObservability.d.ts +128 -0
- package/dist/client/observability/useObservability.d.ts.map +1 -0
- package/dist/client/observability/useObservability.js +109 -0
- package/dist/client/observability/useObservability.js.map +1 -0
- package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +34 -92
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/org/RequireActiveOrg.d.ts +33 -0
- package/dist/client/org/RequireActiveOrg.d.ts.map +1 -0
- package/dist/client/org/RequireActiveOrg.js +63 -0
- package/dist/client/org/RequireActiveOrg.js.map +1 -0
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +50 -15
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +1 -0
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +1 -0
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +3 -3
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/AutomationsSection.js +1 -1
- package/dist/client/settings/AutomationsSection.js.map +1 -1
- package/dist/client/settings/BrowserSection.js +1 -1
- package/dist/client/settings/BrowserSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +251 -42
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +10 -4
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +26 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +128 -4
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +2 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +6 -2
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts +9 -0
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -0
- package/dist/client/transcription/BuilderTranscriptionCta.js +18 -0
- package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -0
- package/dist/client/transcription/use-live-transcription.d.ts +29 -0
- package/dist/client/transcription/use-live-transcription.d.ts.map +1 -0
- package/dist/client/transcription/use-live-transcription.js +156 -0
- package/dist/client/transcription/use-live-transcription.js.map +1 -0
- package/dist/client/use-builder-enabled.d.ts +17 -0
- package/dist/client/use-builder-enabled.d.ts.map +1 -0
- package/dist/client/use-builder-enabled.js +36 -0
- package/dist/client/use-builder-enabled.js.map +1 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +4 -2
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/useProductionAgent.d.ts.map +1 -1
- package/dist/client/useProductionAgent.js +3 -1
- package/dist/client/useProductionAgent.js.map +1 -1
- package/dist/db/migrations.d.ts +9 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +75 -10
- package/dist/db/migrations.js.map +1 -1
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +11 -4
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/jobs/tools.d.ts.map +1 -1
- package/dist/jobs/tools.js +137 -161
- package/dist/jobs/tools.js.map +1 -1
- package/dist/notifications/actions.d.ts +2 -2
- package/dist/notifications/actions.d.ts.map +1 -1
- package/dist/notifications/actions.js +77 -69
- package/dist/notifications/actions.js.map +1 -1
- package/dist/observability/evals.d.ts +22 -0
- package/dist/observability/evals.d.ts.map +1 -0
- package/dist/observability/evals.js +371 -0
- package/dist/observability/evals.js.map +1 -0
- package/dist/observability/experiments.d.ts +24 -0
- package/dist/observability/experiments.d.ts.map +1 -0
- package/dist/observability/experiments.js +274 -0
- package/dist/observability/experiments.js.map +1 -0
- package/dist/observability/feedback.d.ts +14 -0
- package/dist/observability/feedback.d.ts.map +1 -0
- package/dist/observability/feedback.js +256 -0
- package/dist/observability/feedback.js.map +1 -0
- package/dist/observability/index.d.ts +6 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +5 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/plugin.d.ts +2 -0
- package/dist/observability/plugin.d.ts.map +1 -0
- package/dist/observability/plugin.js +12 -0
- package/dist/observability/plugin.js.map +1 -0
- package/dist/observability/routes.d.ts +68 -0
- package/dist/observability/routes.d.ts.map +1 -0
- package/dist/observability/routes.js +301 -0
- package/dist/observability/routes.js.map +1 -0
- package/dist/observability/store.d.ts +77 -0
- package/dist/observability/store.d.ts.map +1 -0
- package/dist/observability/store.js +976 -0
- package/dist/observability/store.js.map +1 -0
- package/dist/observability/traces.d.ts +37 -0
- package/dist/observability/traces.d.ts.map +1 -0
- package/dist/observability/traces.js +182 -0
- package/dist/observability/traces.js.map +1 -0
- package/dist/observability/types.d.ts +159 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +16 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +68 -24
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/onboarding/types.d.ts +10 -1
- package/dist/onboarding/types.d.ts.map +1 -1
- package/dist/org/context.d.ts +8 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +163 -6
- package/dist/org/context.js.map +1 -1
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +49 -30
- package/dist/org/handlers.js.map +1 -1
- package/dist/progress/actions.d.ts +3 -0
- package/dist/progress/actions.d.ts.map +1 -1
- package/dist/progress/actions.js +86 -110
- package/dist/progress/actions.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/progress/routes.js +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +20 -6
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.d.ts +10 -0
- package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -0
- package/dist/scripts/agent-engines/manage-agent-engine.js +47 -0
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -0
- package/dist/scripts/agent-engines/set-agent-engine.d.ts.map +1 -1
- package/dist/scripts/agent-engines/set-agent-engine.js +10 -9
- package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +39 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +743 -452
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-teams.d.ts.map +1 -1
- package/dist/server/agent-teams.js +18 -7
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/analytics.d.ts +9 -7
- package/dist/server/analytics.d.ts.map +1 -1
- package/dist/server/analytics.js +12 -11
- package/dist/server/analytics.js.map +1 -1
- package/dist/server/app-name.d.ts +5 -2
- package/dist/server/app-name.d.ts.map +1 -1
- package/dist/server/app-name.js +14 -3
- package/dist/server/app-name.js.map +1 -1
- package/dist/server/app-url.d.ts.map +1 -1
- package/dist/server/app-url.js +17 -5
- package/dist/server/app-url.js.map +1 -1
- package/dist/server/auth.d.ts +2 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +153 -2
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts +2 -0
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +4 -0
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/builder-browser.d.ts +59 -1
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +127 -11
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +278 -13
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +7 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +10 -0
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +29 -4
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +46 -5
- package/dist/server/poll.js.map +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +2 -1
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts.map +1 -1
- package/dist/server/transcribe-voice.js +44 -5
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/styles/agent-native.css +11 -2
- package/dist/templates/default/.agents/skills/progress/SKILL.md +14 -12
- package/dist/templates/default/app/root.tsx +7 -0
- package/dist/templates/workspace-root/pnpm-workspace.yaml +6 -0
- package/dist/transcription/builder-transcription.d.ts +27 -0
- package/dist/transcription/builder-transcription.d.ts.map +1 -0
- package/dist/transcription/builder-transcription.js +41 -0
- package/dist/transcription/builder-transcription.js.map +1 -0
- package/dist/triggers/actions.d.ts +3 -0
- package/dist/triggers/actions.d.ts.map +1 -1
- package/dist/triggers/actions.js +189 -213
- package/dist/triggers/actions.js.map +1 -1
- package/docs/content/agent-mentions.md +1 -1
- package/docs/content/automations.md +22 -19
- package/docs/content/cloneable-saas.md +2 -2
- package/docs/content/deployment.md +21 -61
- package/docs/content/getting-started.md +1 -1
- package/docs/content/key-concepts.md +1 -1
- package/docs/content/{enterprise-workspace.md → multi-app-workspace.md} +3 -3
- package/docs/content/multi-tenancy.md +1 -1
- package/docs/content/progress.md +11 -11
- package/docs/content/template-dispatch.md +3 -3
- package/docs/content/workspace-management.md +1 -1
- package/package.json +13 -1
- package/src/templates/default/.agents/skills/progress/SKILL.md +14 -12
- package/src/templates/default/app/root.tsx +7 -0
- package/src/templates/workspace-root/pnpm-workspace.yaml +6 -0
- package/dist/client/settings/LLMSection.d.ts +0 -2
- package/dist/client/settings/LLMSection.d.ts.map +0 -1
- package/dist/client/settings/LLMSection.js +0 -191
- package/dist/client/settings/LLMSection.js.map +0 -1
|
@@ -9,7 +9,7 @@ Agent-native apps use [Nitro](https://nitro.build) under the hood, which means y
|
|
|
9
9
|
|
|
10
10
|
## Workspace Deploy: One Origin, Many Apps {#workspace-deploy}
|
|
11
11
|
|
|
12
|
-
If your project is a [workspace](/docs/
|
|
12
|
+
If your project is a [workspace](/docs/multi-app-workspace), you can ship every app in it to a single origin with one command:
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
15
|
agent-native deploy
|
|
@@ -125,58 +125,7 @@ export default defineConfig({
|
|
|
125
125
|
});
|
|
126
126
|
```
|
|
127
127
|
|
|
128
|
-
…or set `NITRO_PRESET=netlify` at build time
|
|
129
|
-
|
|
130
|
-
### Monorepo template pattern {#netlify-monorepo}
|
|
131
|
-
|
|
132
|
-
For a workspace template at `templates/<name>/`, commit a `netlify.toml` at the template's root. All paths are **repo-root-relative** (Netlify's `base` should stay empty — the whole repo is the build context so pnpm workspace resolution works):
|
|
133
|
-
|
|
134
|
-
```toml
|
|
135
|
-
# templates/<name>/netlify.toml
|
|
136
|
-
[build]
|
|
137
|
-
command = "pnpm install && NITRO_PRESET=netlify pnpm --filter <name> build"
|
|
138
|
-
publish = "templates/<name>/dist"
|
|
139
|
-
functions = "templates/<name>/.netlify/functions-internal"
|
|
140
|
-
|
|
141
|
-
[build.environment]
|
|
142
|
-
NITRO_PRESET = "netlify"
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
Notes:
|
|
146
|
-
|
|
147
|
-
- `.netlify/functions-internal` is where Nitro 3 writes its server functions — Netlify picks them up from there.
|
|
148
|
-
- When you create a new Netlify site via the dashboard, its monorepo auto-detect sometimes picks the wrong template (e.g. selecting `templates/calendar` when you wanted `templates/<name>`). Manually clear the base directory and let `netlify.toml` drive the build.
|
|
149
|
-
- Do not put `netlify.toml` at the repo root — each template manages its own.
|
|
150
|
-
|
|
151
|
-
### Always build on Netlify CI {#netlify-ci-only}
|
|
152
|
-
|
|
153
|
-
**Do not run `netlify deploy --prod` from your Mac.** The framework's Nitro build (`createDanglingOptionalDepStubs()` in `packages/core/src/deploy/build.ts`) stubs platform-specific optional native deps that aren't installed on the current OS. On macOS, that stubs out the Linux `libsql` binaries; on Netlify's Linux runtime the server function then crashes with:
|
|
154
|
-
|
|
155
|
-
```
|
|
156
|
-
Cannot find module '@libsql/linux-x64-gnu'
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
Letting Netlify CI run the build fixes this — on Linux, pnpm installs the real binary and the stub creator skips it. Push to the branch connected to the Netlify site and let it build.
|
|
160
|
-
|
|
161
|
-
### Env vars {#netlify-env}
|
|
162
|
-
|
|
163
|
-
From the template directory, link the site and import `.env`:
|
|
164
|
-
|
|
165
|
-
```bash
|
|
166
|
-
cd templates/<name>
|
|
167
|
-
netlify link --name <netlify-site-name>
|
|
168
|
-
netlify env:import .env
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
Then set deployment-only vars that aren't in `.env`:
|
|
172
|
-
|
|
173
|
-
```bash
|
|
174
|
-
netlify env:set BETTER_AUTH_URL https://<your-domain>
|
|
175
|
-
netlify env:set BETTER_AUTH_SECRET "$(openssl rand -hex 32)"
|
|
176
|
-
netlify env:set NITRO_PRESET netlify
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
`BETTER_AUTH_URL` must match the public URL the app is served on (custom domain or `<site>.netlify.app`). `BETTER_AUTH_SECRET` should be a fresh 32-byte hex — do not reuse the dev secret.
|
|
128
|
+
…or set `NITRO_PRESET=netlify` at build time.
|
|
180
129
|
|
|
181
130
|
## Cloudflare Pages {#cloudflare-pages}
|
|
182
131
|
|
|
@@ -187,14 +136,6 @@ export default defineConfig({
|
|
|
187
136
|
});
|
|
188
137
|
```
|
|
189
138
|
|
|
190
|
-
### External Postgres latency {#cloudflare-hyperdrive}
|
|
191
|
-
|
|
192
|
-
Cloudflare Workers open a fresh connection per request. Against external Postgres (Neon, Supabase, RDS) the TLS + auth handshake dominates every cold hit, which is why we've seen ~9s TTFB on cold-start routes that query the DB.
|
|
193
|
-
|
|
194
|
-
Mitigate with [Cloudflare Hyperdrive](https://developers.cloudflare.com/hyperdrive/), which pools Postgres connections at the edge. Requires a TCP-based driver — `pg`, `postgres`, or Drizzle's `node-postgres` adapter. The HTTP-based `@neondatabase/serverless` driver does not go through Hyperdrive. Workers Paid plan only.
|
|
195
|
-
|
|
196
|
-
If you're hitting this and don't want to move to Hyperdrive, the Netlify preset above is a simpler path.
|
|
197
|
-
|
|
198
139
|
## AWS Lambda {#aws-lambda}
|
|
199
140
|
|
|
200
141
|
```ts
|
|
@@ -225,6 +166,25 @@ export default defineConfig({
|
|
|
225
166
|
|
|
226
167
|
Inside a workspace, the root `.env` is loaded into every app automatically, so shared keys like `ANTHROPIC_API_KEY` and `A2A_SECRET` only need to be set once. Per-app `apps/<name>/.env` wins on conflict.
|
|
227
168
|
|
|
169
|
+
## Updating UI in Production {#updating-ui-in-production}
|
|
170
|
+
|
|
171
|
+
One of agent-native's core features is that the agent can modify your app's source code — components, routes, styles, actions. During local development this works seamlessly because the agent has full filesystem access.
|
|
172
|
+
|
|
173
|
+
In a standard production deployment, however, the agent runs in **production mode** with access to app tools (actions, database, MCP) but **not** the filesystem. This means the agent can read and write data, run actions, and interact with external services — but it can't edit your React components or add new routes on a deployed instance.
|
|
174
|
+
|
|
175
|
+
### Builder.io: Visual Editing in Production {#builderio}
|
|
176
|
+
|
|
177
|
+
[Builder.io](https://www.builder.io) solves this by providing a managed cloud environment where the agent retains the ability to modify your app's UI in production. Connect your repo to Builder.io and prompt for UI changes directly — no redeploy needed.
|
|
178
|
+
|
|
179
|
+
**How it works:**
|
|
180
|
+
|
|
181
|
+
1. Connect your agent-native repo to Builder.io
|
|
182
|
+
2. Builder.io provides a cloud frame with the agent, visual editing, and real-time collaboration
|
|
183
|
+
3. Prompt the agent to make UI changes — it edits your components, routes, and styles live
|
|
184
|
+
4. Changes are committed back to your repo
|
|
185
|
+
|
|
186
|
+
See [Frames](/docs/frames) for more on the embedded agent panel vs. cloud frame options.
|
|
187
|
+
|
|
228
188
|
## Multi-instance deploys {#multi-instance}
|
|
229
189
|
|
|
230
190
|
Agent-native apps store all state in SQL via Drizzle and sync the UI via [polling](/docs/key-concepts#polling-sync) against the database — no file-system state, no sticky sessions, no in-memory caches. That means multi-instance and serverless deployments work out of the box: point every instance at the same `DATABASE_URL` and they converge automatically. See [Key Concepts — Data in SQL](/docs/key-concepts#data-in-sql) and [Portability](/docs/key-concepts#hosting-agnostic).
|
|
@@ -35,7 +35,7 @@ Need to add more apps later? From inside the workspace:
|
|
|
35
35
|
agent-native add-app
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
From here, use your AI coding tool (Claude Code, Cursor, Windsurf, etc.) to customize it. The agent instructions in `AGENTS.md` are already set up so any tool understands the codebase. See [
|
|
38
|
+
From here, use your AI coding tool (Claude Code, Cursor, Windsurf, etc.) to customize it. The agent instructions in `AGENTS.md` are already set up so any tool understands the codebase. See [Multi-App Workspace](/docs/multi-app-workspace) for the full story on sharing auth, skills, components, and credentials across apps.
|
|
39
39
|
|
|
40
40
|
## Templates {#templates}
|
|
41
41
|
|
|
@@ -270,4 +270,4 @@ For detailed guidance on specific patterns:
|
|
|
270
270
|
- [Context Awareness](/docs/context-awareness) — navigation state, view-screen, navigate commands
|
|
271
271
|
- [Skills Guide](/docs/skills-guide) — framework skills, domain skills, creating custom skills
|
|
272
272
|
- [A2A Protocol](/docs/a2a-protocol) — agent-to-agent communication
|
|
273
|
-
- [
|
|
273
|
+
- [Multi-App Workspace](/docs/multi-app-workspace) — host many apps in one monorepo with shared auth, skills, components, and credentials
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: "
|
|
2
|
+
title: "Multi-App Workspace"
|
|
3
3
|
description: "Host many agent-native apps in one monorepo with shared auth, RBAC, skills, instructions, components, and credentials."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Multi-App Workspace
|
|
7
7
|
|
|
8
8
|
When vibe-coding an internal tool takes an afternoon, you don't stop at one. A team ends up with a CRM, a support inbox, a dashboard, a recruiting tracker, an ops console — ten small apps, each scaffolded independently. That's great until you need to change something in all of them.
|
|
9
9
|
|
|
10
10
|
At that point every app has its own `AGENTS.md`, its own auth plugin, its own copy-pasted layout component, its own hard-coded Slack token, its own idea of what an "organization" is. A compliance rule change means ten PRs. Rotating an API key means ten redeployments. A brand refresh means ten different headers drifting out of sync. The thing that made it easy to build them is now making it hard to manage them.
|
|
11
11
|
|
|
12
|
-
The **
|
|
12
|
+
The **multi-app workspace** pattern is how agent-native solves this. You host all your apps in one monorepo alongside a private **workspace core** package. The core owns everything cross-cutting — auth, RBAC, agent skills, `AGENTS.md`, React components, design tokens, shared credentials, shared actions. Each app shrinks down to the handful of screens that make it unique. Change the core once; every app inherits the change on the next dev reload.
|
|
13
13
|
|
|
14
14
|
## What gets shared {#what-gets-shared}
|
|
15
15
|
|
|
@@ -85,4 +85,4 @@ If you're evaluating agent-native for a product like a CRM, project tracker, sup
|
|
|
85
85
|
|
|
86
86
|
- [Authentication](/docs/authentication) — auth modes, social providers, session API
|
|
87
87
|
- [Security & Data Scoping](/docs/security) — SQL-level isolation, input validation, access guards
|
|
88
|
-
- [
|
|
88
|
+
- [Multi-App Workspace](/docs/multi-app-workspace) — hosting multiple agent-native apps in one monorepo with shared auth and RBAC
|
package/docs/content/progress.md
CHANGED
|
@@ -41,7 +41,7 @@ Separate concern from [notifications](/docs/notifications): notifications fire o
|
|
|
41
41
|
| `failed` | Error terminal |
|
|
42
42
|
| `cancelled` | User interrupted |
|
|
43
43
|
|
|
44
|
-
Terminal statuses set `completed_at`. The UI tray shows only `running` rows; completed rows stay in the database for `list
|
|
44
|
+
Terminal statuses set `completed_at`. The UI tray shows only `running` rows; completed rows stay in the database for `manage-progress --action=list` queries.
|
|
45
45
|
|
|
46
46
|
## API {#api}
|
|
47
47
|
|
|
@@ -123,22 +123,22 @@ export function HeaderBar() {
|
|
|
123
123
|
|
|
124
124
|
Inline header widget — mount it next to the notifications bell. Shows a spinner icon + count badge when runs are active; click opens a dropdown with one live percent bar per run. Hides the trigger entirely when no active runs. Polls `/_agent-native/runs?active=true` every `pollMs` (default 3 s). Uses shadcn semantic tokens, adapts to light and dark themes.
|
|
125
125
|
|
|
126
|
-
## Agent
|
|
126
|
+
## Agent tool {#agent-tool}
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
A single `manage-progress` tool is registered in every template. The `action` parameter selects the operation:
|
|
129
129
|
|
|
130
|
-
|
|
|
131
|
-
|
|
|
132
|
-
| `start
|
|
133
|
-
| `update
|
|
134
|
-
| `complete
|
|
135
|
-
| `list
|
|
130
|
+
| Action | Purpose |
|
|
131
|
+
| ---------- | --------------------------------------------------------------- |
|
|
132
|
+
| `start` | Call at the top of a long task. Returns a runId. |
|
|
133
|
+
| `update` | Call periodically during the task with `percent` and/or `step`. |
|
|
134
|
+
| `complete` | Terminal — one of `succeeded`, `failed`, `cancelled`. |
|
|
135
|
+
| `list` | Inspect recent runs (filter by `active=true`). |
|
|
136
136
|
|
|
137
137
|
### When to start a run {#when-to-start}
|
|
138
138
|
|
|
139
139
|
- Use for anything > ~5 seconds. A spinner with no context feels frozen.
|
|
140
140
|
- Update at natural checkpoints, not every iteration. Every 5–10% is plenty.
|
|
141
|
-
- **Always** call `complete
|
|
141
|
+
- **Always** call `manage-progress --action=complete`, including in error paths. An orphan `running` row is worse than no row.
|
|
142
142
|
- Pair with `notify` on completion so the user sees the outcome when they're not actively watching the tray.
|
|
143
143
|
|
|
144
144
|
## Event bus {#event-bus}
|
|
@@ -171,6 +171,6 @@ Notify me that run {{runId}} has been running for a long time.
|
|
|
171
171
|
|
|
172
172
|
## What's next
|
|
173
173
|
|
|
174
|
-
- [**Notifications**](/docs/notifications) — pair with `complete
|
|
174
|
+
- [**Notifications**](/docs/notifications) — pair with `manage-progress --action=complete` to tell the user when work finishes
|
|
175
175
|
- [**Automations**](/docs/automations) — watchdog slow runs via `run.progress.updated`
|
|
176
176
|
- [**Client**](/docs/client) — `useDbSync` for real-time cache invalidation
|
|
@@ -7,7 +7,7 @@ description: "Dispatch is the workspace control plane — central inbox, cross-a
|
|
|
7
7
|
|
|
8
8
|
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).
|
|
9
9
|
|
|
10
|
-
If you're running an [
|
|
10
|
+
If you're running an [multi-app workspace](/docs/multi-app-workspace) with many apps, Dispatch is the glue.
|
|
11
11
|
|
|
12
12
|
## What it does {#what-it-does}
|
|
13
13
|
|
|
@@ -44,7 +44,7 @@ pnpm dlx @agent-native/core create my-platform
|
|
|
44
44
|
# pick "Dispatch" in the multi-select picker, plus whichever domain apps you want
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
Dispatch is usually scaffolded into a workspace alongside the apps it coordinates. For a workspace, Dispatch's shared auth, database, and brand are inherited from the workspace core — see [
|
|
47
|
+
Dispatch is usually scaffolded into a workspace alongside the apps it coordinates. For a workspace, Dispatch's shared auth, database, and brand are inherited from the workspace core — see [Multi-App Workspace](/docs/multi-app-workspace).
|
|
48
48
|
|
|
49
49
|
## Customize it {#customize}
|
|
50
50
|
|
|
@@ -52,7 +52,7 @@ Dispatch is a full cloneable SaaS like any other template — see [Cloneable Saa
|
|
|
52
52
|
|
|
53
53
|
## What's next
|
|
54
54
|
|
|
55
|
-
- [**
|
|
55
|
+
- [**Multi-App Workspace**](/docs/multi-app-workspace) — running Dispatch alongside multiple apps
|
|
56
56
|
- [**A2A Protocol**](/docs/a2a-protocol) — how Dispatch delegates to specialist agents
|
|
57
57
|
- [**MCP Clients — Hub Mode**](/docs/mcp-clients#hub) — sharing MCP servers across the workspace
|
|
58
58
|
- [**Recurring Jobs**](/docs/recurring-jobs) — scheduled tasks Dispatch runs
|
|
@@ -7,7 +7,7 @@ description: "Branching strategies, code ownership, PR review, and governance pr
|
|
|
7
7
|
|
|
8
8
|
This guide covers the operational side of running an agent-native workspace — how to branch, who reviews what, how to set up code ownership, and how the dispatch control plane fits into your governance model.
|
|
9
9
|
|
|
10
|
-
For workspace setup, shared auth, and deployment, see [
|
|
10
|
+
For workspace setup, shared auth, and deployment, see [Multi-App Workspace](/docs/multi-app-workspace).
|
|
11
11
|
|
|
12
12
|
## Branching
|
|
13
13
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.13",
|
|
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",
|
|
@@ -9,6 +9,10 @@
|
|
|
9
9
|
"url": "https://github.com/BuilderIO/agent-native",
|
|
10
10
|
"directory": "packages/core"
|
|
11
11
|
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/BuilderIO/agent-native/issues"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
12
16
|
"bin": {
|
|
13
17
|
"agent-native": "dist/cli/index.js"
|
|
14
18
|
},
|
|
@@ -26,6 +30,7 @@
|
|
|
26
30
|
"./db/schema": "./dist/db/schema.js",
|
|
27
31
|
"./db/drizzle-config": "./dist/db/drizzle-config.js",
|
|
28
32
|
"./client": "./dist/client/index.js",
|
|
33
|
+
"./client/observability": "./dist/client/observability/index.js",
|
|
29
34
|
"./client/onboarding": "./dist/client/onboarding/index.js",
|
|
30
35
|
"./onboarding": "./dist/onboarding/index.js",
|
|
31
36
|
"./shared": "./dist/shared/index.js",
|
|
@@ -49,6 +54,9 @@
|
|
|
49
54
|
"./sharing/actions/list-resource-shares": "./dist/sharing/actions/list-resource-shares.js",
|
|
50
55
|
"./sharing/actions/set-resource-visibility": "./dist/sharing/actions/set-resource-visibility.js",
|
|
51
56
|
"./client/sharing": "./dist/client/sharing/index.js",
|
|
57
|
+
"./client/transcription/use-live-transcription": "./dist/client/transcription/use-live-transcription.js",
|
|
58
|
+
"./client/transcription/BuilderTranscriptionCta": "./dist/client/transcription/BuilderTranscriptionCta.js",
|
|
59
|
+
"./transcription/builder": "./dist/transcription/builder-transcription.js",
|
|
52
60
|
"./adapters/cli": "./dist/adapters/cli/index.js",
|
|
53
61
|
"./router": "./dist/router/index.js",
|
|
54
62
|
"./collab": "./dist/collab/index.js",
|
|
@@ -84,6 +92,7 @@
|
|
|
84
92
|
"release": "npm version patch && npm publish --access public"
|
|
85
93
|
},
|
|
86
94
|
"dependencies": {
|
|
95
|
+
"@amplitude/analytics-browser": "^2.41.1",
|
|
87
96
|
"@anthropic-ai/sdk": "^0.90.0",
|
|
88
97
|
"@clack/prompts": "^1.2.0",
|
|
89
98
|
"@libsql/client": "^0.15.0",
|
|
@@ -94,6 +103,8 @@
|
|
|
94
103
|
"@radix-ui/react-tooltip": "^1.2.8",
|
|
95
104
|
"@react-router/dev": "^7.13.1",
|
|
96
105
|
"@react-router/fs-routes": "^7.13.1",
|
|
106
|
+
"@sentry/browser": "^10.50.0",
|
|
107
|
+
"@sentry/node": "^10.50.0",
|
|
97
108
|
"@standard-schema/spec": "^1.1.0",
|
|
98
109
|
"@tabler/icons-react": "^3",
|
|
99
110
|
"@tailwindcss/typography": "^0.5.19",
|
|
@@ -123,6 +134,7 @@
|
|
|
123
134
|
"shiki": "^4.0.2",
|
|
124
135
|
"tailwind-merge": "^3.5.0",
|
|
125
136
|
"tiptap-markdown": "^0.9.0",
|
|
137
|
+
"tw-animate-css": "1.4.0",
|
|
126
138
|
"y-protocols": "^1.0.7",
|
|
127
139
|
"yjs": "^13.6.30",
|
|
128
140
|
"zod": "^4.3.6"
|
|
@@ -22,25 +22,27 @@ Separate concern from `notifications`:
|
|
|
22
22
|
|
|
23
23
|
Common pattern: on completion, emit a `notify()` so the user sees the outcome when they're not actively watching the tray.
|
|
24
24
|
|
|
25
|
-
##
|
|
25
|
+
## Tool
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
All progress operations go through a single `manage-progress` tool with an `action` parameter:
|
|
28
|
+
|
|
29
|
+
| Action | Purpose |
|
|
28
30
|
|---|---|
|
|
29
|
-
| `start
|
|
30
|
-
| `update
|
|
31
|
-
| `complete
|
|
32
|
-
| `list
|
|
31
|
+
| `start` | Mark the start of a long task. Returns a runId. |
|
|
32
|
+
| `update` | Update percent and/or current step. Call frequently. |
|
|
33
|
+
| `complete` | Mark terminal status: `succeeded`, `failed`, `cancelled`. |
|
|
34
|
+
| `list` | List recent runs (all or `--active=true`). |
|
|
33
35
|
|
|
34
36
|
## Canonical Flow
|
|
35
37
|
|
|
36
38
|
```
|
|
37
|
-
|
|
39
|
+
manage-progress --action=start --title "Triage 128 unread emails" --step "Fetching inbox"
|
|
38
40
|
→ runId=abc
|
|
39
41
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
+
manage-progress --action=update --runId=abc --percent=25 --step="Classifying 32/128"
|
|
43
|
+
manage-progress --action=update --runId=abc --percent=75 --step="Drafting replies 97/128"
|
|
42
44
|
|
|
43
|
-
|
|
45
|
+
manage-progress --action=complete --runId=abc --status=succeeded
|
|
44
46
|
notify --severity=info --title="Triage done" --body="12 archived, 6 drafts ready to review"
|
|
45
47
|
```
|
|
46
48
|
|
|
@@ -48,9 +50,9 @@ notify --severity=info --title="Triage done" --body="12 archived, 6 drafts ready
|
|
|
48
50
|
|
|
49
51
|
- **Start a run for anything > ~5 seconds.** Users want feedback; a spinner with no context feels frozen.
|
|
50
52
|
- **Update at natural checkpoints**, not every iteration. Every 5–10% is enough for most UIs.
|
|
51
|
-
- **Always call `complete
|
|
53
|
+
- **Always call `manage-progress --action=complete`** at the end — including the error path. An orphaned `running` row is worse than no row.
|
|
52
54
|
- **Pair with `notify`** on completion. The tray tells users what's *running*; notifications tell them what *finished*.
|
|
53
|
-
- **Use `metadataJson`** on `start
|
|
55
|
+
- **Use `metadataJson`** on `manage-progress --action=start` to pass a link back to the produced artifact (thread id, document path), so the UI can deep-link from the runs tray.
|
|
54
56
|
|
|
55
57
|
## Runs API
|
|
56
58
|
|
|
@@ -16,6 +16,13 @@ import { ThemeProvider } from "next-themes";
|
|
|
16
16
|
import { useDbSync } from "@agent-native/core";
|
|
17
17
|
import { ClientOnly, DefaultSpinner } from "@agent-native/core/client";
|
|
18
18
|
import { Toaster } from "sonner";
|
|
19
|
+
import { configureTracking } from "@agent-native/core/client";
|
|
20
|
+
configureTracking({
|
|
21
|
+
getDefaultProps: (_name, properties) => ({
|
|
22
|
+
...properties,
|
|
23
|
+
app: "{{APP_NAME}}",
|
|
24
|
+
}),
|
|
25
|
+
});
|
|
19
26
|
import "./global.css";
|
|
20
27
|
|
|
21
28
|
export function Layout({ children }: { children: React.ReactNode }) {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LLMSection.d.ts","sourceRoot":"","sources":["../../../src/client/settings/LLMSection.tsx"],"names":[],"mappings":"AA6FA,wBAAgB,UAAU,4CAwSzB"}
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useEffect, useCallback } from "react";
|
|
3
|
-
import { IconBrain, IconCheck, IconLoader2, IconExternalLink, IconChevronDown, } from "@tabler/icons-react";
|
|
4
|
-
import { SettingsSection } from "./SettingsSection.js";
|
|
5
|
-
import { useBuilderStatus } from "./useBuilderStatus.js";
|
|
6
|
-
const PROVIDER_LABELS = {
|
|
7
|
-
anthropic: "Anthropic (Claude)",
|
|
8
|
-
"ai-sdk:openai": "OpenAI",
|
|
9
|
-
"ai-sdk:google": "Google Gemini",
|
|
10
|
-
};
|
|
11
|
-
const KEY_PLACEHOLDERS = {
|
|
12
|
-
ANTHROPIC_API_KEY: "sk-ant-...",
|
|
13
|
-
OPENAI_API_KEY: "sk-...",
|
|
14
|
-
GOOGLE_GENERATIVE_AI_API_KEY: "AI...",
|
|
15
|
-
};
|
|
16
|
-
const PROVIDER_DOCS = {
|
|
17
|
-
anthropic: "https://console.anthropic.com/settings/keys",
|
|
18
|
-
"ai-sdk:openai": "https://platform.openai.com/api-keys",
|
|
19
|
-
"ai-sdk:google": "https://aistudio.google.com/apikey",
|
|
20
|
-
};
|
|
21
|
-
const PRIMARY_PROVIDERS = ["anthropic", "ai-sdk:openai", "ai-sdk:google"];
|
|
22
|
-
const selectStyle = {
|
|
23
|
-
fontSize: 12,
|
|
24
|
-
lineHeight: 1,
|
|
25
|
-
};
|
|
26
|
-
function friendlyModelName(model) {
|
|
27
|
-
const claude = model.match(/^claude-(opus|sonnet|haiku)-(\d+)-(\d+)(?:-\d{8,})?$/);
|
|
28
|
-
if (claude) {
|
|
29
|
-
const tier = claude[1][0].toUpperCase() + claude[1].slice(1);
|
|
30
|
-
return `${tier} ${claude[2]}.${claude[3]}`;
|
|
31
|
-
}
|
|
32
|
-
if (model.startsWith("gpt-"))
|
|
33
|
-
return `GPT-${model.slice(4)}`;
|
|
34
|
-
if (/^o\d/.test(model))
|
|
35
|
-
return model;
|
|
36
|
-
const gemini = model.match(/^gemini-(.+?)(?:-preview)?$/);
|
|
37
|
-
if (gemini) {
|
|
38
|
-
const parts = gemini[1]
|
|
39
|
-
.split("-")
|
|
40
|
-
.map((s) => s[0].toUpperCase() + s.slice(1))
|
|
41
|
-
.join(" ");
|
|
42
|
-
return `Gemini ${parts}${model.endsWith("-preview") ? " (preview)" : ""}`;
|
|
43
|
-
}
|
|
44
|
-
return model;
|
|
45
|
-
}
|
|
46
|
-
function latestModelsOnly(models) {
|
|
47
|
-
const seen = new Set();
|
|
48
|
-
return models.filter((m) => {
|
|
49
|
-
const claude = m.match(/^claude-(opus|sonnet|haiku)-/);
|
|
50
|
-
if (claude) {
|
|
51
|
-
if (seen.has(claude[1]))
|
|
52
|
-
return false;
|
|
53
|
-
seen.add(claude[1]);
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
const gemini = m.match(/^gemini-(\d+(?:\.\d+)?)-(.+?)(?:-preview)?$/);
|
|
57
|
-
if (gemini) {
|
|
58
|
-
const family = gemini[2];
|
|
59
|
-
if (seen.has(`gemini-${family}`))
|
|
60
|
-
return false;
|
|
61
|
-
seen.add(`gemini-${family}`);
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
return true;
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
export function LLMSection() {
|
|
68
|
-
const { status: builder } = useBuilderStatus();
|
|
69
|
-
const [envKeys, setEnvKeys] = useState([]);
|
|
70
|
-
const [loading, setLoading] = useState(true);
|
|
71
|
-
const [apiKey, setApiKey] = useState("");
|
|
72
|
-
const [saving, setSaving] = useState(false);
|
|
73
|
-
const [saved, setSaved] = useState(false);
|
|
74
|
-
const [engines, setEngines] = useState([]);
|
|
75
|
-
const [currentEngine, setCurrentEngine] = useState("anthropic");
|
|
76
|
-
const [currentModel, setCurrentModel] = useState("");
|
|
77
|
-
const [selectedEngine, setSelectedEngine] = useState("anthropic");
|
|
78
|
-
const [selectedModel, setSelectedModel] = useState("");
|
|
79
|
-
const [applyNote, setApplyNote] = useState(false);
|
|
80
|
-
const fetchEnvStatus = useCallback(async () => {
|
|
81
|
-
try {
|
|
82
|
-
const res = await fetch("/_agent-native/env-status");
|
|
83
|
-
if (!res.ok)
|
|
84
|
-
return;
|
|
85
|
-
setEnvKeys(await res.json());
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
// env-status not configured
|
|
89
|
-
}
|
|
90
|
-
finally {
|
|
91
|
-
setLoading(false);
|
|
92
|
-
}
|
|
93
|
-
}, []);
|
|
94
|
-
useEffect(() => {
|
|
95
|
-
fetchEnvStatus();
|
|
96
|
-
}, [fetchEnvStatus]);
|
|
97
|
-
useEffect(() => {
|
|
98
|
-
fetch("/_agent-native/actions/list-agent-engines", {
|
|
99
|
-
method: "POST",
|
|
100
|
-
headers: { "Content-Type": "application/json" },
|
|
101
|
-
body: JSON.stringify({}),
|
|
102
|
-
})
|
|
103
|
-
.then((r) => (r.ok ? r.json() : null))
|
|
104
|
-
.then((data) => {
|
|
105
|
-
if (!data)
|
|
106
|
-
return;
|
|
107
|
-
setEngines(data.engines ?? []);
|
|
108
|
-
const cur = data.current ?? {};
|
|
109
|
-
setCurrentEngine(cur.engine ?? "anthropic");
|
|
110
|
-
setCurrentModel(cur.model ?? "");
|
|
111
|
-
setSelectedEngine(cur.engine ?? "anthropic");
|
|
112
|
-
setSelectedModel(cur.model ?? "");
|
|
113
|
-
})
|
|
114
|
-
.catch(() => { });
|
|
115
|
-
}, []);
|
|
116
|
-
const builderConnected = builder?.configured ?? false;
|
|
117
|
-
const selectedEngineInfo = engines.find((e) => e.name === selectedEngine);
|
|
118
|
-
const envVar = selectedEngineInfo?.requiredEnvVars?.[0];
|
|
119
|
-
const envConfigured = envVar
|
|
120
|
-
? (envKeys.find((k) => k.key === envVar)?.configured ?? false)
|
|
121
|
-
: false;
|
|
122
|
-
const anyKeyConfigured = envConfigured || builderConnected;
|
|
123
|
-
const engineChanged = selectedEngine !== currentEngine || selectedModel !== currentModel;
|
|
124
|
-
// Build provider options
|
|
125
|
-
const providerOptions = PRIMARY_PROVIDERS.filter((name) => engines.some((e) => e.name === name));
|
|
126
|
-
// Ensure selected engine is visible even if not in the current list
|
|
127
|
-
if (!providerOptions.includes(selectedEngine) &&
|
|
128
|
-
engines.some((e) => e.name === selectedEngine)) {
|
|
129
|
-
providerOptions.push(selectedEngine);
|
|
130
|
-
}
|
|
131
|
-
const modelOptions = latestModelsOnly(selectedEngineInfo?.supportedModels ?? []);
|
|
132
|
-
const handleSave = async () => {
|
|
133
|
-
if (!apiKey.trim() || !envVar)
|
|
134
|
-
return;
|
|
135
|
-
setSaving(true);
|
|
136
|
-
setSaved(false);
|
|
137
|
-
try {
|
|
138
|
-
const res = await fetch("/_agent-native/env-vars", {
|
|
139
|
-
method: "POST",
|
|
140
|
-
headers: { "Content-Type": "application/json" },
|
|
141
|
-
body: JSON.stringify({
|
|
142
|
-
vars: [{ key: envVar, value: apiKey.trim() }],
|
|
143
|
-
}),
|
|
144
|
-
});
|
|
145
|
-
if (res.ok) {
|
|
146
|
-
setSaved(true);
|
|
147
|
-
setApiKey("");
|
|
148
|
-
fetchEnvStatus();
|
|
149
|
-
setTimeout(() => setSaved(false), 2000);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
finally {
|
|
153
|
-
setSaving(false);
|
|
154
|
-
}
|
|
155
|
-
};
|
|
156
|
-
const handleApply = async () => {
|
|
157
|
-
try {
|
|
158
|
-
const res = await fetch("/_agent-native/actions/set-agent-engine", {
|
|
159
|
-
method: "POST",
|
|
160
|
-
headers: { "Content-Type": "application/json" },
|
|
161
|
-
body: JSON.stringify({
|
|
162
|
-
engine: selectedEngine,
|
|
163
|
-
model: selectedModel,
|
|
164
|
-
}),
|
|
165
|
-
});
|
|
166
|
-
if (res.ok) {
|
|
167
|
-
setCurrentEngine(selectedEngine);
|
|
168
|
-
setCurrentModel(selectedModel);
|
|
169
|
-
setApplyNote(true);
|
|
170
|
-
setTimeout(() => setApplyNote(false), 4000);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
catch {
|
|
174
|
-
// ignore
|
|
175
|
-
}
|
|
176
|
-
};
|
|
177
|
-
const docsUrl = PROVIDER_DOCS[selectedEngine];
|
|
178
|
-
return (_jsx(SettingsSection, { icon: _jsx(IconBrain, { size: 14 }), title: "LLM", subtitle: "Connect any major LLM \u2014 Claude, GPT, Gemini, and more.", connected: anyKeyConfigured, children: _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "rounded-md border border-border px-2.5 py-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "text-[11px] font-medium text-foreground", children: "Builder LLM Proxy" }), builderConnected ? (_jsxs("span", { className: "flex items-center gap-1 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), "Connected"] })) : builder?.connectUrl ? (_jsxs("a", { href: builder.connectUrl, target: "_blank", rel: "noopener noreferrer", className: "flex items-center gap-1 rounded px-2 py-0.5 text-[10px] font-medium bg-accent text-foreground hover:bg-accent/80", children: ["Connect Builder", _jsx(IconExternalLink, { size: 10 })] })) : null] }), _jsx("p", { className: "text-[10px] text-muted-foreground mt-1", children: builderConnected
|
|
179
|
-
? `Using Builder's LLM proxy${builder?.orgName ? ` (${builder.orgName})` : ""}`
|
|
180
|
-
: "Use Builder's managed Anthropic proxy — no API key needed" })] }), _jsxs("div", { className: "rounded-md border border-border px-2.5 py-2", children: [_jsx("div", { className: "text-[11px] font-medium text-foreground mb-1", children: "Set up manually" }), _jsx("p", { className: "text-[10px] text-muted-foreground mb-2", children: "Choose your AI provider and model." }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "space-y-1.5", children: [_jsx("p", { className: "text-[12px] font-medium text-foreground", children: "Provider" }), _jsxs("div", { className: "relative", children: [_jsx("select", { value: selectedEngine, onChange: (e) => {
|
|
181
|
-
const val = e.target.value;
|
|
182
|
-
setSelectedEngine(val);
|
|
183
|
-
const info = engines.find((eng) => eng.name === val);
|
|
184
|
-
setSelectedModel(info?.defaultModel ?? "");
|
|
185
|
-
setApiKey("");
|
|
186
|
-
}, className: "flex h-9 w-full appearance-none items-center rounded-md border border-border bg-background px-3 pr-8 text-left text-[12px] text-foreground outline-none hover:bg-accent/40", style: selectStyle, children: providerOptions.map((name) => (_jsx("option", { value: name, children: PROVIDER_LABELS[name] ?? name }, name))) }), _jsx(IconChevronDown, { size: 14, className: "pointer-events-none absolute right-2.5 top-1/2 -translate-y-1/2 text-muted-foreground" })] })] }), modelOptions.length > 0 && (_jsxs("div", { className: "space-y-1.5", children: [_jsx("p", { className: "text-[12px] font-medium text-foreground", children: "Model" }), _jsxs("div", { className: "relative", children: [_jsx("select", { value: selectedModel, onChange: (e) => setSelectedModel(e.target.value), className: "flex h-9 w-full appearance-none items-center rounded-md border border-border bg-background px-3 pr-8 text-left text-[12px] text-foreground outline-none hover:bg-accent/40", style: selectStyle, children: modelOptions.map((m) => (_jsx("option", { value: m, children: friendlyModelName(m) }, m))) }), _jsx(IconChevronDown, { size: 14, className: "pointer-events-none absolute right-2.5 top-1/2 -translate-y-1/2 text-muted-foreground" })] })] })), loading ? (_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] text-muted-foreground", children: [_jsx(IconLoader2, { size: 10, className: "animate-spin" }), "Checking..."] })) : envVar && envConfigured ? (_jsxs("div", { className: "flex items-center gap-1.5 text-[10px] text-green-500", children: [_jsx(IconCheck, { size: 10 }), envVar, " configured"] })) : envVar ? (_jsxs("div", { className: "flex gap-1.5", children: [_jsx("input", { type: "password", value: apiKey, onChange: (e) => setApiKey(e.target.value), onKeyDown: (e) => {
|
|
187
|
-
if (e.key === "Enter")
|
|
188
|
-
handleSave();
|
|
189
|
-
}, placeholder: KEY_PLACEHOLDERS[envVar] ?? "...", className: "flex-1 rounded border border-border bg-background px-2 py-1 text-[11px] text-foreground outline-none placeholder:text-muted-foreground/50 focus:ring-1 focus:ring-accent" }), _jsx("button", { onClick: handleSave, disabled: !apiKey.trim() || saving, className: "rounded bg-accent px-2 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80 disabled:opacity-40", children: saving ? (_jsx(IconLoader2, { size: 10, className: "animate-spin" })) : saved ? (_jsx(IconCheck, { size: 10 })) : ("Save") })] })) : null, engineChanged && (_jsx("button", { onClick: handleApply, className: "rounded bg-accent px-2.5 py-1 text-[10px] font-medium text-foreground hover:bg-accent/80", children: "Apply" })), applyNote && (_jsx("p", { className: "text-[10px] text-muted-foreground", children: "Changes take effect on next conversation" }))] }), docsUrl && (_jsxs("a", { href: docsUrl, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 mt-1.5 rounded border border-border px-2.5 py-1 text-[10px] font-medium no-underline text-muted-foreground hover:text-foreground hover:bg-accent/40", children: ["Get an API key", _jsx(IconExternalLink, { size: 10 })] }))] })] }) }));
|
|
190
|
-
}
|
|
191
|
-
//# sourceMappingURL=LLMSection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LLMSection.js","sourceRoot":"","sources":["../../../src/client/settings/LLMSection.tsx"],"names":[],"mappings":"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"}
|