@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,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight token estimation — no external tokenizer dependency.
|
|
3
|
+
*
|
|
4
|
+
* Uses a char/token ratio of ~3.7 (empirically close to GPT-4 BPE for
|
|
5
|
+
* mixed English text + code). JSON overhead is slightly higher (~4.0)
|
|
6
|
+
* so we use that for structured payloads.
|
|
7
|
+
*/
|
|
8
|
+
const TEXT_CHARS_PER_TOKEN = 3.7;
|
|
9
|
+
const JSON_CHARS_PER_TOKEN = 4.0;
|
|
10
|
+
/** Estimate tokens for a plain-text string. */
|
|
11
|
+
export function estimateTokens(text) {
|
|
12
|
+
if (!text)
|
|
13
|
+
return 0;
|
|
14
|
+
return Math.ceil(text.length / TEXT_CHARS_PER_TOKEN);
|
|
15
|
+
}
|
|
16
|
+
/** Estimate tokens for a JSON-stringified payload. */
|
|
17
|
+
export function estimateJsonTokens(obj) {
|
|
18
|
+
const json = typeof obj === "string" ? obj : JSON.stringify(obj);
|
|
19
|
+
return Math.ceil(json.length / JSON_CHARS_PER_TOKEN);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Per-message overhead: ~4 tokens for role/formatting delimiters
|
|
23
|
+
* (matches OpenAI's documented `tokens_per_message` for gpt-4).
|
|
24
|
+
*/
|
|
25
|
+
const TOKENS_PER_MESSAGE = 4;
|
|
26
|
+
/** Estimate token cost of a single chat message. */
|
|
27
|
+
export function estimateMessageTokens(msg) {
|
|
28
|
+
let tokens = TOKENS_PER_MESSAGE;
|
|
29
|
+
tokens += estimateTokens(msg.content);
|
|
30
|
+
if (msg.name)
|
|
31
|
+
tokens += estimateTokens(msg.name);
|
|
32
|
+
if (msg.tool_call_id)
|
|
33
|
+
tokens += estimateTokens(msg.tool_call_id);
|
|
34
|
+
if (msg.tool_calls) {
|
|
35
|
+
// Tool calls are JSON-heavy
|
|
36
|
+
tokens += estimateJsonTokens(msg.tool_calls);
|
|
37
|
+
}
|
|
38
|
+
return tokens;
|
|
39
|
+
}
|
|
40
|
+
/** Estimate total token cost of a message array. */
|
|
41
|
+
export function estimateHistoryTokens(messages) {
|
|
42
|
+
let total = 3; // every request has ~3 priming tokens
|
|
43
|
+
for (const msg of messages) {
|
|
44
|
+
total += estimateMessageTokens(msg);
|
|
45
|
+
}
|
|
46
|
+
return total;
|
|
47
|
+
}
|
|
48
|
+
/** Estimate token cost of tool schemas. */
|
|
49
|
+
export function estimateToolSchemaTokens(schemas) {
|
|
50
|
+
if (!schemas.length)
|
|
51
|
+
return 0;
|
|
52
|
+
// Tool schemas get ~16 base + 8 per tool + schema content
|
|
53
|
+
let tokens = 16;
|
|
54
|
+
for (const schema of schemas) {
|
|
55
|
+
tokens += 8 + estimateJsonTokens(schema);
|
|
56
|
+
}
|
|
57
|
+
// Apply 1.1× safety margin (same as Copilot)
|
|
58
|
+
return Math.ceil(tokens * 1.1);
|
|
59
|
+
}
|
|
60
|
+
/** Compute context usage breakdown from current state. */
|
|
61
|
+
export function computeContextUsage(messages, toolSchemas, contextWindow) {
|
|
62
|
+
let system = 0;
|
|
63
|
+
let history = 0;
|
|
64
|
+
let toolResults = 0;
|
|
65
|
+
for (const msg of messages) {
|
|
66
|
+
const cost = estimateMessageTokens(msg);
|
|
67
|
+
if (msg.role === "system") {
|
|
68
|
+
system += cost;
|
|
69
|
+
}
|
|
70
|
+
else if (msg.role === "tool") {
|
|
71
|
+
toolResults += cost;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
history += cost;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const tools = estimateToolSchemaTokens(toolSchemas);
|
|
78
|
+
const total = system + history + toolResults + tools;
|
|
79
|
+
const ratio = contextWindow > 0 ? Math.min(total / contextWindow, 1.0) : 0;
|
|
80
|
+
return { system, history, toolResults, tools, total, limit: contextWindow, ratio };
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=token-estimator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-estimator.js","sourceRoot":"","sources":["../../src/tools/token-estimator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical tool name constants.
|
|
3
|
+
*
|
|
4
|
+
* Using a const object instead of an enum for zero-cost at runtime
|
|
5
|
+
* (enums generate a reverse-mapping object; const objects are erased).
|
|
6
|
+
*
|
|
7
|
+
* Borrowed from VS Code Copilot Chat's ToolName enum — prevents string
|
|
8
|
+
* typo bugs and enables IDE autocomplete for tool references.
|
|
9
|
+
*/
|
|
10
|
+
export declare const ToolName: {
|
|
11
|
+
readonly TerminalRun: "terminal.run";
|
|
12
|
+
readonly TerminalStream: "terminal.stream";
|
|
13
|
+
readonly FileRead: "file.read";
|
|
14
|
+
readonly FileWrite: "file.write";
|
|
15
|
+
readonly FilePatch: "file.patch";
|
|
16
|
+
readonly FileList: "file.list";
|
|
17
|
+
readonly FileStat: "file.stat";
|
|
18
|
+
readonly OsQuery: "os.query";
|
|
19
|
+
readonly OsInstall: "os.install";
|
|
20
|
+
readonly OsTool: "os.tool";
|
|
21
|
+
readonly OsToolAlt: "os_tool";
|
|
22
|
+
readonly SurfacesList: "surfaces.list";
|
|
23
|
+
readonly SurfacesStart: "surfaces.start";
|
|
24
|
+
readonly SurfacesStop: "surfaces.stop";
|
|
25
|
+
readonly CronAdd: "cron.add";
|
|
26
|
+
readonly CronList: "cron.list";
|
|
27
|
+
readonly CronRemove: "cron.remove";
|
|
28
|
+
readonly CronUpdate: "cron.update";
|
|
29
|
+
readonly GatewayStatus: "gateway.status";
|
|
30
|
+
readonly ScreenShare: "screen.share";
|
|
31
|
+
readonly ScreenCapture: "screen.capture";
|
|
32
|
+
readonly ScreenRecord: "screen.record";
|
|
33
|
+
readonly BrowserNavigate: "browser.navigate";
|
|
34
|
+
readonly BrowserSnapshot: "browser.snapshot";
|
|
35
|
+
readonly BrowserClick: "browser.click";
|
|
36
|
+
readonly BrowserType: "browser.type";
|
|
37
|
+
readonly BrowserSelect: "browser.select";
|
|
38
|
+
readonly BrowserScroll: "browser.scroll";
|
|
39
|
+
readonly BrowserWait: "browser.wait";
|
|
40
|
+
readonly BrowserScreenshot: "browser.screenshot";
|
|
41
|
+
readonly BrowserSandboxStart: "browser.sandbox.start";
|
|
42
|
+
readonly WebFetch: "web.fetch";
|
|
43
|
+
readonly WebSearch: "web.search";
|
|
44
|
+
readonly MemorySave: "memory.save";
|
|
45
|
+
readonly MemorySearch: "memory.search";
|
|
46
|
+
readonly MemoryForget: "memory.forget";
|
|
47
|
+
readonly VoiceSpeak: "voice.speak";
|
|
48
|
+
readonly AgentSpawn: "agent.spawn";
|
|
49
|
+
readonly ThreadControl: "thread.control";
|
|
50
|
+
readonly ToolsList: "tools.list";
|
|
51
|
+
readonly ToolsSearch: "tools.search";
|
|
52
|
+
readonly NetworkScan: "network.scan";
|
|
53
|
+
readonly CoreRead: "read";
|
|
54
|
+
readonly CoreEdit: "edit";
|
|
55
|
+
readonly CoreExecute: "execute";
|
|
56
|
+
readonly CoreSearch: "search";
|
|
57
|
+
readonly CoreWeb: "web";
|
|
58
|
+
readonly CoreAgent: "agent";
|
|
59
|
+
readonly CoreTodo: "todo";
|
|
60
|
+
readonly CoreJait: "jait";
|
|
61
|
+
};
|
|
62
|
+
/** Union of all known tool name values. */
|
|
63
|
+
export type ToolNameValue = (typeof ToolName)[keyof typeof ToolName];
|
|
64
|
+
//# sourceMappingURL=tool-names.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-names.d.ts","sourceRoot":"","sources":["../../src/tools/tool-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8EX,CAAC;AAEX,2CAA2C;AAC3C,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical tool name constants.
|
|
3
|
+
*
|
|
4
|
+
* Using a const object instead of an enum for zero-cost at runtime
|
|
5
|
+
* (enums generate a reverse-mapping object; const objects are erased).
|
|
6
|
+
*
|
|
7
|
+
* Borrowed from VS Code Copilot Chat's ToolName enum — prevents string
|
|
8
|
+
* typo bugs and enables IDE autocomplete for tool references.
|
|
9
|
+
*/
|
|
10
|
+
export const ToolName = {
|
|
11
|
+
// ── Terminal ──
|
|
12
|
+
TerminalRun: "terminal.run",
|
|
13
|
+
TerminalStream: "terminal.stream",
|
|
14
|
+
// ── File system ──
|
|
15
|
+
FileRead: "file.read",
|
|
16
|
+
FileWrite: "file.write",
|
|
17
|
+
FilePatch: "file.patch",
|
|
18
|
+
FileList: "file.list",
|
|
19
|
+
FileStat: "file.stat",
|
|
20
|
+
// ── OS ──
|
|
21
|
+
OsQuery: "os.query",
|
|
22
|
+
OsInstall: "os.install",
|
|
23
|
+
OsTool: "os.tool",
|
|
24
|
+
OsToolAlt: "os_tool",
|
|
25
|
+
// ── Surfaces ──
|
|
26
|
+
SurfacesList: "surfaces.list",
|
|
27
|
+
SurfacesStart: "surfaces.start",
|
|
28
|
+
SurfacesStop: "surfaces.stop",
|
|
29
|
+
// ── Scheduler / cron ──
|
|
30
|
+
CronAdd: "cron.add",
|
|
31
|
+
CronList: "cron.list",
|
|
32
|
+
CronRemove: "cron.remove",
|
|
33
|
+
CronUpdate: "cron.update",
|
|
34
|
+
// ── Gateway ──
|
|
35
|
+
GatewayStatus: "gateway.status",
|
|
36
|
+
// ── Screen share ──
|
|
37
|
+
ScreenShare: "screen.share",
|
|
38
|
+
ScreenCapture: "screen.capture",
|
|
39
|
+
ScreenRecord: "screen.record",
|
|
40
|
+
// ── Browser & web ──
|
|
41
|
+
BrowserNavigate: "browser.navigate",
|
|
42
|
+
BrowserSnapshot: "browser.snapshot",
|
|
43
|
+
BrowserClick: "browser.click",
|
|
44
|
+
BrowserType: "browser.type",
|
|
45
|
+
BrowserSelect: "browser.select",
|
|
46
|
+
BrowserScroll: "browser.scroll",
|
|
47
|
+
BrowserWait: "browser.wait",
|
|
48
|
+
BrowserScreenshot: "browser.screenshot",
|
|
49
|
+
BrowserSandboxStart: "browser.sandbox.start",
|
|
50
|
+
WebFetch: "web.fetch",
|
|
51
|
+
WebSearch: "web.search",
|
|
52
|
+
// ── Memory ──
|
|
53
|
+
MemorySave: "memory.save",
|
|
54
|
+
MemorySearch: "memory.search",
|
|
55
|
+
MemoryForget: "memory.forget",
|
|
56
|
+
// ── Voice ──
|
|
57
|
+
VoiceSpeak: "voice.speak",
|
|
58
|
+
// ── Agent ──
|
|
59
|
+
AgentSpawn: "agent.spawn",
|
|
60
|
+
ThreadControl: "thread.control",
|
|
61
|
+
// ── Meta (tool discovery) ──
|
|
62
|
+
ToolsList: "tools.list",
|
|
63
|
+
ToolsSearch: "tools.search",
|
|
64
|
+
// ── Network ──
|
|
65
|
+
NetworkScan: "network.scan",
|
|
66
|
+
// ── Core tools (simplified set) ──
|
|
67
|
+
CoreRead: "read",
|
|
68
|
+
CoreEdit: "edit",
|
|
69
|
+
CoreExecute: "execute",
|
|
70
|
+
CoreSearch: "search",
|
|
71
|
+
CoreWeb: "web",
|
|
72
|
+
CoreAgent: "agent",
|
|
73
|
+
CoreTodo: "todo",
|
|
74
|
+
CoreJait: "jait",
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=tool-names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-names.js","sourceRoot":"","sources":["../../src/tools/tool-names.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,iBAAiB;IACjB,WAAW,EAAE,cAAc;IAC3B,cAAc,EAAE,iBAAiB;IAEjC,oBAAoB;IACpB,QAAQ,EAAE,WAAW;IACrB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;IACvB,QAAQ,EAAE,WAAW;IACrB,QAAQ,EAAE,WAAW;IAErB,WAAW;IACX,OAAO,EAAE,UAAU;IACnB,SAAS,EAAE,YAAY;IACvB,MAAM,EAAE,SAAS;IACjB,SAAS,EAAE,SAAS;IAEpB,iBAAiB;IACjB,YAAY,EAAE,eAAe;IAC7B,aAAa,EAAE,gBAAgB;IAC/B,YAAY,EAAE,eAAe;IAE7B,yBAAyB;IACzB,OAAO,EAAE,UAAU;IACnB,QAAQ,EAAE,WAAW;IACrB,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,aAAa;IAEzB,gBAAgB;IAChB,aAAa,EAAE,gBAAgB;IAE/B,qBAAqB;IACrB,WAAW,EAAE,cAAc;IAC3B,aAAa,EAAE,gBAAgB;IAC/B,YAAY,EAAE,eAAe;IAE7B,sBAAsB;IACtB,eAAe,EAAE,kBAAkB;IACnC,eAAe,EAAE,kBAAkB;IACnC,YAAY,EAAE,eAAe;IAC7B,WAAW,EAAE,cAAc;IAC3B,aAAa,EAAE,gBAAgB;IAC/B,aAAa,EAAE,gBAAgB;IAC/B,WAAW,EAAE,cAAc;IAC3B,iBAAiB,EAAE,oBAAoB;IACvC,mBAAmB,EAAE,uBAAuB;IAC5C,QAAQ,EAAE,WAAW;IACrB,SAAS,EAAE,YAAY;IAEvB,eAAe;IACf,UAAU,EAAE,aAAa;IACzB,YAAY,EAAE,eAAe;IAC7B,YAAY,EAAE,eAAe;IAE7B,cAAc;IACd,UAAU,EAAE,aAAa;IAEzB,cAAc;IACd,UAAU,EAAE,aAAa;IACzB,aAAa,EAAE,gBAAgB;IAE/B,8BAA8B;IAC9B,SAAS,EAAE,YAAY;IACvB,WAAW,EAAE,cAAc;IAE3B,gBAAgB;IAChB,WAAW,EAAE,cAAc;IAE3B,oCAAoC;IACpC,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;IAChB,WAAW,EAAE,SAAS;IACtB,UAAU,EAAE,QAAQ;IACpB,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,OAAO;IAClB,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,MAAM;CACR,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight JSON Schema validator for tool input parameters.
|
|
3
|
+
*
|
|
4
|
+
* Handles only the subset of JSON Schema used by ToolParametersSchema:
|
|
5
|
+
* - `type: "object"` with `properties` and `required`
|
|
6
|
+
* - Property types: string, number, boolean, array, object
|
|
7
|
+
* - `enum` constraints
|
|
8
|
+
*
|
|
9
|
+
* This is intentionally minimal — ~60 lines vs Ajv's 124 KB.
|
|
10
|
+
* For our use-case (validating LLM-generated tool arguments), it's
|
|
11
|
+
* 5-10× faster than Ajv because there's no schema compilation step.
|
|
12
|
+
*/
|
|
13
|
+
import type { ToolParametersSchema } from "./contracts.js";
|
|
14
|
+
export interface ValidationResult {
|
|
15
|
+
valid: boolean;
|
|
16
|
+
errors: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Validate an input value against a ToolParametersSchema.
|
|
20
|
+
*
|
|
21
|
+
* If `input` is nullish, it's treated as `{}` (matching Ajv behaviour
|
|
22
|
+
* for schemas that only have optional properties).
|
|
23
|
+
*
|
|
24
|
+
* Returns `{ valid: true, errors: [] }` on success.
|
|
25
|
+
*/
|
|
26
|
+
export declare function validateToolInput(schema: ToolParametersSchema, input: unknown): ValidationResult;
|
|
27
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/tools/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAWD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,oBAAoB,EAC5B,KAAK,EAAE,OAAO,GACb,gBAAgB,CA2ElB"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight JSON Schema validator for tool input parameters.
|
|
3
|
+
*
|
|
4
|
+
* Handles only the subset of JSON Schema used by ToolParametersSchema:
|
|
5
|
+
* - `type: "object"` with `properties` and `required`
|
|
6
|
+
* - Property types: string, number, boolean, array, object
|
|
7
|
+
* - `enum` constraints
|
|
8
|
+
*
|
|
9
|
+
* This is intentionally minimal — ~60 lines vs Ajv's 124 KB.
|
|
10
|
+
* For our use-case (validating LLM-generated tool arguments), it's
|
|
11
|
+
* 5-10× faster than Ajv because there's no schema compilation step.
|
|
12
|
+
*/
|
|
13
|
+
const TYPE_CHECKS = {
|
|
14
|
+
string: (v) => typeof v === "string",
|
|
15
|
+
number: (v) => typeof v === "number",
|
|
16
|
+
integer: (v) => typeof v === "number" && Number.isInteger(v),
|
|
17
|
+
boolean: (v) => typeof v === "boolean",
|
|
18
|
+
array: (v) => Array.isArray(v),
|
|
19
|
+
object: (v) => typeof v === "object" && v !== null && !Array.isArray(v),
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Validate an input value against a ToolParametersSchema.
|
|
23
|
+
*
|
|
24
|
+
* If `input` is nullish, it's treated as `{}` (matching Ajv behaviour
|
|
25
|
+
* for schemas that only have optional properties).
|
|
26
|
+
*
|
|
27
|
+
* Returns `{ valid: true, errors: [] }` on success.
|
|
28
|
+
*/
|
|
29
|
+
export function validateToolInput(schema, input) {
|
|
30
|
+
const errors = [];
|
|
31
|
+
const obj = (input ?? {});
|
|
32
|
+
if (typeof obj !== "object" || obj === null || Array.isArray(obj)) {
|
|
33
|
+
return { valid: false, errors: ["Input must be an object"] };
|
|
34
|
+
}
|
|
35
|
+
// Required fields
|
|
36
|
+
if (schema.required) {
|
|
37
|
+
for (const key of schema.required) {
|
|
38
|
+
if (!(key in obj) || obj[key] === undefined) {
|
|
39
|
+
errors.push(`Missing required property: ${key}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Property type + enum checks
|
|
44
|
+
for (const [key, propSchema] of Object.entries(schema.properties)) {
|
|
45
|
+
const value = obj[key];
|
|
46
|
+
if (value === undefined || value === null)
|
|
47
|
+
continue; // skip optional absent
|
|
48
|
+
// Type check (with coercion attempt for strings→numbers from LLM)
|
|
49
|
+
const checker = TYPE_CHECKS[propSchema.type];
|
|
50
|
+
if (checker && !checker(value)) {
|
|
51
|
+
// Try coercing string→number if the schema expects a number
|
|
52
|
+
if ((propSchema.type === "number" || propSchema.type === "integer") &&
|
|
53
|
+
typeof value === "string") {
|
|
54
|
+
const num = Number(value);
|
|
55
|
+
if (!Number.isNaN(num)) {
|
|
56
|
+
obj[key] = num;
|
|
57
|
+
// Re-check integer constraint
|
|
58
|
+
if (propSchema.type === "integer" && !Number.isInteger(num)) {
|
|
59
|
+
errors.push(`Property '${key}' must be an integer, got ${num}`);
|
|
60
|
+
}
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Try coercing string→boolean
|
|
65
|
+
if (propSchema.type === "boolean" && typeof value === "string") {
|
|
66
|
+
if (value === "true") {
|
|
67
|
+
obj[key] = true;
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (value === "false") {
|
|
71
|
+
obj[key] = false;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Try parsing JSON string→object/array
|
|
76
|
+
if ((propSchema.type === "object" || propSchema.type === "array") &&
|
|
77
|
+
typeof value === "string") {
|
|
78
|
+
try {
|
|
79
|
+
const parsed = JSON.parse(value);
|
|
80
|
+
if (checker(parsed)) {
|
|
81
|
+
obj[key] = parsed;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch { /* not valid JSON, fall through */ }
|
|
86
|
+
}
|
|
87
|
+
errors.push(`Property '${key}' expected type '${propSchema.type}', got '${typeof value}'`);
|
|
88
|
+
}
|
|
89
|
+
// Enum check
|
|
90
|
+
if (propSchema.enum && propSchema.enum.length > 0) {
|
|
91
|
+
const current = obj[key]; // may have been coerced
|
|
92
|
+
if (!propSchema.enum.includes(String(current))) {
|
|
93
|
+
errors.push(`Property '${key}' must be one of [${propSchema.enum.join(", ")}], got '${current}'`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return { valid: errors.length === 0, errors };
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/tools/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToolDefinition } from "./contracts.js";
|
|
2
|
+
import type { VoiceService } from "../voice/service.js";
|
|
3
|
+
interface SpeakInput {
|
|
4
|
+
text: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function createVoiceSpeakTool(voiceService: VoiceService): ToolDefinition<SpeakInput>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=voice-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-tools.d.ts","sourceRoot":"","sources":["../../src/tools/voice-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,YAAY,GAAG,cAAc,CAAC,UAAU,CAAC,CA8B3F"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export function createVoiceSpeakTool(voiceService) {
|
|
2
|
+
return {
|
|
3
|
+
name: "voice.speak",
|
|
4
|
+
description: "Speak text via the configured TTS output",
|
|
5
|
+
tier: "standard",
|
|
6
|
+
category: "voice",
|
|
7
|
+
source: "builtin",
|
|
8
|
+
parameters: {
|
|
9
|
+
type: "object",
|
|
10
|
+
properties: {
|
|
11
|
+
text: { type: "string", description: "Message to speak." },
|
|
12
|
+
},
|
|
13
|
+
required: ["text"],
|
|
14
|
+
},
|
|
15
|
+
async execute(input, context) {
|
|
16
|
+
const text = typeof input?.text === "string" ? input.text.trim() : "";
|
|
17
|
+
if (!text) {
|
|
18
|
+
return { ok: false, message: "text is required" };
|
|
19
|
+
}
|
|
20
|
+
const spoken = voiceService.speak({ sessionId: context.sessionId, text });
|
|
21
|
+
return {
|
|
22
|
+
ok: true,
|
|
23
|
+
message: "Spoken",
|
|
24
|
+
data: {
|
|
25
|
+
mimeType: spoken.mimeType,
|
|
26
|
+
bytes: spoken.audioBase64.length,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=voice-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voice-tools.js","sourceRoot":"","sources":["../../src/tools/voice-tools.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,oBAAoB,CAAC,YAA0B;IAC7D,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,0CAA0C;QACvD,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE;aAC3D;YACD,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO;YAC1B,MAAM,IAAI,GAAG,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,CAAC;YACpD,CAAC;YACD,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1E,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,OAAO,EAAE,QAAQ;gBACjB,IAAI,EAAE;oBACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ;oBACzB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM;iBACjC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ConsentManager } from "../security/consent-manager.js";
|
|
2
|
+
export interface VoiceState {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
wakeWordEnabled: boolean;
|
|
5
|
+
talkModeEnabled: boolean;
|
|
6
|
+
listening: boolean;
|
|
7
|
+
lastTranscriptAt?: string;
|
|
8
|
+
lastSpokenAt?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface TranscriptionResult {
|
|
11
|
+
text: string;
|
|
12
|
+
wakeWordDetected: boolean;
|
|
13
|
+
sentToAgent: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare class VoiceService {
|
|
16
|
+
private readonly bySession;
|
|
17
|
+
getState(sessionId: string): VoiceState;
|
|
18
|
+
updateState(sessionId: string, patch: Partial<Omit<VoiceState, "sessionId">>): VoiceState;
|
|
19
|
+
transcribe(input: {
|
|
20
|
+
transcript?: string;
|
|
21
|
+
audioBase64?: string;
|
|
22
|
+
sessionId: string;
|
|
23
|
+
}): TranscriptionResult;
|
|
24
|
+
speak(input: {
|
|
25
|
+
sessionId: string;
|
|
26
|
+
text: string;
|
|
27
|
+
}): {
|
|
28
|
+
ok: true;
|
|
29
|
+
audioBase64: string;
|
|
30
|
+
mimeType: string;
|
|
31
|
+
};
|
|
32
|
+
resolveConsentFromUtterance(consentManager: ConsentManager, input: {
|
|
33
|
+
text: string;
|
|
34
|
+
sessionId?: string;
|
|
35
|
+
}): {
|
|
36
|
+
handled: boolean;
|
|
37
|
+
approved?: boolean;
|
|
38
|
+
requestId?: string;
|
|
39
|
+
};
|
|
40
|
+
private decodeAudioAsText;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/voice/service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAE3D,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU;IAavC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,GAAG,UAAU;IAOzF,UAAU,CAAC,KAAK,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,mBAAmB;IAoBxG,KAAK,CAAC,KAAK,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAStG,2BAA2B,CACzB,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1C;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAoB/D,OAAO,CAAC,iBAAiB;CAQ1B"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
export class VoiceService {
|
|
2
|
+
bySession = new Map();
|
|
3
|
+
getState(sessionId) {
|
|
4
|
+
const existing = this.bySession.get(sessionId);
|
|
5
|
+
if (existing)
|
|
6
|
+
return existing;
|
|
7
|
+
const created = {
|
|
8
|
+
sessionId,
|
|
9
|
+
wakeWordEnabled: true,
|
|
10
|
+
talkModeEnabled: false,
|
|
11
|
+
listening: false,
|
|
12
|
+
};
|
|
13
|
+
this.bySession.set(sessionId, created);
|
|
14
|
+
return created;
|
|
15
|
+
}
|
|
16
|
+
updateState(sessionId, patch) {
|
|
17
|
+
const current = this.getState(sessionId);
|
|
18
|
+
const next = { ...current, ...patch, sessionId };
|
|
19
|
+
this.bySession.set(sessionId, next);
|
|
20
|
+
return next;
|
|
21
|
+
}
|
|
22
|
+
transcribe(input) {
|
|
23
|
+
const text = (input.transcript ?? this.decodeAudioAsText(input.audioBase64) ?? "").trim();
|
|
24
|
+
const wakeWordDetected = /\bhey\s+jait\b/i.test(text);
|
|
25
|
+
const state = this.getState(input.sessionId);
|
|
26
|
+
if (wakeWordDetected && state.wakeWordEnabled) {
|
|
27
|
+
this.updateState(input.sessionId, { listening: true });
|
|
28
|
+
}
|
|
29
|
+
if (text.length > 0) {
|
|
30
|
+
this.updateState(input.sessionId, { lastTranscriptAt: new Date().toISOString() });
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
text,
|
|
34
|
+
wakeWordDetected,
|
|
35
|
+
sentToAgent: text.length > 0,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
speak(input) {
|
|
39
|
+
this.updateState(input.sessionId, { lastSpokenAt: new Date().toISOString() });
|
|
40
|
+
return {
|
|
41
|
+
ok: true,
|
|
42
|
+
audioBase64: Buffer.from(input.text, "utf8").toString("base64"),
|
|
43
|
+
mimeType: "text/plain;base64",
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
resolveConsentFromUtterance(consentManager, input) {
|
|
47
|
+
const normalized = input.text.trim().toLowerCase();
|
|
48
|
+
const pending = consentManager.listPending(input.sessionId);
|
|
49
|
+
if (pending.length === 0)
|
|
50
|
+
return { handled: false };
|
|
51
|
+
const target = pending[0];
|
|
52
|
+
if (!target)
|
|
53
|
+
return { handled: false };
|
|
54
|
+
if (/^yes\b/.test(normalized)) {
|
|
55
|
+
consentManager.approve(target.id, "voice", input.text);
|
|
56
|
+
return { handled: true, approved: true, requestId: target.id };
|
|
57
|
+
}
|
|
58
|
+
if (/^(no|stop)\b/.test(normalized)) {
|
|
59
|
+
consentManager.reject(target.id, "voice", input.text);
|
|
60
|
+
return { handled: true, approved: false, requestId: target.id };
|
|
61
|
+
}
|
|
62
|
+
return { handled: false };
|
|
63
|
+
}
|
|
64
|
+
decodeAudioAsText(audioBase64) {
|
|
65
|
+
if (!audioBase64)
|
|
66
|
+
return null;
|
|
67
|
+
try {
|
|
68
|
+
return Buffer.from(audioBase64, "base64").toString("utf8");
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/voice/service.ts"],"names":[],"mappings":"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"}
|
package/dist/ws.d.ts
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { WsEvent } from "@jait/shared";
|
|
2
|
+
import type { UICommandPayload } from "@jait/shared";
|
|
3
|
+
import type { ScreenShareSessionState, FsNode, FsBrowseEntry } from "@jait/shared";
|
|
4
|
+
import type { AppConfig } from "./config.js";
|
|
5
|
+
import type { Server as HttpServer } from "node:http";
|
|
6
|
+
export declare class WsControlPlane {
|
|
7
|
+
private config;
|
|
8
|
+
private wss;
|
|
9
|
+
private clients;
|
|
10
|
+
private jwtSecret;
|
|
11
|
+
/** Filesystem nodes registered by clients (keyed by node ID) */
|
|
12
|
+
private fsNodes;
|
|
13
|
+
/** Pending fs browse requests waiting for a response from a remote node */
|
|
14
|
+
private pendingFsBrowse;
|
|
15
|
+
constructor(config: AppConfig);
|
|
16
|
+
/**
|
|
17
|
+
* Attach the WebSocket server to an existing HTTP server (shares port).
|
|
18
|
+
* Falls back to standalone port if no httpServer is provided.
|
|
19
|
+
*/
|
|
20
|
+
start(httpServer?: HttpServer): void;
|
|
21
|
+
private extractBearerToken;
|
|
22
|
+
private authenticateClient;
|
|
23
|
+
private handleMessage;
|
|
24
|
+
/** Send an event to a specific client by ID */
|
|
25
|
+
sendToClient(clientId: string, event: WsEvent): void;
|
|
26
|
+
/** Broadcast an event to all clients subscribed to a session */
|
|
27
|
+
broadcast(sessionId: string, event: WsEvent): void;
|
|
28
|
+
/** Broadcast to all connected clients */
|
|
29
|
+
broadcastAll(event: WsEvent): void;
|
|
30
|
+
/** Send a typed UI command to all clients subscribed to the session (server → frontend) */
|
|
31
|
+
sendUICommand(command: UICommandPayload, sessionId?: string): void;
|
|
32
|
+
/**
|
|
33
|
+
* Broadcast to all clients subscribed to a session, excluding one client.
|
|
34
|
+
* Used to relay state changes to other clients without echoing back to the sender.
|
|
35
|
+
*/
|
|
36
|
+
broadcastExcluding(sessionId: string, excludeClientId: string, event: WsEvent): void;
|
|
37
|
+
/** Send terminal output data to all clients subscribed to this terminal */
|
|
38
|
+
broadcastTerminalOutput(terminalId: string, data: string): void;
|
|
39
|
+
/** Callback for terminal input from WS clients */
|
|
40
|
+
onTerminalInput?: (terminalId: string, data: string) => void;
|
|
41
|
+
/** Callback for terminal resize from WS clients */
|
|
42
|
+
onTerminalResize?: (terminalId: string, cols: number, rows: number) => void;
|
|
43
|
+
/** Callback to replay buffered output when a client subscribes to a terminal */
|
|
44
|
+
onTerminalReplay?: (terminalId: string) => string | null;
|
|
45
|
+
/** Callback for consent approval from WS clients */
|
|
46
|
+
onConsentApprove?: (requestId: string) => void;
|
|
47
|
+
/** Callback for consent rejection from WS clients */
|
|
48
|
+
onConsentReject?: (requestId: string, reason?: string) => void;
|
|
49
|
+
/** Callback when a client updates UI component state (panel open/close) */
|
|
50
|
+
onUIStateUpdate?: (sessionId: string, key: string, value: unknown | null, clientId: string) => void;
|
|
51
|
+
/** Callback when a client subscribes to a session — used to push full state */
|
|
52
|
+
onClientSubscribe?: (sessionId: string, clientId: string) => void;
|
|
53
|
+
/** Callback when a screen-share start is requested via WS */
|
|
54
|
+
onScreenShareStart?: (hostDeviceId: string, viewerDeviceIds?: string[]) => void;
|
|
55
|
+
/** Callback when a screen-share stop is requested via WS */
|
|
56
|
+
onScreenShareStop?: (sessionId: string) => void;
|
|
57
|
+
/** Relay a signaling message to a specific device ID */
|
|
58
|
+
private relayToDevice;
|
|
59
|
+
/** Broadcast a screen-share state update to all connected clients */
|
|
60
|
+
broadcastScreenShareState(state: ScreenShareSessionState): void;
|
|
61
|
+
/**
|
|
62
|
+
* Programmatically send a screen-share start-request to all connected clients.
|
|
63
|
+
* Used by tools/routes when the session is created server-side and the host
|
|
64
|
+
* device needs to be told to begin capture.
|
|
65
|
+
*/
|
|
66
|
+
sendScreenShareStartRequest(sessionId: string, hostDeviceId: string, viewerDeviceIds?: string[]): void;
|
|
67
|
+
/** Find all connected device IDs */
|
|
68
|
+
getConnectedDeviceIds(): string[];
|
|
69
|
+
/** List all registered filesystem nodes */
|
|
70
|
+
getFsNodes(): FsNode[];
|
|
71
|
+
/** Register the gateway itself as a filesystem node */
|
|
72
|
+
registerGatewayFsNode(node: FsNode): void;
|
|
73
|
+
/**
|
|
74
|
+
* Proxy a browse request to a remote filesystem node.
|
|
75
|
+
* Sends a WS message to the owning client and waits for a response.
|
|
76
|
+
*/
|
|
77
|
+
proxyFsBrowse(nodeId: string, path: string): Promise<{
|
|
78
|
+
path: string;
|
|
79
|
+
parent: string | null;
|
|
80
|
+
entries: FsBrowseEntry[];
|
|
81
|
+
}>;
|
|
82
|
+
/**
|
|
83
|
+
* Proxy a roots request to a remote filesystem node.
|
|
84
|
+
*/
|
|
85
|
+
proxyFsRoots(nodeId: string): Promise<FsBrowseEntry[]>;
|
|
86
|
+
get clientCount(): number;
|
|
87
|
+
private send;
|
|
88
|
+
stop(): void;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=ws.d.ts.map
|