@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,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PTY WebSocket Server
|
|
3
|
+
*
|
|
4
|
+
* Creates an HTTP server with WebSocket support that spawns PTY processes
|
|
5
|
+
* for AI CLI tools. Each WebSocket connection gets its own PTY.
|
|
6
|
+
*
|
|
7
|
+
* Used by both the embedded AgentTerminal component and the CLI harness.
|
|
8
|
+
*/
|
|
9
|
+
import { createServer as createHttpServer, } from "http";
|
|
10
|
+
import os from "os";
|
|
11
|
+
import path from "path";
|
|
12
|
+
import fs from "fs";
|
|
13
|
+
import { CLI_REGISTRY, commandExists, isAllowedCommand, } from "./cli-registry.js";
|
|
14
|
+
export async function createPtyWebSocketServer(options = {}) {
|
|
15
|
+
const { appDir = process.cwd(), command: defaultCommand = "claude", port = 0, authCheck, logPrefix = "[terminal]", } = options;
|
|
16
|
+
// Dynamic imports for optional native dependencies
|
|
17
|
+
const { WebSocketServer, WebSocket } = await import("ws");
|
|
18
|
+
const pty = await import("node-pty");
|
|
19
|
+
const resolvedAppDir = path.resolve(appDir);
|
|
20
|
+
const shell = os.platform() === "win32" ? "cmd.exe" : process.env.SHELL || "/bin/zsh";
|
|
21
|
+
const server = createHttpServer((req, res) => {
|
|
22
|
+
// CORS headers
|
|
23
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
24
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
25
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type");
|
|
26
|
+
if (req.method === "OPTIONS") {
|
|
27
|
+
res.writeHead(204);
|
|
28
|
+
res.end();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
res.writeHead(404);
|
|
32
|
+
res.end();
|
|
33
|
+
});
|
|
34
|
+
const wss = new WebSocketServer({ noServer: true });
|
|
35
|
+
// Handle WebSocket upgrades with optional auth
|
|
36
|
+
server.on("upgrade", async (req, socket, head) => {
|
|
37
|
+
if (authCheck) {
|
|
38
|
+
try {
|
|
39
|
+
const allowed = await authCheck(req);
|
|
40
|
+
if (!allowed) {
|
|
41
|
+
socket.write("HTTP/1.1 401 Unauthorized\r\n\r\n");
|
|
42
|
+
socket.destroy();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
socket.write("HTTP/1.1 500 Internal Server Error\r\n\r\n");
|
|
48
|
+
socket.destroy();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
wss.handleUpgrade(req, socket, head, (ws) => {
|
|
53
|
+
wss.emit("connection", ws, req);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
// Track active PTY processes for cleanup
|
|
57
|
+
const activePtys = new Set();
|
|
58
|
+
wss.on("connection", (ws, req) => {
|
|
59
|
+
const url = new URL(req.url || "", `http://${req.headers.host}`);
|
|
60
|
+
const command = url.searchParams.get("command") || defaultCommand;
|
|
61
|
+
const extraFlags = url.searchParams.get("flags") || "";
|
|
62
|
+
console.log(`${logPrefix} WebSocket connected for command: ${command}`);
|
|
63
|
+
const sendStatus = (status, message) => {
|
|
64
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
65
|
+
ws.send(JSON.stringify({ type: "setup-status", status, message }));
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
// Validate command against allowlist to prevent injection
|
|
69
|
+
if (!isAllowedCommand(command)) {
|
|
70
|
+
sendStatus("not-found", `"${command}" is not a recognized CLI. Allowed: ${Object.keys(CLI_REGISTRY).join(", ")}`);
|
|
71
|
+
if (ws.readyState === WebSocket.OPEN)
|
|
72
|
+
ws.close();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
// Reject flags containing shell metacharacters
|
|
76
|
+
if (extraFlags && /[;&|`$(){}\n\r<>]/.test(extraFlags)) {
|
|
77
|
+
sendStatus("failed", "Invalid flags: shell metacharacters not allowed");
|
|
78
|
+
if (ws.readyState === WebSocket.OPEN)
|
|
79
|
+
ws.close();
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// Check if CLI is installed; if not, use npx to run it
|
|
83
|
+
let useNpx = false;
|
|
84
|
+
if (!commandExists(command)) {
|
|
85
|
+
const registry = CLI_REGISTRY[command];
|
|
86
|
+
if (registry?.installPackage) {
|
|
87
|
+
console.log(`${logPrefix} ${command} CLI not found, will use npx`);
|
|
88
|
+
useNpx = true;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
sendStatus("not-found", `"${command}" not found on PATH. Please install it manually.`);
|
|
92
|
+
if (ws.readyState === WebSocket.OPEN)
|
|
93
|
+
ws.close();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Build the command — use npx if CLI not found locally
|
|
98
|
+
const baseCommand = useNpx
|
|
99
|
+
? `npx --yes ${CLI_REGISTRY[command].installPackage}`
|
|
100
|
+
: command;
|
|
101
|
+
const fullCommand = extraFlags
|
|
102
|
+
? `${baseCommand} ${extraFlags}`
|
|
103
|
+
: baseCommand;
|
|
104
|
+
console.log(`${logPrefix} Spawning PTY: ${fullCommand}`);
|
|
105
|
+
// Build env, stripping CLI-specific nesting vars
|
|
106
|
+
const registry = CLI_REGISTRY[command];
|
|
107
|
+
const env = {
|
|
108
|
+
...process.env,
|
|
109
|
+
TERM: "xterm-256color",
|
|
110
|
+
};
|
|
111
|
+
if (registry) {
|
|
112
|
+
for (const v of registry.stripEnv)
|
|
113
|
+
delete env[v];
|
|
114
|
+
}
|
|
115
|
+
let ptyProcess;
|
|
116
|
+
try {
|
|
117
|
+
ptyProcess = pty.spawn(shell, ["-l", "-c", fullCommand], {
|
|
118
|
+
name: "xterm-256color",
|
|
119
|
+
cols: 120,
|
|
120
|
+
rows: 40,
|
|
121
|
+
cwd: resolvedAppDir,
|
|
122
|
+
env: env,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
console.error(`${logPrefix} Failed to spawn PTY:`, err);
|
|
127
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
128
|
+
ws.send(`\r\n\x1b[31m${logPrefix} Failed to spawn PTY: ${err}\x1b[0m\r\n`);
|
|
129
|
+
ws.close();
|
|
130
|
+
}
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
activePtys.add(ptyProcess);
|
|
134
|
+
console.log(`${logPrefix} PTY spawned (pid: ${ptyProcess.pid})`);
|
|
135
|
+
ptyProcess.onData((data) => {
|
|
136
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
137
|
+
ws.send(data);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
ptyProcess.onExit(({ exitCode }) => {
|
|
141
|
+
console.log(`${logPrefix} PTY exited with code ${exitCode}`);
|
|
142
|
+
activePtys.delete(ptyProcess);
|
|
143
|
+
if (exitCode === 127 && ws.readyState === WebSocket.OPEN) {
|
|
144
|
+
ws.send(JSON.stringify({
|
|
145
|
+
type: "setup-status",
|
|
146
|
+
status: "not-found",
|
|
147
|
+
message: `Command "${command}" not found. Please install it first.`,
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
151
|
+
ws.close();
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
ws.on("message", (data) => {
|
|
155
|
+
const str = typeof data === "string" ? data : data.toString();
|
|
156
|
+
try {
|
|
157
|
+
const msg = JSON.parse(str);
|
|
158
|
+
if (msg.type === "builder.setEnvVars" &&
|
|
159
|
+
Array.isArray(msg.data?.vars)) {
|
|
160
|
+
const envPath = path.join(resolvedAppDir, ".env");
|
|
161
|
+
const vars = msg.data.vars;
|
|
162
|
+
// Validate env var names and sanitize values
|
|
163
|
+
const validKeyPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
164
|
+
const sanitizedVars = vars.filter(({ key }) => {
|
|
165
|
+
if (!validKeyPattern.test(key)) {
|
|
166
|
+
console.warn(`${logPrefix} Rejected invalid env var key: ${key}`);
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
return true;
|
|
170
|
+
});
|
|
171
|
+
let lines = [];
|
|
172
|
+
try {
|
|
173
|
+
lines = fs.readFileSync(envPath, "utf-8").split("\n");
|
|
174
|
+
}
|
|
175
|
+
catch { }
|
|
176
|
+
for (const { key, value } of sanitizedVars) {
|
|
177
|
+
// Strip newlines/null bytes to prevent line injection
|
|
178
|
+
const safeValue = value.replace(/[\r\n\0]/g, "");
|
|
179
|
+
// Quote values containing #, spaces, or quotes so dotenv parses correctly
|
|
180
|
+
const needsQuoting = /[# "']/.test(safeValue);
|
|
181
|
+
const quotedValue = needsQuoting
|
|
182
|
+
? `"${safeValue.replace(/"/g, '\\"')}"`
|
|
183
|
+
: safeValue;
|
|
184
|
+
const idx = lines.findIndex((l) => l.startsWith(`${key}=`));
|
|
185
|
+
const entry = `${key}=${quotedValue}`;
|
|
186
|
+
if (idx !== -1) {
|
|
187
|
+
lines[idx] = entry;
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
lines.push(entry);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
while (lines.length > 0 && lines[lines.length - 1] === "") {
|
|
194
|
+
lines.pop();
|
|
195
|
+
}
|
|
196
|
+
fs.writeFileSync(envPath, lines.join("\n") + "\n", "utf-8");
|
|
197
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
198
|
+
ws.send(JSON.stringify({
|
|
199
|
+
type: "env-vars-saved",
|
|
200
|
+
keys: sanitizedVars.map((v) => v.key),
|
|
201
|
+
}));
|
|
202
|
+
}
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (msg.type === "resize" && msg.cols && msg.rows) {
|
|
206
|
+
ptyProcess.resize(msg.cols, msg.rows);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// Not JSON — regular terminal input
|
|
212
|
+
}
|
|
213
|
+
ptyProcess.write(str);
|
|
214
|
+
});
|
|
215
|
+
ws.on("close", () => {
|
|
216
|
+
console.log(`${logPrefix} WebSocket closed, killing PTY`);
|
|
217
|
+
activePtys.delete(ptyProcess);
|
|
218
|
+
try {
|
|
219
|
+
ptyProcess.kill();
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// Process may have already exited
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
return new Promise((resolve, reject) => {
|
|
227
|
+
server.once("error", (err) => {
|
|
228
|
+
reject(err);
|
|
229
|
+
});
|
|
230
|
+
server.listen(port, "127.0.0.1", () => {
|
|
231
|
+
const addr = server.address();
|
|
232
|
+
const actualPort = typeof addr === "object" && addr ? addr.port : port;
|
|
233
|
+
console.log(`${logPrefix} PTY WebSocket server on ws://localhost:${actualPort}/ws`);
|
|
234
|
+
resolve({
|
|
235
|
+
server,
|
|
236
|
+
port: actualPort,
|
|
237
|
+
close: () => {
|
|
238
|
+
for (const p of activePtys) {
|
|
239
|
+
try {
|
|
240
|
+
p.kill();
|
|
241
|
+
}
|
|
242
|
+
catch { }
|
|
243
|
+
}
|
|
244
|
+
activePtys.clear();
|
|
245
|
+
wss.close();
|
|
246
|
+
server.close();
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=pty-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pty-server.js","sourceRoot":"","sources":["../../src/terminal/pty-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nitro Plugin — Agent Terminal
|
|
3
|
+
*
|
|
4
|
+
* Starts a PTY WebSocket server alongside the app so the <AgentTerminal />
|
|
5
|
+
* component can connect to a real CLI. Mounts a discovery endpoint at
|
|
6
|
+
* /api/agent-terminal-info for the client component.
|
|
7
|
+
*
|
|
8
|
+
* Skips activation when running inside a harness (HARNESS_PORT is set).
|
|
9
|
+
*/
|
|
10
|
+
export interface TerminalPluginOptions {
|
|
11
|
+
/** CLI command to run. Defaults to AGENT_CLI_COMMAND env or 'claude' */
|
|
12
|
+
command?: string;
|
|
13
|
+
/** Port for the WebSocket server. Defaults to AGENT_TERMINAL_PORT env or auto-assigned */
|
|
14
|
+
port?: number;
|
|
15
|
+
/** Enable in production. Defaults to AGENT_TERMINAL_ENABLED env or false in prod */
|
|
16
|
+
enabledInProduction?: boolean;
|
|
17
|
+
/** Auth check for WebSocket connections in production */
|
|
18
|
+
authCheck?: (req: any) => boolean | Promise<boolean>;
|
|
19
|
+
}
|
|
20
|
+
export declare function createTerminalPlugin(options?: TerminalPluginOptions): (nitroApp: any) => Promise<void>;
|
|
21
|
+
/** Pre-configured terminal plugin with defaults */
|
|
22
|
+
export declare const defaultTerminalPlugin: (nitroApp: any) => Promise<void>;
|
|
23
|
+
//# sourceMappingURL=terminal-plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-plugin.d.ts","sourceRoot":"","sources":["../../src/terminal/terminal-plugin.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,MAAM,WAAW,qBAAqB;IACpC,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oFAAoF;IACpF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,yDAAyD;IACzD,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,IACxD,UAAU,GAAG,mBAkH5B;AAED,mDAAmD;AACnD,eAAO,MAAM,qBAAqB,aArHR,GAAG,kBAqH8B,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nitro Plugin — Agent Terminal
|
|
3
|
+
*
|
|
4
|
+
* Starts a PTY WebSocket server alongside the app so the <AgentTerminal />
|
|
5
|
+
* component can connect to a real CLI. Mounts a discovery endpoint at
|
|
6
|
+
* /api/agent-terminal-info for the client component.
|
|
7
|
+
*
|
|
8
|
+
* Skips activation when running inside a harness (HARNESS_PORT is set).
|
|
9
|
+
*/
|
|
10
|
+
import { defineEventHandler } from "h3";
|
|
11
|
+
export function createTerminalPlugin(options = {}) {
|
|
12
|
+
return async (nitroApp) => {
|
|
13
|
+
// Skip if running inside a harness
|
|
14
|
+
if (process.env.HARNESS_PORT) {
|
|
15
|
+
console.log("[terminal] Harness detected, skipping embedded terminal");
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const isProd = process.env.NODE_ENV === "production";
|
|
19
|
+
const enabled = options.enabledInProduction ??
|
|
20
|
+
(process.env.AGENT_TERMINAL_ENABLED === "true" || !isProd);
|
|
21
|
+
if (!enabled) {
|
|
22
|
+
console.log("[terminal] Disabled in production (set AGENT_TERMINAL_ENABLED=true to enable)");
|
|
23
|
+
// Mount a disabled info endpoint
|
|
24
|
+
nitroApp.h3App.use("/api/agent-terminal-info", defineEventHandler(() => ({ available: false })));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Require authCheck in production to prevent unauthenticated shell access
|
|
28
|
+
if (isProd && !options.authCheck) {
|
|
29
|
+
console.error("[terminal] FATAL: authCheck is required when enabling the terminal in production. " +
|
|
30
|
+
"Pass an authCheck function to createTerminalPlugin().");
|
|
31
|
+
nitroApp.h3App.use("/api/agent-terminal-info", defineEventHandler(() => ({
|
|
32
|
+
available: false,
|
|
33
|
+
error: "Terminal requires authCheck in production",
|
|
34
|
+
})));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Skip if a PTY server is already running (prevents leak on HMR rebuild)
|
|
38
|
+
if (process.env.__AGENT_TERMINAL_RUNNING === "true") {
|
|
39
|
+
const existingPort = process.env.AGENT_TERMINAL_PORT;
|
|
40
|
+
console.log(`[terminal] PTY server already running on port ${existingPort}, skipping`);
|
|
41
|
+
nitroApp.h3App.use("/api/agent-terminal-info", defineEventHandler(() => ({
|
|
42
|
+
available: true,
|
|
43
|
+
wsPort: existingPort ? parseInt(existingPort, 10) : 0,
|
|
44
|
+
command: options.command || process.env.AGENT_CLI_COMMAND || "claude",
|
|
45
|
+
})));
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const command = options.command || process.env.AGENT_CLI_COMMAND || "claude";
|
|
49
|
+
const port = options.port ??
|
|
50
|
+
(process.env.AGENT_TERMINAL_PORT
|
|
51
|
+
? parseInt(process.env.AGENT_TERMINAL_PORT, 10)
|
|
52
|
+
: 0);
|
|
53
|
+
try {
|
|
54
|
+
const { createPtyWebSocketServer } = await import("./pty-server.js");
|
|
55
|
+
const result = await createPtyWebSocketServer({
|
|
56
|
+
appDir: process.cwd(),
|
|
57
|
+
command,
|
|
58
|
+
port,
|
|
59
|
+
authCheck: isProd ? options.authCheck : undefined,
|
|
60
|
+
logPrefix: "[terminal]",
|
|
61
|
+
});
|
|
62
|
+
// Store port for other consumers and mark as running to prevent HMR duplication
|
|
63
|
+
process.env.AGENT_TERMINAL_PORT = String(result.port);
|
|
64
|
+
process.env.__AGENT_TERMINAL_RUNNING = "true";
|
|
65
|
+
// Mount discovery endpoint
|
|
66
|
+
nitroApp.h3App.use("/api/agent-terminal-info", defineEventHandler(() => ({
|
|
67
|
+
available: true,
|
|
68
|
+
wsPort: result.port,
|
|
69
|
+
command,
|
|
70
|
+
})));
|
|
71
|
+
// Cleanup on shutdown (use once to avoid listener leak on hot-reload)
|
|
72
|
+
const cleanup = () => result.close();
|
|
73
|
+
process.once("SIGTERM", cleanup);
|
|
74
|
+
process.once("SIGINT", cleanup);
|
|
75
|
+
console.log(`[terminal] Agent terminal ready (command: ${command}, port: ${result.port})`);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.error("[terminal] Failed to start PTY server:", err);
|
|
79
|
+
console.error("[terminal] Make sure node-pty is installed: pnpm add node-pty");
|
|
80
|
+
// Mount a fallback info endpoint
|
|
81
|
+
nitroApp.h3App.use("/api/agent-terminal-info", defineEventHandler(() => ({
|
|
82
|
+
available: false,
|
|
83
|
+
error: "PTY server failed to start",
|
|
84
|
+
})));
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** Pre-configured terminal plugin with defaults */
|
|
89
|
+
export const defaultTerminalPlugin = createTerminalPlugin();
|
|
90
|
+
//# sourceMappingURL=terminal-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-plugin.js","sourceRoot":"","sources":["../../src/terminal/terminal-plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/vite/client.d.ts
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
import type { UserConfig } from "vite";
|
|
2
|
-
|
|
2
|
+
export interface NitroOptions {
|
|
3
|
+
/** Nitro deployment preset (e.g. "node", "vercel", "netlify", "cloudflare_pages"). Default: "node" */
|
|
4
|
+
preset?: string;
|
|
5
|
+
/** Source directory for server files. Default: "./server" */
|
|
6
|
+
srcDir?: string;
|
|
7
|
+
/** Routes directory name (relative to srcDir). Default: "routes" */
|
|
8
|
+
routesDir?: string;
|
|
9
|
+
/** Any additional Nitro config overrides */
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
}
|
|
3
12
|
export interface ClientConfigOptions {
|
|
4
13
|
/** Port for dev server. Default: 8080 */
|
|
5
14
|
port?: number;
|
|
6
15
|
/** Additional Vite plugins */
|
|
7
16
|
plugins?: any[];
|
|
8
|
-
/**
|
|
9
|
-
|
|
17
|
+
/** Nitro plugin options (preset, srcDir, etc) */
|
|
18
|
+
nitro?: NitroOptions;
|
|
10
19
|
/** Override resolve aliases */
|
|
11
20
|
aliases?: Record<string, string>;
|
|
12
21
|
/** Override build.outDir. Default: "dist/spa" */
|
|
@@ -15,10 +24,24 @@ export interface ClientConfigOptions {
|
|
|
15
24
|
fsAllow?: string[];
|
|
16
25
|
/** Additional fs.deny patterns */
|
|
17
26
|
fsDeny?: string[];
|
|
27
|
+
/**
|
|
28
|
+
* @deprecated Pass `reactRouter()` directly in the `plugins` array instead.
|
|
29
|
+
* Previously used to auto-load the React Router Vite plugin via require(),
|
|
30
|
+
* but this fails in ESM contexts. Templates should now do:
|
|
31
|
+
* ```ts
|
|
32
|
+
* import { reactRouter } from "@react-router/dev/vite";
|
|
33
|
+
* defineConfig({ plugins: [reactRouter()] })
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
reactRouter?: boolean | Record<string, unknown>;
|
|
18
37
|
}
|
|
19
38
|
/**
|
|
20
|
-
* Create the client
|
|
21
|
-
*
|
|
39
|
+
* Create the client Vite config with sensible agent-native defaults.
|
|
40
|
+
* Supports two modes:
|
|
41
|
+
* - Legacy SPA mode (default): React SWC plugin, client-only routing
|
|
42
|
+
* - React Router framework mode: SSR-capable with file-based routing
|
|
43
|
+
*
|
|
44
|
+
* Both modes include Nitro for API routes, path aliases, and fs restrictions.
|
|
22
45
|
*/
|
|
23
46
|
export declare function defineConfig(options?: ClientConfigOptions): UserConfig;
|
|
24
47
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/vite/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/vite/client.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAU,UAAU,EAAE,MAAM,MAAM,CAAC;AAqB/C,MAAM,WAAW,YAAY;IAC3B,sGAAsG;IACtG,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8BAA8B;IAC9B,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;IAChB,iDAAiD;IACjD,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjD;AAmCD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB,GAAG,UAAU,CAyE1E"}
|
package/dist/vite/client.js
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import path from "path";
|
|
2
|
-
import
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import { createRequire } from "module";
|
|
4
|
+
import { devApiServer } from "./dev-api-server.js";
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
/** Check if a package is installed in the project */
|
|
7
|
+
function hasDep(pkg, cwd) {
|
|
8
|
+
try {
|
|
9
|
+
const pkgJson = JSON.parse(fs.readFileSync(path.join(cwd, "package.json"), "utf-8"));
|
|
10
|
+
return !!(pkgJson.dependencies?.[pkg] ||
|
|
11
|
+
pkgJson.devDependencies?.[pkg] ||
|
|
12
|
+
pkgJson.peerDependencies?.[pkg]);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
3
18
|
/**
|
|
4
19
|
* Vite plugin that prevents the built-in base middleware from redirecting
|
|
5
20
|
* "/" → "/app/" (or whatever the base is). When agent-native apps run with
|
|
@@ -31,21 +46,40 @@ function baseRedirectGuard() {
|
|
|
31
46
|
};
|
|
32
47
|
}
|
|
33
48
|
/**
|
|
34
|
-
* Create the client
|
|
35
|
-
*
|
|
49
|
+
* Create the client Vite config with sensible agent-native defaults.
|
|
50
|
+
* Supports two modes:
|
|
51
|
+
* - Legacy SPA mode (default): React SWC plugin, client-only routing
|
|
52
|
+
* - React Router framework mode: SSR-capable with file-based routing
|
|
53
|
+
*
|
|
54
|
+
* Both modes include Nitro for API routes, path aliases, and fs restrictions.
|
|
36
55
|
*/
|
|
37
56
|
export function defineConfig(options = {}) {
|
|
38
|
-
//
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
57
|
+
// Check if React Router plugin was passed directly in plugins array
|
|
58
|
+
const hasReactRouterPlugin = options.plugins?.some((p) => p?.name === "react-router" ||
|
|
59
|
+
(Array.isArray(p) && p.some((pp) => pp?.name === "react-router")));
|
|
60
|
+
let reactTransformPlugin;
|
|
61
|
+
if (!hasReactRouterPlugin && !options.reactRouter) {
|
|
62
|
+
// Legacy SPA mode — use React SWC plugin (only when React Router is not used)
|
|
63
|
+
try {
|
|
64
|
+
reactTransformPlugin = require("@vitejs/plugin-react-swc");
|
|
65
|
+
if (reactTransformPlugin.default)
|
|
66
|
+
reactTransformPlugin = reactTransformPlugin.default;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Will be resolved at runtime by Vite
|
|
70
|
+
}
|
|
47
71
|
}
|
|
72
|
+
// Nitro 3.0's Vite plugin (nitro/vite) uses a FetchableDevEnvironment
|
|
73
|
+
// that is incompatible with Vite 7/8's DevEnvironment API. Loading it
|
|
74
|
+
// crashes typecheck, build, and any Vite server creation. Nitro's
|
|
75
|
+
// file-based routes are handled by its runtime (via the server/routes/
|
|
76
|
+
// directory) independently of this plugin, so we skip it entirely.
|
|
77
|
+
// The Nitro plugin can be re-enabled once Nitro ships a Vite 7+ compatible
|
|
78
|
+
// release.
|
|
79
|
+
const nitroPlugin = null;
|
|
48
80
|
const cwd = process.cwd();
|
|
81
|
+
// Build the React transform plugin (only for legacy SPA mode)
|
|
82
|
+
const reactPluginInstance = reactTransformPlugin?.();
|
|
49
83
|
return {
|
|
50
84
|
server: {
|
|
51
85
|
host: "::",
|
|
@@ -57,7 +91,6 @@ export function defineConfig(options = {}) {
|
|
|
57
91
|
".env.*",
|
|
58
92
|
"*.{crt,pem}",
|
|
59
93
|
"**/.git/**",
|
|
60
|
-
"server/**",
|
|
61
94
|
...(options.fsDeny ?? []),
|
|
62
95
|
],
|
|
63
96
|
},
|
|
@@ -67,13 +100,19 @@ export function defineConfig(options = {}) {
|
|
|
67
100
|
},
|
|
68
101
|
plugins: [
|
|
69
102
|
baseRedirectGuard(),
|
|
70
|
-
|
|
71
|
-
|
|
103
|
+
devApiServer(),
|
|
104
|
+
reactPluginInstance,
|
|
105
|
+
nitroPlugin?.(),
|
|
72
106
|
...(options.plugins ?? []),
|
|
73
107
|
].filter(Boolean),
|
|
108
|
+
optimizeDeps: {
|
|
109
|
+
include: hasDep("@agent-native/pinpoint", cwd)
|
|
110
|
+
? ["@agent-native/pinpoint/react"]
|
|
111
|
+
: [],
|
|
112
|
+
},
|
|
74
113
|
resolve: {
|
|
75
114
|
alias: {
|
|
76
|
-
"@": path.resolve(cwd, "./
|
|
115
|
+
"@": path.resolve(cwd, "./app"),
|
|
77
116
|
"@shared": path.resolve(cwd, "./shared"),
|
|
78
117
|
...options.aliases,
|
|
79
118
|
},
|
package/dist/vite/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/vite/client.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/vite/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Plugin } from "vite";
|
|
2
|
+
/**
|
|
3
|
+
* Vite plugin that serves H3 API routes from server/routes/api/ during dev.
|
|
4
|
+
*
|
|
5
|
+
* This replaces the disabled Nitro Vite plugin for dev-mode API route serving.
|
|
6
|
+
* It scans the file-based routes, imports them, and mounts them on an H3 app
|
|
7
|
+
* that handles /api/* requests before React Router's SSR handler.
|
|
8
|
+
*/
|
|
9
|
+
export declare function devApiServer(): Plugin;
|
|
10
|
+
//# sourceMappingURL=dev-api-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-api-server.d.ts","sourceRoot":"","sources":["../../src/vite/dev-api-server.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,MAAM,CAAC;AAkIlD;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAyDrC"}
|