@agent-native/core 0.7.13 → 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/client.d.ts +44 -1
- package/dist/a2a/client.d.ts.map +1 -1
- package/dist/a2a/client.js +88 -11
- package/dist/a2a/client.js.map +1 -1
- package/dist/a2a/handlers.d.ts +10 -0
- package/dist/a2a/handlers.d.ts.map +1 -1
- package/dist/a2a/handlers.js +417 -67
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/server.d.ts.map +1 -1
- package/dist/a2a/server.js +212 -19
- package/dist/a2a/server.js.map +1 -1
- package/dist/a2a/task-store.d.ts +20 -1
- package/dist/a2a/task-store.d.ts.map +1 -1
- package/dist/a2a/task-store.js +72 -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 +1 -1
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +11 -26
- 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 +3 -0
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +36 -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 +67 -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 +7 -2
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +81 -32
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AgentTaskCard.d.ts.map +1 -1
- package/dist/client/AgentTaskCard.js +5 -2
- package/dist/client/AgentTaskCard.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +2 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +183 -84
- 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/ErrorBoundary.d.ts +1 -3
- package/dist/client/ErrorBoundary.d.ts.map +1 -1
- package/dist/client/ErrorBoundary.js +37 -9
- package/dist/client/ErrorBoundary.js.map +1 -1
- package/dist/client/FeedbackButton.d.ts.map +1 -1
- package/dist/client/FeedbackButton.js +4 -3
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +165 -68
- 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 +11 -0
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +4 -2
- 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/AgentPresenceChip.d.ts +12 -0
- package/dist/client/components/AgentPresenceChip.d.ts.map +1 -0
- package/dist/client/components/AgentPresenceChip.js +42 -0
- package/dist/client/components/AgentPresenceChip.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/components/PresenceBar.d.ts +17 -0
- package/dist/client/components/PresenceBar.d.ts.map +1 -0
- package/dist/client/components/PresenceBar.js +118 -0
- package/dist/client/components/PresenceBar.js.map +1 -0
- package/dist/client/composer/ComposerPlusMenu.d.ts +6 -1
- package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -1
- package/dist/client/composer/ComposerPlusMenu.js +22 -83
- package/dist/client/composer/ComposerPlusMenu.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 +245 -23
- 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/types.d.ts +1 -0
- package/dist/client/composer/types.d.ts.map +1 -1
- 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 +3 -1
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +101 -18
- 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 +7 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +9 -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/RequireActiveOrg.d.ts.map +1 -1
- package/dist/client/org/RequireActiveOrg.js +15 -10
- package/dist/client/org/RequireActiveOrg.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +132 -9
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/org/hooks.d.ts +30 -0
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +67 -1
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +2 -2
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +1 -1
- package/dist/client/org/index.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 +7 -2
- 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 +10 -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 +38 -33
- 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/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +10 -0
- package/dist/client/sse-event-processor.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 +5 -0
- package/dist/client/tools/ToolEditor.d.ts.map +1 -0
- package/dist/client/tools/ToolEditor.js +99 -0
- package/dist/client/tools/ToolEditor.js.map +1 -0
- package/dist/client/tools/ToolViewer.d.ts +5 -0
- package/dist/client/tools/ToolViewer.d.ts.map +1 -0
- package/dist/client/tools/ToolViewer.js +275 -0
- package/dist/client/tools/ToolViewer.js.map +1 -0
- package/dist/client/tools/ToolViewerPage.d.ts +2 -0
- package/dist/client/tools/ToolViewerPage.d.ts.map +1 -0
- package/dist/client/tools/ToolViewerPage.js +24 -0
- package/dist/client/tools/ToolViewerPage.js.map +1 -0
- package/dist/client/tools/ToolsListPage.d.ts +2 -0
- package/dist/client/tools/ToolsListPage.d.ts.map +1 -0
- package/dist/client/tools/ToolsListPage.js +73 -0
- package/dist/client/tools/ToolsListPage.js.map +1 -0
- package/dist/client/tools/ToolsSidebarSection.d.ts +2 -0
- package/dist/client/tools/ToolsSidebarSection.d.ts.map +1 -0
- package/dist/client/tools/ToolsSidebarSection.js +189 -0
- package/dist/client/tools/ToolsSidebarSection.js.map +1 -0
- 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 +8 -0
- package/dist/client/tools/index.d.ts.map +1 -0
- package/dist/client/tools/index.js +8 -0
- package/dist/client/tools/index.js.map +1 -0
- 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 +1 -0
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +31 -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 +9 -8
- 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/agent-identity.d.ts +15 -0
- package/dist/collab/agent-identity.d.ts.map +1 -0
- package/dist/collab/agent-identity.js +14 -0
- package/dist/collab/agent-identity.js.map +1 -0
- package/dist/collab/agent-presence.d.ts +59 -0
- package/dist/collab/agent-presence.d.ts.map +1 -0
- package/dist/collab/agent-presence.js +165 -0
- package/dist/collab/agent-presence.js.map +1 -0
- package/dist/collab/awareness.d.ts +7 -0
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/awareness.js +2 -2
- package/dist/collab/awareness.js.map +1 -1
- package/dist/collab/client-struct.d.ts +43 -0
- package/dist/collab/client-struct.d.ts.map +1 -0
- package/dist/collab/client-struct.js +272 -0
- package/dist/collab/client-struct.js.map +1 -0
- package/dist/collab/client.d.ts +2 -0
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +18 -3
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/index.d.ts +6 -1
- package/dist/collab/index.d.ts.map +1 -1
- package/dist/collab/index.js +11 -1
- package/dist/collab/index.js.map +1 -1
- package/dist/collab/json-to-yjs.d.ts +72 -0
- package/dist/collab/json-to-yjs.d.ts.map +1 -0
- package/dist/collab/json-to-yjs.js +456 -0
- package/dist/collab/json-to-yjs.js.map +1 -0
- package/dist/collab/struct-routes.d.ts +52 -0
- package/dist/collab/struct-routes.d.ts.map +1 -0
- package/dist/collab/struct-routes.js +74 -0
- package/dist/collab/struct-routes.js.map +1 -0
- package/dist/collab/ydoc-manager.d.ts +19 -0
- package/dist/collab/ydoc-manager.d.ts.map +1 -1
- package/dist/collab/ydoc-manager.js +49 -0
- package/dist/collab/ydoc-manager.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 +196 -24
- package/dist/deploy/build.js.map +1 -1
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +2 -1
- package/dist/file-upload/builder.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 +17 -0
- package/dist/integrations/adapters/email.d.ts.map +1 -0
- package/dist/integrations/adapters/email.js +740 -0
- package/dist/integrations/adapters/email.js.map +1 -0
- 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 +56 -5
- 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/index.d.ts +1 -0
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +1 -0
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/internal-token.d.ts +18 -0
- package/dist/integrations/internal-token.d.ts.map +1 -0
- package/dist/integrations/internal-token.js +102 -0
- package/dist/integrations/internal-token.js.map +1 -0
- package/dist/integrations/pending-tasks-retry-job.d.ts +15 -0
- package/dist/integrations/pending-tasks-retry-job.d.ts.map +1 -0
- package/dist/integrations/pending-tasks-retry-job.js +210 -0
- package/dist/integrations/pending-tasks-retry-job.js.map +1 -0
- package/dist/integrations/pending-tasks-store.d.ts +56 -0
- package/dist/integrations/pending-tasks-store.d.ts.map +1 -0
- package/dist/integrations/pending-tasks-store.js +204 -0
- package/dist/integrations/pending-tasks-store.js.map +1 -0
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +340 -15
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/task-queue-stats.d.ts +22 -0
- package/dist/integrations/task-queue-stats.d.ts.map +1 -0
- package/dist/integrations/task-queue-stats.js +117 -0
- package/dist/integrations/task-queue-stats.js.map +1 -0
- package/dist/integrations/types.d.ts +35 -2
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.d.ts +29 -4
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +323 -85
- 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 +3 -0
- package/dist/mcp-client/manager.d.ts.map +1 -1
- package/dist/mcp-client/manager.js +33 -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/google-refresh.d.ts.map +1 -1
- package/dist/oauth-tokens/google-refresh.js +6 -0
- package/dist/oauth-tokens/google-refresh.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 +10 -4
- 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/org/context.d.ts +35 -0
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +136 -0
- package/dist/org/context.js.map +1 -1
- package/dist/org/handlers.d.ts +76 -0
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +411 -2
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/index.d.ts +2 -2
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +2 -2
- package/dist/org/index.js.map +1 -1
- package/dist/org/migrations.d.ts.map +1 -1
- package/dist/org/migrations.js +8 -0
- package/dist/org/migrations.js.map +1 -1
- package/dist/org/plugin.d.ts +6 -0
- package/dist/org/plugin.d.ts.map +1 -1
- package/dist/org/plugin.js +71 -7
- package/dist/org/plugin.js.map +1 -1
- package/dist/org/schema.d.ts +38 -0
- package/dist/org/schema.d.ts.map +1 -1
- package/dist/org/schema.js +2 -0
- package/dist/org/schema.js.map +1 -1
- package/dist/org/types.d.ts +7 -0
- package/dist/org/types.d.ts.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 +146 -36
- 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/index.d.ts.map +1 -1
- package/dist/scripts/db/index.js +2 -0
- package/dist/scripts/db/index.js.map +1 -1
- package/dist/scripts/db/migrate-user-api-keys.d.ts +24 -0
- package/dist/scripts/db/migrate-user-api-keys.d.ts.map +1 -0
- package/dist/scripts/db/migrate-user-api-keys.js +234 -0
- package/dist/scripts/db/migrate-user-api-keys.js.map +1 -0
- 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/db/wipe-leaked-builder-keys.d.ts +27 -0
- package/dist/scripts/db/wipe-leaked-builder-keys.d.ts.map +1 -0
- package/dist/scripts/db/wipe-leaked-builder-keys.js +163 -0
- package/dist/scripts/db/wipe-leaked-builder-keys.js.map +1 -0
- 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/register-framework-secrets.d.ts +5 -0
- package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
- package/dist/secrets/register-framework-secrets.js +7 -44
- package/dist/secrets/register-framework-secrets.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 +58 -8
- package/dist/secrets/substitution.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +54 -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 +632 -373
- 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 +29 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +629 -82
- 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 +16 -1
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +102 -16
- 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 +16 -0
- package/dist/server/collab-plugin.d.ts.map +1 -1
- package/dist/server/collab-plugin.js +87 -19
- 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 +499 -164
- 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 +54 -2
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +164 -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/design-token-utils.d.ts +132 -0
- package/dist/server/design-token-utils.d.ts.map +1 -0
- package/dist/server/design-token-utils.js +714 -0
- package/dist/server/design-token-utils.js.map +1 -0
- package/dist/server/email.d.ts +10 -0
- package/dist/server/email.d.ts.map +1 -1
- package/dist/server/email.js +63 -16
- package/dist/server/email.js.map +1 -1
- 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 +140 -24
- 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 +102 -3
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +263 -43
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/index.d.ts +5 -5
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +5 -5
- 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 +50 -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 +376 -60
- 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/sharing/schema.d.ts +1 -1
- package/dist/styles/agent-native.css +5 -0
- package/dist/templates/default/.agents/skills/delegate-to-agent/SKILL.md +54 -0
- package/dist/templates/default/app/root.tsx +51 -14
- 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/default/react-router.config.ts +3 -0
- 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.d.ts.map +1 -1
- package/dist/terminal/terminal-plugin.js +26 -6
- package/dist/terminal/terminal-plugin.js.map +1 -1
- package/dist/tools/actions.d.ts +3 -0
- package/dist/tools/actions.d.ts.map +1 -0
- package/dist/tools/actions.js +270 -0
- package/dist/tools/actions.js.map +1 -0
- 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 +39 -17
- package/dist/tools/fetch-tool.js.map +1 -1
- package/dist/tools/html-shell.d.ts +44 -0
- package/dist/tools/html-shell.d.ts.map +1 -0
- package/dist/tools/html-shell.js +485 -0
- package/dist/tools/html-shell.js.map +1 -0
- 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 +2 -0
- package/dist/tools/routes.d.ts.map +1 -0
- package/dist/tools/routes.js +629 -0
- package/dist/tools/routes.js.map +1 -0
- package/dist/tools/schema.d.ts +578 -0
- package/dist/tools/schema.d.ts.map +1 -0
- package/dist/tools/schema.js +115 -0
- package/dist/tools/schema.js.map +1 -0
- 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 +40 -0
- package/dist/tools/store.d.ts.map +1 -0
- package/dist/tools/store.js +181 -0
- package/dist/tools/store.js.map +1 -0
- package/dist/tools/theme.d.ts +2 -0
- package/dist/tools/theme.d.ts.map +1 -0
- package/dist/tools/theme.js +67 -0
- package/dist/tools/theme.js.map +1 -0
- 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/transcription/builder-transcription.d.ts.map +1 -1
- package/dist/transcription/builder-transcription.js +26 -14
- package/dist/transcription/builder-transcription.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 +18 -7
- 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 +240 -8
- package/dist/vite/client.js.map +1 -1
- package/docs/content/a2a-protocol.md +2 -2
- package/docs/content/authentication.md +78 -12
- package/docs/content/cloneable-saas.md +59 -62
- package/docs/content/drop-in-agent.md +2 -2
- package/docs/content/faq.md +73 -43
- package/docs/content/getting-started.md +37 -61
- package/docs/content/mcp-clients.md +14 -1
- package/docs/content/messaging.md +324 -0
- package/docs/content/onboarding.md +82 -12
- package/docs/content/pure-agent-apps.md +55 -28
- package/docs/content/template-analytics.md +65 -59
- package/docs/content/template-calendar.md +61 -56
- package/docs/content/template-clips.md +25 -23
- package/docs/content/template-content.md +36 -26
- package/docs/content/template-design.md +55 -0
- package/docs/content/template-dispatch.md +15 -1
- package/docs/content/template-forms.md +19 -16
- package/docs/content/template-mail.md +78 -80
- package/docs/content/template-slides.md +43 -31
- package/docs/content/template-video.md +49 -22
- package/docs/content/tools.md +107 -0
- package/docs/content/what-is-agent-native.md +89 -105
- package/package.json +5 -1
- package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +54 -0
- package/src/templates/default/app/root.tsx +51 -14
- 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/default/react-router.config.ts +3 -0
- 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
- package/docs/content/integrations.md +0 -198
|
@@ -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,
|
|
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
|
*
|
|
@@ -59,14 +110,46 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
59
110
|
// writes don't persist across invocations — the DB is the durable
|
|
60
111
|
// store. Only set keys that are currently empty so explicit env
|
|
61
112
|
// vars (Netlify dashboard, process-level) always win.
|
|
113
|
+
//
|
|
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.
|
|
62
123
|
try {
|
|
63
124
|
const persisted = (await getSetting("persisted-env-vars"));
|
|
64
125
|
if (persisted) {
|
|
126
|
+
const builderKeys = new Set(BUILDER_ENV_KEYS);
|
|
127
|
+
const writesAllowed = isEnvVarWriteAllowed();
|
|
128
|
+
let scrubbed = 0;
|
|
65
129
|
for (const [k, v] of Object.entries(persisted)) {
|
|
66
|
-
if (
|
|
130
|
+
if (builderKeys.has(k)) {
|
|
131
|
+
scrubbed++;
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (writesAllowed && typeof v === "string" && !process.env[k]) {
|
|
67
135
|
process.env[k] = v;
|
|
68
136
|
}
|
|
69
137
|
}
|
|
138
|
+
if (scrubbed > 0) {
|
|
139
|
+
try {
|
|
140
|
+
const cleaned = {};
|
|
141
|
+
for (const [k, v] of Object.entries(persisted)) {
|
|
142
|
+
if (!builderKeys.has(k))
|
|
143
|
+
cleaned[k] = v;
|
|
144
|
+
}
|
|
145
|
+
await putSetting("persisted-env-vars", cleaned);
|
|
146
|
+
console.warn(`[core] Removed ${scrubbed} legacy BUILDER_* key(s) from persisted-env-vars (cross-tenant leak fix).`);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// Couldn't rewrite the row — the skip-on-rehydrate above
|
|
150
|
+
// is the load-bearing protection. We'll try again next boot.
|
|
151
|
+
}
|
|
152
|
+
}
|
|
70
153
|
}
|
|
71
154
|
}
|
|
72
155
|
catch {
|
|
@@ -107,6 +190,12 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
107
190
|
// Observability module not available — skip
|
|
108
191
|
}
|
|
109
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());
|
|
110
199
|
// CORS for framework routes. Desktop tray apps (Tauri/Electron) run on
|
|
111
200
|
// their own dev origin (e.g. localhost:1420) and make credentialed
|
|
112
201
|
// requests against the template's server at a different port. We echo
|
|
@@ -116,32 +205,81 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
116
205
|
.split(",")
|
|
117
206
|
.map((s) => s.trim())
|
|
118
207
|
.filter(Boolean);
|
|
208
|
+
const isProduction = process.env.NODE_ENV === "production";
|
|
209
|
+
const LOCALHOST_RE = /^https?:\/\/(localhost|127\.0\.0\.1|tauri\.localhost)(:\d+)?$/;
|
|
119
210
|
getH3App(nitroApp).use(defineEventHandler((event) => {
|
|
120
|
-
const
|
|
121
|
-
|
|
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/"))
|
|
122
214
|
return;
|
|
123
215
|
const reqHeaders = (event.node?.req?.headers ?? {});
|
|
124
216
|
const originRaw = reqHeaders["origin"];
|
|
125
217
|
const origin = Array.isArray(originRaw) ? originRaw[0] : originRaw;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
+
}
|
|
141
262
|
setResponseStatus(event, 204);
|
|
142
263
|
return "";
|
|
143
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");
|
|
144
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));
|
|
145
283
|
// Polling
|
|
146
284
|
getH3App(nitroApp).use(`${P}/poll`, createPollHandler());
|
|
147
285
|
// SSE
|
|
@@ -156,14 +294,92 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
156
294
|
})));
|
|
157
295
|
}
|
|
158
296
|
getH3App(nitroApp).use(`${P}/builder/status`, defineEventHandler(async (event) => {
|
|
159
|
-
const
|
|
160
|
-
//
|
|
161
|
-
//
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
297
|
+
const envStatus = getBuilderBrowserStatusForEvent(event);
|
|
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
|
+
}
|
|
321
|
+
}
|
|
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) {
|
|
165
381
|
return {
|
|
166
|
-
...
|
|
382
|
+
...envStatus,
|
|
167
383
|
configured: false,
|
|
168
384
|
privateKeyConfigured: false,
|
|
169
385
|
publicKeyConfigured: false,
|
|
@@ -172,11 +388,8 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
172
388
|
orgKind: undefined,
|
|
173
389
|
};
|
|
174
390
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
// DB not reachable — fall back to env-only status.
|
|
178
|
-
}
|
|
179
|
-
return status;
|
|
391
|
+
return envStatus;
|
|
392
|
+
});
|
|
180
393
|
}));
|
|
181
394
|
// Lightweight 302 to the Builder CLI-auth URL. Lets clients do
|
|
182
395
|
// `window.open('/_agent-native/builder/connect', '_blank')` synchronously
|
|
@@ -222,14 +435,15 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
222
435
|
// caller isn't a named user we should spend a Builder private key
|
|
223
436
|
// on. Allow it only when the environment explicitly opts into
|
|
224
437
|
// local mode (dev, tests, or AUTH_MODE=local).
|
|
225
|
-
if (session.email ===
|
|
438
|
+
if (session.email === DEV_MODE_USER_EMAIL &&
|
|
226
439
|
process.env.NODE_ENV === "production" &&
|
|
227
440
|
process.env.AUTH_MODE !== "local") {
|
|
228
441
|
setResponseStatus(event, 401);
|
|
229
442
|
return { error: "A signed-in user is required to run Builder" };
|
|
230
443
|
}
|
|
231
444
|
const userEmail = session.email;
|
|
232
|
-
const
|
|
445
|
+
const { resolveBuilderCredential: resolveBuilderCred } = await import("./credential-provider.js");
|
|
446
|
+
const builderUserId = (await resolveBuilderCred("BUILDER_USER_ID")) || undefined;
|
|
233
447
|
// Server-controlled projectId — don't let clients target arbitrary
|
|
234
448
|
// Builder projects with our private key. When this feature graduates
|
|
235
449
|
// past the hardcoded preview, the projectId will come from
|
|
@@ -280,49 +494,65 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
280
494
|
setResponseStatus(event, 400);
|
|
281
495
|
return { error: "Missing Builder credentials in callback" };
|
|
282
496
|
}
|
|
283
|
-
const
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
//
|
|
291
|
-
//
|
|
292
|
-
//
|
|
497
|
+
const userId = requestUrl.searchParams.get("user-id");
|
|
498
|
+
const orgName = requestUrl.searchParams.get("org-name");
|
|
499
|
+
const orgKind = requestUrl.searchParams.get("kind");
|
|
500
|
+
// Store per-user in app_secrets so each user's Builder connection
|
|
501
|
+
// is independent. No more shared env vars that the last connector
|
|
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;
|
|
293
512
|
try {
|
|
294
|
-
await
|
|
513
|
+
const { writeBuilderCredentials } = await import("./credential-provider.js");
|
|
514
|
+
await writeBuilderCredentials(session.email, {
|
|
515
|
+
privateKey,
|
|
516
|
+
publicKey,
|
|
517
|
+
userId,
|
|
518
|
+
orgName,
|
|
519
|
+
orgKind,
|
|
520
|
+
});
|
|
295
521
|
}
|
|
296
|
-
catch {
|
|
297
|
-
|
|
298
|
-
|
|
522
|
+
catch (err) {
|
|
523
|
+
writeError = err?.message ?? String(err);
|
|
524
|
+
console.error("[builder] Failed to persist per-user credentials:", writeError);
|
|
525
|
+
}
|
|
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);
|
|
299
542
|
}
|
|
300
|
-
//
|
|
301
|
-
//
|
|
543
|
+
// Clear any legacy disconnect flag and any prior connect-error row
|
|
544
|
+
// (so a successful retry doesn't surface the previous failure).
|
|
302
545
|
try {
|
|
303
|
-
|
|
304
|
-
const envPath = workspaceRoot
|
|
305
|
-
? path.join(workspaceRoot, ".env")
|
|
306
|
-
: path.join(process.cwd(), ".env");
|
|
307
|
-
await upsertEnvFile(envPath, vars);
|
|
546
|
+
await deleteSetting("builder-disconnected");
|
|
308
547
|
}
|
|
309
548
|
catch {
|
|
310
|
-
//
|
|
311
|
-
}
|
|
312
|
-
for (const { key, value } of vars) {
|
|
313
|
-
process.env[key] = value;
|
|
549
|
+
// DB not ready — proceed
|
|
314
550
|
}
|
|
315
|
-
// Persist to settings table so serverless cold starts can
|
|
316
|
-
// restore credentials (.env writes don't survive on Netlify).
|
|
317
551
|
try {
|
|
318
|
-
|
|
319
|
-
for (const { key, value } of vars)
|
|
320
|
-
envMap[key] = value;
|
|
321
|
-
const existing = (await getSetting("persisted-env-vars")) ?? {};
|
|
322
|
-
await putSetting("persisted-env-vars", { ...existing, ...envMap });
|
|
552
|
+
await deleteSetting(`builder-connect-error:${session.email}`);
|
|
323
553
|
}
|
|
324
554
|
catch {
|
|
325
|
-
//
|
|
555
|
+
// No prior error row — fine
|
|
326
556
|
}
|
|
327
557
|
const previewUrl = resolveSafePreviewUrl(requestUrl.searchParams.get("preview-url"), event);
|
|
328
558
|
setResponseHeader(event, "Content-Type", "text/html; charset=utf-8");
|
|
@@ -344,63 +574,20 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
344
574
|
setResponseStatus(event, 401);
|
|
345
575
|
return { error: "unauthorized" };
|
|
346
576
|
}
|
|
347
|
-
//
|
|
348
|
-
// A `.env` write triggers nitro's file watcher → env-runner
|
|
349
|
-
// restart, which tears down in-flight SSE / HMR connections and
|
|
350
|
-
// surfaces as `read ECONNRESET` in the vite overlay. The
|
|
351
|
-
// authoritative disconnect signal is the SQL `builder-disconnected`
|
|
352
|
-
// flag (checked in plugin init, the status endpoint, and the
|
|
353
|
-
// Builder engine before any gateway call). `.env` keys, if any
|
|
354
|
-
// survive, are neutered by the flag-driven scrub in plugin init.
|
|
355
|
-
// 1. Write the disconnect flag. This is load-bearing — every
|
|
356
|
-
// subsequent check (plugin init scrub, /builder/status override,
|
|
357
|
-
// BuilderEngine.stream short-circuit) reads this flag. If the
|
|
358
|
-
// write fails, we FAIL HARD: clearing process.env without
|
|
359
|
-
// persisting the flag means the next env-runner reload would
|
|
360
|
-
// silently restore BUILDER_* from whatever inherited env the
|
|
361
|
-
// worker was spawned with, and the user would see "Disconnected"
|
|
362
|
-
// in the UI that flips back to "Connected" moments later.
|
|
577
|
+
// Delete per-user Builder credentials from app_secrets.
|
|
363
578
|
try {
|
|
364
|
-
await
|
|
579
|
+
const { deleteBuilderCredentials } = await import("./credential-provider.js");
|
|
580
|
+
await deleteBuilderCredentials(session.email);
|
|
365
581
|
}
|
|
366
582
|
catch (err) {
|
|
367
583
|
setResponseStatus(event, 500);
|
|
368
584
|
return {
|
|
369
585
|
ok: false,
|
|
370
|
-
error: "Could not
|
|
586
|
+
error: "Could not remove Builder credentials — your connection is unchanged. Please retry.",
|
|
371
587
|
cause: err instanceof Error ? err.message : String(err),
|
|
372
588
|
};
|
|
373
589
|
}
|
|
374
|
-
|
|
375
|
-
// don't rehydrate BUILDER_* from SQL. Best-effort: the disconnect
|
|
376
|
-
// flag above already prevents Builder from being used; this is
|
|
377
|
-
// cleanup.
|
|
378
|
-
let warnPersisted;
|
|
379
|
-
try {
|
|
380
|
-
const existing = (await getSetting("persisted-env-vars")) ?? {};
|
|
381
|
-
const cleaned = {};
|
|
382
|
-
for (const [k, v] of Object.entries(existing)) {
|
|
383
|
-
if (!BUILDER_ENV_KEYS.includes(k))
|
|
384
|
-
cleaned[k] = v;
|
|
385
|
-
}
|
|
386
|
-
await putSetting("persisted-env-vars", cleaned);
|
|
387
|
-
}
|
|
388
|
-
catch (err) {
|
|
389
|
-
warnPersisted = err instanceof Error ? err.message : String(err);
|
|
390
|
-
}
|
|
391
|
-
// 3. Clear in-process env vars so the current worker stops routing
|
|
392
|
-
// through Builder immediately. Nitro's env-runner may re-populate
|
|
393
|
-
// these across a module reload, but by then the `builder-disconnected`
|
|
394
|
-
// flag will be enforced at the plugin-init scrub.
|
|
395
|
-
for (const key of BUILDER_ENV_KEYS) {
|
|
396
|
-
delete process.env[key];
|
|
397
|
-
}
|
|
398
|
-
return {
|
|
399
|
-
ok: true,
|
|
400
|
-
...(warnPersisted
|
|
401
|
-
? { warnings: { persistedEnvVars: warnPersisted } }
|
|
402
|
-
: {}),
|
|
403
|
-
};
|
|
590
|
+
return { ok: true };
|
|
404
591
|
}));
|
|
405
592
|
// Proxy to Builder's agents-run API for background code changes.
|
|
406
593
|
getH3App(nitroApp).use(`${P}/builder/agents-run`, defineEventHandler(async (event) => {
|
|
@@ -408,47 +595,56 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
408
595
|
setResponseStatus(event, 405);
|
|
409
596
|
return { error: "Method not allowed" };
|
|
410
597
|
}
|
|
411
|
-
const
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
return {
|
|
416
|
-
error: "Builder not connected. Connect Builder in Setup to use background agent.",
|
|
417
|
-
};
|
|
418
|
-
}
|
|
419
|
-
const body = (await readBody(event));
|
|
420
|
-
if (!body?.userMessage) {
|
|
421
|
-
setResponseStatus(event, 400);
|
|
422
|
-
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" };
|
|
423
602
|
}
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
const
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
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}`,
|
|
435
624
|
},
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
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();
|
|
443
640
|
}
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
}
|
|
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
|
+
});
|
|
452
648
|
}));
|
|
453
649
|
// Env key management — framework keys are always included
|
|
454
650
|
const frameworkEnvKeys = [
|
|
@@ -489,12 +685,25 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
489
685
|
label: cfg.label,
|
|
490
686
|
required: cfg.required ?? false,
|
|
491
687
|
configured: !!process.env[cfg.key],
|
|
688
|
+
...(cfg.helpText ? { helpText: cfg.helpText } : {}),
|
|
492
689
|
}))));
|
|
493
690
|
getH3App(nitroApp).use(`${P}/env-vars`, defineEventHandler(async (event) => {
|
|
494
691
|
if (getMethod(event) !== "POST") {
|
|
495
692
|
setResponseStatus(event, 405);
|
|
496
693
|
return { error: "Method not allowed" };
|
|
497
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
|
+
}
|
|
498
707
|
const body = await readBody(event);
|
|
499
708
|
const { vars } = body;
|
|
500
709
|
if (!Array.isArray(vars) || vars.length === 0) {
|
|
@@ -579,6 +788,19 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
579
788
|
};
|
|
580
789
|
}
|
|
581
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
|
+
}
|
|
582
804
|
const detected = detectEngineFromEnv();
|
|
583
805
|
if (detected) {
|
|
584
806
|
return {
|
|
@@ -638,17 +860,51 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
638
860
|
// ─── File upload primitive ──────────────────────────────────────
|
|
639
861
|
// GET /_agent-native/file-upload/status — report active provider
|
|
640
862
|
// POST /_agent-native/file-upload — upload a file, return { url }
|
|
641
|
-
getH3App(nitroApp).use(`${P}/file-upload/status`, defineEventHandler(() => {
|
|
863
|
+
getH3App(nitroApp).use(`${P}/file-upload/status`, defineEventHandler(async (event) => {
|
|
642
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;
|
|
871
|
+
let builderConfigured = !!process.env.BUILDER_PRIVATE_KEY;
|
|
872
|
+
try {
|
|
873
|
+
const { resolveBuilderPrivateKey } = await import("./credential-provider.js");
|
|
874
|
+
const resolve = () => resolveBuilderPrivateKey().then((k) => !!k);
|
|
875
|
+
builderConfigured = userEmail
|
|
876
|
+
? await runWithRequestContext({ userEmail }, resolve)
|
|
877
|
+
: await resolve();
|
|
878
|
+
}
|
|
879
|
+
catch {
|
|
880
|
+
// fall back to env check above
|
|
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;
|
|
643
899
|
return {
|
|
644
|
-
configured
|
|
645
|
-
activeProvider
|
|
900
|
+
configured,
|
|
901
|
+
activeProvider,
|
|
646
902
|
providers: listFileUploadProviders().map((p) => ({
|
|
647
903
|
id: p.id,
|
|
648
904
|
name: p.name,
|
|
649
905
|
configured: p.isConfigured(),
|
|
650
906
|
})),
|
|
651
|
-
builderConfigured
|
|
907
|
+
builderConfigured,
|
|
652
908
|
};
|
|
653
909
|
}));
|
|
654
910
|
getH3App(nitroApp).use(`${P}/file-upload`, defineEventHandler(async (event) => {
|
|
@@ -663,12 +919,17 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
663
919
|
return { error: "No file uploaded" };
|
|
664
920
|
}
|
|
665
921
|
const session = await getSession(event);
|
|
666
|
-
|
|
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({
|
|
667
928
|
data: filePart.data,
|
|
668
929
|
filename: filePart.filename,
|
|
669
930
|
mimeType: filePart.type,
|
|
670
|
-
ownerEmail:
|
|
671
|
-
});
|
|
931
|
+
ownerEmail: userEmail,
|
|
932
|
+
}));
|
|
672
933
|
if (result) {
|
|
673
934
|
setResponseStatus(event, 201);
|
|
674
935
|
return result;
|
|
@@ -681,6 +942,10 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
681
942
|
// ─── Voice transcription (Whisper) ───────────────────────────────
|
|
682
943
|
// POST /_agent-native/transcribe-voice — multipart audio → text
|
|
683
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());
|
|
684
949
|
// ─── Ad-hoc secrets (user-created keys) ────────────────────────────
|
|
685
950
|
// Must mount before the generic /secrets handler to avoid shadowing.
|
|
686
951
|
const adHocSecretHandler = createAdHocSecretHandler();
|
|
@@ -720,6 +985,22 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
720
985
|
// POST /_agent-native/notifications/read-all
|
|
721
986
|
// DELETE /_agent-native/notifications/:id
|
|
722
987
|
getH3App(nitroApp).use(`${P}/notifications`, createNotificationsHandler());
|
|
988
|
+
// ─── Tools (mini-app runtime + proxy) ───────────────────────────────
|
|
989
|
+
try {
|
|
990
|
+
const { ensureToolsTables, registerToolsShareable } = await import("../tools/store.js");
|
|
991
|
+
const { createToolsHandler } = await import("../tools/routes.js");
|
|
992
|
+
ensureToolsTables().catch(() => { });
|
|
993
|
+
registerToolsShareable();
|
|
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());
|
|
1000
|
+
}
|
|
1001
|
+
catch {
|
|
1002
|
+
// Tools module not available — skip
|
|
1003
|
+
}
|
|
723
1004
|
// ─── Agent run progress ───────────────────────────────────────────
|
|
724
1005
|
// GET /_agent-native/runs[?active&limit]
|
|
725
1006
|
// GET /_agent-native/runs/:id
|
|
@@ -733,11 +1014,25 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
733
1014
|
const pathname = (event.url?.pathname || "")
|
|
734
1015
|
.replace(/^\/+/, "")
|
|
735
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
|
+
}
|
|
736
1027
|
if (pathname === "fire-test" && method === "POST") {
|
|
737
1028
|
try {
|
|
738
1029
|
const { emit } = await import("../event-bus/index.js");
|
|
739
1030
|
const body = (await readBody(event).catch(() => ({})));
|
|
740
|
-
|
|
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
|
+
});
|
|
741
1036
|
return { ok: true };
|
|
742
1037
|
}
|
|
743
1038
|
catch (err) {
|
|
@@ -750,8 +1045,7 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
750
1045
|
return { error: "Method not allowed" };
|
|
751
1046
|
}
|
|
752
1047
|
try {
|
|
753
|
-
const
|
|
754
|
-
const owner = session?.email || "local@localhost";
|
|
1048
|
+
const owner = session.email;
|
|
755
1049
|
const { resourceListAllOwners, SHARED_OWNER } = await import("../resources/store.js");
|
|
756
1050
|
const allResources = await resourceListAllOwners("jobs/");
|
|
757
1051
|
const resources = allResources.filter((r) => r.owner === owner || r.owner === SHARED_OWNER);
|
|
@@ -813,6 +1107,47 @@ export function createCoreRoutesPlugin(options = {}) {
|
|
|
813
1107
|
}));
|
|
814
1108
|
// ─── Application State CRUD ──────────────────────────────────────
|
|
815
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
|
+
}));
|
|
816
1151
|
// ─── Avatar routes ──────────────────────────────────────────────────
|
|
817
1152
|
// GET /_agent-native/avatar/:email — fetch any user's avatar (public)
|
|
818
1153
|
// PUT /_agent-native/avatar — update current user's avatar (auth required)
|