@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,725 @@
|
|
|
1
|
+
import { BrowserSurface } from "../surfaces/browser.js";
|
|
2
|
+
import { SSRFGuard } from "../security/ssrf-guard.js";
|
|
3
|
+
import { SandboxManager } from "../security/sandbox-manager.js";
|
|
4
|
+
const DEFAULT_BROWSER_ID = "browser-default";
|
|
5
|
+
const DEFAULT_OPENAI_BASE_URL = "https://api.openai.com/v1";
|
|
6
|
+
const DEFAULT_OPENAI_WEB_SEARCH_MODEL = "gpt-5";
|
|
7
|
+
const DEFAULT_PERPLEXITY_MODEL = "sonar-pro";
|
|
8
|
+
const DEFAULT_PERPLEXITY_OPENROUTER_MODEL = "perplexity/sonar-pro";
|
|
9
|
+
const DEFAULT_GROK_MODEL = "grok-4-1212";
|
|
10
|
+
const DEFAULT_GEMINI_MODEL = "gemini-2.0-flash";
|
|
11
|
+
const DEFAULT_KIMI_BASE_URL = "https://api.moonshot.ai/v1";
|
|
12
|
+
const DEFAULT_KIMI_MODEL = "moonshot-v1-128k";
|
|
13
|
+
async function ensureBrowserSurface(registry, context, browserId) {
|
|
14
|
+
const id = browserId ?? DEFAULT_BROWSER_ID;
|
|
15
|
+
const existing = registry.getSurface(id);
|
|
16
|
+
if (existing?.type === "browser" && existing.state === "running") {
|
|
17
|
+
return existing;
|
|
18
|
+
}
|
|
19
|
+
const started = await registry.startSurface("browser", id, {
|
|
20
|
+
sessionId: context.sessionId,
|
|
21
|
+
workspaceRoot: context.workspaceRoot,
|
|
22
|
+
});
|
|
23
|
+
if (started.type !== "browser") {
|
|
24
|
+
throw new Error(`Surface '${id}' is not a browser surface`);
|
|
25
|
+
}
|
|
26
|
+
return started;
|
|
27
|
+
}
|
|
28
|
+
export function createBrowserNavigateTool(registry) {
|
|
29
|
+
return {
|
|
30
|
+
name: "browser.navigate",
|
|
31
|
+
description: "Navigate the browser to a URL and return a page summary",
|
|
32
|
+
tier: "standard",
|
|
33
|
+
category: "browser",
|
|
34
|
+
source: "builtin",
|
|
35
|
+
parameters: {
|
|
36
|
+
type: "object",
|
|
37
|
+
properties: {
|
|
38
|
+
url: { type: "string", description: "HTTP/HTTPS URL to open" },
|
|
39
|
+
browserId: { type: "string", description: "Optional browser surface ID" },
|
|
40
|
+
},
|
|
41
|
+
required: ["url"],
|
|
42
|
+
},
|
|
43
|
+
async execute(input, context) {
|
|
44
|
+
if (context.signal?.aborted)
|
|
45
|
+
return { ok: false, message: "Cancelled" };
|
|
46
|
+
const surface = await ensureBrowserSurface(registry, context, input.browserId);
|
|
47
|
+
const snapshot = await surface.navigate(input.url, context.signal);
|
|
48
|
+
return {
|
|
49
|
+
ok: true,
|
|
50
|
+
message: `Navigated to ${snapshot.url}`,
|
|
51
|
+
data: {
|
|
52
|
+
browserId: surface.id,
|
|
53
|
+
url: snapshot.url,
|
|
54
|
+
title: snapshot.title,
|
|
55
|
+
textPreview: snapshot.text.slice(0, 500),
|
|
56
|
+
interactiveElements: snapshot.elements.slice(0, 10),
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export function createBrowserSnapshotTool(registry) {
|
|
63
|
+
return {
|
|
64
|
+
name: "browser.snapshot",
|
|
65
|
+
description: "Return a structured textual browser snapshot for the current page",
|
|
66
|
+
tier: "standard",
|
|
67
|
+
category: "browser",
|
|
68
|
+
source: "builtin",
|
|
69
|
+
parameters: {
|
|
70
|
+
type: "object",
|
|
71
|
+
properties: {
|
|
72
|
+
browserId: { type: "string", description: "Optional browser surface ID" },
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
async execute(input, context) {
|
|
76
|
+
if (context.signal?.aborted)
|
|
77
|
+
return { ok: false, message: "Cancelled" };
|
|
78
|
+
const surface = await ensureBrowserSurface(registry, context, input.browserId);
|
|
79
|
+
const description = await surface.describe(context.signal);
|
|
80
|
+
return {
|
|
81
|
+
ok: true,
|
|
82
|
+
message: "Browser snapshot captured",
|
|
83
|
+
data: { browserId: surface.id, snapshot: description },
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function makeActionTool(registry, name, description, properties, required, action) {
|
|
89
|
+
return {
|
|
90
|
+
name,
|
|
91
|
+
description,
|
|
92
|
+
tier: "standard",
|
|
93
|
+
category: "browser",
|
|
94
|
+
source: "builtin",
|
|
95
|
+
parameters: { type: "object", properties, required },
|
|
96
|
+
async execute(input, context) {
|
|
97
|
+
if (context.signal?.aborted)
|
|
98
|
+
return { ok: false, message: "Cancelled" };
|
|
99
|
+
const browserId = typeof input === "object" && input !== null && "browserId" in input
|
|
100
|
+
? String(input.browserId ?? "") || undefined
|
|
101
|
+
: undefined;
|
|
102
|
+
const surface = await ensureBrowserSurface(registry, context, browserId);
|
|
103
|
+
const result = await action(surface, input, context.signal);
|
|
104
|
+
return {
|
|
105
|
+
ok: true,
|
|
106
|
+
message: `${name} executed`,
|
|
107
|
+
data: { browserId: surface.id, result },
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
export function createBrowserInteractionTools(registry) {
|
|
113
|
+
return [
|
|
114
|
+
makeActionTool(registry, "browser.click", "Click an element by CSS selector", {
|
|
115
|
+
selector: { type: "string", description: "CSS selector for the target element" },
|
|
116
|
+
browserId: { type: "string", description: "Optional browser surface ID" },
|
|
117
|
+
}, ["selector"], async (surface, input, signal) => {
|
|
118
|
+
await surface.click(input.selector, signal);
|
|
119
|
+
return { selector: input.selector };
|
|
120
|
+
}),
|
|
121
|
+
makeActionTool(registry, "browser.type", "Type text into an element selected by CSS selector", {
|
|
122
|
+
selector: { type: "string", description: "CSS selector for the target input" },
|
|
123
|
+
text: { type: "string", description: "Text to type" },
|
|
124
|
+
browserId: { type: "string", description: "Optional browser surface ID" },
|
|
125
|
+
}, ["selector", "text"], async (surface, input, signal) => {
|
|
126
|
+
await surface.typeText(input.selector, input.text, signal);
|
|
127
|
+
return { selector: input.selector };
|
|
128
|
+
}),
|
|
129
|
+
makeActionTool(registry, "browser.scroll", "Scroll the browser viewport", {
|
|
130
|
+
x: { type: "number", description: "Horizontal scroll position" },
|
|
131
|
+
y: { type: "number", description: "Vertical scroll position" },
|
|
132
|
+
browserId: { type: "string", description: "Optional browser surface ID" },
|
|
133
|
+
}, ["x", "y"], async (surface, input, signal) => {
|
|
134
|
+
await surface.scroll(input.x, input.y, signal);
|
|
135
|
+
return { x: input.x, y: input.y };
|
|
136
|
+
}),
|
|
137
|
+
makeActionTool(registry, "browser.select", "Select a value from a select element", {
|
|
138
|
+
selector: { type: "string", description: "CSS selector for the select element" },
|
|
139
|
+
value: { type: "string", description: "Option value to choose" },
|
|
140
|
+
browserId: { type: "string", description: "Optional browser surface ID" },
|
|
141
|
+
}, ["selector", "value"], async (surface, input, signal) => {
|
|
142
|
+
await surface.select(input.selector, input.value, signal);
|
|
143
|
+
return { selector: input.selector, value: input.value };
|
|
144
|
+
}),
|
|
145
|
+
makeActionTool(registry, "browser.wait", "Wait for an element to appear", {
|
|
146
|
+
selector: { type: "string", description: "CSS selector to wait for" },
|
|
147
|
+
timeoutMs: { type: "number", description: "Timeout in milliseconds (default 10000)" },
|
|
148
|
+
browserId: { type: "string", description: "Optional browser surface ID" },
|
|
149
|
+
}, ["selector"], async (surface, input, signal) => {
|
|
150
|
+
await surface.waitFor(input.selector, input.timeoutMs ?? 10000, signal);
|
|
151
|
+
return { selector: input.selector, timeoutMs: input.timeoutMs ?? 10000 };
|
|
152
|
+
}),
|
|
153
|
+
makeActionTool(registry, "browser.screenshot", "Capture a browser screenshot", {
|
|
154
|
+
path: { type: "string", description: "Optional output file path" },
|
|
155
|
+
browserId: { type: "string", description: "Optional browser surface ID" },
|
|
156
|
+
}, [], async (surface, input, signal) => {
|
|
157
|
+
const screenshotPath = await surface.screenshot(input.path, signal);
|
|
158
|
+
return { path: screenshotPath };
|
|
159
|
+
}),
|
|
160
|
+
];
|
|
161
|
+
}
|
|
162
|
+
export function createWebFetchTool(guard = new SSRFGuard()) {
|
|
163
|
+
return {
|
|
164
|
+
name: "web.fetch",
|
|
165
|
+
description: "Fetch URL content with SSRF protections for public web access",
|
|
166
|
+
tier: "standard",
|
|
167
|
+
category: "web",
|
|
168
|
+
source: "builtin",
|
|
169
|
+
parameters: {
|
|
170
|
+
type: "object",
|
|
171
|
+
properties: {
|
|
172
|
+
url: { type: "string", description: "Public URL to fetch" },
|
|
173
|
+
method: { type: "string", description: "HTTP method" },
|
|
174
|
+
body: { type: "string", description: "Request body" },
|
|
175
|
+
timeoutMs: { type: "number", description: "Request timeout in ms" },
|
|
176
|
+
ignoreTlsErrors: { type: "boolean", description: "Allow retry with TLS verification disabled" },
|
|
177
|
+
},
|
|
178
|
+
required: ["url"],
|
|
179
|
+
},
|
|
180
|
+
async execute(input, context) {
|
|
181
|
+
if (context?.signal?.aborted)
|
|
182
|
+
return { ok: false, message: "Cancelled" };
|
|
183
|
+
const url = guard.validate(input.url).toString();
|
|
184
|
+
const timeoutMs = input.timeoutMs ?? 15000;
|
|
185
|
+
const maxBytes = input.maxBytes ?? 50_000;
|
|
186
|
+
const controller = new AbortController();
|
|
187
|
+
// Link external abort signal to our controller so cancellation propagates
|
|
188
|
+
if (context?.signal) {
|
|
189
|
+
if (context.signal.aborted) {
|
|
190
|
+
controller.abort();
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
context.signal.addEventListener("abort", () => controller.abort(), { once: true });
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
197
|
+
const ignoreTlsErrors = input.ignoreTlsErrors === true || process.env["WEB_FETCH_IGNORE_TLS_ERRORS"] === "true";
|
|
198
|
+
try {
|
|
199
|
+
const { response, insecureTlsUsed } = await fetchWithTlsFallback(url, {
|
|
200
|
+
method: input.method ?? "GET",
|
|
201
|
+
body: input.body,
|
|
202
|
+
headers: input.headers,
|
|
203
|
+
signal: controller.signal,
|
|
204
|
+
}, ignoreTlsErrors);
|
|
205
|
+
const text = await response.text();
|
|
206
|
+
return {
|
|
207
|
+
ok: response.ok,
|
|
208
|
+
message: response.ok
|
|
209
|
+
? insecureTlsUsed
|
|
210
|
+
? `Fetched ${url} (TLS verification disabled)`
|
|
211
|
+
: `Fetched ${url}`
|
|
212
|
+
: `Request failed with ${response.status}`,
|
|
213
|
+
data: {
|
|
214
|
+
url,
|
|
215
|
+
status: response.status,
|
|
216
|
+
contentType: response.headers.get("content-type"),
|
|
217
|
+
body: text.slice(0, maxBytes),
|
|
218
|
+
insecureTlsUsed,
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
const message = extractErrorMessage(err);
|
|
224
|
+
return {
|
|
225
|
+
ok: false,
|
|
226
|
+
message: `Fetch failed: ${message}`,
|
|
227
|
+
data: { url, error: message },
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
clearTimeout(timeout);
|
|
232
|
+
}
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
export function createWebSearchTool(guard = new SSRFGuard()) {
|
|
237
|
+
return {
|
|
238
|
+
name: "web.search",
|
|
239
|
+
description: "Search the public web (auto, openai, brave, perplexity, grok, gemini, kimi)",
|
|
240
|
+
tier: "standard",
|
|
241
|
+
category: "web",
|
|
242
|
+
source: "builtin",
|
|
243
|
+
parameters: {
|
|
244
|
+
type: "object",
|
|
245
|
+
properties: {
|
|
246
|
+
query: { type: "string", description: "Search query" },
|
|
247
|
+
provider: { type: "string", description: "Provider: auto|openai|brave|perplexity|grok|gemini|kimi" },
|
|
248
|
+
limit: { type: "number", description: "Maximum results to return" },
|
|
249
|
+
},
|
|
250
|
+
required: ["query"],
|
|
251
|
+
},
|
|
252
|
+
async execute(input, context) {
|
|
253
|
+
if (context?.signal?.aborted)
|
|
254
|
+
return { ok: false, message: "Cancelled" };
|
|
255
|
+
const requestedProvider = input.provider ?? "auto";
|
|
256
|
+
const getApiKey = (name) => normalizeApiKey(context.apiKeys?.[name]) ?? normalizeApiKey(process.env[name]);
|
|
257
|
+
const provider = resolveWebSearchProvider(requestedProvider, getApiKey);
|
|
258
|
+
const limit = Math.max(1, Math.min(input.limit ?? 5, 10));
|
|
259
|
+
const openaiOptions = {
|
|
260
|
+
apiKey: getApiKey("OPENAI_API_KEY"),
|
|
261
|
+
baseUrl: normalizeApiKey(context.apiKeys?.["OPENAI_BASE_URL"]) ?? process.env["OPENAI_BASE_URL"],
|
|
262
|
+
model: normalizeApiKey(context.apiKeys?.["OPENAI_WEB_SEARCH_MODEL"])
|
|
263
|
+
?? normalizeApiKey(context.apiKeys?.["OPENAI_MODEL"])
|
|
264
|
+
?? process.env["OPENAI_WEB_SEARCH_MODEL"]
|
|
265
|
+
?? process.env["OPENAI_MODEL"]
|
|
266
|
+
?? DEFAULT_OPENAI_WEB_SEARCH_MODEL,
|
|
267
|
+
};
|
|
268
|
+
if (provider === "brave") {
|
|
269
|
+
const apiKey = getApiKey("BRAVE_API_KEY");
|
|
270
|
+
if (!apiKey) {
|
|
271
|
+
return searchOpenAI(guard, input.query, limit, openaiOptions, "Missing BRAVE_API_KEY, falling back to openai web_search");
|
|
272
|
+
}
|
|
273
|
+
return searchBrave(guard, input.query, limit, apiKey);
|
|
274
|
+
}
|
|
275
|
+
if (provider === "perplexity") {
|
|
276
|
+
const perplexityKey = getApiKey("PERPLEXITY_API_KEY");
|
|
277
|
+
const openRouterKey = getApiKey("OPENROUTER_API_KEY");
|
|
278
|
+
if (!perplexityKey && !openRouterKey) {
|
|
279
|
+
return searchOpenAI(guard, input.query, limit, openaiOptions, "Missing PERPLEXITY_API_KEY/OPENROUTER_API_KEY, falling back to openai web_search");
|
|
280
|
+
}
|
|
281
|
+
return searchPerplexity(guard, input.query, limit, { perplexityKey, openRouterKey });
|
|
282
|
+
}
|
|
283
|
+
if (provider === "grok") {
|
|
284
|
+
const apiKey = getApiKey("XAI_API_KEY");
|
|
285
|
+
if (!apiKey) {
|
|
286
|
+
return searchOpenAI(guard, input.query, limit, openaiOptions, "Missing XAI_API_KEY, falling back to openai web_search");
|
|
287
|
+
}
|
|
288
|
+
return searchGrok(guard, input.query, limit, apiKey);
|
|
289
|
+
}
|
|
290
|
+
if (provider === "gemini") {
|
|
291
|
+
const apiKey = getApiKey("GEMINI_API_KEY");
|
|
292
|
+
if (!apiKey) {
|
|
293
|
+
return searchOpenAI(guard, input.query, limit, openaiOptions, "Missing GEMINI_API_KEY, falling back to openai web_search");
|
|
294
|
+
}
|
|
295
|
+
return searchGemini(guard, input.query, limit, apiKey);
|
|
296
|
+
}
|
|
297
|
+
if (provider === "kimi") {
|
|
298
|
+
const apiKey = getApiKey("MOONSHOT_API_KEY");
|
|
299
|
+
if (!apiKey) {
|
|
300
|
+
return searchOpenAI(guard, input.query, limit, openaiOptions, "Missing MOONSHOT_API_KEY, falling back to openai web_search");
|
|
301
|
+
}
|
|
302
|
+
return searchKimi(guard, input.query, limit, apiKey);
|
|
303
|
+
}
|
|
304
|
+
if (provider === "openai") {
|
|
305
|
+
return searchOpenAI(guard, input.query, limit, openaiOptions);
|
|
306
|
+
}
|
|
307
|
+
return searchOpenAI(guard, input.query, limit, openaiOptions, `Provider '${provider}' not available, using openai web_search`);
|
|
308
|
+
},
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
function normalizeApiKey(value) {
|
|
312
|
+
const trimmed = value?.trim();
|
|
313
|
+
return trimmed ? trimmed : undefined;
|
|
314
|
+
}
|
|
315
|
+
function resolveWebSearchProvider(provider, getApiKey) {
|
|
316
|
+
if (provider !== "auto") {
|
|
317
|
+
return provider;
|
|
318
|
+
}
|
|
319
|
+
if (getApiKey("BRAVE_API_KEY"))
|
|
320
|
+
return "brave";
|
|
321
|
+
if (getApiKey("PERPLEXITY_API_KEY") || getApiKey("OPENROUTER_API_KEY")) {
|
|
322
|
+
return "perplexity";
|
|
323
|
+
}
|
|
324
|
+
if (getApiKey("XAI_API_KEY"))
|
|
325
|
+
return "grok";
|
|
326
|
+
if (getApiKey("GEMINI_API_KEY"))
|
|
327
|
+
return "gemini";
|
|
328
|
+
if (getApiKey("MOONSHOT_API_KEY"))
|
|
329
|
+
return "kimi";
|
|
330
|
+
return "openai";
|
|
331
|
+
}
|
|
332
|
+
async function searchOpenAI(guard, query, limit, options, prefixMessage) {
|
|
333
|
+
const apiKey = normalizeApiKey(options.apiKey);
|
|
334
|
+
if (!apiKey) {
|
|
335
|
+
return {
|
|
336
|
+
ok: false,
|
|
337
|
+
message: `${prefixMessage ? `${prefixMessage}. ` : ""}Missing OPENAI_API_KEY`,
|
|
338
|
+
data: { provider: "openai", query, results: [] },
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
const baseUrl = options.baseUrl?.trim() || DEFAULT_OPENAI_BASE_URL;
|
|
342
|
+
const endpoint = `${baseUrl.replace(/\/+$/, "")}/responses`;
|
|
343
|
+
const model = options.model?.trim() || DEFAULT_OPENAI_WEB_SEARCH_MODEL;
|
|
344
|
+
try {
|
|
345
|
+
const url = guard.validate(endpoint);
|
|
346
|
+
const response = await fetch(url, {
|
|
347
|
+
method: "POST",
|
|
348
|
+
headers: {
|
|
349
|
+
"content-type": "application/json",
|
|
350
|
+
authorization: `Bearer ${apiKey}`,
|
|
351
|
+
},
|
|
352
|
+
body: JSON.stringify({
|
|
353
|
+
model,
|
|
354
|
+
tools: [{ type: "web_search" }],
|
|
355
|
+
input: `Provide up to ${limit} web search results for: ${query}`,
|
|
356
|
+
}),
|
|
357
|
+
});
|
|
358
|
+
const data = await response.json();
|
|
359
|
+
if (!response.ok) {
|
|
360
|
+
const detail = data.error?.message || `HTTP ${response.status}`;
|
|
361
|
+
return {
|
|
362
|
+
ok: false,
|
|
363
|
+
message: `${prefixMessage ? `${prefixMessage}. ` : ""}OpenAI web_search failed (${response.status}): ${detail}`,
|
|
364
|
+
data: { provider: "openai", query, results: [] },
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
const { results, summary } = extractOpenAIWebSearchResults(data, query, limit);
|
|
368
|
+
return {
|
|
369
|
+
ok: true,
|
|
370
|
+
message: prefixMessage
|
|
371
|
+
? `${prefixMessage}. Search results (openai)`
|
|
372
|
+
: "Search results (openai)",
|
|
373
|
+
data: {
|
|
374
|
+
provider: "openai",
|
|
375
|
+
model,
|
|
376
|
+
query,
|
|
377
|
+
results,
|
|
378
|
+
summary,
|
|
379
|
+
},
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
catch (err) {
|
|
383
|
+
return {
|
|
384
|
+
ok: false,
|
|
385
|
+
message: `${prefixMessage ? `${prefixMessage}. ` : ""}OpenAI web_search failed: ${extractErrorMessage(err)}`,
|
|
386
|
+
data: { provider: "openai", query, results: [] },
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
async function searchBrave(guard, query, limit, apiKey) {
|
|
391
|
+
try {
|
|
392
|
+
const url = guard.validate(`https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=${limit}`);
|
|
393
|
+
const response = await fetch(url, {
|
|
394
|
+
headers: {
|
|
395
|
+
Accept: "application/json",
|
|
396
|
+
"X-Subscription-Token": apiKey,
|
|
397
|
+
},
|
|
398
|
+
});
|
|
399
|
+
const data = await response.json();
|
|
400
|
+
const results = (data.web?.results ?? [])
|
|
401
|
+
.slice(0, limit)
|
|
402
|
+
.map((entry) => ({
|
|
403
|
+
title: entry.title ?? "",
|
|
404
|
+
url: entry.url ?? "",
|
|
405
|
+
snippet: entry.description ?? "",
|
|
406
|
+
}))
|
|
407
|
+
.filter((entry) => entry.title || entry.url || entry.snippet);
|
|
408
|
+
return {
|
|
409
|
+
ok: response.ok,
|
|
410
|
+
message: response.ok ? "Search results (brave)" : `Brave search failed (${response.status})`,
|
|
411
|
+
data: { provider: "brave", query, results },
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
catch (err) {
|
|
415
|
+
return {
|
|
416
|
+
ok: false,
|
|
417
|
+
message: `Brave search failed: ${extractErrorMessage(err)}`,
|
|
418
|
+
data: { provider: "brave", query, results: [] },
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
async function searchPerplexity(guard, query, limit, keys) {
|
|
423
|
+
const useOpenRouter = !keys.perplexityKey && Boolean(keys.openRouterKey);
|
|
424
|
+
const apiKey = useOpenRouter ? keys.openRouterKey : keys.perplexityKey;
|
|
425
|
+
if (!apiKey) {
|
|
426
|
+
return {
|
|
427
|
+
ok: false,
|
|
428
|
+
message: "Perplexity search failed: missing API key",
|
|
429
|
+
data: { provider: "perplexity", query, results: [] },
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
const model = useOpenRouter
|
|
433
|
+
? (process.env["PERPLEXITY_OPENROUTER_MODEL"]?.trim() || DEFAULT_PERPLEXITY_OPENROUTER_MODEL)
|
|
434
|
+
: (process.env["PERPLEXITY_MODEL"]?.trim() || DEFAULT_PERPLEXITY_MODEL);
|
|
435
|
+
const endpoint = useOpenRouter
|
|
436
|
+
? "https://openrouter.ai/api/v1/chat/completions"
|
|
437
|
+
: "https://api.perplexity.ai/chat/completions";
|
|
438
|
+
try {
|
|
439
|
+
const url = guard.validate(endpoint);
|
|
440
|
+
const response = await fetch(url, {
|
|
441
|
+
method: "POST",
|
|
442
|
+
headers: {
|
|
443
|
+
"content-type": "application/json",
|
|
444
|
+
authorization: `Bearer ${apiKey}`,
|
|
445
|
+
},
|
|
446
|
+
body: JSON.stringify({
|
|
447
|
+
model,
|
|
448
|
+
messages: [{ role: "user", content: `Provide up to ${limit} web results for: ${query}` }],
|
|
449
|
+
}),
|
|
450
|
+
});
|
|
451
|
+
const data = await response.json();
|
|
452
|
+
const content = data.choices?.[0]?.message?.content ?? "";
|
|
453
|
+
const citationResults = (data.citations ?? [])
|
|
454
|
+
.slice(0, limit)
|
|
455
|
+
.map((citationUrl) => ({
|
|
456
|
+
title: safeHostname(citationUrl),
|
|
457
|
+
url: citationUrl,
|
|
458
|
+
snippet: content.slice(0, 500),
|
|
459
|
+
}));
|
|
460
|
+
const results = citationResults.length > 0
|
|
461
|
+
? citationResults
|
|
462
|
+
: [{ title: query, url: "", snippet: content }];
|
|
463
|
+
return {
|
|
464
|
+
ok: response.ok,
|
|
465
|
+
message: response.ok ? "Search results (perplexity)" : `Perplexity search failed (${response.status})`,
|
|
466
|
+
data: { provider: "perplexity", query, results },
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
catch (err) {
|
|
470
|
+
return {
|
|
471
|
+
ok: false,
|
|
472
|
+
message: `Perplexity search failed: ${extractErrorMessage(err)}`,
|
|
473
|
+
data: { provider: "perplexity", query, results: [] },
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
async function searchGrok(guard, query, limit, apiKey) {
|
|
478
|
+
const model = process.env["GROK_MODEL"]?.trim() || DEFAULT_GROK_MODEL;
|
|
479
|
+
try {
|
|
480
|
+
const url = guard.validate("https://api.x.ai/v1/responses");
|
|
481
|
+
const response = await fetch(url, {
|
|
482
|
+
method: "POST",
|
|
483
|
+
headers: {
|
|
484
|
+
"content-type": "application/json",
|
|
485
|
+
authorization: `Bearer ${apiKey}`,
|
|
486
|
+
},
|
|
487
|
+
body: JSON.stringify({
|
|
488
|
+
model,
|
|
489
|
+
input: query,
|
|
490
|
+
tools: [{ type: "web_search" }],
|
|
491
|
+
}),
|
|
492
|
+
});
|
|
493
|
+
const data = await response.json();
|
|
494
|
+
const contentFromOutput = (data.output ?? [])
|
|
495
|
+
.flatMap((output) => output.content ?? [])
|
|
496
|
+
.find((part) => part.type === "output_text" && typeof part.text === "string")?.text;
|
|
497
|
+
const content = contentFromOutput ?? data.output_text ?? "";
|
|
498
|
+
const citationResults = (data.citations ?? [])
|
|
499
|
+
.slice(0, limit)
|
|
500
|
+
.map((citationUrl) => ({
|
|
501
|
+
title: safeHostname(citationUrl),
|
|
502
|
+
url: citationUrl,
|
|
503
|
+
snippet: content.slice(0, 500),
|
|
504
|
+
}));
|
|
505
|
+
const results = citationResults.length > 0
|
|
506
|
+
? citationResults
|
|
507
|
+
: [{ title: query, url: "", snippet: content }];
|
|
508
|
+
return {
|
|
509
|
+
ok: response.ok,
|
|
510
|
+
message: response.ok ? "Search results (grok)" : `Grok search failed (${response.status})`,
|
|
511
|
+
data: { provider: "grok", query, results },
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
catch (err) {
|
|
515
|
+
return {
|
|
516
|
+
ok: false,
|
|
517
|
+
message: `Grok search failed: ${extractErrorMessage(err)}`,
|
|
518
|
+
data: { provider: "grok", query, results: [] },
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
async function searchGemini(guard, query, limit, apiKey) {
|
|
523
|
+
const model = process.env["GEMINI_MODEL"]?.trim() || DEFAULT_GEMINI_MODEL;
|
|
524
|
+
try {
|
|
525
|
+
const endpoint = `https://generativelanguage.googleapis.com/v1beta/models/${encodeURIComponent(model)}:generateContent?key=${encodeURIComponent(apiKey)}`;
|
|
526
|
+
const url = guard.validate(endpoint);
|
|
527
|
+
const response = await fetch(url, {
|
|
528
|
+
method: "POST",
|
|
529
|
+
headers: { "content-type": "application/json" },
|
|
530
|
+
body: JSON.stringify({
|
|
531
|
+
contents: [{ parts: [{ text: query }] }],
|
|
532
|
+
tools: [{ google_search: {} }],
|
|
533
|
+
}),
|
|
534
|
+
});
|
|
535
|
+
const data = await response.json();
|
|
536
|
+
const candidate = data.candidates?.[0];
|
|
537
|
+
const content = (candidate?.content?.parts ?? [])
|
|
538
|
+
.map((part) => part.text ?? "")
|
|
539
|
+
.join("\n")
|
|
540
|
+
.trim();
|
|
541
|
+
const grounded = (candidate?.groundingMetadata?.groundingChunks ?? [])
|
|
542
|
+
.map((chunk) => chunk.web)
|
|
543
|
+
.filter((web) => Boolean(web && web.uri))
|
|
544
|
+
.slice(0, limit)
|
|
545
|
+
.map((web) => ({
|
|
546
|
+
title: web.title ?? safeHostname(web.uri ?? ""),
|
|
547
|
+
url: web.uri ?? "",
|
|
548
|
+
snippet: content.slice(0, 500),
|
|
549
|
+
}));
|
|
550
|
+
const results = grounded.length > 0
|
|
551
|
+
? grounded
|
|
552
|
+
: [{ title: query, url: "", snippet: content }];
|
|
553
|
+
return {
|
|
554
|
+
ok: response.ok,
|
|
555
|
+
message: response.ok ? "Search results (gemini)" : `Gemini search failed (${response.status})`,
|
|
556
|
+
data: { provider: "gemini", query, results },
|
|
557
|
+
};
|
|
558
|
+
}
|
|
559
|
+
catch (err) {
|
|
560
|
+
return {
|
|
561
|
+
ok: false,
|
|
562
|
+
message: `Gemini search failed: ${extractErrorMessage(err)}`,
|
|
563
|
+
data: { provider: "gemini", query, results: [] },
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
async function searchKimi(guard, query, limit, apiKey) {
|
|
568
|
+
const baseUrl = process.env["KIMI_BASE_URL"]?.trim() || DEFAULT_KIMI_BASE_URL;
|
|
569
|
+
const model = process.env["KIMI_MODEL"]?.trim() || DEFAULT_KIMI_MODEL;
|
|
570
|
+
const endpoint = `${baseUrl.replace(/\/+$/, "")}/chat/completions`;
|
|
571
|
+
try {
|
|
572
|
+
const url = guard.validate(endpoint);
|
|
573
|
+
const response = await fetch(url, {
|
|
574
|
+
method: "POST",
|
|
575
|
+
headers: {
|
|
576
|
+
"content-type": "application/json",
|
|
577
|
+
authorization: `Bearer ${apiKey}`,
|
|
578
|
+
},
|
|
579
|
+
body: JSON.stringify({
|
|
580
|
+
model,
|
|
581
|
+
messages: [{ role: "user", content: query }],
|
|
582
|
+
tools: [{ type: "builtin_function", function: { name: "$web_search" } }],
|
|
583
|
+
tool_choice: "auto",
|
|
584
|
+
}),
|
|
585
|
+
});
|
|
586
|
+
const data = await response.json();
|
|
587
|
+
const results = (data.search_results ?? [])
|
|
588
|
+
.slice(0, limit)
|
|
589
|
+
.map((entry) => ({
|
|
590
|
+
title: entry.title ?? safeHostname(entry.url ?? ""),
|
|
591
|
+
url: entry.url ?? "",
|
|
592
|
+
snippet: entry.content ?? "",
|
|
593
|
+
}))
|
|
594
|
+
.filter((entry) => entry.title || entry.url || entry.snippet);
|
|
595
|
+
if (results.length === 0) {
|
|
596
|
+
results.push({
|
|
597
|
+
title: query,
|
|
598
|
+
url: "",
|
|
599
|
+
snippet: data.choices?.[0]?.message?.content ?? "",
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
return {
|
|
603
|
+
ok: response.ok,
|
|
604
|
+
message: response.ok ? "Search results (kimi)" : `Kimi search failed (${response.status})`,
|
|
605
|
+
data: { provider: "kimi", query, results },
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
catch (err) {
|
|
609
|
+
return {
|
|
610
|
+
ok: false,
|
|
611
|
+
message: `Kimi search failed: ${extractErrorMessage(err)}`,
|
|
612
|
+
data: { provider: "kimi", query, results: [] },
|
|
613
|
+
};
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
function safeHostname(url) {
|
|
617
|
+
try {
|
|
618
|
+
return new URL(url).hostname;
|
|
619
|
+
}
|
|
620
|
+
catch {
|
|
621
|
+
return url || "source";
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
function extractOpenAIWebSearchResults(data, query, limit) {
|
|
625
|
+
const contentBlocks = (data.output ?? []).flatMap((entry) => entry.content ?? []);
|
|
626
|
+
const summary = normalizeText(data.output_text
|
|
627
|
+
|| contentBlocks
|
|
628
|
+
.filter((block) => block.type === "output_text" && typeof block.text === "string")
|
|
629
|
+
.map((block) => block.text ?? "")
|
|
630
|
+
.join("\n"));
|
|
631
|
+
const sourceMap = new Map();
|
|
632
|
+
const push = (source) => {
|
|
633
|
+
const url = source.url?.trim() ?? "";
|
|
634
|
+
if (!url || sourceMap.has(url))
|
|
635
|
+
return;
|
|
636
|
+
sourceMap.set(url, {
|
|
637
|
+
title: source.title?.trim() || safeHostname(url),
|
|
638
|
+
url,
|
|
639
|
+
snippet: summary.slice(0, 500),
|
|
640
|
+
});
|
|
641
|
+
};
|
|
642
|
+
for (const entry of data.output ?? []) {
|
|
643
|
+
for (const source of entry.action?.sources ?? [])
|
|
644
|
+
push(source);
|
|
645
|
+
}
|
|
646
|
+
for (const block of contentBlocks) {
|
|
647
|
+
for (const annotation of block.annotations ?? []) {
|
|
648
|
+
if (annotation.type === "url_citation") {
|
|
649
|
+
push(annotation);
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
const results = Array.from(sourceMap.values()).slice(0, limit);
|
|
654
|
+
if (results.length === 0) {
|
|
655
|
+
results.push({
|
|
656
|
+
title: query,
|
|
657
|
+
url: "",
|
|
658
|
+
snippet: summary || "OpenAI web_search returned no citation URLs.",
|
|
659
|
+
});
|
|
660
|
+
}
|
|
661
|
+
return { results, summary };
|
|
662
|
+
}
|
|
663
|
+
function normalizeText(value) {
|
|
664
|
+
return value.replace(/\s+/g, " ").trim();
|
|
665
|
+
}
|
|
666
|
+
function extractErrorMessage(err) {
|
|
667
|
+
if (err instanceof Error)
|
|
668
|
+
return err.message;
|
|
669
|
+
return String(err);
|
|
670
|
+
}
|
|
671
|
+
function isTlsFailure(err) {
|
|
672
|
+
const msg = extractErrorMessage(err).toLowerCase();
|
|
673
|
+
return (msg.includes("certificate") ||
|
|
674
|
+
msg.includes("self signed") ||
|
|
675
|
+
msg.includes("unable to get local issuer certificate") ||
|
|
676
|
+
msg.includes("tls"));
|
|
677
|
+
}
|
|
678
|
+
async function fetchWithTlsFallback(url, init, allowInsecureTls) {
|
|
679
|
+
try {
|
|
680
|
+
const response = await fetch(url, init);
|
|
681
|
+
return { response, insecureTlsUsed: false };
|
|
682
|
+
}
|
|
683
|
+
catch (err) {
|
|
684
|
+
if (!allowInsecureTls || !isTlsFailure(err))
|
|
685
|
+
throw err;
|
|
686
|
+
const retryInit = {
|
|
687
|
+
...init,
|
|
688
|
+
tls: { rejectUnauthorized: false },
|
|
689
|
+
};
|
|
690
|
+
const response = await fetch(url, retryInit);
|
|
691
|
+
return { response, insecureTlsUsed: true };
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
export function createBrowserSandboxStartTool(sandboxManager = new SandboxManager()) {
|
|
695
|
+
return {
|
|
696
|
+
name: "browser.sandbox.start",
|
|
697
|
+
description: "Start Chromium sandbox container with noVNC access",
|
|
698
|
+
tier: "standard",
|
|
699
|
+
category: "browser",
|
|
700
|
+
source: "builtin",
|
|
701
|
+
parameters: {
|
|
702
|
+
type: "object",
|
|
703
|
+
properties: {
|
|
704
|
+
novncPort: { type: "number", description: "Host noVNC port (default 6080)" },
|
|
705
|
+
vncPort: { type: "number", description: "Host VNC port (default 5900)" },
|
|
706
|
+
mountMode: { type: "string", description: "Workspace mount mode: none, read-only, read-write" },
|
|
707
|
+
},
|
|
708
|
+
required: [],
|
|
709
|
+
},
|
|
710
|
+
async execute(input, context) {
|
|
711
|
+
const result = await sandboxManager.startBrowserSandbox({
|
|
712
|
+
workspaceRoot: context.workspaceRoot,
|
|
713
|
+
novncPort: input.novncPort,
|
|
714
|
+
vncPort: input.vncPort,
|
|
715
|
+
mountMode: input.mountMode ?? "read-only",
|
|
716
|
+
});
|
|
717
|
+
return {
|
|
718
|
+
ok: true,
|
|
719
|
+
message: "Sandbox browser started",
|
|
720
|
+
data: result,
|
|
721
|
+
};
|
|
722
|
+
},
|
|
723
|
+
};
|
|
724
|
+
}
|
|
725
|
+
//# sourceMappingURL=browser-tools.js.map
|