@jait/gateway 0.1.0
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/bin/jait.mjs +144 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +73 -0
- package/dist/config.js.map +1 -0
- package/dist/db/connection.d.ts +37 -0
- package/dist/db/connection.d.ts.map +1 -0
- package/dist/db/connection.js +85 -0
- package/dist/db/connection.js.map +1 -0
- package/dist/db/index.d.ts +4 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +4 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrations.d.ts +24 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +312 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/schema.d.ts +2253 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +195 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/foundation.d.ts +26 -0
- package/dist/foundation.d.ts.map +1 -0
- package/dist/foundation.js +15 -0
- package/dist/foundation.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +413 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/uuidv7.d.ts +10 -0
- package/dist/lib/uuidv7.d.ts.map +1 -0
- package/dist/lib/uuidv7.js +33 -0
- package/dist/lib/uuidv7.js.map +1 -0
- package/dist/memory/contracts.d.ts +42 -0
- package/dist/memory/contracts.d.ts.map +1 -0
- package/dist/memory/contracts.js +2 -0
- package/dist/memory/contracts.js.map +1 -0
- package/dist/memory/embeddings.d.ts +4 -0
- package/dist/memory/embeddings.d.ts.map +1 -0
- package/dist/memory/embeddings.js +26 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/service.d.ts +17 -0
- package/dist/memory/service.d.ts.map +1 -0
- package/dist/memory/service.js +82 -0
- package/dist/memory/service.js.map +1 -0
- package/dist/memory/sqlite-backend.d.ts +11 -0
- package/dist/memory/sqlite-backend.d.ts.map +1 -0
- package/dist/memory/sqlite-backend.js +68 -0
- package/dist/memory/sqlite-backend.js.map +1 -0
- package/dist/plugins/contracts.d.ts +11 -0
- package/dist/plugins/contracts.d.ts.map +1 -0
- package/dist/plugins/contracts.js +2 -0
- package/dist/plugins/contracts.js.map +1 -0
- package/dist/providers/claude-code-provider.d.ts +39 -0
- package/dist/providers/claude-code-provider.d.ts.map +1 -0
- package/dist/providers/claude-code-provider.js +322 -0
- package/dist/providers/claude-code-provider.js.map +1 -0
- package/dist/providers/codex-provider.d.ts +51 -0
- package/dist/providers/codex-provider.d.ts.map +1 -0
- package/dist/providers/codex-provider.js +826 -0
- package/dist/providers/codex-provider.js.map +1 -0
- package/dist/providers/contracts.d.ts +167 -0
- package/dist/providers/contracts.d.ts.map +1 -0
- package/dist/providers/contracts.js +13 -0
- package/dist/providers/contracts.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +5 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/jait-provider.d.ts +23 -0
- package/dist/providers/jait-provider.d.ts.map +1 -0
- package/dist/providers/jait-provider.js +67 -0
- package/dist/providers/jait-provider.js.map +1 -0
- package/dist/providers/registry.d.ts +39 -0
- package/dist/providers/registry.d.ts.map +1 -0
- package/dist/providers/registry.js +64 -0
- package/dist/providers/registry.js.map +1 -0
- package/dist/pty-broker-client.d.ts +46 -0
- package/dist/pty-broker-client.d.ts.map +1 -0
- package/dist/pty-broker-client.js +142 -0
- package/dist/pty-broker-client.js.map +1 -0
- package/dist/routes/auth.d.ts +6 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +236 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/chat.d.ts +32 -0
- package/dist/routes/chat.d.ts.map +1 -0
- package/dist/routes/chat.js +1503 -0
- package/dist/routes/chat.js.map +1 -0
- package/dist/routes/consent.d.ts +10 -0
- package/dist/routes/consent.d.ts.map +1 -0
- package/dist/routes/consent.js +127 -0
- package/dist/routes/consent.js.map +1 -0
- package/dist/routes/filesystem.d.ts +14 -0
- package/dist/routes/filesystem.d.ts.map +1 -0
- package/dist/routes/filesystem.js +152 -0
- package/dist/routes/filesystem.js.map +1 -0
- package/dist/routes/git.d.ts +17 -0
- package/dist/routes/git.d.ts.map +1 -0
- package/dist/routes/git.js +213 -0
- package/dist/routes/git.js.map +1 -0
- package/dist/routes/health.d.ts +7 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +21 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/hooks.d.ts +9 -0
- package/dist/routes/hooks.d.ts.map +1 -0
- package/dist/routes/hooks.js +22 -0
- package/dist/routes/hooks.js.map +1 -0
- package/dist/routes/jobs.d.ts +5 -0
- package/dist/routes/jobs.d.ts.map +1 -0
- package/dist/routes/jobs.js +333 -0
- package/dist/routes/jobs.js.map +1 -0
- package/dist/routes/mcp-server.d.ts +23 -0
- package/dist/routes/mcp-server.d.ts.map +1 -0
- package/dist/routes/mcp-server.js +177 -0
- package/dist/routes/mcp-server.js.map +1 -0
- package/dist/routes/mobile.d.ts +12 -0
- package/dist/routes/mobile.d.ts.map +1 -0
- package/dist/routes/mobile.js +64 -0
- package/dist/routes/mobile.js.map +1 -0
- package/dist/routes/network.d.ts +3 -0
- package/dist/routes/network.d.ts.map +1 -0
- package/dist/routes/network.js +367 -0
- package/dist/routes/network.js.map +1 -0
- package/dist/routes/repositories.d.ts +18 -0
- package/dist/routes/repositories.d.ts.map +1 -0
- package/dist/routes/repositories.js +90 -0
- package/dist/routes/repositories.js.map +1 -0
- package/dist/routes/screen-share.d.ts +17 -0
- package/dist/routes/screen-share.d.ts.map +1 -0
- package/dist/routes/screen-share.js +92 -0
- package/dist/routes/screen-share.js.map +1 -0
- package/dist/routes/sessions.d.ts +18 -0
- package/dist/routes/sessions.d.ts.map +1 -0
- package/dist/routes/sessions.js +169 -0
- package/dist/routes/sessions.js.map +1 -0
- package/dist/routes/terminals.d.ts +15 -0
- package/dist/routes/terminals.d.ts.map +1 -0
- package/dist/routes/terminals.js +326 -0
- package/dist/routes/terminals.js.map +1 -0
- package/dist/routes/threads.d.ts +38 -0
- package/dist/routes/threads.d.ts.map +1 -0
- package/dist/routes/threads.js +488 -0
- package/dist/routes/threads.js.map +1 -0
- package/dist/routes/trust.d.ts +9 -0
- package/dist/routes/trust.d.ts.map +1 -0
- package/dist/routes/trust.js +25 -0
- package/dist/routes/trust.js.map +1 -0
- package/dist/routes/voice.d.ts +5 -0
- package/dist/routes/voice.d.ts.map +1 -0
- package/dist/routes/voice.js +37 -0
- package/dist/routes/voice.js.map +1 -0
- package/dist/routes/workspace.d.ts +13 -0
- package/dist/routes/workspace.d.ts.map +1 -0
- package/dist/routes/workspace.js +275 -0
- package/dist/routes/workspace.js.map +1 -0
- package/dist/scheduler/contracts.d.ts +15 -0
- package/dist/scheduler/contracts.d.ts.map +1 -0
- package/dist/scheduler/contracts.js +2 -0
- package/dist/scheduler/contracts.js.map +1 -0
- package/dist/scheduler/hooks.d.ts +20 -0
- package/dist/scheduler/hooks.d.ts.map +1 -0
- package/dist/scheduler/hooks.js +78 -0
- package/dist/scheduler/hooks.js.map +1 -0
- package/dist/scheduler/service.d.ts +65 -0
- package/dist/scheduler/service.d.ts.map +1 -0
- package/dist/scheduler/service.js +188 -0
- package/dist/scheduler/service.js.map +1 -0
- package/dist/security/consent-executor.d.ts +48 -0
- package/dist/security/consent-executor.d.ts.map +1 -0
- package/dist/security/consent-executor.js +158 -0
- package/dist/security/consent-executor.js.map +1 -0
- package/dist/security/consent-manager.d.ts +105 -0
- package/dist/security/consent-manager.d.ts.map +1 -0
- package/dist/security/consent-manager.js +227 -0
- package/dist/security/consent-manager.js.map +1 -0
- package/dist/security/contracts.d.ts +31 -0
- package/dist/security/contracts.d.ts.map +1 -0
- package/dist/security/contracts.js +2 -0
- package/dist/security/contracts.js.map +1 -0
- package/dist/security/http-auth.d.ts +10 -0
- package/dist/security/http-auth.d.ts.map +1 -0
- package/dist/security/http-auth.js +48 -0
- package/dist/security/http-auth.js.map +1 -0
- package/dist/security/index.d.ts +10 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +9 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/path-guard.d.ts +40 -0
- package/dist/security/path-guard.d.ts.map +1 -0
- package/dist/security/path-guard.js +125 -0
- package/dist/security/path-guard.js.map +1 -0
- package/dist/security/sandbox-manager.d.ts +43 -0
- package/dist/security/sandbox-manager.d.ts.map +1 -0
- package/dist/security/sandbox-manager.js +110 -0
- package/dist/security/sandbox-manager.js.map +1 -0
- package/dist/security/ssrf-guard.d.ts +11 -0
- package/dist/security/ssrf-guard.d.ts.map +1 -0
- package/dist/security/ssrf-guard.js +59 -0
- package/dist/security/ssrf-guard.js.map +1 -0
- package/dist/security/tool-permissions.d.ts +61 -0
- package/dist/security/tool-permissions.d.ts.map +1 -0
- package/dist/security/tool-permissions.js +105 -0
- package/dist/security/tool-permissions.js.map +1 -0
- package/dist/security/tool-profiles.d.ts +23 -0
- package/dist/security/tool-profiles.d.ts.map +1 -0
- package/dist/security/tool-profiles.js +106 -0
- package/dist/security/tool-profiles.js.map +1 -0
- package/dist/security/trust-engine.d.ts +61 -0
- package/dist/security/trust-engine.d.ts.map +1 -0
- package/dist/security/trust-engine.js +192 -0
- package/dist/security/trust-engine.js.map +1 -0
- package/dist/server.d.ts +54 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +188 -0
- package/dist/server.js.map +1 -0
- package/dist/services/audit.d.ts +60 -0
- package/dist/services/audit.d.ts.map +1 -0
- package/dist/services/audit.js +58 -0
- package/dist/services/audit.js.map +1 -0
- package/dist/services/device-registry.d.ts +15 -0
- package/dist/services/device-registry.d.ts.map +1 -0
- package/dist/services/device-registry.js +32 -0
- package/dist/services/device-registry.js.map +1 -0
- package/dist/services/git.d.ts +168 -0
- package/dist/services/git.d.ts.map +1 -0
- package/dist/services/git.js +957 -0
- package/dist/services/git.js.map +1 -0
- package/dist/services/repositories.d.ts +32 -0
- package/dist/services/repositories.d.ts.map +1 -0
- package/dist/services/repositories.js +70 -0
- package/dist/services/repositories.js.map +1 -0
- package/dist/services/session-state.d.ts +20 -0
- package/dist/services/session-state.d.ts.map +1 -0
- package/dist/services/session-state.js +89 -0
- package/dist/services/session-state.js.map +1 -0
- package/dist/services/sessions.d.ts +68 -0
- package/dist/services/sessions.d.ts.map +1 -0
- package/dist/services/sessions.js +136 -0
- package/dist/services/sessions.js.map +1 -0
- package/dist/services/thread-title.d.ts +23 -0
- package/dist/services/thread-title.d.ts.map +1 -0
- package/dist/services/thread-title.js +141 -0
- package/dist/services/thread-title.js.map +1 -0
- package/dist/services/threads.d.ts +64 -0
- package/dist/services/threads.d.ts.map +1 -0
- package/dist/services/threads.js +202 -0
- package/dist/services/threads.js.map +1 -0
- package/dist/services/users.d.ts +39 -0
- package/dist/services/users.d.ts.map +1 -0
- package/dist/services/users.js +203 -0
- package/dist/services/users.js.map +1 -0
- package/dist/sessions/contracts.d.ts +14 -0
- package/dist/sessions/contracts.d.ts.map +1 -0
- package/dist/sessions/contracts.js +2 -0
- package/dist/sessions/contracts.js.map +1 -0
- package/dist/surfaces/browser.d.ts +65 -0
- package/dist/surfaces/browser.d.ts.map +1 -0
- package/dist/surfaces/browser.js +615 -0
- package/dist/surfaces/browser.js.map +1 -0
- package/dist/surfaces/contracts.d.ts +34 -0
- package/dist/surfaces/contracts.d.ts.map +1 -0
- package/dist/surfaces/contracts.js +2 -0
- package/dist/surfaces/contracts.js.map +1 -0
- package/dist/surfaces/filesystem.d.ts +76 -0
- package/dist/surfaces/filesystem.d.ts.map +1 -0
- package/dist/surfaces/filesystem.js +245 -0
- package/dist/surfaces/filesystem.js.map +1 -0
- package/dist/surfaces/index.d.ts +6 -0
- package/dist/surfaces/index.d.ts.map +1 -0
- package/dist/surfaces/index.js +5 -0
- package/dist/surfaces/index.js.map +1 -0
- package/dist/surfaces/registry.d.ts +24 -0
- package/dist/surfaces/registry.d.ts.map +1 -0
- package/dist/surfaces/registry.js +59 -0
- package/dist/surfaces/registry.js.map +1 -0
- package/dist/surfaces/terminal.d.ts +76 -0
- package/dist/surfaces/terminal.d.ts.map +1 -0
- package/dist/surfaces/terminal.js +271 -0
- package/dist/surfaces/terminal.js.map +1 -0
- package/dist/tools/agent-loop.d.ts +302 -0
- package/dist/tools/agent-loop.d.ts.map +1 -0
- package/dist/tools/agent-loop.js +918 -0
- package/dist/tools/agent-loop.js.map +1 -0
- package/dist/tools/agent-tools.d.ts +39 -0
- package/dist/tools/agent-tools.d.ts.map +1 -0
- package/dist/tools/agent-tools.js +263 -0
- package/dist/tools/agent-tools.js.map +1 -0
- package/dist/tools/browser-tools.d.ts +38 -0
- package/dist/tools/browser-tools.d.ts.map +1 -0
- package/dist/tools/browser-tools.js +725 -0
- package/dist/tools/browser-tools.js.map +1 -0
- package/dist/tools/chat-modes.d.ts +75 -0
- package/dist/tools/chat-modes.d.ts.map +1 -0
- package/dist/tools/chat-modes.js +228 -0
- package/dist/tools/chat-modes.js.map +1 -0
- package/dist/tools/contracts.d.ts +69 -0
- package/dist/tools/contracts.d.ts.map +1 -0
- package/dist/tools/contracts.js +2 -0
- package/dist/tools/contracts.js.map +1 -0
- package/dist/tools/core/agent.d.ts +31 -0
- package/dist/tools/core/agent.d.ts.map +1 -0
- package/dist/tools/core/agent.js +65 -0
- package/dist/tools/core/agent.js.map +1 -0
- package/dist/tools/core/edit.d.ts +30 -0
- package/dist/tools/core/edit.d.ts.map +1 -0
- package/dist/tools/core/edit.js +109 -0
- package/dist/tools/core/edit.js.map +1 -0
- package/dist/tools/core/execute.d.ts +36 -0
- package/dist/tools/core/execute.d.ts.map +1 -0
- package/dist/tools/core/execute.js +81 -0
- package/dist/tools/core/execute.js.map +1 -0
- package/dist/tools/core/get-fs.d.ts +32 -0
- package/dist/tools/core/get-fs.d.ts.map +1 -0
- package/dist/tools/core/get-fs.js +143 -0
- package/dist/tools/core/get-fs.js.map +1 -0
- package/dist/tools/core/index.d.ts +26 -0
- package/dist/tools/core/index.d.ts.map +1 -0
- package/dist/tools/core/index.js +26 -0
- package/dist/tools/core/index.js.map +1 -0
- package/dist/tools/core/jait.d.ts +60 -0
- package/dist/tools/core/jait.d.ts.map +1 -0
- package/dist/tools/core/jait.js +256 -0
- package/dist/tools/core/jait.js.map +1 -0
- package/dist/tools/core/read.d.ts +26 -0
- package/dist/tools/core/read.d.ts.map +1 -0
- package/dist/tools/core/read.js +118 -0
- package/dist/tools/core/read.js.map +1 -0
- package/dist/tools/core/search.d.ts +34 -0
- package/dist/tools/core/search.d.ts.map +1 -0
- package/dist/tools/core/search.js +187 -0
- package/dist/tools/core/search.js.map +1 -0
- package/dist/tools/core/todo.d.ts +38 -0
- package/dist/tools/core/todo.d.ts.map +1 -0
- package/dist/tools/core/todo.js +116 -0
- package/dist/tools/core/todo.js.map +1 -0
- package/dist/tools/core/web.d.ts +34 -0
- package/dist/tools/core/web.d.ts.map +1 -0
- package/dist/tools/core/web.js +120 -0
- package/dist/tools/core/web.js.map +1 -0
- package/dist/tools/cron-tools.d.ts +7 -0
- package/dist/tools/cron-tools.d.ts.map +1 -0
- package/dist/tools/cron-tools.js +116 -0
- package/dist/tools/cron-tools.js.map +1 -0
- package/dist/tools/file-tools.d.ts +32 -0
- package/dist/tools/file-tools.d.ts.map +1 -0
- package/dist/tools/file-tools.js +178 -0
- package/dist/tools/file-tools.js.map +1 -0
- package/dist/tools/gateway-tools.d.ts +15 -0
- package/dist/tools/gateway-tools.d.ts.map +1 -0
- package/dist/tools/gateway-tools.js +39 -0
- package/dist/tools/gateway-tools.js.map +1 -0
- package/dist/tools/index.d.ts +57 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +170 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/mcp-bridge.d.ts +111 -0
- package/dist/tools/mcp-bridge.d.ts.map +1 -0
- package/dist/tools/mcp-bridge.js +166 -0
- package/dist/tools/mcp-bridge.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +19 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +78 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/meta-tools.d.ts +25 -0
- package/dist/tools/meta-tools.d.ts.map +1 -0
- package/dist/tools/meta-tools.js +125 -0
- package/dist/tools/meta-tools.js.map +1 -0
- package/dist/tools/network-tools.d.ts +21 -0
- package/dist/tools/network-tools.d.ts.map +1 -0
- package/dist/tools/network-tools.js +189 -0
- package/dist/tools/network-tools.js.map +1 -0
- package/dist/tools/os-tools.d.ts +18 -0
- package/dist/tools/os-tools.d.ts.map +1 -0
- package/dist/tools/os-tools.js +210 -0
- package/dist/tools/os-tools.js.map +1 -0
- package/dist/tools/prompts/claude-prompt.d.ts +8 -0
- package/dist/tools/prompts/claude-prompt.d.ts.map +1 -0
- package/dist/tools/prompts/claude-prompt.js +228 -0
- package/dist/tools/prompts/claude-prompt.js.map +1 -0
- package/dist/tools/prompts/default-openai-prompt.d.ts +8 -0
- package/dist/tools/prompts/default-openai-prompt.d.ts.map +1 -0
- package/dist/tools/prompts/default-openai-prompt.js +67 -0
- package/dist/tools/prompts/default-openai-prompt.js.map +1 -0
- package/dist/tools/prompts/default-prompt.d.ts +7 -0
- package/dist/tools/prompts/default-prompt.d.ts.map +1 -0
- package/dist/tools/prompts/default-prompt.js +50 -0
- package/dist/tools/prompts/default-prompt.js.map +1 -0
- package/dist/tools/prompts/gemini-prompt.d.ts +8 -0
- package/dist/tools/prompts/gemini-prompt.d.ts.map +1 -0
- package/dist/tools/prompts/gemini-prompt.js +118 -0
- package/dist/tools/prompts/gemini-prompt.js.map +1 -0
- package/dist/tools/prompts/gpt5-codex-prompt.d.ts +8 -0
- package/dist/tools/prompts/gpt5-codex-prompt.d.ts.map +1 -0
- package/dist/tools/prompts/gpt5-codex-prompt.js +72 -0
- package/dist/tools/prompts/gpt5-codex-prompt.js.map +1 -0
- package/dist/tools/prompts/gpt5-prompt.d.ts +8 -0
- package/dist/tools/prompts/gpt5-prompt.d.ts.map +1 -0
- package/dist/tools/prompts/gpt5-prompt.js +177 -0
- package/dist/tools/prompts/gpt5-prompt.js.map +1 -0
- package/dist/tools/prompts/gpt51-prompt.d.ts +8 -0
- package/dist/tools/prompts/gpt51-prompt.d.ts.map +1 -0
- package/dist/tools/prompts/gpt51-prompt.js +178 -0
- package/dist/tools/prompts/gpt51-prompt.js.map +1 -0
- package/dist/tools/prompts/gpt52-prompt.d.ts +8 -0
- package/dist/tools/prompts/gpt52-prompt.d.ts.map +1 -0
- package/dist/tools/prompts/gpt52-prompt.js +198 -0
- package/dist/tools/prompts/gpt52-prompt.js.map +1 -0
- package/dist/tools/prompts/index.d.ts +22 -0
- package/dist/tools/prompts/index.d.ts.map +1 -0
- package/dist/tools/prompts/index.js +23 -0
- package/dist/tools/prompts/index.js.map +1 -0
- package/dist/tools/prompts/prompt-registry.d.ts +44 -0
- package/dist/tools/prompts/prompt-registry.d.ts.map +1 -0
- package/dist/tools/prompts/prompt-registry.js +60 -0
- package/dist/tools/prompts/prompt-registry.js.map +1 -0
- package/dist/tools/prompts/shared-sections.d.ts +28 -0
- package/dist/tools/prompts/shared-sections.d.ts.map +1 -0
- package/dist/tools/prompts/shared-sections.js +111 -0
- package/dist/tools/prompts/shared-sections.js.map +1 -0
- package/dist/tools/prompts/xai-prompt.d.ts +8 -0
- package/dist/tools/prompts/xai-prompt.d.ts.map +1 -0
- package/dist/tools/prompts/xai-prompt.js +68 -0
- package/dist/tools/prompts/xai-prompt.js.map +1 -0
- package/dist/tools/redeploy-tools.d.ts +30 -0
- package/dist/tools/redeploy-tools.d.ts.map +1 -0
- package/dist/tools/redeploy-tools.js +191 -0
- package/dist/tools/redeploy-tools.js.map +1 -0
- package/dist/tools/registry.d.ts +51 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +148 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/screen-share-tools.d.ts +31 -0
- package/dist/tools/screen-share-tools.d.ts.map +1 -0
- package/dist/tools/screen-share-tools.js +183 -0
- package/dist/tools/screen-share-tools.js.map +1 -0
- package/dist/tools/surface-tools.d.ts +23 -0
- package/dist/tools/surface-tools.d.ts.map +1 -0
- package/dist/tools/surface-tools.js +99 -0
- package/dist/tools/surface-tools.js.map +1 -0
- package/dist/tools/terminal-tools.d.ts +37 -0
- package/dist/tools/terminal-tools.d.ts.map +1 -0
- package/dist/tools/terminal-tools.js +448 -0
- package/dist/tools/terminal-tools.js.map +1 -0
- package/dist/tools/thread-tools.d.ts +61 -0
- package/dist/tools/thread-tools.d.ts.map +1 -0
- package/dist/tools/thread-tools.js +484 -0
- package/dist/tools/thread-tools.js.map +1 -0
- package/dist/tools/token-estimator.d.ts +55 -0
- package/dist/tools/token-estimator.d.ts.map +1 -0
- package/dist/tools/token-estimator.js +82 -0
- package/dist/tools/token-estimator.js.map +1 -0
- package/dist/tools/tool-names.d.ts +64 -0
- package/dist/tools/tool-names.d.ts.map +1 -0
- package/dist/tools/tool-names.js +76 -0
- package/dist/tools/tool-names.js.map +1 -0
- package/dist/tools/validate.d.ts +27 -0
- package/dist/tools/validate.d.ts.map +1 -0
- package/dist/tools/validate.js +99 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/tools/voice-tools.d.ts +8 -0
- package/dist/tools/voice-tools.d.ts.map +1 -0
- package/dist/tools/voice-tools.js +32 -0
- package/dist/tools/voice-tools.js.map +1 -0
- package/dist/voice/service.d.ts +42 -0
- package/dist/voice/service.d.ts.map +1 -0
- package/dist/voice/service.js +75 -0
- package/dist/voice/service.js.map +1 -0
- package/dist/ws.d.ts +90 -0
- package/dist/ws.d.ts.map +1 -0
- package/dist/ws.js +562 -0
- package/dist/ws.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type SurfaceState = "idle" | "starting" | "running" | "stopping" | "stopped" | "error";
|
|
2
|
+
export interface SurfaceStartInput {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
workspaceRoot: string;
|
|
5
|
+
}
|
|
6
|
+
export interface SurfaceStopInput {
|
|
7
|
+
reason?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface SurfaceSnapshot {
|
|
10
|
+
id: string;
|
|
11
|
+
type: string;
|
|
12
|
+
state: SurfaceState;
|
|
13
|
+
sessionId: string;
|
|
14
|
+
startedAt?: string;
|
|
15
|
+
metadata: Record<string, string | number | boolean | null>;
|
|
16
|
+
}
|
|
17
|
+
export interface Surface {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly type: string;
|
|
20
|
+
readonly state: SurfaceState;
|
|
21
|
+
readonly sessionId: string | null;
|
|
22
|
+
start(input: SurfaceStartInput): Promise<void>;
|
|
23
|
+
stop(input?: SurfaceStopInput): Promise<void>;
|
|
24
|
+
snapshot(): SurfaceSnapshot;
|
|
25
|
+
/** Event callback — fired when output arrives (terminal stdout, etc.) */
|
|
26
|
+
onOutput?: (data: string) => void;
|
|
27
|
+
/** Event callback — fired on state change */
|
|
28
|
+
onStateChange?: (state: SurfaceState) => void;
|
|
29
|
+
}
|
|
30
|
+
export interface SurfaceFactory {
|
|
31
|
+
type: string;
|
|
32
|
+
create(id: string): Surface;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../src/surfaces/contracts.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAE9F,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,IAAI,eAAe,CAAC;IAE5B,yEAAyE;IACzE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,6CAA6C;IAC7C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../src/surfaces/contracts.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File System Surface — Sprint 3.4
|
|
3
|
+
*
|
|
4
|
+
* file.read, file.write, file.patch with path boundary enforcement
|
|
5
|
+
* via PathGuard. Tracks operations for audit.
|
|
6
|
+
*/
|
|
7
|
+
import { type PathGuardOptions } from "../security/path-guard.js";
|
|
8
|
+
import type { Surface, SurfaceStartInput, SurfaceStopInput, SurfaceSnapshot, SurfaceState } from "./contracts.js";
|
|
9
|
+
export declare class FileSystemSurface implements Surface {
|
|
10
|
+
readonly id: string;
|
|
11
|
+
private guardOpts?;
|
|
12
|
+
readonly type: "filesystem";
|
|
13
|
+
private _state;
|
|
14
|
+
private _sessionId;
|
|
15
|
+
private _startedAt;
|
|
16
|
+
private guard;
|
|
17
|
+
private _opCount;
|
|
18
|
+
/**
|
|
19
|
+
* Backup map: absolute path → original file content.
|
|
20
|
+
* Stored before the first write/patch so that undo can restore the original.
|
|
21
|
+
* Only the *first* version is kept (subsequent edits don't overwrite the backup).
|
|
22
|
+
*/
|
|
23
|
+
private _backups;
|
|
24
|
+
onOutput?: (data: string) => void;
|
|
25
|
+
onStateChange?: (state: SurfaceState) => void;
|
|
26
|
+
constructor(id: string, guardOpts?: Partial<PathGuardOptions> | undefined);
|
|
27
|
+
get state(): SurfaceState;
|
|
28
|
+
get sessionId(): string | null;
|
|
29
|
+
start(input: SurfaceStartInput): Promise<void>;
|
|
30
|
+
stop(_input?: SurfaceStopInput): Promise<void>;
|
|
31
|
+
snapshot(): SurfaceSnapshot;
|
|
32
|
+
read(filePath: string): Promise<string>;
|
|
33
|
+
write(filePath: string, content: string): Promise<void>;
|
|
34
|
+
patch(filePath: string, search: string, replace: string): Promise<{
|
|
35
|
+
matched: boolean;
|
|
36
|
+
}>;
|
|
37
|
+
exists(filePath: string): Promise<boolean>;
|
|
38
|
+
list(dirPath: string): Promise<string[]>;
|
|
39
|
+
statFile(filePath: string): Promise<{
|
|
40
|
+
size: number;
|
|
41
|
+
isDirectory: boolean;
|
|
42
|
+
modified: string;
|
|
43
|
+
}>;
|
|
44
|
+
/** Check if a path is within workspace boundary */
|
|
45
|
+
isPathAllowed(filePath: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Restore a file to its pre-modification state.
|
|
48
|
+
* Returns true if a backup existed and was restored, false otherwise.
|
|
49
|
+
*/
|
|
50
|
+
restore(filePath: string): Promise<boolean>;
|
|
51
|
+
/** Check whether we have a backup for a given file path */
|
|
52
|
+
hasBackup(filePath: string): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Get the backup (original) content for a file.
|
|
55
|
+
* Returns the original string, null if the file was newly created, or undefined if no backup exists.
|
|
56
|
+
*/
|
|
57
|
+
getBackup(filePath: string): string | null | undefined;
|
|
58
|
+
/** Clear the backup for a file (e.g. after user accepts changes). */
|
|
59
|
+
clearBackup(filePath: string): void;
|
|
60
|
+
/**
|
|
61
|
+
* Save a backup of the current file content for an external change.
|
|
62
|
+
* Used when CLI providers (e.g. Codex) modify files directly, bypassing
|
|
63
|
+
* the surface's own write/patch methods.
|
|
64
|
+
* Only saves the *first* backup — won't overwrite existing entries.
|
|
65
|
+
*/
|
|
66
|
+
saveExternalBackup(filePath: string): Promise<void>;
|
|
67
|
+
private ensureRunning;
|
|
68
|
+
private _setState;
|
|
69
|
+
}
|
|
70
|
+
export declare class FileSystemSurfaceFactory {
|
|
71
|
+
private guardOpts?;
|
|
72
|
+
readonly type: "filesystem";
|
|
73
|
+
constructor(guardOpts?: Partial<PathGuardOptions> | undefined);
|
|
74
|
+
create(id: string): FileSystemSurface;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=filesystem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.d.ts","sourceRoot":"","sources":["../../src/surfaces/filesystem.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACb,MAAM,gBAAgB,CAAC;AAExB,qBAAa,iBAAkB,YAAW,OAAO;aAoB7B,EAAE,EAAE,MAAM;IAC1B,OAAO,CAAC,SAAS,CAAC;IApBpB,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;IAEtC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,QAAQ,CAAK;IAErB;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAoC;IAEpD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAC;gBAG5B,EAAE,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,YAAA;IAG/C,IAAI,KAAK,IAAI,YAAY,CAExB;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,IAAI,CAE7B;IAEK,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9C,IAAI,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAKpD,QAAQ,IAAI,eAAe;IAgBrB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASvC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBvD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAqBvF,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1C,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAWnG,mDAAmD;IACnD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIxC;;;OAGG;IACG,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBjD,2DAA2D;IAC3D,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAUpC;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS;IAWtD,qEAAqE;IACrE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQnC;;;;;OAKG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAazD,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,SAAS;CAIlB;AAED,qBAAa,wBAAwB;IAEvB,OAAO,CAAC,SAAS,CAAC;IAD9B,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;gBAClB,SAAS,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,YAAA;IAEzD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,iBAAiB;CAGtC"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File System Surface — Sprint 3.4
|
|
3
|
+
*
|
|
4
|
+
* file.read, file.write, file.patch with path boundary enforcement
|
|
5
|
+
* via PathGuard. Tracks operations for audit.
|
|
6
|
+
*/
|
|
7
|
+
import { readFile, writeFile, mkdir, stat, readdir } from "node:fs/promises";
|
|
8
|
+
import { dirname, relative } from "node:path";
|
|
9
|
+
import { PathGuard } from "../security/path-guard.js";
|
|
10
|
+
export class FileSystemSurface {
|
|
11
|
+
id;
|
|
12
|
+
guardOpts;
|
|
13
|
+
type = "filesystem";
|
|
14
|
+
_state = "idle";
|
|
15
|
+
_sessionId = null;
|
|
16
|
+
_startedAt = null;
|
|
17
|
+
guard = null;
|
|
18
|
+
_opCount = 0;
|
|
19
|
+
/**
|
|
20
|
+
* Backup map: absolute path → original file content.
|
|
21
|
+
* Stored before the first write/patch so that undo can restore the original.
|
|
22
|
+
* Only the *first* version is kept (subsequent edits don't overwrite the backup).
|
|
23
|
+
*/
|
|
24
|
+
_backups = new Map();
|
|
25
|
+
onOutput;
|
|
26
|
+
onStateChange;
|
|
27
|
+
constructor(id, guardOpts) {
|
|
28
|
+
this.id = id;
|
|
29
|
+
this.guardOpts = guardOpts;
|
|
30
|
+
}
|
|
31
|
+
get state() {
|
|
32
|
+
return this._state;
|
|
33
|
+
}
|
|
34
|
+
get sessionId() {
|
|
35
|
+
return this._sessionId;
|
|
36
|
+
}
|
|
37
|
+
async start(input) {
|
|
38
|
+
this._sessionId = input.sessionId;
|
|
39
|
+
this._startedAt = new Date().toISOString();
|
|
40
|
+
this.guard = new PathGuard({
|
|
41
|
+
workspaceRoot: input.workspaceRoot,
|
|
42
|
+
...this.guardOpts,
|
|
43
|
+
});
|
|
44
|
+
this._setState("running");
|
|
45
|
+
}
|
|
46
|
+
async stop(_input) {
|
|
47
|
+
this._setState("stopped");
|
|
48
|
+
this.guard = null;
|
|
49
|
+
}
|
|
50
|
+
snapshot() {
|
|
51
|
+
return {
|
|
52
|
+
id: this.id,
|
|
53
|
+
type: this.type,
|
|
54
|
+
state: this._state,
|
|
55
|
+
sessionId: this._sessionId ?? "",
|
|
56
|
+
startedAt: this._startedAt ?? undefined,
|
|
57
|
+
metadata: {
|
|
58
|
+
workspaceRoot: this.guard?.workspaceRoot ?? null,
|
|
59
|
+
operationCount: this._opCount,
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
// ── File Operations ────────────────────────────────────────────
|
|
64
|
+
async read(filePath) {
|
|
65
|
+
this.ensureRunning();
|
|
66
|
+
const abs = await this.guard.validateWithSymlinkCheck(filePath);
|
|
67
|
+
this._opCount++;
|
|
68
|
+
const content = await readFile(abs, "utf-8");
|
|
69
|
+
this.onOutput?.(`read ${relative(this.guard.workspaceRoot, abs)} (${content.length} bytes)`);
|
|
70
|
+
return content;
|
|
71
|
+
}
|
|
72
|
+
async write(filePath, content) {
|
|
73
|
+
this.ensureRunning();
|
|
74
|
+
const abs = await this.guard.validateWithSymlinkCheck(filePath);
|
|
75
|
+
this._opCount++;
|
|
76
|
+
// Save backup of original content (only on first modification)
|
|
77
|
+
if (!this._backups.has(abs)) {
|
|
78
|
+
try {
|
|
79
|
+
const original = await readFile(abs, "utf-8");
|
|
80
|
+
this._backups.set(abs, original);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// File didn't exist before — backup is null (undo = delete)
|
|
84
|
+
this._backups.set(abs, null);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Ensure parent directory exists
|
|
88
|
+
await mkdir(dirname(abs), { recursive: true });
|
|
89
|
+
await writeFile(abs, content, "utf-8");
|
|
90
|
+
this.onOutput?.(`wrote ${relative(this.guard.workspaceRoot, abs)} (${content.length} bytes)`);
|
|
91
|
+
}
|
|
92
|
+
async patch(filePath, search, replace) {
|
|
93
|
+
this.ensureRunning();
|
|
94
|
+
const abs = await this.guard.validateWithSymlinkCheck(filePath);
|
|
95
|
+
this._opCount++;
|
|
96
|
+
const original = await readFile(abs, "utf-8");
|
|
97
|
+
if (!original.includes(search)) {
|
|
98
|
+
return { matched: false };
|
|
99
|
+
}
|
|
100
|
+
// Save backup of original content (only on first modification)
|
|
101
|
+
if (!this._backups.has(abs)) {
|
|
102
|
+
this._backups.set(abs, original);
|
|
103
|
+
}
|
|
104
|
+
const patched = original.replace(search, replace);
|
|
105
|
+
await writeFile(abs, patched, "utf-8");
|
|
106
|
+
this.onOutput?.(`patched ${relative(this.guard.workspaceRoot, abs)}`);
|
|
107
|
+
return { matched: true };
|
|
108
|
+
}
|
|
109
|
+
async exists(filePath) {
|
|
110
|
+
this.ensureRunning();
|
|
111
|
+
const abs = this.guard.validate(filePath);
|
|
112
|
+
try {
|
|
113
|
+
await stat(abs);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async list(dirPath) {
|
|
121
|
+
this.ensureRunning();
|
|
122
|
+
const abs = this.guard.validate(dirPath);
|
|
123
|
+
this._opCount++;
|
|
124
|
+
const entries = await readdir(abs, { withFileTypes: true });
|
|
125
|
+
return entries.map((e) => (e.isDirectory() ? e.name + "/" : e.name));
|
|
126
|
+
}
|
|
127
|
+
async statFile(filePath) {
|
|
128
|
+
this.ensureRunning();
|
|
129
|
+
const abs = this.guard.validate(filePath);
|
|
130
|
+
const s = await stat(abs);
|
|
131
|
+
return {
|
|
132
|
+
size: s.size,
|
|
133
|
+
isDirectory: s.isDirectory(),
|
|
134
|
+
modified: s.mtime.toISOString(),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
/** Check if a path is within workspace boundary */
|
|
138
|
+
isPathAllowed(filePath) {
|
|
139
|
+
return this.guard?.isAllowed(filePath) ?? false;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Restore a file to its pre-modification state.
|
|
143
|
+
* Returns true if a backup existed and was restored, false otherwise.
|
|
144
|
+
*/
|
|
145
|
+
async restore(filePath) {
|
|
146
|
+
this.ensureRunning();
|
|
147
|
+
const abs = await this.guard.validateWithSymlinkCheck(filePath);
|
|
148
|
+
if (!this._backups.has(abs))
|
|
149
|
+
return false;
|
|
150
|
+
const backup = this._backups.get(abs);
|
|
151
|
+
if (backup === null) {
|
|
152
|
+
// File was newly created — remove it
|
|
153
|
+
const { unlink } = await import("node:fs/promises");
|
|
154
|
+
try {
|
|
155
|
+
await unlink(abs);
|
|
156
|
+
}
|
|
157
|
+
catch { /* already gone */ }
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
await writeFile(abs, backup, "utf-8");
|
|
161
|
+
}
|
|
162
|
+
this._backups.delete(abs);
|
|
163
|
+
this.onOutput?.(`restored ${relative(this.guard.workspaceRoot, abs)}`);
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
/** Check whether we have a backup for a given file path */
|
|
167
|
+
hasBackup(filePath) {
|
|
168
|
+
if (!this.guard)
|
|
169
|
+
return false;
|
|
170
|
+
try {
|
|
171
|
+
const abs = this.guard.validate(filePath);
|
|
172
|
+
return this._backups.has(abs);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get the backup (original) content for a file.
|
|
180
|
+
* Returns the original string, null if the file was newly created, or undefined if no backup exists.
|
|
181
|
+
*/
|
|
182
|
+
getBackup(filePath) {
|
|
183
|
+
if (!this.guard)
|
|
184
|
+
return undefined;
|
|
185
|
+
try {
|
|
186
|
+
const abs = this.guard.validate(filePath);
|
|
187
|
+
if (!this._backups.has(abs))
|
|
188
|
+
return undefined;
|
|
189
|
+
return this._backups.get(abs) ?? null;
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/** Clear the backup for a file (e.g. after user accepts changes). */
|
|
196
|
+
clearBackup(filePath) {
|
|
197
|
+
if (!this.guard)
|
|
198
|
+
return;
|
|
199
|
+
try {
|
|
200
|
+
const abs = this.guard.validate(filePath);
|
|
201
|
+
this._backups.delete(abs);
|
|
202
|
+
}
|
|
203
|
+
catch { /* ignore */ }
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Save a backup of the current file content for an external change.
|
|
207
|
+
* Used when CLI providers (e.g. Codex) modify files directly, bypassing
|
|
208
|
+
* the surface's own write/patch methods.
|
|
209
|
+
* Only saves the *first* backup — won't overwrite existing entries.
|
|
210
|
+
*/
|
|
211
|
+
async saveExternalBackup(filePath) {
|
|
212
|
+
this.ensureRunning();
|
|
213
|
+
const abs = await this.guard.validateWithSymlinkCheck(filePath);
|
|
214
|
+
if (this._backups.has(abs))
|
|
215
|
+
return;
|
|
216
|
+
try {
|
|
217
|
+
const original = await readFile(abs, "utf-8");
|
|
218
|
+
this._backups.set(abs, original);
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// File doesn't exist yet — backup is null (undo = delete the new file)
|
|
222
|
+
this._backups.set(abs, null);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
ensureRunning() {
|
|
226
|
+
if (this._state !== "running" || !this.guard) {
|
|
227
|
+
throw new Error("FileSystem surface is not running");
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
_setState(s) {
|
|
231
|
+
this._state = s;
|
|
232
|
+
this.onStateChange?.(s);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
export class FileSystemSurfaceFactory {
|
|
236
|
+
guardOpts;
|
|
237
|
+
type = "filesystem";
|
|
238
|
+
constructor(guardOpts) {
|
|
239
|
+
this.guardOpts = guardOpts;
|
|
240
|
+
}
|
|
241
|
+
create(id) {
|
|
242
|
+
return new FileSystemSurface(id, this.guardOpts);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/surfaces/filesystem.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { Surface, SurfaceFactory, SurfaceSnapshot, SurfaceStartInput, SurfaceStopInput, SurfaceState, } from "./contracts.js";
|
|
2
|
+
export { SurfaceRegistry } from "./registry.js";
|
|
3
|
+
export { TerminalSurface, TerminalSurfaceFactory } from "./terminal.js";
|
|
4
|
+
export { FileSystemSurface, FileSystemSurfaceFactory } from "./filesystem.js";
|
|
5
|
+
export { BrowserSurface, BrowserSurfaceFactory, type BrowserDriver, type BrowserPageSnapshot, type BrowserInteractiveElement, } from "./browser.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/surfaces/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,OAAO,EACP,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,yBAAyB,GAC/B,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { SurfaceRegistry } from "./registry.js";
|
|
2
|
+
export { TerminalSurface, TerminalSurfaceFactory } from "./terminal.js";
|
|
3
|
+
export { FileSystemSurface, FileSystemSurfaceFactory } from "./filesystem.js";
|
|
4
|
+
export { BrowserSurface, BrowserSurfaceFactory, } from "./browser.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/surfaces/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EACL,cAAc,EACd,qBAAqB,GAItB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Surface, SurfaceFactory, SurfaceSnapshot, SurfaceStartInput } from "./contracts.js";
|
|
2
|
+
export declare class SurfaceRegistry {
|
|
3
|
+
private readonly factories;
|
|
4
|
+
private readonly surfaces;
|
|
5
|
+
/** Called after every surface is started (regardless of creation path) */
|
|
6
|
+
onSurfaceStarted?: (id: string, surface: Surface) => void;
|
|
7
|
+
/** Called just before a surface is removed after stopping */
|
|
8
|
+
onSurfaceStopped?: (id: string, surface: Surface) => void;
|
|
9
|
+
register(factory: SurfaceFactory): void;
|
|
10
|
+
/** Create + start a surface in one call */
|
|
11
|
+
startSurface(type: string, id: string, input: SurfaceStartInput): Promise<Surface>;
|
|
12
|
+
/** Stop + remove a surface */
|
|
13
|
+
stopSurface(id: string, reason?: string): Promise<boolean>;
|
|
14
|
+
getSurface(id: string): Surface | undefined;
|
|
15
|
+
listSurfaces(): Surface[];
|
|
16
|
+
listSnapshots(): SurfaceSnapshot[];
|
|
17
|
+
/** Get surfaces belonging to a specific session */
|
|
18
|
+
getBySession(sessionId: string): Surface[];
|
|
19
|
+
unregister(id: string): boolean;
|
|
20
|
+
/** Stop all surfaces (used during shutdown) */
|
|
21
|
+
stopAll(reason?: string): Promise<void>;
|
|
22
|
+
get registeredTypes(): string[];
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/surfaces/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAElG,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqC;IAC/D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA8B;IAEvD,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1D,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAE1D,QAAQ,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIvC,2CAA2C;IACrC,YAAY,CAChB,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,OAAO,CAAC;IAanB,8BAA8B;IACxB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI3C,YAAY,IAAI,OAAO,EAAE;IAIzB,aAAa,IAAI,eAAe,EAAE;IAIlC,mDAAmD;IACnD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE;IAI1C,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B,+CAA+C;IACzC,OAAO,CAAC,MAAM,SAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjD,IAAI,eAAe,IAAI,MAAM,EAAE,CAE9B;CACF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export class SurfaceRegistry {
|
|
2
|
+
factories = new Map();
|
|
3
|
+
surfaces = new Map();
|
|
4
|
+
/** Called after every surface is started (regardless of creation path) */
|
|
5
|
+
onSurfaceStarted;
|
|
6
|
+
/** Called just before a surface is removed after stopping */
|
|
7
|
+
onSurfaceStopped;
|
|
8
|
+
register(factory) {
|
|
9
|
+
this.factories.set(factory.type, factory);
|
|
10
|
+
}
|
|
11
|
+
/** Create + start a surface in one call */
|
|
12
|
+
async startSurface(type, id, input) {
|
|
13
|
+
const factory = this.factories.get(type);
|
|
14
|
+
if (!factory) {
|
|
15
|
+
throw new Error(`Surface factory '${type}' is not registered`);
|
|
16
|
+
}
|
|
17
|
+
const instance = factory.create(id);
|
|
18
|
+
this.surfaces.set(id, instance);
|
|
19
|
+
await instance.start(input);
|
|
20
|
+
this.onSurfaceStarted?.(id, instance);
|
|
21
|
+
return instance;
|
|
22
|
+
}
|
|
23
|
+
/** Stop + remove a surface */
|
|
24
|
+
async stopSurface(id, reason) {
|
|
25
|
+
const surface = this.surfaces.get(id);
|
|
26
|
+
if (!surface)
|
|
27
|
+
return false;
|
|
28
|
+
const snap = surface.snapshot();
|
|
29
|
+
await surface.stop({ reason });
|
|
30
|
+
this.onSurfaceStopped?.(id, { ...surface, snapshot: () => snap });
|
|
31
|
+
this.surfaces.delete(id);
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
getSurface(id) {
|
|
35
|
+
return this.surfaces.get(id);
|
|
36
|
+
}
|
|
37
|
+
listSurfaces() {
|
|
38
|
+
return [...this.surfaces.values()];
|
|
39
|
+
}
|
|
40
|
+
listSnapshots() {
|
|
41
|
+
return this.listSurfaces().map((s) => s.snapshot());
|
|
42
|
+
}
|
|
43
|
+
/** Get surfaces belonging to a specific session */
|
|
44
|
+
getBySession(sessionId) {
|
|
45
|
+
return this.listSurfaces().filter((s) => s.sessionId === sessionId);
|
|
46
|
+
}
|
|
47
|
+
unregister(id) {
|
|
48
|
+
return this.surfaces.delete(id);
|
|
49
|
+
}
|
|
50
|
+
/** Stop all surfaces (used during shutdown) */
|
|
51
|
+
async stopAll(reason = "shutdown") {
|
|
52
|
+
const ids = [...this.surfaces.keys()];
|
|
53
|
+
await Promise.allSettled(ids.map((id) => this.stopSurface(id, reason)));
|
|
54
|
+
}
|
|
55
|
+
get registeredTypes() {
|
|
56
|
+
return [...this.factories.keys()];
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/surfaces/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Surface — uses bun-pty directly.
|
|
3
|
+
*
|
|
4
|
+
* Each TerminalSurface owns a persistent interactive PTY shell process
|
|
5
|
+
* (viewable in the frontend via xterm.js + WebSocket).
|
|
6
|
+
*
|
|
7
|
+
* Shell integration:
|
|
8
|
+
* On start, sources an integration script that hooks into the shell's
|
|
9
|
+
* prompt lifecycle and emits OSC 633 escape sequences (same protocol as
|
|
10
|
+
* VS Code's terminal shell integration). This lets us detect command
|
|
11
|
+
* boundaries, exit codes, and CWD changes without wrapping commands.
|
|
12
|
+
*/
|
|
13
|
+
import type { Surface, SurfaceStartInput, SurfaceStopInput, SurfaceSnapshot, SurfaceState } from "./contracts.js";
|
|
14
|
+
export interface TerminalSurfaceOptions {
|
|
15
|
+
shell?: string;
|
|
16
|
+
cols?: number;
|
|
17
|
+
rows?: number;
|
|
18
|
+
env?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
export interface TerminalExecutionResult {
|
|
21
|
+
output: string;
|
|
22
|
+
exitCode: number | null;
|
|
23
|
+
timedOut: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare class TerminalSurface implements Surface {
|
|
26
|
+
readonly id: string;
|
|
27
|
+
readonly type: "terminal";
|
|
28
|
+
private _state;
|
|
29
|
+
private _sessionId;
|
|
30
|
+
private _startedAt;
|
|
31
|
+
private _cwd;
|
|
32
|
+
private _pid;
|
|
33
|
+
private _pty;
|
|
34
|
+
private _outputBuffer;
|
|
35
|
+
private _cols;
|
|
36
|
+
private _rows;
|
|
37
|
+
private readonly shell;
|
|
38
|
+
private readonly extraEnv;
|
|
39
|
+
private _outputListeners;
|
|
40
|
+
/** Whether the OSC 633 shell integration has emitted its first prompt (B marker) */
|
|
41
|
+
private _shellIntegrationReady;
|
|
42
|
+
private _shellIntegrationReadyResolve?;
|
|
43
|
+
private _shellIntegrationReadyPromise;
|
|
44
|
+
/** External callbacks (wired by index.ts / routes) */
|
|
45
|
+
onOutput?: (data: string) => void;
|
|
46
|
+
onStateChange?: (state: SurfaceState) => void;
|
|
47
|
+
onExit?: (exitCode: number, signal?: number) => void;
|
|
48
|
+
constructor(id: string, opts?: TerminalSurfaceOptions);
|
|
49
|
+
get state(): SurfaceState;
|
|
50
|
+
get sessionId(): string | null;
|
|
51
|
+
get pid(): number | undefined;
|
|
52
|
+
/** True once the shell has emitted at least one OSC 633;B prompt-end marker */
|
|
53
|
+
get shellIntegrationReady(): boolean;
|
|
54
|
+
/** Resolves when the shell integration prompt is first ready (or after a timeout fallback) */
|
|
55
|
+
waitForPrompt(timeoutMs?: number): Promise<void>;
|
|
56
|
+
start(input: SurfaceStartInput): Promise<void>;
|
|
57
|
+
stop(_input?: SurfaceStopInput): Promise<void>;
|
|
58
|
+
/** Write raw data to the PTY (user keyboard input from frontend) */
|
|
59
|
+
write(data: string): void;
|
|
60
|
+
/** Resize the PTY */
|
|
61
|
+
resize(cols: number, rows: number): void;
|
|
62
|
+
/** Add an output listener (used by terminal.run to mirror output) */
|
|
63
|
+
addOutputListener(listener: (data: string) => void): void;
|
|
64
|
+
/** Remove an output listener */
|
|
65
|
+
removeOutputListener(listener: (data: string) => void): void;
|
|
66
|
+
snapshot(): SurfaceSnapshot;
|
|
67
|
+
getRecentOutput(lines?: number): string;
|
|
68
|
+
private _setState;
|
|
69
|
+
}
|
|
70
|
+
export declare class TerminalSurfaceFactory {
|
|
71
|
+
readonly type: "terminal";
|
|
72
|
+
private opts;
|
|
73
|
+
constructor(opts?: TerminalSurfaceOptions);
|
|
74
|
+
create(id: string): TerminalSurface;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/surfaces/terminal.ts"],"names":[],"mappings":"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"}
|