orbitx 0.0.8 → 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/Readme.md +227 -67
- package/dist/core/agent-providers.d.ts +16 -0
- package/dist/core/agent-providers.d.ts.map +1 -0
- package/dist/core/agent-providers.js +21 -0
- package/dist/core/agent-providers.js.map +1 -0
- package/dist/core/ai-provider.d.ts +69 -1
- package/dist/core/ai-provider.d.ts.map +1 -1
- package/dist/core/ai-provider.js.map +1 -1
- package/dist/core/base-agent.d.ts +8 -4
- package/dist/core/base-agent.d.ts.map +1 -1
- package/dist/core/base-agent.js +220 -88
- package/dist/core/base-agent.js.map +1 -1
- package/dist/core/deepseek-provider.d.ts +10 -3
- package/dist/core/deepseek-provider.d.ts.map +1 -1
- package/dist/core/deepseek-provider.js +144 -39
- package/dist/core/deepseek-provider.js.map +1 -1
- package/dist/core/image-describer.d.ts +13 -0
- package/dist/core/image-describer.d.ts.map +1 -0
- package/dist/core/image-describer.js +33 -0
- package/dist/core/image-describer.js.map +1 -0
- package/dist/core/mcp-client.d.ts +17 -4
- package/dist/core/mcp-client.d.ts.map +1 -1
- package/dist/core/mcp-client.js +32 -16
- package/dist/core/mcp-client.js.map +1 -1
- package/dist/core/mcp-computer.d.ts +10 -2
- package/dist/core/mcp-computer.d.ts.map +1 -1
- package/dist/core/mcp-computer.js +108 -2
- package/dist/core/mcp-computer.js.map +1 -1
- package/dist/core/mcp-fs-storage.d.ts +9 -0
- package/dist/core/mcp-fs-storage.d.ts.map +1 -0
- package/dist/core/mcp-fs-storage.js +28 -0
- package/dist/core/mcp-fs-storage.js.map +1 -0
- package/dist/core/mcp-rng.d.ts +8 -0
- package/dist/core/mcp-rng.d.ts.map +1 -0
- package/dist/core/mcp-rng.js +15 -0
- package/dist/core/mcp-rng.js.map +1 -0
- package/dist/core/mcp-server.d.ts +8 -4
- package/dist/core/mcp-server.d.ts.map +1 -1
- package/dist/core/mcp-server.js +20 -3
- package/dist/core/mcp-server.js.map +1 -1
- package/dist/core/mcp-storage.d.ts +6 -0
- package/dist/core/mcp-storage.d.ts.map +1 -0
- package/dist/core/mcp-storage.js +4 -0
- package/dist/core/mcp-storage.js.map +1 -0
- package/dist/core/mcp.d.ts +37 -3
- package/dist/core/mcp.d.ts.map +1 -1
- package/dist/core/mcp.js +42 -1
- package/dist/core/mcp.js.map +1 -1
- package/dist/core/ollama-provider.d.ts +10 -3
- package/dist/core/ollama-provider.d.ts.map +1 -1
- package/dist/core/ollama-provider.js +122 -41
- package/dist/core/ollama-provider.js.map +1 -1
- package/dist/core/retry.d.ts +10 -0
- package/dist/core/retry.d.ts.map +1 -0
- package/dist/core/retry.js +39 -0
- package/dist/core/retry.js.map +1 -0
- package/dist/core/skill.d.ts +3 -0
- package/dist/core/skill.d.ts.map +1 -1
- package/dist/core/skill.js.map +1 -1
- package/dist/core/tool-schema-translator.d.ts +10 -0
- package/dist/core/tool-schema-translator.d.ts.map +1 -0
- package/dist/core/tool-schema-translator.js +29 -0
- package/dist/core/tool-schema-translator.js.map +1 -0
- package/dist/index.d.ts +37 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -5
- package/dist/index.js.map +1 -1
- package/dist/sandbox.d.ts +2 -0
- package/dist/sandbox.d.ts.map +1 -0
- package/dist/sandbox.js +27 -0
- package/dist/sandbox.js.map +1 -0
- package/dist/skills/backend-security.d.ts +4 -0
- package/dist/skills/backend-security.d.ts.map +1 -0
- package/dist/skills/backend-security.js +74 -0
- package/dist/skills/backend-security.js.map +1 -0
- package/dist/skills/big-task.d.ts +4 -0
- package/dist/skills/big-task.d.ts.map +1 -0
- package/dist/skills/big-task.js +66 -0
- package/dist/skills/big-task.js.map +1 -0
- package/dist/skills/code-verification.d.ts +4 -0
- package/dist/skills/code-verification.d.ts.map +1 -0
- package/dist/skills/code-verification.js +59 -0
- package/dist/skills/code-verification.js.map +1 -0
- package/dist/skills/long-task-efficiency.d.ts +4 -0
- package/dist/skills/long-task-efficiency.d.ts.map +1 -0
- package/dist/skills/long-task-efficiency.js +50 -0
- package/dist/skills/long-task-efficiency.js.map +1 -0
- package/dist/skills/node-backend.d.ts +4 -0
- package/dist/skills/node-backend.d.ts.map +1 -0
- package/dist/skills/node-backend.js +110 -0
- package/dist/skills/node-backend.js.map +1 -0
- package/dist/skills/planner.d.ts +4 -0
- package/dist/skills/planner.d.ts.map +1 -0
- package/dist/skills/planner.js +49 -0
- package/dist/skills/planner.js.map +1 -0
- package/dist/skills/present.d.ts +4 -0
- package/dist/skills/present.d.ts.map +1 -0
- package/dist/skills/present.js +56 -0
- package/dist/skills/present.js.map +1 -0
- package/dist/skills/question-answer.d.ts +4 -0
- package/dist/skills/question-answer.d.ts.map +1 -0
- package/dist/skills/question-answer.js +55 -0
- package/dist/skills/question-answer.js.map +1 -0
- package/dist/skills/react-frontend.d.ts +4 -0
- package/dist/skills/react-frontend.d.ts.map +1 -0
- package/dist/skills/react-frontend.js +111 -0
- package/dist/skills/react-frontend.js.map +1 -0
- package/dist/skills/research.d.ts +4 -0
- package/dist/skills/research.d.ts.map +1 -0
- package/dist/skills/research.js +81 -0
- package/dist/skills/research.js.map +1 -0
- package/dist/skills/shopping.d.ts +4 -0
- package/dist/skills/shopping.d.ts.map +1 -0
- package/dist/skills/shopping.js +71 -0
- package/dist/skills/shopping.js.map +1 -0
- package/dist/skills/ui-ux-design.d.ts +4 -0
- package/dist/skills/ui-ux-design.d.ts.map +1 -0
- package/dist/skills/ui-ux-design.js +70 -0
- package/dist/skills/ui-ux-design.js.map +1 -0
- package/dist/skills/web-end-to-end-test.d.ts +4 -0
- package/dist/skills/web-end-to-end-test.d.ts.map +1 -0
- package/dist/skills/web-end-to-end-test.js +76 -0
- package/dist/skills/web-end-to-end-test.js.map +1 -0
- package/dist/templates/simple.d.ts +1 -1
- package/dist/templates/simple.d.ts.map +1 -1
- package/dist/templates/simple.js +4 -0
- package/dist/templates/simple.js.map +1 -1
- package/dist/tests/mcp.test.js +2 -54
- package/dist/tests/mcp.test.js.map +1 -1
- package/dist/tools/bash/index.d.ts +10 -0
- package/dist/tools/bash/index.d.ts.map +1 -0
- package/dist/tools/bash/index.js +22 -0
- package/dist/tools/bash/index.js.map +1 -0
- package/dist/tools/bash/interaction.d.ts +29 -0
- package/dist/tools/bash/interaction.d.ts.map +1 -0
- package/dist/tools/bash/interaction.js +13 -0
- package/dist/tools/bash/interaction.js.map +1 -0
- package/dist/tools/bash/list.d.ts +4 -0
- package/dist/tools/bash/list.d.ts.map +1 -0
- package/dist/tools/bash/list.js +23 -0
- package/dist/tools/bash/list.js.map +1 -0
- package/dist/tools/bash/logs.d.ts +4 -0
- package/dist/tools/bash/logs.d.ts.map +1 -0
- package/dist/tools/bash/logs.js +47 -0
- package/dist/tools/bash/logs.js.map +1 -0
- package/dist/tools/bash/process-manager.d.ts +35 -0
- package/dist/tools/bash/process-manager.d.ts.map +1 -0
- package/dist/tools/bash/process-manager.js +137 -0
- package/dist/tools/bash/process-manager.js.map +1 -0
- package/dist/tools/bash/run.d.ts +5 -0
- package/dist/tools/bash/run.d.ts.map +1 -0
- package/dist/tools/bash/run.js +57 -0
- package/dist/tools/bash/run.js.map +1 -0
- package/dist/tools/bash/terminate.d.ts +5 -0
- package/dist/tools/bash/terminate.d.ts.map +1 -0
- package/dist/tools/bash/terminate.js +39 -0
- package/dist/tools/bash/terminate.js.map +1 -0
- package/dist/tools/bash/wait.d.ts +5 -0
- package/dist/tools/bash/wait.d.ts.map +1 -0
- package/dist/tools/bash/wait.js +50 -0
- package/dist/tools/bash/wait.js.map +1 -0
- package/dist/tools/bash/write-input.d.ts +5 -0
- package/dist/tools/bash/write-input.d.ts.map +1 -0
- package/dist/tools/bash/write-input.js +47 -0
- package/dist/tools/bash/write-input.js.map +1 -0
- package/dist/tools/browser/click.d.ts +5 -0
- package/dist/tools/browser/click.d.ts.map +1 -0
- package/dist/tools/browser/click.js +44 -0
- package/dist/tools/browser/click.js.map +1 -0
- package/dist/tools/browser/console.d.ts +4 -0
- package/dist/tools/browser/console.d.ts.map +1 -0
- package/dist/tools/browser/console.js +41 -0
- package/dist/tools/browser/console.js.map +1 -0
- package/dist/tools/browser/create-session.d.ts +5 -0
- package/dist/tools/browser/create-session.d.ts.map +1 -0
- package/dist/tools/browser/create-session.js +30 -0
- package/dist/tools/browser/create-session.js.map +1 -0
- package/dist/tools/browser/evaluate-safe.d.ts +10 -0
- package/dist/tools/browser/evaluate-safe.d.ts.map +1 -0
- package/dist/tools/browser/evaluate-safe.js +65 -0
- package/dist/tools/browser/evaluate-safe.js.map +1 -0
- package/dist/tools/browser/fill.d.ts +5 -0
- package/dist/tools/browser/fill.d.ts.map +1 -0
- package/dist/tools/browser/fill.js +78 -0
- package/dist/tools/browser/fill.js.map +1 -0
- package/dist/tools/browser/get-sessions.d.ts +4 -0
- package/dist/tools/browser/get-sessions.d.ts.map +1 -0
- package/dist/tools/browser/get-sessions.js +14 -0
- package/dist/tools/browser/get-sessions.js.map +1 -0
- package/dist/tools/browser/index.d.ts +19 -0
- package/dist/tools/browser/index.d.ts.map +1 -0
- package/dist/tools/browser/index.js +49 -0
- package/dist/tools/browser/index.js.map +1 -0
- package/dist/tools/browser/inject.d.ts +5 -0
- package/dist/tools/browser/inject.d.ts.map +1 -0
- package/dist/tools/browser/inject.js +51 -0
- package/dist/tools/browser/inject.js.map +1 -0
- package/dist/tools/browser/interaction.d.ts +49 -0
- package/dist/tools/browser/interaction.d.ts.map +1 -0
- package/dist/tools/browser/interaction.js +14 -0
- package/dist/tools/browser/interaction.js.map +1 -0
- package/dist/tools/browser/navigate.d.ts +5 -0
- package/dist/tools/browser/navigate.d.ts.map +1 -0
- package/dist/tools/browser/navigate.js +39 -0
- package/dist/tools/browser/navigate.js.map +1 -0
- package/dist/tools/browser/network-status.d.ts +4 -0
- package/dist/tools/browser/network-status.d.ts.map +1 -0
- package/dist/tools/browser/network-status.js +35 -0
- package/dist/tools/browser/network-status.js.map +1 -0
- package/dist/tools/browser/network.d.ts +4 -0
- package/dist/tools/browser/network.d.ts.map +1 -0
- package/dist/tools/browser/network.js +51 -0
- package/dist/tools/browser/network.js.map +1 -0
- package/dist/tools/browser/read-page.d.ts +45 -0
- package/dist/tools/browser/read-page.d.ts.map +1 -0
- package/dist/tools/browser/read-page.js +264 -0
- package/dist/tools/browser/read-page.js.map +1 -0
- package/dist/tools/browser/read.d.ts +5 -0
- package/dist/tools/browser/read.d.ts.map +1 -0
- package/dist/tools/browser/read.js +56 -0
- package/dist/tools/browser/read.js.map +1 -0
- package/dist/tools/browser/remove-session.d.ts +5 -0
- package/dist/tools/browser/remove-session.d.ts.map +1 -0
- package/dist/tools/browser/remove-session.js +29 -0
- package/dist/tools/browser/remove-session.js.map +1 -0
- package/dist/tools/browser/screenshot.d.ts +5 -0
- package/dist/tools/browser/screenshot.d.ts.map +1 -0
- package/dist/tools/browser/screenshot.js +50 -0
- package/dist/tools/browser/screenshot.js.map +1 -0
- package/dist/tools/browser/scroll-info.d.ts +4 -0
- package/dist/tools/browser/scroll-info.d.ts.map +1 -0
- package/dist/tools/browser/scroll-info.js +28 -0
- package/dist/tools/browser/scroll-info.js.map +1 -0
- package/dist/tools/browser/scroll.d.ts +5 -0
- package/dist/tools/browser/scroll.d.ts.map +1 -0
- package/dist/tools/browser/scroll.js +43 -0
- package/dist/tools/browser/scroll.js.map +1 -0
- package/dist/tools/browser/session-manager.d.ts +35 -0
- package/dist/tools/browser/session-manager.d.ts.map +1 -0
- package/dist/tools/browser/session-manager.js +101 -0
- package/dist/tools/browser/session-manager.js.map +1 -0
- package/dist/tools/browser/submit-form.d.ts +5 -0
- package/dist/tools/browser/submit-form.d.ts.map +1 -0
- package/dist/tools/browser/submit-form.js +45 -0
- package/dist/tools/browser/submit-form.js.map +1 -0
- package/dist/tools/fs/create-dir.d.ts +5 -0
- package/dist/tools/fs/create-dir.d.ts.map +1 -0
- package/dist/tools/fs/create-dir.js +28 -0
- package/dist/tools/fs/create-dir.js.map +1 -0
- package/dist/tools/fs/delete.d.ts +5 -0
- package/dist/tools/fs/delete.d.ts.map +1 -0
- package/dist/tools/fs/delete.js +45 -0
- package/dist/tools/fs/delete.js.map +1 -0
- package/dist/tools/fs/edit-file.d.ts +5 -0
- package/dist/tools/fs/edit-file.d.ts.map +1 -0
- package/dist/tools/fs/edit-file.js +74 -0
- package/dist/tools/fs/edit-file.js.map +1 -0
- package/dist/tools/fs/index.d.ts +11 -2
- package/dist/tools/fs/index.d.ts.map +1 -1
- package/dist/tools/fs/index.js +27 -2
- package/dist/tools/fs/index.js.map +1 -1
- package/dist/tools/fs/interaction.d.ts +37 -0
- package/dist/tools/fs/interaction.d.ts.map +1 -0
- package/dist/tools/fs/interaction.js +13 -0
- package/dist/tools/fs/interaction.js.map +1 -0
- package/dist/tools/fs/list-dir.d.ts +5 -0
- package/dist/tools/fs/list-dir.d.ts.map +1 -0
- package/dist/tools/fs/list-dir.js +87 -0
- package/dist/tools/fs/list-dir.js.map +1 -0
- package/dist/tools/fs/move.d.ts +5 -0
- package/dist/tools/fs/move.d.ts.map +1 -0
- package/dist/tools/fs/move.js +44 -0
- package/dist/tools/fs/move.js.map +1 -0
- package/dist/tools/fs/read-file.d.ts +4 -3
- package/dist/tools/fs/read-file.d.ts.map +1 -1
- package/dist/tools/fs/read-file.js +50 -42
- package/dist/tools/fs/read-file.js.map +1 -1
- package/dist/tools/fs/stat.d.ts +5 -0
- package/dist/tools/fs/stat.d.ts.map +1 -0
- package/dist/tools/fs/stat.js +40 -0
- package/dist/tools/fs/stat.js.map +1 -0
- package/dist/tools/fs/utils.d.ts +20 -0
- package/dist/tools/fs/utils.d.ts.map +1 -0
- package/dist/tools/fs/utils.js +33 -0
- package/dist/tools/fs/utils.js.map +1 -0
- package/dist/tools/fs/write-file.d.ts +4 -3
- package/dist/tools/fs/write-file.d.ts.map +1 -1
- package/dist/tools/fs/write-file.js +39 -58
- package/dist/tools/fs/write-file.js.map +1 -1
- package/dist/tools/present/add.d.ts +5 -0
- package/dist/tools/present/add.d.ts.map +1 -0
- package/dist/tools/present/add.js +54 -0
- package/dist/tools/present/add.js.map +1 -0
- package/dist/tools/present/clear.d.ts +5 -0
- package/dist/tools/present/clear.d.ts.map +1 -0
- package/dist/tools/present/clear.js +23 -0
- package/dist/tools/present/clear.js.map +1 -0
- package/dist/tools/present/get-list.d.ts +5 -0
- package/dist/tools/present/get-list.d.ts.map +1 -0
- package/dist/tools/present/get-list.js +24 -0
- package/dist/tools/present/get-list.js.map +1 -0
- package/dist/tools/present/index.d.ts +8 -0
- package/dist/tools/present/index.d.ts.map +1 -0
- package/dist/tools/present/index.js +14 -0
- package/dist/tools/present/index.js.map +1 -0
- package/dist/tools/present/interaction.d.ts +17 -0
- package/dist/tools/present/interaction.d.ts.map +1 -0
- package/dist/tools/present/interaction.js +15 -0
- package/dist/tools/present/interaction.js.map +1 -0
- package/dist/tools/present/utils.d.ts +12 -0
- package/dist/tools/present/utils.d.ts.map +1 -0
- package/dist/tools/present/utils.js +40 -0
- package/dist/tools/present/utils.js.map +1 -0
- package/dist/tools/question-answer/index.d.ts +5 -0
- package/dist/tools/question-answer/index.d.ts.map +1 -0
- package/dist/tools/question-answer/index.js +7 -0
- package/dist/tools/question-answer/index.js.map +1 -0
- package/dist/tools/question-answer/interaction.d.ts +14 -0
- package/dist/tools/question-answer/interaction.d.ts.map +1 -0
- package/dist/tools/question-answer/interaction.js +13 -0
- package/dist/tools/question-answer/interaction.js.map +1 -0
- package/dist/tools/question-answer/question-answer.d.ts +5 -0
- package/dist/tools/question-answer/question-answer.d.ts.map +1 -0
- package/dist/tools/question-answer/question-answer.js +24 -0
- package/dist/tools/question-answer/question-answer.js.map +1 -0
- package/dist/tools/todo/check-task.d.ts +5 -0
- package/dist/tools/todo/check-task.d.ts.map +1 -0
- package/dist/tools/todo/check-task.js +49 -0
- package/dist/tools/todo/check-task.js.map +1 -0
- package/dist/tools/todo/create-list.d.ts +5 -0
- package/dist/tools/todo/create-list.d.ts.map +1 -0
- package/dist/tools/todo/create-list.js +36 -0
- package/dist/tools/todo/create-list.js.map +1 -0
- package/dist/tools/todo/create-task.d.ts +5 -0
- package/dist/tools/todo/create-task.d.ts.map +1 -0
- package/dist/tools/todo/create-task.js +63 -0
- package/dist/tools/todo/create-task.js.map +1 -0
- package/dist/tools/todo/get-list.d.ts +4 -0
- package/dist/tools/todo/get-list.d.ts.map +1 -0
- package/dist/tools/todo/get-list.js +38 -0
- package/dist/tools/todo/get-list.js.map +1 -0
- package/dist/tools/todo/get-lists.d.ts +4 -0
- package/dist/tools/todo/get-lists.d.ts.map +1 -0
- package/dist/tools/todo/get-lists.js +18 -0
- package/dist/tools/todo/get-lists.js.map +1 -0
- package/dist/tools/todo/index.d.ts +12 -0
- package/dist/tools/todo/index.d.ts.map +1 -0
- package/dist/tools/todo/index.js +25 -0
- package/dist/tools/todo/index.js.map +1 -0
- package/dist/tools/todo/interaction.d.ts +30 -0
- package/dist/tools/todo/interaction.d.ts.map +1 -0
- package/dist/tools/todo/interaction.js +13 -0
- package/dist/tools/todo/interaction.js.map +1 -0
- package/dist/tools/todo/remove-list.d.ts +5 -0
- package/dist/tools/todo/remove-list.d.ts.map +1 -0
- package/dist/tools/todo/remove-list.js +42 -0
- package/dist/tools/todo/remove-list.js.map +1 -0
- package/dist/tools/todo/remove-task.d.ts +5 -0
- package/dist/tools/todo/remove-task.d.ts.map +1 -0
- package/dist/tools/todo/remove-task.js +45 -0
- package/dist/tools/todo/remove-task.js.map +1 -0
- package/dist/tools/todo/storage.d.ts +22 -0
- package/dist/tools/todo/storage.d.ts.map +1 -0
- package/dist/tools/todo/storage.js +44 -0
- package/dist/tools/todo/storage.js.map +1 -0
- package/dist/tools/utils/delay.d.ts +10 -0
- package/dist/tools/utils/delay.d.ts.map +1 -0
- package/dist/tools/utils/delay.js +33 -0
- package/dist/tools/utils/delay.js.map +1 -0
- package/dist/tools/utils/get-current-time.d.ts +7 -2
- package/dist/tools/utils/get-current-time.d.ts.map +1 -1
- package/dist/tools/utils/get-current-time.js +12 -31
- package/dist/tools/utils/get-current-time.js.map +1 -1
- package/dist/tools/utils/index.d.ts +2 -0
- package/dist/tools/utils/index.d.ts.map +1 -1
- package/dist/tools/utils/index.js +7 -0
- package/dist/tools/utils/index.js.map +1 -1
- package/package.json +54 -56
- package/dist/templates/researcher.d.ts +0 -27
- package/dist/templates/researcher.d.ts.map +0 -1
- package/dist/templates/researcher.js +0 -70
- package/dist/templates/researcher.js.map +0 -1
- package/dist/tools/www/fetch.d.ts +0 -4
- package/dist/tools/www/fetch.d.ts.map +0 -1
- package/dist/tools/www/fetch.js +0 -147
- package/dist/tools/www/fetch.js.map +0 -1
- package/dist/tools/www/index.d.ts +0 -4
- package/dist/tools/www/index.d.ts.map +0 -1
- package/dist/tools/www/index.js +0 -4
- package/dist/tools/www/index.js.map +0 -1
- package/dist/tools/www/read-web-page.d.ts +0 -4
- package/dist/tools/www/read-web-page.d.ts.map +0 -1
- package/dist/tools/www/read-web-page.js +0 -330
- package/dist/tools/www/read-web-page.js.map +0 -1
- package/dist/tools/www/web-search.d.ts +0 -4
- package/dist/tools/www/web-search.d.ts.map +0 -1
- package/dist/tools/www/web-search.js +0 -82
- package/dist/tools/www/web-search.js.map +0 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type ChildProcessWithoutNullStreams } from "child_process";
|
|
2
|
+
export type BashProcessStatus = "running" | "exited" | "error" | "terminated";
|
|
3
|
+
/**
|
|
4
|
+
* Tracks one spawned shell process: its live status, combined stdout/stderr
|
|
5
|
+
* log ring buffer, and exit info. Kept in memory for the lifetime of the
|
|
6
|
+
* host process so long-running / endless processes (dev servers, watchers)
|
|
7
|
+
* can be inspected and terminated later instead of blocking a tool call.
|
|
8
|
+
*/
|
|
9
|
+
declare class BashProcess {
|
|
10
|
+
#private;
|
|
11
|
+
id: string;
|
|
12
|
+
command: string;
|
|
13
|
+
cwd: string;
|
|
14
|
+
child: ChildProcessWithoutNullStreams;
|
|
15
|
+
status: BashProcessStatus;
|
|
16
|
+
exitCode: number | null;
|
|
17
|
+
signal: string | null;
|
|
18
|
+
startedAt: number;
|
|
19
|
+
endedAt: number | null;
|
|
20
|
+
constructor(id: string, command: string, cwd: string, child: ChildProcessWithoutNullStreams);
|
|
21
|
+
pushChunk(chunk: string): void;
|
|
22
|
+
getLastLines(count: number): string[];
|
|
23
|
+
getAllLines(): string[];
|
|
24
|
+
markFinished(exitCode: number | null, signal: string | null): void;
|
|
25
|
+
/** Resolves when the process exits, or after timeoutMs elapses (whichever first). */
|
|
26
|
+
waitFor(timeoutMs: number): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
export declare function spawnProcess(command: string, cwd?: string): BashProcess;
|
|
29
|
+
export declare function getProcess(id: string): BashProcess;
|
|
30
|
+
export declare function listProcesses(): BashProcess[];
|
|
31
|
+
export declare function writeToProcess(id: string, text: string, appendNewline?: boolean): void;
|
|
32
|
+
export declare function terminateProcess(id: string, signal?: NodeJS.Signals): void;
|
|
33
|
+
export default BashProcess;
|
|
34
|
+
export { BashProcess };
|
|
35
|
+
//# sourceMappingURL=process-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-manager.d.ts","sourceRoot":"","sources":["../../../src/tools/bash/process-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAG3E,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;AAK9E;;;;;GAKG;AACH,cAAM,WAAW;;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,8BAA8B,CAAC;IACtC,MAAM,EAAE,iBAAiB,CAAa;IACtC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC/B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC7B,SAAS,EAAE,MAAM,CAAc;IAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAIlB,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,8BAA8B;IAO3F,SAAS,CAAC,KAAK,EAAE,MAAM;IAyBvB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAKrC,WAAW,IAAI,MAAM,EAAE;IAIvB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAU3D,qFAAqF;IACrF,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAc5C;AAUD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,WAAW,CA4BvE;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,CAIlD;AAED,wBAAgB,aAAa,IAAI,WAAW,EAAE,CAE7C;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,UAAO,GAAG,IAAI,CAMnF;AAED,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,OAAmB,GAAG,IAAI,CAIrF;AAED,eAAe,WAAW,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import os from "os";
|
|
3
|
+
const LOG_CAP = 20000; // max characters of combined output kept per process
|
|
4
|
+
const MAX_LINE_LOG = 5000; // hard cap on number of log lines retained
|
|
5
|
+
/**
|
|
6
|
+
* Tracks one spawned shell process: its live status, combined stdout/stderr
|
|
7
|
+
* log ring buffer, and exit info. Kept in memory for the lifetime of the
|
|
8
|
+
* host process so long-running / endless processes (dev servers, watchers)
|
|
9
|
+
* can be inspected and terminated later instead of blocking a tool call.
|
|
10
|
+
*/
|
|
11
|
+
class BashProcess {
|
|
12
|
+
id;
|
|
13
|
+
command;
|
|
14
|
+
cwd;
|
|
15
|
+
child;
|
|
16
|
+
status = "running";
|
|
17
|
+
exitCode = null;
|
|
18
|
+
signal = null;
|
|
19
|
+
startedAt = Date.now();
|
|
20
|
+
endedAt = null;
|
|
21
|
+
#lines = [];
|
|
22
|
+
#waiters = [];
|
|
23
|
+
constructor(id, command, cwd, child) {
|
|
24
|
+
this.id = id;
|
|
25
|
+
this.command = command;
|
|
26
|
+
this.cwd = cwd;
|
|
27
|
+
this.child = child;
|
|
28
|
+
}
|
|
29
|
+
pushChunk(chunk) {
|
|
30
|
+
const parts = chunk.split(/\r\n|\r|\n/);
|
|
31
|
+
// merge the first part into the last existing line if the previous
|
|
32
|
+
// chunk didn't end on a newline boundary
|
|
33
|
+
if (this.#lines.length > 0 && !this.#endsWithNewlineFlag) {
|
|
34
|
+
this.#lines[this.#lines.length - 1] += parts.shift();
|
|
35
|
+
}
|
|
36
|
+
this.#lines.push(...parts);
|
|
37
|
+
this.#endsWithNewlineFlag = chunk.endsWith("\n") || chunk.endsWith("\r");
|
|
38
|
+
if (this.#lines.length > MAX_LINE_LOG) {
|
|
39
|
+
this.#lines.splice(0, this.#lines.length - MAX_LINE_LOG);
|
|
40
|
+
}
|
|
41
|
+
this.#capChars();
|
|
42
|
+
}
|
|
43
|
+
#endsWithNewlineFlag = true;
|
|
44
|
+
#capChars() {
|
|
45
|
+
let total = this.#lines.reduce((sum, l) => sum + l.length + 1, 0);
|
|
46
|
+
while (total > LOG_CAP && this.#lines.length > 1) {
|
|
47
|
+
total -= this.#lines[0].length + 1;
|
|
48
|
+
this.#lines.shift();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
getLastLines(count) {
|
|
52
|
+
if (count <= 0)
|
|
53
|
+
return [];
|
|
54
|
+
return this.#lines.slice(Math.max(0, this.#lines.length - count));
|
|
55
|
+
}
|
|
56
|
+
getAllLines() {
|
|
57
|
+
return this.#lines;
|
|
58
|
+
}
|
|
59
|
+
markFinished(exitCode, signal) {
|
|
60
|
+
this.status = signal ? "terminated" : exitCode === 0 ? "exited" : "error";
|
|
61
|
+
this.exitCode = exitCode;
|
|
62
|
+
this.signal = signal;
|
|
63
|
+
this.endedAt = Date.now();
|
|
64
|
+
const waiters = this.#waiters;
|
|
65
|
+
this.#waiters = [];
|
|
66
|
+
waiters.forEach((w) => w());
|
|
67
|
+
}
|
|
68
|
+
/** Resolves when the process exits, or after timeoutMs elapses (whichever first). */
|
|
69
|
+
waitFor(timeoutMs) {
|
|
70
|
+
if (this.status !== "running")
|
|
71
|
+
return Promise.resolve();
|
|
72
|
+
return new Promise((res) => {
|
|
73
|
+
const timer = setTimeout(() => {
|
|
74
|
+
this.#waiters = this.#waiters.filter((w) => w !== onDone);
|
|
75
|
+
res();
|
|
76
|
+
}, timeoutMs);
|
|
77
|
+
const onDone = () => {
|
|
78
|
+
clearTimeout(timer);
|
|
79
|
+
res();
|
|
80
|
+
};
|
|
81
|
+
this.#waiters.push(onDone);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
const processes = new Map();
|
|
86
|
+
let counter = 0;
|
|
87
|
+
function nextId() {
|
|
88
|
+
counter += 1;
|
|
89
|
+
return `p${counter}`;
|
|
90
|
+
}
|
|
91
|
+
export function spawnProcess(command, cwd) {
|
|
92
|
+
const id = nextId();
|
|
93
|
+
const resolvedCwd = cwd || process.cwd();
|
|
94
|
+
const shell = os.platform() === "win32" ? "cmd.exe" : "/bin/bash";
|
|
95
|
+
const shellArgs = os.platform() === "win32" ? ["/d", "/s", "/c", command] : ["-c", command];
|
|
96
|
+
const child = spawn(shell, shellArgs, {
|
|
97
|
+
cwd: resolvedCwd,
|
|
98
|
+
windowsVerbatimArguments: os.platform() === "win32",
|
|
99
|
+
});
|
|
100
|
+
const proc = new BashProcess(id, command, resolvedCwd, child);
|
|
101
|
+
child.stdout.on("data", (data) => proc.pushChunk(data.toString("utf-8")));
|
|
102
|
+
child.stderr.on("data", (data) => proc.pushChunk(data.toString("utf-8")));
|
|
103
|
+
child.on("error", (err) => {
|
|
104
|
+
proc.pushChunk(`[process error] ${err.message}`);
|
|
105
|
+
proc.markFinished(null, null);
|
|
106
|
+
});
|
|
107
|
+
child.on("close", (code, signal) => {
|
|
108
|
+
proc.markFinished(code, signal);
|
|
109
|
+
});
|
|
110
|
+
processes.set(id, proc);
|
|
111
|
+
return proc;
|
|
112
|
+
}
|
|
113
|
+
export function getProcess(id) {
|
|
114
|
+
const proc = processes.get(id);
|
|
115
|
+
if (!proc)
|
|
116
|
+
throw new Error(`no bash process found with id "${id}"`);
|
|
117
|
+
return proc;
|
|
118
|
+
}
|
|
119
|
+
export function listProcesses() {
|
|
120
|
+
return Array.from(processes.values());
|
|
121
|
+
}
|
|
122
|
+
export function writeToProcess(id, text, appendNewline = true) {
|
|
123
|
+
const proc = getProcess(id);
|
|
124
|
+
if (proc.status !== "running") {
|
|
125
|
+
throw new Error(`process "${id}" is not running (status: ${proc.status})`);
|
|
126
|
+
}
|
|
127
|
+
proc.child.stdin.write(appendNewline ? `${text}\n` : text);
|
|
128
|
+
}
|
|
129
|
+
export function terminateProcess(id, signal = "SIGTERM") {
|
|
130
|
+
const proc = getProcess(id);
|
|
131
|
+
if (proc.status !== "running")
|
|
132
|
+
return;
|
|
133
|
+
proc.child.kill(signal);
|
|
134
|
+
}
|
|
135
|
+
export default BashProcess;
|
|
136
|
+
export { BashProcess };
|
|
137
|
+
//# sourceMappingURL=process-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../../../src/tools/bash/process-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/tools/bash/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,eAAO,MAAM,WAAW,gCA8DtB,CAAC;AAEH,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { MCPTool } from "../../core/mcp.js";
|
|
2
|
+
import { platform } from "os";
|
|
3
|
+
import { BashInteraction } from "./interaction.js";
|
|
4
|
+
import { spawnProcess } from "./process-manager.js";
|
|
5
|
+
export const BashRunTool = () => new MCPTool({
|
|
6
|
+
name: "bash-run",
|
|
7
|
+
description: "launch a shell command as a background process, returns its processId immediately. waits up to waitMs for it to finish; if it's still running after that (e.g. an endless process like `npm run dev`) it returns early with status \"running\" and the process keeps going in the background — use bash-wait or bash-logs to check on it later, and bash-terminate to stop it. if the process needs interactive input (e.g. a CLI prompt like \"please enter your project name:\"), use bash-write-input." + " your bash platform on os-type=" + platform(),
|
|
8
|
+
inputs: [
|
|
9
|
+
{
|
|
10
|
+
name: "command",
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "shell command to run",
|
|
13
|
+
required: true,
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: "cwd",
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "working directory to run the command in (defaults to process cwd)",
|
|
19
|
+
required: false,
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: "waitMs",
|
|
23
|
+
type: "number",
|
|
24
|
+
description: "max milliseconds to wait for the process to finish before returning early",
|
|
25
|
+
required: false,
|
|
26
|
+
default: 15000,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "tailLines",
|
|
30
|
+
type: "number",
|
|
31
|
+
description: "number of most recent output lines to include in the response",
|
|
32
|
+
required: false,
|
|
33
|
+
default: 20,
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
customClass: new BashInteraction(),
|
|
37
|
+
execute: async (_envID, inputs, _mcp, customClass) => {
|
|
38
|
+
const { command, cwd, waitMs = 15000, tailLines = 20 } = inputs;
|
|
39
|
+
if (!command || typeof command !== "string") {
|
|
40
|
+
throw new Error("command must be a non-empty string");
|
|
41
|
+
}
|
|
42
|
+
const proc = spawnProcess(command, cwd);
|
|
43
|
+
customClass?.emitBashEvent({ type: "process-started", processId: proc.id, command });
|
|
44
|
+
await proc.waitFor(waitMs);
|
|
45
|
+
if (proc.status !== "running") {
|
|
46
|
+
customClass?.emitBashEvent({ type: "process-exited", processId: proc.id, exitCode: proc.exitCode });
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
processId: proc.id,
|
|
50
|
+
status: proc.status,
|
|
51
|
+
exitCode: proc.exitCode,
|
|
52
|
+
logs: proc.getLastLines(tailLines).join("\n"),
|
|
53
|
+
};
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
export default BashRunTool;
|
|
57
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/tools/bash/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAkB;IAC1D,IAAI,EAAE,UAAU;IAChB,WAAW,EACP,2eAA2e,GAAG,iCAAiC,GAAG,QAAQ,EAAE;IAChiB,MAAM,EAAE;QACJ;YACI,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,sBAAsB;YACnC,QAAQ,EAAE,IAAI;SACjB;QACD;YACI,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,mEAAmE;YAChF,QAAQ,EAAE,KAAK;SAClB;QACD;YACI,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,2EAA2E;YACxF,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,KAAK;SACjB;QACD;YACI,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,+DAA+D;YAC5E,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,EAAE;SACd;KACJ;IACD,WAAW,EAAE,IAAI,eAAe,EAAE;IAClC,OAAO,EAAE,KAAK,EACV,MAAc,EACd,MAA2B,EAC3B,IAAU,EACV,WAA6B,EACjB,EAAE;QACd,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,KAAK,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;QAEhE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAExC,WAAW,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAErF,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE3B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5B,WAAW,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxG,CAAC;QAED,OAAO;YACH,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAChD,CAAC;IACN,CAAC;CACJ,CAAC,CAAC;AAEH,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminate.d.ts","sourceRoot":"","sources":["../../../src/tools/bash/terminate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,eAAO,MAAM,iBAAiB,gCA2C5B,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { MCPTool } from "../../core/mcp.js";
|
|
2
|
+
import { BashInteraction } from "./interaction.js";
|
|
3
|
+
import { terminateProcess, getProcess } from "./process-manager.js";
|
|
4
|
+
export const BashTerminateTool = () => new MCPTool({
|
|
5
|
+
name: "bash-terminate",
|
|
6
|
+
description: "terminate a running process (e.g. stop an endless `npm run dev` once it's no longer needed)",
|
|
7
|
+
inputs: [
|
|
8
|
+
{
|
|
9
|
+
name: "processId",
|
|
10
|
+
type: "string",
|
|
11
|
+
description: "id of the process to terminate",
|
|
12
|
+
required: true,
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: "force",
|
|
16
|
+
type: "boolean",
|
|
17
|
+
description: "use SIGKILL instead of SIGTERM for an immediate, non-graceful stop",
|
|
18
|
+
required: false,
|
|
19
|
+
default: false,
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
customClass: new BashInteraction(),
|
|
23
|
+
execute: async (_envID, inputs, _mcp, customClass) => {
|
|
24
|
+
const { processId, force = false } = inputs;
|
|
25
|
+
if (!processId || typeof processId !== "string") {
|
|
26
|
+
throw new Error("processId must be a non-empty string");
|
|
27
|
+
}
|
|
28
|
+
terminateProcess(processId, force ? "SIGKILL" : "SIGTERM");
|
|
29
|
+
const proc = getProcess(processId);
|
|
30
|
+
await proc.waitFor(3000);
|
|
31
|
+
customClass?.emitBashEvent({ type: "terminated", processId });
|
|
32
|
+
return {
|
|
33
|
+
message: "success",
|
|
34
|
+
status: proc.status,
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
export default BashTerminateTool;
|
|
39
|
+
//# sourceMappingURL=terminate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminate.js","sourceRoot":"","sources":["../../../src/tools/bash/terminate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAEpE,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAkB;IAChE,IAAI,EAAE,gBAAgB;IACtB,WAAW,EAAE,6FAA6F;IAC1G,MAAM,EAAE;QACJ;YACI,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,gCAAgC;YAC7C,QAAQ,EAAE,IAAI;SACjB;QACD;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,oEAAoE;YACjF,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,KAAK;SACjB;KACJ;IACD,WAAW,EAAE,IAAI,eAAe,EAAE;IAClC,OAAO,EAAE,KAAK,EACV,MAAc,EACd,MAA2B,EAC3B,IAAU,EACV,WAA6B,EACjB,EAAE;QACd,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC;QAE5C,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC5D,CAAC;QAED,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAE3D,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEzB,WAAW,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;QAE9D,OAAO;YACH,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,IAAI,CAAC,MAAM;SACtB,CAAC;IACN,CAAC;CACJ,CAAC,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/tools/bash/wait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,eAAO,MAAM,YAAY,gCAwDvB,CAAC;AAEH,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { MCPTool } from "../../core/mcp.js";
|
|
2
|
+
import { BashInteraction } from "./interaction.js";
|
|
3
|
+
import { getProcess } from "./process-manager.js";
|
|
4
|
+
export const BashWaitTool = () => new MCPTool({
|
|
5
|
+
name: "bash-wait",
|
|
6
|
+
description: "wait up to waitMs for a previously started process to finish, then return its status and the last N lines of output (works the same as the initial wait in bash-run, useful for polling a long-running process again)",
|
|
7
|
+
inputs: [
|
|
8
|
+
{
|
|
9
|
+
name: "processId",
|
|
10
|
+
type: "string",
|
|
11
|
+
description: "id of the process to wait on",
|
|
12
|
+
required: true,
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: "waitMs",
|
|
16
|
+
type: "number",
|
|
17
|
+
description: "max milliseconds to wait for the process to finish",
|
|
18
|
+
required: false,
|
|
19
|
+
default: 15000,
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
name: "tailLines",
|
|
23
|
+
type: "number",
|
|
24
|
+
description: "number of most recent output lines to include in the response",
|
|
25
|
+
required: false,
|
|
26
|
+
default: 20,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
customClass: new BashInteraction(),
|
|
30
|
+
execute: async (_envID, inputs, _mcp, customClass) => {
|
|
31
|
+
const { processId, waitMs = 15000, tailLines = 20 } = inputs;
|
|
32
|
+
if (!processId || typeof processId !== "string") {
|
|
33
|
+
throw new Error("processId must be a non-empty string");
|
|
34
|
+
}
|
|
35
|
+
const proc = getProcess(processId);
|
|
36
|
+
customClass?.emitBashEvent({ type: "waiting", processId });
|
|
37
|
+
await proc.waitFor(waitMs);
|
|
38
|
+
if (proc.status !== "running") {
|
|
39
|
+
customClass?.emitBashEvent({ type: "process-exited", processId, exitCode: proc.exitCode });
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
processId: proc.id,
|
|
43
|
+
status: proc.status,
|
|
44
|
+
exitCode: proc.exitCode,
|
|
45
|
+
logs: proc.getLastLines(tailLines).join("\n"),
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
export default BashWaitTool;
|
|
50
|
+
//# sourceMappingURL=wait.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait.js","sourceRoot":"","sources":["../../../src/tools/bash/wait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAkB;IAC3D,IAAI,EAAE,WAAW;IACjB,WAAW,EACP,uNAAuN;IAC3N,MAAM,EAAE;QACJ;YACI,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,8BAA8B;YAC3C,QAAQ,EAAE,IAAI;SACjB;QACD;YACI,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,oDAAoD;YACjE,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,KAAK;SACjB;QACD;YACI,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,+DAA+D;YAC5E,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,EAAE;SACd;KACJ;IACD,WAAW,EAAE,IAAI,eAAe,EAAE;IAClC,OAAO,EAAE,KAAK,EACV,MAAc,EACd,MAA2B,EAC3B,IAAU,EACV,WAA6B,EACjB,EAAE;QACd,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,MAAM,CAAC;QAE7D,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAEnC,WAAW,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QAE3D,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAE3B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5B,WAAW,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/F,CAAC;QAED,OAAO;YACH,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SAChD,CAAC;IACN,CAAC;CACJ,CAAC,CAAC;AAEH,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-input.d.ts","sourceRoot":"","sources":["../../../src/tools/bash/write-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGnD,eAAO,MAAM,kBAAkB,gCAoD7B,CAAC;AAEH,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { MCPTool } from "../../core/mcp.js";
|
|
2
|
+
import { BashInteraction } from "./interaction.js";
|
|
3
|
+
import { writeToProcess, getProcess } from "./process-manager.js";
|
|
4
|
+
export const BashWriteInputTool = () => new MCPTool({
|
|
5
|
+
name: "bash-write-input",
|
|
6
|
+
description: "send text to a running process's stdin, e.g. to answer an interactive prompt like \"please enter your project name:\" or confirm a \"(y/n)\" question. a newline is appended by default so the process receives it as an ENTER keypress.",
|
|
7
|
+
inputs: [
|
|
8
|
+
{
|
|
9
|
+
name: "processId",
|
|
10
|
+
type: "string",
|
|
11
|
+
description: "id of the process to write to",
|
|
12
|
+
required: true,
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: "text",
|
|
16
|
+
type: "string",
|
|
17
|
+
description: "text to send to stdin (e.g. \"my-project\" or \"y\")",
|
|
18
|
+
required: true,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "appendNewline",
|
|
22
|
+
type: "boolean",
|
|
23
|
+
description: "append a newline after text, simulating pressing ENTER",
|
|
24
|
+
required: false,
|
|
25
|
+
default: true,
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
customClass: new BashInteraction(),
|
|
29
|
+
execute: async (_envID, inputs, _mcp, customClass) => {
|
|
30
|
+
const { processId, text, appendNewline = true } = inputs;
|
|
31
|
+
if (!processId || typeof processId !== "string") {
|
|
32
|
+
throw new Error("processId must be a non-empty string");
|
|
33
|
+
}
|
|
34
|
+
if (typeof text !== "string") {
|
|
35
|
+
throw new Error("text must be a string");
|
|
36
|
+
}
|
|
37
|
+
writeToProcess(processId, text, appendNewline);
|
|
38
|
+
customClass?.emitBashEvent({ type: "input-sent", processId });
|
|
39
|
+
const proc = getProcess(processId);
|
|
40
|
+
return {
|
|
41
|
+
message: "success",
|
|
42
|
+
status: proc.status,
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
export default BashWriteInputTool;
|
|
47
|
+
//# sourceMappingURL=write-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-input.js","sourceRoot":"","sources":["../../../src/tools/bash/write-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAY,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElE,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAkB;IACjE,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACP,0OAA0O;IAC9O,MAAM,EAAE;QACJ;YACI,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,+BAA+B;YAC5C,QAAQ,EAAE,IAAI;SACjB;QACD;YACI,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,sDAAsD;YACnE,QAAQ,EAAE,IAAI;SACjB;QACD;YACI,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,wDAAwD;YACrE,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,IAAI;SAChB;KACJ;IACD,WAAW,EAAE,IAAI,eAAe,EAAE;IAClC,OAAO,EAAE,KAAK,EACV,MAAc,EACd,MAA2B,EAC3B,IAAU,EACV,WAA6B,EACjB,EAAE;QACd,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;QAEzD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC7C,CAAC;QAED,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;QAE/C,WAAW,EAAE,aAAa,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;QAE9D,MAAM,IAAI,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAEnC,OAAO;YACH,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,IAAI,CAAC,MAAM;SACtB,CAAC;IACN,CAAC;CACJ,CAAC,CAAC;AAEH,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"click.d.ts","sourceRoot":"","sources":["../../../src/tools/browser/click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAItD,eAAO,MAAM,gBAAgB,mCAiD3B,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { MCPTool } from "../../core/mcp.js";
|
|
2
|
+
import { BrowserInteraction } from "./interaction.js";
|
|
3
|
+
import { getSession } from "./session-manager.js";
|
|
4
|
+
import { resolveRef } from "./read-page.js";
|
|
5
|
+
export const BrowserClickTool = () => new MCPTool({
|
|
6
|
+
name: "browser-click",
|
|
7
|
+
description: "click a clickable element on the page (a ref id previously returned by browser-read, marked [CLICKABLE])",
|
|
8
|
+
inputs: [
|
|
9
|
+
{
|
|
10
|
+
name: "sessionId",
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "session to act on",
|
|
13
|
+
required: true,
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: "ref",
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "ref id of the element to click, e.g. 0x4",
|
|
19
|
+
required: true,
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
customClass: new BrowserInteraction(),
|
|
23
|
+
execute: async (_envID, inputs, _mcp, customClass) => {
|
|
24
|
+
const { sessionId, ref } = inputs;
|
|
25
|
+
if (!sessionId || typeof sessionId !== "string") {
|
|
26
|
+
throw new Error("sessionId must be a non-empty string");
|
|
27
|
+
}
|
|
28
|
+
if (!ref || typeof ref !== "string") {
|
|
29
|
+
throw new Error("ref must be a non-empty string");
|
|
30
|
+
}
|
|
31
|
+
customClass?.emitBrowserEvent({ type: "clicking", sessionId, ref });
|
|
32
|
+
const session = getSession(sessionId);
|
|
33
|
+
const element = await resolveRef(session.page, ref);
|
|
34
|
+
if (!element) {
|
|
35
|
+
throw new Error(`ref "${ref}" was not found on the page (call browser-read again to get fresh refs)`);
|
|
36
|
+
}
|
|
37
|
+
await element.click();
|
|
38
|
+
return {
|
|
39
|
+
message: "success",
|
|
40
|
+
};
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
export default BrowserClickTool;
|
|
44
|
+
//# sourceMappingURL=click.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"click.js","sourceRoot":"","sources":["../../../src/tools/browser/click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAqB;IAClE,IAAI,EAAE,eAAe;IACrB,WAAW,EAAE,0GAA0G;IACvH,MAAM,EAAE;QACJ;YACI,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,mBAAmB;YAChC,QAAQ,EAAE,IAAI;SACjB;QACD;YACI,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,0CAA0C;YACvD,QAAQ,EAAE,IAAI;SACjB;KACJ;IACD,WAAW,EAAE,IAAI,kBAAkB,EAAE;IACrC,OAAO,EAAE,KAAK,EACV,MAAc,EACd,MAA2B,EAC3B,IAAU,EACV,WAAgC,EACpB,EAAE;QACd,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;QAElC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC5D,CAAC;QAED,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACtD,CAAC;QAED,WAAW,EAAE,gBAAgB,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAEpE,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEpD,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,yEAAyE,CAAC,CAAC;QAC1G,CAAC;QAED,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAEtB,OAAO;YACH,OAAO,EAAE,SAAS;SACrB,CAAC;IACN,CAAC;CACJ,CAAC,CAAC;AAEH,eAAe,gBAAgB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../src/tools/browser/console.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5C,eAAO,MAAM,kBAAkB,0BAuC7B,CAAC;AAEH,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { MCPTool } from "../../core/mcp.js";
|
|
2
|
+
import { getSession } from "./session-manager.js";
|
|
3
|
+
export const BrowserConsoleTool = () => new MCPTool({
|
|
4
|
+
name: "browser-console",
|
|
5
|
+
description: "read console log messages captured from a browser session (each message capped at 1000 characters)",
|
|
6
|
+
inputs: [
|
|
7
|
+
{
|
|
8
|
+
name: "sessionId",
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "session to read console logs from",
|
|
11
|
+
required: true,
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
name: "limit",
|
|
15
|
+
type: "number",
|
|
16
|
+
description: "max number of messages to return",
|
|
17
|
+
required: false,
|
|
18
|
+
default: 20,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "offset",
|
|
22
|
+
type: "number",
|
|
23
|
+
description: "offset into the log buffer",
|
|
24
|
+
required: false,
|
|
25
|
+
default: 0,
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
execute: async (_envID, inputs) => {
|
|
29
|
+
const { sessionId, limit = 20, offset = 0 } = inputs;
|
|
30
|
+
if (!sessionId || typeof sessionId !== "string") {
|
|
31
|
+
throw new Error("sessionId must be a non-empty string");
|
|
32
|
+
}
|
|
33
|
+
const session = getSession(sessionId);
|
|
34
|
+
return {
|
|
35
|
+
messages: session.consoleLogs.slice(offset, offset + limit),
|
|
36
|
+
total: session.consoleLogs.length,
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
export default BrowserConsoleTool;
|
|
41
|
+
//# sourceMappingURL=console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/tools/browser/console.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAC;IAChD,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,oGAAoG;IACjH,MAAM,EAAE;QACJ;YACI,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,mCAAmC;YAChD,QAAQ,EAAE,IAAI;SACjB;QACD;YACI,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,kCAAkC;YAC/C,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,EAAE;SACd;QACD;YACI,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,4BAA4B;YACzC,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,CAAC;SACb;KACJ;IACD,OAAO,EAAE,KAAK,EAAE,MAAc,EAAE,MAA2B,EAAgB,EAAE;QACzE,MAAM,EAAE,SAAS,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC;QAErD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAEtC,OAAO;YACH,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;YAC3D,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,MAAM;SACpC,CAAC;IACN,CAAC;CACJ,CAAC,CAAC;AAEH,eAAe,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { MCPTool } from "../../core/mcp.js";
|
|
2
|
+
import { BrowserInteraction } from "./interaction.js";
|
|
3
|
+
export declare const BrowserCreateSessionTool: () => MCPTool<BrowserInteraction>;
|
|
4
|
+
export default BrowserCreateSessionTool;
|
|
5
|
+
//# sourceMappingURL=create-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-session.d.ts","sourceRoot":"","sources":["../../../src/tools/browser/create-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAA2B,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD,eAAO,MAAM,wBAAwB,mCAkCnC,CAAC;AAEH,eAAe,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { MCPTool, generateRefId } from "../../core/mcp.js";
|
|
2
|
+
import { BrowserInteraction } from "./interaction.js";
|
|
3
|
+
import { createSession } from "./session-manager.js";
|
|
4
|
+
export const BrowserCreateSessionTool = () => new MCPTool({
|
|
5
|
+
name: "browser-create-session",
|
|
6
|
+
description: "open a new headless browser session at a given url, returns its sessionId",
|
|
7
|
+
inputs: [
|
|
8
|
+
{
|
|
9
|
+
name: "url",
|
|
10
|
+
type: "string",
|
|
11
|
+
description: "url to open the session at",
|
|
12
|
+
required: true,
|
|
13
|
+
},
|
|
14
|
+
],
|
|
15
|
+
customClass: new BrowserInteraction(),
|
|
16
|
+
execute: async (_envID, inputs, mcp, customClass) => {
|
|
17
|
+
const { url } = inputs;
|
|
18
|
+
if (!url || typeof url !== "string") {
|
|
19
|
+
throw new Error("url must be a non-empty string");
|
|
20
|
+
}
|
|
21
|
+
const sessionId = await generateRefId(mcp);
|
|
22
|
+
customClass?.emitBrowserEvent({ type: "session-created", sessionId, url });
|
|
23
|
+
await createSession(url, sessionId);
|
|
24
|
+
return {
|
|
25
|
+
sessionId,
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
export default BrowserCreateSessionTool;
|
|
30
|
+
//# sourceMappingURL=create-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-session.js","sourceRoot":"","sources":["../../../src/tools/browser/create-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAY,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,EAAE,CAAC,IAAI,OAAO,CAAqB;IAC1E,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,2EAA2E;IACxF,MAAM,EAAE;QACJ;YACI,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,4BAA4B;YACzC,QAAQ,EAAE,IAAI;SACjB;KACJ;IACD,WAAW,EAAE,IAAI,kBAAkB,EAAE;IACrC,OAAO,EAAE,KAAK,EACV,MAAc,EACd,MAA2B,EAC3B,GAAS,EACT,WAAgC,EACpB,EAAE;QACd,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;QAEvB,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;QAE3C,WAAW,EAAE,gBAAgB,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAE3E,MAAM,aAAa,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAEpC,OAAO;YACH,SAAS;SACZ,CAAC;IACN,CAAC;CACJ,CAAC,CAAC;AAEH,eAAe,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Page } from "puppeteer-core";
|
|
2
|
+
/**
|
|
3
|
+
* Drop-in replacement for `page.evaluate(fn, ...args)` that is safe to call
|
|
4
|
+
* from a project run under tsx/ts-node/esbuild as well as a plain `tsc`
|
|
5
|
+
* build. Always use this (instead of page.evaluate directly) for any
|
|
6
|
+
* callback that declares nested named `const`/`let` functions.
|
|
7
|
+
*/
|
|
8
|
+
export declare function evaluateSafe<T, A extends any[]>(page: Page, fn: (...args: A) => T | Promise<T>, ...args: A): Promise<T>;
|
|
9
|
+
export default evaluateSafe;
|
|
10
|
+
//# sourceMappingURL=evaluate-safe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluate-safe.d.ts","sourceRoot":"","sources":["../../../src/tools/browser/evaluate-safe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAuD3C;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,EACjD,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAClC,GAAG,IAAI,EAAE,CAAC,GACX,OAAO,CAAC,CAAC,CAAC,CAaZ;AAED,eAAe,YAAY,CAAC"}
|