@agimon-ai/doompi-computer-use 0.0.1-alpha.2 → 0.0.1-alpha.21
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 +11 -4
- package/dist/_virtual/_rolldown/runtime.cjs +23 -1
- package/dist/api-contracts.cjs +7 -0
- package/dist/api-contracts.d.cts +2 -0
- package/dist/api-contracts.d.mts +2 -0
- package/dist/api-contracts.mjs +2 -0
- package/dist/extensions/mcp.cjs +56 -0
- package/dist/extensions/mcp.cjs.map +1 -0
- package/dist/extensions/mcp.d.cts +5 -0
- package/dist/extensions/mcp.d.cts.map +1 -0
- package/dist/extensions/mcp.d.mts +5 -0
- package/dist/extensions/mcp.d.mts.map +1 -0
- package/dist/extensions/mcp.mjs +51 -0
- package/dist/extensions/mcp.mjs.map +1 -0
- package/dist/extensions/pi.cjs +51 -1
- package/dist/extensions/pi.cjs.map +1 -0
- package/dist/extensions/pi.d.cts +7 -2
- package/dist/extensions/pi.d.cts.map +1 -0
- package/dist/extensions/pi.d.mts +7 -2
- package/dist/extensions/pi.d.mts.map +1 -0
- package/dist/extensions/pi.mjs +46 -1
- package/dist/extensions/pi.mjs.map +1 -0
- package/dist/extensions/server.cjs +72 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.cts +5 -0
- package/dist/extensions/server.d.cts.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +67 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/extensions/web.mjs +625 -0
- package/dist/extensions/web.mjs.map +1 -0
- package/dist/index.cjs +18 -1
- package/dist/index.d.cts +12 -10
- package/dist/index.d.mts +12 -10
- package/dist/index.mjs +8 -1
- package/dist/src/constants/computerUse.cjs +17 -0
- package/dist/src/constants/computerUse.cjs.map +1 -0
- package/dist/src/constants/computerUse.d.cts +5 -0
- package/dist/src/constants/computerUse.d.cts.map +1 -0
- package/dist/src/constants/computerUse.d.mts +5 -0
- package/dist/src/constants/computerUse.d.mts.map +1 -0
- package/dist/src/constants/computerUse.mjs +14 -0
- package/dist/src/constants/computerUse.mjs.map +1 -0
- package/dist/src/extensions/(backend)/channel/computer-use.server.cjs +7 -0
- package/dist/src/extensions/(backend)/channel/computer-use.server.cjs.map +1 -0
- package/dist/src/extensions/(backend)/channel/computer-use.server.mjs +8 -0
- package/dist/src/extensions/(backend)/channel/computer-use.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_runtime/index.cli.cjs +8 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_runtime/index.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_runtime/index.cli.mjs +8 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_runtime/index.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_runtime/index.server.cjs +11 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_runtime/index.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_runtime/index.server.mjs +11 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/_runtime/index.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/api/computer-use/route.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/api/computer-use/route.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/api/computer-use/route.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/api/computer-use/route.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/computer-use.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/computer-use.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/computer-use.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/computer-use.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/computer-use.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/computer-use.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/computer-use.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/command/computer-use.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/hook/session-start.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs +15 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs +16 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs +17 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs +18 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/root.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/00-computer-state.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/00-computer-state.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/00-computer-state.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/00-computer-state.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/00-computer-state.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/00-computer-state.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/00-computer-state.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/00-computer-state.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/10-computer-action.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/10-computer-action.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/10-computer-action.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/10-computer-action.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/10-computer-action.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/10-computer-action.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/10-computer-action.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/10-computer-action.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/20-computer-exec.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/20-computer-exec.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/20-computer-exec.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/20-computer-exec.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/20-computer-exec.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/20-computer-exec.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/20-computer-exec.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool/20-computer-exec.server.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/computer-use.cli.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/computer-use.cli.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/computer-use.cli.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/computer-use.cli.mjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/computer-use.server.cjs +6 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/computer-use.server.cjs.map +1 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/computer-use.server.mjs +7 -0
- package/dist/src/extensions/workspaces/sessions/(backend)/tool-restriction/computer-use.server.mjs.map +1 -0
- package/dist/src/models/computerUseMode.cjs +43 -0
- package/dist/src/models/computerUseMode.cjs.map +1 -0
- package/dist/src/models/computerUseMode.mjs +42 -0
- package/dist/src/models/computerUseMode.mjs.map +1 -0
- package/dist/src/models/computerUseState.cjs +89 -0
- package/dist/src/models/computerUseState.cjs.map +1 -0
- package/dist/src/models/computerUseState.d.cts +6 -0
- package/dist/src/models/computerUseState.d.cts.map +1 -0
- package/dist/src/models/computerUseState.d.mts +6 -0
- package/dist/src/models/computerUseState.d.mts.map +1 -0
- package/dist/src/models/computerUseState.mjs +88 -0
- package/dist/src/models/computerUseState.mjs.map +1 -0
- package/dist/src/schemas/apiContracts.cjs +194 -0
- package/dist/src/schemas/apiContracts.cjs.map +1 -0
- package/dist/src/schemas/apiContracts.d.cts +53 -0
- package/dist/src/schemas/apiContracts.d.cts.map +1 -0
- package/dist/src/schemas/apiContracts.d.mts +53 -0
- package/dist/src/schemas/apiContracts.d.mts.map +1 -0
- package/dist/src/schemas/apiContracts.mjs +191 -0
- package/dist/src/schemas/apiContracts.mjs.map +1 -0
- package/dist/src/services/computerScriptRunner/index.cjs +171 -0
- package/dist/src/services/computerScriptRunner/index.cjs.map +1 -0
- package/dist/src/services/computerScriptRunner/index.d.cts +12 -0
- package/dist/src/services/computerScriptRunner/index.d.cts.map +1 -0
- package/dist/src/services/computerScriptRunner/index.d.mts +12 -0
- package/dist/src/services/computerScriptRunner/index.d.mts.map +1 -0
- package/dist/src/services/computerScriptRunner/index.mjs +171 -0
- package/dist/src/services/computerScriptRunner/index.mjs.map +1 -0
- package/dist/src/services/computerUseApi/index.cjs +291 -0
- package/dist/src/services/computerUseApi/index.cjs.map +1 -0
- package/dist/src/services/computerUseApi/index.mjs +289 -0
- package/dist/src/services/computerUseApi/index.mjs.map +1 -0
- package/dist/src/services/computerUseCommand/index.cjs +15 -0
- package/dist/src/services/computerUseCommand/index.cjs.map +1 -0
- package/dist/src/services/computerUseCommand/index.mjs +15 -0
- package/dist/src/services/computerUseCommand/index.mjs.map +1 -0
- package/dist/src/services/computerUseRuntime/index.cjs +300 -0
- package/dist/src/services/computerUseRuntime/index.cjs.map +1 -0
- package/dist/src/services/computerUseRuntime/index.mjs +299 -0
- package/dist/src/services/computerUseRuntime/index.mjs.map +1 -0
- package/dist/src/services/computerUseServer/index.cjs +350 -0
- package/dist/src/services/computerUseServer/index.cjs.map +1 -0
- package/dist/src/services/computerUseServer/index.mjs +348 -0
- package/dist/src/services/computerUseServer/index.mjs.map +1 -0
- package/dist/src/services/dependencies/index.cjs +27 -0
- package/dist/src/services/dependencies/index.cjs.map +1 -0
- package/dist/src/services/dependencies/index.d.cts +6 -0
- package/dist/src/services/dependencies/index.d.cts.map +1 -0
- package/dist/src/services/dependencies/index.d.mts +6 -0
- package/dist/src/services/dependencies/index.d.mts.map +1 -0
- package/dist/src/services/dependencies/index.mjs +24 -0
- package/dist/src/services/dependencies/index.mjs.map +1 -0
- package/dist/src/services/extensionService/index.cjs +21 -0
- package/dist/src/services/extensionService/index.cjs.map +1 -0
- package/dist/src/services/extensionService/index.d.cts +10 -0
- package/dist/src/services/extensionService/index.d.cts.map +1 -0
- package/dist/src/services/extensionService/index.d.mts +10 -0
- package/dist/src/services/extensionService/index.d.mts.map +1 -0
- package/dist/src/services/extensionService/index.mjs +21 -0
- package/dist/src/services/extensionService/index.mjs.map +1 -0
- package/dist/src/services/mcpTools/index.cjs +17 -0
- package/dist/src/services/mcpTools/index.cjs.map +1 -0
- package/dist/src/services/mcpTools/index.mjs +16 -0
- package/dist/src/services/mcpTools/index.mjs.map +1 -0
- package/dist/src/services/sessionApiClient/index.cjs +9 -0
- package/dist/src/services/sessionApiClient/index.cjs.map +1 -0
- package/dist/src/services/sessionApiClient/index.d.cts +15 -0
- package/dist/src/services/sessionApiClient/index.d.cts.map +1 -0
- package/dist/src/services/sessionApiClient/index.d.mts +15 -0
- package/dist/src/services/sessionApiClient/index.d.mts.map +1 -0
- package/dist/src/services/sessionApiClient/index.mjs +9 -0
- package/dist/src/services/sessionApiClient/index.mjs.map +1 -0
- package/dist/src/services/traceRedaction/index.cjs +19 -0
- package/dist/src/services/traceRedaction/index.cjs.map +1 -0
- package/dist/{services/traceRedaction.d.mts → src/services/traceRedaction/index.d.cts} +6 -7
- package/dist/src/services/traceRedaction/index.d.cts.map +1 -0
- package/dist/{services/traceRedaction.d.cts → src/services/traceRedaction/index.d.mts} +6 -7
- package/dist/src/services/traceRedaction/index.d.mts.map +1 -0
- package/dist/src/services/traceRedaction/index.mjs +19 -0
- package/dist/src/services/traceRedaction/index.mjs.map +1 -0
- package/dist/src/services/webComputerUseAvailability/index.cjs +13 -0
- package/dist/src/services/webComputerUseAvailability/index.cjs.map +1 -0
- package/dist/src/services/webComputerUseAvailability/index.mjs +12 -0
- package/dist/src/services/webComputerUseAvailability/index.mjs.map +1 -0
- package/dist/src/services/webComputerUseChannel/index.cjs +251 -0
- package/dist/src/services/webComputerUseChannel/index.cjs.map +1 -0
- package/dist/src/services/webComputerUseChannel/index.mjs +250 -0
- package/dist/src/services/webComputerUseChannel/index.mjs.map +1 -0
- package/dist/src/types/apiRoutes.cjs +84 -0
- package/dist/src/types/apiRoutes.cjs.map +1 -0
- package/dist/src/types/apiRoutes.mjs +84 -0
- package/dist/src/types/apiRoutes.mjs.map +1 -0
- package/dist/src/types/computerScript.d.cts +38 -0
- package/dist/src/types/computerScript.d.cts.map +1 -0
- package/dist/src/types/computerScript.d.mts +38 -0
- package/dist/src/types/computerScript.d.mts.map +1 -0
- package/dist/{types → src/types}/computerUse.d.cts +14 -14
- package/dist/src/types/computerUse.d.cts.map +1 -0
- package/dist/{types → src/types}/computerUse.d.mts +14 -14
- package/dist/src/types/computerUse.d.mts.map +1 -0
- package/dist/src/types/computerUseApi.cjs +41 -0
- package/dist/src/types/computerUseApi.cjs.map +1 -0
- package/dist/{types → src/types}/computerUseApi.d.cts +28 -20
- package/dist/src/types/computerUseApi.d.cts.map +1 -0
- package/dist/{types → src/types}/computerUseApi.d.mts +28 -20
- package/dist/src/types/computerUseApi.d.mts.map +1 -0
- package/dist/src/types/computerUseApi.mjs +33 -0
- package/dist/src/types/computerUseApi.mjs.map +1 -0
- package/dist/src/types/extension.d.cts +19 -0
- package/dist/src/types/extension.d.cts.map +1 -0
- package/dist/src/types/extension.d.mts +19 -0
- package/dist/src/types/extension.d.mts.map +1 -0
- package/docs/computer-scripts.md +37 -0
- package/llms.txt +1 -0
- package/package.json +55 -33
- package/src/prompts/doompi-use-computer-use/SKILL.md +1 -1
- package/src/types/computerUse.ts +3 -2
- package/src/types/computerUseApi.ts +9 -6
- package/dist/adapters/computerUseApi.cjs +0 -2
- package/dist/adapters/computerUseApi.cjs.map +0 -1
- package/dist/adapters/computerUseApi.d.cts +0 -37
- package/dist/adapters/computerUseApi.d.cts.map +0 -1
- package/dist/adapters/computerUseApi.d.mts +0 -37
- package/dist/adapters/computerUseApi.d.mts.map +0 -1
- package/dist/adapters/computerUseApi.mjs +0 -2
- package/dist/adapters/computerUseApi.mjs.map +0 -1
- package/dist/adapters/pi/extension.cjs +0 -3
- package/dist/adapters/pi/extension.cjs.map +0 -1
- package/dist/adapters/pi/extension.d.cts +0 -12
- package/dist/adapters/pi/extension.d.cts.map +0 -1
- package/dist/adapters/pi/extension.d.mts +0 -12
- package/dist/adapters/pi/extension.d.mts.map +0 -1
- package/dist/adapters/pi/extension.mjs +0 -3
- package/dist/adapters/pi/extension.mjs.map +0 -1
- package/dist/adapters/pi/sessionApiClient.cjs +0 -2
- package/dist/adapters/pi/sessionApiClient.cjs.map +0 -1
- package/dist/adapters/pi/sessionApiClient.d.cts +0 -26
- package/dist/adapters/pi/sessionApiClient.d.cts.map +0 -1
- package/dist/adapters/pi/sessionApiClient.d.mts +0 -26
- package/dist/adapters/pi/sessionApiClient.d.mts.map +0 -1
- package/dist/adapters/pi/sessionApiClient.mjs +0 -2
- package/dist/adapters/pi/sessionApiClient.mjs.map +0 -1
- package/dist/adapters/webComputerUseAvailability.cjs +0 -2
- package/dist/adapters/webComputerUseAvailability.cjs.map +0 -1
- package/dist/adapters/webComputerUseAvailability.mjs +0 -2
- package/dist/adapters/webComputerUseAvailability.mjs.map +0 -1
- package/dist/adapters/webComputerUseChannel.cjs +0 -2
- package/dist/adapters/webComputerUseChannel.cjs.map +0 -1
- package/dist/adapters/webComputerUseChannel.d.cts +0 -10
- package/dist/adapters/webComputerUseChannel.d.cts.map +0 -1
- package/dist/adapters/webComputerUseChannel.d.mts +0 -10
- package/dist/adapters/webComputerUseChannel.d.mts.map +0 -1
- package/dist/adapters/webComputerUseChannel.mjs +0 -2
- package/dist/adapters/webComputerUseChannel.mjs.map +0 -1
- package/dist/commands/computerUseCommand.cjs +0 -2
- package/dist/commands/computerUseCommand.cjs.map +0 -1
- package/dist/commands/computerUseCommand.mjs +0 -2
- package/dist/commands/computerUseCommand.mjs.map +0 -1
- package/dist/container/index.cjs +0 -2
- package/dist/container/index.cjs.map +0 -1
- package/dist/container/index.d.cts +0 -6
- package/dist/container/index.d.cts.map +0 -1
- package/dist/container/index.d.mts +0 -6
- package/dist/container/index.d.mts.map +0 -1
- package/dist/container/index.mjs +0 -2
- package/dist/container/index.mjs.map +0 -1
- package/dist/services/extensionService.cjs +0 -2
- package/dist/services/extensionService.cjs.map +0 -1
- package/dist/services/extensionService.d.cts +0 -11
- package/dist/services/extensionService.d.cts.map +0 -1
- package/dist/services/extensionService.d.mts +0 -11
- package/dist/services/extensionService.d.mts.map +0 -1
- package/dist/services/extensionService.mjs +0 -2
- package/dist/services/extensionService.mjs.map +0 -1
- package/dist/services/sessionController.cjs +0 -2
- package/dist/services/sessionController.cjs.map +0 -1
- package/dist/services/sessionController.d.cts +0 -7
- package/dist/services/sessionController.d.cts.map +0 -1
- package/dist/services/sessionController.d.mts +0 -7
- package/dist/services/sessionController.d.mts.map +0 -1
- package/dist/services/sessionController.mjs +0 -2
- package/dist/services/sessionController.mjs.map +0 -1
- package/dist/services/traceRedaction.cjs +0 -2
- package/dist/services/traceRedaction.cjs.map +0 -1
- package/dist/services/traceRedaction.d.cts.map +0 -1
- package/dist/services/traceRedaction.d.mts.map +0 -1
- package/dist/services/traceRedaction.mjs +0 -2
- package/dist/services/traceRedaction.mjs.map +0 -1
- package/dist/sessionApi.cjs +0 -1
- package/dist/sessionApi.d.cts +0 -2
- package/dist/sessionApi.d.mts +0 -2
- package/dist/sessionApi.mjs +0 -1
- package/dist/types/computerUse.d.cts.map +0 -1
- package/dist/types/computerUse.d.mts.map +0 -1
- package/dist/types/computerUseApi.cjs +0 -2
- package/dist/types/computerUseApi.cjs.map +0 -1
- package/dist/types/computerUseApi.d.cts.map +0 -1
- package/dist/types/computerUseApi.d.mts.map +0 -1
- package/dist/types/computerUseApi.mjs +0 -2
- package/dist/types/computerUseApi.mjs.map +0 -1
- package/dist/types/extension.d.cts +0 -17
- package/dist/types/extension.d.cts.map +0 -1
- package/dist/types/extension.d.mts +0 -17
- package/dist/types/extension.d.mts.map +0 -1
- package/dist/webHub.cjs +0 -1
- package/dist/webHub.d.cts +0 -3
- package/dist/webHub.d.mts +0 -3
- package/dist/webHub.mjs +0 -1
- package/src/exports/webClient.ts +0 -2
- package/src/web/ComputerActionToolCard.tsx +0 -51
- package/src/web/ComputerStateToolCard.tsx +0 -51
- package/src/web/ComputerUsePanel.tsx +0 -136
- package/src/web/computerActionToolRender.ts +0 -20
- package/src/web/computerStateToolRender.ts +0 -18
- package/src/web/computerUseStore.ts +0 -26
- package/src/web/index.ts +0 -41
- package/src/web/tsconfig.json +0 -28
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
let node_child_process = require("node:child_process");
|
|
2
|
+
let node_fs_promises = require("node:fs/promises");
|
|
3
|
+
//#region src/services/computerScriptRunner/index.ts
|
|
4
|
+
const DEFAULT_TIMEOUT_MS = 3e4;
|
|
5
|
+
const DEFAULT_MAX_OUTPUT_BYTES = 262144;
|
|
6
|
+
const WORKER_SOURCE = String.raw`
|
|
7
|
+
import { readFile } from 'node:fs/promises';
|
|
8
|
+
import { stripTypeScriptTypes } from 'node:module';
|
|
9
|
+
|
|
10
|
+
let nextRequestId = 0;
|
|
11
|
+
const pending = new Map();
|
|
12
|
+
const call = (operation, payload) => new Promise((resolve, reject) => {
|
|
13
|
+
const id = String(++nextRequestId);
|
|
14
|
+
pending.set(id, { resolve, reject });
|
|
15
|
+
process.send({ type: 'program', id, operation, payload });
|
|
16
|
+
});
|
|
17
|
+
process.on('message', async (message) => {
|
|
18
|
+
if (message?.type === 'response') {
|
|
19
|
+
const request = pending.get(message.id);
|
|
20
|
+
if (!request) return;
|
|
21
|
+
pending.delete(message.id);
|
|
22
|
+
if (message.error) request.reject(new Error(message.error));
|
|
23
|
+
else request.resolve(message.value);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (message?.type !== 'start') return;
|
|
27
|
+
const controller = new AbortController();
|
|
28
|
+
process.once('SIGTERM', () => controller.abort());
|
|
29
|
+
const logger = Object.fromEntries(['debug', 'info', 'warn', 'error'].map((level) => [level, (value) => {
|
|
30
|
+
process.send({ type: 'log', level, message: String(value) });
|
|
31
|
+
}]));
|
|
32
|
+
try {
|
|
33
|
+
const source = await readFile(message.scriptPath, 'utf8');
|
|
34
|
+
const compiled = stripTypeScriptTypes(source, { mode: 'strip' });
|
|
35
|
+
const moduleUrl = 'data:text/javascript;base64,' + Buffer.from(compiled).toString('base64');
|
|
36
|
+
const loaded = await import(moduleUrl);
|
|
37
|
+
if (typeof loaded.run !== 'function') throw new Error('Computer script must export a named run function.');
|
|
38
|
+
const program = {
|
|
39
|
+
observe: () => call('observe'),
|
|
40
|
+
act: (action) => call('act', action),
|
|
41
|
+
};
|
|
42
|
+
const result = await loaded.run({ context: { program }, input: message.input, logger, signal: controller.signal });
|
|
43
|
+
const resultJson = result === undefined ? undefined : JSON.stringify(result);
|
|
44
|
+
process.send({ type: 'complete', resultJson });
|
|
45
|
+
} catch (error) {
|
|
46
|
+
process.send({ type: 'failed', error: error instanceof Error ? error.message : String(error) });
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
`;
|
|
50
|
+
var ComputerScriptRunner = class {
|
|
51
|
+
client;
|
|
52
|
+
allowedScriptPaths;
|
|
53
|
+
timeoutMs;
|
|
54
|
+
maxOutputBytes;
|
|
55
|
+
constructor(options) {
|
|
56
|
+
this.client = options.client;
|
|
57
|
+
this.allowedScriptPaths = options.allowedScriptPaths;
|
|
58
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
59
|
+
this.maxOutputBytes = options.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES;
|
|
60
|
+
}
|
|
61
|
+
async execute(scriptPath, input, signal) {
|
|
62
|
+
const resolvedPath = await (0, node_fs_promises.realpath)(scriptPath);
|
|
63
|
+
if (!(await Promise.all(this.allowedScriptPaths.map(async (candidate) => (0, node_fs_promises.realpath)(candidate).catch(() => "")))).includes(resolvedPath)) throw new Error("Computer script path is not explicitly allowed.");
|
|
64
|
+
if (!resolvedPath.endsWith(".ts")) throw new Error("Computer scripts must be TypeScript files.");
|
|
65
|
+
const serializedInput = JSON.stringify(input);
|
|
66
|
+
if (serializedInput === void 0) throw new Error("Computer script input must be JSON serializable.");
|
|
67
|
+
if (Buffer.byteLength(serializedInput) > this.maxOutputBytes) throw new Error("Computer script input exceeds the size limit.");
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
const child = (0, node_child_process.spawn)(process.execPath, [
|
|
70
|
+
"--input-type=module",
|
|
71
|
+
"--eval",
|
|
72
|
+
WORKER_SOURCE
|
|
73
|
+
], { stdio: [
|
|
74
|
+
"ignore",
|
|
75
|
+
"pipe",
|
|
76
|
+
"pipe",
|
|
77
|
+
"ipc"
|
|
78
|
+
] });
|
|
79
|
+
const controller = new AbortController();
|
|
80
|
+
const logs = [];
|
|
81
|
+
let outputBytes = 0;
|
|
82
|
+
let settled = false;
|
|
83
|
+
let operation = Promise.resolve();
|
|
84
|
+
const terminate = () => {
|
|
85
|
+
controller.abort();
|
|
86
|
+
child.kill("SIGTERM");
|
|
87
|
+
setTimeout(() => child.kill("SIGKILL"), 250).unref?.();
|
|
88
|
+
};
|
|
89
|
+
const finish = (error, value) => {
|
|
90
|
+
if (settled) return;
|
|
91
|
+
settled = true;
|
|
92
|
+
clearTimeout(timeout);
|
|
93
|
+
signal?.removeEventListener("abort", onAbort);
|
|
94
|
+
terminate();
|
|
95
|
+
if (error !== void 0) reject(error);
|
|
96
|
+
else resolve(value);
|
|
97
|
+
};
|
|
98
|
+
const addOutput = (value) => {
|
|
99
|
+
outputBytes += Buffer.byteLength(value);
|
|
100
|
+
if (outputBytes <= this.maxOutputBytes) return true;
|
|
101
|
+
finish(/* @__PURE__ */ new Error("Computer script output exceeded the size limit."));
|
|
102
|
+
return false;
|
|
103
|
+
};
|
|
104
|
+
const onAbort = () => finish(/* @__PURE__ */ new Error("Computer script execution was cancelled."));
|
|
105
|
+
const timeout = setTimeout(() => finish(/* @__PURE__ */ new Error("Computer script execution timed out.")), this.timeoutMs);
|
|
106
|
+
timeout.unref?.();
|
|
107
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
108
|
+
if (signal?.aborted === true) return onAbort();
|
|
109
|
+
child.stdout?.on("data", (chunk) => addOutput(chunk.toString("utf8")));
|
|
110
|
+
child.stderr?.on("data", (chunk) => addOutput(chunk.toString("utf8")));
|
|
111
|
+
child.on("error", (error) => finish(error));
|
|
112
|
+
child.on("exit", (code, exitSignal) => {
|
|
113
|
+
if (!settled) finish(/* @__PURE__ */ new Error(`Computer script worker exited before completion (${exitSignal ?? code ?? "unknown"}).`));
|
|
114
|
+
});
|
|
115
|
+
child.on("message", (rawMessage) => {
|
|
116
|
+
if (settled) return;
|
|
117
|
+
if (rawMessage.type === "log" && typeof rawMessage.message === "string") {
|
|
118
|
+
const line = `[${String(rawMessage.level)}] ${rawMessage.message}`;
|
|
119
|
+
if (addOutput(line)) logs.push(line);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (rawMessage.type === "program" && typeof rawMessage.id === "string" && (rawMessage.operation === "observe" || rawMessage.operation === "act")) {
|
|
123
|
+
operation = operation.then(async () => {
|
|
124
|
+
try {
|
|
125
|
+
const value = rawMessage.operation === "observe" ? await this.client.observe(controller.signal) : await this.client.act(rawMessage.payload, controller.signal);
|
|
126
|
+
child.send({
|
|
127
|
+
type: "response",
|
|
128
|
+
id: rawMessage.id,
|
|
129
|
+
value
|
|
130
|
+
});
|
|
131
|
+
} catch (error) {
|
|
132
|
+
child.send({
|
|
133
|
+
type: "response",
|
|
134
|
+
id: rawMessage.id,
|
|
135
|
+
error: error instanceof Error ? error.message : String(error)
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (rawMessage.type === "failed" && typeof rawMessage.error === "string") {
|
|
142
|
+
finish(new Error(rawMessage.error));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (rawMessage.type === "complete") operation = operation.then(async () => {
|
|
146
|
+
const resultJson = rawMessage.resultJson;
|
|
147
|
+
if (resultJson !== void 0 && typeof resultJson !== "string") {
|
|
148
|
+
finish(/* @__PURE__ */ new Error("Computer script returned an invalid result."));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (typeof resultJson === "string" && !addOutput(resultJson)) return;
|
|
152
|
+
const observation = await this.client.observe(controller.signal);
|
|
153
|
+
finish(void 0, {
|
|
154
|
+
...typeof resultJson === "string" ? { result: JSON.parse(resultJson) } : {},
|
|
155
|
+
observation,
|
|
156
|
+
logs
|
|
157
|
+
});
|
|
158
|
+
}).catch((error) => finish(error instanceof Error ? error : new Error(String(error))));
|
|
159
|
+
});
|
|
160
|
+
child.send({
|
|
161
|
+
type: "start",
|
|
162
|
+
scriptPath: resolvedPath,
|
|
163
|
+
input: JSON.parse(serializedInput)
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
//#endregion
|
|
169
|
+
exports.ComputerScriptRunner = ComputerScriptRunner;
|
|
170
|
+
|
|
171
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["realpath","spawn"],"sources":["../../../../src/services/computerScriptRunner/index.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport { realpath } from 'node:fs/promises';\n\nimport type { ComputerScriptExecutionResult, ComputerScriptRunnerOptions } from '../../types/computerScript';\nimport type { ComputerUseAction } from '../../types/computerUse';\nimport type { ComputerUseSessionClient } from '../sessionApiClient';\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_OUTPUT_BYTES = 256 * 1024;\n\nconst WORKER_SOURCE = String.raw`\nimport { readFile } from 'node:fs/promises';\nimport { stripTypeScriptTypes } from 'node:module';\n\nlet nextRequestId = 0;\nconst pending = new Map();\nconst call = (operation, payload) => new Promise((resolve, reject) => {\n const id = String(++nextRequestId);\n pending.set(id, { resolve, reject });\n process.send({ type: 'program', id, operation, payload });\n});\nprocess.on('message', async (message) => {\n if (message?.type === 'response') {\n const request = pending.get(message.id);\n if (!request) return;\n pending.delete(message.id);\n if (message.error) request.reject(new Error(message.error));\n else request.resolve(message.value);\n return;\n }\n if (message?.type !== 'start') return;\n const controller = new AbortController();\n process.once('SIGTERM', () => controller.abort());\n const logger = Object.fromEntries(['debug', 'info', 'warn', 'error'].map((level) => [level, (value) => {\n process.send({ type: 'log', level, message: String(value) });\n }]));\n try {\n const source = await readFile(message.scriptPath, 'utf8');\n const compiled = stripTypeScriptTypes(source, { mode: 'strip' });\n const moduleUrl = 'data:text/javascript;base64,' + Buffer.from(compiled).toString('base64');\n const loaded = await import(moduleUrl);\n if (typeof loaded.run !== 'function') throw new Error('Computer script must export a named run function.');\n const program = {\n observe: () => call('observe'),\n act: (action) => call('act', action),\n };\n const result = await loaded.run({ context: { program }, input: message.input, logger, signal: controller.signal });\n const resultJson = result === undefined ? undefined : JSON.stringify(result);\n process.send({ type: 'complete', resultJson });\n } catch (error) {\n process.send({ type: 'failed', error: error instanceof Error ? error.message : String(error) });\n }\n});\n`;\n\ninterface WorkerMessage {\n readonly type?: unknown;\n readonly id?: unknown;\n readonly operation?: unknown;\n readonly payload?: unknown;\n readonly level?: unknown;\n readonly message?: unknown;\n readonly resultJson?: unknown;\n readonly error?: unknown;\n}\n\nexport class ComputerScriptRunner {\n private readonly client: ComputerUseSessionClient;\n private readonly allowedScriptPaths: readonly string[];\n private readonly timeoutMs: number;\n private readonly maxOutputBytes: number;\n\n public constructor(options: ComputerScriptRunnerOptions) {\n this.client = options.client;\n this.allowedScriptPaths = options.allowedScriptPaths;\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.maxOutputBytes = options.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES;\n }\n\n public async execute(\n scriptPath: string,\n input: unknown,\n signal?: AbortSignal,\n ): Promise<ComputerScriptExecutionResult> {\n const resolvedPath = await realpath(scriptPath);\n const allowedPaths = await Promise.all(\n this.allowedScriptPaths.map(async (candidate) => realpath(candidate).catch(() => '')),\n );\n if (!allowedPaths.includes(resolvedPath)) throw new Error('Computer script path is not explicitly allowed.');\n if (!resolvedPath.endsWith('.ts')) throw new Error('Computer scripts must be TypeScript files.');\n\n const serializedInput = JSON.stringify(input);\n if (serializedInput === undefined) throw new Error('Computer script input must be JSON serializable.');\n if (Buffer.byteLength(serializedInput) > this.maxOutputBytes)\n throw new Error('Computer script input exceeds the size limit.');\n\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, ['--input-type=module', '--eval', WORKER_SOURCE], {\n stdio: ['ignore', 'pipe', 'pipe', 'ipc'],\n });\n const controller = new AbortController();\n const logs: string[] = [];\n let outputBytes = 0;\n let settled = false;\n let operation = Promise.resolve();\n\n const terminate = (): void => {\n controller.abort();\n child.kill('SIGTERM');\n const killTimer = setTimeout(() => child.kill('SIGKILL'), 250);\n killTimer.unref?.();\n };\n const finish = (error?: Error, value?: ComputerScriptExecutionResult): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n signal?.removeEventListener('abort', onAbort);\n terminate();\n if (error !== undefined) reject(error);\n else resolve(value as ComputerScriptExecutionResult);\n };\n const addOutput = (value: string): boolean => {\n outputBytes += Buffer.byteLength(value);\n if (outputBytes <= this.maxOutputBytes) return true;\n finish(new Error('Computer script output exceeded the size limit.'));\n return false;\n };\n const onAbort = () => finish(new Error('Computer script execution was cancelled.'));\n const timeout = setTimeout(() => finish(new Error('Computer script execution timed out.')), this.timeoutMs);\n timeout.unref?.();\n signal?.addEventListener('abort', onAbort, { once: true });\n if (signal?.aborted === true) return onAbort();\n\n child.stdout?.on('data', (chunk: Buffer) => addOutput(chunk.toString('utf8')));\n child.stderr?.on('data', (chunk: Buffer) => addOutput(chunk.toString('utf8')));\n child.on('error', (error) => finish(error));\n child.on('exit', (code, exitSignal) => {\n if (!settled)\n finish(new Error(`Computer script worker exited before completion (${exitSignal ?? code ?? 'unknown'}).`));\n });\n child.on('message', (rawMessage: WorkerMessage) => {\n if (settled) return;\n if (rawMessage.type === 'log' && typeof rawMessage.message === 'string') {\n const line = `[${String(rawMessage.level)}] ${rawMessage.message}`;\n if (addOutput(line)) logs.push(line);\n return;\n }\n if (\n rawMessage.type === 'program' &&\n typeof rawMessage.id === 'string' &&\n (rawMessage.operation === 'observe' || rawMessage.operation === 'act')\n ) {\n operation = operation.then(async () => {\n try {\n const value =\n rawMessage.operation === 'observe'\n ? await this.client.observe(controller.signal)\n : await this.client.act(rawMessage.payload as ComputerUseAction, controller.signal);\n child.send({ type: 'response', id: rawMessage.id, value });\n } catch (error) {\n child.send({\n type: 'response',\n id: rawMessage.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n return;\n }\n if (rawMessage.type === 'failed' && typeof rawMessage.error === 'string') {\n finish(new Error(rawMessage.error));\n return;\n }\n if (rawMessage.type === 'complete') {\n operation = operation\n .then(async () => {\n const resultJson = rawMessage.resultJson;\n if (resultJson !== undefined && typeof resultJson !== 'string') {\n finish(new Error('Computer script returned an invalid result.'));\n return;\n }\n if (typeof resultJson === 'string' && !addOutput(resultJson)) return;\n const observation = await this.client.observe(controller.signal);\n finish(undefined, {\n ...(typeof resultJson === 'string' ? { result: JSON.parse(resultJson) as unknown } : {}),\n observation,\n logs,\n });\n })\n .catch((error: unknown) => finish(error instanceof Error ? error : new Error(String(error))));\n }\n });\n child.send({ type: 'start', scriptPath: resolvedPath, input: JSON.parse(serializedInput) as unknown });\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ComputerScriptExecutionResult, ComputerScriptRunnerOptions } from "../../types/computerScript.cjs";
|
|
2
|
+
//#region src/services/computerScriptRunner/index.d.ts
|
|
3
|
+
export declare class ComputerScriptRunner {
|
|
4
|
+
private readonly client;
|
|
5
|
+
private readonly allowedScriptPaths;
|
|
6
|
+
private readonly timeoutMs;
|
|
7
|
+
private readonly maxOutputBytes;
|
|
8
|
+
constructor(options: ComputerScriptRunnerOptions);
|
|
9
|
+
execute(scriptPath: string, input: unknown, signal?: AbortSignal): Promise<ComputerScriptExecutionResult>;
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../../../src/services/computerScriptRunner/index.ts"],"mappings":";;qBAkEa;mBACM;mBACA;mBACA;mBACA;EAEjB,YAAmB,SAAS;EAOf,QACX,oBACA,gBACA,SAAS,cACR,QAAQ"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ComputerScriptExecutionResult, ComputerScriptRunnerOptions } from "../../types/computerScript.mjs";
|
|
2
|
+
//#region src/services/computerScriptRunner/index.d.ts
|
|
3
|
+
export declare class ComputerScriptRunner {
|
|
4
|
+
private readonly client;
|
|
5
|
+
private readonly allowedScriptPaths;
|
|
6
|
+
private readonly timeoutMs;
|
|
7
|
+
private readonly maxOutputBytes;
|
|
8
|
+
constructor(options: ComputerScriptRunnerOptions);
|
|
9
|
+
execute(scriptPath: string, input: unknown, signal?: AbortSignal): Promise<ComputerScriptExecutionResult>;
|
|
10
|
+
}
|
|
11
|
+
//#endregion
|
|
12
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/services/computerScriptRunner/index.ts"],"mappings":";;qBAkEa;mBACM;mBACA;mBACA;mBACA;EAEjB,YAAmB,SAAS;EAOf,QACX,oBACA,gBACA,SAAS,cACR,QAAQ"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { realpath } from "node:fs/promises";
|
|
3
|
+
//#region src/services/computerScriptRunner/index.ts
|
|
4
|
+
const DEFAULT_TIMEOUT_MS = 3e4;
|
|
5
|
+
const DEFAULT_MAX_OUTPUT_BYTES = 262144;
|
|
6
|
+
const WORKER_SOURCE = String.raw`
|
|
7
|
+
import { readFile } from 'node:fs/promises';
|
|
8
|
+
import { stripTypeScriptTypes } from 'node:module';
|
|
9
|
+
|
|
10
|
+
let nextRequestId = 0;
|
|
11
|
+
const pending = new Map();
|
|
12
|
+
const call = (operation, payload) => new Promise((resolve, reject) => {
|
|
13
|
+
const id = String(++nextRequestId);
|
|
14
|
+
pending.set(id, { resolve, reject });
|
|
15
|
+
process.send({ type: 'program', id, operation, payload });
|
|
16
|
+
});
|
|
17
|
+
process.on('message', async (message) => {
|
|
18
|
+
if (message?.type === 'response') {
|
|
19
|
+
const request = pending.get(message.id);
|
|
20
|
+
if (!request) return;
|
|
21
|
+
pending.delete(message.id);
|
|
22
|
+
if (message.error) request.reject(new Error(message.error));
|
|
23
|
+
else request.resolve(message.value);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (message?.type !== 'start') return;
|
|
27
|
+
const controller = new AbortController();
|
|
28
|
+
process.once('SIGTERM', () => controller.abort());
|
|
29
|
+
const logger = Object.fromEntries(['debug', 'info', 'warn', 'error'].map((level) => [level, (value) => {
|
|
30
|
+
process.send({ type: 'log', level, message: String(value) });
|
|
31
|
+
}]));
|
|
32
|
+
try {
|
|
33
|
+
const source = await readFile(message.scriptPath, 'utf8');
|
|
34
|
+
const compiled = stripTypeScriptTypes(source, { mode: 'strip' });
|
|
35
|
+
const moduleUrl = 'data:text/javascript;base64,' + Buffer.from(compiled).toString('base64');
|
|
36
|
+
const loaded = await import(moduleUrl);
|
|
37
|
+
if (typeof loaded.run !== 'function') throw new Error('Computer script must export a named run function.');
|
|
38
|
+
const program = {
|
|
39
|
+
observe: () => call('observe'),
|
|
40
|
+
act: (action) => call('act', action),
|
|
41
|
+
};
|
|
42
|
+
const result = await loaded.run({ context: { program }, input: message.input, logger, signal: controller.signal });
|
|
43
|
+
const resultJson = result === undefined ? undefined : JSON.stringify(result);
|
|
44
|
+
process.send({ type: 'complete', resultJson });
|
|
45
|
+
} catch (error) {
|
|
46
|
+
process.send({ type: 'failed', error: error instanceof Error ? error.message : String(error) });
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
`;
|
|
50
|
+
var ComputerScriptRunner = class {
|
|
51
|
+
client;
|
|
52
|
+
allowedScriptPaths;
|
|
53
|
+
timeoutMs;
|
|
54
|
+
maxOutputBytes;
|
|
55
|
+
constructor(options) {
|
|
56
|
+
this.client = options.client;
|
|
57
|
+
this.allowedScriptPaths = options.allowedScriptPaths;
|
|
58
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
59
|
+
this.maxOutputBytes = options.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES;
|
|
60
|
+
}
|
|
61
|
+
async execute(scriptPath, input, signal) {
|
|
62
|
+
const resolvedPath = await realpath(scriptPath);
|
|
63
|
+
if (!(await Promise.all(this.allowedScriptPaths.map(async (candidate) => realpath(candidate).catch(() => "")))).includes(resolvedPath)) throw new Error("Computer script path is not explicitly allowed.");
|
|
64
|
+
if (!resolvedPath.endsWith(".ts")) throw new Error("Computer scripts must be TypeScript files.");
|
|
65
|
+
const serializedInput = JSON.stringify(input);
|
|
66
|
+
if (serializedInput === void 0) throw new Error("Computer script input must be JSON serializable.");
|
|
67
|
+
if (Buffer.byteLength(serializedInput) > this.maxOutputBytes) throw new Error("Computer script input exceeds the size limit.");
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
const child = spawn(process.execPath, [
|
|
70
|
+
"--input-type=module",
|
|
71
|
+
"--eval",
|
|
72
|
+
WORKER_SOURCE
|
|
73
|
+
], { stdio: [
|
|
74
|
+
"ignore",
|
|
75
|
+
"pipe",
|
|
76
|
+
"pipe",
|
|
77
|
+
"ipc"
|
|
78
|
+
] });
|
|
79
|
+
const controller = new AbortController();
|
|
80
|
+
const logs = [];
|
|
81
|
+
let outputBytes = 0;
|
|
82
|
+
let settled = false;
|
|
83
|
+
let operation = Promise.resolve();
|
|
84
|
+
const terminate = () => {
|
|
85
|
+
controller.abort();
|
|
86
|
+
child.kill("SIGTERM");
|
|
87
|
+
setTimeout(() => child.kill("SIGKILL"), 250).unref?.();
|
|
88
|
+
};
|
|
89
|
+
const finish = (error, value) => {
|
|
90
|
+
if (settled) return;
|
|
91
|
+
settled = true;
|
|
92
|
+
clearTimeout(timeout);
|
|
93
|
+
signal?.removeEventListener("abort", onAbort);
|
|
94
|
+
terminate();
|
|
95
|
+
if (error !== void 0) reject(error);
|
|
96
|
+
else resolve(value);
|
|
97
|
+
};
|
|
98
|
+
const addOutput = (value) => {
|
|
99
|
+
outputBytes += Buffer.byteLength(value);
|
|
100
|
+
if (outputBytes <= this.maxOutputBytes) return true;
|
|
101
|
+
finish(/* @__PURE__ */ new Error("Computer script output exceeded the size limit."));
|
|
102
|
+
return false;
|
|
103
|
+
};
|
|
104
|
+
const onAbort = () => finish(/* @__PURE__ */ new Error("Computer script execution was cancelled."));
|
|
105
|
+
const timeout = setTimeout(() => finish(/* @__PURE__ */ new Error("Computer script execution timed out.")), this.timeoutMs);
|
|
106
|
+
timeout.unref?.();
|
|
107
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
108
|
+
if (signal?.aborted === true) return onAbort();
|
|
109
|
+
child.stdout?.on("data", (chunk) => addOutput(chunk.toString("utf8")));
|
|
110
|
+
child.stderr?.on("data", (chunk) => addOutput(chunk.toString("utf8")));
|
|
111
|
+
child.on("error", (error) => finish(error));
|
|
112
|
+
child.on("exit", (code, exitSignal) => {
|
|
113
|
+
if (!settled) finish(/* @__PURE__ */ new Error(`Computer script worker exited before completion (${exitSignal ?? code ?? "unknown"}).`));
|
|
114
|
+
});
|
|
115
|
+
child.on("message", (rawMessage) => {
|
|
116
|
+
if (settled) return;
|
|
117
|
+
if (rawMessage.type === "log" && typeof rawMessage.message === "string") {
|
|
118
|
+
const line = `[${String(rawMessage.level)}] ${rawMessage.message}`;
|
|
119
|
+
if (addOutput(line)) logs.push(line);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (rawMessage.type === "program" && typeof rawMessage.id === "string" && (rawMessage.operation === "observe" || rawMessage.operation === "act")) {
|
|
123
|
+
operation = operation.then(async () => {
|
|
124
|
+
try {
|
|
125
|
+
const value = rawMessage.operation === "observe" ? await this.client.observe(controller.signal) : await this.client.act(rawMessage.payload, controller.signal);
|
|
126
|
+
child.send({
|
|
127
|
+
type: "response",
|
|
128
|
+
id: rawMessage.id,
|
|
129
|
+
value
|
|
130
|
+
});
|
|
131
|
+
} catch (error) {
|
|
132
|
+
child.send({
|
|
133
|
+
type: "response",
|
|
134
|
+
id: rawMessage.id,
|
|
135
|
+
error: error instanceof Error ? error.message : String(error)
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (rawMessage.type === "failed" && typeof rawMessage.error === "string") {
|
|
142
|
+
finish(new Error(rawMessage.error));
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
if (rawMessage.type === "complete") operation = operation.then(async () => {
|
|
146
|
+
const resultJson = rawMessage.resultJson;
|
|
147
|
+
if (resultJson !== void 0 && typeof resultJson !== "string") {
|
|
148
|
+
finish(/* @__PURE__ */ new Error("Computer script returned an invalid result."));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (typeof resultJson === "string" && !addOutput(resultJson)) return;
|
|
152
|
+
const observation = await this.client.observe(controller.signal);
|
|
153
|
+
finish(void 0, {
|
|
154
|
+
...typeof resultJson === "string" ? { result: JSON.parse(resultJson) } : {},
|
|
155
|
+
observation,
|
|
156
|
+
logs
|
|
157
|
+
});
|
|
158
|
+
}).catch((error) => finish(error instanceof Error ? error : new Error(String(error))));
|
|
159
|
+
});
|
|
160
|
+
child.send({
|
|
161
|
+
type: "start",
|
|
162
|
+
scriptPath: resolvedPath,
|
|
163
|
+
input: JSON.parse(serializedInput)
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
//#endregion
|
|
169
|
+
export { ComputerScriptRunner };
|
|
170
|
+
|
|
171
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/computerScriptRunner/index.ts"],"sourcesContent":["import { spawn } from 'node:child_process';\nimport { realpath } from 'node:fs/promises';\n\nimport type { ComputerScriptExecutionResult, ComputerScriptRunnerOptions } from '../../types/computerScript';\nimport type { ComputerUseAction } from '../../types/computerUse';\nimport type { ComputerUseSessionClient } from '../sessionApiClient';\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_OUTPUT_BYTES = 256 * 1024;\n\nconst WORKER_SOURCE = String.raw`\nimport { readFile } from 'node:fs/promises';\nimport { stripTypeScriptTypes } from 'node:module';\n\nlet nextRequestId = 0;\nconst pending = new Map();\nconst call = (operation, payload) => new Promise((resolve, reject) => {\n const id = String(++nextRequestId);\n pending.set(id, { resolve, reject });\n process.send({ type: 'program', id, operation, payload });\n});\nprocess.on('message', async (message) => {\n if (message?.type === 'response') {\n const request = pending.get(message.id);\n if (!request) return;\n pending.delete(message.id);\n if (message.error) request.reject(new Error(message.error));\n else request.resolve(message.value);\n return;\n }\n if (message?.type !== 'start') return;\n const controller = new AbortController();\n process.once('SIGTERM', () => controller.abort());\n const logger = Object.fromEntries(['debug', 'info', 'warn', 'error'].map((level) => [level, (value) => {\n process.send({ type: 'log', level, message: String(value) });\n }]));\n try {\n const source = await readFile(message.scriptPath, 'utf8');\n const compiled = stripTypeScriptTypes(source, { mode: 'strip' });\n const moduleUrl = 'data:text/javascript;base64,' + Buffer.from(compiled).toString('base64');\n const loaded = await import(moduleUrl);\n if (typeof loaded.run !== 'function') throw new Error('Computer script must export a named run function.');\n const program = {\n observe: () => call('observe'),\n act: (action) => call('act', action),\n };\n const result = await loaded.run({ context: { program }, input: message.input, logger, signal: controller.signal });\n const resultJson = result === undefined ? undefined : JSON.stringify(result);\n process.send({ type: 'complete', resultJson });\n } catch (error) {\n process.send({ type: 'failed', error: error instanceof Error ? error.message : String(error) });\n }\n});\n`;\n\ninterface WorkerMessage {\n readonly type?: unknown;\n readonly id?: unknown;\n readonly operation?: unknown;\n readonly payload?: unknown;\n readonly level?: unknown;\n readonly message?: unknown;\n readonly resultJson?: unknown;\n readonly error?: unknown;\n}\n\nexport class ComputerScriptRunner {\n private readonly client: ComputerUseSessionClient;\n private readonly allowedScriptPaths: readonly string[];\n private readonly timeoutMs: number;\n private readonly maxOutputBytes: number;\n\n public constructor(options: ComputerScriptRunnerOptions) {\n this.client = options.client;\n this.allowedScriptPaths = options.allowedScriptPaths;\n this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.maxOutputBytes = options.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES;\n }\n\n public async execute(\n scriptPath: string,\n input: unknown,\n signal?: AbortSignal,\n ): Promise<ComputerScriptExecutionResult> {\n const resolvedPath = await realpath(scriptPath);\n const allowedPaths = await Promise.all(\n this.allowedScriptPaths.map(async (candidate) => realpath(candidate).catch(() => '')),\n );\n if (!allowedPaths.includes(resolvedPath)) throw new Error('Computer script path is not explicitly allowed.');\n if (!resolvedPath.endsWith('.ts')) throw new Error('Computer scripts must be TypeScript files.');\n\n const serializedInput = JSON.stringify(input);\n if (serializedInput === undefined) throw new Error('Computer script input must be JSON serializable.');\n if (Buffer.byteLength(serializedInput) > this.maxOutputBytes)\n throw new Error('Computer script input exceeds the size limit.');\n\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, ['--input-type=module', '--eval', WORKER_SOURCE], {\n stdio: ['ignore', 'pipe', 'pipe', 'ipc'],\n });\n const controller = new AbortController();\n const logs: string[] = [];\n let outputBytes = 0;\n let settled = false;\n let operation = Promise.resolve();\n\n const terminate = (): void => {\n controller.abort();\n child.kill('SIGTERM');\n const killTimer = setTimeout(() => child.kill('SIGKILL'), 250);\n killTimer.unref?.();\n };\n const finish = (error?: Error, value?: ComputerScriptExecutionResult): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n signal?.removeEventListener('abort', onAbort);\n terminate();\n if (error !== undefined) reject(error);\n else resolve(value as ComputerScriptExecutionResult);\n };\n const addOutput = (value: string): boolean => {\n outputBytes += Buffer.byteLength(value);\n if (outputBytes <= this.maxOutputBytes) return true;\n finish(new Error('Computer script output exceeded the size limit.'));\n return false;\n };\n const onAbort = () => finish(new Error('Computer script execution was cancelled.'));\n const timeout = setTimeout(() => finish(new Error('Computer script execution timed out.')), this.timeoutMs);\n timeout.unref?.();\n signal?.addEventListener('abort', onAbort, { once: true });\n if (signal?.aborted === true) return onAbort();\n\n child.stdout?.on('data', (chunk: Buffer) => addOutput(chunk.toString('utf8')));\n child.stderr?.on('data', (chunk: Buffer) => addOutput(chunk.toString('utf8')));\n child.on('error', (error) => finish(error));\n child.on('exit', (code, exitSignal) => {\n if (!settled)\n finish(new Error(`Computer script worker exited before completion (${exitSignal ?? code ?? 'unknown'}).`));\n });\n child.on('message', (rawMessage: WorkerMessage) => {\n if (settled) return;\n if (rawMessage.type === 'log' && typeof rawMessage.message === 'string') {\n const line = `[${String(rawMessage.level)}] ${rawMessage.message}`;\n if (addOutput(line)) logs.push(line);\n return;\n }\n if (\n rawMessage.type === 'program' &&\n typeof rawMessage.id === 'string' &&\n (rawMessage.operation === 'observe' || rawMessage.operation === 'act')\n ) {\n operation = operation.then(async () => {\n try {\n const value =\n rawMessage.operation === 'observe'\n ? await this.client.observe(controller.signal)\n : await this.client.act(rawMessage.payload as ComputerUseAction, controller.signal);\n child.send({ type: 'response', id: rawMessage.id, value });\n } catch (error) {\n child.send({\n type: 'response',\n id: rawMessage.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n return;\n }\n if (rawMessage.type === 'failed' && typeof rawMessage.error === 'string') {\n finish(new Error(rawMessage.error));\n return;\n }\n if (rawMessage.type === 'complete') {\n operation = operation\n .then(async () => {\n const resultJson = rawMessage.resultJson;\n if (resultJson !== undefined && typeof resultJson !== 'string') {\n finish(new Error('Computer script returned an invalid result.'));\n return;\n }\n if (typeof resultJson === 'string' && !addOutput(resultJson)) return;\n const observation = await this.client.observe(controller.signal);\n finish(undefined, {\n ...(typeof resultJson === 'string' ? { result: JSON.parse(resultJson) as unknown } : {}),\n observation,\n logs,\n });\n })\n .catch((error: unknown) => finish(error instanceof Error ? error : new Error(String(error))));\n }\n });\n child.send({ type: 'start', scriptPath: resolvedPath, input: JSON.parse(serializedInput) as unknown });\n });\n }\n}\n"],"mappings":"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"}
|