@agent-native/core 0.7.14 → 0.7.15
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 +56 -6
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +149 -24
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/server.d.ts.map +1 -1
- package/dist/a2a/server.js +166 -51
- package/dist/a2a/server.js.map +1 -1
- package/dist/a2a/task-store.d.ts +10 -1
- package/dist/a2a/task-store.d.ts.map +1 -1
- package/dist/a2a/task-store.js +36 -2
- package/dist/a2a/task-store.js.map +1 -1
- package/dist/agent/default-model.d.ts +21 -0
- package/dist/agent/default-model.d.ts.map +1 -0
- package/dist/agent/default-model.js +21 -0
- package/dist/agent/default-model.js.map +1 -0
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +7 -4
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +10 -4
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +4 -1
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/engine/builtin.js +1 -1
- package/dist/agent/engine/builtin.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +27 -7
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +101 -20
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/index.d.ts +1 -0
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +1 -0
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/production-agent.d.ts +25 -3
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +227 -36
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/application-state/handlers.d.ts.map +1 -1
- package/dist/application-state/handlers.js +10 -6
- package/dist/application-state/handlers.js.map +1 -1
- package/dist/application-state/script-helpers.d.ts +1 -1
- package/dist/application-state/script-helpers.d.ts.map +1 -1
- package/dist/application-state/script-helpers.js +12 -8
- package/dist/application-state/script-helpers.js.map +1 -1
- package/dist/application-state/store.d.ts.map +1 -1
- package/dist/application-state/store.js +19 -10
- package/dist/application-state/store.js.map +1 -1
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +4 -1
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +79 -13
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +97 -39
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/templates-meta.d.ts +4 -0
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +56 -12
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/cli/workspacify.d.ts +2 -0
- package/dist/cli/workspacify.d.ts.map +1 -1
- package/dist/cli/workspacify.js +5 -4
- package/dist/cli/workspacify.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +5 -2
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +61 -23
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AgentTaskCard.d.ts.map +1 -1
- package/dist/client/AgentTaskCard.js +3 -2
- package/dist/client/AgentTaskCard.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +79 -16
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
- package/dist/client/ConnectBuilderCard.js +2 -1
- package/dist/client/ConnectBuilderCard.js.map +1 -1
- package/dist/client/DefaultSpinner.d.ts +1 -1
- package/dist/client/DefaultSpinner.d.ts.map +1 -1
- package/dist/client/DefaultSpinner.js +2 -9
- package/dist/client/DefaultSpinner.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +20 -19
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +2 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +3 -1
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +70 -1
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/api-path.d.ts +5 -0
- package/dist/client/api-path.d.ts.map +1 -0
- package/dist/client/api-path.js +48 -0
- package/dist/client/api-path.js.map +1 -0
- package/dist/client/components/ApiKeySettings.d.ts.map +1 -1
- package/dist/client/components/ApiKeySettings.js +3 -2
- package/dist/client/components/ApiKeySettings.js.map +1 -1
- package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
- package/dist/client/components/CodeRequiredDialog.js +3 -2
- package/dist/client/components/CodeRequiredDialog.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 +9 -8
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/draft-key.d.ts +2 -0
- package/dist/client/composer/draft-key.d.ts.map +1 -0
- package/dist/client/composer/draft-key.js +8 -0
- package/dist/client/composer/draft-key.js.map +1 -0
- package/dist/client/composer/use-file-search.d.ts.map +1 -1
- package/dist/client/composer/use-file-search.js +2 -1
- package/dist/client/composer/use-file-search.js.map +1 -1
- package/dist/client/composer/use-mention-search.d.ts.map +1 -1
- package/dist/client/composer/use-mention-search.js +2 -1
- package/dist/client/composer/use-mention-search.js.map +1 -1
- package/dist/client/composer/use-skills.d.ts.map +1 -1
- package/dist/client/composer/use-skills.js +2 -1
- package/dist/client/composer/use-skills.js.map +1 -1
- package/dist/client/composer/useVoiceDictation.d.ts +1 -1
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +16 -8
- package/dist/client/composer/useVoiceDictation.js.map +1 -1
- package/dist/client/dev-mode.d.ts +14 -0
- package/dist/client/dev-mode.d.ts.map +1 -0
- package/dist/client/dev-mode.js +14 -0
- package/dist/client/dev-mode.js.map +1 -0
- package/dist/client/dev-overlay/DevOverlay.d.ts +26 -0
- package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -0
- package/dist/client/dev-overlay/DevOverlay.js +315 -0
- package/dist/client/dev-overlay/DevOverlay.js.map +1 -0
- package/dist/client/dev-overlay/builtins.d.ts +6 -0
- package/dist/client/dev-overlay/builtins.d.ts.map +1 -0
- package/dist/client/dev-overlay/builtins.js +35 -0
- package/dist/client/dev-overlay/builtins.js.map +1 -0
- package/dist/client/dev-overlay/index.d.ts +6 -0
- package/dist/client/dev-overlay/index.d.ts.map +1 -0
- package/dist/client/dev-overlay/index.js +5 -0
- package/dist/client/dev-overlay/index.js.map +1 -0
- package/dist/client/dev-overlay/registry.d.ts +13 -0
- package/dist/client/dev-overlay/registry.d.ts.map +1 -0
- package/dist/client/dev-overlay/registry.js +63 -0
- package/dist/client/dev-overlay/registry.js.map +1 -0
- package/dist/client/dev-overlay/types.d.ts +56 -0
- package/dist/client/dev-overlay/types.d.ts.map +1 -0
- package/dist/client/dev-overlay/types.js +9 -0
- package/dist/client/dev-overlay/types.js.map +1 -0
- package/dist/client/dev-overlay/use-dev-option.d.ts +12 -0
- package/dist/client/dev-overlay/use-dev-option.d.ts.map +1 -0
- package/dist/client/dev-overlay/use-dev-option.js +73 -0
- package/dist/client/dev-overlay/use-dev-option.js.map +1 -0
- package/dist/client/dev-overlay/use-dev-overlay-shortcut.d.ts +6 -0
- package/dist/client/dev-overlay/use-dev-overlay-shortcut.d.ts.map +1 -0
- package/dist/client/dev-overlay/use-dev-overlay-shortcut.js +29 -0
- package/dist/client/dev-overlay/use-dev-overlay-shortcut.js.map +1 -0
- package/dist/client/frame.d.ts +1 -0
- package/dist/client/frame.d.ts.map +1 -1
- package/dist/client/frame.js +32 -11
- package/dist/client/frame.js.map +1 -1
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +4 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/integrations/IntegrationCard.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationCard.js +3 -2
- package/dist/client/integrations/IntegrationCard.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +3 -2
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/integrations/useIntegrationStatus.d.ts.map +1 -1
- package/dist/client/integrations/useIntegrationStatus.js +2 -1
- package/dist/client/integrations/useIntegrationStatus.js.map +1 -1
- package/dist/client/notifications/NotificationsBell.d.ts.map +1 -1
- package/dist/client/notifications/NotificationsBell.js +26 -8
- package/dist/client/notifications/NotificationsBell.js.map +1 -1
- package/dist/client/observability/ThumbsFeedback.d.ts.map +1 -1
- package/dist/client/observability/ThumbsFeedback.js +2 -1
- package/dist/client/observability/ThumbsFeedback.js.map +1 -1
- package/dist/client/observability/useObservability.d.ts.map +1 -1
- package/dist/client/observability/useObservability.js +2 -1
- package/dist/client/observability/useObservability.js.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.d.ts +0 -7
- package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +20 -10
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/onboarding/index.d.ts +1 -0
- package/dist/client/onboarding/index.d.ts.map +1 -1
- package/dist/client/onboarding/index.js +1 -0
- package/dist/client/onboarding/index.js.map +1 -1
- package/dist/client/onboarding/use-onboarding.d.ts +1 -7
- package/dist/client/onboarding/use-onboarding.d.ts.map +1 -1
- package/dist/client/onboarding/use-onboarding.js +27 -13
- package/dist/client/onboarding/use-onboarding.js.map +1 -1
- package/dist/client/onboarding/use-preview-mode.d.ts +10 -0
- package/dist/client/onboarding/use-preview-mode.d.ts.map +1 -0
- package/dist/client/onboarding/use-preview-mode.js +35 -0
- package/dist/client/onboarding/use-preview-mode.js.map +1 -0
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +2 -1
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +7 -5
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +2 -1
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/progress/RunsTray.d.ts.map +1 -1
- package/dist/client/progress/RunsTray.js +2 -1
- package/dist/client/progress/RunsTray.js.map +1 -1
- package/dist/client/resources/McpServerDetail.d.ts +0 -8
- package/dist/client/resources/McpServerDetail.d.ts.map +1 -1
- package/dist/client/resources/McpServerDetail.js +6 -1
- package/dist/client/resources/McpServerDetail.js.map +1 -1
- package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
- package/dist/client/resources/ResourceEditor.js +2 -1
- package/dist/client/resources/ResourceEditor.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +2 -1
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/resources/use-mcp-servers.d.ts.map +1 -1
- package/dist/client/resources/use-mcp-servers.js +7 -2
- package/dist/client/resources/use-mcp-servers.js.map +1 -1
- package/dist/client/resources/use-resources.d.ts.map +1 -1
- package/dist/client/resources/use-resources.js +9 -7
- package/dist/client/resources/use-resources.js.map +1 -1
- package/dist/client/settings/AgentsSection.d.ts.map +1 -1
- package/dist/client/settings/AgentsSection.js +7 -5
- package/dist/client/settings/AgentsSection.js.map +1 -1
- package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
- package/dist/client/settings/AutomationsSection.js +9 -5
- package/dist/client/settings/AutomationsSection.js.map +1 -1
- package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -1
- package/dist/client/settings/BackgroundAgentSection.js +2 -1
- package/dist/client/settings/BackgroundAgentSection.js.map +1 -1
- package/dist/client/settings/SecretsSection.d.ts.map +1 -1
- package/dist/client/settings/SecretsSection.js +12 -4
- package/dist/client/settings/SecretsSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +15 -23
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/UsageSection.d.ts.map +1 -1
- package/dist/client/settings/UsageSection.js +2 -1
- package/dist/client/settings/UsageSection.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts +2 -4
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +66 -23
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +9 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +31 -3
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +7 -2
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
- package/dist/client/sharing/ShareDialog.js +4 -3
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/client/terminal/AgentTerminal.d.ts +1 -0
- package/dist/client/terminal/AgentTerminal.d.ts.map +1 -1
- package/dist/client/terminal/AgentTerminal.js +12 -8
- package/dist/client/terminal/AgentTerminal.js.map +1 -1
- package/dist/client/tools/EmbeddedTool.d.ts +20 -0
- package/dist/client/tools/EmbeddedTool.d.ts.map +1 -0
- package/dist/client/tools/EmbeddedTool.js +113 -0
- package/dist/client/tools/EmbeddedTool.js.map +1 -0
- package/dist/client/tools/ExtensionSlot.d.ts +27 -0
- package/dist/client/tools/ExtensionSlot.d.ts.map +1 -0
- package/dist/client/tools/ExtensionSlot.js +96 -0
- package/dist/client/tools/ExtensionSlot.js.map +1 -0
- package/dist/client/tools/ToolEditor.d.ts.map +1 -1
- package/dist/client/tools/ToolEditor.js +5 -4
- package/dist/client/tools/ToolEditor.js.map +1 -1
- package/dist/client/tools/ToolViewer.d.ts.map +1 -1
- package/dist/client/tools/ToolViewer.js +10 -44
- package/dist/client/tools/ToolViewer.js.map +1 -1
- package/dist/client/tools/ToolViewerPage.d.ts.map +1 -1
- package/dist/client/tools/ToolViewerPage.js +2 -1
- package/dist/client/tools/ToolViewerPage.js.map +1 -1
- package/dist/client/tools/ToolsListPage.d.ts.map +1 -1
- package/dist/client/tools/ToolsListPage.js +3 -2
- package/dist/client/tools/ToolsListPage.js.map +1 -1
- package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -1
- package/dist/client/tools/ToolsSidebarSection.js +4 -3
- package/dist/client/tools/ToolsSidebarSection.js.map +1 -1
- package/dist/client/tools/iframe-bridge.d.ts +16 -0
- package/dist/client/tools/iframe-bridge.d.ts.map +1 -0
- package/dist/client/tools/iframe-bridge.js +118 -0
- package/dist/client/tools/iframe-bridge.js.map +1 -0
- package/dist/client/tools/index.d.ts +2 -0
- package/dist/client/tools/index.d.ts.map +1 -1
- package/dist/client/tools/index.js +2 -0
- package/dist/client/tools/index.js.map +1 -1
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +2 -1
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-avatar.d.ts.map +1 -1
- package/dist/client/use-avatar.js +3 -2
- package/dist/client/use-avatar.js.map +1 -1
- package/dist/client/use-builder-enabled.d.ts.map +1 -1
- package/dist/client/use-builder-enabled.js +2 -1
- package/dist/client/use-builder-enabled.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +2 -1
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +3 -2
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/use-dev-mode.d.ts.map +1 -1
- package/dist/client/use-dev-mode.js +2 -1
- package/dist/client/use-dev-mode.js.map +1 -1
- package/dist/client/use-send-to-agent-chat.d.ts.map +1 -1
- package/dist/client/use-send-to-agent-chat.js +3 -1
- package/dist/client/use-send-to-agent-chat.js.map +1 -1
- package/dist/client/use-session.d.ts.map +1 -1
- package/dist/client/use-session.js +2 -1
- package/dist/client/use-session.js.map +1 -1
- package/dist/client/useProductionAgent.d.ts.map +1 -1
- package/dist/client/useProductionAgent.js +2 -1
- package/dist/client/useProductionAgent.js.map +1 -1
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +3 -2
- package/dist/collab/client.js.map +1 -1
- package/dist/credentials/index.d.ts +27 -10
- package/dist/credentials/index.d.ts.map +1 -1
- package/dist/credentials/index.js +61 -19
- package/dist/credentials/index.js.map +1 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +10 -1
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrations.d.ts +13 -5
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +9 -2
- package/dist/db/migrations.js.map +1 -1
- package/dist/deploy/build.d.ts +12 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +195 -23
- package/dist/deploy/build.js.map +1 -1
- package/dist/file-upload/registry.d.ts.map +1 -1
- package/dist/file-upload/registry.js +25 -1
- package/dist/file-upload/registry.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/adapters/email.d.ts.map +1 -1
- package/dist/integrations/adapters/email.js +152 -32
- package/dist/integrations/adapters/email.js.map +1 -1
- package/dist/integrations/adapters/slack.d.ts.map +1 -1
- package/dist/integrations/adapters/slack.js +190 -32
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/adapters/telegram.d.ts.map +1 -1
- package/dist/integrations/adapters/telegram.js +37 -2
- package/dist/integrations/adapters/telegram.js.map +1 -1
- package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
- package/dist/integrations/adapters/whatsapp.js +91 -12
- package/dist/integrations/adapters/whatsapp.js.map +1 -1
- package/dist/integrations/google-docs-poller.d.ts.map +1 -1
- package/dist/integrations/google-docs-poller.js +5 -2
- package/dist/integrations/google-docs-poller.js.map +1 -1
- package/dist/integrations/internal-token.d.ts.map +1 -1
- package/dist/integrations/internal-token.js +17 -1
- package/dist/integrations/internal-token.js.map +1 -1
- package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -1
- package/dist/integrations/pending-tasks-retry-job.js +18 -7
- package/dist/integrations/pending-tasks-retry-job.js.map +1 -1
- package/dist/integrations/pending-tasks-store.d.ts +16 -0
- package/dist/integrations/pending-tasks-store.d.ts.map +1 -1
- package/dist/integrations/pending-tasks-store.js +58 -5
- package/dist/integrations/pending-tasks-store.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +198 -15
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/types.d.ts +33 -2
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.d.ts +6 -0
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +141 -61
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/cron.d.ts.map +1 -1
- package/dist/jobs/cron.js +12 -4
- package/dist/jobs/cron.js.map +1 -1
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +141 -16
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/jobs/tools.d.ts.map +1 -1
- package/dist/jobs/tools.js +94 -3
- package/dist/jobs/tools.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +128 -62
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp-client/hub-routes.d.ts +14 -0
- package/dist/mcp-client/hub-routes.d.ts.map +1 -1
- package/dist/mcp-client/hub-routes.js +42 -2
- package/dist/mcp-client/hub-routes.js.map +1 -1
- package/dist/mcp-client/index.d.ts +1 -1
- package/dist/mcp-client/index.d.ts.map +1 -1
- package/dist/mcp-client/index.js +1 -1
- package/dist/mcp-client/index.js.map +1 -1
- package/dist/mcp-client/manager.d.ts.map +1 -1
- package/dist/mcp-client/manager.js +28 -3
- package/dist/mcp-client/manager.js.map +1 -1
- package/dist/mcp-client/remote-store.d.ts +49 -1
- package/dist/mcp-client/remote-store.d.ts.map +1 -1
- package/dist/mcp-client/remote-store.js +253 -6
- package/dist/mcp-client/remote-store.js.map +1 -1
- package/dist/mcp-client/routes.d.ts.map +1 -1
- package/dist/mcp-client/routes.js +11 -9
- package/dist/mcp-client/routes.js.map +1 -1
- package/dist/mcp-client/visibility.d.ts +7 -3
- package/dist/mcp-client/visibility.d.ts.map +1 -1
- package/dist/mcp-client/visibility.js +16 -7
- package/dist/mcp-client/visibility.js.map +1 -1
- package/dist/notifications/actions.d.ts.map +1 -1
- package/dist/notifications/actions.js +7 -1
- package/dist/notifications/actions.js.map +1 -1
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/notifications/routes.d.ts.map +1 -1
- package/dist/notifications/routes.js +20 -3
- package/dist/notifications/routes.js.map +1 -1
- package/dist/notifications/store.d.ts.map +1 -1
- package/dist/notifications/store.js +6 -1
- package/dist/notifications/store.js.map +1 -1
- package/dist/oauth-tokens/store.d.ts +43 -2
- package/dist/oauth-tokens/store.d.ts.map +1 -1
- package/dist/oauth-tokens/store.js +83 -14
- package/dist/oauth-tokens/store.js.map +1 -1
- package/dist/observability/experiments.js +5 -5
- package/dist/observability/experiments.js.map +1 -1
- package/dist/observability/routes.d.ts.map +1 -1
- package/dist/observability/routes.js +37 -8
- package/dist/observability/routes.js.map +1 -1
- package/dist/observability/store.d.ts.map +1 -1
- package/dist/observability/store.js +19 -3
- package/dist/observability/store.js.map +1 -1
- package/dist/observability/types.d.ts +7 -0
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/observability/types.js.map +1 -1
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +1 -2
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/onboarding/plugin.d.ts.map +1 -1
- package/dist/onboarding/plugin.js +63 -32
- package/dist/onboarding/plugin.js.map +1 -1
- package/dist/onboarding/types.d.ts +6 -1
- package/dist/onboarding/types.d.ts.map +1 -1
- package/dist/org/accept-pending.d.ts.map +1 -1
- package/dist/org/accept-pending.js +2 -1
- package/dist/org/accept-pending.js.map +1 -1
- package/dist/progress/actions.d.ts.map +1 -1
- package/dist/progress/actions.js +10 -1
- package/dist/progress/actions.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/progress/routes.d.ts.map +1 -1
- package/dist/progress/routes.js +20 -3
- package/dist/progress/routes.js.map +1 -1
- package/dist/progress/store.d.ts.map +1 -1
- package/dist/progress/store.js +6 -1
- package/dist/progress/store.js.map +1 -1
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +35 -7
- package/dist/resources/handlers.js.map +1 -1
- package/dist/resources/script-helpers.d.ts.map +1 -1
- package/dist/resources/script-helpers.js +15 -3
- package/dist/resources/script-helpers.js.map +1 -1
- package/dist/resources/store.d.ts.map +1 -1
- package/dist/resources/store.js +12 -4
- package/dist/resources/store.js.map +1 -1
- package/dist/scripts/call-agent.d.ts +1 -0
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +78 -40
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/scripts/chat/search-chats.d.ts.map +1 -1
- package/dist/scripts/chat/search-chats.js +3 -2
- package/dist/scripts/chat/search-chats.js.map +1 -1
- package/dist/scripts/db/exec.d.ts +1 -1
- package/dist/scripts/db/exec.d.ts.map +1 -1
- package/dist/scripts/db/exec.js +22 -3
- package/dist/scripts/db/exec.js.map +1 -1
- package/dist/scripts/db/migrate-user-api-keys.d.ts.map +1 -1
- package/dist/scripts/db/migrate-user-api-keys.js +10 -0
- package/dist/scripts/db/migrate-user-api-keys.js.map +1 -1
- package/dist/scripts/db/query.d.ts +1 -1
- package/dist/scripts/db/query.d.ts.map +1 -1
- package/dist/scripts/db/query.js +22 -3
- package/dist/scripts/db/query.js.map +1 -1
- package/dist/scripts/db/scoping.d.ts.map +1 -1
- package/dist/scripts/db/scoping.js +15 -9
- package/dist/scripts/db/scoping.js.map +1 -1
- package/dist/scripts/dev/shell.d.ts.map +1 -1
- package/dist/scripts/dev/shell.js +3 -1
- package/dist/scripts/dev/shell.js.map +1 -1
- package/dist/scripts/resources/delete-memory.d.ts.map +1 -1
- package/dist/scripts/resources/delete-memory.js +2 -1
- package/dist/scripts/resources/delete-memory.js.map +1 -1
- package/dist/scripts/resources/delete.d.ts.map +1 -1
- package/dist/scripts/resources/delete.js +2 -1
- package/dist/scripts/resources/delete.js.map +1 -1
- package/dist/scripts/resources/list.d.ts.map +1 -1
- package/dist/scripts/resources/list.js +2 -1
- package/dist/scripts/resources/list.js.map +1 -1
- package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
- package/dist/scripts/resources/migrate-learnings.js +2 -1
- package/dist/scripts/resources/migrate-learnings.js.map +1 -1
- package/dist/scripts/resources/read.d.ts.map +1 -1
- package/dist/scripts/resources/read.js +2 -1
- package/dist/scripts/resources/read.js.map +1 -1
- package/dist/scripts/resources/save-memory.d.ts.map +1 -1
- package/dist/scripts/resources/save-memory.js +2 -1
- package/dist/scripts/resources/save-memory.js.map +1 -1
- package/dist/scripts/resources/write.d.ts.map +1 -1
- package/dist/scripts/resources/write.js +2 -1
- package/dist/scripts/resources/write.js.map +1 -1
- package/dist/secrets/onboarding.d.ts.map +1 -1
- package/dist/secrets/onboarding.js +24 -16
- package/dist/secrets/onboarding.js.map +1 -1
- package/dist/secrets/routes.d.ts.map +1 -1
- package/dist/secrets/routes.js +139 -37
- package/dist/secrets/routes.js.map +1 -1
- package/dist/secrets/storage.d.ts.map +1 -1
- package/dist/secrets/storage.js +23 -12
- package/dist/secrets/storage.js.map +1 -1
- package/dist/secrets/substitution.d.ts +24 -2
- package/dist/secrets/substitution.d.ts.map +1 -1
- package/dist/secrets/substitution.js +44 -6
- package/dist/secrets/substitution.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +15 -51
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +42 -15
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +447 -335
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-discovery.d.ts +8 -0
- package/dist/server/agent-discovery.d.ts.map +1 -1
- package/dist/server/agent-discovery.js +39 -12
- package/dist/server/agent-discovery.js.map +1 -1
- package/dist/server/agent-teams.d.ts.map +1 -1
- package/dist/server/agent-teams.js +4 -1
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/analytics.d.ts +0 -1
- package/dist/server/analytics.d.ts.map +1 -1
- package/dist/server/analytics.js +0 -1
- package/dist/server/analytics.js.map +1 -1
- package/dist/server/app-base-path.d.ts +4 -0
- package/dist/server/app-base-path.d.ts.map +1 -0
- package/dist/server/app-base-path.js +33 -0
- package/dist/server/app-base-path.js.map +1 -0
- package/dist/server/auth.d.ts +15 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +400 -68
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts +1 -0
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +67 -15
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/builder-browser.d.ts +15 -0
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +90 -4
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/cli-capture.d.ts +31 -0
- package/dist/server/cli-capture.d.ts.map +1 -0
- package/dist/server/cli-capture.js +120 -0
- package/dist/server/cli-capture.js.map +1 -0
- package/dist/server/collab-plugin.d.ts +12 -0
- package/dist/server/collab-plugin.d.ts.map +1 -1
- package/dist/server/collab-plugin.js +63 -21
- package/dist/server/collab-plugin.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +435 -106
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/create-server.d.ts +2 -0
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +82 -11
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/credential-provider.d.ts +11 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +51 -2
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/csrf.d.ts +58 -0
- package/dist/server/csrf.d.ts.map +1 -0
- package/dist/server/csrf.js +165 -0
- package/dist/server/csrf.js.map +1 -0
- package/dist/server/framework-request-handler.d.ts +20 -0
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +115 -34
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/google-auth-plugin.d.ts.map +1 -1
- package/dist/server/google-auth-plugin.js +10 -2
- package/dist/server/google-auth-plugin.js.map +1 -1
- package/dist/server/google-oauth.d.ts +84 -2
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +248 -45
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/index.d.ts +4 -4
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -4
- package/dist/server/index.js.map +1 -1
- package/dist/server/oauth-helpers.d.ts +8 -3
- package/dist/server/oauth-helpers.d.ts.map +1 -1
- package/dist/server/oauth-helpers.js +12 -8
- package/dist/server/oauth-helpers.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +37 -9
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/poll.d.ts +33 -0
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +43 -2
- package/dist/server/poll.js.map +1 -1
- package/dist/server/request-context.d.ts +102 -3
- package/dist/server/request-context.d.ts.map +1 -1
- package/dist/server/request-context.js +100 -7
- package/dist/server/request-context.js.map +1 -1
- package/dist/server/security-headers.d.ts +51 -0
- package/dist/server/security-headers.d.ts.map +1 -0
- package/dist/server/security-headers.js +90 -0
- package/dist/server/security-headers.js.map +1 -0
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +96 -2
- 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 +307 -56
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/server/voice-providers-status.d.ts +12 -0
- package/dist/server/voice-providers-status.d.ts.map +1 -0
- package/dist/server/voice-providers-status.js +71 -0
- package/dist/server/voice-providers-status.js.map +1 -0
- package/dist/sharing/access.d.ts.map +1 -1
- package/dist/sharing/access.js +16 -13
- package/dist/sharing/access.js.map +1 -1
- package/dist/sharing/actions/share-resource.d.ts +1 -0
- package/dist/sharing/actions/share-resource.d.ts.map +1 -1
- package/dist/sharing/actions/share-resource.js +45 -0
- package/dist/sharing/actions/share-resource.js.map +1 -1
- package/dist/templates/default/.agents/skills/delegate-to-agent/SKILL.md +54 -0
- package/dist/templates/default/app/root.tsx +1 -1
- package/dist/templates/default/app/routes/_index.tsx +6 -1
- package/dist/templates/default/public/favicon.svg +13 -0
- package/dist/templates/default/public/icon-180.svg +12 -3
- package/dist/templates/default/public/icon-192.svg +12 -3
- package/dist/templates/default/public/icon-512.svg +12 -3
- package/dist/templates/workspace-core/package.json +22 -4
- package/dist/templates/workspace-core/src/credentials.ts +32 -5
- package/dist/templates/workspace-core/tsconfig.json +4 -1
- package/dist/terminal/pty-server.d.ts.map +1 -1
- package/dist/terminal/pty-server.js +7 -1
- package/dist/terminal/pty-server.js.map +1 -1
- package/dist/terminal/terminal-plugin.js +3 -3
- package/dist/terminal/terminal-plugin.js.map +1 -1
- package/dist/tools/actions.d.ts.map +1 -1
- package/dist/tools/actions.js +130 -0
- package/dist/tools/actions.js.map +1 -1
- package/dist/tools/fetch-tool.d.ts +1 -0
- package/dist/tools/fetch-tool.d.ts.map +1 -1
- package/dist/tools/fetch-tool.js +38 -16
- package/dist/tools/fetch-tool.js.map +1 -1
- package/dist/tools/html-shell.d.ts +43 -1
- package/dist/tools/html-shell.d.ts.map +1 -1
- package/dist/tools/html-shell.js +102 -4
- package/dist/tools/html-shell.js.map +1 -1
- package/dist/tools/proxy-security.d.ts +12 -0
- package/dist/tools/proxy-security.d.ts.map +1 -0
- package/dist/tools/proxy-security.js +158 -0
- package/dist/tools/proxy-security.js.map +1 -0
- package/dist/tools/routes.d.ts.map +1 -1
- package/dist/tools/routes.js +158 -105
- package/dist/tools/routes.js.map +1 -1
- package/dist/tools/schema.d.ts +3 -0
- package/dist/tools/schema.d.ts.map +1 -1
- package/dist/tools/schema.js +3 -0
- package/dist/tools/schema.js.map +1 -1
- package/dist/tools/slots/routes.d.ts +15 -0
- package/dist/tools/slots/routes.d.ts.map +1 -0
- package/dist/tools/slots/routes.js +94 -0
- package/dist/tools/slots/routes.js.map +1 -0
- package/dist/tools/slots/schema.d.ts +303 -0
- package/dist/tools/slots/schema.d.ts.map +1 -0
- package/dist/tools/slots/schema.js +76 -0
- package/dist/tools/slots/schema.js.map +1 -0
- package/dist/tools/slots/store.d.ts +66 -0
- package/dist/tools/slots/store.d.ts.map +1 -0
- package/dist/tools/slots/store.js +227 -0
- package/dist/tools/slots/store.js.map +1 -0
- package/dist/tools/store.d.ts.map +1 -1
- package/dist/tools/store.js +28 -37
- package/dist/tools/store.js.map +1 -1
- package/dist/tools/url-safety.d.ts +24 -0
- package/dist/tools/url-safety.d.ts.map +1 -0
- package/dist/tools/url-safety.js +224 -0
- package/dist/tools/url-safety.js.map +1 -0
- package/dist/tracking/providers.d.ts.map +1 -1
- package/dist/tracking/providers.js +28 -11
- package/dist/tracking/providers.js.map +1 -1
- package/dist/tracking/registry.d.ts.map +1 -1
- package/dist/tracking/registry.js +7 -3
- package/dist/tracking/registry.js.map +1 -1
- package/dist/triggers/actions.d.ts.map +1 -1
- package/dist/triggers/actions.js +11 -6
- package/dist/triggers/actions.js.map +1 -1
- package/dist/triggers/condition-evaluator.d.ts +8 -0
- package/dist/triggers/condition-evaluator.d.ts.map +1 -1
- package/dist/triggers/condition-evaluator.js +39 -4
- package/dist/triggers/condition-evaluator.js.map +1 -1
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +67 -4
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +8 -5
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/dist/vite/client.d.ts +2 -0
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +216 -4
- package/dist/vite/client.js.map +1 -1
- package/docs/content/authentication.md +27 -12
- package/docs/content/drop-in-agent.md +2 -2
- package/docs/content/messaging.md +195 -155
- package/docs/content/onboarding.md +82 -12
- package/docs/content/template-analytics.md +65 -59
- package/docs/content/template-clips.md +7 -9
- package/docs/content/template-design.md +55 -0
- package/docs/content/template-dispatch.md +13 -0
- package/docs/content/template-forms.md +7 -6
- package/docs/content/template-mail.md +78 -80
- package/package.json +2 -1
- package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +54 -0
- package/src/templates/default/app/root.tsx +1 -1
- package/src/templates/default/app/routes/_index.tsx +6 -1
- package/src/templates/default/public/favicon.svg +13 -0
- package/src/templates/default/public/icon-180.svg +12 -3
- package/src/templates/default/public/icon-192.svg +12 -3
- package/src/templates/default/public/icon-512.svg +12 -3
- package/src/templates/workspace-core/package.json +22 -4
- package/src/templates/workspace-core/src/credentials.ts +32 -5
- package/src/templates/workspace-core/tsconfig.json +4 -1
|
@@ -5,10 +5,12 @@ import { createPollHandler } from "./poll.js";
|
|
|
5
5
|
import { createSSEHandler } from "./sse.js";
|
|
6
6
|
import { upsertEnvFile } from "./create-server.js";
|
|
7
7
|
import { readBody } from "./h3-helpers.js";
|
|
8
|
-
import { BUILDER_ENV_KEYS, BUILDER_STATE_PARAM, buildBuilderCliAuthUrl, createBuilderBrowserCallbackPage, getBuilderBrowserStatusForEvent, resolveSafePreviewUrl, runBuilderAgent, signBuilderCallbackState, verifyBuilderCallbackState, } from "./builder-browser.js";
|
|
8
|
+
import { BUILDER_ENV_KEYS, BUILDER_STATE_PARAM, buildBuilderCliAuthUrl, createBuilderBrowserCallbackErrorPage, createBuilderBrowserCallbackPage, getBuilderBrowserStatusForEvent, resolveSafePreviewUrl, runBuilderAgent, signBuilderCallbackState, verifyBuilderCallbackState, } from "./builder-browser.js";
|
|
9
9
|
import { getState, putState, deleteState, listComposeDrafts, getComposeDraft, putComposeDraft, deleteComposeDraft, deleteAllComposeDrafts, } from "../application-state/handlers.js";
|
|
10
10
|
import { getSetting, putSetting, deleteSetting } from "../settings/store.js";
|
|
11
|
-
import {
|
|
11
|
+
import { getUserSetting, putUserSetting, deleteUserSetting, } from "../settings/user-settings.js";
|
|
12
|
+
import { getSession, isDevEnvironment, DEV_MODE_USER_EMAIL } from "./auth.js";
|
|
13
|
+
import { isLocalDatabase } from "../db/client.js";
|
|
12
14
|
import { getOrigin } from "./google-oauth.js";
|
|
13
15
|
import { findWorkspaceRoot } from "../scripts/utils.js";
|
|
14
16
|
import { listOnboardingSteps } from "../onboarding/registry.js";
|
|
@@ -21,14 +23,63 @@ import { registerBuiltinNotificationChannels } from "../notifications/channels.j
|
|
|
21
23
|
import { createNotificationsHandler } from "../notifications/routes.js";
|
|
22
24
|
import { createProgressHandler } from "../progress/routes.js";
|
|
23
25
|
import { createTranscribeVoiceHandler } from "./transcribe-voice.js";
|
|
26
|
+
import { runWithRequestContext } from "./request-context.js";
|
|
27
|
+
import { createVoiceProvidersStatusHandler } from "./voice-providers-status.js";
|
|
24
28
|
import { PROVIDER_ENV_META } from "../agent/engine/provider-env-vars.js";
|
|
25
|
-
import { isAgentEngineSettingConfigured, getAgentEngineEntry, detectEngineFromEnv, isStoredEngineUsable, } from "../agent/engine/registry.js";
|
|
29
|
+
import { isAgentEngineSettingConfigured, getAgentEngineEntry, detectEngineFromEnv, detectEngineFromUserSecrets, isStoredEngineUsable, } from "../agent/engine/registry.js";
|
|
26
30
|
/**
|
|
27
31
|
* The base path prefix for all framework-level routes.
|
|
28
32
|
* All agent-native core routes live under this namespace to avoid
|
|
29
33
|
* collisions with template-specific `/api/*` routes.
|
|
30
34
|
*/
|
|
31
35
|
export const FRAMEWORK_ROUTE_PREFIX = "/_agent-native";
|
|
36
|
+
/**
|
|
37
|
+
* Whether deployment-wide `process.env` writes (and rehydration from the
|
|
38
|
+
* unscoped `persisted-env-vars` settings row) are safe on this deployment.
|
|
39
|
+
*
|
|
40
|
+
* Allowed only when:
|
|
41
|
+
* - we're running against a local SQLite-only database in a development
|
|
42
|
+
* environment (no shared-tenant exposure), OR
|
|
43
|
+
* - the operator has explicitly opted in via
|
|
44
|
+
* `AGENT_NATIVE_ALLOW_ENV_VAR_WRITES=1` (single-tenant self-hosted).
|
|
45
|
+
*
|
|
46
|
+
* On any hosted multi-tenant deploy this returns false: env vars are
|
|
47
|
+
* deployment-wide globals and one tenant could otherwise overwrite Stripe /
|
|
48
|
+
* OpenAI / Sentry keys for every other tenant. Per-org credentials must use
|
|
49
|
+
* the per-user/org `app_secrets` store via `saveCredential()` instead.
|
|
50
|
+
*/
|
|
51
|
+
function isEnvVarWriteAllowed() {
|
|
52
|
+
if (process.env.AGENT_NATIVE_ALLOW_ENV_VAR_WRITES === "1")
|
|
53
|
+
return true;
|
|
54
|
+
return isDevEnvironment() && isLocalDatabase();
|
|
55
|
+
}
|
|
56
|
+
function normalizeAppBasePath(value) {
|
|
57
|
+
if (!value || value === "/")
|
|
58
|
+
return "";
|
|
59
|
+
const trimmed = value.trim();
|
|
60
|
+
if (!trimmed || trimmed === "/")
|
|
61
|
+
return "";
|
|
62
|
+
return `/${trimmed.replace(/^\/+/, "").replace(/\/+$/, "")}`;
|
|
63
|
+
}
|
|
64
|
+
function stripAppBasePath(pathname) {
|
|
65
|
+
const basePath = normalizeAppBasePath(process.env.VITE_APP_BASE_PATH || process.env.APP_BASE_PATH);
|
|
66
|
+
if (!basePath)
|
|
67
|
+
return pathname;
|
|
68
|
+
if (pathname === basePath)
|
|
69
|
+
return "/";
|
|
70
|
+
if (pathname.startsWith(`${basePath}/`)) {
|
|
71
|
+
return pathname.slice(basePath.length) || "/";
|
|
72
|
+
}
|
|
73
|
+
return pathname;
|
|
74
|
+
}
|
|
75
|
+
function redactValues(text, values) {
|
|
76
|
+
let out = text;
|
|
77
|
+
for (const value of values) {
|
|
78
|
+
if (value)
|
|
79
|
+
out = out.split(value).join("[redacted]");
|
|
80
|
+
}
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
32
83
|
/**
|
|
33
84
|
* Creates a Nitro plugin that mounts all standard agent-native framework routes.
|
|
34
85
|
*
|
|
@@ -60,24 +111,27 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
60
111
|
// store. Only set keys that are currently empty so explicit env
|
|
61
112
|
// vars (Netlify dashboard, process-level) always win.
|
|
62
113
|
//
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
//
|
|
69
|
-
//
|
|
114
|
+
// GATED: only rehydrate into `process.env` on local-dev SQLite (or
|
|
115
|
+
// with the explicit single-tenant opt-in). On a shared-DB hosted
|
|
116
|
+
// multi-tenant deploy the `persisted-env-vars` row is deployment-wide
|
|
117
|
+
// global state — pushing user-supplied values into `process.env` from
|
|
118
|
+
// it would let any one tenant's writes (or a stale dev seed) leak
|
|
119
|
+
// into every other tenant's process. The opt-out scrub of legacy
|
|
120
|
+
// BUILDER_* values still runs unconditionally so existing rows on
|
|
121
|
+
// multi-tenant deploys self-heal, but new env-var writes never land
|
|
122
|
+
// in `process.env` outside the allowed contexts.
|
|
70
123
|
try {
|
|
71
124
|
const persisted = (await getSetting("persisted-env-vars"));
|
|
72
125
|
if (persisted) {
|
|
73
126
|
const builderKeys = new Set(BUILDER_ENV_KEYS);
|
|
127
|
+
const writesAllowed = isEnvVarWriteAllowed();
|
|
74
128
|
let scrubbed = 0;
|
|
75
129
|
for (const [k, v] of Object.entries(persisted)) {
|
|
76
130
|
if (builderKeys.has(k)) {
|
|
77
131
|
scrubbed++;
|
|
78
132
|
continue;
|
|
79
133
|
}
|
|
80
|
-
if (typeof v === "string" && !process.env[k]) {
|
|
134
|
+
if (writesAllowed && typeof v === "string" && !process.env[k]) {
|
|
81
135
|
process.env[k] = v;
|
|
82
136
|
}
|
|
83
137
|
}
|
|
@@ -136,6 +190,12 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
136
190
|
// Observability module not available — skip
|
|
137
191
|
}
|
|
138
192
|
const P = FRAMEWORK_ROUTE_PREFIX;
|
|
193
|
+
// Security response headers — emitted on every framework response.
|
|
194
|
+
// Mounted before route handlers so 4xx/5xx error pages also carry the
|
|
195
|
+
// headers. Routes that need to relax a specific header (e.g. the tools
|
|
196
|
+
// /render route allowing same-origin framing) override via setResponseHeader.
|
|
197
|
+
const { createSecurityHeadersMiddleware } = await import("./security-headers.js");
|
|
198
|
+
getH3App(nitroApp).use(createSecurityHeadersMiddleware());
|
|
139
199
|
// CORS for framework routes. Desktop tray apps (Tauri/Electron) run on
|
|
140
200
|
// their own dev origin (e.g. localhost:1420) and make credentialed
|
|
141
201
|
// requests against the template's server at a different port. We echo
|
|
@@ -145,32 +205,81 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
145
205
|
.split(",")
|
|
146
206
|
.map((s) => s.trim())
|
|
147
207
|
.filter(Boolean);
|
|
208
|
+
const isProduction = process.env.NODE_ENV === "production";
|
|
209
|
+
const LOCALHOST_RE = /^https?:\/\/(localhost|127\.0\.0\.1|tauri\.localhost)(:\d+)?$/;
|
|
148
210
|
getH3App(nitroApp).use(defineEventHandler((event) => {
|
|
149
|
-
const
|
|
150
|
-
|
|
211
|
+
const pathname = stripAppBasePath(event.url?.pathname ??
|
|
212
|
+
String(event.node?.req?.url ?? event.path ?? "/").split("?")[0]);
|
|
213
|
+
if (!pathname.startsWith(P) && !pathname.startsWith("/api/"))
|
|
151
214
|
return;
|
|
152
215
|
const reqHeaders = (event.node?.req?.headers ?? {});
|
|
153
216
|
const originRaw = reqHeaders["origin"];
|
|
154
217
|
const origin = Array.isArray(originRaw) ? originRaw[0] : originRaw;
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
218
|
+
const method = getMethod(event);
|
|
219
|
+
// Decide whether this origin is allowed. We never fall back to the
|
|
220
|
+
// first allowlist entry — that previously echoed `Access-Control-
|
|
221
|
+
// Allow-Origin: <unrelated-allowed-origin>` for disallowed callers,
|
|
222
|
+
// which is permissive enough that some clients followed through.
|
|
223
|
+
let allowedOrigin = null;
|
|
224
|
+
if (origin) {
|
|
225
|
+
if (allowlist.length > 0) {
|
|
226
|
+
if (allowlist.includes(origin))
|
|
227
|
+
allowedOrigin = origin;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
// No allowlist configured. In production we only allow
|
|
231
|
+
// localhost-style origins (desktop tray dev usage); in dev we
|
|
232
|
+
// allow any origin echo. This prevents a fresh deploy without
|
|
233
|
+
// CORS_ALLOWED_ORIGINS from accepting credentialed requests
|
|
234
|
+
// from any origin.
|
|
235
|
+
if (isProduction) {
|
|
236
|
+
if (LOCALHOST_RE.test(origin))
|
|
237
|
+
allowedOrigin = origin;
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
if (LOCALHOST_RE.test(origin))
|
|
241
|
+
allowedOrigin = origin;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Reject preflights from disallowed cross-origin callers BEFORE
|
|
246
|
+
// returning 204. Previously the OPTIONS short-circuit returned 204
|
|
247
|
+
// with no ACAO header, which the browser then treats as a CORS
|
|
248
|
+
// failure — but also short-circuited any further checks. Now we
|
|
249
|
+
// explicitly 403 disallowed cross-origin preflights.
|
|
250
|
+
if (method === "OPTIONS") {
|
|
251
|
+
if (origin && !allowedOrigin) {
|
|
252
|
+
setResponseStatus(event, 403);
|
|
253
|
+
return "";
|
|
254
|
+
}
|
|
255
|
+
if (allowedOrigin) {
|
|
256
|
+
setResponseHeader(event, "Access-Control-Allow-Origin", allowedOrigin);
|
|
257
|
+
setResponseHeader(event, "Vary", "Origin");
|
|
258
|
+
setResponseHeader(event, "Access-Control-Allow-Credentials", "true");
|
|
259
|
+
setResponseHeader(event, "Access-Control-Allow-Methods", "GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS");
|
|
260
|
+
setResponseHeader(event, "Access-Control-Allow-Headers", "Content-Type,Authorization,X-Requested-With,X-Request-Source,X-Agent-Native-CSRF");
|
|
261
|
+
}
|
|
170
262
|
setResponseStatus(event, 204);
|
|
171
263
|
return "";
|
|
172
264
|
}
|
|
265
|
+
// Non-preflight requests: only set CORS response headers when we
|
|
266
|
+
// have an allowed origin. Same-origin / no-origin requests fall
|
|
267
|
+
// through without explicit CORS headers (browser treats them as
|
|
268
|
+
// same-origin by default).
|
|
269
|
+
if (!allowedOrigin)
|
|
270
|
+
return;
|
|
271
|
+
setResponseHeader(event, "Access-Control-Allow-Origin", allowedOrigin);
|
|
272
|
+
setResponseHeader(event, "Vary", "Origin");
|
|
273
|
+
setResponseHeader(event, "Access-Control-Allow-Credentials", "true");
|
|
274
|
+
setResponseHeader(event, "Access-Control-Allow-Methods", "GET,HEAD,POST,PUT,PATCH,DELETE,OPTIONS");
|
|
275
|
+
setResponseHeader(event, "Access-Control-Allow-Headers", "Content-Type,Authorization,X-Requested-With,X-Request-Source,X-Agent-Native-CSRF");
|
|
173
276
|
}));
|
|
277
|
+
// Defense-in-depth CSRF check for state-changing /_agent-native/* routes.
|
|
278
|
+
// Mounted AFTER the CORS layer so disallowed-origin OPTIONS preflights
|
|
279
|
+
// 403 first (rather than being rejected on a stale cookie heuristic).
|
|
280
|
+
// See `csrf.ts` for the threat model and allowlist.
|
|
281
|
+
const { createCsrfMiddleware } = await import("./csrf.js");
|
|
282
|
+
getH3App(nitroApp).use(createCsrfMiddleware(P));
|
|
174
283
|
// Polling
|
|
175
284
|
getH3App(nitroApp).use(`${P}/poll`, createPollHandler());
|
|
176
285
|
// SSE
|
|
@@ -186,29 +295,89 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
186
295
|
}
|
|
187
296
|
getH3App(nitroApp).use(`${P}/builder/status`, defineEventHandler(async (event) => {
|
|
188
297
|
const envStatus = getBuilderBrowserStatusForEvent(event);
|
|
189
|
-
//
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
298
|
+
// Read session once so we can establish per-user request context for
|
|
299
|
+
// credential resolution. Without this, resolveBuilderCredentials()
|
|
300
|
+
// calls getRequestUserEmail() on an empty AsyncLocalStorage store and
|
|
301
|
+
// falls through to process.env — causing the connection state to
|
|
302
|
+
// flicker between requests depending on stale env values.
|
|
303
|
+
const session = await getSession(event).catch(() => null);
|
|
304
|
+
const userEmail = session?.email;
|
|
305
|
+
return runWithRequestContext({ userEmail }, async () => {
|
|
306
|
+
// Check per-user credentials first (stored in app_secrets).
|
|
307
|
+
try {
|
|
308
|
+
const { resolveBuilderCredentials } = await import("./credential-provider.js");
|
|
309
|
+
const creds = await resolveBuilderCredentials();
|
|
310
|
+
if (creds.privateKey) {
|
|
311
|
+
return {
|
|
312
|
+
...envStatus,
|
|
313
|
+
configured: true,
|
|
314
|
+
privateKeyConfigured: true,
|
|
315
|
+
publicKeyConfigured: !!creds.publicKey,
|
|
316
|
+
userId: creds.userId || envStatus.userId,
|
|
317
|
+
orgName: creds.orgName || envStatus.orgName,
|
|
318
|
+
orgKind: creds.orgKind || envStatus.orgKind,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
203
321
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
322
|
+
catch {
|
|
323
|
+
// Secrets table not ready — fall through to env status
|
|
324
|
+
}
|
|
325
|
+
// Surface a recent OAuth callback failure so the parent's polling
|
|
326
|
+
// stops with a clear message instead of timing out at 5min. The
|
|
327
|
+
// callback handler writes a `builder-connect-error:<email>` row
|
|
328
|
+
// when `writeBuilderCredentials` throws; this read self-clears so
|
|
329
|
+
// the message only fires once.
|
|
330
|
+
try {
|
|
331
|
+
if (userEmail) {
|
|
332
|
+
const errKey = `builder-connect-error:${userEmail}`;
|
|
333
|
+
const errRow = await getSetting(errKey);
|
|
334
|
+
if (errRow && typeof errRow.message === "string") {
|
|
335
|
+
await deleteSetting(errKey).catch(() => { });
|
|
336
|
+
return {
|
|
337
|
+
...envStatus,
|
|
338
|
+
configured: false,
|
|
339
|
+
privateKeyConfigured: false,
|
|
340
|
+
publicKeyConfigured: false,
|
|
341
|
+
userId: undefined,
|
|
342
|
+
orgName: undefined,
|
|
343
|
+
orgKind: undefined,
|
|
344
|
+
connectError: {
|
|
345
|
+
message: errRow.message,
|
|
346
|
+
at: typeof errRow.at === "number"
|
|
347
|
+
? errRow.at
|
|
348
|
+
: Date.now(),
|
|
349
|
+
},
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
// settings store unavailable — fall through to legacy/env status
|
|
356
|
+
}
|
|
357
|
+
// Honor legacy disconnect flag for existing deployments.
|
|
358
|
+
try {
|
|
359
|
+
const disconnected = await getSetting("builder-disconnected");
|
|
360
|
+
if (disconnected) {
|
|
361
|
+
return {
|
|
362
|
+
...envStatus,
|
|
363
|
+
configured: false,
|
|
364
|
+
privateKeyConfigured: false,
|
|
365
|
+
publicKeyConfigured: false,
|
|
366
|
+
userId: undefined,
|
|
367
|
+
orgName: undefined,
|
|
368
|
+
orgKind: undefined,
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
catch {
|
|
373
|
+
// DB not reachable — fall back to env-only status.
|
|
374
|
+
}
|
|
375
|
+
// For authenticated non-local users who have no per-user credentials,
|
|
376
|
+
// explicitly return not-configured rather than deploy-level env keys.
|
|
377
|
+
// This is consistent with resolveBuilderCredential()'s design which
|
|
378
|
+
// refuses the env fallback for authenticated users to prevent
|
|
379
|
+
// cross-tenant credential leakage in shared-DB deployments.
|
|
380
|
+
if (userEmail && userEmail !== DEV_MODE_USER_EMAIL) {
|
|
212
381
|
return {
|
|
213
382
|
...envStatus,
|
|
214
383
|
configured: false,
|
|
@@ -219,11 +388,8 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
219
388
|
orgKind: undefined,
|
|
220
389
|
};
|
|
221
390
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
// DB not reachable — fall back to env-only status.
|
|
225
|
-
}
|
|
226
|
-
return envStatus;
|
|
391
|
+
return envStatus;
|
|
392
|
+
});
|
|
227
393
|
}));
|
|
228
394
|
// Lightweight 302 to the Builder CLI-auth URL. Lets clients do
|
|
229
395
|
// `window.open('/_agent-native/builder/connect', '_blank')` synchronously
|
|
@@ -269,7 +435,7 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
269
435
|
// caller isn't a named user we should spend a Builder private key
|
|
270
436
|
// on. Allow it only when the environment explicitly opts into
|
|
271
437
|
// local mode (dev, tests, or AUTH_MODE=local).
|
|
272
|
-
if (session.email ===
|
|
438
|
+
if (session.email === DEV_MODE_USER_EMAIL &&
|
|
273
439
|
process.env.NODE_ENV === "production" &&
|
|
274
440
|
process.env.AUTH_MODE !== "local") {
|
|
275
441
|
setResponseStatus(event, 401);
|
|
@@ -334,6 +500,15 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
334
500
|
// Store per-user in app_secrets so each user's Builder connection
|
|
335
501
|
// is independent. No more shared env vars that the last connector
|
|
336
502
|
// overwrites.
|
|
503
|
+
//
|
|
504
|
+
// Failure handling: a silent catch here (returning the success page
|
|
505
|
+
// anyway) was Midhun's bug on 2026-04-28 — popup said "yay", parent
|
|
506
|
+
// window polled `/builder/status` for 5 minutes seeing
|
|
507
|
+
// configured:false, never got a real error. Now we surface the
|
|
508
|
+
// failure two ways: (a) a settings row that the next /builder/status
|
|
509
|
+
// poll picks up, and (b) postMessage from the error page itself,
|
|
510
|
+
// wired into the popup HTML, so the parent stops polling immediately.
|
|
511
|
+
let writeError = null;
|
|
337
512
|
try {
|
|
338
513
|
const { writeBuilderCredentials } = await import("./credential-provider.js");
|
|
339
514
|
await writeBuilderCredentials(session.email, {
|
|
@@ -345,15 +520,40 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
345
520
|
});
|
|
346
521
|
}
|
|
347
522
|
catch (err) {
|
|
348
|
-
|
|
523
|
+
writeError = err?.message ?? String(err);
|
|
524
|
+
console.error("[builder] Failed to persist per-user credentials:", writeError);
|
|
349
525
|
}
|
|
350
|
-
|
|
526
|
+
if (writeError) {
|
|
527
|
+
// Best-effort signal to /builder/status. If putSetting also fails
|
|
528
|
+
// (entire DB unreachable) the popup's postMessage still notifies
|
|
529
|
+
// the parent. If both fail the parent times out at 5min as today.
|
|
530
|
+
try {
|
|
531
|
+
await putSetting(`builder-connect-error:${session.email}`, {
|
|
532
|
+
message: writeError,
|
|
533
|
+
at: Date.now(),
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
catch (settingsErr) {
|
|
537
|
+
console.error("[builder] Couldn't even record connect-error to settings:", settingsErr?.message ?? settingsErr);
|
|
538
|
+
}
|
|
539
|
+
setResponseStatus(event, 500);
|
|
540
|
+
setResponseHeader(event, "Content-Type", "text/html; charset=utf-8");
|
|
541
|
+
return createBuilderBrowserCallbackErrorPage(writeError);
|
|
542
|
+
}
|
|
543
|
+
// Clear any legacy disconnect flag and any prior connect-error row
|
|
544
|
+
// (so a successful retry doesn't surface the previous failure).
|
|
351
545
|
try {
|
|
352
546
|
await deleteSetting("builder-disconnected");
|
|
353
547
|
}
|
|
354
548
|
catch {
|
|
355
549
|
// DB not ready — proceed
|
|
356
550
|
}
|
|
551
|
+
try {
|
|
552
|
+
await deleteSetting(`builder-connect-error:${session.email}`);
|
|
553
|
+
}
|
|
554
|
+
catch {
|
|
555
|
+
// No prior error row — fine
|
|
556
|
+
}
|
|
357
557
|
const previewUrl = resolveSafePreviewUrl(requestUrl.searchParams.get("preview-url"), event);
|
|
358
558
|
setResponseHeader(event, "Content-Type", "text/html; charset=utf-8");
|
|
359
559
|
return createBuilderBrowserCallbackPage(previewUrl);
|
|
@@ -395,47 +595,56 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
395
595
|
setResponseStatus(event, 405);
|
|
396
596
|
return { error: "Method not allowed" };
|
|
397
597
|
}
|
|
398
|
-
const
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
return {
|
|
403
|
-
error: "Builder not connected. Connect Builder in Setup to use background agent.",
|
|
404
|
-
};
|
|
405
|
-
}
|
|
406
|
-
const body = (await readBody(event));
|
|
407
|
-
if (!body?.userMessage) {
|
|
408
|
-
setResponseStatus(event, 400);
|
|
409
|
-
return { error: "userMessage is required" };
|
|
598
|
+
const session = await getSession(event).catch(() => null);
|
|
599
|
+
if (!session?.email) {
|
|
600
|
+
setResponseStatus(event, 401);
|
|
601
|
+
return { error: "unauthorized" };
|
|
410
602
|
}
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
const
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
603
|
+
return runWithRequestContext({ userEmail: session.email, orgId: session.orgId ?? undefined }, async () => {
|
|
604
|
+
const { resolveBuilderCredentials: resolveCreds } = await import("./credential-provider.js");
|
|
605
|
+
const creds = await resolveCreds();
|
|
606
|
+
if (!creds.privateKey || !creds.publicKey) {
|
|
607
|
+
setResponseStatus(event, 400);
|
|
608
|
+
return {
|
|
609
|
+
error: "Builder not connected. Connect Builder in Setup to use background agent.",
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
const body = (await readBody(event));
|
|
613
|
+
if (!body?.userMessage) {
|
|
614
|
+
setResponseStatus(event, 400);
|
|
615
|
+
return { error: "userMessage is required" };
|
|
616
|
+
}
|
|
617
|
+
const apiHost = process.env.BUILDER_API_HOST || "https://ai-services.builder.io";
|
|
618
|
+
try {
|
|
619
|
+
const res = await fetch(`${apiHost}/agents/run?apiKey=${encodeURIComponent(creds.publicKey)}`, {
|
|
620
|
+
method: "POST",
|
|
621
|
+
headers: {
|
|
622
|
+
"Content-Type": "application/json",
|
|
623
|
+
Authorization: `Bearer ${creds.privateKey}`,
|
|
422
624
|
},
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
625
|
+
body: JSON.stringify({
|
|
626
|
+
userMessage: {
|
|
627
|
+
userPrompt: body.userMessage,
|
|
628
|
+
},
|
|
629
|
+
branchName: body.branchName,
|
|
630
|
+
}),
|
|
631
|
+
});
|
|
632
|
+
if (!res.ok) {
|
|
633
|
+
const err = await res.text().catch(() => "Unknown error");
|
|
634
|
+
setResponseStatus(event, res.status);
|
|
635
|
+
return {
|
|
636
|
+
error: redactValues(err, [creds.privateKey, creds.publicKey]),
|
|
637
|
+
};
|
|
638
|
+
}
|
|
639
|
+
return await res.json();
|
|
430
640
|
}
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
}
|
|
641
|
+
catch (err) {
|
|
642
|
+
setResponseStatus(event, 500);
|
|
643
|
+
return {
|
|
644
|
+
error: redactValues(err?.message || "Failed to reach Builder agents-run API", [creds.privateKey, creds.publicKey]),
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
});
|
|
439
648
|
}));
|
|
440
649
|
// Env key management — framework keys are always included
|
|
441
650
|
const frameworkEnvKeys = [
|
|
@@ -476,12 +685,25 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
476
685
|
label: cfg.label,
|
|
477
686
|
required: cfg.required ?? false,
|
|
478
687
|
configured: !!process.env[cfg.key],
|
|
688
|
+
...(cfg.helpText ? { helpText: cfg.helpText } : {}),
|
|
479
689
|
}))));
|
|
480
690
|
getH3App(nitroApp).use(`${P}/env-vars`, defineEventHandler(async (event) => {
|
|
481
691
|
if (getMethod(event) !== "POST") {
|
|
482
692
|
setResponseStatus(event, 405);
|
|
483
693
|
return { error: "Method not allowed" };
|
|
484
694
|
}
|
|
695
|
+
// Env vars are deployment-wide globals, not per-tenant. On any
|
|
696
|
+
// shared-DB multi-tenant deploy, allowing authenticated users to
|
|
697
|
+
// write here lets one tenant overwrite Stripe / OpenAI / Sentry
|
|
698
|
+
// keys for every other tenant. Disable the endpoint outside of
|
|
699
|
+
// local-dev SQLite or an explicit single-tenant opt-in, and
|
|
700
|
+
// direct callers to the per-org credential store instead.
|
|
701
|
+
if (!isEnvVarWriteAllowed()) {
|
|
702
|
+
setResponseStatus(event, 403);
|
|
703
|
+
return {
|
|
704
|
+
error: "env-vars endpoint disabled on multi-tenant deployments. Use saveCredential(key, value, { userEmail, orgId, scope: 'org' }) to store per-org credentials.",
|
|
705
|
+
};
|
|
706
|
+
}
|
|
485
707
|
const body = await readBody(event);
|
|
486
708
|
const { vars } = body;
|
|
487
709
|
if (!Array.isArray(vars) || vars.length === 0) {
|
|
@@ -566,6 +788,19 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
566
788
|
};
|
|
567
789
|
}
|
|
568
790
|
}
|
|
791
|
+
// Per-user app_secrets — a user who connected Builder (or pasted
|
|
792
|
+
// their own provider key) may not have any deploy-level env vars
|
|
793
|
+
// set, so check their per-user secret store before reporting "no
|
|
794
|
+
// engine configured" and re-showing the onboarding gate.
|
|
795
|
+
const detectedFromUser = await detectEngineFromUserSecrets();
|
|
796
|
+
if (detectedFromUser) {
|
|
797
|
+
return {
|
|
798
|
+
configured: true,
|
|
799
|
+
engine: detectedFromUser.name,
|
|
800
|
+
source: "app_secrets",
|
|
801
|
+
envVar: detectedFromUser.requiredEnvVars[0],
|
|
802
|
+
};
|
|
803
|
+
}
|
|
569
804
|
const detected = detectEngineFromEnv();
|
|
570
805
|
if (detected) {
|
|
571
806
|
return {
|
|
@@ -625,19 +860,45 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
625
860
|
// ─── File upload primitive ──────────────────────────────────────
|
|
626
861
|
// GET /_agent-native/file-upload/status — report active provider
|
|
627
862
|
// POST /_agent-native/file-upload — upload a file, return { url }
|
|
628
|
-
getH3App(nitroApp).use(`${P}/file-upload/status`, defineEventHandler(async () => {
|
|
863
|
+
getH3App(nitroApp).use(`${P}/file-upload/status`, defineEventHandler(async (event) => {
|
|
629
864
|
const active = getActiveFileUploadProvider();
|
|
865
|
+
// resolveBuilderPrivateKey() reads per-user credentials from app_secrets
|
|
866
|
+
// (DB), which requires request context (AsyncLocalStorage) to know which
|
|
867
|
+
// user to scope by. Without runWithRequestContext() the ALS store is empty
|
|
868
|
+
// and it falls back to process.env only — missing OAuth-connected users.
|
|
869
|
+
const session = await getSession(event).catch(() => null);
|
|
870
|
+
const userEmail = session?.email;
|
|
630
871
|
let builderConfigured = !!process.env.BUILDER_PRIVATE_KEY;
|
|
631
872
|
try {
|
|
632
873
|
const { resolveBuilderPrivateKey } = await import("./credential-provider.js");
|
|
633
|
-
|
|
874
|
+
const resolve = () => resolveBuilderPrivateKey().then((k) => !!k);
|
|
875
|
+
builderConfigured = userEmail
|
|
876
|
+
? await runWithRequestContext({ userEmail }, resolve)
|
|
877
|
+
: await resolve();
|
|
634
878
|
}
|
|
635
879
|
catch {
|
|
636
880
|
// fall back to env check above
|
|
637
881
|
}
|
|
882
|
+
// When the builder builtin is selected via env var, its sync
|
|
883
|
+
// isConfigured() doesn't reflect per-user OAuth credentials. Use the
|
|
884
|
+
// async builderConfigured check so the status accurately represents
|
|
885
|
+
// whether this specific user can actually upload (thread 7 fix).
|
|
886
|
+
const isBuilderEnvActive = active?.id === "builder";
|
|
887
|
+
const configured = isBuilderEnvActive
|
|
888
|
+
? builderConfigured
|
|
889
|
+
: !!active || builderConfigured;
|
|
890
|
+
const activeProvider = isBuilderEnvActive
|
|
891
|
+
? builderConfigured
|
|
892
|
+
? { id: "builder", name: "Builder.io" }
|
|
893
|
+
: null
|
|
894
|
+
: active
|
|
895
|
+
? { id: active.id, name: active.name }
|
|
896
|
+
: builderConfigured
|
|
897
|
+
? { id: "builder", name: "Builder.io" }
|
|
898
|
+
: null;
|
|
638
899
|
return {
|
|
639
|
-
configured
|
|
640
|
-
activeProvider
|
|
900
|
+
configured,
|
|
901
|
+
activeProvider,
|
|
641
902
|
providers: listFileUploadProviders().map((p) => ({
|
|
642
903
|
id: p.id,
|
|
643
904
|
name: p.name,
|
|
@@ -658,12 +919,17 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
658
919
|
return { error: "No file uploaded" };
|
|
659
920
|
}
|
|
660
921
|
const session = await getSession(event);
|
|
661
|
-
|
|
922
|
+
if (!session?.email) {
|
|
923
|
+
setResponseStatus(event, 401);
|
|
924
|
+
return { error: "Unauthorized" };
|
|
925
|
+
}
|
|
926
|
+
const userEmail = session.email;
|
|
927
|
+
const result = await runWithRequestContext({ userEmail }, () => uploadFile({
|
|
662
928
|
data: filePart.data,
|
|
663
929
|
filename: filePart.filename,
|
|
664
930
|
mimeType: filePart.type,
|
|
665
|
-
ownerEmail:
|
|
666
|
-
});
|
|
931
|
+
ownerEmail: userEmail,
|
|
932
|
+
}));
|
|
667
933
|
if (result) {
|
|
668
934
|
setResponseStatus(event, 201);
|
|
669
935
|
return result;
|
|
@@ -676,6 +942,10 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
676
942
|
// ─── Voice transcription (Whisper) ───────────────────────────────
|
|
677
943
|
// POST /_agent-native/transcribe-voice — multipart audio → text
|
|
678
944
|
getH3App(nitroApp).use(`${P}/transcribe-voice`, createTranscribeVoiceHandler());
|
|
945
|
+
// ─── Voice provider status ───────────────────────────────────────
|
|
946
|
+
// GET /_agent-native/voice-providers/status — which providers are
|
|
947
|
+
// configured for the current user (powers the Settings UI pills).
|
|
948
|
+
getH3App(nitroApp).use(`${P}/voice-providers/status`, createVoiceProvidersStatusHandler());
|
|
679
949
|
// ─── Ad-hoc secrets (user-created keys) ────────────────────────────
|
|
680
950
|
// Must mount before the generic /secrets handler to avoid shadowing.
|
|
681
951
|
const adHocSecretHandler = createAdHocSecretHandler();
|
|
@@ -722,6 +992,11 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
722
992
|
ensureToolsTables().catch(() => { });
|
|
723
993
|
registerToolsShareable();
|
|
724
994
|
getH3App(nitroApp).use(`${P}/tools`, createToolsHandler());
|
|
995
|
+
// Tool extension-point slots — sub-system of tools.
|
|
996
|
+
const { ensureSlotTables } = await import("../tools/slots/store.js");
|
|
997
|
+
const { createSlotsHandler } = await import("../tools/slots/routes.js");
|
|
998
|
+
ensureSlotTables().catch(() => { });
|
|
999
|
+
getH3App(nitroApp).use(`${P}/slots`, createSlotsHandler());
|
|
725
1000
|
}
|
|
726
1001
|
catch {
|
|
727
1002
|
// Tools module not available — skip
|
|
@@ -739,11 +1014,25 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
739
1014
|
const pathname = (event.url?.pathname || "")
|
|
740
1015
|
.replace(/^\/+/, "")
|
|
741
1016
|
.replace(/\/+$/, "");
|
|
1017
|
+
// Auth check applies to every method. Without this, any anonymous
|
|
1018
|
+
// caller could `POST /fire-test` to emit unowned events that fan
|
|
1019
|
+
// out across every tenant's matching trigger (the dispatcher
|
|
1020
|
+
// short-circuits its owner check when `eventMeta.owner` is
|
|
1021
|
+
// undefined). See audit 12 / fire-test finding.
|
|
1022
|
+
const session = await getSession(event).catch(() => null);
|
|
1023
|
+
if (!session?.email) {
|
|
1024
|
+
setResponseStatus(event, 401);
|
|
1025
|
+
return { error: "Unauthenticated" };
|
|
1026
|
+
}
|
|
742
1027
|
if (pathname === "fire-test" && method === "POST") {
|
|
743
1028
|
try {
|
|
744
1029
|
const { emit } = await import("../event-bus/index.js");
|
|
745
1030
|
const body = (await readBody(event).catch(() => ({})));
|
|
746
|
-
|
|
1031
|
+
// Scope the test event to the current user so only their
|
|
1032
|
+
// automations fire, not those owned by other tenants.
|
|
1033
|
+
emit("test.event.fired", { data: body.data ?? {} }, {
|
|
1034
|
+
owner: session.email,
|
|
1035
|
+
});
|
|
747
1036
|
return { ok: true };
|
|
748
1037
|
}
|
|
749
1038
|
catch (err) {
|
|
@@ -756,8 +1045,7 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
756
1045
|
return { error: "Method not allowed" };
|
|
757
1046
|
}
|
|
758
1047
|
try {
|
|
759
|
-
const
|
|
760
|
-
const owner = session?.email || "local@localhost";
|
|
1048
|
+
const owner = session.email;
|
|
761
1049
|
const { resourceListAllOwners, SHARED_OWNER } = await import("../resources/store.js");
|
|
762
1050
|
const allResources = await resourceListAllOwners("jobs/");
|
|
763
1051
|
const resources = allResources.filter((r) => r.owner === owner || r.owner === SHARED_OWNER);
|
|
@@ -819,6 +1107,47 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
819
1107
|
}));
|
|
820
1108
|
// ─── Application State CRUD ──────────────────────────────────────
|
|
821
1109
|
// Auto-mounted so templates don't need boilerplate route files.
|
|
1110
|
+
// ─── User-scoped settings store ────────────────────────────────────
|
|
1111
|
+
// GET /_agent-native/settings/:key — read current user's value
|
|
1112
|
+
// PUT /_agent-native/settings/:key — write current user's value
|
|
1113
|
+
// DELETE /_agent-native/settings/:key — clear current user's value
|
|
1114
|
+
//
|
|
1115
|
+
// Keys are auto-prefixed with `u:<email>:` so each user gets their
|
|
1116
|
+
// own row — no leakage between sessions sharing the same DB.
|
|
1117
|
+
getH3App(nitroApp).use(`${P}/settings`, defineEventHandler(async (event) => {
|
|
1118
|
+
const rawKey = (event.url?.pathname || "").replace(/^\/+/, "").split("/")[0] || "";
|
|
1119
|
+
const key = rawKey.replace(/[^a-zA-Z0-9_-]/g, "");
|
|
1120
|
+
if (!key) {
|
|
1121
|
+
setResponseStatus(event, 404);
|
|
1122
|
+
return { error: "Settings key required" };
|
|
1123
|
+
}
|
|
1124
|
+
const session = await getSession(event);
|
|
1125
|
+
if (!session?.email) {
|
|
1126
|
+
setResponseStatus(event, 401);
|
|
1127
|
+
return { error: "unauthorized" };
|
|
1128
|
+
}
|
|
1129
|
+
const method = getMethod(event);
|
|
1130
|
+
const requestSource = event.node?.req?.headers?.["x-request-source"] || undefined;
|
|
1131
|
+
if (method === "GET") {
|
|
1132
|
+
const value = await getUserSetting(session.email, key);
|
|
1133
|
+
if (!value) {
|
|
1134
|
+
setResponseStatus(event, 404);
|
|
1135
|
+
return { error: `No setting for ${key}` };
|
|
1136
|
+
}
|
|
1137
|
+
return value;
|
|
1138
|
+
}
|
|
1139
|
+
if (method === "PUT") {
|
|
1140
|
+
const body = await readBody(event);
|
|
1141
|
+
await putUserSetting(session.email, key, body, { requestSource });
|
|
1142
|
+
return body;
|
|
1143
|
+
}
|
|
1144
|
+
if (method === "DELETE") {
|
|
1145
|
+
await deleteUserSetting(session.email, key, { requestSource });
|
|
1146
|
+
return { ok: true };
|
|
1147
|
+
}
|
|
1148
|
+
setResponseStatus(event, 405);
|
|
1149
|
+
return { error: "Method not allowed" };
|
|
1150
|
+
}));
|
|
822
1151
|
// ─── Avatar routes ──────────────────────────────────────────────────
|
|
823
1152
|
// GET /_agent-native/avatar/:email — fetch any user's avatar (public)
|
|
824
1153
|
// PUT /_agent-native/avatar — update current user's avatar (auth required)
|