@agent-native/core 0.7.12 → 0.7.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/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 +287 -62
- package/dist/a2a/handlers.js.map +1 -1
- package/dist/a2a/server.d.ts.map +1 -1
- package/dist/a2a/server.js +95 -17
- package/dist/a2a/server.js.map +1 -1
- package/dist/a2a/task-store.d.ts +11 -1
- package/dist/a2a/task-store.d.ts.map +1 -1
- package/dist/a2a/task-store.js +38 -2
- package/dist/a2a/task-store.js.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +26 -8
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +19 -0
- package/dist/agent/engine/builder-engine.d.ts.map +1 -0
- package/dist/agent/engine/builder-engine.js +412 -0
- package/dist/agent/engine/builder-engine.js.map +1 -0
- package/dist/agent/engine/builtin.d.ts.map +1 -1
- package/dist/agent/engine/builtin.js +26 -10
- package/dist/agent/engine/builtin.js.map +1 -1
- package/dist/agent/engine/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +20 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +49 -1
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/engine/types.d.ts +30 -0
- package/dist/agent/engine/types.d.ts.map +1 -1
- package/dist/agent/engine/types.js +19 -1
- package/dist/agent/engine/types.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +65 -7
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +11 -1
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts +4 -0
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +1 -0
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/types.d.ts +8 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/chat-threads/store.d.ts +3 -0
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +32 -0
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/checkpoints/service.d.ts +1 -0
- package/dist/checkpoints/service.d.ts.map +1 -1
- package/dist/checkpoints/service.js +26 -2
- package/dist/checkpoints/service.js.map +1 -1
- package/dist/cli/create.d.ts +30 -0
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +25 -13
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +11 -0
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +3 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +22 -11
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AgentTaskCard.d.ts.map +1 -1
- package/dist/client/AgentTaskCard.js +2 -0
- 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 +159 -84
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ConnectBuilderCard.d.ts +1 -7
- package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
- package/dist/client/ConnectBuilderCard.js +30 -132
- package/dist/client/ConnectBuilderCard.js.map +1 -1
- package/dist/client/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 +169 -52
- package/dist/client/MultiTabAssistantChat.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 +1 -1
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/analytics.d.ts +5 -8
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +53 -11
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/builder-mark.d.ts +9 -0
- package/dist/client/builder-mark.d.ts.map +1 -0
- package/dist/client/builder-mark.js +10 -0
- package/dist/client/builder-mark.js.map +1 -0
- package/dist/client/components/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/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/components/ui/popover.d.ts +8 -0
- package/dist/client/components/ui/popover.d.ts.map +1 -0
- package/dist/client/components/ui/popover.js +11 -0
- package/dist/client/components/ui/popover.js.map +1 -0
- package/dist/client/composer/ComposerPlusMenu.d.ts +7 -0
- package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -0
- package/dist/client/composer/ComposerPlusMenu.js +183 -0
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -0
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +244 -19
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/types.d.ts +1 -0
- package/dist/client/composer/types.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.d.ts +2 -0
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +89 -12
- package/dist/client/composer/useVoiceDictation.js.map +1 -1
- package/dist/client/error-format.d.ts +2 -0
- package/dist/client/error-format.d.ts.map +1 -0
- package/dist/client/error-format.js +31 -0
- package/dist/client/error-format.js.map +1 -0
- package/dist/client/index.d.ts +6 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +8 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/observability/ObservabilityDashboard.d.ts +5 -0
- package/dist/client/observability/ObservabilityDashboard.d.ts.map +1 -0
- package/dist/client/observability/ObservabilityDashboard.js +169 -0
- package/dist/client/observability/ObservabilityDashboard.js.map +1 -0
- package/dist/client/observability/ThumbsFeedback.d.ts +8 -0
- package/dist/client/observability/ThumbsFeedback.d.ts.map +1 -0
- package/dist/client/observability/ThumbsFeedback.js +64 -0
- package/dist/client/observability/ThumbsFeedback.js.map +1 -0
- package/dist/client/observability/index.d.ts +4 -0
- package/dist/client/observability/index.d.ts.map +1 -0
- package/dist/client/observability/index.js +4 -0
- package/dist/client/observability/index.js.map +1 -0
- package/dist/client/observability/useObservability.d.ts +128 -0
- package/dist/client/observability/useObservability.d.ts.map +1 -0
- package/dist/client/observability/useObservability.js +109 -0
- package/dist/client/observability/useObservability.js.map +1 -0
- package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +34 -92
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/org/RequireActiveOrg.d.ts +33 -0
- package/dist/client/org/RequireActiveOrg.d.ts.map +1 -0
- package/dist/client/org/RequireActiveOrg.js +68 -0
- package/dist/client/org/RequireActiveOrg.js.map +1 -0
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +125 -4
- 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 +115 -15
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +3 -2
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +2 -1
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +8 -4
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
- package/dist/client/settings/AutomationsSection.js +2 -1
- package/dist/client/settings/AutomationsSection.js.map +1 -1
- package/dist/client/settings/BrowserSection.js +1 -1
- package/dist/client/settings/BrowserSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +133 -20
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +10 -4
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +26 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +128 -4
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +2 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +16 -2
- package/dist/client/sse-event-processor.js.map +1 -1
- 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 +98 -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 +309 -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 +23 -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 +72 -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 +188 -0
- package/dist/client/tools/ToolsSidebarSection.js.map +1 -0
- package/dist/client/tools/index.d.ts +6 -0
- package/dist/client/tools/index.d.ts.map +1 -0
- package/dist/client/tools/index.js +6 -0
- package/dist/client/tools/index.js.map +1 -0
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts +9 -0
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -0
- package/dist/client/transcription/BuilderTranscriptionCta.js +18 -0
- package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -0
- package/dist/client/transcription/use-live-transcription.d.ts +29 -0
- package/dist/client/transcription/use-live-transcription.d.ts.map +1 -0
- package/dist/client/transcription/use-live-transcription.js +156 -0
- package/dist/client/transcription/use-live-transcription.js.map +1 -0
- package/dist/client/use-builder-enabled.d.ts +17 -0
- package/dist/client/use-builder-enabled.d.ts.map +1 -0
- package/dist/client/use-builder-enabled.js +36 -0
- package/dist/client/use-builder-enabled.js.map +1 -0
- package/dist/client/use-chat-threads.d.ts +1 -0
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +29 -0
- 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 +10 -8
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/useProductionAgent.d.ts.map +1 -1
- package/dist/client/useProductionAgent.js +3 -1
- package/dist/client/useProductionAgent.js.map +1 -1
- package/dist/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 +15 -1
- 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/db/migrations.d.ts +9 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +75 -10
- package/dist/db/migrations.js.map +1 -1
- package/dist/deploy/build.js +1 -1
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +13 -5
- package/dist/file-upload/builder.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 +620 -0
- package/dist/integrations/adapters/email.js.map +1 -0
- package/dist/integrations/adapters/telegram.d.ts.map +1 -1
- package/dist/integrations/adapters/telegram.js +19 -3
- package/dist/integrations/adapters/telegram.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 +86 -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 +199 -0
- package/dist/integrations/pending-tasks-retry-job.js.map +1 -0
- package/dist/integrations/pending-tasks-store.d.ts +40 -0
- package/dist/integrations/pending-tasks-store.d.ts.map +1 -0
- package/dist/integrations/pending-tasks-store.js +151 -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 +151 -9
- 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 +2 -0
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.d.ts +23 -4
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +217 -59
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/tools.d.ts.map +1 -1
- package/dist/jobs/tools.js +137 -161
- package/dist/jobs/tools.js.map +1 -1
- package/dist/mcp-client/manager.d.ts +3 -0
- package/dist/mcp-client/manager.d.ts.map +1 -1
- package/dist/mcp-client/manager.js +5 -0
- package/dist/mcp-client/manager.js.map +1 -1
- package/dist/notifications/actions.d.ts +2 -2
- package/dist/notifications/actions.d.ts.map +1 -1
- package/dist/notifications/actions.js +77 -69
- package/dist/notifications/actions.js.map +1 -1
- package/dist/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/observability/evals.d.ts +22 -0
- package/dist/observability/evals.d.ts.map +1 -0
- package/dist/observability/evals.js +371 -0
- package/dist/observability/evals.js.map +1 -0
- package/dist/observability/experiments.d.ts +24 -0
- package/dist/observability/experiments.d.ts.map +1 -0
- package/dist/observability/experiments.js +274 -0
- package/dist/observability/experiments.js.map +1 -0
- package/dist/observability/feedback.d.ts +14 -0
- package/dist/observability/feedback.d.ts.map +1 -0
- package/dist/observability/feedback.js +256 -0
- package/dist/observability/feedback.js.map +1 -0
- package/dist/observability/index.d.ts +6 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +5 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/plugin.d.ts +2 -0
- package/dist/observability/plugin.d.ts.map +1 -0
- package/dist/observability/plugin.js +12 -0
- package/dist/observability/plugin.js.map +1 -0
- package/dist/observability/routes.d.ts +68 -0
- package/dist/observability/routes.d.ts.map +1 -0
- package/dist/observability/routes.js +301 -0
- package/dist/observability/routes.js.map +1 -0
- package/dist/observability/store.d.ts +77 -0
- package/dist/observability/store.d.ts.map +1 -0
- package/dist/observability/store.js +976 -0
- package/dist/observability/store.js.map +1 -0
- package/dist/observability/traces.d.ts +37 -0
- package/dist/observability/traces.d.ts.map +1 -0
- package/dist/observability/traces.js +182 -0
- package/dist/observability/traces.js.map +1 -0
- package/dist/observability/types.d.ts +159 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +16 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +15 -7
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/onboarding/types.d.ts +10 -1
- package/dist/onboarding/types.d.ts.map +1 -1
- package/dist/org/context.d.ts +43 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +299 -6
- 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 +460 -32
- 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 +3 -0
- package/dist/progress/actions.d.ts.map +1 -1
- package/dist/progress/actions.js +86 -110
- package/dist/progress/actions.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/progress/routes.js +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.d.ts +10 -0
- package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -0
- package/dist/scripts/agent-engines/manage-agent-engine.js +47 -0
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -0
- package/dist/scripts/agent-engines/set-agent-engine.js +2 -2
- package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +90 -18
- package/dist/scripts/call-agent.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 +224 -0
- package/dist/scripts/db/migrate-user-api-keys.js.map +1 -0
- 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/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/substitution.d.ts.map +1 -1
- package/dist/secrets/substitution.js +14 -2
- package/dist/secrets/substitution.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +39 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/action-routes.js +1 -1
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +39 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +869 -458
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-teams.js +1 -1
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/analytics.d.ts +5 -6
- package/dist/server/analytics.d.ts.map +1 -1
- package/dist/server/analytics.js +6 -14
- package/dist/server/analytics.js.map +1 -1
- package/dist/server/app-name.d.ts +5 -2
- package/dist/server/app-name.d.ts.map +1 -1
- package/dist/server/app-name.js +14 -3
- package/dist/server/app-name.js.map +1 -1
- package/dist/server/app-url.d.ts.map +1 -1
- package/dist/server/app-url.js +10 -1
- package/dist/server/app-url.js.map +1 -1
- package/dist/server/auth.d.ts +16 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +373 -7
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts +2 -0
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +4 -0
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/builder-browser.d.ts +59 -1
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +139 -23
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/collab-plugin.d.ts +4 -0
- package/dist/server/collab-plugin.d.ts.map +1 -1
- package/dist/server/collab-plugin.js +30 -4
- 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 +241 -33
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +50 -2
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +125 -2
- package/dist/server/credential-provider.js.map +1 -1
- 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.map +1 -1
- package/dist/server/framework-request-handler.js +38 -3
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/google-oauth.d.ts +18 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +21 -4
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -3
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +43 -5
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +46 -5
- package/dist/server/poll.js.map +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +2 -1
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts.map +1 -1
- package/dist/server/transcribe-voice.js +125 -21
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/sharing/schema.d.ts +1 -1
- package/dist/styles/agent-native.css +16 -2
- package/dist/templates/default/.agents/skills/progress/SKILL.md +14 -12
- package/dist/templates/default/app/root.tsx +57 -13
- package/dist/templates/default/react-router.config.ts +3 -0
- package/dist/terminal/terminal-plugin.d.ts.map +1 -1
- package/dist/terminal/terminal-plugin.js +23 -3
- 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 +140 -0
- package/dist/tools/actions.js.map +1 -0
- package/dist/tools/fetch-tool.js +1 -1
- package/dist/tools/fetch-tool.js.map +1 -1
- package/dist/tools/html-shell.d.ts +2 -0
- package/dist/tools/html-shell.d.ts.map +1 -0
- package/dist/tools/html-shell.js +387 -0
- package/dist/tools/html-shell.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 +576 -0
- package/dist/tools/routes.js.map +1 -0
- package/dist/tools/schema.d.ts +575 -0
- package/dist/tools/schema.d.ts.map +1 -0
- package/dist/tools/schema.js +112 -0
- package/dist/tools/schema.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 +190 -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/transcription/builder-transcription.d.ts +27 -0
- package/dist/transcription/builder-transcription.d.ts.map +1 -0
- package/dist/transcription/builder-transcription.js +53 -0
- package/dist/transcription/builder-transcription.js.map +1 -0
- package/dist/triggers/actions.d.ts +3 -0
- package/dist/triggers/actions.d.ts.map +1 -1
- package/dist/triggers/actions.js +189 -213
- package/dist/triggers/actions.js.map +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +10 -2
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +26 -6
- package/dist/vite/client.js.map +1 -1
- package/docs/content/a2a-protocol.md +2 -2
- package/docs/content/agent-mentions.md +1 -1
- package/docs/content/authentication.md +51 -0
- package/docs/content/automations.md +22 -19
- package/docs/content/cloneable-saas.md +59 -62
- package/docs/content/deployment.md +21 -61
- package/docs/content/faq.md +73 -43
- package/docs/content/getting-started.md +37 -61
- package/docs/content/key-concepts.md +1 -1
- package/docs/content/mcp-clients.md +14 -1
- package/docs/content/messaging.md +284 -0
- package/docs/content/{enterprise-workspace.md → multi-app-workspace.md} +3 -3
- package/docs/content/multi-tenancy.md +1 -1
- package/docs/content/progress.md +11 -11
- package/docs/content/pure-agent-apps.md +55 -28
- package/docs/content/template-calendar.md +61 -56
- package/docs/content/template-clips.md +22 -18
- package/docs/content/template-content.md +36 -26
- package/docs/content/template-dispatch.md +5 -4
- package/docs/content/template-forms.md +13 -11
- 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/docs/content/workspace-management.md +1 -1
- package/package.json +12 -2
- package/src/templates/default/.agents/skills/progress/SKILL.md +14 -12
- package/src/templates/default/app/root.tsx +57 -13
- package/src/templates/default/react-router.config.ts +3 -0
- package/docs/content/integrations.md +0 -198
package/dist/server/app-name.js
CHANGED
|
@@ -6,11 +6,15 @@
|
|
|
6
6
|
* Resolution order:
|
|
7
7
|
* 1. `APP_NAME` env var — explicit override (recommended for prod)
|
|
8
8
|
* 2. `displayName` from the app's package.json
|
|
9
|
-
* 3. Titlecased `name` from package.json
|
|
10
|
-
*
|
|
9
|
+
* 3. Titlecased `name` from package.json (only if it matches a known
|
|
10
|
+
* first-party template — on serverless runtimes `process.cwd()` may
|
|
11
|
+
* point at a bundler-generated package.json with a bogus name)
|
|
12
|
+
* 4. First-party template label matched by package.json name
|
|
13
|
+
* 5. `undefined` — caller should degrade gracefully
|
|
11
14
|
*/
|
|
12
15
|
import path from "node:path";
|
|
13
16
|
import fs from "node:fs";
|
|
17
|
+
import { TEMPLATES } from "../cli/templates-meta.js";
|
|
14
18
|
let cachedFromPkg = null;
|
|
15
19
|
function readPkg() {
|
|
16
20
|
try {
|
|
@@ -34,7 +38,14 @@ export function getAppName() {
|
|
|
34
38
|
if (cachedFromPkg !== null)
|
|
35
39
|
return cachedFromPkg ?? undefined;
|
|
36
40
|
const pkg = readPkg();
|
|
37
|
-
|
|
41
|
+
let name;
|
|
42
|
+
if (pkg?.displayName) {
|
|
43
|
+
name = pkg.displayName;
|
|
44
|
+
}
|
|
45
|
+
else if (pkg?.name) {
|
|
46
|
+
const tmpl = TEMPLATES.find((t) => t.name === pkg.name);
|
|
47
|
+
name = tmpl ? tmpl.label || titlecase(tmpl.name) : undefined;
|
|
48
|
+
}
|
|
38
49
|
cachedFromPkg = name ?? undefined;
|
|
39
50
|
return name;
|
|
40
51
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-name.js","sourceRoot":"","sources":["../../src/server/app-name.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"app-name.js","sourceRoot":"","sources":["../../src/server/app-name.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAErD,IAAI,aAAa,GAA8B,IAAI,CAAC;AAEpD,SAAS,OAAO;IACd,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,CAAS;IAC1B,OAAO,CAAC;SACL,KAAK,CAAC,SAAS,CAAC;SAChB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3C,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACtD,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO,aAAa,IAAI,SAAS,CAAC;IAC9D,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,IAAI,IAAwB,CAAC;IAC7B,IAAI,GAAG,EAAE,WAAW,EAAE,CAAC;QACrB,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC;IACzB,CAAC;SAAM,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,CAAC;IACD,aAAa,GAAG,IAAI,IAAI,SAAS,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-url.d.ts","sourceRoot":"","sources":["../../src/server/app-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"app-url.d.ts","sourceRoot":"","sources":["../../src/server/app-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,IAAI,CAAC;AAkCjD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,SAAS,CAKzD;AAED,wBAAgB,mBAAmB,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CA2B3D"}
|
package/dist/server/app-url.js
CHANGED
|
@@ -19,13 +19,22 @@ import fs from "node:fs";
|
|
|
19
19
|
import { TEMPLATES } from "../cli/templates-meta.js";
|
|
20
20
|
import { isLocalDatabase } from "../db/client.js";
|
|
21
21
|
let cachedPkgName = null;
|
|
22
|
+
/**
|
|
23
|
+
* Read the app's package name, validated against the first-party template
|
|
24
|
+
* registry. On serverless runtimes (Netlify Functions, Cloudflare Workers),
|
|
25
|
+
* `process.cwd()` may point at a bundler-generated package.json with a
|
|
26
|
+
* bogus name (e.g. Nitro's "traced-node-modules"). Only trust the name if
|
|
27
|
+
* it matches a known template.
|
|
28
|
+
*/
|
|
22
29
|
function readPackageName() {
|
|
23
30
|
if (cachedPkgName !== null)
|
|
24
31
|
return cachedPkgName ?? undefined;
|
|
25
32
|
try {
|
|
26
33
|
const pkgPath = path.join(process.cwd(), "package.json");
|
|
27
34
|
const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
28
|
-
|
|
35
|
+
const name = typeof pkg?.name === "string" ? pkg.name : undefined;
|
|
36
|
+
const isKnown = name && TEMPLATES.some((t) => t.name === name);
|
|
37
|
+
cachedPkgName = isKnown ? name : undefined;
|
|
29
38
|
}
|
|
30
39
|
catch {
|
|
31
40
|
cachedPkgName = undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-url.js","sourceRoot":"","sources":["../../src/server/app-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,aAAa,EAAgB,MAAM,IAAI,CAAC;AACjD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,IAAI,aAAa,GAA8B,IAAI,CAAC;AAEpD,SAAS,eAAe;IACtB,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO,aAAa,IAAI,SAAS,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACzD,
|
|
1
|
+
{"version":3,"file":"app-url.js","sourceRoot":"","sources":["../../src/server/app-url.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,aAAa,EAAgB,MAAM,IAAI,CAAC;AACjD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,IAAI,aAAa,GAA8B,IAAI,CAAC;AAEpD;;;;;;GAMG;AACH,SAAS,eAAe;IACtB,IAAI,aAAa,KAAK,IAAI;QAAE,OAAO,aAAa,IAAI,SAAS,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,OAAO,GAAG,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC/D,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,aAAa,GAAG,SAAS,CAAC;IAC5B,CAAC;IACD,OAAO,aAAa,IAAI,SAAS,CAAC;AACpC,CAAC;AAED,+DAA+D;AAC/D,SAAS,kBAAkB,CAAC,CAAS;IACnC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,OAAO,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAe;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAClE,IAAI,MAAM;QAAE,OAAO,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE9C,wEAAwE;IACxE,wEAAwE;IACxE,8CAA8C;IAC9C,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,uEAAuE;IACvE,qEAAqE;IACrE,wEAAwE;IACxE,oEAAoE;IACpE,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QAChE,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;QAC1C,IAAI,UAAU;YAAE,OAAO,kBAAkB,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,uBAAuB,CAAC;AACjC,CAAC"}
|
package/dist/server/auth.d.ts
CHANGED
|
@@ -11,6 +11,8 @@ export interface AuthSession {
|
|
|
11
11
|
email: string;
|
|
12
12
|
userId?: string;
|
|
13
13
|
token?: string;
|
|
14
|
+
/** Display name from the auth provider, when available (Better Auth user.name). */
|
|
15
|
+
name?: string;
|
|
14
16
|
/** Active organization ID (from Better Auth organization plugin) */
|
|
15
17
|
orgId?: string;
|
|
16
18
|
/** User's role in the active organization (owner/admin/member) */
|
|
@@ -60,6 +62,19 @@ export interface AuthOptions {
|
|
|
60
62
|
betterAuth?: BetterAuthConfig;
|
|
61
63
|
}
|
|
62
64
|
export declare const COOKIE_NAME: string;
|
|
65
|
+
/**
|
|
66
|
+
* Validate a `?return=` URL for the /_agent-native/sign-in entrypoint.
|
|
67
|
+
*
|
|
68
|
+
* Parses the candidate against a sentinel base origin; any input that
|
|
69
|
+
* resolves to a different origin (network-path references, absolute URLs,
|
|
70
|
+
* `data:` / `javascript:` schemes, backslash-bypass tricks WHATWG normalises
|
|
71
|
+
* to `//`) gets rejected and falls back to "/". Control characters are
|
|
72
|
+
* stripped up front to defend against header-injection. Returns the
|
|
73
|
+
* normalised path the parser produced — never the raw input.
|
|
74
|
+
*
|
|
75
|
+
* Exported for unit tests.
|
|
76
|
+
*/
|
|
77
|
+
export declare function safeReturnPath(raw: string | null | undefined): string;
|
|
63
78
|
/**
|
|
64
79
|
* Create a new session in the legacy sessions table.
|
|
65
80
|
* Used by google-oauth.ts for mobile deep linking.
|
|
@@ -72,6 +87,7 @@ export declare function removeSession(token: string): Promise<void>;
|
|
|
72
87
|
* Returns null if the session doesn't exist, is expired, or has no email.
|
|
73
88
|
*/
|
|
74
89
|
export declare function getSessionEmail(token: string): Promise<string | null>;
|
|
90
|
+
export declare function setDesktopExchange(flowId: string, token: string, email: string): void;
|
|
75
91
|
/**
|
|
76
92
|
* Run the auth guard on an event. Returns a Response/object to block the
|
|
77
93
|
* request (login page or 401), or undefined to allow it through.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAOhE,KAAK,KAAK,GAAG,SAAS,CAAC;AASvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAmBlE;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAMD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC7D;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE;QACV,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF;;OAEG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAqBD,eAAO,MAAM,WAAW,QAER,CAAC;AA8DjB;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAUrE;AAyFD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7E;AAED,uDAAuD;AACvD,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAShE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmB3E;AAwCD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,QAWd;AA8ED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,CAG5C;AA0MD;;;;;;;;;;;;GAYG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA0I5E;AAyiCD;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,KAAK,EACV,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,OAAO,CAAC,CA4KlB;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAEzE"}
|
package/dist/server/auth.js
CHANGED
|
@@ -9,7 +9,7 @@ async function getFs() {
|
|
|
9
9
|
}
|
|
10
10
|
return _fs;
|
|
11
11
|
}
|
|
12
|
-
import { defineEventHandler, getMethod, getQuery, setResponseHeader, setResponseStatus, getCookie, setCookie, deleteCookie, } from "h3";
|
|
12
|
+
import { defineEventHandler, getMethod, getQuery, sendRedirect, setResponseHeader, setResponseStatus, getCookie, setCookie, deleteCookie, } from "h3";
|
|
13
13
|
// In h3 v2, `event.req` IS the web Request — no conversion needed.
|
|
14
14
|
function toWebRequest(event) {
|
|
15
15
|
return event.req;
|
|
@@ -20,7 +20,7 @@ import { getOnboardingHtml, getResetPasswordHtml } from "./onboarding-html.js";
|
|
|
20
20
|
import { migrateLocalUserData } from "./local-migration.js";
|
|
21
21
|
import { readBody } from "../server/h3-helpers.js";
|
|
22
22
|
import { readDesktopSso, writeDesktopSso, clearDesktopSso, } from "./desktop-sso.js";
|
|
23
|
-
import { isElectron as isElectronRequest } from "./google-oauth.js";
|
|
23
|
+
import { isElectron as isElectronRequest, getOrigin, encodeOAuthState, decodeOAuthState, createOAuthSession, oauthCallbackResponse, oauthErrorPage, } from "./google-oauth.js";
|
|
24
24
|
/**
|
|
25
25
|
* Get the configured session max age. Desktop SSO broker writes from
|
|
26
26
|
* OAuth flows read this so expiration stays consistent with the cookie.
|
|
@@ -99,6 +99,33 @@ function isDevEnvironment() {
|
|
|
99
99
|
const env = process.env.NODE_ENV;
|
|
100
100
|
return env === "development" || env === "test";
|
|
101
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* Validate a `?return=` URL for the /_agent-native/sign-in entrypoint.
|
|
104
|
+
*
|
|
105
|
+
* Parses the candidate against a sentinel base origin; any input that
|
|
106
|
+
* resolves to a different origin (network-path references, absolute URLs,
|
|
107
|
+
* `data:` / `javascript:` schemes, backslash-bypass tricks WHATWG normalises
|
|
108
|
+
* to `//`) gets rejected and falls back to "/". Control characters are
|
|
109
|
+
* stripped up front to defend against header-injection. Returns the
|
|
110
|
+
* normalised path the parser produced — never the raw input.
|
|
111
|
+
*
|
|
112
|
+
* Exported for unit tests.
|
|
113
|
+
*/
|
|
114
|
+
export function safeReturnPath(raw) {
|
|
115
|
+
if (!raw)
|
|
116
|
+
return "/";
|
|
117
|
+
if (/[\x00-\x1f]/.test(raw))
|
|
118
|
+
return "/";
|
|
119
|
+
try {
|
|
120
|
+
const parsed = new URL(raw, "http://safe-base.invalid");
|
|
121
|
+
if (parsed.origin !== "http://safe-base.invalid")
|
|
122
|
+
return "/";
|
|
123
|
+
return parsed.pathname + parsed.search + parsed.hash;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return "/";
|
|
127
|
+
}
|
|
128
|
+
}
|
|
102
129
|
// ---------------------------------------------------------------------------
|
|
103
130
|
// ACCESS_TOKEN resolution
|
|
104
131
|
// ---------------------------------------------------------------------------
|
|
@@ -233,6 +260,83 @@ export async function getSessionEmail(token) {
|
|
|
233
260
|
let customGetSession = null;
|
|
234
261
|
let authDisabledMode = false;
|
|
235
262
|
let _authGuardConfig = null;
|
|
263
|
+
// Desktop OAuth exchange store — holds session tokens keyed by a unique flow
|
|
264
|
+
// ID so native apps (Tauri, Electron) that open OAuth in the system browser
|
|
265
|
+
// can retrieve the token after the callback completes on the server.
|
|
266
|
+
//
|
|
267
|
+
// Primary: in-memory Map (fast, works for single-instance dev/preview builds).
|
|
268
|
+
// Fallback: sessions table with a "dex:" prefixed key for cross-instance
|
|
269
|
+
// durability (Cloudflare Workers, multi-region deployments). The value stored
|
|
270
|
+
// in the `email` column is "{realToken}::{userEmail}" so both can be recovered
|
|
271
|
+
// from a single DB lookup.
|
|
272
|
+
const _desktopExchanges = new Map();
|
|
273
|
+
// 5-minute TTL for exchange entries (short — single-use tokens).
|
|
274
|
+
const DESKTOP_EXCHANGE_TTL_MS = 5 * 60 * 1000;
|
|
275
|
+
export function setDesktopExchange(flowId, token, email) {
|
|
276
|
+
_desktopExchanges.set(flowId, {
|
|
277
|
+
token,
|
|
278
|
+
email,
|
|
279
|
+
expiresAt: Date.now() + DESKTOP_EXCHANGE_TTL_MS,
|
|
280
|
+
});
|
|
281
|
+
// Persist to DB so the token survives cross-instance routing (e.g. when
|
|
282
|
+
// templates call this helper directly instead of going through the OAuth
|
|
283
|
+
// callback path).
|
|
284
|
+
void persistDesktopExchangeToDB(flowId, token, email);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Persist a desktop exchange entry to the sessions table so it survives
|
|
288
|
+
* cross-instance routing (e.g. Cloudflare Workers). Stored under a synthetic
|
|
289
|
+
* token key "dex:{flowId}"; the `email` column packs both the real session
|
|
290
|
+
* token and the user email so they can be recovered in one query.
|
|
291
|
+
* Non-fatal — if the DB isn't ready yet the in-memory Map still works for
|
|
292
|
+
* same-instance requests.
|
|
293
|
+
*/
|
|
294
|
+
async function persistDesktopExchangeToDB(flowId, token, email) {
|
|
295
|
+
try {
|
|
296
|
+
await addSession(`dex:${flowId}`, `${token}::${email}`);
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
// non-fatal — in-memory Map is the primary path
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Retrieve and consume a desktop exchange entry from the DB fallback.
|
|
304
|
+
* Returns null if not found or already consumed.
|
|
305
|
+
*/
|
|
306
|
+
async function consumeDesktopExchangeFromDB(flowId) {
|
|
307
|
+
try {
|
|
308
|
+
// Atomic DELETE...RETURNING prevents token replay: two concurrent polls
|
|
309
|
+
// cannot both retrieve the token because only one DELETE will match the row.
|
|
310
|
+
// SQLite ≥3.35 and PostgreSQL both support this syntax.
|
|
311
|
+
// The created_at predicate enforces the 5-minute TTL so stale DB entries
|
|
312
|
+
// (e.g. the desktop app never polled) are rejected rather than silently
|
|
313
|
+
// redeemed with the session table's default 30-day TTL.
|
|
314
|
+
const client = getDbExec();
|
|
315
|
+
const { rows } = await client.execute({
|
|
316
|
+
sql: `DELETE FROM sessions WHERE token = ? AND created_at > ? RETURNING email`,
|
|
317
|
+
args: [`dex:${flowId}`, Date.now() - DESKTOP_EXCHANGE_TTL_MS],
|
|
318
|
+
});
|
|
319
|
+
if (rows.length === 0)
|
|
320
|
+
return null;
|
|
321
|
+
const packed = (rows[0].email ?? rows[0][0]);
|
|
322
|
+
if (!packed)
|
|
323
|
+
return null;
|
|
324
|
+
const sepIdx = packed.indexOf("::");
|
|
325
|
+
if (sepIdx === -1)
|
|
326
|
+
return null;
|
|
327
|
+
return { token: packed.slice(0, sepIdx), email: packed.slice(sepIdx + 2) };
|
|
328
|
+
}
|
|
329
|
+
catch {
|
|
330
|
+
return null;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
setInterval(() => {
|
|
334
|
+
const now = Date.now();
|
|
335
|
+
for (const [k, v] of _desktopExchanges) {
|
|
336
|
+
if (v.expiresAt < now)
|
|
337
|
+
_desktopExchanges.delete(k);
|
|
338
|
+
}
|
|
339
|
+
}, 60_000).unref?.();
|
|
236
340
|
/**
|
|
237
341
|
* Module-level auth guard function. Set by autoMountAuth() when auth is active.
|
|
238
342
|
* Called by the server middleware to enforce auth on ALL requests (not just
|
|
@@ -292,7 +396,7 @@ function applyCorsHeaders(event) {
|
|
|
292
396
|
.map((s) => s.trim())
|
|
293
397
|
.filter(Boolean);
|
|
294
398
|
const allowed = allowlist.length === 0
|
|
295
|
-
? /^https
|
|
399
|
+
? /^(https?|tauri):\/\/(localhost|127\.0\.0\.1|tauri\.localhost)(:\d+)?$/.test(origin)
|
|
296
400
|
: allowlist.includes(origin);
|
|
297
401
|
if (!allowed)
|
|
298
402
|
return;
|
|
@@ -327,6 +431,62 @@ function createAuthGuardFn() {
|
|
|
327
431
|
p === "/_agent-native/google/add-account/callback") {
|
|
328
432
|
return;
|
|
329
433
|
}
|
|
434
|
+
// Integration webhook endpoints verify authenticity via platform-specific
|
|
435
|
+
// signature verification (Slack HMAC, Telegram token, etc.), not sessions.
|
|
436
|
+
if (/^\/_agent-native\/integrations\/[^/]+\/webhook$/.test(p)) {
|
|
437
|
+
return;
|
|
438
|
+
}
|
|
439
|
+
// Internal processor endpoint for the integration webhook fanout. The
|
|
440
|
+
// webhook handler enqueues a task to SQL and dispatches a fresh HTTP POST
|
|
441
|
+
// to this endpoint so the agent loop runs in its own function execution
|
|
442
|
+
// (cross-platform serverless-safe — see `integrations/webhook-handler.ts`).
|
|
443
|
+
// Authenticity is verified via an HMAC token signed with A2A_SECRET, plus
|
|
444
|
+
// an atomic SQL claim that prevents duplicate processing.
|
|
445
|
+
if (p === "/_agent-native/integrations/process-task") {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
// A2A endpoint verifies authenticity via JWT signed with the org's A2A
|
|
449
|
+
// secret (or the global A2A_SECRET fallback), not via session cookies.
|
|
450
|
+
if (p === "/_agent-native/a2a") {
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
// A2A secret receive endpoint — verifies authenticity via JWT signed
|
|
454
|
+
// with the calling app's A2A secret, not via session cookies. Used to
|
|
455
|
+
// sync the org A2A secret across connected apps.
|
|
456
|
+
if (p === "/_agent-native/org/a2a-secret/receive") {
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
459
|
+
// Force-sign-in entrypoint. Templates send viewers from public pages
|
|
460
|
+
// (share links, embeds) here with a `?return=<path>` query — anonymous
|
|
461
|
+
// visitors get the loginHtml, and once they sign in the loginHtml's
|
|
462
|
+
// post-login reload re-hits this same URL with a session cookie set,
|
|
463
|
+
// so we 302 them to the original page.
|
|
464
|
+
//
|
|
465
|
+
// `return` is validated by parsing it against a sentinel base origin
|
|
466
|
+
// and checking the resolved origin still matches. This rejects every
|
|
467
|
+
// open-redirect shape — `//evil.com/...` (network-path reference),
|
|
468
|
+
// `/\evil.com/...` (WHATWG URL parser normalises `\` to `/` in HTTP
|
|
469
|
+
// URLs, so a naive prefix check on `//` misses this), absolute URLs
|
|
470
|
+
// like `https://evil.com`, and `data:` / `javascript:` schemes. The
|
|
471
|
+
// reconstructed path comes from the parsed segments so any leftover
|
|
472
|
+
// quirks get normalised. Control chars (incl. CR/LF for header
|
|
473
|
+
// injection) are rejected up front.
|
|
474
|
+
//
|
|
475
|
+
if (p === "/_agent-native/sign-in") {
|
|
476
|
+
const queryStr = url.includes("?") ? url.slice(url.indexOf("?") + 1) : "";
|
|
477
|
+
const safeReturn = safeReturnPath(new URLSearchParams(queryStr).get("return"));
|
|
478
|
+
const session = await getSession(event);
|
|
479
|
+
if (session) {
|
|
480
|
+
return new Response("", {
|
|
481
|
+
status: 302,
|
|
482
|
+
headers: { Location: safeReturn },
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
return new Response(loginHtml, {
|
|
486
|
+
status: 200,
|
|
487
|
+
headers: { "Content-Type": "text/html; charset=utf-8" },
|
|
488
|
+
});
|
|
489
|
+
}
|
|
330
490
|
// Skip static assets (Vite chunks, fonts, images, etc.)
|
|
331
491
|
if (p.startsWith("/assets/") ||
|
|
332
492
|
p.startsWith("/_build/") ||
|
|
@@ -362,6 +522,7 @@ function mapBetterAuthSession(baSession) {
|
|
|
362
522
|
return {
|
|
363
523
|
email: baSession.user.email,
|
|
364
524
|
userId: baSession.user.id,
|
|
525
|
+
name: baSession.user.name,
|
|
365
526
|
token: baSession.session?.token,
|
|
366
527
|
orgId: baSession.session?.activeOrganizationId ?? undefined,
|
|
367
528
|
};
|
|
@@ -768,7 +929,9 @@ async function mountBetterAuthRoutes(app, options) {
|
|
|
768
929
|
if (!publicPaths.includes(pp))
|
|
769
930
|
publicPaths.push(pp);
|
|
770
931
|
}
|
|
771
|
-
// Auto-add Google OAuth routes when credentials are configured
|
|
932
|
+
// Auto-add Google OAuth routes when credentials are configured.
|
|
933
|
+
// Templates can override by defining their own Nitro routes at the same
|
|
934
|
+
// paths (e.g. mail/calendar need broader scopes for API access).
|
|
772
935
|
if (process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET) {
|
|
773
936
|
for (const gp of [
|
|
774
937
|
"/_agent-native/google/callback",
|
|
@@ -777,13 +940,213 @@ async function mountBetterAuthRoutes(app, options) {
|
|
|
777
940
|
if (!publicPaths.includes(gp))
|
|
778
941
|
publicPaths.push(gp);
|
|
779
942
|
}
|
|
943
|
+
const googleScopes = [
|
|
944
|
+
"openid",
|
|
945
|
+
"https://www.googleapis.com/auth/userinfo.email",
|
|
946
|
+
"https://www.googleapis.com/auth/userinfo.profile",
|
|
947
|
+
].join(" ");
|
|
948
|
+
app.use("/_agent-native/google/auth-url", defineEventHandler((event) => {
|
|
949
|
+
if (getMethod(event) !== "GET") {
|
|
950
|
+
setResponseStatus(event, 405);
|
|
951
|
+
return { error: "Method not allowed" };
|
|
952
|
+
}
|
|
953
|
+
const redirectUri = getQuery(event).redirect_uri ||
|
|
954
|
+
`${getOrigin(event)}/_agent-native/google/callback`;
|
|
955
|
+
const q = getQuery(event);
|
|
956
|
+
const desktop = isElectronRequest(event) || q.desktop === "1" || q.desktop === "true";
|
|
957
|
+
const flowId = desktop ? q.flow_id || undefined : undefined;
|
|
958
|
+
// Validate the caller's return param up front and only embed it
|
|
959
|
+
// into the OAuth state when it normalises to a non-root path —
|
|
960
|
+
// skip embedding "/" (the default fallback) so the state stays
|
|
961
|
+
// small for the common case.
|
|
962
|
+
const returnQuery = q.return;
|
|
963
|
+
const validated = typeof returnQuery === "string" ? safeReturnPath(returnQuery) : "/";
|
|
964
|
+
const returnUrl = validated !== "/" ? validated : undefined;
|
|
965
|
+
const state = encodeOAuthState(redirectUri, undefined, desktop, false, undefined, returnUrl, flowId);
|
|
966
|
+
const params = new URLSearchParams({
|
|
967
|
+
client_id: process.env.GOOGLE_CLIENT_ID,
|
|
968
|
+
redirect_uri: redirectUri,
|
|
969
|
+
response_type: "code",
|
|
970
|
+
scope: googleScopes,
|
|
971
|
+
access_type: "online",
|
|
972
|
+
prompt: "select_account",
|
|
973
|
+
state,
|
|
974
|
+
});
|
|
975
|
+
const authUrl = `https://accounts.google.com/o/oauth2/v2/auth?${params}`;
|
|
976
|
+
if (q.redirect === "1") {
|
|
977
|
+
return sendRedirect(event, authUrl, 302);
|
|
978
|
+
}
|
|
979
|
+
return { url: authUrl };
|
|
980
|
+
}));
|
|
981
|
+
app.use("/_agent-native/google/callback", defineEventHandler(async (event) => {
|
|
982
|
+
if (getMethod(event) !== "GET") {
|
|
983
|
+
setResponseStatus(event, 405);
|
|
984
|
+
return { error: "Method not allowed" };
|
|
985
|
+
}
|
|
986
|
+
try {
|
|
987
|
+
const query = getQuery(event);
|
|
988
|
+
const code = query.code;
|
|
989
|
+
if (!code) {
|
|
990
|
+
setResponseStatus(event, 400);
|
|
991
|
+
return { error: "Missing authorization code" };
|
|
992
|
+
}
|
|
993
|
+
const { redirectUri, desktop, returnUrl, flowId } = decodeOAuthState(query.state, `${getOrigin(event)}/_agent-native/google/callback`);
|
|
994
|
+
const tokenRes = await fetch("https://oauth2.googleapis.com/token", {
|
|
995
|
+
method: "POST",
|
|
996
|
+
headers: {
|
|
997
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
998
|
+
},
|
|
999
|
+
body: new URLSearchParams({
|
|
1000
|
+
code,
|
|
1001
|
+
client_id: process.env.GOOGLE_CLIENT_ID,
|
|
1002
|
+
client_secret: process.env.GOOGLE_CLIENT_SECRET,
|
|
1003
|
+
redirect_uri: redirectUri,
|
|
1004
|
+
grant_type: "authorization_code",
|
|
1005
|
+
}),
|
|
1006
|
+
});
|
|
1007
|
+
const tokens = await tokenRes.json();
|
|
1008
|
+
if (!tokenRes.ok) {
|
|
1009
|
+
throw new Error(tokens.error_description ||
|
|
1010
|
+
tokens.error ||
|
|
1011
|
+
"Token exchange failed");
|
|
1012
|
+
}
|
|
1013
|
+
const userRes = await fetch("https://www.googleapis.com/oauth2/v2/userinfo", { headers: { Authorization: `Bearer ${tokens.access_token}` } });
|
|
1014
|
+
const user = await userRes.json();
|
|
1015
|
+
const email = user.email;
|
|
1016
|
+
if (!email)
|
|
1017
|
+
throw new Error("Could not get email from Google");
|
|
1018
|
+
const { sessionToken } = await createOAuthSession(event, email, {
|
|
1019
|
+
hasProductionSession: false,
|
|
1020
|
+
desktop,
|
|
1021
|
+
});
|
|
1022
|
+
if (flowId && sessionToken) {
|
|
1023
|
+
_desktopExchanges.set(flowId, {
|
|
1024
|
+
token: sessionToken,
|
|
1025
|
+
email,
|
|
1026
|
+
expiresAt: Date.now() + DESKTOP_EXCHANGE_TTL_MS,
|
|
1027
|
+
});
|
|
1028
|
+
// Also persist to DB for cross-instance durability (Cloudflare
|
|
1029
|
+
// Workers, multi-region). Fire-and-forget — in-memory Map is
|
|
1030
|
+
// still the primary fast path for same-instance requests.
|
|
1031
|
+
void persistDesktopExchangeToDB(flowId, sessionToken, email);
|
|
1032
|
+
}
|
|
1033
|
+
return oauthCallbackResponse(event, email, {
|
|
1034
|
+
sessionToken,
|
|
1035
|
+
desktop,
|
|
1036
|
+
returnUrl,
|
|
1037
|
+
flowId,
|
|
1038
|
+
});
|
|
1039
|
+
}
|
|
1040
|
+
catch (error) {
|
|
1041
|
+
const msg = error.message || "Unknown error";
|
|
1042
|
+
return oauthErrorPage(`Connection failed: ${msg}`);
|
|
1043
|
+
}
|
|
1044
|
+
}));
|
|
780
1045
|
}
|
|
1046
|
+
// Desktop OAuth exchange — native apps (Tauri tray, Electron) open OAuth
|
|
1047
|
+
// in the system browser but need a way to retrieve the session token
|
|
1048
|
+
// afterwards since they don't share a cookie jar with the browser.
|
|
1049
|
+
app.use("/_agent-native/auth/desktop-exchange", defineEventHandler(async (event) => {
|
|
1050
|
+
if (getMethod(event) !== "GET") {
|
|
1051
|
+
setResponseStatus(event, 405);
|
|
1052
|
+
return { error: "Method not allowed" };
|
|
1053
|
+
}
|
|
1054
|
+
const flowId = getQuery(event).flow_id;
|
|
1055
|
+
if (!flowId) {
|
|
1056
|
+
setResponseStatus(event, 400);
|
|
1057
|
+
return { error: "Missing flow_id" };
|
|
1058
|
+
}
|
|
1059
|
+
let entry = _desktopExchanges.get(flowId);
|
|
1060
|
+
if (!entry || entry.expiresAt < Date.now()) {
|
|
1061
|
+
// In-memory miss — fall back to the DB-persisted entry. This handles
|
|
1062
|
+
// cross-instance routing (Cloudflare Workers, multi-region) where the
|
|
1063
|
+
// OAuth callback and the polling request may hit different isolates.
|
|
1064
|
+
const fromDb = await consumeDesktopExchangeFromDB(flowId);
|
|
1065
|
+
if (!fromDb) {
|
|
1066
|
+
return { pending: true };
|
|
1067
|
+
}
|
|
1068
|
+
entry = {
|
|
1069
|
+
token: fromDb.token,
|
|
1070
|
+
email: fromDb.email,
|
|
1071
|
+
expiresAt: Date.now() + 1, // already consumed from DB
|
|
1072
|
+
};
|
|
1073
|
+
}
|
|
1074
|
+
_desktopExchanges.delete(flowId);
|
|
1075
|
+
// Also wipe the DB-persisted entry so it cannot be replayed via the
|
|
1076
|
+
// DB fallback path after in-memory consumption.
|
|
1077
|
+
void removeSession(`dex:${flowId}`);
|
|
1078
|
+
return { token: entry.token, email: entry.email };
|
|
1079
|
+
}));
|
|
781
1080
|
const accessTokens = getAccessTokens();
|
|
782
1081
|
// Initialize Better Auth
|
|
783
1082
|
const auth = await getBetterAuth(options.betterAuth);
|
|
784
1083
|
// Mount Better Auth catch-all handler at /_agent-native/auth/ba/*
|
|
785
1084
|
app.use("/_agent-native/auth/ba", defineEventHandler(async (event) => {
|
|
1085
|
+
const reqPath = event.url?.pathname ?? event.path ?? "";
|
|
1086
|
+
const isResetPassword = reqPath.includes("reset-password") && getMethod(event) === "POST";
|
|
1087
|
+
// Pre-read the body for reset-password so we can extract the
|
|
1088
|
+
// token after Better Auth consumes the stream.
|
|
1089
|
+
let resetToken;
|
|
1090
|
+
if (isResetPassword) {
|
|
1091
|
+
try {
|
|
1092
|
+
const body = await readBody(event);
|
|
1093
|
+
resetToken = body?.token;
|
|
1094
|
+
}
|
|
1095
|
+
catch {
|
|
1096
|
+
// ignore — Better Auth will handle validation
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
786
1099
|
const response = await auth.handler(toWebRequest(event));
|
|
1100
|
+
const isResponse = response != null &&
|
|
1101
|
+
typeof response.status === "number" &&
|
|
1102
|
+
typeof response.headers?.get === "function";
|
|
1103
|
+
// After email verification, add ?verified to the redirect so the
|
|
1104
|
+
// login page can show a "Email verified!" success message.
|
|
1105
|
+
if (reqPath.includes("verify-email") &&
|
|
1106
|
+
isResponse &&
|
|
1107
|
+
response.status >= 300 &&
|
|
1108
|
+
response.status < 400) {
|
|
1109
|
+
const loc = response.headers.get("location");
|
|
1110
|
+
if (loc && !/[?&]verified=/.test(loc)) {
|
|
1111
|
+
const sep = loc.includes("?") ? "&" : "?";
|
|
1112
|
+
const newResponse = new Response(null, {
|
|
1113
|
+
status: response.status,
|
|
1114
|
+
headers: new Headers(response.headers),
|
|
1115
|
+
});
|
|
1116
|
+
newResponse.headers.set("location", loc + sep + "verified=1");
|
|
1117
|
+
return newResponse;
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
// Auto-verify email after a successful password reset. The user
|
|
1121
|
+
// proved email ownership by receiving and using the reset link.
|
|
1122
|
+
if (isResetPassword &&
|
|
1123
|
+
resetToken &&
|
|
1124
|
+
isResponse &&
|
|
1125
|
+
response.status >= 200 &&
|
|
1126
|
+
response.status < 300) {
|
|
1127
|
+
try {
|
|
1128
|
+
const { getDbExec } = await import("../db/client.js");
|
|
1129
|
+
const db = getDbExec();
|
|
1130
|
+
// Better Auth stores the reset token in its `verification`
|
|
1131
|
+
// table with the user's identifier. Look up the user via the
|
|
1132
|
+
// token and mark their email as verified — they proved
|
|
1133
|
+
// ownership by receiving and using the email-delivered link.
|
|
1134
|
+
const rows = await db.execute({
|
|
1135
|
+
sql: "SELECT identifier FROM verification WHERE value = ?",
|
|
1136
|
+
args: [resetToken],
|
|
1137
|
+
});
|
|
1138
|
+
const email = rows.rows[0]?.identifier;
|
|
1139
|
+
if (email) {
|
|
1140
|
+
await db.execute({
|
|
1141
|
+
sql: "UPDATE user SET email_verified = 1 WHERE email = ? AND (email_verified = 0 OR email_verified IS NULL)",
|
|
1142
|
+
args: [email],
|
|
1143
|
+
});
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
catch {
|
|
1147
|
+
// Best-effort — don't block the response
|
|
1148
|
+
}
|
|
1149
|
+
}
|
|
787
1150
|
return response;
|
|
788
1151
|
}));
|
|
789
1152
|
// POST /_agent-native/auth/local-mode — switch to local mode (onboarding escape hatch)
|
|
@@ -1315,7 +1678,8 @@ export async function autoMountAuth(app, options = {}) {
|
|
|
1315
1678
|
const guardFn = createAuthGuardFn();
|
|
1316
1679
|
_authGuardFn = guardFn;
|
|
1317
1680
|
app.use(defineEventHandler(guardFn));
|
|
1318
|
-
|
|
1681
|
+
if (process.env.DEBUG)
|
|
1682
|
+
console.log("[agent-native] Auth enabled — custom getSession provider.");
|
|
1319
1683
|
return true;
|
|
1320
1684
|
}
|
|
1321
1685
|
// AUTH_DISABLED — skip auth (infrastructure-level auth)
|
|
@@ -1330,13 +1694,15 @@ export async function autoMountAuth(app, options = {}) {
|
|
|
1330
1694
|
const tokens = getAccessTokens();
|
|
1331
1695
|
if (tokens.length > 0) {
|
|
1332
1696
|
mountTokenOnlyRoutes(app, tokens, publicPaths);
|
|
1333
|
-
|
|
1697
|
+
if (process.env.DEBUG)
|
|
1698
|
+
console.log(`[agent-native] Auth enabled — ${tokens.length} access token(s) configured.`);
|
|
1334
1699
|
return true;
|
|
1335
1700
|
}
|
|
1336
1701
|
// Default: Better Auth (account-first)
|
|
1337
1702
|
try {
|
|
1338
1703
|
await mountBetterAuthRoutes(app, options);
|
|
1339
|
-
|
|
1704
|
+
if (process.env.DEBUG)
|
|
1705
|
+
console.log("[agent-native] Auth enabled — Better Auth (accounts + organizations).");
|
|
1340
1706
|
}
|
|
1341
1707
|
catch (err) {
|
|
1342
1708
|
console.error("[agent-native] Failed to initialize Better Auth:", err);
|