@agent-native/core 0.4.1 → 0.4.3
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 +31 -0
- package/dist/adapters/convex/adapter.d.ts +24 -0
- package/dist/adapters/convex/adapter.d.ts.map +1 -0
- package/dist/adapters/convex/adapter.js +125 -0
- package/dist/adapters/convex/adapter.js.map +1 -0
- package/dist/adapters/convex/index.d.ts +4 -0
- package/dist/adapters/convex/index.d.ts.map +1 -0
- package/dist/adapters/convex/index.js +3 -0
- package/dist/adapters/convex/index.js.map +1 -0
- package/dist/adapters/drizzle/adapter.d.ts +36 -0
- package/dist/adapters/drizzle/adapter.d.ts.map +1 -0
- package/dist/adapters/drizzle/adapter.js +210 -0
- package/dist/adapters/drizzle/adapter.js.map +1 -0
- package/dist/adapters/drizzle/index.d.ts +3 -0
- package/dist/adapters/drizzle/index.d.ts.map +1 -0
- package/dist/adapters/drizzle/index.js +3 -0
- package/dist/adapters/drizzle/index.js.map +1 -0
- package/dist/adapters/drizzle/schema.d.ts +146 -0
- package/dist/adapters/drizzle/schema.d.ts.map +1 -0
- package/dist/adapters/drizzle/schema.js +20 -0
- package/dist/adapters/drizzle/schema.js.map +1 -0
- package/dist/adapters/firestore/adapter.d.ts +3 -2
- package/dist/adapters/firestore/adapter.d.ts.map +1 -1
- package/dist/adapters/firestore/adapter.js +23 -6
- package/dist/adapters/firestore/adapter.js.map +1 -1
- package/dist/adapters/supabase/adapter.d.ts +2 -1
- package/dist/adapters/supabase/adapter.d.ts.map +1 -1
- package/dist/adapters/supabase/adapter.js +4 -1
- package/dist/adapters/supabase/adapter.js.map +1 -1
- package/dist/adapters/sync/config.d.ts +22 -2
- package/dist/adapters/sync/config.d.ts.map +1 -1
- package/dist/adapters/sync/config.js +175 -16
- package/dist/adapters/sync/config.js.map +1 -1
- package/dist/adapters/sync/create-file-sync.d.ts +32 -0
- package/dist/adapters/sync/create-file-sync.d.ts.map +1 -0
- package/dist/adapters/sync/create-file-sync.js +218 -0
- package/dist/adapters/sync/create-file-sync.js.map +1 -0
- package/dist/adapters/sync/file-sync.d.ts +40 -6
- package/dist/adapters/sync/file-sync.d.ts.map +1 -1
- package/dist/adapters/sync/file-sync.js +442 -97
- package/dist/adapters/sync/file-sync.js.map +1 -1
- package/dist/adapters/sync/index.d.ts +3 -2
- package/dist/adapters/sync/index.d.ts.map +1 -1
- package/dist/adapters/sync/index.js +3 -1
- package/dist/adapters/sync/index.js.map +1 -1
- package/dist/adapters/sync/merge.js +3 -2
- package/dist/adapters/sync/merge.js.map +1 -1
- package/dist/adapters/sync/types.d.ts +36 -2
- package/dist/adapters/sync/types.d.ts.map +1 -1
- package/dist/adapters/sync/types.js +22 -1
- package/dist/adapters/sync/types.js.map +1 -1
- package/dist/agent/index.d.ts +3 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +2 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/production-agent.d.ts +16 -0
- package/dist/agent/production-agent.d.ts.map +1 -0
- package/dist/agent/production-agent.js +158 -0
- package/dist/agent/production-agent.js.map +1 -0
- package/dist/agent/types.d.ts +40 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +2 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/application-state/emitter.d.ts +10 -0
- package/dist/application-state/emitter.d.ts.map +1 -0
- package/dist/application-state/emitter.js +18 -0
- package/dist/application-state/emitter.js.map +1 -0
- package/dist/application-state/handlers.d.ts +20 -0
- package/dist/application-state/handlers.d.ts.map +1 -0
- package/dist/application-state/handlers.js +94 -0
- package/dist/application-state/handlers.js.map +1 -0
- package/dist/application-state/index.d.ts +5 -0
- package/dist/application-state/index.d.ts.map +1 -0
- package/dist/application-state/index.js +9 -0
- package/dist/application-state/index.js.map +1 -0
- package/dist/application-state/script-helpers.d.ts +17 -0
- package/dist/application-state/script-helpers.d.ts.map +1 -0
- package/dist/application-state/script-helpers.js +28 -0
- package/dist/application-state/script-helpers.js.map +1 -0
- package/dist/application-state/store.d.ts +9 -0
- package/dist/application-state/store.d.ts.map +1 -0
- package/dist/application-state/store.js +93 -0
- package/dist/application-state/store.js.map +1 -0
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +40 -24
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +37 -11
- package/dist/cli/index.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +53 -0
- package/dist/client/AgentPanel.d.ts.map +1 -0
- package/dist/client/AgentPanel.js +70 -0
- package/dist/client/AgentPanel.js.map +1 -0
- package/dist/client/AssistantChat.d.ts +27 -0
- package/dist/client/AssistantChat.d.ts.map +1 -0
- package/dist/client/AssistantChat.js +165 -0
- package/dist/client/AssistantChat.js.map +1 -0
- package/dist/client/ErrorBoundary.d.ts +4 -0
- package/dist/client/ErrorBoundary.d.ts.map +1 -0
- package/dist/client/ErrorBoundary.js +22 -0
- package/dist/client/ErrorBoundary.js.map +1 -0
- package/dist/client/MultiTabAssistantChat.d.ts +4 -0
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -0
- package/dist/client/MultiTabAssistantChat.js +125 -0
- package/dist/client/MultiTabAssistantChat.js.map +1 -0
- package/dist/client/PoweredByBadge.d.ts +14 -0
- package/dist/client/PoweredByBadge.d.ts.map +1 -0
- package/dist/client/PoweredByBadge.js +60 -0
- package/dist/client/PoweredByBadge.js.map +1 -0
- package/dist/client/ProductionAgentPanel.d.ts +6 -0
- package/dist/client/ProductionAgentPanel.d.ts.map +1 -0
- package/dist/client/ProductionAgentPanel.js +6 -0
- package/dist/client/ProductionAgentPanel.js.map +1 -0
- package/dist/client/Turnstile.d.ts +35 -0
- package/dist/client/Turnstile.d.ts.map +1 -0
- package/dist/client/Turnstile.js +77 -0
- package/dist/client/Turnstile.js.map +1 -0
- package/dist/client/agent-chat-adapter.d.ts +10 -0
- package/dist/client/agent-chat-adapter.d.ts.map +1 -0
- package/dist/client/agent-chat-adapter.js +235 -0
- package/dist/client/agent-chat-adapter.js.map +1 -0
- package/dist/client/agent-chat.d.ts +9 -1
- package/dist/client/agent-chat.d.ts.map +1 -1
- package/dist/client/agent-chat.js +11 -1
- package/dist/client/agent-chat.js.map +1 -1
- package/dist/client/index.d.ts +13 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +14 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/terminal/AgentTerminal.d.ts +35 -0
- package/dist/client/terminal/AgentTerminal.d.ts.map +1 -0
- package/dist/client/terminal/AgentTerminal.js +346 -0
- package/dist/client/terminal/AgentTerminal.js.map +1 -0
- package/dist/client/terminal/index.d.ts +7 -0
- package/dist/client/terminal/index.d.ts.map +1 -0
- package/dist/client/terminal/index.js +7 -0
- package/dist/client/terminal/index.js.map +1 -0
- package/dist/client/use-agent-chat.d.ts +1 -1
- package/dist/client/use-agent-chat.d.ts.map +1 -1
- package/dist/client/use-agent-chat.js +1 -1
- package/dist/client/use-agent-chat.js.map +1 -1
- package/dist/client/use-file-sync-status.d.ts +21 -0
- package/dist/client/use-file-sync-status.d.ts.map +1 -0
- package/dist/client/use-file-sync-status.js +65 -0
- package/dist/client/use-file-sync-status.js.map +1 -0
- package/dist/client/use-session.d.ts +16 -0
- package/dist/client/use-session.d.ts.map +1 -0
- package/dist/client/use-session.js +49 -0
- package/dist/client/use-session.js.map +1 -0
- package/dist/client/useProductionAgent.d.ts +23 -0
- package/dist/client/useProductionAgent.d.ts.map +1 -0
- package/dist/client/useProductionAgent.js +137 -0
- package/dist/client/useProductionAgent.js.map +1 -0
- package/dist/db/create-get-db.d.ts +3 -0
- package/dist/db/create-get-db.d.ts.map +1 -0
- package/dist/db/create-get-db.js +18 -0
- package/dist/db/create-get-db.js.map +1 -0
- package/dist/db/index.d.ts +23 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +19 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrations.d.ts +7 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +35 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/index.browser.d.ts +1 -1
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +1 -1
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/oauth-tokens/index.d.ts +2 -0
- package/dist/oauth-tokens/index.d.ts.map +1 -0
- package/dist/oauth-tokens/index.js +2 -0
- package/dist/oauth-tokens/index.js.map +1 -0
- package/dist/oauth-tokens/store.d.ts +9 -0
- package/dist/oauth-tokens/store.d.ts.map +1 -0
- package/dist/oauth-tokens/store.js +90 -0
- package/dist/oauth-tokens/store.js.map +1 -0
- package/dist/router/index.d.ts +3 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +5 -0
- package/dist/router/index.js.map +1 -0
- package/dist/scripts/core-scripts.d.ts +10 -0
- package/dist/scripts/core-scripts.d.ts.map +1 -0
- package/dist/scripts/core-scripts.js +15 -0
- package/dist/scripts/core-scripts.js.map +1 -0
- package/dist/scripts/db/exec.d.ts +11 -0
- package/dist/scripts/db/exec.d.ts.map +1 -0
- package/dist/scripts/db/exec.js +101 -0
- package/dist/scripts/db/exec.js.map +1 -0
- package/dist/scripts/db/index.d.ts +2 -0
- package/dist/scripts/db/index.d.ts.map +1 -0
- package/dist/scripts/db/index.js +6 -0
- package/dist/scripts/db/index.js.map +1 -0
- package/dist/scripts/db/query.d.ts +10 -0
- package/dist/scripts/db/query.d.ts.map +1 -0
- package/dist/scripts/db/query.js +112 -0
- package/dist/scripts/db/query.js.map +1 -0
- package/dist/scripts/db/schema.d.ts +12 -0
- package/dist/scripts/db/schema.d.ts.map +1 -0
- package/dist/scripts/db/schema.js +140 -0
- package/dist/scripts/db/schema.js.map +1 -0
- package/dist/scripts/dev/index.d.ts +15 -0
- package/dist/scripts/dev/index.d.ts.map +1 -0
- package/dist/scripts/dev/index.js +118 -0
- package/dist/scripts/dev/index.js.map +1 -0
- package/dist/scripts/dev/list-files.d.ts +5 -0
- package/dist/scripts/dev/list-files.d.ts.map +1 -0
- package/dist/scripts/dev/list-files.js +102 -0
- package/dist/scripts/dev/list-files.js.map +1 -0
- package/dist/scripts/dev/read-file.d.ts +5 -0
- package/dist/scripts/dev/read-file.d.ts.map +1 -0
- package/dist/scripts/dev/read-file.js +68 -0
- package/dist/scripts/dev/read-file.js.map +1 -0
- package/dist/scripts/dev/search-files.d.ts +5 -0
- package/dist/scripts/dev/search-files.d.ts.map +1 -0
- package/dist/scripts/dev/search-files.js +133 -0
- package/dist/scripts/dev/search-files.js.map +1 -0
- package/dist/scripts/dev/shell.d.ts +5 -0
- package/dist/scripts/dev/shell.d.ts.map +1 -0
- package/dist/scripts/dev/shell.js +65 -0
- package/dist/scripts/dev/shell.js.map +1 -0
- package/dist/scripts/dev/write-file.d.ts +5 -0
- package/dist/scripts/dev/write-file.d.ts.map +1 -0
- package/dist/scripts/dev/write-file.js +50 -0
- package/dist/scripts/dev/write-file.js.map +1 -0
- package/dist/scripts/index.d.ts +5 -0
- package/dist/scripts/index.d.ts.map +1 -1
- package/dist/scripts/index.js +5 -0
- package/dist/scripts/index.js.map +1 -1
- package/dist/scripts/runner.d.ts +3 -0
- package/dist/scripts/runner.d.ts.map +1 -1
- package/dist/scripts/runner.js +53 -14
- package/dist/scripts/runner.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +43 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -0
- package/dist/server/agent-chat-plugin.js +92 -0
- package/dist/server/agent-chat-plugin.js.map +1 -0
- package/dist/server/auth-plugin.d.ts +6 -0
- package/dist/server/auth-plugin.d.ts.map +1 -0
- package/dist/server/auth-plugin.js +8 -0
- package/dist/server/auth-plugin.js.map +1 -0
- package/dist/server/auth.d.ts +75 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/auth.js +499 -0
- package/dist/server/auth.js.map +1 -0
- package/dist/server/captcha.d.ts +12 -0
- package/dist/server/captcha.d.ts.map +1 -0
- package/dist/server/captcha.js +43 -0
- package/dist/server/captcha.js.map +1 -0
- package/dist/server/create-server.d.ts +20 -10
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +48 -28
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/default-watcher.d.ts +17 -0
- package/dist/server/default-watcher.d.ts.map +1 -0
- package/dist/server/default-watcher.js +37 -0
- package/dist/server/default-watcher.js.map +1 -0
- package/dist/server/file-sync-plugin.d.ts +7 -0
- package/dist/server/file-sync-plugin.d.ts.map +1 -0
- package/dist/server/file-sync-plugin.js +38 -0
- package/dist/server/file-sync-plugin.js.map +1 -0
- package/dist/server/google-auth-plugin.d.ts +22 -0
- package/dist/server/google-auth-plugin.d.ts.map +1 -0
- package/dist/server/google-auth-plugin.js +122 -0
- package/dist/server/google-auth-plugin.js.map +1 -0
- package/dist/server/index.d.ts +13 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +14 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/missing-key.d.ts +9 -5
- package/dist/server/missing-key.d.ts.map +1 -1
- package/dist/server/missing-key.js +12 -7
- package/dist/server/missing-key.js.map +1 -1
- package/dist/server/sse.d.ts +18 -8
- package/dist/server/sse.d.ts.map +1 -1
- package/dist/server/sse.js +90 -19
- package/dist/server/sse.js.map +1 -1
- package/dist/settings/handlers.d.ts +9 -0
- package/dist/settings/handlers.d.ts.map +1 -0
- package/dist/settings/handlers.js +29 -0
- package/dist/settings/handlers.js.map +1 -0
- package/dist/settings/index.d.ts +5 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +9 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/script-helpers.d.ts +9 -0
- package/dist/settings/script-helpers.d.ts.map +1 -0
- package/dist/settings/script-helpers.js +16 -0
- package/dist/settings/script-helpers.js.map +1 -0
- package/dist/settings/store.d.ts +7 -0
- package/dist/settings/store.d.ts.map +1 -0
- package/dist/settings/store.js +88 -0
- package/dist/settings/store.js.map +1 -0
- package/dist/settings/user-settings.d.ts +21 -0
- package/dist/settings/user-settings.d.ts.map +1 -0
- package/dist/settings/user-settings.js +35 -0
- package/dist/settings/user-settings.js.map +1 -0
- package/dist/tailwind.preset.js +1 -1
- package/dist/tailwind.preset.js.map +1 -1
- package/dist/terminal/cli-registry.d.ts +16 -0
- package/dist/terminal/cli-registry.d.ts.map +1 -0
- package/dist/terminal/cli-registry.js +42 -0
- package/dist/terminal/cli-registry.js.map +1 -0
- package/dist/terminal/index.d.ts +9 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +9 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/pty-server.d.ts +31 -0
- package/dist/terminal/pty-server.d.ts.map +1 -0
- package/dist/terminal/pty-server.js +252 -0
- package/dist/terminal/pty-server.js.map +1 -0
- package/dist/terminal/terminal-plugin.d.ts +23 -0
- package/dist/terminal/terminal-plugin.d.ts.map +1 -0
- package/dist/terminal/terminal-plugin.js +90 -0
- package/dist/terminal/terminal-plugin.js.map +1 -0
- package/dist/vite/client.d.ts +28 -5
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +55 -16
- package/dist/vite/client.js.map +1 -1
- package/dist/vite/dev-api-server.d.ts +10 -0
- package/dist/vite/dev-api-server.d.ts.map +1 -0
- package/dist/vite/dev-api-server.js +160 -0
- package/dist/vite/dev-api-server.js.map +1 -0
- package/dist/vite/index.d.ts +2 -3
- package/dist/vite/index.d.ts.map +1 -1
- package/dist/vite/index.js +2 -3
- package/dist/vite/index.js.map +1 -1
- package/package.json +74 -19
- package/src/templates/default/.agents/skills/create-skill/SKILL.md +1 -1
- package/src/templates/default/.agents/skills/delegate-to-agent/SKILL.md +3 -3
- package/src/templates/default/.agents/skills/files-as-database/SKILL.md +82 -63
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +2 -2
- package/src/templates/default/.agents/skills/scripts/SKILL.md +20 -17
- package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +2 -2
- package/src/templates/default/.agents/skills/sse-file-watcher/SKILL.md +49 -64
- package/src/templates/default/.ignore +0 -0
- package/src/templates/default/AGENTS.md +129 -28
- package/src/templates/default/_gitignore +9 -5
- package/src/templates/default/app/entry.client.tsx +4 -0
- package/src/templates/default/app/entry.server.tsx +55 -0
- package/src/templates/default/app/global.css +95 -0
- package/src/templates/default/app/root.tsx +95 -0
- package/src/templates/default/app/routes/_index.tsx +62 -0
- package/src/templates/default/app/routes.ts +4 -0
- package/src/templates/default/app/vite-env.d.ts +6 -0
- package/src/templates/default/application-state/.gitkeep +0 -0
- package/src/templates/default/components.json +1 -1
- package/src/templates/default/data/sync-config.json +1 -0
- package/src/templates/default/package.json +7 -8
- package/src/templates/default/react-router.config.ts +6 -0
- package/src/templates/default/scripts/run.ts +1 -8
- package/src/templates/default/server/plugins/agent-chat.ts +1 -0
- package/src/templates/default/server/plugins/auth.ts +1 -0
- package/src/templates/default/server/plugins/file-sync.ts +1 -0
- package/src/templates/default/server/plugins/terminal.ts +1 -0
- package/src/templates/default/server/routes/[...page].get.ts +12 -0
- package/src/templates/default/server/routes/api/events.get.ts +3 -0
- package/src/templates/default/server/routes/api/file-sync/status.get.ts +4 -0
- package/src/templates/default/server/routes/api/hello.get.ts +5 -0
- package/src/templates/default/tailwind.config.ts +1 -1
- package/src/templates/default/tsconfig.json +9 -1
- package/src/templates/default/vite.config.ts +4 -1
- package/tsconfig.base.json +5 -3
- package/dist/adapters/neon/adapter.d.ts +0 -28
- package/dist/adapters/neon/adapter.d.ts.map +0 -1
- package/dist/adapters/neon/adapter.js +0 -135
- package/dist/adapters/neon/adapter.js.map +0 -1
- package/dist/adapters/neon/index.d.ts +0 -3
- package/dist/adapters/neon/index.d.ts.map +0 -1
- package/dist/adapters/neon/index.js +0 -3
- package/dist/adapters/neon/index.js.map +0 -1
- package/dist/server/production.d.ts +0 -18
- package/dist/server/production.d.ts.map +0 -1
- package/dist/server/production.js +0 -37
- package/dist/server/production.js.map +0 -1
- package/dist/vite/express-plugin.d.ts +0 -14
- package/dist/vite/express-plugin.d.ts.map +0 -1
- package/dist/vite/express-plugin.js +0 -53
- package/dist/vite/express-plugin.js.map +0 -1
- package/dist/vite/server.d.ts +0 -21
- package/dist/vite/server.d.ts.map +0 -1
- package/dist/vite/server.js +0 -68
- package/dist/vite/server.js.map +0 -1
- package/src/templates/default/client/App.tsx +0 -56
- package/src/templates/default/client/global.css +0 -75
- package/src/templates/default/client/vite-env.d.ts +0 -1
- package/src/templates/default/index.html +0 -14
- package/src/templates/default/server/index.ts +0 -22
- package/src/templates/default/server/node-build.ts +0 -4
- package/src/templates/default/vite.config.server.ts +0 -3
- /package/src/templates/default/{client → app}/lib/utils.ts +0 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import { createApp, createRouter, toNodeListener } from "h3";
|
|
4
|
+
/**
|
|
5
|
+
* Map a Nitro-style route file path to { method, route }.
|
|
6
|
+
*
|
|
7
|
+
* Examples:
|
|
8
|
+
* api/emails/index.get.ts → GET /api/emails
|
|
9
|
+
* api/emails/[id].get.ts → GET /api/emails/:id
|
|
10
|
+
* api/emails/[id]/star.patch.ts→ PATCH /api/emails/:id/star
|
|
11
|
+
* api/events.get.ts → GET /api/events
|
|
12
|
+
*/
|
|
13
|
+
function parseRouteFile(relPath) {
|
|
14
|
+
// Strip .ts extension
|
|
15
|
+
const withoutExt = relPath.replace(/\.ts$/, "");
|
|
16
|
+
// Extract HTTP method from the last segment (e.g. "status.get" → method="get")
|
|
17
|
+
const dotIdx = withoutExt.lastIndexOf(".");
|
|
18
|
+
if (dotIdx === -1)
|
|
19
|
+
return null;
|
|
20
|
+
const method = withoutExt.slice(dotIdx + 1).toLowerCase();
|
|
21
|
+
const validMethods = ["get", "post", "put", "patch", "delete", "options"];
|
|
22
|
+
if (!validMethods.includes(method))
|
|
23
|
+
return null;
|
|
24
|
+
let routePath = withoutExt.slice(0, dotIdx);
|
|
25
|
+
// Replace [param] with :param
|
|
26
|
+
routePath = routePath.replace(/\[([^\]]+)\]/g, ":$1");
|
|
27
|
+
// Remove trailing /index
|
|
28
|
+
routePath = routePath.replace(/\/index$/, "");
|
|
29
|
+
// Ensure leading slash
|
|
30
|
+
if (!routePath.startsWith("/"))
|
|
31
|
+
routePath = "/" + routePath;
|
|
32
|
+
return { method, route: routePath };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Recursively discover all .ts files under a directory.
|
|
36
|
+
*/
|
|
37
|
+
function discoverFiles(dir, prefix = "") {
|
|
38
|
+
if (!fs.existsSync(dir))
|
|
39
|
+
return [];
|
|
40
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
41
|
+
const files = [];
|
|
42
|
+
for (const entry of entries) {
|
|
43
|
+
const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
44
|
+
if (entry.isDirectory()) {
|
|
45
|
+
files.push(...discoverFiles(path.join(dir, entry.name), rel));
|
|
46
|
+
}
|
|
47
|
+
else if (entry.name.endsWith(".ts")) {
|
|
48
|
+
files.push(rel);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return files;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Load all API routes and server plugins, return an H3 listener.
|
|
55
|
+
*/
|
|
56
|
+
async function buildApiListener(server, cwd) {
|
|
57
|
+
const apiDir = path.join(cwd, "server/routes/api");
|
|
58
|
+
const pluginsDir = path.join(cwd, "server/plugins");
|
|
59
|
+
const app = createApp();
|
|
60
|
+
const router = createRouter();
|
|
61
|
+
app.use(router);
|
|
62
|
+
// Discover and register API route files
|
|
63
|
+
const routeFiles = discoverFiles(apiDir, "api");
|
|
64
|
+
let registered = 0;
|
|
65
|
+
for (const relFile of routeFiles) {
|
|
66
|
+
const parsed = parseRouteFile(relFile);
|
|
67
|
+
if (!parsed)
|
|
68
|
+
continue;
|
|
69
|
+
const absPath = path.join(cwd, "server/routes", relFile);
|
|
70
|
+
try {
|
|
71
|
+
const mod = await server.ssrLoadModule(`/${path.relative(cwd, absPath)}`);
|
|
72
|
+
const handler = mod.default;
|
|
73
|
+
if (typeof handler !== "function")
|
|
74
|
+
continue;
|
|
75
|
+
const routerMethod = router[parsed.method];
|
|
76
|
+
if (typeof routerMethod === "function") {
|
|
77
|
+
routerMethod.call(router, parsed.route, handler);
|
|
78
|
+
registered++;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
console.warn(`[dev-api-server] Failed to load route ${relFile}:`, e.message);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Run server plugins (auth, file-sync, etc.)
|
|
86
|
+
if (fs.existsSync(pluginsDir)) {
|
|
87
|
+
const pluginFiles = fs
|
|
88
|
+
.readdirSync(pluginsDir)
|
|
89
|
+
.filter((f) => f.endsWith(".ts"))
|
|
90
|
+
.sort();
|
|
91
|
+
for (const file of pluginFiles) {
|
|
92
|
+
try {
|
|
93
|
+
const absPath = path.join(pluginsDir, file);
|
|
94
|
+
const mod = await server.ssrLoadModule(`/${path.relative(cwd, absPath)}`);
|
|
95
|
+
const plugin = mod.default;
|
|
96
|
+
if (typeof plugin === "function") {
|
|
97
|
+
await plugin({ h3App: app });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
console.warn(`[dev-api-server] Failed to load plugin ${file}:`, e.message);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
console.log(`[dev-api-server] ${registered} API routes registered`);
|
|
106
|
+
return toNodeListener(app);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Vite plugin that serves H3 API routes from server/routes/api/ during dev.
|
|
110
|
+
*
|
|
111
|
+
* This replaces the disabled Nitro Vite plugin for dev-mode API route serving.
|
|
112
|
+
* It scans the file-based routes, imports them, and mounts them on an H3 app
|
|
113
|
+
* that handles /api/* requests before React Router's SSR handler.
|
|
114
|
+
*/
|
|
115
|
+
export function devApiServer() {
|
|
116
|
+
return {
|
|
117
|
+
name: "agent-native-dev-api-server",
|
|
118
|
+
apply: "serve",
|
|
119
|
+
configureServer(server) {
|
|
120
|
+
const cwd = server.config.root || process.cwd();
|
|
121
|
+
const apiDir = path.join(cwd, "server/routes/api");
|
|
122
|
+
const serverDir = path.join(cwd, "server");
|
|
123
|
+
// Skip if no API routes directory exists
|
|
124
|
+
if (!fs.existsSync(apiDir))
|
|
125
|
+
return;
|
|
126
|
+
// Lazily initialize the H3 listener on first /api/ request.
|
|
127
|
+
// This avoids blocking server startup and ensures ssrLoadModule is ready.
|
|
128
|
+
let listenerPromise = null;
|
|
129
|
+
// Watch server/ directory for changes and invalidate the listener
|
|
130
|
+
// so it rebuilds on the next API request (no full restart needed).
|
|
131
|
+
if (fs.existsSync(serverDir)) {
|
|
132
|
+
const watcher = fs.watch(serverDir, { recursive: true }, (_, filename) => {
|
|
133
|
+
if (filename && filename.endsWith(".ts")) {
|
|
134
|
+
listenerPromise = null;
|
|
135
|
+
console.log(`[dev-api-server] Server file changed: ${filename} — will reload on next request`);
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
server.httpServer?.on("close", () => watcher.close());
|
|
139
|
+
}
|
|
140
|
+
// Add middleware DIRECTLY (not via return) so it runs BEFORE
|
|
141
|
+
// Vite's internal middleware and React Router's SSR handler.
|
|
142
|
+
server.middlewares.use((req, res, next) => {
|
|
143
|
+
if (!req.url?.startsWith("/api/")) {
|
|
144
|
+
return next();
|
|
145
|
+
}
|
|
146
|
+
if (!listenerPromise) {
|
|
147
|
+
listenerPromise = buildApiListener(server, cwd);
|
|
148
|
+
}
|
|
149
|
+
listenerPromise
|
|
150
|
+
.then((listener) => listener(req, res))
|
|
151
|
+
.catch((err) => {
|
|
152
|
+
console.error("[dev-api-server] Error handling request:", err);
|
|
153
|
+
res.statusCode = 500;
|
|
154
|
+
res.end(JSON.stringify({ error: "Internal server error" }));
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=dev-api-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-api-server.js","sourceRoot":"","sources":["../../src/vite/dev-api-server.ts"],"names":[],"mappings":"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"}
|
package/dist/vite/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { defineConfig, type ClientConfigOptions } from "./client.js";
|
|
2
|
-
export {
|
|
3
|
-
export { expressPlugin, type ExpressPluginOptions } from "./express-plugin.js";
|
|
1
|
+
export { defineConfig, type ClientConfigOptions, type NitroOptions, } from "./client.js";
|
|
2
|
+
export { devApiServer } from "./dev-api-server.js";
|
|
4
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/vite/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,KAAK,mBAAmB,EACxB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/vite/index.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { defineConfig } from "./client.js";
|
|
2
|
-
export {
|
|
3
|
-
export { expressPlugin } from "./express-plugin.js";
|
|
1
|
+
export { defineConfig, } from "./client.js";
|
|
2
|
+
export { devApiServer } from "./dev-api-server.js";
|
|
4
3
|
//# sourceMappingURL=index.js.map
|
package/dist/vite/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAGb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.3",
|
|
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",
|
|
@@ -19,15 +19,23 @@
|
|
|
19
19
|
},
|
|
20
20
|
"./vite": "./dist/vite/index.js",
|
|
21
21
|
"./server": "./dist/server/index.js",
|
|
22
|
+
"./db": "./dist/db/index.js",
|
|
22
23
|
"./client": "./dist/client/index.js",
|
|
23
24
|
"./shared": "./dist/shared/index.js",
|
|
24
25
|
"./scripts": "./dist/scripts/index.js",
|
|
26
|
+
"./application-state": "./dist/application-state/index.js",
|
|
27
|
+
"./settings": "./dist/settings/index.js",
|
|
28
|
+
"./oauth-tokens": "./dist/oauth-tokens/index.js",
|
|
25
29
|
"./adapters/sync": "./dist/adapters/sync/index.js",
|
|
30
|
+
"./adapters/drizzle": "./dist/adapters/drizzle/index.js",
|
|
26
31
|
"./adapters/firestore": "./dist/adapters/firestore/index.js",
|
|
27
32
|
"./adapters/supabase": "./dist/adapters/supabase/index.js",
|
|
28
|
-
"./adapters/
|
|
33
|
+
"./adapters/convex": "./dist/adapters/convex/index.js",
|
|
29
34
|
"./adapters/cli": "./dist/adapters/cli/index.js",
|
|
35
|
+
"./router": "./dist/router/index.js",
|
|
30
36
|
"./a2a": "./dist/a2a/index.js",
|
|
37
|
+
"./terminal": "./dist/client/terminal/index.js",
|
|
38
|
+
"./terminal/server": "./dist/terminal/index.js",
|
|
31
39
|
"./tailwind": "./dist/tailwind.preset.js",
|
|
32
40
|
"./tsconfig.base.json": "./tsconfig.base.json"
|
|
33
41
|
},
|
|
@@ -46,29 +54,55 @@
|
|
|
46
54
|
"release": "npm version patch && npm publish --access public"
|
|
47
55
|
},
|
|
48
56
|
"dependencies": {
|
|
57
|
+
"@anthropic-ai/sdk": "^0.80.0",
|
|
58
|
+
"@libsql/client": "^0.15.0",
|
|
59
|
+
"@react-router/dev": "^7.13.1",
|
|
60
|
+
"@react-router/fs-routes": "^7.13.1",
|
|
61
|
+
"@tailwindcss/typography": "^0.5.19",
|
|
62
|
+
"better-sqlite3": "^12.8.0",
|
|
49
63
|
"chokidar": "^4.0.0",
|
|
50
64
|
"clsx": "^2.1.1",
|
|
51
65
|
"dotenv": "^17.2.1",
|
|
66
|
+
"drizzle-orm": "^0.44.0",
|
|
67
|
+
"h3": "^1.14.0",
|
|
68
|
+
"isbot": "^5",
|
|
52
69
|
"minimatch": "^10.0.0",
|
|
70
|
+
"nitro": "^3.0.0",
|
|
71
|
+
"p-limit": "^7.3.0",
|
|
72
|
+
"react-markdown": "^10.1.0",
|
|
73
|
+
"react-router": "^7.13.1",
|
|
74
|
+
"remark-gfm": "^4.0.1",
|
|
53
75
|
"tailwind-merge": "^2.6.0"
|
|
54
76
|
},
|
|
55
77
|
"peerDependencies": {
|
|
78
|
+
"@assistant-ui/react": ">=0.12",
|
|
79
|
+
"@assistant-ui/react-markdown": ">=0.12",
|
|
56
80
|
"@supabase/supabase-js": ">=2",
|
|
57
|
-
"@neondatabase/serverless": ">=0.9",
|
|
58
81
|
"@tanstack/react-query": ">=5",
|
|
59
82
|
"@vitejs/plugin-react-swc": ">=4",
|
|
83
|
+
"@xterm/addon-fit": ">=0.10",
|
|
84
|
+
"@xterm/addon-web-links": ">=0.11",
|
|
85
|
+
"@xterm/xterm": ">=5",
|
|
60
86
|
"autoprefixer": ">=10",
|
|
61
|
-
"
|
|
62
|
-
"
|
|
87
|
+
"convex": ">=1",
|
|
88
|
+
"node-pty": ">=1",
|
|
63
89
|
"postcss": ">=8",
|
|
64
90
|
"react": ">=18",
|
|
65
91
|
"react-dom": ">=18",
|
|
92
|
+
"react-router": ">=7",
|
|
66
93
|
"tailwindcss": ">=3",
|
|
67
94
|
"tailwindcss-animate": ">=1",
|
|
68
95
|
"typescript": ">=5",
|
|
69
|
-
"vite": ">=7"
|
|
96
|
+
"vite": ">=7",
|
|
97
|
+
"ws": ">=8"
|
|
70
98
|
},
|
|
71
99
|
"peerDependenciesMeta": {
|
|
100
|
+
"@assistant-ui/react": {
|
|
101
|
+
"optional": true
|
|
102
|
+
},
|
|
103
|
+
"@assistant-ui/react-markdown": {
|
|
104
|
+
"optional": true
|
|
105
|
+
},
|
|
72
106
|
"@tanstack/react-query": {
|
|
73
107
|
"optional": true
|
|
74
108
|
},
|
|
@@ -84,13 +118,10 @@
|
|
|
84
118
|
"postcss": {
|
|
85
119
|
"optional": true
|
|
86
120
|
},
|
|
87
|
-
"
|
|
88
|
-
"optional": true
|
|
89
|
-
},
|
|
90
|
-
"express": {
|
|
121
|
+
"@vitejs/plugin-react-swc": {
|
|
91
122
|
"optional": true
|
|
92
123
|
},
|
|
93
|
-
"
|
|
124
|
+
"react-router": {
|
|
94
125
|
"optional": true
|
|
95
126
|
},
|
|
96
127
|
"vite": {
|
|
@@ -99,29 +130,53 @@
|
|
|
99
130
|
"@supabase/supabase-js": {
|
|
100
131
|
"optional": true
|
|
101
132
|
},
|
|
102
|
-
"
|
|
133
|
+
"convex": {
|
|
134
|
+
"optional": true
|
|
135
|
+
},
|
|
136
|
+
"@xterm/xterm": {
|
|
137
|
+
"optional": true
|
|
138
|
+
},
|
|
139
|
+
"@xterm/addon-fit": {
|
|
140
|
+
"optional": true
|
|
141
|
+
},
|
|
142
|
+
"@xterm/addon-web-links": {
|
|
143
|
+
"optional": true
|
|
144
|
+
},
|
|
145
|
+
"node-pty": {
|
|
146
|
+
"optional": true
|
|
147
|
+
},
|
|
148
|
+
"ws": {
|
|
103
149
|
"optional": true
|
|
104
150
|
}
|
|
105
151
|
},
|
|
106
152
|
"devDependencies": {
|
|
153
|
+
"@assistant-ui/react": "^0.12.19",
|
|
154
|
+
"@assistant-ui/react-markdown": "^0.12.6",
|
|
155
|
+
"@react-router/dev": "^7.13.1",
|
|
156
|
+
"@react-router/fs-routes": "^7.13.1",
|
|
157
|
+
"@supabase/supabase-js": "^2.49.0",
|
|
107
158
|
"@tanstack/react-query": "^5.84.2",
|
|
108
|
-
"@types/
|
|
109
|
-
"@types/express": "^5.0.
|
|
159
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
160
|
+
"@types/express": "^5.0.6",
|
|
110
161
|
"@types/node": "^24.2.1",
|
|
111
162
|
"@types/react": "^18.3.23",
|
|
163
|
+
"@types/ws": "^8.18.1",
|
|
112
164
|
"@vitejs/plugin-react-swc": "^4.0.0",
|
|
165
|
+
"@xterm/addon-fit": "^0.10.0",
|
|
166
|
+
"@xterm/addon-web-links": "^0.11.0",
|
|
167
|
+
"@xterm/xterm": "^5.5.0",
|
|
113
168
|
"autoprefixer": "^10.4.21",
|
|
114
|
-
"
|
|
115
|
-
"express": "^5.1.0",
|
|
116
|
-
"@neondatabase/serverless": "^1.0.0",
|
|
117
|
-
"@supabase/supabase-js": "^2.49.0",
|
|
169
|
+
"express": "^5.2.1",
|
|
118
170
|
"firebase-admin": "^13.0.0",
|
|
171
|
+
"node-pty": "^1.1.0",
|
|
119
172
|
"postcss": "^8.5.6",
|
|
120
173
|
"react": "^18.3.1",
|
|
174
|
+
"react-router": "^7.13.1",
|
|
121
175
|
"tailwindcss": "^3.4.17",
|
|
122
176
|
"tailwindcss-animate": "^1.0.7",
|
|
123
177
|
"typescript": "^5.9.2",
|
|
124
178
|
"vite": "^8.0.0",
|
|
125
|
-
"vitest": "^3.2.4"
|
|
179
|
+
"vitest": "^3.2.4",
|
|
180
|
+
"ws": "^8.18.0"
|
|
126
181
|
}
|
|
127
182
|
}
|
|
@@ -135,7 +135,7 @@ description: >-
|
|
|
135
135
|
## Naming Conventions
|
|
136
136
|
|
|
137
137
|
- Hyphen-case only: `[a-z0-9-]`, max 64 characters
|
|
138
|
-
- Pattern skills: descriptive names (`
|
|
138
|
+
- Pattern skills: descriptive names (`storing-data`, `delegate-to-agent`)
|
|
139
139
|
- Workflow/generator skills: verb-noun (`create-script`, `capture-learnings`)
|
|
140
140
|
|
|
141
141
|
## Tips
|
|
@@ -14,7 +14,7 @@ The UI and server never call an LLM directly. All AI work is delegated to the ag
|
|
|
14
14
|
|
|
15
15
|
## Why
|
|
16
16
|
|
|
17
|
-
The agent is the single AI interface. It has context about the full project, can read/write
|
|
17
|
+
The agent is the single AI interface. It has context about the full project, can read/write the database, and can run scripts. Inline LLM calls bypass this — they create a shadow AI that doesn't know what the agent knows and can't coordinate with it.
|
|
18
18
|
|
|
19
19
|
## How
|
|
20
20
|
|
|
@@ -86,5 +86,5 @@ Scripts may call external APIs (image generation, search, etc.) — but the AI r
|
|
|
86
86
|
|
|
87
87
|
- **scripts** — The agent invokes scripts via `pnpm script <name>` to perform complex operations
|
|
88
88
|
- **self-modifying-code** — The agent operates through the chat bridge to make code changes
|
|
89
|
-
- **
|
|
90
|
-
- **
|
|
89
|
+
- **storing-data** — The agent writes results to the database after processing requests
|
|
90
|
+
- **real-time-sync** — The UI updates automatically when the agent writes to the database
|
|
@@ -1,91 +1,110 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: storing-data
|
|
3
3
|
description: >-
|
|
4
|
-
How to store
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
How and where to store application data. Use when adding new data models,
|
|
5
|
+
deciding between settings vs Drizzle tables, reading/writing app config,
|
|
6
|
+
or working with application state.
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
#
|
|
9
|
+
# Storing Data
|
|
10
10
|
|
|
11
|
-
##
|
|
11
|
+
## Where Data Goes
|
|
12
12
|
|
|
13
|
-
All
|
|
13
|
+
All data lives in one SQLite database (`data/app.db`). In production, set `DATABASE_URL` to point to Turso, Neon, Supabase, or D1 — same code, no changes needed.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
There are three storage layers, each for a different kind of data:
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
### 1. Settings — app configuration
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
Key-value store for persistent config that the user or agent can change. Theme, preferences, integration API keys, availability schedules.
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
```ts
|
|
22
|
+
import { getSetting, putSetting } from "@agent-native/core/settings";
|
|
23
|
+
|
|
24
|
+
// Read (returns null if not set)
|
|
25
|
+
const prefs = await getSetting("user-preferences");
|
|
26
|
+
|
|
27
|
+
// Write (creates or replaces)
|
|
28
|
+
await putSetting("user-preferences", { theme: "dark", density: "comfortable" });
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
From scripts:
|
|
32
|
+
```ts
|
|
33
|
+
import { readSetting, writeSetting } from "@agent-native/core/settings";
|
|
34
|
+
const prefs = await readSetting("user-preferences");
|
|
35
|
+
```
|
|
26
36
|
|
|
27
|
-
|
|
37
|
+
SSE: writes automatically notify the UI via `{ source: "settings", type: "change", key }`.
|
|
28
38
|
|
|
29
|
-
|
|
30
|
-
- Don't store app state in localStorage, sessionStorage, or cookies
|
|
31
|
-
- Don't keep state only in memory (server variables, global stores)
|
|
32
|
-
- Don't use Redis or any external state store
|
|
33
|
-
- Don't interpolate user input directly into file paths (see Security below)
|
|
39
|
+
### 2. Application State — ephemeral UI state
|
|
34
40
|
|
|
35
|
-
|
|
41
|
+
For state the agent and UI share in real-time: what the user is looking at, compose drafts, navigation commands. Scoped by session — cleared between sessions.
|
|
36
42
|
|
|
37
43
|
```ts
|
|
38
|
-
import
|
|
39
|
-
|
|
40
|
-
//
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
//
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
});
|
|
44
|
+
import { readAppState, writeAppState, deleteAppState, listAppState } from "@agent-native/core/application-state";
|
|
45
|
+
|
|
46
|
+
// Write state (UI updates instantly via SSE)
|
|
47
|
+
await writeAppState("navigate", { view: "inbox", threadId: "t-123" });
|
|
48
|
+
|
|
49
|
+
// Read state
|
|
50
|
+
const nav = await readAppState("navigation");
|
|
51
|
+
|
|
52
|
+
// List by prefix (e.g., all compose drafts)
|
|
53
|
+
const drafts = await listAppState("compose-");
|
|
54
|
+
|
|
55
|
+
// Delete (one-shot commands: UI reads, then agent or UI deletes)
|
|
56
|
+
await deleteAppState("navigate");
|
|
52
57
|
```
|
|
53
58
|
|
|
54
|
-
|
|
59
|
+
SSE: writes automatically notify the UI via `{ source: "app-state", type: "change", key }`.
|
|
60
|
+
|
|
61
|
+
### 3. Drizzle Tables — structured domain data
|
|
62
|
+
|
|
63
|
+
For data with schemas, relationships, and queries: forms, bookings, emails, compositions. Define tables in `server/db/schema.ts` using Drizzle ORM.
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
|
|
67
|
+
|
|
68
|
+
export const bookings = sqliteTable("bookings", {
|
|
69
|
+
id: text("id").primaryKey(),
|
|
70
|
+
name: text("name").notNull(),
|
|
71
|
+
email: text("email").notNull(),
|
|
72
|
+
startTime: integer("start_time").notNull(),
|
|
73
|
+
endTime: integer("end_time").notNull(),
|
|
74
|
+
});
|
|
75
|
+
```
|
|
55
76
|
|
|
56
|
-
|
|
77
|
+
Query via `getDb()` singleton from `server/db/index.ts`.
|
|
57
78
|
|
|
58
|
-
|
|
59
|
-
2. **Create the data directory** — `data/<model>/<id>.json` (one file per item) or `data/<model>.json` (single collection)
|
|
60
|
-
3. **Add API routes** in `server/` that read/write the files (sanitize IDs from params)
|
|
61
|
-
4. **Wire SSE invalidation** — Add the query key to `useFileWatcher()` so the UI refreshes on changes
|
|
79
|
+
### 4. OAuth Tokens — credentials
|
|
62
80
|
|
|
63
|
-
|
|
81
|
+
For OAuth tokens acquired at runtime (Google, etc.). Never store these in settings — use the dedicated encrypted store.
|
|
64
82
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
| Are items independently addressable? | No — use one file | Yes — one file per item |
|
|
68
|
-
| Will there be >50 items? | Probably fine | Definitely split |
|
|
69
|
-
| Do items need individual URLs? | No | Yes |
|
|
70
|
-
| Do items change independently? | No | Yes — avoids write conflicts |
|
|
83
|
+
```ts
|
|
84
|
+
import { saveOAuthTokens, getOAuthTokens, listOAuthAccounts } from "@agent-native/core/oauth-tokens";
|
|
71
85
|
|
|
72
|
-
|
|
86
|
+
await saveOAuthTokens("google", "user@gmail.com", { access_token: "...", refresh_token: "..." });
|
|
87
|
+
const tokens = await getOAuthTokens("google", "user@gmail.com");
|
|
88
|
+
const accounts = await listOAuthAccounts("google");
|
|
89
|
+
```
|
|
73
90
|
|
|
74
|
-
|
|
75
|
-
| ---------- | --------------------------------------------------------------------- |
|
|
76
|
-
| Under 50 | Read-all with `readdirSync` + `readFileSync` is fine |
|
|
77
|
-
| 50–200 | Add an index file (`data/<model>/_index.json`) with IDs and summaries |
|
|
78
|
-
| 200+ | Partition into subdirectories |
|
|
91
|
+
## Which Layer to Use
|
|
79
92
|
|
|
80
|
-
|
|
93
|
+
| Data | Layer | Why |
|
|
94
|
+
|------|-------|-----|
|
|
95
|
+
| User preferences, theme, config | Settings | Persistent KV, SSE notifications, simple read/write |
|
|
96
|
+
| What the user sees on screen | Application State | Ephemeral, real-time sync, agent ↔ UI bridge |
|
|
97
|
+
| Compose drafts, wizard steps | Application State | Temporary, deleted when done |
|
|
98
|
+
| Domain records (forms, bookings) | Drizzle table | Needs schema, queries, relationships |
|
|
99
|
+
| OAuth refresh tokens | OAuth Tokens | Secure, per-provider, per-account |
|
|
81
100
|
|
|
82
|
-
##
|
|
101
|
+
## Environment Variables
|
|
83
102
|
|
|
84
|
-
|
|
85
|
-
- **Validate before writing** — Check data shape before writing files, especially for user-submitted data. A malformed write can break all subsequent reads.
|
|
103
|
+
Infrastructure config stays in `.env` — these differ per deployment:
|
|
86
104
|
|
|
87
|
-
|
|
105
|
+
- `DATABASE_URL` — database connection (default: `file:./data/app.db`)
|
|
106
|
+
- `DATABASE_AUTH_TOKEN` — for remote databases
|
|
107
|
+
- `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` — OAuth app credentials
|
|
108
|
+
- `ACCESS_TOKEN` — production auth token
|
|
88
109
|
|
|
89
|
-
|
|
90
|
-
- **scripts** — Create scripts that read/write data files for complex operations
|
|
91
|
-
- **self-modifying-code** — The agent writes data files as Tier 1 (auto-apply) modifications
|
|
110
|
+
Everything else (user settings, tokens, app state) goes in SQL.
|
|
@@ -61,9 +61,9 @@ In the agent-native framework context:
|
|
|
61
61
|
- For complex visual effects, use a `<style>` tag in the component or a dedicated CSS file
|
|
62
62
|
- Fonts can be loaded from Google Fonts via `@import` in a CSS file or `<link>` in `index.html`
|
|
63
63
|
- Animation libraries: prefer CSS transitions and keyframes; use Framer Motion for complex sequences
|
|
64
|
-
- All new UI components should be placed in `
|
|
64
|
+
- All new UI components should be placed in `app/components/`
|
|
65
65
|
|
|
66
66
|
## Related Skills
|
|
67
67
|
|
|
68
68
|
- **self-modifying-code** — The agent can edit source code to apply design changes
|
|
69
|
-
- **
|
|
69
|
+
- **storing-data** — Design configuration can be stored in the settings table for agent-editable theming
|