@agent-native/core 0.6.1 → 0.7.2
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 +43 -3
- package/dist/action.d.ts +8 -0
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js +18 -0
- package/dist/action.js.map +1 -1
- package/dist/agent/production-agent.d.ts +9 -0
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +301 -39
- 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 +20 -1
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +14 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +63 -6
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/types.d.ts +3 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/cli/create-workspace.d.ts +8 -0
- package/dist/cli/create-workspace.d.ts.map +1 -0
- package/dist/cli/create-workspace.js +18 -0
- package/dist/cli/create-workspace.js.map +1 -0
- package/dist/cli/create.d.ts +35 -7
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +444 -251
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +59 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/setup-agents.d.ts.map +1 -1
- package/dist/cli/setup-agents.js +0 -2
- package/dist/cli/setup-agents.js.map +1 -1
- package/dist/cli/templates-meta.d.ts +52 -0
- package/dist/cli/templates-meta.d.ts.map +1 -0
- package/dist/cli/templates-meta.js +165 -0
- package/dist/cli/templates-meta.js.map +1 -0
- package/dist/cli/workspacify.d.ts +18 -0
- package/dist/cli/workspacify.d.ts.map +1 -0
- package/dist/cli/workspacify.js +74 -0
- package/dist/cli/workspacify.js.map +1 -0
- package/dist/client/AgentPanel.d.ts +6 -2
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +328 -241
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +2 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +172 -40
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ConnectBuilderCard.d.ts +21 -0
- package/dist/client/ConnectBuilderCard.d.ts.map +1 -0
- package/dist/client/ConnectBuilderCard.js +196 -0
- package/dist/client/ConnectBuilderCard.js.map +1 -0
- package/dist/client/FeedbackButton.d.ts +15 -0
- package/dist/client/FeedbackButton.d.ts.map +1 -0
- package/dist/client/FeedbackButton.js +72 -0
- package/dist/client/FeedbackButton.js.map +1 -0
- package/dist/client/IframeEmbed.d.ts +17 -0
- package/dist/client/IframeEmbed.d.ts.map +1 -0
- package/dist/client/IframeEmbed.js +108 -0
- package/dist/client/IframeEmbed.js.map +1 -0
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +34 -7
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +34 -15
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-chat.d.ts +6 -0
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +7 -0
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/components/CodeRequiredDialog.d.ts.map +1 -1
- package/dist/client/components/CodeRequiredDialog.js +86 -5
- package/dist/client/components/CodeRequiredDialog.js.map +1 -1
- package/dist/client/composer/MentionPopover.d.ts.map +1 -1
- package/dist/client/composer/MentionPopover.js +42 -26
- package/dist/client/composer/MentionPopover.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +3 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +24 -5
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/types.d.ts +1 -1
- package/dist/client/composer/types.d.ts.map +1 -1
- package/dist/client/embed.d.ts +28 -0
- package/dist/client/embed.d.ts.map +1 -0
- package/dist/client/embed.js +50 -0
- package/dist/client/embed.js.map +1 -0
- package/dist/client/index.d.ts +4 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +4 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.d.ts.map +1 -1
- package/dist/client/integrations/IntegrationsPanel.js +22 -9
- package/dist/client/integrations/IntegrationsPanel.js.map +1 -1
- package/dist/client/onboarding/OnboardingBanner.d.ts +13 -0
- package/dist/client/onboarding/OnboardingBanner.d.ts.map +1 -0
- package/dist/client/onboarding/OnboardingBanner.js +36 -0
- package/dist/client/onboarding/OnboardingBanner.js.map +1 -0
- package/dist/client/onboarding/OnboardingPanel.d.ts +16 -0
- package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -0
- package/dist/client/onboarding/OnboardingPanel.js +447 -0
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -0
- package/dist/client/onboarding/SetupButton.d.ts +10 -0
- package/dist/client/onboarding/SetupButton.d.ts.map +1 -0
- package/dist/client/onboarding/SetupButton.js +36 -0
- package/dist/client/onboarding/SetupButton.js.map +1 -0
- package/dist/client/onboarding/index.d.ts +12 -0
- package/dist/client/onboarding/index.d.ts.map +1 -0
- package/dist/client/onboarding/index.js +11 -0
- package/dist/client/onboarding/index.js.map +1 -0
- package/dist/client/onboarding/use-onboarding.d.ts +34 -0
- package/dist/client/onboarding/use-onboarding.d.ts.map +1 -0
- package/dist/client/onboarding/use-onboarding.js +101 -0
- package/dist/client/onboarding/use-onboarding.js.map +1 -0
- package/dist/client/org/TeamPage.d.ts +6 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +97 -21
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/resources/ResourceEditor.d.ts.map +1 -1
- package/dist/client/resources/ResourceEditor.js +104 -78
- package/dist/client/resources/ResourceEditor.js.map +1 -1
- package/dist/client/resources/ResourceTree.d.ts +5 -1
- package/dist/client/resources/ResourceTree.d.ts.map +1 -1
- package/dist/client/resources/ResourceTree.js +31 -11
- package/dist/client/resources/ResourceTree.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +142 -14
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/resources/use-resources.d.ts +5 -0
- package/dist/client/resources/use-resources.d.ts.map +1 -1
- package/dist/client/resources/use-resources.js.map +1 -1
- package/dist/client/settings/AgentsSection.d.ts +2 -0
- package/dist/client/settings/AgentsSection.d.ts.map +1 -0
- package/dist/client/settings/AgentsSection.js +201 -0
- package/dist/client/settings/AgentsSection.js.map +1 -0
- package/dist/client/settings/BackgroundAgentSection.d.ts +2 -0
- package/dist/client/settings/BackgroundAgentSection.d.ts.map +1 -0
- package/dist/client/settings/BackgroundAgentSection.js +46 -0
- package/dist/client/settings/BackgroundAgentSection.js.map +1 -0
- package/dist/client/settings/BrowserSection.d.ts +2 -0
- package/dist/client/settings/BrowserSection.d.ts.map +1 -0
- package/dist/client/settings/BrowserSection.js +10 -0
- package/dist/client/settings/BrowserSection.js.map +1 -0
- package/dist/client/settings/ComingSoonSection.d.ts +13 -0
- package/dist/client/settings/ComingSoonSection.d.ts.map +1 -0
- package/dist/client/settings/ComingSoonSection.js +9 -0
- package/dist/client/settings/ComingSoonSection.js.map +1 -0
- package/dist/client/settings/LLMSection.d.ts +2 -0
- package/dist/client/settings/LLMSection.d.ts.map +1 -0
- package/dist/client/settings/LLMSection.js +64 -0
- package/dist/client/settings/LLMSection.js.map +1 -0
- package/dist/client/settings/SettingsPanel.d.ts +8 -0
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -0
- package/dist/client/settings/SettingsPanel.js +111 -0
- package/dist/client/settings/SettingsPanel.js.map +1 -0
- package/dist/client/settings/SettingsSection.d.ts +19 -0
- package/dist/client/settings/SettingsSection.d.ts.map +1 -0
- package/dist/client/settings/SettingsSection.js +10 -0
- package/dist/client/settings/SettingsSection.js.map +1 -0
- package/dist/client/settings/UsageSection.d.ts +2 -0
- package/dist/client/settings/UsageSection.d.ts.map +1 -0
- package/dist/client/settings/UsageSection.js +70 -0
- package/dist/client/settings/UsageSection.js.map +1 -0
- package/dist/client/settings/index.d.ts +3 -0
- package/dist/client/settings/index.d.ts.map +1 -0
- package/dist/client/settings/index.js +3 -0
- package/dist/client/settings/index.js.map +1 -0
- package/dist/client/settings/useBuilderStatus.d.ts +22 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -0
- package/dist/client/settings/useBuilderStatus.js +41 -0
- package/dist/client/settings/useBuilderStatus.js.map +1 -0
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +67 -4
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +25 -2
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +62 -1
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/use-dev-mode.d.ts.map +1 -1
- package/dist/client/use-dev-mode.js +16 -1
- package/dist/client/use-dev-mode.js.map +1 -1
- package/dist/db/client.d.ts +12 -0
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +89 -2
- package/dist/db/client.js.map +1 -1
- package/dist/db/create-get-db.d.ts +11 -0
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +47 -3
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +62 -5
- package/dist/db/migrations.js.map +1 -1
- package/dist/deploy/build.js +198 -54
- package/dist/deploy/build.js.map +1 -1
- package/dist/deploy/route-discovery.d.ts +5 -0
- package/dist/deploy/route-discovery.d.ts.map +1 -1
- package/dist/deploy/route-discovery.js +38 -7
- package/dist/deploy/route-discovery.js.map +1 -1
- package/dist/deploy/workspace-core.d.ts +28 -0
- package/dist/deploy/workspace-core.d.ts.map +1 -0
- package/dist/deploy/workspace-core.js +223 -0
- package/dist/deploy/workspace-core.js.map +1 -0
- package/dist/deploy/workspace-deploy.d.ts +11 -0
- package/dist/deploy/workspace-deploy.d.ts.map +1 -0
- package/dist/deploy/workspace-deploy.js +148 -0
- package/dist/deploy/workspace-deploy.js.map +1 -0
- package/dist/file-upload/builder.d.ts +11 -0
- package/dist/file-upload/builder.d.ts.map +1 -0
- package/dist/file-upload/builder.js +53 -0
- package/dist/file-upload/builder.js.map +1 -0
- package/dist/file-upload/index.d.ts +4 -0
- package/dist/file-upload/index.d.ts.map +1 -0
- package/dist/file-upload/index.js +3 -0
- package/dist/file-upload/index.js.map +1 -0
- package/dist/file-upload/registry.d.ts +23 -0
- package/dist/file-upload/registry.d.ts.map +1 -0
- package/dist/file-upload/registry.js +52 -0
- package/dist/file-upload/registry.js.map +1 -0
- package/dist/file-upload/types.d.ts +37 -0
- package/dist/file-upload/types.d.ts.map +1 -0
- package/dist/file-upload/types.js +10 -0
- package/dist/file-upload/types.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/adapters/google-docs.d.ts +89 -0
- package/dist/integrations/adapters/google-docs.d.ts.map +1 -0
- package/dist/integrations/adapters/google-docs.js +261 -0
- package/dist/integrations/adapters/google-docs.js.map +1 -0
- package/dist/integrations/adapters/slack.d.ts.map +1 -1
- package/dist/integrations/adapters/slack.js +34 -0
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/adapters/telegram.d.ts.map +1 -1
- package/dist/integrations/adapters/telegram.js +32 -0
- package/dist/integrations/adapters/telegram.js.map +1 -1
- package/dist/integrations/google-docs-poller.d.ts +54 -0
- package/dist/integrations/google-docs-poller.d.ts.map +1 -0
- package/dist/integrations/google-docs-poller.js +442 -0
- package/dist/integrations/google-docs-poller.js.map +1 -0
- package/dist/integrations/index.d.ts +2 -0
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +3 -0
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +49 -2
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/integrations/types.d.ts +33 -0
- package/dist/integrations/types.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.d.ts +10 -1
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +13 -3
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +3 -0
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +87 -61
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/jobs/tools.d.ts.map +1 -1
- package/dist/jobs/tools.js +20 -3
- package/dist/jobs/tools.js.map +1 -1
- package/dist/mcp-client/config.d.ts +46 -0
- package/dist/mcp-client/config.d.ts.map +1 -0
- package/dist/mcp-client/config.js +152 -0
- package/dist/mcp-client/config.js.map +1 -0
- package/dist/mcp-client/index.d.ts +17 -0
- package/dist/mcp-client/index.d.ts.map +1 -0
- package/dist/mcp-client/index.js +53 -0
- package/dist/mcp-client/index.js.map +1 -0
- package/dist/mcp-client/manager.d.ts +76 -0
- package/dist/mcp-client/manager.d.ts.map +1 -0
- package/dist/mcp-client/manager.js +212 -0
- package/dist/mcp-client/manager.js.map +1 -0
- package/dist/oauth-tokens/google-refresh.d.ts +31 -0
- package/dist/oauth-tokens/google-refresh.d.ts.map +1 -0
- package/dist/oauth-tokens/google-refresh.js +115 -0
- package/dist/oauth-tokens/google-refresh.js.map +1 -0
- package/dist/oauth-tokens/index.d.ts +1 -0
- package/dist/oauth-tokens/index.d.ts.map +1 -1
- package/dist/oauth-tokens/index.js +1 -0
- package/dist/oauth-tokens/index.js.map +1 -1
- package/dist/oauth-tokens/store.d.ts.map +1 -1
- package/dist/oauth-tokens/store.js +3 -1
- package/dist/oauth-tokens/store.js.map +1 -1
- package/dist/onboarding/default-steps.d.ts +10 -0
- package/dist/onboarding/default-steps.d.ts.map +1 -0
- package/dist/onboarding/default-steps.js +203 -0
- package/dist/onboarding/default-steps.js.map +1 -0
- package/dist/onboarding/index.d.ts +12 -0
- package/dist/onboarding/index.d.ts.map +1 -0
- package/dist/onboarding/index.js +11 -0
- package/dist/onboarding/index.js.map +1 -0
- package/dist/onboarding/plugin.d.ts +19 -0
- package/dist/onboarding/plugin.d.ts.map +1 -0
- package/dist/onboarding/plugin.js +147 -0
- package/dist/onboarding/plugin.js.map +1 -0
- package/dist/onboarding/registry.d.ts +24 -0
- package/dist/onboarding/registry.d.ts.map +1 -0
- package/dist/onboarding/registry.js +40 -0
- package/dist/onboarding/registry.js.map +1 -0
- package/dist/onboarding/types.d.ts +71 -0
- package/dist/onboarding/types.d.ts.map +1 -0
- package/dist/onboarding/types.js +10 -0
- package/dist/onboarding/types.js.map +1 -0
- package/dist/org/context.js +1 -1
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +35 -10
- package/dist/org/handlers.js.map +1 -1
- package/dist/org/plugin.d.ts.map +1 -1
- package/dist/org/plugin.js +37 -22
- package/dist/org/plugin.js.map +1 -1
- package/dist/resources/agents.d.ts +4 -0
- package/dist/resources/agents.d.ts.map +1 -0
- package/dist/resources/agents.js +44 -0
- package/dist/resources/agents.js.map +1 -0
- package/dist/resources/handlers.d.ts +17 -0
- package/dist/resources/handlers.d.ts.map +1 -1
- package/dist/resources/handlers.js +49 -12
- package/dist/resources/handlers.js.map +1 -1
- package/dist/resources/metadata.d.ts +48 -0
- package/dist/resources/metadata.d.ts.map +1 -0
- package/dist/resources/metadata.js +150 -0
- package/dist/resources/metadata.js.map +1 -0
- package/dist/resources/script-helpers.d.ts.map +1 -1
- package/dist/resources/script-helpers.js +3 -2
- package/dist/resources/script-helpers.js.map +1 -1
- package/dist/resources/store.d.ts.map +1 -1
- package/dist/resources/store.js +59 -18
- package/dist/resources/store.js.map +1 -1
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +3 -2
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/scripts/chat/search-chats.d.ts.map +1 -1
- package/dist/scripts/chat/search-chats.js +2 -1
- package/dist/scripts/chat/search-chats.js.map +1 -1
- package/dist/scripts/core-scripts.d.ts.map +1 -1
- package/dist/scripts/core-scripts.js +2 -0
- package/dist/scripts/core-scripts.js.map +1 -1
- package/dist/scripts/db/patch.d.ts.map +1 -1
- package/dist/scripts/db/patch.js +273 -11
- package/dist/scripts/db/patch.js.map +1 -1
- package/dist/scripts/db/scoping.d.ts.map +1 -1
- package/dist/scripts/db/scoping.js +3 -2
- package/dist/scripts/db/scoping.js.map +1 -1
- package/dist/scripts/docs/index.d.ts +2 -0
- package/dist/scripts/docs/index.d.ts.map +1 -0
- package/dist/scripts/docs/index.js +4 -0
- package/dist/scripts/docs/index.js.map +1 -0
- package/dist/scripts/docs/search.d.ts +13 -0
- package/dist/scripts/docs/search.d.ts.map +1 -0
- package/dist/scripts/docs/search.js +130 -0
- package/dist/scripts/docs/search.js.map +1 -0
- package/dist/scripts/resources/delete-memory.d.ts +7 -0
- package/dist/scripts/resources/delete-memory.d.ts.map +1 -0
- package/dist/scripts/resources/delete-memory.js +49 -0
- package/dist/scripts/resources/delete-memory.js.map +1 -0
- package/dist/scripts/resources/delete.d.ts.map +1 -1
- package/dist/scripts/resources/delete.js +2 -1
- package/dist/scripts/resources/delete.js.map +1 -1
- package/dist/scripts/resources/index.d.ts.map +1 -1
- package/dist/scripts/resources/index.js +2 -0
- package/dist/scripts/resources/index.js.map +1 -1
- package/dist/scripts/resources/list.d.ts.map +1 -1
- package/dist/scripts/resources/list.js +2 -1
- package/dist/scripts/resources/list.js.map +1 -1
- package/dist/scripts/resources/migrate-learnings.d.ts.map +1 -1
- package/dist/scripts/resources/migrate-learnings.js +2 -1
- package/dist/scripts/resources/migrate-learnings.js.map +1 -1
- package/dist/scripts/resources/read.d.ts.map +1 -1
- package/dist/scripts/resources/read.js +2 -1
- package/dist/scripts/resources/read.js.map +1 -1
- package/dist/scripts/resources/save-memory.d.ts +9 -0
- package/dist/scripts/resources/save-memory.d.ts.map +1 -0
- package/dist/scripts/resources/save-memory.js +78 -0
- package/dist/scripts/resources/save-memory.js.map +1 -0
- package/dist/scripts/resources/write.d.ts.map +1 -1
- package/dist/scripts/resources/write.js +2 -1
- package/dist/scripts/resources/write.js.map +1 -1
- package/dist/scripts/utils.d.ts +10 -1
- package/dist/scripts/utils.d.ts.map +1 -1
- package/dist/scripts/utils.js +45 -2
- package/dist/scripts/utils.js.map +1 -1
- package/dist/server/action-discovery.d.ts +5 -0
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +53 -20
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +88 -56
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +15 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +853 -91
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-discovery.d.ts.map +1 -1
- package/dist/server/agent-discovery.js +13 -25
- package/dist/server/agent-discovery.js.map +1 -1
- package/dist/server/agent-teams.d.ts.map +1 -1
- package/dist/server/agent-teams.js +23 -59
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/agents-bundle.d.ts +33 -5
- package/dist/server/agents-bundle.d.ts.map +1 -1
- package/dist/server/agents-bundle.js +108 -64
- package/dist/server/agents-bundle.js.map +1 -1
- package/dist/server/auth.d.ts +7 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +448 -93
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts +1 -1
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +272 -10
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/builder-browser.d.ts +61 -0
- package/dist/server/builder-browser.d.ts.map +1 -0
- package/dist/server/builder-browser.js +229 -0
- package/dist/server/builder-browser.js.map +1 -0
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +273 -9
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +37 -0
- package/dist/server/credential-provider.d.ts.map +1 -0
- package/dist/server/credential-provider.js +49 -0
- package/dist/server/credential-provider.js.map +1 -0
- package/dist/server/desktop-sso.d.ts +30 -0
- package/dist/server/desktop-sso.d.ts.map +1 -0
- package/dist/server/desktop-sso.js +74 -0
- package/dist/server/desktop-sso.js.map +1 -0
- package/dist/server/email.d.ts +23 -0
- package/dist/server/email.d.ts.map +1 -0
- package/dist/server/email.js +105 -0
- package/dist/server/email.js.map +1 -0
- package/dist/server/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +71 -3
- package/dist/server/framework-request-handler.js.map +1 -1
- package/dist/server/google-auth-plugin.js +1 -1
- package/dist/server/google-oauth.d.ts +1 -1
- package/dist/server/google-oauth.d.ts.map +1 -1
- package/dist/server/google-oauth.js +34 -13
- package/dist/server/google-oauth.js.map +1 -1
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/local-migration.d.ts +9 -0
- package/dist/server/local-migration.d.ts.map +1 -1
- package/dist/server/local-migration.js +44 -14
- package/dist/server/local-migration.js.map +1 -1
- package/dist/server/oauth-helpers.d.ts +3 -0
- package/dist/server/oauth-helpers.d.ts.map +1 -1
- package/dist/server/oauth-helpers.js +7 -4
- package/dist/server/oauth-helpers.js.map +1 -1
- package/dist/server/onboarding-html.d.ts +6 -0
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +323 -28
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +48 -0
- package/dist/server/poll.js.map +1 -1
- package/dist/server/request-context.d.ts +20 -0
- package/dist/server/request-context.d.ts.map +1 -0
- package/dist/server/request-context.js +41 -0
- package/dist/server/request-context.js.map +1 -0
- package/dist/templates/default/.agents/skills/actions/SKILL.md +2 -1
- package/dist/templates/default/.agents/skills/inline-embeds/SKILL.md +88 -0
- package/dist/templates/default/.agents/skills/security/SKILL.md +145 -40
- package/dist/templates/default/.agents/skills/storing-data/SKILL.md +7 -1
- package/dist/templates/default/_gitignore +1 -0
- package/dist/templates/default/app/root.tsx +4 -1
- package/dist/templates/workspace-core/.agents/skills/company-policies/SKILL.md +42 -0
- package/dist/templates/workspace-core/AGENTS.md +62 -0
- package/dist/templates/workspace-core/actions/company-directory.ts +38 -0
- package/dist/templates/workspace-core/package.json +39 -0
- package/dist/templates/workspace-core/src/client/AuthenticatedLayout.tsx +37 -0
- package/dist/templates/workspace-core/src/client/index.ts +26 -0
- package/dist/templates/workspace-core/src/credentials.ts +29 -0
- package/dist/templates/workspace-core/src/index.ts +21 -0
- package/dist/templates/workspace-core/src/server/agent-chat-plugin.ts +30 -0
- package/dist/templates/workspace-core/src/server/auth-plugin.ts +35 -0
- package/dist/templates/workspace-core/src/server/index.ts +22 -0
- package/dist/templates/workspace-core/tailwind.preset.ts +34 -0
- package/dist/templates/workspace-core/tsconfig.json +9 -0
- package/dist/templates/workspace-root/.env.example +37 -0
- package/dist/templates/workspace-root/README.md +62 -0
- package/dist/templates/workspace-root/_gitignore +23 -0
- package/dist/templates/workspace-root/package.json +18 -0
- package/dist/templates/workspace-root/pnpm-workspace.yaml +3 -0
- package/dist/templates/workspace-root/tsconfig.base.json +21 -0
- package/dist/usage/store.d.ts +74 -12
- package/dist/usage/store.d.ts.map +1 -1
- package/dist/usage/store.js +210 -44
- package/dist/usage/store.js.map +1 -1
- package/dist/vite/agents-bundle-plugin.d.ts.map +1 -1
- package/dist/vite/agents-bundle-plugin.js +65 -15
- package/dist/vite/agents-bundle-plugin.js.map +1 -1
- package/dist/vite/client.d.ts +16 -0
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +130 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/a2a-protocol.md +223 -0
- package/docs/content/actions.md +129 -0
- package/docs/content/agent-mentions.md +171 -0
- package/docs/content/authentication.md +155 -0
- package/docs/content/cli-adapters.md +244 -0
- package/docs/content/client.md +175 -0
- package/docs/content/context-awareness.md +168 -0
- package/docs/content/creating-templates.md +311 -0
- package/docs/content/database.md +82 -0
- package/docs/content/deployment.md +237 -0
- package/docs/content/enterprise-workspace.md +235 -0
- package/docs/content/faq.md +101 -0
- package/docs/content/file-uploads.md +102 -0
- package/docs/content/frames.md +47 -0
- package/docs/content/getting-started.md +104 -0
- package/docs/content/integrations.md +198 -0
- package/docs/content/key-concepts.md +246 -0
- package/docs/content/mcp-clients.md +110 -0
- package/docs/content/mcp-protocol.md +168 -0
- package/docs/content/onboarding.md +107 -0
- package/docs/content/real-time-collaboration.md +185 -0
- package/docs/content/resources.md +277 -0
- package/docs/content/security.md +158 -0
- package/docs/content/server.md +200 -0
- package/docs/content/skills-guide.md +107 -0
- package/docs/content/what-is-agent-native.md +100 -0
- package/docs/content/workspace-management.md +224 -0
- package/package.json +13 -3
- package/src/templates/default/.agents/skills/actions/SKILL.md +2 -1
- package/src/templates/default/.agents/skills/inline-embeds/SKILL.md +88 -0
- package/src/templates/default/.agents/skills/security/SKILL.md +145 -40
- package/src/templates/default/.agents/skills/storing-data/SKILL.md +7 -1
- package/src/templates/default/_gitignore +1 -0
- package/src/templates/default/app/root.tsx +4 -1
- package/src/templates/workspace-core/.agents/skills/company-policies/SKILL.md +42 -0
- package/src/templates/workspace-core/AGENTS.md +62 -0
- package/src/templates/workspace-core/actions/company-directory.ts +38 -0
- package/src/templates/workspace-core/package.json +39 -0
- package/src/templates/workspace-core/src/client/AuthenticatedLayout.tsx +37 -0
- package/src/templates/workspace-core/src/client/index.ts +26 -0
- package/src/templates/workspace-core/src/credentials.ts +29 -0
- package/src/templates/workspace-core/src/index.ts +21 -0
- package/src/templates/workspace-core/src/server/agent-chat-plugin.ts +30 -0
- package/src/templates/workspace-core/src/server/auth-plugin.ts +35 -0
- package/src/templates/workspace-core/src/server/index.ts +22 -0
- package/src/templates/workspace-core/tailwind.preset.ts +34 -0
- package/src/templates/workspace-core/tsconfig.json +9 -0
- package/src/templates/workspace-root/.env.example +37 -0
- package/src/templates/workspace-root/README.md +62 -0
- package/src/templates/workspace-root/_gitignore +23 -0
- package/src/templates/workspace-root/package.json +18 -0
- package/src/templates/workspace-root/pnpm-workspace.yaml +3 -0
- package/src/templates/workspace-root/tsconfig.base.json +21 -0
- package/dist/templates/templates/default/.agents/skills/actions/SKILL.md +0 -142
- package/dist/templates/templates/default/.agents/skills/agent-engines/SKILL.md +0 -127
- package/dist/templates/templates/default/.agents/skills/capture-learnings/SKILL.md +0 -50
- package/dist/templates/templates/default/.agents/skills/create-skill/SKILL.md +0 -167
- package/dist/templates/templates/default/.agents/skills/delegate-to-agent/SKILL.md +0 -90
- package/dist/templates/templates/default/.agents/skills/frontend-design/SKILL.md +0 -69
- package/dist/templates/templates/default/.agents/skills/real-time-collab/SKILL.md +0 -183
- package/dist/templates/templates/default/.agents/skills/real-time-sync/SKILL.md +0 -112
- package/dist/templates/templates/default/.agents/skills/security/SKILL.md +0 -108
- package/dist/templates/templates/default/.agents/skills/self-modifying-code/SKILL.md +0 -79
- package/dist/templates/templates/default/.agents/skills/storing-data/SKILL.md +0 -110
- package/dist/templates/templates/default/.claude/settings.json +0 -100
- package/dist/templates/templates/default/.env.example +0 -5
- package/dist/templates/templates/default/.ignore +0 -0
- package/dist/templates/templates/default/.prettierrc +0 -5
- package/dist/templates/templates/default/AGENTS.md +0 -110
- package/dist/templates/templates/default/DEVELOPING.md +0 -117
- package/dist/templates/templates/default/_gitignore +0 -37
- package/dist/templates/templates/default/actions/hello.ts +0 -20
- package/dist/templates/templates/default/actions/navigate.ts +0 -53
- package/dist/templates/templates/default/actions/run.ts +0 -2
- package/dist/templates/templates/default/actions/view-screen.ts +0 -39
- package/dist/templates/templates/default/app/entry.client.tsx +0 -4
- package/dist/templates/templates/default/app/entry.server.tsx +0 -56
- package/dist/templates/templates/default/app/global.css +0 -95
- package/dist/templates/templates/default/app/lib/utils.ts +0 -1
- package/dist/templates/templates/default/app/root.tsx +0 -107
- package/dist/templates/templates/default/app/routes/_index.tsx +0 -62
- package/dist/templates/templates/default/app/routes.ts +0 -4
- package/dist/templates/templates/default/app/vite-env.d.ts +0 -6
- package/dist/templates/templates/default/components.json +0 -20
- package/dist/templates/templates/default/data/.gitkeep +0 -0
- package/dist/templates/templates/default/data/sync-config.json +0 -1
- package/dist/templates/templates/default/learnings.defaults.md +0 -5
- package/dist/templates/templates/default/learnings.md +0 -0
- package/dist/templates/templates/default/package.json +0 -46
- package/dist/templates/templates/default/postcss.config.js +0 -6
- package/dist/templates/templates/default/public/icon-180.svg +0 -4
- package/dist/templates/templates/default/public/icon-192.svg +0 -4
- package/dist/templates/templates/default/public/icon-512.svg +0 -4
- package/dist/templates/templates/default/public/manifest.json +0 -13
- package/dist/templates/templates/default/react-router.config.ts +0 -6
- package/dist/templates/templates/default/server/middleware/auth.ts +0 -15
- package/dist/templates/templates/default/server/plugins/.gitkeep +0 -0
- package/dist/templates/templates/default/server/routes/[...page].get.ts +0 -5
- package/dist/templates/templates/default/server/routes/api/hello.get.ts +0 -5
- package/dist/templates/templates/default/shared/api.ts +0 -6
- package/dist/templates/templates/default/ssr-entry.ts +0 -20
- package/dist/templates/templates/default/tailwind.config.ts +0 -7
- package/dist/templates/templates/default/tsconfig.json +0 -11
- package/dist/templates/templates/default/vite.config.ts +0 -6
|
@@ -17,16 +17,34 @@ function isProductionEnv() {
|
|
|
17
17
|
function hasGoogleOAuth() {
|
|
18
18
|
return !!(process.env.GOOGLE_CLIENT_ID && process.env.GOOGLE_CLIENT_SECRET);
|
|
19
19
|
}
|
|
20
|
+
function getConnectionLabel() {
|
|
21
|
+
const url = process.env.DATABASE_URL || "";
|
|
22
|
+
if (!url)
|
|
23
|
+
return "SQLite (local file)";
|
|
24
|
+
if (url.startsWith("postgres://") || url.startsWith("postgresql://")) {
|
|
25
|
+
if (url.includes("neon.tech"))
|
|
26
|
+
return "Neon Postgres";
|
|
27
|
+
if (url.includes("supabase"))
|
|
28
|
+
return "Supabase Postgres";
|
|
29
|
+
return "Postgres";
|
|
30
|
+
}
|
|
31
|
+
if (url.startsWith("file:"))
|
|
32
|
+
return "SQLite (local file)";
|
|
33
|
+
if (url.startsWith("libsql://") || url.includes("turso.io"))
|
|
34
|
+
return "Turso";
|
|
35
|
+
return "SQL database";
|
|
36
|
+
}
|
|
37
|
+
const MIGRATE_FLAG_KEY = "an_migrate_from_local";
|
|
20
38
|
export function getOnboardingHtml(opts = {}) {
|
|
21
39
|
const showLocalMode = !isProductionEnv() && !opts.googleOnly;
|
|
22
40
|
const showGoogle = hasGoogleOAuth();
|
|
23
41
|
const googleOnly = !!opts.googleOnly;
|
|
24
42
|
const localModeBlock = showLocalMode
|
|
25
43
|
? `
|
|
26
|
-
<div class="divider">or</div>
|
|
44
|
+
<div class="divider" id="local-divider">or</div>
|
|
27
45
|
|
|
28
46
|
<button class="btn-secondary" id="local-btn" onclick="useLocally()">Use locally without an account</button>
|
|
29
|
-
<p class="local-info">Skip auth for solo local development. You can create an account later.</p>`
|
|
47
|
+
<p class="local-info" id="local-info">Skip auth for solo local development. You can create an account later.</p>`
|
|
30
48
|
: "";
|
|
31
49
|
const localModeScript = showLocalMode
|
|
32
50
|
? `
|
|
@@ -35,6 +53,11 @@ export function getOnboardingHtml(opts = {}) {
|
|
|
35
53
|
btn.disabled = true;
|
|
36
54
|
btn.textContent = 'Setting up...';
|
|
37
55
|
try {
|
|
56
|
+
try {
|
|
57
|
+
if (localStorage.getItem('${MIGRATE_FLAG_KEY}')) {
|
|
58
|
+
localStorage.removeItem('${MIGRATE_FLAG_KEY}');
|
|
59
|
+
}
|
|
60
|
+
} catch (e) {}
|
|
38
61
|
var res = await fetch('/_agent-native/auth/local-mode', { method: 'POST' });
|
|
39
62
|
if (res.ok) {
|
|
40
63
|
window.location.reload();
|
|
@@ -52,7 +75,7 @@ export function getOnboardingHtml(opts = {}) {
|
|
|
52
75
|
<html lang="en">
|
|
53
76
|
<head>
|
|
54
77
|
<meta charset="UTF-8">
|
|
55
|
-
<meta name="viewport" content="width=device-width, initial-scale=1
|
|
78
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
|
56
79
|
<title>Welcome</title>
|
|
57
80
|
<style>
|
|
58
81
|
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
@@ -61,9 +84,11 @@ export function getOnboardingHtml(opts = {}) {
|
|
|
61
84
|
background: #0a0a0a;
|
|
62
85
|
color: #e5e5e5;
|
|
63
86
|
display: flex;
|
|
87
|
+
flex-direction: column;
|
|
64
88
|
align-items: center;
|
|
65
89
|
justify-content: center;
|
|
66
90
|
min-height: 100vh;
|
|
91
|
+
padding: 1rem;
|
|
67
92
|
}
|
|
68
93
|
.card {
|
|
69
94
|
width: 100%;
|
|
@@ -166,6 +191,18 @@ export function getOnboardingHtml(opts = {}) {
|
|
|
166
191
|
margin-top: 0.5rem;
|
|
167
192
|
line-height: 1.4;
|
|
168
193
|
}
|
|
194
|
+
.upgrade-note {
|
|
195
|
+
margin-bottom: 1rem;
|
|
196
|
+
padding: 0.75rem;
|
|
197
|
+
border: 1px solid rgba(255,255,255,0.08);
|
|
198
|
+
border-radius: 8px;
|
|
199
|
+
background: rgba(255,255,255,0.03);
|
|
200
|
+
font-size: 0.75rem;
|
|
201
|
+
line-height: 1.5;
|
|
202
|
+
color: #a1a1aa;
|
|
203
|
+
display: none;
|
|
204
|
+
}
|
|
205
|
+
.upgrade-note.show { display: block; }
|
|
169
206
|
.btn-google {
|
|
170
207
|
width: 100%;
|
|
171
208
|
display: flex;
|
|
@@ -186,12 +223,32 @@ export function getOnboardingHtml(opts = {}) {
|
|
|
186
223
|
.btn-google svg { width: 18px; height: 18px; flex-shrink: 0; }
|
|
187
224
|
.google-error { margin-top: 0.5rem; font-size: 0.8125rem; color: #f87171; display: none; }
|
|
188
225
|
.google-error.show { display: block; }
|
|
226
|
+
.local-note {
|
|
227
|
+
display: none;
|
|
228
|
+
max-width: 400px;
|
|
229
|
+
width: 100%;
|
|
230
|
+
margin-top: 1rem;
|
|
231
|
+
padding: 0.625rem 0.875rem;
|
|
232
|
+
font-size: 0.6875rem;
|
|
233
|
+
line-height: 1.5;
|
|
234
|
+
color: #666;
|
|
235
|
+
border: 1px dashed rgba(255,255,255,0.08);
|
|
236
|
+
border-radius: 8px;
|
|
237
|
+
text-align: center;
|
|
238
|
+
}
|
|
239
|
+
.local-note.show { display: block; }
|
|
240
|
+
.local-note strong { color: #999; font-weight: 500; }
|
|
241
|
+
.local-note a { color: #888; text-decoration: underline; text-underline-offset: 2px; }
|
|
242
|
+
.local-note a:hover { color: #bbb; }
|
|
189
243
|
</style>
|
|
190
244
|
</head>
|
|
191
245
|
<body>
|
|
192
246
|
<div class="card">
|
|
193
247
|
<h1>Welcome</h1>
|
|
194
248
|
<p class="subtitle">Create an account to get started</p>
|
|
249
|
+
<p class="upgrade-note" id="upgrade-note">
|
|
250
|
+
You started this flow from <code>local@localhost</code>. Continue signing in to upgrade this workspace to a real account and migrate your local data. If you want to cancel that and keep using local mode, use the secondary button below.
|
|
251
|
+
</p>
|
|
195
252
|
|
|
196
253
|
${showGoogle
|
|
197
254
|
? `
|
|
@@ -235,10 +292,35 @@ ${googleOnly
|
|
|
235
292
|
<input id="l-pass" type="password" autocomplete="current-password" placeholder="Enter password" required />
|
|
236
293
|
<button type="submit">Sign in</button>
|
|
237
294
|
<p class="msg error" id="l-msg"></p>
|
|
295
|
+
<p style="margin-top:0.75rem;font-size:0.75rem;text-align:right">
|
|
296
|
+
<a href="#" id="forgot-link" style="color:#888;text-decoration:underline;text-underline-offset:2px">Forgot password?</a>
|
|
297
|
+
</p>
|
|
298
|
+
</form>
|
|
299
|
+
|
|
300
|
+
<form id="forgot-form" class="form">
|
|
301
|
+
<label for="f-email">Email</label>
|
|
302
|
+
<input id="f-email" type="email" autocomplete="email" placeholder="you@example.com" required />
|
|
303
|
+
<button type="submit">Send reset link</button>
|
|
304
|
+
<p class="msg" id="f-msg"></p>
|
|
305
|
+
<p style="margin-top:0.75rem;font-size:0.75rem;text-align:center">
|
|
306
|
+
<a href="#" id="back-to-login" style="color:#888;text-decoration:underline;text-underline-offset:2px">Back to sign in</a>
|
|
307
|
+
</p>
|
|
238
308
|
</form>`}
|
|
239
309
|
${localModeBlock}
|
|
240
310
|
</div>
|
|
311
|
+
<p class="local-note" id="local-note">
|
|
312
|
+
This account lives in <strong>your app</strong>, not an external service. Current connection: <strong>${getConnectionLabel()}</strong>.
|
|
313
|
+
<br />
|
|
314
|
+
<a href="https://github.com/BuilderIO/agent-native#readme" target="_blank" rel="noreferrer">Connect a different database or auth provider →</a>
|
|
315
|
+
</p>
|
|
241
316
|
<script>
|
|
317
|
+
(function revealLocalNote() {
|
|
318
|
+
var h = location.hostname;
|
|
319
|
+
if (h === 'localhost' || h === '127.0.0.1' || h === '::1' || h.endsWith('.local')) {
|
|
320
|
+
var n = document.getElementById('local-note');
|
|
321
|
+
if (n) n.classList.add('show');
|
|
322
|
+
}
|
|
323
|
+
})();
|
|
242
324
|
${googleOnly
|
|
243
325
|
? ""
|
|
244
326
|
: ` var tabs = document.querySelectorAll('.tab');
|
|
@@ -252,6 +334,8 @@ ${googleOnly
|
|
|
252
334
|
|
|
253
335
|
document.getElementById('signup-form').addEventListener('submit', async function(e) {
|
|
254
336
|
e.preventDefault();
|
|
337
|
+
var form = e.currentTarget;
|
|
338
|
+
var btn = form.querySelector('button[type="submit"]');
|
|
255
339
|
var msg = document.getElementById('s-msg');
|
|
256
340
|
msg.classList.remove('show', 'error', 'success');
|
|
257
341
|
var pass = document.getElementById('s-pass').value;
|
|
@@ -261,51 +345,152 @@ ${googleOnly
|
|
|
261
345
|
msg.classList.add('show', 'error');
|
|
262
346
|
return;
|
|
263
347
|
}
|
|
264
|
-
var
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
var data = await res.json().catch(function() { return {}; });
|
|
271
|
-
if (res.ok) {
|
|
272
|
-
msg.textContent = 'Account created — signing you in...';
|
|
273
|
-
msg.classList.add('show', 'success');
|
|
274
|
-
var loginRes = await fetch('/_agent-native/auth/login', {
|
|
348
|
+
var originalLabel = btn.textContent;
|
|
349
|
+
btn.disabled = true;
|
|
350
|
+
btn.textContent = 'Creating account…';
|
|
351
|
+
try {
|
|
352
|
+
var email = document.getElementById('s-email').value;
|
|
353
|
+
var res = await fetch('/_agent-native/auth/register', {
|
|
275
354
|
method: 'POST',
|
|
276
355
|
headers: { 'Content-Type': 'application/json' },
|
|
277
356
|
body: JSON.stringify({ email: email, password: pass }),
|
|
278
357
|
});
|
|
279
|
-
|
|
280
|
-
|
|
358
|
+
var data = await res.json().catch(function() { return {}; });
|
|
359
|
+
if (res.ok) {
|
|
360
|
+
msg.textContent = 'Account created — signing you in…';
|
|
361
|
+
msg.classList.add('show', 'success');
|
|
362
|
+
btn.textContent = 'Signing in…';
|
|
363
|
+
var loginRes = await fetch('/_agent-native/auth/login', {
|
|
364
|
+
method: 'POST',
|
|
365
|
+
headers: { 'Content-Type': 'application/json' },
|
|
366
|
+
body: JSON.stringify({ email: email, password: pass }),
|
|
367
|
+
});
|
|
368
|
+
if (loginRes.ok) {
|
|
369
|
+
window.location.reload();
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
281
372
|
}
|
|
282
|
-
} else {
|
|
283
373
|
msg.textContent = data.error || 'Registration failed';
|
|
284
374
|
msg.classList.add('show', 'error');
|
|
375
|
+
btn.disabled = false;
|
|
376
|
+
btn.textContent = originalLabel;
|
|
377
|
+
} catch (err) {
|
|
378
|
+
msg.textContent = 'Network error — please try again';
|
|
379
|
+
msg.classList.add('show', 'error');
|
|
380
|
+
btn.disabled = false;
|
|
381
|
+
btn.textContent = originalLabel;
|
|
382
|
+
}
|
|
383
|
+
});
|
|
384
|
+
|
|
385
|
+
var forgotLink = document.getElementById('forgot-link');
|
|
386
|
+
var backToLogin = document.getElementById('back-to-login');
|
|
387
|
+
if (forgotLink) forgotLink.addEventListener('click', function(e) {
|
|
388
|
+
e.preventDefault();
|
|
389
|
+
document.getElementById('login-form').classList.remove('active');
|
|
390
|
+
document.getElementById('forgot-form').classList.add('active');
|
|
391
|
+
var fEmail = document.getElementById('f-email');
|
|
392
|
+
var lEmail = document.getElementById('l-email');
|
|
393
|
+
if (lEmail && lEmail.value) fEmail.value = lEmail.value;
|
|
394
|
+
setTimeout(function() { fEmail.focus(); }, 0);
|
|
395
|
+
});
|
|
396
|
+
if (backToLogin) backToLogin.addEventListener('click', function(e) {
|
|
397
|
+
e.preventDefault();
|
|
398
|
+
document.getElementById('forgot-form').classList.remove('active');
|
|
399
|
+
document.getElementById('login-form').classList.add('active');
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
var forgotForm = document.getElementById('forgot-form');
|
|
403
|
+
if (forgotForm) forgotForm.addEventListener('submit', async function(e) {
|
|
404
|
+
e.preventDefault();
|
|
405
|
+
var btn = e.currentTarget.querySelector('button[type="submit"]');
|
|
406
|
+
var msg = document.getElementById('f-msg');
|
|
407
|
+
msg.classList.remove('show', 'error', 'success');
|
|
408
|
+
var original = btn.textContent;
|
|
409
|
+
btn.disabled = true;
|
|
410
|
+
btn.textContent = 'Sending…';
|
|
411
|
+
try {
|
|
412
|
+
var email = document.getElementById('f-email').value;
|
|
413
|
+
var res = await fetch('/_agent-native/auth/ba/request-password-reset', {
|
|
414
|
+
method: 'POST',
|
|
415
|
+
headers: { 'Content-Type': 'application/json' },
|
|
416
|
+
body: JSON.stringify({ email: email }),
|
|
417
|
+
});
|
|
418
|
+
if (res.ok) {
|
|
419
|
+
msg.textContent = 'If that email exists, a reset link is on its way.';
|
|
420
|
+
msg.classList.add('show', 'success');
|
|
421
|
+
btn.textContent = 'Sent';
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
var data = await res.json().catch(function() { return {}; });
|
|
425
|
+
msg.textContent = (data && (data.message || data.error)) || 'Could not send reset email.';
|
|
426
|
+
msg.classList.add('show', 'error');
|
|
427
|
+
btn.disabled = false;
|
|
428
|
+
btn.textContent = original;
|
|
429
|
+
} catch (err) {
|
|
430
|
+
msg.textContent = 'Network error — please try again';
|
|
431
|
+
msg.classList.add('show', 'error');
|
|
432
|
+
btn.disabled = false;
|
|
433
|
+
btn.textContent = original;
|
|
285
434
|
}
|
|
286
435
|
});
|
|
287
436
|
|
|
288
437
|
document.getElementById('login-form').addEventListener('submit', async function(e) {
|
|
289
438
|
e.preventDefault();
|
|
439
|
+
var form = e.currentTarget;
|
|
440
|
+
var btn = form.querySelector('button[type="submit"]');
|
|
290
441
|
var msg = document.getElementById('l-msg');
|
|
291
442
|
msg.classList.remove('show');
|
|
292
|
-
var
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
443
|
+
var originalLabel = btn.textContent;
|
|
444
|
+
btn.disabled = true;
|
|
445
|
+
btn.textContent = 'Signing in…';
|
|
446
|
+
try {
|
|
447
|
+
var res = await fetch('/_agent-native/auth/login', {
|
|
448
|
+
method: 'POST',
|
|
449
|
+
headers: { 'Content-Type': 'application/json' },
|
|
450
|
+
body: JSON.stringify({
|
|
451
|
+
email: document.getElementById('l-email').value,
|
|
452
|
+
password: document.getElementById('l-pass').value,
|
|
453
|
+
}),
|
|
454
|
+
});
|
|
455
|
+
if (res.ok) {
|
|
456
|
+
window.location.reload();
|
|
457
|
+
return;
|
|
458
|
+
}
|
|
303
459
|
var data = await res.json().catch(function() { return {}; });
|
|
304
460
|
msg.textContent = data.error || 'Invalid email or password';
|
|
305
461
|
msg.classList.add('show');
|
|
462
|
+
btn.disabled = false;
|
|
463
|
+
btn.textContent = originalLabel;
|
|
464
|
+
} catch (err) {
|
|
465
|
+
msg.textContent = 'Network error — please try again';
|
|
466
|
+
msg.classList.add('show');
|
|
467
|
+
btn.disabled = false;
|
|
468
|
+
btn.textContent = originalLabel;
|
|
306
469
|
}
|
|
307
470
|
});
|
|
308
471
|
`}${localModeScript}
|
|
472
|
+
${showLocalMode
|
|
473
|
+
? `
|
|
474
|
+
(function syncUpgradeFromLocalUi() {
|
|
475
|
+
var subtitle = document.querySelector('.subtitle');
|
|
476
|
+
var note = document.getElementById('upgrade-note');
|
|
477
|
+
var localBtn = document.getElementById('local-btn');
|
|
478
|
+
var localInfo = document.getElementById('local-info');
|
|
479
|
+
var divider = document.getElementById('local-divider');
|
|
480
|
+
if (!subtitle || !note || !localBtn || !localInfo || !divider) return;
|
|
481
|
+
try {
|
|
482
|
+
if (!localStorage.getItem('${MIGRATE_FLAG_KEY}')) return;
|
|
483
|
+
} catch (e) {
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
subtitle.textContent = 'Sign in to upgrade your local workspace';
|
|
487
|
+
note.classList.add('show');
|
|
488
|
+
localBtn.textContent = 'Stay in local mode';
|
|
489
|
+
localInfo.textContent = 'Use this if you want to cancel the upgrade and go back to local@localhost on this device.';
|
|
490
|
+
divider.textContent = 'or stay local';
|
|
491
|
+
})();
|
|
492
|
+
`
|
|
493
|
+
: ""}
|
|
309
494
|
${showGoogle
|
|
310
495
|
? `
|
|
311
496
|
async function signInWithGoogle() {
|
|
@@ -344,4 +529,114 @@ ${showGoogle
|
|
|
344
529
|
}
|
|
345
530
|
/** @deprecated Use getOnboardingHtml() instead */
|
|
346
531
|
export const ONBOARDING_HTML = getOnboardingHtml();
|
|
532
|
+
/**
|
|
533
|
+
* HTML for the password reset page — shown when the user clicks the link in
|
|
534
|
+
* their reset email. Posts `{ newPassword, token }` to Better Auth's
|
|
535
|
+
* `/reset-password` endpoint, then redirects to the login page.
|
|
536
|
+
*/
|
|
537
|
+
export function getResetPasswordHtml() {
|
|
538
|
+
return `<!DOCTYPE html>
|
|
539
|
+
<html lang="en">
|
|
540
|
+
<head>
|
|
541
|
+
<meta charset="UTF-8">
|
|
542
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
|
543
|
+
<title>Reset password</title>
|
|
544
|
+
<style>
|
|
545
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
546
|
+
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: #0a0a0a; color: #e5e5e5; display: flex; align-items: center; justify-content: center; min-height: 100vh; padding: 1rem; }
|
|
547
|
+
.card { width: 100%; max-width: 400px; padding: 2rem; background: #141414; border: 1px solid rgba(255,255,255,0.08); border-radius: 12px; }
|
|
548
|
+
h1 { font-size: 1.25rem; font-weight: 600; margin-bottom: 0.25rem; color: #fff; }
|
|
549
|
+
.subtitle { font-size: 0.8125rem; color: #888; margin-bottom: 1.5rem; }
|
|
550
|
+
label { display: block; font-size: 0.8125rem; color: #888; margin-bottom: 0.375rem; }
|
|
551
|
+
input { width: 100%; padding: 0.5rem 0.75rem; background: transparent; border: 1px solid rgba(255,255,255,0.12); border-radius: 6px; color: #e5e5e5; font-size: 0.875rem; outline: none; margin-bottom: 0.875rem; }
|
|
552
|
+
input:focus { border-color: rgba(255,255,255,0.3); box-shadow: 0 0 0 1px rgba(255,255,255,0.1); }
|
|
553
|
+
input::placeholder { color: #555; }
|
|
554
|
+
button[type="submit"] { width: 100%; margin-top: 0.25rem; padding: 0.5rem; background: #fff; color: #000; border: none; border-radius: 6px; font-size: 0.875rem; font-weight: 500; cursor: pointer; }
|
|
555
|
+
button[type="submit"]:hover { background: #e5e5e5; }
|
|
556
|
+
button[type="submit"]:disabled { opacity: 0.5; cursor: not-allowed; }
|
|
557
|
+
.msg { margin-top: 0.75rem; font-size: 0.8125rem; display: none; }
|
|
558
|
+
.msg.error { color: #f87171; }
|
|
559
|
+
.msg.success { color: #4ade80; }
|
|
560
|
+
.msg.show { display: block; }
|
|
561
|
+
.back { display: inline-block; margin-top: 1rem; font-size: 0.75rem; color: #888; text-decoration: none; }
|
|
562
|
+
.back:hover { color: #bbb; }
|
|
563
|
+
</style>
|
|
564
|
+
</head>
|
|
565
|
+
<body>
|
|
566
|
+
<div class="card">
|
|
567
|
+
<h1>Choose a new password</h1>
|
|
568
|
+
<p class="subtitle">Set a new password for your account.</p>
|
|
569
|
+
<form id="reset-form">
|
|
570
|
+
<label for="p1">New password</label>
|
|
571
|
+
<input id="p1" type="password" autocomplete="new-password" autofocus placeholder="At least 8 characters" required minlength="8" />
|
|
572
|
+
<label for="p2">Confirm password</label>
|
|
573
|
+
<input id="p2" type="password" autocomplete="new-password" placeholder="Confirm password" required minlength="8" />
|
|
574
|
+
<button type="submit">Save new password</button>
|
|
575
|
+
<p class="msg" id="msg"></p>
|
|
576
|
+
</form>
|
|
577
|
+
<a class="back" id="back-link" href="/">Back to sign in</a>
|
|
578
|
+
</div>
|
|
579
|
+
<script>
|
|
580
|
+
(function() {
|
|
581
|
+
// Derive the app's base path so apps mounted under a prefix
|
|
582
|
+
// (e.g. /mail, /calendar) get sent home instead of to the root domain.
|
|
583
|
+
var RESET_PATH = '/_agent-native/auth/reset';
|
|
584
|
+
var pathname = window.location.pathname;
|
|
585
|
+
var idx = pathname.indexOf(RESET_PATH);
|
|
586
|
+
var basePath = (idx >= 0 ? pathname.slice(0, idx) : '') || '';
|
|
587
|
+
var homeHref = basePath + '/';
|
|
588
|
+
var backLink = document.getElementById('back-link');
|
|
589
|
+
if (backLink) backLink.setAttribute('href', homeHref);
|
|
590
|
+
var params = new URLSearchParams(location.search);
|
|
591
|
+
var token = params.get('token') || '';
|
|
592
|
+
var msg = document.getElementById('msg');
|
|
593
|
+
if (!token) {
|
|
594
|
+
msg.textContent = 'Missing or invalid reset token. Request a new reset link.';
|
|
595
|
+
msg.classList.add('show', 'error');
|
|
596
|
+
document.getElementById('reset-form').style.display = 'none';
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
document.getElementById('reset-form').addEventListener('submit', async function(e) {
|
|
600
|
+
e.preventDefault();
|
|
601
|
+
var btn = e.currentTarget.querySelector('button[type="submit"]');
|
|
602
|
+
var p1 = document.getElementById('p1').value;
|
|
603
|
+
var p2 = document.getElementById('p2').value;
|
|
604
|
+
msg.classList.remove('show', 'error', 'success');
|
|
605
|
+
if (p1 !== p2) {
|
|
606
|
+
msg.textContent = 'Passwords do not match';
|
|
607
|
+
msg.classList.add('show', 'error');
|
|
608
|
+
return;
|
|
609
|
+
}
|
|
610
|
+
var original = btn.textContent;
|
|
611
|
+
btn.disabled = true;
|
|
612
|
+
btn.textContent = 'Saving…';
|
|
613
|
+
try {
|
|
614
|
+
var res = await fetch(basePath + '/_agent-native/auth/ba/reset-password', {
|
|
615
|
+
method: 'POST',
|
|
616
|
+
headers: { 'Content-Type': 'application/json' },
|
|
617
|
+
body: JSON.stringify({ newPassword: p1, token: token }),
|
|
618
|
+
});
|
|
619
|
+
if (res.ok) {
|
|
620
|
+
msg.textContent = 'Password updated — redirecting to sign in…';
|
|
621
|
+
msg.classList.add('show', 'success');
|
|
622
|
+
setTimeout(function() { window.location.href = homeHref; }, 1200);
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
var data = await res.json().catch(function() { return {}; });
|
|
626
|
+
msg.textContent = (data && (data.message || data.error)) || 'Reset failed. The link may have expired — request a new one.';
|
|
627
|
+
msg.classList.add('show', 'error');
|
|
628
|
+
btn.disabled = false;
|
|
629
|
+
btn.textContent = original;
|
|
630
|
+
} catch (err) {
|
|
631
|
+
msg.textContent = 'Network error — please try again';
|
|
632
|
+
msg.classList.add('show', 'error');
|
|
633
|
+
btn.disabled = false;
|
|
634
|
+
btn.textContent = original;
|
|
635
|
+
}
|
|
636
|
+
});
|
|
637
|
+
})();
|
|
638
|
+
</script>
|
|
639
|
+
</body>
|
|
640
|
+
</html>`;
|
|
641
|
+
}
|
|
347
642
|
//# sourceMappingURL=onboarding-html.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding-html.js","sourceRoot":"","sources":["../../src/server/onboarding-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;IACjC,OAAO,GAAG,KAAK,aAAa,IAAI,GAAG,KAAK,MAAM,CAAC;AACjD,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AAC9E,CAAC;AAWD,MAAM,UAAU,iBAAiB,CAAC,OAA8B,EAAE;IAChE,MAAM,aAAa,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;IAC7D,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;IACrC,MAAM,cAAc,GAAG,aAAa;QAClC,CAAC,CAAC;;;;
|
|
1
|
+
{"version":3,"file":"onboarding-html.js","sourceRoot":"","sources":["../../src/server/onboarding-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll.d.ts","sourceRoot":"","sources":["../../src/server/poll.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"poll.d.ts","sourceRoot":"","sources":["../../src/server/poll.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AA2BD,8CAA8C;AAC9C,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB,GAAG,IAAI,CAOP;AAED,6CAA6C;AAC7C,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAMA;AA4ED;;;;GAIG;AACH,wBAAgB,iBAAiB;aAzFtB,MAAM;YACP,WAAW,EAAE;IAiGtB"}
|
package/dist/server/poll.js
CHANGED
|
@@ -23,6 +23,19 @@ const _buffer = [];
|
|
|
23
23
|
let _lastDbCheck = 0;
|
|
24
24
|
let _lastAppStateTs = 0;
|
|
25
25
|
let _lastSettingsTs = 0;
|
|
26
|
+
/**
|
|
27
|
+
* Tracks the latest updated_at seen on the `__screen_refresh__` key in
|
|
28
|
+
* application_state. Bumped when the agent calls the `refresh-screen` tool,
|
|
29
|
+
* and surfaced as a distinct `screen-refresh` event so clients can remount
|
|
30
|
+
* the main content subtree via React key.
|
|
31
|
+
*
|
|
32
|
+
* `_screenRefreshInitialized` guards against spurious emits on the first
|
|
33
|
+
* poll after a restart (where an existing row would look like a fresh bump).
|
|
34
|
+
* Once we've taken a baseline reading, any subsequent increase emits.
|
|
35
|
+
*/
|
|
36
|
+
let _lastScreenRefreshTs = 0;
|
|
37
|
+
let _screenRefreshInitialized = false;
|
|
38
|
+
const SCREEN_REFRESH_KEY = "__screen_refresh__";
|
|
26
39
|
/** Get the current global version counter. */
|
|
27
40
|
export function getVersion() {
|
|
28
41
|
return _version;
|
|
@@ -65,6 +78,41 @@ async function checkExternalDbChanges() {
|
|
|
65
78
|
}
|
|
66
79
|
_lastAppStateTs = appTs;
|
|
67
80
|
}
|
|
81
|
+
// Check for screen-refresh requests from the agent. The `refresh-screen`
|
|
82
|
+
// tool writes to application_state under a well-known key; when its
|
|
83
|
+
// updated_at bumps, emit a distinct event so the client invalidates
|
|
84
|
+
// all queries (not just the ones matching its default queryKey prefix).
|
|
85
|
+
const refreshResult = await db.execute({
|
|
86
|
+
sql: "SELECT updated_at, value FROM application_state WHERE key = ?",
|
|
87
|
+
args: [SCREEN_REFRESH_KEY],
|
|
88
|
+
});
|
|
89
|
+
const refreshTs = Number(refreshResult.rows[0]?.updated_at) || 0;
|
|
90
|
+
if (!_screenRefreshInitialized) {
|
|
91
|
+
// First poll — take a baseline so we don't emit for the existing row
|
|
92
|
+
// (if any). Subsequent increases will emit normally, including the
|
|
93
|
+
// very next `refresh-screen` call made by the agent.
|
|
94
|
+
_lastScreenRefreshTs = refreshTs;
|
|
95
|
+
_screenRefreshInitialized = true;
|
|
96
|
+
}
|
|
97
|
+
else if (refreshTs > _lastScreenRefreshTs) {
|
|
98
|
+
let scope;
|
|
99
|
+
try {
|
|
100
|
+
const raw = refreshResult.rows[0]?.value;
|
|
101
|
+
if (typeof raw === "string") {
|
|
102
|
+
const parsed = JSON.parse(raw);
|
|
103
|
+
if (typeof parsed?.scope === "string")
|
|
104
|
+
scope = parsed.scope;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch { }
|
|
108
|
+
recordChange({
|
|
109
|
+
source: "screen-refresh",
|
|
110
|
+
type: "change",
|
|
111
|
+
key: SCREEN_REFRESH_KEY,
|
|
112
|
+
...(scope ? { scope } : {}),
|
|
113
|
+
});
|
|
114
|
+
_lastScreenRefreshTs = refreshTs;
|
|
115
|
+
}
|
|
68
116
|
// Check settings for external writes
|
|
69
117
|
const settingsResult = await db.execute("SELECT MAX(updated_at) as max_ts FROM settings");
|
|
70
118
|
const settingsTs = Number(settingsResult.rows[0]?.max_ts) || 0;
|
package/dist/server/poll.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll.js","sourceRoot":"","sources":["../../src/server/poll.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"poll.js","sourceRoot":"","sources":["../../src/server/poll.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface RequestContext {
|
|
2
|
+
userEmail?: string;
|
|
3
|
+
orgId?: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Run a callback within a per-request context. The context is available to all
|
|
7
|
+
* async operations spawned from `fn` via `getRequestUserEmail()` / `getRequestOrgId()`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function runWithRequestContext<T>(ctx: RequestContext, fn: () => T | Promise<T>): T | Promise<T>;
|
|
10
|
+
/**
|
|
11
|
+
* Get the current request's user email.
|
|
12
|
+
* Falls back to `process.env.AGENT_USER_EMAIL` for CLI scripts.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getRequestUserEmail(): string | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Get the current request's org ID.
|
|
17
|
+
* Falls back to `process.env.AGENT_ORG_ID` for CLI scripts.
|
|
18
|
+
*/
|
|
19
|
+
export declare function getRequestOrgId(): string | undefined;
|
|
20
|
+
//# sourceMappingURL=request-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-context.d.ts","sourceRoot":"","sources":["../../src/server/request-context.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EACrC,GAAG,EAAE,cAAc,EACnB,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEhB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAExD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAEpD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-request context using AsyncLocalStorage.
|
|
3
|
+
*
|
|
4
|
+
* Replaces the unsafe pattern of mutating `process.env.AGENT_USER_EMAIL` /
|
|
5
|
+
* `process.env.AGENT_ORG_ID` on every request. On Node.js (Netlify, self-hosted)
|
|
6
|
+
* concurrent requests would overwrite each other's env vars. AsyncLocalStorage
|
|
7
|
+
* gives each async call-chain its own isolated context.
|
|
8
|
+
*
|
|
9
|
+
* Supported on all deployment targets:
|
|
10
|
+
* - Node.js (native)
|
|
11
|
+
* - Cloudflare Workers (via nodejs_compat flag)
|
|
12
|
+
* - Deno Deploy (via node:async_hooks compat)
|
|
13
|
+
*
|
|
14
|
+
* For CLI scripts that run outside a request context, the getters fall back to
|
|
15
|
+
* process.env so existing `AGENT_USER_EMAIL=x pnpm action foo` invocations
|
|
16
|
+
* continue to work.
|
|
17
|
+
*/
|
|
18
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
19
|
+
const als = new AsyncLocalStorage();
|
|
20
|
+
/**
|
|
21
|
+
* Run a callback within a per-request context. The context is available to all
|
|
22
|
+
* async operations spawned from `fn` via `getRequestUserEmail()` / `getRequestOrgId()`.
|
|
23
|
+
*/
|
|
24
|
+
export function runWithRequestContext(ctx, fn) {
|
|
25
|
+
return als.run(ctx, fn);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get the current request's user email.
|
|
29
|
+
* Falls back to `process.env.AGENT_USER_EMAIL` for CLI scripts.
|
|
30
|
+
*/
|
|
31
|
+
export function getRequestUserEmail() {
|
|
32
|
+
return als.getStore()?.userEmail ?? process.env.AGENT_USER_EMAIL;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get the current request's org ID.
|
|
36
|
+
* Falls back to `process.env.AGENT_ORG_ID` for CLI scripts.
|
|
37
|
+
*/
|
|
38
|
+
export function getRequestOrgId() {
|
|
39
|
+
return als.getStore()?.orgId ?? process.env.AGENT_ORG_ID;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=request-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-context.js","sourceRoot":"","sources":["../../src/server/request-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAOrD,MAAM,GAAG,GAAG,IAAI,iBAAiB,EAAkB,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAmB,EACnB,EAAwB;IAExB,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,GAAG,CAAC,QAAQ,EAAE,EAAE,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAC3D,CAAC"}
|
|
@@ -84,7 +84,8 @@ This is the canonical approach for new apps. Action names must be lowercase with
|
|
|
84
84
|
## Guidelines
|
|
85
85
|
|
|
86
86
|
- **One action, one job.** Keep actions focused on a single operation. The agent composes multiple action calls for complex operations.
|
|
87
|
-
- **
|
|
87
|
+
- **Always use `defineAction` with a Zod `schema:`** for input validation. The framework validates automatically and returns clear error messages for invalid input. This prevents malicious or malformed input from reaching your code. The legacy `parseArgs()` format has no runtime validation — use it only for internal/dev scripts, not user-facing actions.
|
|
88
|
+
- **Never construct SQL with string concatenation** — use the `db-exec`/`db-query` tools which parameterize queries automatically (`?` placeholders). Drizzle ORM queries are always safe.
|
|
88
89
|
- **Use `loadEnv()`** if the action needs environment variables (API keys, etc.).
|
|
89
90
|
- **Use `fail()`** for user-friendly error messages (exits with message, no stack trace).
|
|
90
91
|
- **Write results to the database.** The agent and UI will pick them up via db sync polling.
|