@agent-native/core 0.6.1 → 0.7.1
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/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +154 -4
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/types.d.ts +1 -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/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 +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +63 -225
- package/dist/client/AgentPanel.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 +15 -2
- package/dist/client/composer/MentionPopover.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +3 -1
- 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/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 +360 -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 +26 -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 +85 -14
- 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 +48 -77
- package/dist/client/resources/ResourceEditor.js.map +1 -1
- package/dist/client/resources/ResourceTree.d.ts.map +1 -1
- package/dist/client/resources/ResourceTree.js +16 -3
- 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 +135 -9
- 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 +198 -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 +118 -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/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/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/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 +81 -60
- 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/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 +164 -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/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 +32 -17
- 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/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 +51 -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 +63 -57
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +3 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +363 -48
- 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 +11 -23
- 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 +2 -1
- 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 +1 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +172 -60
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +202 -6
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/builder-browser.d.ts +40 -0
- package/dist/server/builder-browser.d.ts.map +1 -0
- package/dist/server/builder-browser.js +166 -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 +152 -6
- 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/framework-request-handler.d.ts.map +1 -1
- package/dist/server/framework-request-handler.js +42 -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 +15 -10
- 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/oauth-helpers.d.ts +1 -0
- package/dist/server/oauth-helpers.d.ts.map +1 -1
- package/dist/server/oauth-helpers.js +5 -4
- package/dist/server/oauth-helpers.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +94 -3
- package/dist/server/onboarding-html.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/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.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/skills/company-policies/SKILL.md +42 -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/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 +75 -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 +180 -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 +12 -2
- package/src/templates/default/.agents/skills/actions/SKILL.md +2 -1
- 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.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/skills/company-policies/SKILL.md +42 -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
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
*
|
|
19
19
|
* Result is cached in module scope so it's only computed once per cold start.
|
|
20
20
|
*/
|
|
21
|
-
const EMPTY = { agentsMd: "", skills: {} };
|
|
21
|
+
const EMPTY = { agentsMd: "", workspaceAgentsMd: "", skills: {} };
|
|
22
22
|
let cached = null;
|
|
23
23
|
/**
|
|
24
24
|
* Parse the YAML frontmatter at the top of a skill file.
|
|
@@ -80,14 +80,75 @@ export function parseSkillFrontmatter(content) {
|
|
|
80
80
|
}
|
|
81
81
|
import fs from "node:fs";
|
|
82
82
|
import path from "node:path";
|
|
83
|
+
/**
|
|
84
|
+
* Read one skills directory into a `Record<string, Skill>`. Extracted so
|
|
85
|
+
* both the template and workspace-core paths can reuse it. `dirPrefix` is
|
|
86
|
+
* the display path that will be reported to the agent (e.g.
|
|
87
|
+
* `.agents/skills/<name>` for templates, or
|
|
88
|
+
* `<workspace-core-package>/skills/<name>` for the workspace core).
|
|
89
|
+
*/
|
|
90
|
+
function readSkillsDir(skillsDir, rootForRelative, out, skipExistingNames) {
|
|
91
|
+
if (!fs.existsSync(skillsDir))
|
|
92
|
+
return;
|
|
93
|
+
const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
if (!entry.isDirectory() && !entry.isSymbolicLink())
|
|
96
|
+
continue;
|
|
97
|
+
const skillDirAbs = path.join(skillsDir, entry.name);
|
|
98
|
+
const skillFile = path.join(skillDirAbs, "SKILL.md");
|
|
99
|
+
try {
|
|
100
|
+
const realSkillFile = fs.realpathSync(skillFile);
|
|
101
|
+
if (!fs.existsSync(realSkillFile))
|
|
102
|
+
continue;
|
|
103
|
+
const content = fs.readFileSync(realSkillFile, "utf-8");
|
|
104
|
+
const meta = parseSkillFrontmatter(content);
|
|
105
|
+
const name = meta.name ?? entry.name;
|
|
106
|
+
if (skipExistingNames && out[name])
|
|
107
|
+
continue; // Template wins
|
|
108
|
+
const extraFiles = [];
|
|
109
|
+
try {
|
|
110
|
+
const walk = (subdir, prefix) => {
|
|
111
|
+
for (const e of fs.readdirSync(subdir, { withFileTypes: true })) {
|
|
112
|
+
const abs = path.join(subdir, e.name);
|
|
113
|
+
const rel = prefix ? `${prefix}/${e.name}` : e.name;
|
|
114
|
+
if (e.isDirectory() || e.isSymbolicLink()) {
|
|
115
|
+
try {
|
|
116
|
+
const stat = fs.statSync(abs);
|
|
117
|
+
if (stat.isDirectory())
|
|
118
|
+
walk(abs, rel);
|
|
119
|
+
}
|
|
120
|
+
catch { }
|
|
121
|
+
}
|
|
122
|
+
else if (e.isFile() && e.name !== "SKILL.md") {
|
|
123
|
+
extraFiles.push(rel);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
walk(skillDirAbs, "");
|
|
128
|
+
}
|
|
129
|
+
catch { }
|
|
130
|
+
extraFiles.sort();
|
|
131
|
+
out[name] = {
|
|
132
|
+
meta: { name, description: meta.description ?? "" },
|
|
133
|
+
content,
|
|
134
|
+
dir: path.relative(rootForRelative, skillDirAbs).replace(/\\/g, "/"),
|
|
135
|
+
extraFiles,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Skip unreadable skills
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
83
143
|
/**
|
|
84
144
|
* Read AGENTS.md + all skills directly from the filesystem rooted at `cwd`.
|
|
85
|
-
*
|
|
86
|
-
*
|
|
145
|
+
* Optionally also reads a workspace-core's AGENTS.md and skills directory
|
|
146
|
+
* and merges them in (template wins on name collisions). Used by both the
|
|
147
|
+
* Vite plugin (at build time) and the runtime fallback (in dev / Node prod).
|
|
87
148
|
*
|
|
88
149
|
* Synchronous — the Vite plugin's load hook calls it inline during the build.
|
|
89
150
|
*/
|
|
90
|
-
export function readAgentsBundleFromFs(cwd) {
|
|
151
|
+
export function readAgentsBundleFromFs(cwd, workspaceSource = null) {
|
|
91
152
|
let agentsMd = "";
|
|
92
153
|
try {
|
|
93
154
|
const agentsMdPath = path.join(cwd, "AGENTS.md");
|
|
@@ -96,79 +157,46 @@ export function readAgentsBundleFromFs(cwd) {
|
|
|
96
157
|
}
|
|
97
158
|
}
|
|
98
159
|
catch { }
|
|
160
|
+
let workspaceAgentsMd = "";
|
|
161
|
+
if (workspaceSource?.agentsMdPath) {
|
|
162
|
+
try {
|
|
163
|
+
if (fs.existsSync(workspaceSource.agentsMdPath)) {
|
|
164
|
+
workspaceAgentsMd = fs.readFileSync(workspaceSource.agentsMdPath, "utf-8");
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch { }
|
|
168
|
+
}
|
|
169
|
+
// Merge skills: template first (so its entries are authoritative), then
|
|
170
|
+
// workspace-core with skipExistingNames=true so same-named skills don't
|
|
171
|
+
// overwrite the template's.
|
|
99
172
|
const skills = {};
|
|
100
173
|
try {
|
|
101
174
|
const skillsDir = path.join(cwd, ".agents", "skills");
|
|
102
|
-
|
|
103
|
-
const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
|
|
104
|
-
for (const entry of entries) {
|
|
105
|
-
if (!entry.isDirectory() && !entry.isSymbolicLink())
|
|
106
|
-
continue;
|
|
107
|
-
const skillDirAbs = path.join(skillsDir, entry.name);
|
|
108
|
-
const skillFile = path.join(skillDirAbs, "SKILL.md");
|
|
109
|
-
try {
|
|
110
|
-
// Follow symlinks to a real file — avoids double-counting if a skill
|
|
111
|
-
// is symlinked from another location.
|
|
112
|
-
const realSkillFile = fs.realpathSync(skillFile);
|
|
113
|
-
if (!fs.existsSync(realSkillFile))
|
|
114
|
-
continue;
|
|
115
|
-
const content = fs.readFileSync(realSkillFile, "utf-8");
|
|
116
|
-
const meta = parseSkillFrontmatter(content);
|
|
117
|
-
const name = meta.name ?? entry.name;
|
|
118
|
-
if (skills[name])
|
|
119
|
-
continue; // First one wins
|
|
120
|
-
// Walk the skill directory for supporting files (anything alongside
|
|
121
|
-
// SKILL.md). Skills are folders — they may include extra markdown,
|
|
122
|
-
// images, examples, etc. that the agent can read via shell in dev.
|
|
123
|
-
const extraFiles = [];
|
|
124
|
-
try {
|
|
125
|
-
const walk = (subdir, prefix) => {
|
|
126
|
-
for (const e of fs.readdirSync(subdir, { withFileTypes: true })) {
|
|
127
|
-
const abs = path.join(subdir, e.name);
|
|
128
|
-
const rel = prefix ? `${prefix}/${e.name}` : e.name;
|
|
129
|
-
if (e.isDirectory() || e.isSymbolicLink()) {
|
|
130
|
-
try {
|
|
131
|
-
const stat = fs.statSync(abs);
|
|
132
|
-
if (stat.isDirectory())
|
|
133
|
-
walk(abs, rel);
|
|
134
|
-
}
|
|
135
|
-
catch { }
|
|
136
|
-
}
|
|
137
|
-
else if (e.isFile() && e.name !== "SKILL.md") {
|
|
138
|
-
extraFiles.push(rel);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
walk(skillDirAbs, "");
|
|
143
|
-
}
|
|
144
|
-
catch { }
|
|
145
|
-
extraFiles.sort();
|
|
146
|
-
skills[name] = {
|
|
147
|
-
meta: { name, description: meta.description ?? "" },
|
|
148
|
-
content,
|
|
149
|
-
dir: path.relative(cwd, skillDirAbs).replace(/\\/g, "/"),
|
|
150
|
-
extraFiles,
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
catch {
|
|
154
|
-
// Skip unreadable skills
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
175
|
+
readSkillsDir(skillsDir, cwd, skills, false);
|
|
158
176
|
}
|
|
159
177
|
catch { }
|
|
160
|
-
|
|
178
|
+
if (workspaceSource?.skillsDir) {
|
|
179
|
+
try {
|
|
180
|
+
readSkillsDir(workspaceSource.skillsDir, workspaceSource.rootDir, skills, true);
|
|
181
|
+
}
|
|
182
|
+
catch { }
|
|
183
|
+
}
|
|
184
|
+
return { agentsMd, workspaceAgentsMd, skills };
|
|
161
185
|
}
|
|
162
186
|
/**
|
|
163
187
|
* Load the agents bundle. Returns a cached result on subsequent calls.
|
|
164
188
|
* Tries the virtual module first (works everywhere, including edge), then
|
|
165
|
-
* falls back to filesystem reads from `process.cwd()
|
|
189
|
+
* falls back to filesystem reads from `process.cwd()` — which, when a
|
|
190
|
+
* workspace core is present, also merges in the workspace core's skills
|
|
191
|
+
* and AGENTS.md.
|
|
166
192
|
*/
|
|
167
193
|
export async function loadAgentsBundle() {
|
|
168
194
|
if (cached)
|
|
169
195
|
return cached;
|
|
170
196
|
// 1. Try the Vite-emitted virtual module. This is the path that works on
|
|
171
197
|
// every deployment target because the content is inlined at build time.
|
|
198
|
+
// The Vite plugin itself is responsible for merging workspace-core
|
|
199
|
+
// content into the bundle it emits.
|
|
172
200
|
try {
|
|
173
201
|
// @ts-expect-error — virtual module is resolved at build time by our
|
|
174
202
|
// Vite plugin; nothing exists at this path on disk.
|
|
@@ -181,9 +209,25 @@ export async function loadAgentsBundle() {
|
|
|
181
209
|
catch {
|
|
182
210
|
// Virtual module not available — fall through to filesystem.
|
|
183
211
|
}
|
|
184
|
-
// 2. Filesystem fallback —
|
|
212
|
+
// 2. Filesystem fallback — works in dev / Node prod. If a workspace core
|
|
213
|
+
// is present in the ancestor chain, merge its skills + AGENTS.md in.
|
|
185
214
|
try {
|
|
186
|
-
|
|
215
|
+
let workspaceSource = null;
|
|
216
|
+
try {
|
|
217
|
+
const { getWorkspaceCoreExports } = await import("../deploy/workspace-core.js");
|
|
218
|
+
const ws = await getWorkspaceCoreExports(process.cwd());
|
|
219
|
+
if (ws) {
|
|
220
|
+
workspaceSource = {
|
|
221
|
+
skillsDir: ws.skillsDir,
|
|
222
|
+
agentsMdPath: ws.agentsMdPath,
|
|
223
|
+
rootDir: ws.packageDir,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// workspace-core discovery isn't available (e.g. edge runtime).
|
|
229
|
+
}
|
|
230
|
+
cached = readAgentsBundleFromFs(process.cwd(), workspaceSource);
|
|
187
231
|
return cached;
|
|
188
232
|
}
|
|
189
233
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents-bundle.js","sourceRoot":"","sources":["../../src/server/agents-bundle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;
|
|
1
|
+
{"version":3,"file":"agents-bundle.js","sourceRoot":"","sources":["../../src/server/agents-bundle.ts"],"names":[],"mappings":"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"}
|
package/dist/server/auth.d.ts
CHANGED
|
@@ -74,6 +74,7 @@ export declare function runAuthGuard(event: H3Event): Promise<Response | object
|
|
|
74
74
|
* 5. Better Auth → check session via Better Auth API (cookie or Bearer)
|
|
75
75
|
* 6. Legacy cookie → check an_session cookie in legacy sessions table
|
|
76
76
|
* 7. Mobile _session query param → promote to cookie
|
|
77
|
+
* 8. Dev-mode fallback → local@localhost (never block in development)
|
|
77
78
|
*/
|
|
78
79
|
export declare function getSession(event: H3Event): Promise<AuthSession | null>;
|
|
79
80
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAOhE,KAAK,KAAK,GAAG,SAAS,CAAC;AAGvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AASlE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC7D;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAOhE,KAAK,KAAK,GAAG,SAAS,CAAC;AAGvB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AASlE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC7D;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAgHD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS7E;AAED,uDAAuD;AACvD,wBAAsB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhE;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiB3E;AAgCD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,CAG5C;AAqFD;;;;;;;;;;;;GAYG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAiG5E;AA6nBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,KAAK,EACV,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,OAAO,CAAC,CAiJlB;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAEzE"}
|
package/dist/server/auth.js
CHANGED
|
@@ -24,38 +24,33 @@ import { readBody } from "../server/h3-helpers.js";
|
|
|
24
24
|
// ---------------------------------------------------------------------------
|
|
25
25
|
const COOKIE_NAME = "an_session";
|
|
26
26
|
const DEFAULT_MAX_AGE = 60 * 60 * 24 * 30; // 30 days
|
|
27
|
+
const LOCAL_MODE_MARKER_PATH = path.resolve(process.cwd(), ".agent-native", "auth-mode");
|
|
27
28
|
// ---------------------------------------------------------------------------
|
|
28
29
|
// AUTH_MODE detection
|
|
29
30
|
// ---------------------------------------------------------------------------
|
|
30
31
|
/**
|
|
31
32
|
* Check if the app is in local-only mode (no auth).
|
|
32
33
|
*
|
|
33
|
-
* Returns true when
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* configured (no ACCESS_TOKEN, no BYOA). This makes dev "just work"
|
|
37
|
-
* without requiring auth setup, while still respecting auth when configured.
|
|
34
|
+
* Returns true when AUTH_MODE=local is explicitly set or when the dev
|
|
35
|
+
* onboarding flow has enabled local mode for the current workspace via
|
|
36
|
+
* a runtime marker file.
|
|
38
37
|
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* developer has explicitly opted into requiring authentication.
|
|
44
|
-
*
|
|
45
|
-
* BYOA (customGetSession) opts out of dev auto-local — templates that provide
|
|
46
|
-
* their own auth (e.g. Supabase) shouldn't be silently bypassed in dev.
|
|
38
|
+
* Local mode is an explicit escape hatch for when you want to guarantee
|
|
39
|
+
* no auth is used. In development, getSession() also falls back to
|
|
40
|
+
* local@localhost automatically if no other auth method succeeds, so
|
|
41
|
+
* apps are always usable without configuration in dev.
|
|
47
42
|
*/
|
|
48
|
-
function
|
|
43
|
+
async function isLocalModeEnabled() {
|
|
49
44
|
if (process.env.AUTH_MODE === "local")
|
|
50
45
|
return true;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
46
|
+
try {
|
|
47
|
+
const fs = await getFs();
|
|
48
|
+
const mode = fs.readFileSync(LOCAL_MODE_MARKER_PATH, "utf-8").trim();
|
|
49
|
+
return mode === "local";
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return false;
|
|
57
53
|
}
|
|
58
|
-
return false;
|
|
59
54
|
}
|
|
60
55
|
/**
|
|
61
56
|
* Check if we're in a development/test environment.
|
|
@@ -212,9 +207,12 @@ function createAuthGuardFn() {
|
|
|
212
207
|
const { loginHtml, publicPaths } = config;
|
|
213
208
|
const url = event.node?.req?.url ?? event.path ?? "/";
|
|
214
209
|
const p = url.split("?")[0];
|
|
215
|
-
// Skip auth routes
|
|
210
|
+
// Skip auth routes and specific Google OAuth endpoints that must be public
|
|
211
|
+
// (callback and auth-url). Other Google endpoints like /status require auth.
|
|
216
212
|
if (p.startsWith("/_agent-native/auth/") ||
|
|
217
|
-
p
|
|
213
|
+
p === "/_agent-native/google/callback" ||
|
|
214
|
+
p === "/_agent-native/google/auth-url" ||
|
|
215
|
+
p === "/_agent-native/google/add-account/callback") {
|
|
218
216
|
return;
|
|
219
217
|
}
|
|
220
218
|
// Skip static assets (Vite chunks, fonts, images, etc.)
|
|
@@ -267,10 +265,11 @@ function mapBetterAuthSession(baSession) {
|
|
|
267
265
|
* 5. Better Auth → check session via Better Auth API (cookie or Bearer)
|
|
268
266
|
* 6. Legacy cookie → check an_session cookie in legacy sessions table
|
|
269
267
|
* 7. Mobile _session query param → promote to cookie
|
|
268
|
+
* 8. Dev-mode fallback → local@localhost (never block in development)
|
|
270
269
|
*/
|
|
271
270
|
export async function getSession(event) {
|
|
272
271
|
// 1. AUTH_MODE=local — explicit local-only mode
|
|
273
|
-
if (
|
|
272
|
+
if ((await isLocalModeEnabled()) || authDisabledMode) {
|
|
274
273
|
// Check for a real session cookie first (e.g. from Google OAuth)
|
|
275
274
|
try {
|
|
276
275
|
const cookie = getCookie(event, COOKIE_NAME);
|
|
@@ -357,6 +356,13 @@ export async function getSession(event) {
|
|
|
357
356
|
return { email, token: qToken };
|
|
358
357
|
}
|
|
359
358
|
}
|
|
359
|
+
// 7. Dev-mode safety net — in development, always fall back to local@localhost
|
|
360
|
+
// so the app is usable without any auth configuration. This prevents 401
|
|
361
|
+
// errors when Better Auth isn't configured, the marker file is missing, or
|
|
362
|
+
// the user simply wants to play around locally.
|
|
363
|
+
if (isDevEnvironment()) {
|
|
364
|
+
return LOCAL_SESSION;
|
|
365
|
+
}
|
|
360
366
|
return null;
|
|
361
367
|
}
|
|
362
368
|
// ---------------------------------------------------------------------------
|
|
@@ -373,7 +379,7 @@ const TOKEN_LOGIN_HTML = `<!DOCTYPE html>
|
|
|
373
379
|
<html lang="en">
|
|
374
380
|
<head>
|
|
375
381
|
<meta charset="UTF-8">
|
|
376
|
-
<meta name="viewport" content="width=device-width, initial-scale=1
|
|
382
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
|
377
383
|
<title>Sign in</title>
|
|
378
384
|
<style>
|
|
379
385
|
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
@@ -458,21 +464,8 @@ const TOKEN_LOGIN_HTML = `<!DOCTYPE html>
|
|
|
458
464
|
async function setAuthModeLocal() {
|
|
459
465
|
try {
|
|
460
466
|
const fs = await getFs();
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
try {
|
|
464
|
-
content = fs.readFileSync(envPath, "utf-8");
|
|
465
|
-
}
|
|
466
|
-
catch {
|
|
467
|
-
// .env doesn't exist yet
|
|
468
|
-
}
|
|
469
|
-
if (content.includes("AUTH_MODE=")) {
|
|
470
|
-
content = content.replace(/AUTH_MODE=.*/g, "AUTH_MODE=local");
|
|
471
|
-
}
|
|
472
|
-
else {
|
|
473
|
-
content = content.trimEnd() + "\nAUTH_MODE=local\n";
|
|
474
|
-
}
|
|
475
|
-
fs.writeFileSync(envPath, content, "utf-8");
|
|
467
|
+
fs.mkdirSync(path.dirname(LOCAL_MODE_MARKER_PATH), { recursive: true });
|
|
468
|
+
fs.writeFileSync(LOCAL_MODE_MARKER_PATH, "local\n", "utf-8");
|
|
476
469
|
process.env.AUTH_MODE = "local";
|
|
477
470
|
return true;
|
|
478
471
|
}
|
|
@@ -483,20 +476,12 @@ async function setAuthModeLocal() {
|
|
|
483
476
|
async function removeAuthModeLocal() {
|
|
484
477
|
try {
|
|
485
478
|
const fs = await getFs();
|
|
486
|
-
const envPath = path.resolve(process.cwd(), ".env");
|
|
487
|
-
let content = "";
|
|
488
479
|
try {
|
|
489
|
-
|
|
480
|
+
fs.unlinkSync(LOCAL_MODE_MARKER_PATH);
|
|
490
481
|
}
|
|
491
482
|
catch {
|
|
492
|
-
|
|
493
|
-
}
|
|
494
|
-
// Remove AUTH_MODE=local line entirely
|
|
495
|
-
content = content
|
|
496
|
-
.split("\n")
|
|
497
|
-
.filter((line) => !line.match(/^\s*AUTH_MODE\s*=/))
|
|
498
|
-
.join("\n");
|
|
499
|
-
fs.writeFileSync(envPath, content, "utf-8");
|
|
483
|
+
// Marker already absent
|
|
484
|
+
}
|
|
500
485
|
delete process.env.AUTH_MODE;
|
|
501
486
|
return true;
|
|
502
487
|
}
|
|
@@ -549,7 +534,7 @@ async function mountBetterAuthRoutes(app, options) {
|
|
|
549
534
|
const ok = await setAuthModeLocal();
|
|
550
535
|
if (!ok) {
|
|
551
536
|
setResponseStatus(event, 500);
|
|
552
|
-
return { error: "Failed to
|
|
537
|
+
return { error: "Failed to enable local mode" };
|
|
553
538
|
}
|
|
554
539
|
return { ok: true };
|
|
555
540
|
}));
|
|
@@ -562,7 +547,7 @@ async function mountBetterAuthRoutes(app, options) {
|
|
|
562
547
|
const ok = await removeAuthModeLocal();
|
|
563
548
|
if (!ok) {
|
|
564
549
|
setResponseStatus(event, 500);
|
|
565
|
-
return { error: "Failed to
|
|
550
|
+
return { error: "Failed to disable local mode" };
|
|
566
551
|
}
|
|
567
552
|
return { ok: true };
|
|
568
553
|
}));
|
|
@@ -770,10 +755,129 @@ function mountLocalModeRoutes(app) {
|
|
|
770
755
|
const ok = await removeAuthModeLocal();
|
|
771
756
|
if (!ok) {
|
|
772
757
|
setResponseStatus(event, 500);
|
|
773
|
-
return { error: "Failed to
|
|
758
|
+
return { error: "Failed to disable local mode" };
|
|
759
|
+
}
|
|
760
|
+
return { ok: true };
|
|
761
|
+
}));
|
|
762
|
+
}
|
|
763
|
+
// ---------------------------------------------------------------------------
|
|
764
|
+
// mountAuthFallbackRoutes — minimal auth endpoints when Better Auth init fails
|
|
765
|
+
// ---------------------------------------------------------------------------
|
|
766
|
+
function mountAuthFallbackRoutes(app) {
|
|
767
|
+
app.use("/_agent-native/auth/login", defineEventHandler(async (event) => {
|
|
768
|
+
if (getMethod(event) !== "POST") {
|
|
769
|
+
setResponseStatus(event, 405);
|
|
770
|
+
return { error: "Method not allowed" };
|
|
771
|
+
}
|
|
772
|
+
const body = await readBody(event);
|
|
773
|
+
const email = body?.email?.trim?.()?.toLowerCase?.();
|
|
774
|
+
const password = body?.password;
|
|
775
|
+
if (!email || !password) {
|
|
776
|
+
setResponseStatus(event, 400);
|
|
777
|
+
return { error: "Email and password are required" };
|
|
778
|
+
}
|
|
779
|
+
try {
|
|
780
|
+
const auth = await getBetterAuth();
|
|
781
|
+
const result = await auth.api.signInEmail({
|
|
782
|
+
body: { email, password },
|
|
783
|
+
});
|
|
784
|
+
if (result?.token) {
|
|
785
|
+
setCookie(event, COOKIE_NAME, result.token, {
|
|
786
|
+
httpOnly: true,
|
|
787
|
+
secure: !isDevEnvironment(),
|
|
788
|
+
sameSite: "lax",
|
|
789
|
+
path: "/",
|
|
790
|
+
maxAge: sessionMaxAge,
|
|
791
|
+
});
|
|
792
|
+
await addSession(result.token, email);
|
|
793
|
+
}
|
|
794
|
+
return { ok: true };
|
|
795
|
+
}
|
|
796
|
+
catch (e) {
|
|
797
|
+
setResponseStatus(event, 401);
|
|
798
|
+
return { error: e?.message || "Invalid email or password" };
|
|
799
|
+
}
|
|
800
|
+
}));
|
|
801
|
+
app.use("/_agent-native/auth/register", defineEventHandler(async (event) => {
|
|
802
|
+
if (getMethod(event) !== "POST") {
|
|
803
|
+
setResponseStatus(event, 405);
|
|
804
|
+
return { error: "Method not allowed" };
|
|
805
|
+
}
|
|
806
|
+
const body = await readBody(event);
|
|
807
|
+
const email = body?.email?.trim?.()?.toLowerCase?.();
|
|
808
|
+
const password = body?.password;
|
|
809
|
+
if (!email || typeof email !== "string" || !email.includes("@")) {
|
|
810
|
+
setResponseStatus(event, 400);
|
|
811
|
+
return { error: "Valid email is required" };
|
|
812
|
+
}
|
|
813
|
+
if (!password || typeof password !== "string" || password.length < 8) {
|
|
814
|
+
setResponseStatus(event, 400);
|
|
815
|
+
return { error: "Password must be at least 8 characters" };
|
|
816
|
+
}
|
|
817
|
+
try {
|
|
818
|
+
const auth = await getBetterAuth();
|
|
819
|
+
await auth.api.signUpEmail({
|
|
820
|
+
body: { email, password, name: email.split("@")[0] },
|
|
821
|
+
});
|
|
822
|
+
return { ok: true };
|
|
823
|
+
}
|
|
824
|
+
catch (e) {
|
|
825
|
+
setResponseStatus(event, 409);
|
|
826
|
+
return { error: e?.message || "Registration failed" };
|
|
827
|
+
}
|
|
828
|
+
}));
|
|
829
|
+
app.use("/_agent-native/auth/logout", defineEventHandler(async (event) => {
|
|
830
|
+
const cookie = getCookie(event, COOKIE_NAME);
|
|
831
|
+
if (cookie)
|
|
832
|
+
await removeSession(cookie);
|
|
833
|
+
deleteCookie(event, COOKIE_NAME, { path: "/" });
|
|
834
|
+
try {
|
|
835
|
+
const auth = await getBetterAuth();
|
|
836
|
+
await auth.api.signOut({ headers: event.headers });
|
|
837
|
+
}
|
|
838
|
+
catch {
|
|
839
|
+
// Ignore if Better Auth is still unavailable
|
|
840
|
+
}
|
|
841
|
+
return { ok: true };
|
|
842
|
+
}));
|
|
843
|
+
app.use("/_agent-native/auth/local-mode", defineEventHandler(async (event) => {
|
|
844
|
+
if (getMethod(event) !== "POST") {
|
|
845
|
+
setResponseStatus(event, 405);
|
|
846
|
+
return { error: "Method not allowed" };
|
|
847
|
+
}
|
|
848
|
+
if (!isDevEnvironment()) {
|
|
849
|
+
setResponseStatus(event, 403);
|
|
850
|
+
return {
|
|
851
|
+
error: "Local mode is not available in production. Create an account to continue.",
|
|
852
|
+
};
|
|
853
|
+
}
|
|
854
|
+
const ok = await setAuthModeLocal();
|
|
855
|
+
if (!ok) {
|
|
856
|
+
setResponseStatus(event, 500);
|
|
857
|
+
return { error: "Failed to enable local mode" };
|
|
858
|
+
}
|
|
859
|
+
return { ok: true };
|
|
860
|
+
}));
|
|
861
|
+
app.use("/_agent-native/auth/exit-local-mode", defineEventHandler(async (event) => {
|
|
862
|
+
if (getMethod(event) !== "POST") {
|
|
863
|
+
setResponseStatus(event, 405);
|
|
864
|
+
return { error: "Method not allowed" };
|
|
865
|
+
}
|
|
866
|
+
const ok = await removeAuthModeLocal();
|
|
867
|
+
if (!ok) {
|
|
868
|
+
setResponseStatus(event, 500);
|
|
869
|
+
return { error: "Failed to disable local mode" };
|
|
774
870
|
}
|
|
775
871
|
return { ok: true };
|
|
776
872
|
}));
|
|
873
|
+
app.use("/_agent-native/auth/session", defineEventHandler(async (event) => {
|
|
874
|
+
if (getMethod(event) !== "GET") {
|
|
875
|
+
setResponseStatus(event, 405);
|
|
876
|
+
return { error: "Method not allowed" };
|
|
877
|
+
}
|
|
878
|
+
const session = await getSession(event);
|
|
879
|
+
return session ?? { error: "Not authenticated" };
|
|
880
|
+
}));
|
|
777
881
|
}
|
|
778
882
|
// ---------------------------------------------------------------------------
|
|
779
883
|
// autoMountAuth — the recommended entry point
|
|
@@ -815,7 +919,7 @@ export async function autoMountAuth(app, options = {}) {
|
|
|
815
919
|
return true;
|
|
816
920
|
}
|
|
817
921
|
if (!app) {
|
|
818
|
-
if (
|
|
922
|
+
if ((await isLocalModeEnabled()) || isDevEnvironment()) {
|
|
819
923
|
authDisabledMode = false;
|
|
820
924
|
customGetSession = null;
|
|
821
925
|
return false;
|
|
@@ -831,11 +935,18 @@ export async function autoMountAuth(app, options = {}) {
|
|
|
831
935
|
customGetSession = options.getSession;
|
|
832
936
|
}
|
|
833
937
|
// AUTH_MODE=local — explicit local-only mode (escape hatch)
|
|
834
|
-
if (
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
938
|
+
if (await isLocalModeEnabled()) {
|
|
939
|
+
try {
|
|
940
|
+
// Mount the standard auth endpoints and guard even in local mode so the
|
|
941
|
+
// app can switch back to real auth immediately after AUTH_MODE is
|
|
942
|
+
// cleared, without waiting for a server restart/remount.
|
|
943
|
+
await mountBetterAuthRoutes(app, options);
|
|
944
|
+
}
|
|
945
|
+
catch (err) {
|
|
946
|
+
console.error("[agent-native] Failed to initialize Better Auth in local mode:", err);
|
|
947
|
+
mountLocalModeRoutes(app);
|
|
948
|
+
}
|
|
949
|
+
console.log("[agent-native] Auth mode: local (upgrade path enabled).");
|
|
839
950
|
return false;
|
|
840
951
|
}
|
|
841
952
|
// BYOA — custom getSession provider
|
|
@@ -886,6 +997,7 @@ export async function autoMountAuth(app, options = {}) {
|
|
|
886
997
|
}
|
|
887
998
|
catch (err) {
|
|
888
999
|
console.error("[agent-native] Failed to initialize Better Auth:", err);
|
|
1000
|
+
mountAuthFallbackRoutes(app);
|
|
889
1001
|
// CRITICAL: Even if Better Auth fails, register the auth guard so
|
|
890
1002
|
// unauthenticated users can't access the app. They'll see the login
|
|
891
1003
|
// page but won't be able to sign in until the DB is available.
|