@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,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* jait — Platform meta-tool for Jait-specific capabilities.
|
|
3
|
+
*
|
|
4
|
+
* Combines: memory management, cron/scheduler, network scanning,
|
|
5
|
+
* and gateway status into a single tool with an `action` dispatcher.
|
|
6
|
+
*
|
|
7
|
+
* This keeps the core tool count at 8 while still exposing
|
|
8
|
+
* platform-specific features that don't fit the generic tools.
|
|
9
|
+
*/
|
|
10
|
+
export function createJaitTool(deps) {
|
|
11
|
+
return {
|
|
12
|
+
name: "jait",
|
|
13
|
+
description: "Jait platform tool — access memory, scheduler, network, and gateway status.\n\n" +
|
|
14
|
+
"**Actions:**\n" +
|
|
15
|
+
"- `memory.save` — Save a memory entry for later retrieval. Provide `content`, `scope` (workspace/project/contact), " +
|
|
16
|
+
"`sourceType`, `sourceId`.\n" +
|
|
17
|
+
"- `memory.search` — Search saved memories using semantic similarity. Provide `query`, optional `limit` and `scope`.\n" +
|
|
18
|
+
"- `memory.forget` — Delete a memory by ID. Provide `memoryId`.\n" +
|
|
19
|
+
"- `cron.add` — Add a scheduled cron job. Provide `name`, `cron` (cron expression), `toolName`, optional `input`.\n" +
|
|
20
|
+
"- `cron.list` — List all configured cron jobs.\n" +
|
|
21
|
+
"- `cron.update` — Update a cron job. Provide `jobId`, plus any fields to change (`name`, `cron`, `enabled`, `input`).\n" +
|
|
22
|
+
"- `cron.remove` — Remove a cron job. Provide `jobId`.\n" +
|
|
23
|
+
"- `status` — Get gateway runtime health: uptime, sessions, surfaces, connected devices, scheduler stats.",
|
|
24
|
+
tier: "core",
|
|
25
|
+
category: "gateway",
|
|
26
|
+
source: "builtin",
|
|
27
|
+
parameters: {
|
|
28
|
+
type: "object",
|
|
29
|
+
properties: {
|
|
30
|
+
action: {
|
|
31
|
+
type: "string",
|
|
32
|
+
description: "The action to perform: memory.save, memory.search, memory.forget, " +
|
|
33
|
+
"cron.add, cron.list, cron.update, cron.remove, status.",
|
|
34
|
+
enum: [
|
|
35
|
+
"memory.save", "memory.search", "memory.forget",
|
|
36
|
+
"cron.add", "cron.list", "cron.update", "cron.remove",
|
|
37
|
+
"status",
|
|
38
|
+
],
|
|
39
|
+
},
|
|
40
|
+
// Memory params
|
|
41
|
+
content: {
|
|
42
|
+
type: "string",
|
|
43
|
+
description: "Memory content to save (for memory.save).",
|
|
44
|
+
},
|
|
45
|
+
scope: {
|
|
46
|
+
type: "string",
|
|
47
|
+
description: 'Memory scope: "workspace", "project", or "contact" (for memory.save/search).',
|
|
48
|
+
enum: ["workspace", "project", "contact"],
|
|
49
|
+
},
|
|
50
|
+
query: {
|
|
51
|
+
type: "string",
|
|
52
|
+
description: "Search query (for memory.search).",
|
|
53
|
+
},
|
|
54
|
+
memoryId: {
|
|
55
|
+
type: "string",
|
|
56
|
+
description: "Memory ID to forget (for memory.forget).",
|
|
57
|
+
},
|
|
58
|
+
sourceType: {
|
|
59
|
+
type: "string",
|
|
60
|
+
description: "Source type (for memory.save).",
|
|
61
|
+
},
|
|
62
|
+
sourceId: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Source ID (for memory.save).",
|
|
65
|
+
},
|
|
66
|
+
ttlSeconds: {
|
|
67
|
+
type: "number",
|
|
68
|
+
description: "TTL in seconds for memory expiry (for memory.save).",
|
|
69
|
+
},
|
|
70
|
+
limit: {
|
|
71
|
+
type: "number",
|
|
72
|
+
description: "Max results (for memory.search, default: 5).",
|
|
73
|
+
},
|
|
74
|
+
// Cron params
|
|
75
|
+
name: {
|
|
76
|
+
type: "string",
|
|
77
|
+
description: "Cron job name (for cron.add).",
|
|
78
|
+
},
|
|
79
|
+
cron: {
|
|
80
|
+
type: "string",
|
|
81
|
+
description: 'Cron expression (for cron.add/update). E.g. "0 9 * * *" for daily at 9am.',
|
|
82
|
+
},
|
|
83
|
+
toolName: {
|
|
84
|
+
type: "string",
|
|
85
|
+
description: "Tool name to execute on schedule (for cron.add).",
|
|
86
|
+
},
|
|
87
|
+
input: {
|
|
88
|
+
type: "object",
|
|
89
|
+
description: "Tool input arguments (for cron.add/update).",
|
|
90
|
+
},
|
|
91
|
+
jobId: {
|
|
92
|
+
type: "string",
|
|
93
|
+
description: "Cron job ID (for cron.update/remove).",
|
|
94
|
+
},
|
|
95
|
+
enabled: {
|
|
96
|
+
type: "boolean",
|
|
97
|
+
description: "Enable/disable toggle (for cron.update).",
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
required: ["action"],
|
|
101
|
+
},
|
|
102
|
+
async execute(input, context) {
|
|
103
|
+
try {
|
|
104
|
+
switch (input.action) {
|
|
105
|
+
// ── Memory ──────────────────────────────────────────────
|
|
106
|
+
case "memory.save": {
|
|
107
|
+
if (!deps.memoryService) {
|
|
108
|
+
return { ok: false, message: "Memory service not available." };
|
|
109
|
+
}
|
|
110
|
+
if (!input.content) {
|
|
111
|
+
return { ok: false, message: "memory.save requires `content`." };
|
|
112
|
+
}
|
|
113
|
+
const expiresAt = input.ttlSeconds
|
|
114
|
+
? new Date(Date.now() + input.ttlSeconds * 1000).toISOString()
|
|
115
|
+
: undefined;
|
|
116
|
+
const entry = await deps.memoryService.save({
|
|
117
|
+
scope: input.scope ?? "workspace",
|
|
118
|
+
content: input.content,
|
|
119
|
+
source: {
|
|
120
|
+
type: input.sourceType ?? "agent",
|
|
121
|
+
id: input.sourceId ?? context.actionId,
|
|
122
|
+
surface: "chat",
|
|
123
|
+
},
|
|
124
|
+
expiresAt,
|
|
125
|
+
});
|
|
126
|
+
return { ok: true, message: `Saved memory ${entry.id}`, data: entry };
|
|
127
|
+
}
|
|
128
|
+
case "memory.search": {
|
|
129
|
+
if (!deps.memoryService) {
|
|
130
|
+
return { ok: false, message: "Memory service not available." };
|
|
131
|
+
}
|
|
132
|
+
if (!input.query) {
|
|
133
|
+
return { ok: false, message: "memory.search requires `query`." };
|
|
134
|
+
}
|
|
135
|
+
const results = await deps.memoryService.search(input.query, input.limit ?? 5, input.scope);
|
|
136
|
+
return { ok: true, message: `Found ${results.length} memories`, data: results };
|
|
137
|
+
}
|
|
138
|
+
case "memory.forget": {
|
|
139
|
+
if (!deps.memoryService) {
|
|
140
|
+
return { ok: false, message: "Memory service not available." };
|
|
141
|
+
}
|
|
142
|
+
if (!input.memoryId) {
|
|
143
|
+
return { ok: false, message: "memory.forget requires `memoryId`." };
|
|
144
|
+
}
|
|
145
|
+
const removed = await deps.memoryService.forget(input.memoryId);
|
|
146
|
+
return {
|
|
147
|
+
ok: removed,
|
|
148
|
+
message: removed ? `Forgot memory ${input.memoryId}` : `Memory ${input.memoryId} not found`,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// ── Cron ────────────────────────────────────────────────
|
|
152
|
+
case "cron.add": {
|
|
153
|
+
if (!deps.scheduler) {
|
|
154
|
+
return { ok: false, message: "Scheduler not available." };
|
|
155
|
+
}
|
|
156
|
+
if (!input.name || !input.cron || !input.toolName) {
|
|
157
|
+
return { ok: false, message: "cron.add requires `name`, `cron`, and `toolName`." };
|
|
158
|
+
}
|
|
159
|
+
// Normalize tool name (underscore → dot)
|
|
160
|
+
const toolNameNormalized = input.toolName.includes("_") && !input.toolName.includes(".")
|
|
161
|
+
? input.toolName.replace("_", ".")
|
|
162
|
+
: input.toolName;
|
|
163
|
+
const job = deps.scheduler.create({
|
|
164
|
+
userId: context.userId,
|
|
165
|
+
name: input.name,
|
|
166
|
+
cron: input.cron,
|
|
167
|
+
toolName: toolNameNormalized,
|
|
168
|
+
input: input.input ?? {},
|
|
169
|
+
sessionId: context.sessionId,
|
|
170
|
+
workspaceRoot: process.cwd(),
|
|
171
|
+
});
|
|
172
|
+
return { ok: true, message: "Cron job created", data: job };
|
|
173
|
+
}
|
|
174
|
+
case "cron.list": {
|
|
175
|
+
if (!deps.scheduler) {
|
|
176
|
+
return { ok: false, message: "Scheduler not available." };
|
|
177
|
+
}
|
|
178
|
+
const jobs = deps.scheduler.list(context.userId);
|
|
179
|
+
return { ok: true, message: `${jobs.length} cron jobs`, data: { jobs } };
|
|
180
|
+
}
|
|
181
|
+
case "cron.update": {
|
|
182
|
+
if (!deps.scheduler) {
|
|
183
|
+
return { ok: false, message: "Scheduler not available." };
|
|
184
|
+
}
|
|
185
|
+
if (!input.jobId) {
|
|
186
|
+
return { ok: false, message: "cron.update requires `jobId`." };
|
|
187
|
+
}
|
|
188
|
+
const updated = deps.scheduler.update(input.jobId, {
|
|
189
|
+
name: input.name,
|
|
190
|
+
cron: input.cron,
|
|
191
|
+
enabled: input.enabled,
|
|
192
|
+
input: input.input,
|
|
193
|
+
}, context.userId);
|
|
194
|
+
return {
|
|
195
|
+
ok: !!updated,
|
|
196
|
+
message: updated ? "Cron job updated" : "Cron job not found",
|
|
197
|
+
data: updated ?? { id: input.jobId },
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
case "cron.remove": {
|
|
201
|
+
if (!deps.scheduler) {
|
|
202
|
+
return { ok: false, message: "Scheduler not available." };
|
|
203
|
+
}
|
|
204
|
+
if (!input.jobId) {
|
|
205
|
+
return { ok: false, message: "cron.remove requires `jobId`." };
|
|
206
|
+
}
|
|
207
|
+
const removed = deps.scheduler.remove(input.jobId, context.userId);
|
|
208
|
+
return {
|
|
209
|
+
ok: removed,
|
|
210
|
+
message: removed ? "Cron job removed" : "Cron job not found",
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// ── Gateway status ──────────────────────────────────────
|
|
214
|
+
case "status": {
|
|
215
|
+
const sessions = deps.sessionService?.list("active").length ?? 0;
|
|
216
|
+
const surfaces = deps.surfaceRegistry?.listSurfaces().length ?? 0;
|
|
217
|
+
const devices = deps.ws?.clientCount ?? 0;
|
|
218
|
+
const jobs = deps.scheduler?.list() ?? [];
|
|
219
|
+
const enabledJobs = jobs.filter((j) => j.enabled).length;
|
|
220
|
+
const hookEventTypes = deps.hooks?.registeredEventTypes() ?? [];
|
|
221
|
+
return {
|
|
222
|
+
ok: true,
|
|
223
|
+
message: "Gateway status",
|
|
224
|
+
data: {
|
|
225
|
+
healthy: true,
|
|
226
|
+
uptime: Math.floor((Date.now() - (deps.startedAt ?? Date.now())) / 1000),
|
|
227
|
+
sessions,
|
|
228
|
+
surfaces,
|
|
229
|
+
devices,
|
|
230
|
+
scheduler: { totalJobs: jobs.length, enabledJobs },
|
|
231
|
+
hooks: {
|
|
232
|
+
registeredEventTypes: hookEventTypes,
|
|
233
|
+
listeners: deps.hooks?.listenerCount() ?? 0,
|
|
234
|
+
},
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
default:
|
|
239
|
+
return {
|
|
240
|
+
ok: false,
|
|
241
|
+
message: `Unknown action: "${input.action}". ` +
|
|
242
|
+
"Valid actions: memory.save, memory.search, memory.forget, " +
|
|
243
|
+
"cron.add, cron.list, cron.update, cron.remove, status.",
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
return {
|
|
249
|
+
ok: false,
|
|
250
|
+
message: err instanceof Error ? err.message : "Jait tool failed",
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
},
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=jait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jait.js","sourceRoot":"","sources":["../../../src/tools/core/jait.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* read — Read file contents or list directory entries.
|
|
3
|
+
*
|
|
4
|
+
* Inspired by VS Code Copilot's read_file + list_dir, unified into one tool.
|
|
5
|
+
* Auto-detects whether the path is a file or directory.
|
|
6
|
+
*
|
|
7
|
+
* Key design decisions (learned from Copilot):
|
|
8
|
+
* - Hard cap at MAX_LINES_PER_READ to prevent context blowup
|
|
9
|
+
* - Truncation notice when file exceeds limit
|
|
10
|
+
* - Guidance to "prefer reading larger ranges over many small reads"
|
|
11
|
+
* - Line numbers in output for easy reference
|
|
12
|
+
* - Directory entries show trailing `/` for folders (like Copilot list_dir)
|
|
13
|
+
*/
|
|
14
|
+
import type { ToolDefinition } from "../contracts.js";
|
|
15
|
+
import type { SurfaceRegistry } from "../../surfaces/registry.js";
|
|
16
|
+
interface ReadInput {
|
|
17
|
+
/** File or directory path (relative to workspace root, or absolute) */
|
|
18
|
+
path: string;
|
|
19
|
+
/** Start line (1-based, optional — for reading a range of a file) */
|
|
20
|
+
startLine?: number;
|
|
21
|
+
/** End line (1-based inclusive, optional) */
|
|
22
|
+
endLine?: number;
|
|
23
|
+
}
|
|
24
|
+
export declare function createReadTool(registry: SurfaceRegistry): ToolDefinition<ReadInput>;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../../src/tools/core/read.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,iBAAiB,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAMlE,UAAU,SAAS;IACjB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,eAAe,GAAG,cAAc,CAAC,SAAS,CAAC,CAuGnF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* read — Read file contents or list directory entries.
|
|
3
|
+
*
|
|
4
|
+
* Inspired by VS Code Copilot's read_file + list_dir, unified into one tool.
|
|
5
|
+
* Auto-detects whether the path is a file or directory.
|
|
6
|
+
*
|
|
7
|
+
* Key design decisions (learned from Copilot):
|
|
8
|
+
* - Hard cap at MAX_LINES_PER_READ to prevent context blowup
|
|
9
|
+
* - Truncation notice when file exceeds limit
|
|
10
|
+
* - Guidance to "prefer reading larger ranges over many small reads"
|
|
11
|
+
* - Line numbers in output for easy reference
|
|
12
|
+
* - Directory entries show trailing `/` for folders (like Copilot list_dir)
|
|
13
|
+
*/
|
|
14
|
+
import { getFs } from "./get-fs.js";
|
|
15
|
+
/** Hard cap on lines returned in a single read (matches Copilot's limit). */
|
|
16
|
+
const MAX_LINES_PER_READ = 2000;
|
|
17
|
+
export function createReadTool(registry) {
|
|
18
|
+
return {
|
|
19
|
+
name: "read",
|
|
20
|
+
description: "Read the contents of a file, or list a directory.\n\n" +
|
|
21
|
+
"If the path points to a file, returns its content (optionally a specific line range). " +
|
|
22
|
+
"If the path points to a directory, returns the list of entries (names ending in `/` are folders).\n\n" +
|
|
23
|
+
"You must specify the line range you're interested in for large files. Line numbers are 1-indexed. " +
|
|
24
|
+
"This tool truncates output at " + MAX_LINES_PER_READ + " lines — call it again with an offset to read " +
|
|
25
|
+
"more. Prefer reading larger ranges over doing many small reads.\n\n" +
|
|
26
|
+
"Use this to understand code, check configs, explore project structure, or verify changes you made.",
|
|
27
|
+
tier: "core",
|
|
28
|
+
category: "filesystem",
|
|
29
|
+
source: "builtin",
|
|
30
|
+
parameters: {
|
|
31
|
+
type: "object",
|
|
32
|
+
properties: {
|
|
33
|
+
path: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "The file or directory path (relative to workspace root, or absolute).",
|
|
36
|
+
},
|
|
37
|
+
startLine: {
|
|
38
|
+
type: "number",
|
|
39
|
+
description: "The 1-based line number to start reading from. Omit to start from the beginning.",
|
|
40
|
+
},
|
|
41
|
+
endLine: {
|
|
42
|
+
type: "number",
|
|
43
|
+
description: "The 1-based inclusive line number to stop reading at. Omit to read to the end (capped at " + MAX_LINES_PER_READ + " lines).",
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
required: ["path"],
|
|
47
|
+
},
|
|
48
|
+
async execute(input, context) {
|
|
49
|
+
try {
|
|
50
|
+
const fs = await getFs(registry, context, input.path);
|
|
51
|
+
// ── Directory path → list entries ──────────────────────────
|
|
52
|
+
let isDir = false;
|
|
53
|
+
try {
|
|
54
|
+
const info = await fs.statFile(input.path);
|
|
55
|
+
isDir = info.isDirectory;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// stat failed — try reading as file (will throw its own error)
|
|
59
|
+
}
|
|
60
|
+
if (isDir) {
|
|
61
|
+
const entries = await fs.list(input.path);
|
|
62
|
+
// Append / to directory names (Copilot list_dir convention)
|
|
63
|
+
const formatted = entries.map((e) => {
|
|
64
|
+
if (typeof e === "string")
|
|
65
|
+
return e;
|
|
66
|
+
if (e.name && e.isDirectory)
|
|
67
|
+
return e.name + "/";
|
|
68
|
+
if (e.name)
|
|
69
|
+
return e.name;
|
|
70
|
+
return String(e);
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
ok: true,
|
|
74
|
+
message: `Directory ${input.path} — ${formatted.length} entries`,
|
|
75
|
+
data: { path: input.path, type: "directory", entries: formatted },
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
// ── File path → read contents ──────────────────────────────
|
|
79
|
+
const content = await fs.read(input.path);
|
|
80
|
+
const allLines = content.split("\n");
|
|
81
|
+
const totalLines = allLines.length;
|
|
82
|
+
// Compute effective range
|
|
83
|
+
const start = Math.max(1, input.startLine ?? 1) - 1; // 0-indexed
|
|
84
|
+
const requestedEnd = input.endLine ?? totalLines;
|
|
85
|
+
const cappedEnd = Math.min(totalLines, start + MAX_LINES_PER_READ, requestedEnd);
|
|
86
|
+
const slice = allLines.slice(start, cappedEnd);
|
|
87
|
+
const truncated = cappedEnd < totalLines && !input.endLine;
|
|
88
|
+
// Build line-numbered content
|
|
89
|
+
const numbered = slice
|
|
90
|
+
.map((line, i) => `${start + i + 1}\t${line}`)
|
|
91
|
+
.join("\n");
|
|
92
|
+
const suffix = truncated
|
|
93
|
+
? `\n\n[File content truncated. Showing lines ${start + 1}-${cappedEnd} of ${totalLines}. Use startLine/endLine to read more.]`
|
|
94
|
+
: "";
|
|
95
|
+
return {
|
|
96
|
+
ok: true,
|
|
97
|
+
message: `${input.path} — lines ${start + 1}-${cappedEnd} of ${totalLines}`,
|
|
98
|
+
data: {
|
|
99
|
+
path: input.path,
|
|
100
|
+
type: "file",
|
|
101
|
+
content: numbered + suffix,
|
|
102
|
+
totalLines,
|
|
103
|
+
startLine: start + 1,
|
|
104
|
+
endLine: cappedEnd,
|
|
105
|
+
truncated,
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
return {
|
|
111
|
+
ok: false,
|
|
112
|
+
message: err instanceof Error ? err.message : "Read failed",
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../../src/tools/core/read.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* search — Search files in the workspace by content or name.
|
|
3
|
+
*
|
|
4
|
+
* Inspired by VS Code Copilot's grep_search + file_search:
|
|
5
|
+
* - `isRegexp` flag for explicit regex vs literal mode
|
|
6
|
+
* - Auto-retry with opposite mode if no results found
|
|
7
|
+
* - `includeIgnoredFiles` to search in gitignored dirs (node_modules, etc.)
|
|
8
|
+
* - Hard cap on max results (200)
|
|
9
|
+
* - Rich description with regex alternation tips
|
|
10
|
+
* - Timeout protection (20s)
|
|
11
|
+
*/
|
|
12
|
+
import type { ToolDefinition } from "../contracts.js";
|
|
13
|
+
import type { SurfaceRegistry } from "../../surfaces/registry.js";
|
|
14
|
+
interface SearchInput {
|
|
15
|
+
/** The search pattern (text or regex) */
|
|
16
|
+
pattern: string;
|
|
17
|
+
/** Whether the pattern is a regex (default: false = literal text search) */
|
|
18
|
+
isRegexp?: boolean;
|
|
19
|
+
/** Directory to search in (defaults to workspace root) */
|
|
20
|
+
path?: string;
|
|
21
|
+
/** Search mode: "content" (grep) or "files" (find by name). Default: "content" */
|
|
22
|
+
mode?: string;
|
|
23
|
+
/** Include file glob pattern (e.g. "*.ts", "src/**"). Default: all files */
|
|
24
|
+
include?: string;
|
|
25
|
+
/** Maximum number of results (default: 20, max: 200) */
|
|
26
|
+
limit?: number;
|
|
27
|
+
/** Whether to include files normally ignored by .gitignore (default: false).
|
|
28
|
+
* Warning: this may be slower. Only set when you need to search in
|
|
29
|
+
* node_modules, build outputs, or other ignored directories. */
|
|
30
|
+
includeIgnoredFiles?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function createSearchTool(registry: SurfaceRegistry): ToolDefinition<SearchInput>;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/tools/core/search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,iBAAiB,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAelE,UAAU,WAAW;IACnB,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;qEAEiE;IACjE,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,cAAc,CAAC,WAAW,CAAC,CAwGvF"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* search — Search files in the workspace by content or name.
|
|
3
|
+
*
|
|
4
|
+
* Inspired by VS Code Copilot's grep_search + file_search:
|
|
5
|
+
* - `isRegexp` flag for explicit regex vs literal mode
|
|
6
|
+
* - Auto-retry with opposite mode if no results found
|
|
7
|
+
* - `includeIgnoredFiles` to search in gitignored dirs (node_modules, etc.)
|
|
8
|
+
* - Hard cap on max results (200)
|
|
9
|
+
* - Rich description with regex alternation tips
|
|
10
|
+
* - Timeout protection (20s)
|
|
11
|
+
*/
|
|
12
|
+
import { resolveWorkspaceRoot } from "./get-fs.js";
|
|
13
|
+
import { exec } from "node:child_process";
|
|
14
|
+
import { promisify } from "node:util";
|
|
15
|
+
import { platform } from "node:os";
|
|
16
|
+
const execAsync = promisify(exec);
|
|
17
|
+
/** Absolute maximum results to prevent context blowup. */
|
|
18
|
+
const MAX_RESULTS_CAP = 200;
|
|
19
|
+
/** Default number of results when not specified. */
|
|
20
|
+
const DEFAULT_MAX_RESULTS = 20;
|
|
21
|
+
/** Search timeout in ms. */
|
|
22
|
+
const SEARCH_TIMEOUT = 20_000;
|
|
23
|
+
export function createSearchTool(registry) {
|
|
24
|
+
return {
|
|
25
|
+
name: "search",
|
|
26
|
+
description: "Search for files or text in the workspace.\n\n" +
|
|
27
|
+
'**Content search** (default, mode="content"): Fast text/regex search through file contents. ' +
|
|
28
|
+
"Returns matching lines with file paths and line numbers. " +
|
|
29
|
+
"Use `isRegexp: true` when searching with regex patterns. " +
|
|
30
|
+
"If you are not sure what words will appear in the workspace, prefer using regex patterns with " +
|
|
31
|
+
'alternation (|) or character classes to search for multiple potential words at once instead of ' +
|
|
32
|
+
"making separate searches. For example, use `function|method|procedure` to find all of those " +
|
|
33
|
+
"at once. Use `include` to search within files matching a specific glob (e.g. \"*.ts\", \"src/**\").\n\n" +
|
|
34
|
+
'**File search** (mode="files"): Find files by name pattern (plain substring, not globs). ' +
|
|
35
|
+
"For example, use `readme` not `*readme*`. Returns only file paths.\n\n" +
|
|
36
|
+
"Use `includeIgnoredFiles: true` to search in normally-ignored directories like node_modules " +
|
|
37
|
+
"or build outputs — but be aware this may be slower.\n\n" +
|
|
38
|
+
"Use this tool when you want to see an overview of a file, instead of calling read many times.",
|
|
39
|
+
tier: "core",
|
|
40
|
+
category: "filesystem",
|
|
41
|
+
source: "builtin",
|
|
42
|
+
parameters: {
|
|
43
|
+
type: "object",
|
|
44
|
+
properties: {
|
|
45
|
+
pattern: {
|
|
46
|
+
type: "string",
|
|
47
|
+
description: "The pattern to search for. Use regex with alternation (e.g. 'word1|word2') or character " +
|
|
48
|
+
"classes to find multiple words in a single search. Set `isRegexp` appropriately.",
|
|
49
|
+
},
|
|
50
|
+
isRegexp: {
|
|
51
|
+
type: "boolean",
|
|
52
|
+
description: "Whether the pattern is a regex (default: false). Search is case-insensitive by default.",
|
|
53
|
+
},
|
|
54
|
+
path: {
|
|
55
|
+
type: "string",
|
|
56
|
+
description: "Directory to search in (defaults to workspace root).",
|
|
57
|
+
},
|
|
58
|
+
mode: {
|
|
59
|
+
type: "string",
|
|
60
|
+
description: '"content" (grep, default) or "files" (find by name).',
|
|
61
|
+
enum: ["content", "files"],
|
|
62
|
+
},
|
|
63
|
+
include: {
|
|
64
|
+
type: "string",
|
|
65
|
+
description: 'File glob to filter results (e.g. "*.ts", "src/**/*.py"). ' +
|
|
66
|
+
"Applied to paths relative to the search directory.",
|
|
67
|
+
},
|
|
68
|
+
limit: {
|
|
69
|
+
type: "number",
|
|
70
|
+
description: `Maximum number of results (default: ${DEFAULT_MAX_RESULTS}, max: ${MAX_RESULTS_CAP}). ` +
|
|
71
|
+
"Don't set this unless necessary — it can slow things down.",
|
|
72
|
+
},
|
|
73
|
+
includeIgnoredFiles: {
|
|
74
|
+
type: "boolean",
|
|
75
|
+
description: "Whether to include files normally ignored by .gitignore and search.exclude settings. " +
|
|
76
|
+
"Warning: may be slower. Only set when searching in node_modules or build outputs.",
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
required: ["pattern"],
|
|
80
|
+
},
|
|
81
|
+
async execute(input, context) {
|
|
82
|
+
const effectiveRoot = resolveWorkspaceRoot(registry, context.sessionId);
|
|
83
|
+
const searchDir = input.path || effectiveRoot;
|
|
84
|
+
const limit = Math.min(input.limit ?? DEFAULT_MAX_RESULTS, MAX_RESULTS_CAP);
|
|
85
|
+
const mode = input.mode ?? "content";
|
|
86
|
+
try {
|
|
87
|
+
if (mode === "files") {
|
|
88
|
+
return await searchFiles(searchDir, input.pattern, limit);
|
|
89
|
+
}
|
|
90
|
+
// Try content search with the given regex mode
|
|
91
|
+
const result = await searchContent(searchDir, input.pattern, input.include, limit, input.isRegexp ?? false, input.includeIgnoredFiles ?? false);
|
|
92
|
+
// Auto-retry with opposite mode if no results (Copilot pattern)
|
|
93
|
+
if (result.ok && result.data?.matches?.length === 0) {
|
|
94
|
+
const retryResult = await searchContent(searchDir, input.pattern, input.include, limit, !(input.isRegexp ?? false), input.includeIgnoredFiles ?? false);
|
|
95
|
+
if (retryResult.data?.matches?.length > 0) {
|
|
96
|
+
return {
|
|
97
|
+
...retryResult,
|
|
98
|
+
message: retryResult.message + ` (retried as ${!(input.isRegexp ?? false) ? "regex" : "literal"})`,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
return {
|
|
106
|
+
ok: false,
|
|
107
|
+
message: err instanceof Error ? err.message : "Search failed",
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
async function searchContent(dir, pattern, include, limit, isRegexp, includeIgnored) {
|
|
114
|
+
const isWin = platform() === "win32";
|
|
115
|
+
// Escape pattern for shell safety
|
|
116
|
+
const safePattern = pattern.replace(/"/g, '\\"');
|
|
117
|
+
const safeDir = dir.replace(/"/g, '\\"');
|
|
118
|
+
let cmd;
|
|
119
|
+
if (isWin) {
|
|
120
|
+
// Prefer ripgrep (fast, handles .gitignore)
|
|
121
|
+
const regexpFlag = isRegexp ? "" : "--fixed-strings";
|
|
122
|
+
const includeArg = include ? `--glob "${include}"` : "";
|
|
123
|
+
const ignoreArg = includeIgnored ? "--no-ignore" : "";
|
|
124
|
+
cmd = `rg --no-heading --line-number --max-count ${limit} --ignore-case ${regexpFlag} ${includeArg} ${ignoreArg} -- "${safePattern}" "${safeDir}" 2>nul`;
|
|
125
|
+
// Fallback to findstr if rg not installed
|
|
126
|
+
cmd += ` || findstr /s /n /i /c:"${safePattern}" "${safeDir}\\${include || "*"}" 2>nul`;
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
const regexpFlag = isRegexp ? "" : "--fixed-strings";
|
|
130
|
+
const includeArg = include ? `--glob "${include}"` : "";
|
|
131
|
+
const ignoreArg = includeIgnored ? "--no-ignore" : "";
|
|
132
|
+
cmd = `rg --no-heading --line-number --max-count ${limit} --ignore-case ${regexpFlag} ${includeArg} ${ignoreArg} -- "${safePattern}" "${safeDir}" 2>/dev/null`;
|
|
133
|
+
// Fallback to grep
|
|
134
|
+
const grepInclude = include ? `--include="${include}"` : "";
|
|
135
|
+
const grepRegexp = isRegexp ? "-E" : "-F";
|
|
136
|
+
cmd += ` || grep -rn -i ${grepRegexp} --max-count=${limit} ${grepInclude} -- "${safePattern}" "${safeDir}" 2>/dev/null`;
|
|
137
|
+
}
|
|
138
|
+
const { stdout } = await execAsync(cmd, { timeout: SEARCH_TIMEOUT, maxBuffer: 2 * 1024 * 1024 });
|
|
139
|
+
const lines = stdout.trim().split("\n").filter(Boolean).slice(0, limit);
|
|
140
|
+
if (lines.length === 0) {
|
|
141
|
+
return { ok: true, message: `No matches for "${pattern}"`, data: { matches: [] } };
|
|
142
|
+
}
|
|
143
|
+
const matches = lines.map((line) => {
|
|
144
|
+
// Parse "file:line:content" format
|
|
145
|
+
const m = line.match(/^(.+?):(\d+):(.*)$/);
|
|
146
|
+
if (m) {
|
|
147
|
+
return { file: m[1], line: parseInt(m[2], 10), content: m[3].trim() };
|
|
148
|
+
}
|
|
149
|
+
return { file: "", line: 0, content: line.trim() };
|
|
150
|
+
});
|
|
151
|
+
return {
|
|
152
|
+
ok: true,
|
|
153
|
+
message: `Found ${matches.length} match${matches.length === 1 ? "" : "es"} for "${pattern}"`,
|
|
154
|
+
data: { pattern, matches },
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
async function searchFiles(dir, pattern, limit) {
|
|
158
|
+
const isWin = platform() === "win32";
|
|
159
|
+
const safeDir = dir.replace(/"/g, '\\"');
|
|
160
|
+
// Strip glob wildcards — the LLM sometimes passes "*readme*" instead of "readme".
|
|
161
|
+
// findstr and rg treat * as regex (0+ of prev char), which breaks matching.
|
|
162
|
+
const cleanedPattern = pattern.replace(/[*?[\]]/g, "");
|
|
163
|
+
if (!cleanedPattern) {
|
|
164
|
+
return { ok: true, message: `No files matching "${pattern}" (empty after cleaning)`, data: { files: [] } };
|
|
165
|
+
}
|
|
166
|
+
const safePattern = cleanedPattern.replace(/"/g, '\\"');
|
|
167
|
+
let cmd;
|
|
168
|
+
if (isWin) {
|
|
169
|
+
// Try ripgrep (respects .gitignore) then fall back to dir+findstr.
|
|
170
|
+
// The `|| (...)` ensures the fallback runs when rg is not installed.
|
|
171
|
+
cmd = `(rg --files "${safeDir}" 2>nul | findstr /i "${safePattern}") || (dir /s /b "${safeDir}" 2>nul | findstr /i "${safePattern}")`;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
cmd = `find "${safeDir}" -type f -iname "*${safePattern}*" 2>/dev/null | head -n ${limit}`;
|
|
175
|
+
}
|
|
176
|
+
const { stdout } = await execAsync(cmd, { timeout: SEARCH_TIMEOUT, maxBuffer: 2 * 1024 * 1024 });
|
|
177
|
+
const files = stdout.trim().split("\n").filter(Boolean).slice(0, limit);
|
|
178
|
+
if (files.length === 0) {
|
|
179
|
+
return { ok: true, message: `No files matching "${pattern}"`, data: { files: [] } };
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
ok: true,
|
|
183
|
+
message: `Found ${files.length} file${files.length === 1 ? "" : "s"} matching "${pattern}"`,
|
|
184
|
+
data: { pattern, files },
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=search.js.map
|