@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/org/handlers.js
CHANGED
|
@@ -49,7 +49,7 @@ async function exec() {
|
|
|
49
49
|
}
|
|
50
50
|
function requireAuthEmail(session) {
|
|
51
51
|
const email = session?.email;
|
|
52
|
-
if (!email
|
|
52
|
+
if (!email) {
|
|
53
53
|
throw createError({ statusCode: 401, message: "Authentication required" });
|
|
54
54
|
}
|
|
55
55
|
return email;
|
|
@@ -57,16 +57,6 @@ function requireAuthEmail(session) {
|
|
|
57
57
|
/** GET /_agent-native/org/me — current user's active org, all orgs, pending invitations */
|
|
58
58
|
export const getMyOrgHandler = defineEventHandler(async (event) => {
|
|
59
59
|
const ctx = await getOrgContext(event);
|
|
60
|
-
if (ctx.email === "local@localhost") {
|
|
61
|
-
return {
|
|
62
|
-
email: ctx.email,
|
|
63
|
-
orgId: null,
|
|
64
|
-
orgName: null,
|
|
65
|
-
role: null,
|
|
66
|
-
orgs: [],
|
|
67
|
-
pendingInvitations: [],
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
60
|
const e = await exec();
|
|
71
61
|
const allOrgsRes = await e.execute({
|
|
72
62
|
sql: `SELECT m.org_id AS "orgId", m.role AS role, o.name AS "orgName"
|
|
@@ -80,12 +70,54 @@ export const getMyOrgHandler = defineEventHandler(async (event) => {
|
|
|
80
70
|
role: String(r.role),
|
|
81
71
|
orgName: String(r.orgName ?? r.org_name),
|
|
82
72
|
}));
|
|
73
|
+
let domainMatches = [];
|
|
74
|
+
if (!ctx.orgId) {
|
|
75
|
+
const domain = ctx.email.split("@")[1]?.toLowerCase();
|
|
76
|
+
if (domain) {
|
|
77
|
+
try {
|
|
78
|
+
const dmRes = await e.execute({
|
|
79
|
+
sql: `SELECT id, name FROM organizations WHERE LOWER(allowed_domain) = ?`,
|
|
80
|
+
args: [domain],
|
|
81
|
+
});
|
|
82
|
+
domainMatches = dmRes.rows.map((r) => ({
|
|
83
|
+
orgId: String(r.id),
|
|
84
|
+
orgName: String(r.name),
|
|
85
|
+
}));
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// allowed_domain column may not exist yet if migration hasn't run
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
let allowedDomain = null;
|
|
93
|
+
let a2aSecret = null;
|
|
94
|
+
if (ctx.orgId) {
|
|
95
|
+
try {
|
|
96
|
+
const adRes = await e.execute({
|
|
97
|
+
sql: `SELECT allowed_domain, a2a_secret FROM organizations WHERE id = ? LIMIT 1`,
|
|
98
|
+
args: [ctx.orgId],
|
|
99
|
+
});
|
|
100
|
+
if (adRes.rows[0]) {
|
|
101
|
+
allowedDomain =
|
|
102
|
+
String(adRes.rows[0].allowed_domain ?? "") || null;
|
|
103
|
+
a2aSecret = String(adRes.rows[0].a2a_secret ?? "") || null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Column may not exist yet
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const isOwnerOrAdmin = ctx.role === "owner" || ctx.role === "admin";
|
|
83
111
|
const invitesRes = await e.execute({
|
|
112
|
+
// Case-insensitive match: invitations are stored with whatever case
|
|
113
|
+
// the inviter typed, but the session email may be normalized
|
|
114
|
+
// differently by the auth provider. LOWER(both sides) keeps these
|
|
115
|
+
// discoverable and matches getOrgContext.hasPendingInvitation.
|
|
84
116
|
sql: `SELECT i.id AS id, i.org_id AS "orgId", o.name AS "orgName", i.invited_by AS "invitedBy"
|
|
85
117
|
FROM org_invitations i
|
|
86
118
|
INNER JOIN organizations o ON i.org_id = o.id
|
|
87
|
-
WHERE i.email = ? AND i.status = 'pending'`,
|
|
88
|
-
args: [ctx.email],
|
|
119
|
+
WHERE LOWER(i.email) = ? AND i.status = 'pending'`,
|
|
120
|
+
args: [ctx.email.toLowerCase()],
|
|
89
121
|
});
|
|
90
122
|
const pendingInvitations = invitesRes.rows.map((r) => ({
|
|
91
123
|
id: String(r.id),
|
|
@@ -100,6 +132,9 @@ export const getMyOrgHandler = defineEventHandler(async (event) => {
|
|
|
100
132
|
role: ctx.role,
|
|
101
133
|
orgs,
|
|
102
134
|
pendingInvitations,
|
|
135
|
+
domainMatches,
|
|
136
|
+
allowedDomain,
|
|
137
|
+
a2aSecret: isOwnerOrAdmin ? a2aSecret : undefined,
|
|
103
138
|
};
|
|
104
139
|
});
|
|
105
140
|
/** POST /_agent-native/org — create a new organization */
|
|
@@ -117,9 +152,12 @@ export const createOrgHandler = defineEventHandler(async (event) => {
|
|
|
117
152
|
const orgId = nanoid();
|
|
118
153
|
const now = Date.now();
|
|
119
154
|
const e = await exec();
|
|
155
|
+
// Auto-generate a per-org A2A secret for cross-app delegation
|
|
156
|
+
const { randomBytes } = await import("node:crypto");
|
|
157
|
+
const a2aSecret = randomBytes(32).toString("base64url");
|
|
120
158
|
await e.execute({
|
|
121
|
-
sql: `INSERT INTO organizations (id, name, created_by, created_at) VALUES (?, ?, ?, ?)`,
|
|
122
|
-
args: [orgId, name, email, now],
|
|
159
|
+
sql: `INSERT INTO organizations (id, name, created_by, created_at, a2a_secret) VALUES (?, ?, ?, ?, ?)`,
|
|
160
|
+
args: [orgId, name, email, now, a2aSecret],
|
|
123
161
|
});
|
|
124
162
|
await e.execute({
|
|
125
163
|
sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, ?, ?)`,
|
|
@@ -166,9 +204,16 @@ export const createInvitationHandler = defineEventHandler(async (event) => {
|
|
|
166
204
|
throw createError({ statusCode: 400, message: "Email is required" });
|
|
167
205
|
}
|
|
168
206
|
const e = await exec();
|
|
207
|
+
// Existing rows in org_members / org_invitations may have any case
|
|
208
|
+
// (writes haven't been normalized historically). Compare with LOWER
|
|
209
|
+
// on both sides so an "alice@..." invite check correctly recognizes
|
|
210
|
+
// an existing "Alice@..." membership. `email` is already lowercased
|
|
211
|
+
// at parse time above, but call .toLowerCase() explicitly here so
|
|
212
|
+
// the contract at the SQL boundary matches every other handler in
|
|
213
|
+
// this file.
|
|
169
214
|
const existingMember = await e.execute({
|
|
170
|
-
sql: `SELECT 1 FROM org_members WHERE org_id = ? AND email = ? LIMIT 1`,
|
|
171
|
-
args: [ctx.orgId, email],
|
|
215
|
+
sql: `SELECT 1 FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,
|
|
216
|
+
args: [ctx.orgId, email.toLowerCase()],
|
|
172
217
|
});
|
|
173
218
|
if (existingMember.rows.length > 0) {
|
|
174
219
|
throw createError({
|
|
@@ -177,8 +222,8 @@ export const createInvitationHandler = defineEventHandler(async (event) => {
|
|
|
177
222
|
});
|
|
178
223
|
}
|
|
179
224
|
const existingInvite = await e.execute({
|
|
180
|
-
sql: `SELECT 1 FROM org_invitations WHERE org_id = ? AND email = ? AND status = 'pending' LIMIT 1`,
|
|
181
|
-
args: [ctx.orgId, email],
|
|
225
|
+
sql: `SELECT 1 FROM org_invitations WHERE org_id = ? AND LOWER(email) = ? AND status = 'pending' LIMIT 1`,
|
|
226
|
+
args: [ctx.orgId, email.toLowerCase()],
|
|
182
227
|
});
|
|
183
228
|
if (existingInvite.rows.length > 0) {
|
|
184
229
|
throw createError({
|
|
@@ -245,9 +290,11 @@ export const acceptInvitationHandler = defineEventHandler(async (event) => {
|
|
|
245
290
|
}
|
|
246
291
|
const e = await exec();
|
|
247
292
|
const invRes = await e.execute({
|
|
293
|
+
// Case-insensitive on email — see comment on the analogous
|
|
294
|
+
// pending-invitations query in getMyOrgHandler.
|
|
248
295
|
sql: `SELECT id, org_id AS "orgId" FROM org_invitations
|
|
249
|
-
WHERE id = ? AND email = ? AND status = 'pending' LIMIT 1`,
|
|
250
|
-
args: [invitationId, email],
|
|
296
|
+
WHERE id = ? AND LOWER(email) = ? AND status = 'pending' LIMIT 1`,
|
|
297
|
+
args: [invitationId, email.toLowerCase()],
|
|
251
298
|
});
|
|
252
299
|
if (invRes.rows.length === 0) {
|
|
253
300
|
throw createError({
|
|
@@ -258,8 +305,8 @@ export const acceptInvitationHandler = defineEventHandler(async (event) => {
|
|
|
258
305
|
const inv = invRes.rows[0];
|
|
259
306
|
const invOrgId = String(inv.orgId ?? inv.org_id);
|
|
260
307
|
const existingMembership = await e.execute({
|
|
261
|
-
sql: `SELECT role FROM org_members WHERE org_id = ? AND email = ? LIMIT 1`,
|
|
262
|
-
args: [invOrgId, email],
|
|
308
|
+
sql: `SELECT role FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,
|
|
309
|
+
args: [invOrgId, email.toLowerCase()],
|
|
263
310
|
});
|
|
264
311
|
const orgRes = await e.execute({
|
|
265
312
|
sql: `SELECT name FROM organizations WHERE id = ? LIMIT 1`,
|
|
@@ -305,29 +352,72 @@ export const removeMemberHandler = defineEventHandler(async (event) => {
|
|
|
305
352
|
if (!memberEmail) {
|
|
306
353
|
throw createError({ statusCode: 400, message: "Email is required" });
|
|
307
354
|
}
|
|
308
|
-
|
|
355
|
+
// memberEmail comes from the URL path verbatim; org_members may
|
|
356
|
+
// hold the row with any case. LOWER both sides for the lookup AND
|
|
357
|
+
// the DELETE so removal works regardless of how either side cased
|
|
358
|
+
// it. The self-removal guard ALSO compares case-insensitively —
|
|
359
|
+
// otherwise an owner whose email was stored as Alice@... could
|
|
360
|
+
// remove themselves via the lowercase URL alice@..., bypassing the
|
|
361
|
+
// guard and leaving the org ownerless.
|
|
362
|
+
const memberEmailLower = memberEmail.toLowerCase();
|
|
363
|
+
if (memberEmailLower === ctx.email.toLowerCase() && ctx.role === "owner") {
|
|
309
364
|
throw createError({
|
|
310
365
|
statusCode: 400,
|
|
311
366
|
message: "Organization owner cannot remove themselves",
|
|
312
367
|
});
|
|
313
368
|
}
|
|
314
369
|
const e = await exec();
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
370
|
+
// Look specifically for an OWNER row matching this email rather
|
|
371
|
+
// than just "any matching row". Duplicate-case rows are possible
|
|
372
|
+
// (e.g. legacy data with both "Alice@..." and "alice@..." in
|
|
373
|
+
// org_members), and the prior `SELECT role ... LIMIT 1` could
|
|
374
|
+
// return the non-owner duplicate, pass the role check, and then
|
|
375
|
+
// the case-insensitive DELETE below would remove BOTH rows —
|
|
376
|
+
// including the owner — leaving the org ownerless. Querying for
|
|
377
|
+
// the owner row directly closes that case-mismatch attack.
|
|
378
|
+
const ownerCheck = await e.execute({
|
|
379
|
+
sql: `SELECT 1 FROM org_members WHERE org_id = ? AND LOWER(email) = ? AND role = 'owner' LIMIT 1`,
|
|
380
|
+
args: [ctx.orgId, memberEmailLower],
|
|
318
381
|
});
|
|
319
|
-
if (
|
|
382
|
+
if (ownerCheck.rows.length > 0) {
|
|
320
383
|
throw createError({
|
|
321
384
|
statusCode: 403,
|
|
322
385
|
message: "Cannot remove the organization owner",
|
|
323
386
|
});
|
|
324
387
|
}
|
|
325
388
|
await e.execute({
|
|
326
|
-
sql: `DELETE FROM org_members WHERE org_id = ? AND email = ?`,
|
|
327
|
-
args: [ctx.orgId,
|
|
389
|
+
sql: `DELETE FROM org_members WHERE org_id = ? AND LOWER(email) = ?`,
|
|
390
|
+
args: [ctx.orgId, memberEmailLower],
|
|
328
391
|
});
|
|
329
392
|
return { success: true };
|
|
330
393
|
});
|
|
394
|
+
/** PATCH /_agent-native/org — rename the current organization (owner/admin only) */
|
|
395
|
+
export const updateOrgHandler = defineEventHandler(async (event) => {
|
|
396
|
+
const ctx = await getOrgContext(event);
|
|
397
|
+
if (!ctx.orgId) {
|
|
398
|
+
throw createError({ statusCode: 400, message: "No organization found" });
|
|
399
|
+
}
|
|
400
|
+
if (ctx.role !== "owner" && ctx.role !== "admin") {
|
|
401
|
+
throw createError({
|
|
402
|
+
statusCode: 403,
|
|
403
|
+
message: "Only owners and admins can update the organization",
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
const body = await readBody(event);
|
|
407
|
+
const name = body?.name?.trim();
|
|
408
|
+
if (!name) {
|
|
409
|
+
throw createError({
|
|
410
|
+
statusCode: 400,
|
|
411
|
+
message: "Organization name is required",
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
const e = await exec();
|
|
415
|
+
await e.execute({
|
|
416
|
+
sql: `UPDATE organizations SET name = ? WHERE id = ?`,
|
|
417
|
+
args: [name, ctx.orgId],
|
|
418
|
+
});
|
|
419
|
+
return { orgId: ctx.orgId, name };
|
|
420
|
+
});
|
|
331
421
|
/** PUT /_agent-native/org/switch — switch the user's active organization */
|
|
332
422
|
export const switchOrgHandler = defineEventHandler(async (event) => {
|
|
333
423
|
const session = await getSession(event);
|
|
@@ -343,8 +433,8 @@ export const switchOrgHandler = defineEventHandler(async (event) => {
|
|
|
343
433
|
sql: `SELECT m.role AS role, o.name AS "orgName"
|
|
344
434
|
FROM org_members m
|
|
345
435
|
INNER JOIN organizations o ON m.org_id = o.id
|
|
346
|
-
WHERE m.org_id = ? AND m.email = ? LIMIT 1`,
|
|
347
|
-
args: [orgId, email],
|
|
436
|
+
WHERE m.org_id = ? AND LOWER(m.email) = ? LIMIT 1`,
|
|
437
|
+
args: [orgId, email.toLowerCase()],
|
|
348
438
|
});
|
|
349
439
|
if (membership.rows.length === 0) {
|
|
350
440
|
throw createError({
|
|
@@ -360,4 +450,342 @@ export const switchOrgHandler = defineEventHandler(async (event) => {
|
|
|
360
450
|
role: String(row.role),
|
|
361
451
|
};
|
|
362
452
|
});
|
|
453
|
+
/** POST /_agent-native/org/join-by-domain — join an org whose allowed_domain matches your email */
|
|
454
|
+
export const joinByDomainHandler = defineEventHandler(async (event) => {
|
|
455
|
+
const session = await getSession(event);
|
|
456
|
+
const email = requireAuthEmail(session);
|
|
457
|
+
const body = await readBody(event);
|
|
458
|
+
const orgId = body?.orgId;
|
|
459
|
+
if (!orgId) {
|
|
460
|
+
throw createError({ statusCode: 400, message: "orgId is required" });
|
|
461
|
+
}
|
|
462
|
+
const e = await exec();
|
|
463
|
+
const orgRes = await e.execute({
|
|
464
|
+
sql: `SELECT id, name, allowed_domain FROM organizations WHERE id = ? LIMIT 1`,
|
|
465
|
+
args: [orgId],
|
|
466
|
+
});
|
|
467
|
+
if (orgRes.rows.length === 0) {
|
|
468
|
+
throw createError({ statusCode: 404, message: "Organization not found" });
|
|
469
|
+
}
|
|
470
|
+
const org = orgRes.rows[0];
|
|
471
|
+
const allowedDomain = String(org.allowed_domain || "").toLowerCase();
|
|
472
|
+
const userDomain = email.split("@")[1]?.toLowerCase();
|
|
473
|
+
if (!allowedDomain || allowedDomain !== userDomain) {
|
|
474
|
+
throw createError({
|
|
475
|
+
statusCode: 403,
|
|
476
|
+
message: "Your email domain does not match this organization's allowed domain",
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
const existing = await e.execute({
|
|
480
|
+
sql: `SELECT 1 FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,
|
|
481
|
+
args: [orgId, email.toLowerCase()],
|
|
482
|
+
});
|
|
483
|
+
if (existing.rows.length > 0) {
|
|
484
|
+
throw createError({
|
|
485
|
+
statusCode: 409,
|
|
486
|
+
message: "Already a member of this organization",
|
|
487
|
+
});
|
|
488
|
+
}
|
|
489
|
+
await e.execute({
|
|
490
|
+
sql: `INSERT INTO org_members (id, org_id, email, role, joined_at) VALUES (?, ?, ?, 'member', ?)`,
|
|
491
|
+
args: [nanoid(), orgId, email, Date.now()],
|
|
492
|
+
});
|
|
493
|
+
await putUserSetting(email, "active-org-id", { orgId });
|
|
494
|
+
return {
|
|
495
|
+
orgId,
|
|
496
|
+
orgName: String(org.name),
|
|
497
|
+
role: "member",
|
|
498
|
+
};
|
|
499
|
+
});
|
|
500
|
+
/** PUT /_agent-native/org/domain — set or clear the allowed email domain (owner/admin only) */
|
|
501
|
+
export const setDomainHandler = defineEventHandler(async (event) => {
|
|
502
|
+
const ctx = await getOrgContext(event);
|
|
503
|
+
if (!ctx.orgId) {
|
|
504
|
+
throw createError({ statusCode: 400, message: "No active organization" });
|
|
505
|
+
}
|
|
506
|
+
if (ctx.role !== "owner" && ctx.role !== "admin") {
|
|
507
|
+
throw createError({
|
|
508
|
+
statusCode: 403,
|
|
509
|
+
message: "Only owners and admins can set the allowed domain",
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
const body = await readBody(event);
|
|
513
|
+
const raw = body?.domain?.trim()?.toLowerCase() || null;
|
|
514
|
+
if (raw && !/^([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+[a-z]{2,}$/.test(raw)) {
|
|
515
|
+
throw createError({
|
|
516
|
+
statusCode: 400,
|
|
517
|
+
message: "Invalid domain format",
|
|
518
|
+
});
|
|
519
|
+
}
|
|
520
|
+
const e = await exec();
|
|
521
|
+
if (raw) {
|
|
522
|
+
const existing = await e.execute({
|
|
523
|
+
sql: `SELECT id FROM organizations WHERE LOWER(allowed_domain) = ? AND id != ? LIMIT 1`,
|
|
524
|
+
args: [raw, ctx.orgId],
|
|
525
|
+
});
|
|
526
|
+
if (existing.rows.length > 0) {
|
|
527
|
+
throw createError({
|
|
528
|
+
statusCode: 409,
|
|
529
|
+
message: "Another organization already uses this domain",
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
await e.execute({
|
|
534
|
+
sql: `UPDATE organizations SET allowed_domain = ? WHERE id = ?`,
|
|
535
|
+
args: [raw, ctx.orgId],
|
|
536
|
+
});
|
|
537
|
+
return { domain: raw };
|
|
538
|
+
});
|
|
539
|
+
/** PUT /_agent-native/org/a2a-secret — regenerate or set the org's A2A secret (owner/admin only) */
|
|
540
|
+
export const setA2ASecretHandler = defineEventHandler(async (event) => {
|
|
541
|
+
const ctx = await getOrgContext(event);
|
|
542
|
+
if (!ctx.orgId) {
|
|
543
|
+
throw createError({
|
|
544
|
+
statusCode: 400,
|
|
545
|
+
message: "No active organization",
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
if (ctx.role !== "owner" && ctx.role !== "admin") {
|
|
549
|
+
throw createError({
|
|
550
|
+
statusCode: 403,
|
|
551
|
+
message: "Only owners and admins can manage the A2A secret",
|
|
552
|
+
});
|
|
553
|
+
}
|
|
554
|
+
const body = await readBody(event);
|
|
555
|
+
let secret = body?.secret?.trim() || null;
|
|
556
|
+
// If no secret provided, auto-generate one
|
|
557
|
+
if (!secret) {
|
|
558
|
+
const { randomBytes } = await import("node:crypto");
|
|
559
|
+
secret = randomBytes(32).toString("base64url");
|
|
560
|
+
}
|
|
561
|
+
const e = await exec();
|
|
562
|
+
// Read the previous secret BEFORE overwriting so the client can chain a
|
|
563
|
+
// sync call that signs JWTs with the secret peers still hold.
|
|
564
|
+
const prevRes = await e.execute({
|
|
565
|
+
sql: `SELECT a2a_secret FROM organizations WHERE id = ? LIMIT 1`,
|
|
566
|
+
args: [ctx.orgId],
|
|
567
|
+
});
|
|
568
|
+
const previousSecret = String(prevRes.rows[0]?.a2a_secret ?? "") || null;
|
|
569
|
+
await e.execute({
|
|
570
|
+
sql: `UPDATE organizations SET a2a_secret = ? WHERE id = ?`,
|
|
571
|
+
args: [secret, ctx.orgId],
|
|
572
|
+
});
|
|
573
|
+
return { a2aSecret: secret, previousSecret };
|
|
574
|
+
});
|
|
575
|
+
/**
|
|
576
|
+
* POST /_agent-native/org/a2a-secret/sync — push the org's A2A secret to all
|
|
577
|
+
* connected apps so cross-app delegation works without manual copy/paste.
|
|
578
|
+
*
|
|
579
|
+
* Auth: standard session — owner/admin only.
|
|
580
|
+
*
|
|
581
|
+
* For each discovered agent, signs a JWT with the org's CURRENT a2a_secret
|
|
582
|
+
* and POSTs to `<app>/_agent-native/org/a2a-secret/receive` with the same
|
|
583
|
+
* secret + the org's domain. The receiving app verifies the JWT using its
|
|
584
|
+
* own copy of the secret (peers must already share a secret to be trusted)
|
|
585
|
+
* — for the first-ever sync this means at least one peer must already hold
|
|
586
|
+
* the secret, which is the bootstrap. For ongoing rotation, regenerate
|
|
587
|
+
* locally and call sync immediately; sync signs with the secret that's
|
|
588
|
+
* currently in DB, which the peers still have.
|
|
589
|
+
*
|
|
590
|
+
* Body (optional): { signSecret?: string } — sign the outbound JWTs with
|
|
591
|
+
* this secret instead of the org's current secret. Used by the regenerate-
|
|
592
|
+
* then-sync flow: regenerate stores the NEW secret, but sync needs to
|
|
593
|
+
* authenticate using the OLD one that peers still hold. Owner/admin only,
|
|
594
|
+
* gated by the session.
|
|
595
|
+
*/
|
|
596
|
+
export const syncA2ASecretHandler = defineEventHandler(async (event) => {
|
|
597
|
+
const ctx = await getOrgContext(event);
|
|
598
|
+
if (!ctx.orgId) {
|
|
599
|
+
throw createError({
|
|
600
|
+
statusCode: 400,
|
|
601
|
+
message: "No active organization",
|
|
602
|
+
});
|
|
603
|
+
}
|
|
604
|
+
if (ctx.role !== "owner" && ctx.role !== "admin") {
|
|
605
|
+
throw createError({
|
|
606
|
+
statusCode: 403,
|
|
607
|
+
message: "Only owners and admins can sync the A2A secret",
|
|
608
|
+
});
|
|
609
|
+
}
|
|
610
|
+
const body = await readBody(event).catch(() => null);
|
|
611
|
+
const overrideSignSecret = typeof body?.signSecret === "string" && body.signSecret.trim()
|
|
612
|
+
? body.signSecret.trim()
|
|
613
|
+
: null;
|
|
614
|
+
const e = await exec();
|
|
615
|
+
const orgRes = await e.execute({
|
|
616
|
+
sql: `SELECT a2a_secret, allowed_domain FROM organizations WHERE id = ? LIMIT 1`,
|
|
617
|
+
args: [ctx.orgId],
|
|
618
|
+
});
|
|
619
|
+
if (orgRes.rows.length === 0) {
|
|
620
|
+
throw createError({
|
|
621
|
+
statusCode: 404,
|
|
622
|
+
message: "Organization not found",
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
const orgRow = orgRes.rows[0];
|
|
626
|
+
const secret = String(orgRow.a2a_secret ?? "") || null;
|
|
627
|
+
const orgDomain = String(orgRow.allowed_domain ?? "") || null;
|
|
628
|
+
if (!secret) {
|
|
629
|
+
throw createError({
|
|
630
|
+
statusCode: 400,
|
|
631
|
+
message: "Org has no A2A secret. Generate one first before syncing.",
|
|
632
|
+
});
|
|
633
|
+
}
|
|
634
|
+
if (!orgDomain) {
|
|
635
|
+
throw createError({
|
|
636
|
+
statusCode: 400,
|
|
637
|
+
message: "Org has no allowed domain set. Set the email domain first so connected apps can identify which org to update.",
|
|
638
|
+
});
|
|
639
|
+
}
|
|
640
|
+
const signSecret = overrideSignSecret || secret;
|
|
641
|
+
const { discoverAgents } = await import("../server/agent-discovery.js");
|
|
642
|
+
const { signA2AToken } = await import("../a2a/client.js");
|
|
643
|
+
const agents = await discoverAgents();
|
|
644
|
+
const results = [];
|
|
645
|
+
await Promise.all(agents.map(async (agent) => {
|
|
646
|
+
try {
|
|
647
|
+
const token = await signA2AToken(ctx.email, orgDomain, signSecret);
|
|
648
|
+
const target = `${agent.url.replace(/\/$/, "")}/_agent-native/org/a2a-secret/receive`;
|
|
649
|
+
const res = await fetch(target, {
|
|
650
|
+
method: "POST",
|
|
651
|
+
headers: {
|
|
652
|
+
"Content-Type": "application/json",
|
|
653
|
+
Authorization: `Bearer ${token}`,
|
|
654
|
+
},
|
|
655
|
+
body: JSON.stringify({ secret, orgDomain }),
|
|
656
|
+
});
|
|
657
|
+
if (!res.ok) {
|
|
658
|
+
const text = await res.text().catch(() => "");
|
|
659
|
+
results.push({
|
|
660
|
+
id: agent.id,
|
|
661
|
+
name: agent.name,
|
|
662
|
+
url: agent.url,
|
|
663
|
+
ok: false,
|
|
664
|
+
status: res.status,
|
|
665
|
+
error: text || res.statusText,
|
|
666
|
+
});
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
results.push({
|
|
670
|
+
id: agent.id,
|
|
671
|
+
name: agent.name,
|
|
672
|
+
url: agent.url,
|
|
673
|
+
ok: true,
|
|
674
|
+
status: res.status,
|
|
675
|
+
});
|
|
676
|
+
}
|
|
677
|
+
catch (err) {
|
|
678
|
+
results.push({
|
|
679
|
+
id: agent.id,
|
|
680
|
+
name: agent.name,
|
|
681
|
+
url: agent.url,
|
|
682
|
+
ok: false,
|
|
683
|
+
error: err instanceof Error ? err.message : String(err),
|
|
684
|
+
});
|
|
685
|
+
}
|
|
686
|
+
}));
|
|
687
|
+
const succeeded = results.filter((r) => r.ok).length;
|
|
688
|
+
return {
|
|
689
|
+
total: results.length,
|
|
690
|
+
succeeded,
|
|
691
|
+
failed: results.length - succeeded,
|
|
692
|
+
results,
|
|
693
|
+
};
|
|
694
|
+
});
|
|
695
|
+
/**
|
|
696
|
+
* POST /_agent-native/org/a2a-secret/receive — accept a secret push from a
|
|
697
|
+
* connected agent-native app. Auth-exempt at the route guard; we verify a
|
|
698
|
+
* JWT signed by the calling app using OUR copy of the org's a2a_secret. If
|
|
699
|
+
* verification succeeds the calling app is a trusted peer and we overwrite
|
|
700
|
+
* our local org's secret with the supplied value.
|
|
701
|
+
*
|
|
702
|
+
* Body: { secret: string, orgDomain: string }
|
|
703
|
+
*
|
|
704
|
+
* Header: Authorization: Bearer <JWT signed with the existing shared
|
|
705
|
+
* a2a_secret, with `org_domain` matching the body's orgDomain>.
|
|
706
|
+
*/
|
|
707
|
+
export const receiveA2ASecretHandler = defineEventHandler(async (event) => {
|
|
708
|
+
const { getRequestHeader } = await import("h3");
|
|
709
|
+
const jose = await import("jose");
|
|
710
|
+
const authHeader = getRequestHeader(event, "authorization");
|
|
711
|
+
if (!authHeader || !authHeader.startsWith("Bearer ")) {
|
|
712
|
+
throw createError({
|
|
713
|
+
statusCode: 401,
|
|
714
|
+
message: "Bearer token required",
|
|
715
|
+
});
|
|
716
|
+
}
|
|
717
|
+
const token = authHeader.slice("Bearer ".length);
|
|
718
|
+
const body = await readBody(event);
|
|
719
|
+
const newSecret = typeof body?.secret === "string" ? body.secret.trim() : "";
|
|
720
|
+
const orgDomain = typeof body?.orgDomain === "string"
|
|
721
|
+
? body.orgDomain.trim().toLowerCase()
|
|
722
|
+
: "";
|
|
723
|
+
if (!newSecret || !orgDomain) {
|
|
724
|
+
throw createError({
|
|
725
|
+
statusCode: 400,
|
|
726
|
+
message: "secret and orgDomain are required",
|
|
727
|
+
});
|
|
728
|
+
}
|
|
729
|
+
// Peek at JWT (unverified) to confirm it claims the same domain we're
|
|
730
|
+
// updating. Verification still happens below with the trusted secret.
|
|
731
|
+
let claimedDomain;
|
|
732
|
+
try {
|
|
733
|
+
const unverified = jose.decodeJwt(token);
|
|
734
|
+
claimedDomain =
|
|
735
|
+
unverified.org_domain || undefined;
|
|
736
|
+
}
|
|
737
|
+
catch {
|
|
738
|
+
throw createError({
|
|
739
|
+
statusCode: 401,
|
|
740
|
+
message: "Malformed JWT",
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
if (!claimedDomain ||
|
|
744
|
+
claimedDomain.toLowerCase() !== orgDomain.toLowerCase()) {
|
|
745
|
+
throw createError({
|
|
746
|
+
statusCode: 401,
|
|
747
|
+
message: "JWT org_domain does not match request body",
|
|
748
|
+
});
|
|
749
|
+
}
|
|
750
|
+
// Look up our local org by the domain and grab the existing secret.
|
|
751
|
+
const e = await exec();
|
|
752
|
+
const orgRes = await e.execute({
|
|
753
|
+
sql: `SELECT id, a2a_secret FROM organizations WHERE LOWER(allowed_domain) = ? LIMIT 1`,
|
|
754
|
+
args: [orgDomain],
|
|
755
|
+
});
|
|
756
|
+
if (orgRes.rows.length === 0) {
|
|
757
|
+
throw createError({
|
|
758
|
+
statusCode: 404,
|
|
759
|
+
message: "No local org matches that domain",
|
|
760
|
+
});
|
|
761
|
+
}
|
|
762
|
+
const row = orgRes.rows[0];
|
|
763
|
+
const localOrgId = String(row.id);
|
|
764
|
+
const existingSecret = String(row.a2a_secret ?? "") || null;
|
|
765
|
+
if (!existingSecret) {
|
|
766
|
+
// Bootstrap requires an existing shared secret to verify the caller.
|
|
767
|
+
// If we have nothing on file, we can't verify trust — refuse.
|
|
768
|
+
throw createError({
|
|
769
|
+
statusCode: 401,
|
|
770
|
+
message: "Local org has no A2A secret yet — cannot verify caller. Set the secret manually for the first time.",
|
|
771
|
+
});
|
|
772
|
+
}
|
|
773
|
+
// Verify the JWT using OUR existing secret. If the caller is a trusted
|
|
774
|
+
// peer they signed with the same secret and verification succeeds.
|
|
775
|
+
try {
|
|
776
|
+
await jose.jwtVerify(token, new TextEncoder().encode(existingSecret));
|
|
777
|
+
}
|
|
778
|
+
catch {
|
|
779
|
+
throw createError({
|
|
780
|
+
statusCode: 401,
|
|
781
|
+
message: "Invalid or expired JWT signature",
|
|
782
|
+
});
|
|
783
|
+
}
|
|
784
|
+
// Trusted — apply the new secret.
|
|
785
|
+
await e.execute({
|
|
786
|
+
sql: `UPDATE organizations SET a2a_secret = ? WHERE id = ?`,
|
|
787
|
+
args: [newSecret, localOrgId],
|
|
788
|
+
});
|
|
789
|
+
return { ok: true, orgId: localOrgId };
|
|
790
|
+
});
|
|
363
791
|
//# sourceMappingURL=handlers.js.map
|