@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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Framework for agent-native application development — where AI agents and UI share state via files",
|
|
6
6
|
"license": "MIT",
|
|
@@ -20,15 +20,22 @@
|
|
|
20
20
|
"./vite": "./dist/vite/index.js",
|
|
21
21
|
"./server": "./dist/server/index.js",
|
|
22
22
|
"./server/ssr-handler": "./dist/server/ssr-handler.js",
|
|
23
|
+
"./server/agent-discovery": "./dist/server/agent-discovery.js",
|
|
24
|
+
"./server/request-context": "./dist/server/request-context.js",
|
|
23
25
|
"./db": "./dist/db/index.js",
|
|
24
26
|
"./db/schema": "./dist/db/schema.js",
|
|
25
27
|
"./client": "./dist/client/index.js",
|
|
28
|
+
"./client/onboarding": "./dist/client/onboarding/index.js",
|
|
29
|
+
"./onboarding": "./dist/onboarding/index.js",
|
|
26
30
|
"./shared": "./dist/shared/index.js",
|
|
27
31
|
"./scripts": "./dist/scripts/index.js",
|
|
28
32
|
"./application-state": "./dist/application-state/index.js",
|
|
29
33
|
"./settings": "./dist/settings/index.js",
|
|
30
34
|
"./credentials": "./dist/credentials/index.js",
|
|
35
|
+
"./file-upload": "./dist/file-upload/index.js",
|
|
31
36
|
"./resources": "./dist/resources/index.js",
|
|
37
|
+
"./resources/store": "./dist/resources/store.js",
|
|
38
|
+
"./resources/metadata": "./dist/resources/metadata.js",
|
|
32
39
|
"./oauth-tokens": "./dist/oauth-tokens/index.js",
|
|
33
40
|
"./org": "./dist/org/index.js",
|
|
34
41
|
"./client/org": "./dist/client/org/index.js",
|
|
@@ -37,6 +44,7 @@
|
|
|
37
44
|
"./collab": "./dist/collab/index.js",
|
|
38
45
|
"./a2a": "./dist/a2a/index.js",
|
|
39
46
|
"./mcp": "./dist/mcp/index.js",
|
|
47
|
+
"./mcp-client": "./dist/mcp-client/index.js",
|
|
40
48
|
"./terminal": "./dist/client/terminal/index.js",
|
|
41
49
|
"./terminal/server": "./dist/terminal/index.js",
|
|
42
50
|
"./tailwind": "./dist/tailwind.preset.js",
|
|
@@ -44,11 +52,12 @@
|
|
|
44
52
|
},
|
|
45
53
|
"files": [
|
|
46
54
|
"dist",
|
|
55
|
+
"docs",
|
|
47
56
|
"tsconfig.base.json",
|
|
48
57
|
"src/templates"
|
|
49
58
|
],
|
|
50
59
|
"scripts": {
|
|
51
|
-
"build": "tsc && cp -r src/templates dist/templates",
|
|
60
|
+
"build": "tsc && rm -rf dist/templates && cp -r src/templates dist/templates",
|
|
52
61
|
"dev": "tsc --watch",
|
|
53
62
|
"typecheck": "tsc --noEmit",
|
|
54
63
|
"test": "vitest --run",
|
|
@@ -57,6 +66,7 @@
|
|
|
57
66
|
"release": "npm version patch && npm publish --access public"
|
|
58
67
|
},
|
|
59
68
|
"dependencies": {
|
|
69
|
+
"@agent-native/shared-app-config": "workspace:*",
|
|
60
70
|
"@anthropic-ai/sdk": "^0.80.0",
|
|
61
71
|
"@clack/prompts": "^1.2.0",
|
|
62
72
|
"@libsql/client": "^0.15.0",
|
|
@@ -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.
|
|
@@ -1,14 +1,144 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: security
|
|
3
3
|
description: >-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
Secure coding guide for agent-native apps. Covers input validation, SQL
|
|
5
|
+
injection prevention, XSS, secrets management, auth patterns, data scoping,
|
|
6
|
+
and A2A security. Read this when generating any code that handles user data.
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# Security
|
|
9
|
+
# Security
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
The framework provides strong security primitives. Use them — don't reinvent security.
|
|
12
|
+
|
|
13
|
+
## Input Validation
|
|
14
|
+
|
|
15
|
+
**Always use `defineAction` with a Zod `schema:`** for every action that accepts user input. The framework validates automatically and returns clear error messages.
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
// SECURE — framework validates before run() is called
|
|
19
|
+
export default defineAction({
|
|
20
|
+
description: "Create a note",
|
|
21
|
+
schema: z.object({
|
|
22
|
+
title: z.string().min(1).max(200),
|
|
23
|
+
content: z.string().optional(),
|
|
24
|
+
}),
|
|
25
|
+
run: async (args) => {
|
|
26
|
+
// args is guaranteed valid — { title: string; content?: string }
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
The legacy `parameters:` format (plain JSON Schema) has **no runtime validation** — the agent receives whatever the caller sends. Do not use it for new code.
|
|
32
|
+
|
|
33
|
+
Actions without a `schema:` are unvalidated. This is acceptable for internal/dev scripts but never for user-facing operations.
|
|
34
|
+
|
|
35
|
+
## SQL Injection Prevention
|
|
36
|
+
|
|
37
|
+
The framework's `db-query` and `db-exec` tools use **parameterized queries** (`?` placeholders). The database driver handles escaping — user input never touches the SQL string.
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
// WRONG — SQL injection vulnerability
|
|
41
|
+
await exec(`INSERT INTO notes (title) VALUES ('${title}')`)
|
|
42
|
+
await exec(`SELECT * FROM notes WHERE title LIKE '%${search}%'`)
|
|
43
|
+
|
|
44
|
+
// RIGHT — parameterized queries (framework default)
|
|
45
|
+
await exec({ sql: "INSERT INTO notes (title) VALUES (?)", args: [title] })
|
|
46
|
+
await exec({ sql: "SELECT * FROM notes WHERE title LIKE ?", args: [`%${search}%`] })
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**Drizzle ORM is always safe** — it generates parameterized queries automatically:
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
const notes = await db.select().from(notesTable).where(eq(notesTable.title, title));
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**When is SQL injection a risk?**
|
|
56
|
+
- Only when writing raw SQL with string concatenation in server routes or actions
|
|
57
|
+
- Never when using `db-query`/`db-exec` with `args` arrays
|
|
58
|
+
- Never when using Drizzle ORM
|
|
59
|
+
|
|
60
|
+
## XSS Prevention
|
|
61
|
+
|
|
62
|
+
React auto-escapes all JSX expressions by default. Trust it.
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
// SAFE — React escapes the output
|
|
66
|
+
<p>{userInput}</p>
|
|
67
|
+
<span>{comment.text}</span>
|
|
68
|
+
|
|
69
|
+
// DANGEROUS — bypasses React's escaping
|
|
70
|
+
<div dangerouslySetInnerHTML={{ __html: userInput }} /> // NEVER with user content
|
|
71
|
+
element.innerHTML = userInput; // NEVER
|
|
72
|
+
eval(userInput); // NEVER
|
|
73
|
+
document.write(userInput); // NEVER
|
|
74
|
+
new Function(userInput); // NEVER
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**For rich text:** Use TipTap (framework dependency) with the Collaboration extension. TipTap sanitizes content through its schema — only allowed node types render.
|
|
78
|
+
|
|
79
|
+
**For markdown:** Use `react-markdown` (already used in the framework). It parses markdown to React elements without `dangerouslySetInnerHTML`.
|
|
80
|
+
|
|
81
|
+
**For HTML from external sources:** If you absolutely must render external HTML, use a sanitization library like `dompurify`. But prefer structured data (markdown, TipTap JSON) over raw HTML.
|
|
82
|
+
|
|
83
|
+
## Secrets Management
|
|
84
|
+
|
|
85
|
+
| Secret type | Where to store | Why |
|
|
86
|
+
|-------------|---------------|-----|
|
|
87
|
+
| API keys (OpenAI, Stripe, etc.) | `.env` file (gitignored) | Never committed, server-side only |
|
|
88
|
+
| OAuth tokens (Google, GitHub) | `oauth_tokens` store | Per-user, per-provider, server-side |
|
|
89
|
+
| App configuration | `settings` store | OK for non-secret config (themes, preferences) |
|
|
90
|
+
| Session tokens | Framework handles | Automatic via Better Auth |
|
|
91
|
+
|
|
92
|
+
**Rules:**
|
|
93
|
+
- Never store secrets in `settings`, `application_state`, or source code
|
|
94
|
+
- Never return secrets in action responses — they may appear in agent chat or client UI
|
|
95
|
+
- Never log secrets (tokens, keys, passwords)
|
|
96
|
+
- Never commit `.env` files — they're gitignored by default
|
|
97
|
+
- Access env vars via `process.env` in actions/server code, never send them to the client
|
|
98
|
+
|
|
99
|
+
## Auth Patterns
|
|
100
|
+
|
|
101
|
+
### Use `defineAction` (recommended)
|
|
102
|
+
|
|
103
|
+
Actions defined with `defineAction` are automatically protected by the auth guard. Unauthenticated requests get a 401 response. This is the safest pattern.
|
|
104
|
+
|
|
105
|
+
```ts
|
|
106
|
+
// Auto-protected — auth guard runs before this code
|
|
107
|
+
export default defineAction({
|
|
108
|
+
description: "Delete a note",
|
|
109
|
+
schema: z.object({ id: z.string() }),
|
|
110
|
+
run: async (args) => {
|
|
111
|
+
// Only authenticated users reach here
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Custom `/api/` routes (use sparingly)
|
|
117
|
+
|
|
118
|
+
If you must create custom routes (file uploads, streaming, webhooks), always check auth:
|
|
119
|
+
|
|
120
|
+
```ts
|
|
121
|
+
// server/routes/api/upload.ts
|
|
122
|
+
import { getSession } from "@agent-native/core/server";
|
|
123
|
+
|
|
124
|
+
export default defineEventHandler(async (event) => {
|
|
125
|
+
const session = await getSession(event);
|
|
126
|
+
if (!session?.email) {
|
|
127
|
+
setResponseStatus(event, 401);
|
|
128
|
+
return { error: "Unauthorized" };
|
|
129
|
+
}
|
|
130
|
+
// ... handle upload with session.email
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### CSRF Protection
|
|
135
|
+
|
|
136
|
+
The framework uses `SameSite=lax` cookies with `httpOnly` flag. This prevents most CSRF attacks. Additional rules:
|
|
137
|
+
- State-changing actions should use POST (the default for `defineAction`)
|
|
138
|
+
- GET actions (`http: { method: "GET" }`) should be read-only
|
|
139
|
+
- Never perform writes in response to GET requests
|
|
140
|
+
|
|
141
|
+
## Data Scoping
|
|
12
142
|
|
|
13
143
|
In production, the framework enforces data isolation at the SQL level. Agents and users can only see and modify data they own. This is automatic — you don't write WHERE clauses yourself.
|
|
14
144
|
|
|
@@ -41,45 +171,17 @@ For multi-user apps where teams share data, add an `org_id` column:
|
|
|
41
171
|
export const projects = table("projects", {
|
|
42
172
|
id: text("id").primaryKey(),
|
|
43
173
|
name: text("name").notNull(),
|
|
44
|
-
owner_email: text("owner_email").notNull(),
|
|
45
|
-
org_id: text("org_id").notNull(),
|
|
174
|
+
owner_email: text("owner_email").notNull(),
|
|
175
|
+
org_id: text("org_id").notNull(),
|
|
46
176
|
});
|
|
47
177
|
```
|
|
48
178
|
|
|
49
179
|
When both columns are present, queries are scoped by **both**: `WHERE owner_email = ? AND org_id = ?`.
|
|
50
180
|
|
|
51
|
-
The `org_id` comes from `AGENT_ORG_ID` which is automatically set from the user's active organization in Better Auth.
|
|
52
|
-
|
|
53
181
|
### Validation
|
|
54
182
|
|
|
55
183
|
Run `pnpm action db-check-scoping` to verify all tables have proper ownership columns. Use `--require-org` for multi-org apps.
|
|
56
184
|
|
|
57
|
-
## Auth Model
|
|
58
|
-
|
|
59
|
-
### Better Auth (Default)
|
|
60
|
-
|
|
61
|
-
The framework uses Better Auth for authentication. It's always on by default — users create an account on first visit.
|
|
62
|
-
|
|
63
|
-
**Environment variables:**
|
|
64
|
-
- `BETTER_AUTH_SECRET` — signing key (auto-generated if not set)
|
|
65
|
-
- `GOOGLE_CLIENT_ID` + `GOOGLE_CLIENT_SECRET` — enable Google OAuth
|
|
66
|
-
- `GITHUB_CLIENT_ID` + `GITHUB_CLIENT_SECRET` — enable GitHub OAuth
|
|
67
|
-
- `AUTH_MODE=local` — disable auth for solo local dev (escape hatch)
|
|
68
|
-
|
|
69
|
-
### Organizations
|
|
70
|
-
|
|
71
|
-
Better Auth's organization plugin is built-in. Every app supports:
|
|
72
|
-
- Creating organizations
|
|
73
|
-
- Inviting members (owner/admin/member roles)
|
|
74
|
-
- Switching active organization
|
|
75
|
-
- Per-org data scoping via `org_id`
|
|
76
|
-
|
|
77
|
-
The active organization ID flows from `session.orgId` → `AGENT_ORG_ID` → SQL scoping automatically.
|
|
78
|
-
|
|
79
|
-
### ACCESS_TOKEN (Legacy)
|
|
80
|
-
|
|
81
|
-
For simple deployments, set `ACCESS_TOKEN` or `ACCESS_TOKENS` (comma-separated) as environment variables. This provides a shared token for all users — no per-user identity.
|
|
82
|
-
|
|
83
185
|
## A2A Security
|
|
84
186
|
|
|
85
187
|
### Cross-App Identity
|
|
@@ -87,7 +189,6 @@ For simple deployments, set `ACCESS_TOKEN` or `ACCESS_TOKENS` (comma-separated)
|
|
|
87
189
|
When apps call each other via A2A, they need to verify identity. Set the same `A2A_SECRET` on all apps that need to trust each other:
|
|
88
190
|
|
|
89
191
|
```bash
|
|
90
|
-
# On both apps
|
|
91
192
|
A2A_SECRET=your-shared-secret-at-least-32-chars
|
|
92
193
|
```
|
|
93
194
|
|
|
@@ -102,7 +203,11 @@ Without `A2A_SECRET`, A2A calls are unauthenticated (fine for local dev, not pro
|
|
|
102
203
|
## Rules for Agents
|
|
103
204
|
|
|
104
205
|
1. **Every new table with user data must have `owner_email`.** No exceptions.
|
|
105
|
-
2. **
|
|
106
|
-
3. **
|
|
107
|
-
4. **
|
|
108
|
-
5. **
|
|
206
|
+
2. **Always use `defineAction` with a Zod `schema:`** for input validation on user-facing actions.
|
|
207
|
+
3. **Never concatenate user input into SQL** — use parameterized queries or Drizzle ORM.
|
|
208
|
+
4. **Never use `dangerouslySetInnerHTML`** or `innerHTML` with user-controlled content.
|
|
209
|
+
5. **Never store secrets outside `.env` or `oauth_tokens`** — no settings, no source code, no responses.
|
|
210
|
+
6. **Never bypass scoping** — don't raw-query tables without going through `db-query`/`db-exec`.
|
|
211
|
+
7. **Never create unprotected routes that modify data** — use `defineAction` or check `getSession()`.
|
|
212
|
+
8. **Don't hardcode emails** — use `AGENT_USER_EMAIL` environment variable.
|
|
213
|
+
9. **Don't expose user data in application state** — it's per-session, not per-user. Use SQL tables with `owner_email`.
|
|
@@ -78,7 +78,7 @@ Query via `getDb()` singleton from `server/db/index.ts`.
|
|
|
78
78
|
|
|
79
79
|
### 4. OAuth Tokens — credentials
|
|
80
80
|
|
|
81
|
-
For OAuth tokens acquired at runtime (Google, etc.). Never store these in settings — use the dedicated
|
|
81
|
+
For OAuth tokens acquired at runtime (Google, etc.). Never store these in settings — use the dedicated store.
|
|
82
82
|
|
|
83
83
|
```ts
|
|
84
84
|
import { saveOAuthTokens, getOAuthTokens, listOAuthAccounts } from "@agent-native/core/oauth-tokens";
|
|
@@ -108,3 +108,9 @@ Infrastructure config stays in `.env` — these differ per deployment:
|
|
|
108
108
|
- `ACCESS_TOKEN` — production auth token
|
|
109
109
|
|
|
110
110
|
Everything else (user settings, tokens, app state) goes in SQL.
|
|
111
|
+
|
|
112
|
+
## Security Rules
|
|
113
|
+
|
|
114
|
+
- **Never store API keys or secrets in Settings or Application State** — use `.env` for API keys (gitignored) and the `oauth_tokens` store for OAuth credentials. Settings and application state are readable by the client.
|
|
115
|
+
- **Every Drizzle table with user data must have `owner_email`** — the framework auto-scopes queries in production so users only see their own data. Run `pnpm action db-check-scoping` to verify. See the `security` skill for the full model.
|
|
116
|
+
- **Never return secrets in action responses** — action responses may be visible in the agent chat or sent to the client. Keep credentials server-side only.
|
|
@@ -23,7 +23,10 @@ export function Layout({ children }: { children: React.ReactNode }) {
|
|
|
23
23
|
<html lang="en" suppressHydrationWarning>
|
|
24
24
|
<head>
|
|
25
25
|
<meta charSet="utf-8" />
|
|
26
|
-
<meta
|
|
26
|
+
<meta
|
|
27
|
+
name="viewport"
|
|
28
|
+
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
|
|
29
|
+
/>
|
|
27
30
|
<link rel="manifest" href="/manifest.json" />
|
|
28
31
|
<meta name="theme-color" content="#111111" />
|
|
29
32
|
<meta name="mobile-web-app-capable" content="yes" />
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# {{APP_TITLE}} — Enterprise Agent Instructions
|
|
2
|
+
|
|
3
|
+
These instructions apply to **every app** in the {{APP_TITLE}} workspace. The
|
|
4
|
+
framework auto-injects this file into each app's agent system prompt as a
|
|
5
|
+
`<resource name="AGENTS.md" scope="workspace">` block. Individual apps can
|
|
6
|
+
add their own template-specific AGENTS.md on top.
|
|
7
|
+
|
|
8
|
+
## Company context
|
|
9
|
+
|
|
10
|
+
Write a short paragraph here describing your company and what you do. The
|
|
11
|
+
agent reads this first so every response can be grounded in the same
|
|
12
|
+
business context without you having to repeat it per app.
|
|
13
|
+
|
|
14
|
+
## Shared conventions
|
|
15
|
+
|
|
16
|
+
- **All cross-app state lives in the shared database.** Apps in this
|
|
17
|
+
workspace share `DATABASE_URL` by default, so a record created by one
|
|
18
|
+
app can be read by another as long as it respects the `owner_email` and
|
|
19
|
+
`org_id` scoping conventions.
|
|
20
|
+
- **All API secrets come from the central credential store.** Never
|
|
21
|
+
hardcode a token. Call `resolveCompanyCredential("KEY")` from
|
|
22
|
+
`@{{APP_NAME}}/core-module/credentials` — it pulls from env first and
|
|
23
|
+
falls back to the shared settings table so one rotation updates every
|
|
24
|
+
app.
|
|
25
|
+
- **UI chrome comes from the workspace core.** Wrap every screen in
|
|
26
|
+
`<AuthenticatedLayout>` from `@{{APP_NAME}}/core-module/client`. Don't
|
|
27
|
+
re-implement the brand header, sidebar, or org switcher per app.
|
|
28
|
+
- **Design system.** If the app needs a button, dialog, or form control,
|
|
29
|
+
import from our internal design system package (if you have one) or
|
|
30
|
+
from the shared UI re-exports in `@{{APP_NAME}}/core-module/client`.
|
|
31
|
+
|
|
32
|
+
## Compliance and policy
|
|
33
|
+
|
|
34
|
+
List any enterprise-wide rules the agent must follow — data handling, PII
|
|
35
|
+
guidelines, approval flows, deployment constraints. The agent will apply
|
|
36
|
+
these to every decision it makes in every app.
|
|
37
|
+
|
|
38
|
+
Example rules:
|
|
39
|
+
|
|
40
|
+
- Never expose raw customer email addresses in logs.
|
|
41
|
+
- Any action that modifies data must first be shown to the user with a
|
|
42
|
+
preview and wait for confirmation.
|
|
43
|
+
- Never make network calls to anything outside `*.{{APP_NAME}}.com` or
|
|
44
|
+
the approved third-party allowlist.
|
|
45
|
+
|
|
46
|
+
## How to add a new app
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
cd apps
|
|
50
|
+
pnpm exec agent-native create <app-name>
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The new app will automatically inherit:
|
|
54
|
+
|
|
55
|
+
1. The workspace auth plugin (Better Auth + company SSO)
|
|
56
|
+
2. The agent chat plugin with this AGENTS.md pre-loaded
|
|
57
|
+
3. Every skill in `packages/core-module/skills/`
|
|
58
|
+
4. Every action in `packages/core-module/actions/`
|
|
59
|
+
5. The shared Tailwind preset and React components
|
|
60
|
+
|
|
61
|
+
The only files the new app needs to own are its own routes/screens and any
|
|
62
|
+
template-specific actions.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared action: look up an employee in the company directory.
|
|
3
|
+
*
|
|
4
|
+
* Every app in the workspace inherits this action automatically — no
|
|
5
|
+
* wiring required. From the agent's perspective it behaves exactly like
|
|
6
|
+
* a template action: the tool shows up in every app's agent, and calling
|
|
7
|
+
* it from the UI via `useActionQuery("company-directory", { ... })` Just
|
|
8
|
+
* Works.
|
|
9
|
+
*
|
|
10
|
+
* Replace the stub implementation with a real call to your company
|
|
11
|
+
* directory (SCIM, Okta Users API, internal /people endpoint, etc.).
|
|
12
|
+
*/
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
import { defineAction } from "@agent-native/core";
|
|
15
|
+
|
|
16
|
+
export default defineAction({
|
|
17
|
+
description:
|
|
18
|
+
"Look up a person in the {{APP_TITLE}} company directory by name or email. Returns role, team, and manager.",
|
|
19
|
+
schema: z.object({
|
|
20
|
+
query: z.string().describe("Name, email, or partial match to search for"),
|
|
21
|
+
}),
|
|
22
|
+
run: async (args) => {
|
|
23
|
+
// TODO: replace with a real lookup. This stub just echoes the query
|
|
24
|
+
// so the agent has a reasonable no-op while you wire up the real
|
|
25
|
+
// directory integration.
|
|
26
|
+
return {
|
|
27
|
+
results: [
|
|
28
|
+
{
|
|
29
|
+
query: args.query,
|
|
30
|
+
name: "(stub) " + args.query,
|
|
31
|
+
role: "Unknown",
|
|
32
|
+
team: "Unknown",
|
|
33
|
+
manager: null,
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
},
|
|
38
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@{{APP_NAME}}/core-module",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.0.0",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./src/index.ts",
|
|
9
|
+
"default": "./src/index.ts"
|
|
10
|
+
},
|
|
11
|
+
"./server": {
|
|
12
|
+
"types": "./src/server/index.ts",
|
|
13
|
+
"default": "./src/server/index.ts"
|
|
14
|
+
},
|
|
15
|
+
"./client": {
|
|
16
|
+
"types": "./src/client/index.ts",
|
|
17
|
+
"default": "./src/client/index.ts"
|
|
18
|
+
},
|
|
19
|
+
"./credentials": {
|
|
20
|
+
"types": "./src/credentials.ts",
|
|
21
|
+
"default": "./src/credentials.ts"
|
|
22
|
+
},
|
|
23
|
+
"./tailwind": {
|
|
24
|
+
"types": "./tailwind.preset.ts",
|
|
25
|
+
"default": "./tailwind.preset.ts"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@agent-native/core": "^0.6.0"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/react": "^18.3.23",
|
|
33
|
+
"react": "^18.3.1",
|
|
34
|
+
"typescript": "^5.9.2"
|
|
35
|
+
},
|
|
36
|
+
"peerDependencies": {
|
|
37
|
+
"react": "^18.3.1"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: company-policies
|
|
3
|
+
description: {{APP_TITLE}}-wide policies the agent must enforce for every app — data handling, PII, approval flows, compliance rules.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# {{APP_TITLE}} Company Policies
|
|
7
|
+
|
|
8
|
+
Every app in the workspace shares these policies. Read this skill before
|
|
9
|
+
taking any action that touches customer data, external services, or
|
|
10
|
+
deployed state.
|
|
11
|
+
|
|
12
|
+
## Data handling
|
|
13
|
+
|
|
14
|
+
- **PII minimization.** Only load the fields you actually need. Never
|
|
15
|
+
`SELECT *` on a table that contains customer records.
|
|
16
|
+
- **No raw customer email in logs.** Hash or redact before logging.
|
|
17
|
+
- **Retention.** Deleted records are soft-deleted first and purged by a
|
|
18
|
+
scheduled job. Do not write actions that hard-delete customer data.
|
|
19
|
+
|
|
20
|
+
## Third-party calls
|
|
21
|
+
|
|
22
|
+
- **Allowlist only.** Only call domains on the approved allowlist
|
|
23
|
+
(documented in the root `README.md`). If an integration needs a new
|
|
24
|
+
domain, surface a warning and wait for human approval before making
|
|
25
|
+
the call.
|
|
26
|
+
- **Secrets come from `resolveCompanyCredential`.** Never hardcode.
|
|
27
|
+
Never check secrets into git. Rotating a key in the central store
|
|
28
|
+
updates every app on the next request.
|
|
29
|
+
|
|
30
|
+
## Approval flows
|
|
31
|
+
|
|
32
|
+
- **Destructive operations need a confirmation preview.** Any action
|
|
33
|
+
that modifies production data must first return a preview of the
|
|
34
|
+
change (what will be created / updated / deleted) and wait for
|
|
35
|
+
explicit user confirmation before executing.
|
|
36
|
+
|
|
37
|
+
## Apply across apps
|
|
38
|
+
|
|
39
|
+
This skill is loaded automatically in every workspace app. If an
|
|
40
|
+
individual app needs different behavior, it can add a same-named skill
|
|
41
|
+
under its own `.agents/skills/company-policies/SKILL.md` and that copy
|
|
42
|
+
will win for that app only.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared authenticated layout for every app in the @{{APP_NAME}} workspace.
|
|
3
|
+
*
|
|
4
|
+
* Provides the common chrome (brand header, user menu, agent chat sidebar)
|
|
5
|
+
* so individual apps only have to render their own content. Replace this
|
|
6
|
+
* with a real component that pulls in your design system. Every app
|
|
7
|
+
* imports it the same way:
|
|
8
|
+
*
|
|
9
|
+
* import { AuthenticatedLayout } from "@{{APP_NAME}}/core-module/client";
|
|
10
|
+
*
|
|
11
|
+
* export default function Home() {
|
|
12
|
+
* return (
|
|
13
|
+
* <AuthenticatedLayout>
|
|
14
|
+
* <h1>My app's screen</h1>
|
|
15
|
+
* </AuthenticatedLayout>
|
|
16
|
+
* );
|
|
17
|
+
* }
|
|
18
|
+
*/
|
|
19
|
+
import type { ReactNode } from "react";
|
|
20
|
+
|
|
21
|
+
export interface AuthenticatedLayoutProps {
|
|
22
|
+
children: ReactNode;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Workspace title — replaced at scaffold time by the create-workspace CLI.
|
|
26
|
+
const WORKSPACE_TITLE = "{{APP_TITLE}}";
|
|
27
|
+
|
|
28
|
+
export function AuthenticatedLayout({ children }: AuthenticatedLayoutProps) {
|
|
29
|
+
return (
|
|
30
|
+
<div className="min-h-screen flex flex-col">
|
|
31
|
+
<header className="border-b px-6 py-3">
|
|
32
|
+
<strong>{WORKSPACE_TITLE}</strong>
|
|
33
|
+
</header>
|
|
34
|
+
<main className="flex-1 p-6">{children}</main>
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side entry for @{{APP_NAME}}/core-module.
|
|
3
|
+
*
|
|
4
|
+
* This is where shared React components, hooks, and providers that EVERY
|
|
5
|
+
* app in your workspace needs live. Think of it as the "app shell" layer
|
|
6
|
+
* between the framework's primitives (@agent-native/core/client) and the
|
|
7
|
+
* individual app's screens:
|
|
8
|
+
*
|
|
9
|
+
* - Authenticated layouts (header / sidebar / footer with brand)
|
|
10
|
+
* - Org switchers wired to your company's org plugin
|
|
11
|
+
* - Common chrome: loading states, error boundaries, empty states
|
|
12
|
+
* - Wrappers around @agent-native/core components that apply your
|
|
13
|
+
* enterprise design tokens
|
|
14
|
+
*
|
|
15
|
+
* Apps import from here instead of re-implementing or copy-pasting:
|
|
16
|
+
*
|
|
17
|
+
* import { AuthenticatedLayout } from "@{{APP_NAME}}/core-module/client";
|
|
18
|
+
*
|
|
19
|
+
* NOTE: This package does not ship shadcn/ui or a generic design system
|
|
20
|
+
* by default. If you already have an internal `@{{APP_NAME}}/design-system`
|
|
21
|
+
* package, add it as a dep here and re-export from this file. Otherwise
|
|
22
|
+
* you can drop any shadcn components the apps share into `./ui/` and
|
|
23
|
+
* export them from this index.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
export { AuthenticatedLayout } from "./AuthenticatedLayout.js";
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized credential helpers for the @{{APP_NAME}} workspace.
|
|
3
|
+
*
|
|
4
|
+
* Every enterprise has a few API keys that multiple apps need to share:
|
|
5
|
+
* a Slack bot token, a Sentry DSN, an OpenAI key, internal service
|
|
6
|
+
* credentials. Instead of each app reading them separately, we namespace
|
|
7
|
+
* them here so there's a single place to update when a key rotates.
|
|
8
|
+
*
|
|
9
|
+
* Under the hood this is a thin wrapper over @agent-native/core's
|
|
10
|
+
* `resolveCredential()`, which reads `process.env.<KEY>` first and
|
|
11
|
+
* falls back to `credential:<KEY>` in the shared settings table.
|
|
12
|
+
* Apps inside the workspace share the same DATABASE_URL by default,
|
|
13
|
+
* so storing a credential once makes it available everywhere.
|
|
14
|
+
*/
|
|
15
|
+
import { resolveCredential } from "@agent-native/core/credentials";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a company-wide credential. Prefer this over `resolveCredential()`
|
|
19
|
+
* directly — it keeps your keys organized under a workspace namespace and
|
|
20
|
+
* makes "where does this secret come from" greppable.
|
|
21
|
+
*
|
|
22
|
+
* Example:
|
|
23
|
+
* const slackToken = await resolveCompanyCredential("SLACK_BOT_TOKEN");
|
|
24
|
+
*/
|
|
25
|
+
export async function resolveCompanyCredential(
|
|
26
|
+
key: string,
|
|
27
|
+
): Promise<string | undefined> {
|
|
28
|
+
return await resolveCredential(key);
|
|
29
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @{{APP_NAME}}/core-module — enterprise-wide workspace core.
|
|
3
|
+
*
|
|
4
|
+
* Every agent-native app in this workspace inherits from this package:
|
|
5
|
+
* - Server plugins (auth, org, agent-chat) — see src/server
|
|
6
|
+
* - Shared React components and hooks — see src/client
|
|
7
|
+
* - Shared agent actions — see actions/
|
|
8
|
+
* - Shared agent skills — see skills/
|
|
9
|
+
* - Enterprise-wide agent instructions — see AGENTS.md
|
|
10
|
+
* - Shared Tailwind preset — see tailwind.preset.ts
|
|
11
|
+
*
|
|
12
|
+
* Apps don't import from this root entry directly — they import from
|
|
13
|
+
* the specific sub-path they need:
|
|
14
|
+
*
|
|
15
|
+
* import { authPlugin } from "@{{APP_NAME}}/core-module/server";
|
|
16
|
+
* import { AuthenticatedLayout } from "@{{APP_NAME}}/core-module/client";
|
|
17
|
+
* import { resolveCompanyCredential } from "@{{APP_NAME}}/core-module/credentials";
|
|
18
|
+
*
|
|
19
|
+
* This root file is for package metadata only.
|
|
20
|
+
*/
|
|
21
|
+
export const WORKSPACE_CORE_NAME = "@{{APP_NAME}}/core-module";
|