@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,16 @@
|
|
|
1
|
+
//#region src/services/mcpTools/index.ts
|
|
2
|
+
const COMPUTER_USE_MCP_TOOLS_SERVICE = "doom/computer-use-mcp-tools";
|
|
3
|
+
function mountMcpTools(tools) {
|
|
4
|
+
return (context) => {
|
|
5
|
+
context.plugin((providerContext) => {
|
|
6
|
+
providerContext.provide(COMPUTER_USE_MCP_TOOLS_SERVICE, {
|
|
7
|
+
get: (name) => tools.find((tool) => tool.name === name),
|
|
8
|
+
names: () => tools.map((tool) => tool.name)
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { COMPUTER_USE_MCP_TOOLS_SERVICE, mountMcpTools };
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/mcpTools/index.ts"],"sourcesContent":["import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcp-facet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { COMPUTER_USE_MODE_ID } from '../../types/computerUseApi';\n\nexport const COMPUTER_USE_MCP_TOOLS_SERVICE = 'doom/computer-use-mcp-tools';\n\nconst MODE_LABEL = 'Computer Use';\n\nexport interface McpToolCatalog {\n get(name: string): DoomHeadlessTool | undefined;\n names(): readonly string[];\n}\n\nexport function mountMcpTools(tools: readonly DoomHeadlessTool[]) {\n return (context: Context): void => {\n context.plugin((providerContext) => {\n providerContext.provide(COMPUTER_USE_MCP_TOOLS_SERVICE, {\n get: (name) => tools.find((tool) => tool.name === name),\n names: () => tools.map((tool) => tool.name),\n } satisfies McpToolCatalog);\n });\n };\n}\n\nexport function bindMcpTool(context: DoomMcpPluginContext, name: string): DoomHeadlessTool {\n const catalog = context.services.get<McpToolCatalog>(COMPUTER_USE_MCP_TOOLS_SERVICE);\n const tool = catalog?.get(name);\n if (!tool || !catalog) throw new Error(`Computer use tool is unavailable: ${name}`);\n return {\n ...tool,\n execute(toolCallId, parameters, signal, onUpdate) {\n const activeModes = context.selection.read().state?.['minor-mode'] ?? [];\n if (!activeModes.includes(COMPUTER_USE_MODE_ID)) {\n const inactiveTools = [...catalog.names()].sort().join(', ');\n throw new Error(`${MODE_LABEL} minor mode is inactive. Inactive ${MODE_LABEL} tools: ${inactiveTools}.`);\n }\n const executionSignal = AbortSignal.any([context.signal, signal ?? context.signal]);\n return tool.execute(toolCallId, parameters, executionSignal, onUpdate, context.execution);\n },\n };\n}\n"],"mappings":";AAMA,MAAa,iCAAiC;AAS9C,SAAgB,cAAc,OAAoC;CAChE,QAAQ,YAA2B;EACjC,QAAQ,QAAQ,oBAAoB;GAClC,gBAAgB,QAAQ,gCAAgC;IACtD,MAAM,SAAS,MAAM,MAAM,SAAS,KAAK,SAAS,IAAI;IACtD,aAAa,MAAM,KAAK,SAAS,KAAK,IAAI;GAC5C,CAA0B;EAC5B,CAAC;CACH;AACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/services/sessionApiClient/index.ts
|
|
2
|
+
/** Uses the host-owned typed service directly. Internal package APIs are in-process. */
|
|
3
|
+
function createComputerUseSessionClient(host) {
|
|
4
|
+
return host;
|
|
5
|
+
}
|
|
6
|
+
//#endregion
|
|
7
|
+
exports.createComputerUseSessionClient = createComputerUseSessionClient;
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/services/sessionApiClient/index.ts"],"sourcesContent":["import type { ComputerUseAction, ComputerUseObservation } from '../../types/computerUse';\nimport type { ComputerUseSessionView } from '../../types/computerUseApi';\n\nexport interface ComputerUseSessionClient {\n state(signal?: AbortSignal): Promise<ComputerUseSessionView>;\n /** Subscribes to lifecycle-owned state changes, without polling the session API. */\n subscribeStatus?(listener: (state: ComputerUseSessionView) => void): () => void;\n observe(signal?: AbortSignal): Promise<ComputerUseObservation>;\n act(action: ComputerUseAction, signal?: AbortSignal): Promise<unknown>;\n stop(signal?: AbortSignal): Promise<ComputerUseSessionView>;\n}\n\n/** Uses the host-owned typed service directly. Internal package APIs are in-process. */\nexport function createComputerUseSessionClient(host?: ComputerUseSessionClient): ComputerUseSessionClient | undefined {\n return host;\n}\n"],"mappings":";;AAaA,SAAgB,+BAA+B,MAAuE;CACpH,OAAO;AACT"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ComputerUseAction, ComputerUseObservation } from "../../types/computerUse.cjs";
|
|
2
|
+
import { ComputerUseSessionView } from "../../types/computerUseApi.cjs";
|
|
3
|
+
//#region src/services/sessionApiClient/index.d.ts
|
|
4
|
+
export interface ComputerUseSessionClient {
|
|
5
|
+
state(signal?: AbortSignal): Promise<ComputerUseSessionView>;
|
|
6
|
+
/** Subscribes to lifecycle-owned state changes, without polling the session API. */
|
|
7
|
+
subscribeStatus?(listener: (state: ComputerUseSessionView) => void): () => void;
|
|
8
|
+
observe(signal?: AbortSignal): Promise<ComputerUseObservation>;
|
|
9
|
+
act(action: ComputerUseAction, signal?: AbortSignal): Promise<unknown>;
|
|
10
|
+
stop(signal?: AbortSignal): Promise<ComputerUseSessionView>;
|
|
11
|
+
}
|
|
12
|
+
/** Uses the host-owned typed service directly. Internal package APIs are in-process. */
|
|
13
|
+
export declare function createComputerUseSessionClient(host?: ComputerUseSessionClient): ComputerUseSessionClient | undefined;
|
|
14
|
+
//#endregion
|
|
15
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../../../src/services/sessionApiClient/index.ts"],"mappings":";;;iBAGiB;EACf,MAAM,SAAS,cAAc,QAAQ;;EAErC,iBAAiB,WAAW,OAAO;EACnC,QAAQ,SAAS,cAAc,QAAQ;EACvC,IAAI,QAAQ,mBAAmB,SAAS,cAAc;EACtD,KAAK,SAAS,cAAc,QAAQ;;;wBAItB,+BAA+B,OAAO,2BAA2B"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ComputerUseAction, ComputerUseObservation } from "../../types/computerUse.mjs";
|
|
2
|
+
import { ComputerUseSessionView } from "../../types/computerUseApi.mjs";
|
|
3
|
+
//#region src/services/sessionApiClient/index.d.ts
|
|
4
|
+
export interface ComputerUseSessionClient {
|
|
5
|
+
state(signal?: AbortSignal): Promise<ComputerUseSessionView>;
|
|
6
|
+
/** Subscribes to lifecycle-owned state changes, without polling the session API. */
|
|
7
|
+
subscribeStatus?(listener: (state: ComputerUseSessionView) => void): () => void;
|
|
8
|
+
observe(signal?: AbortSignal): Promise<ComputerUseObservation>;
|
|
9
|
+
act(action: ComputerUseAction, signal?: AbortSignal): Promise<unknown>;
|
|
10
|
+
stop(signal?: AbortSignal): Promise<ComputerUseSessionView>;
|
|
11
|
+
}
|
|
12
|
+
/** Uses the host-owned typed service directly. Internal package APIs are in-process. */
|
|
13
|
+
export declare function createComputerUseSessionClient(host?: ComputerUseSessionClient): ComputerUseSessionClient | undefined;
|
|
14
|
+
//#endregion
|
|
15
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/services/sessionApiClient/index.ts"],"mappings":";;;iBAGiB;EACf,MAAM,SAAS,cAAc,QAAQ;;EAErC,iBAAiB,WAAW,OAAO;EACnC,QAAQ,SAAS,cAAc,QAAQ;EACvC,IAAI,QAAQ,mBAAmB,SAAS,cAAc;EACtD,KAAK,SAAS,cAAc,QAAQ;;;wBAItB,+BAA+B,OAAO,2BAA2B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/services/sessionApiClient/index.ts
|
|
2
|
+
/** Uses the host-owned typed service directly. Internal package APIs are in-process. */
|
|
3
|
+
function createComputerUseSessionClient(host) {
|
|
4
|
+
return host;
|
|
5
|
+
}
|
|
6
|
+
//#endregion
|
|
7
|
+
export { createComputerUseSessionClient };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/sessionApiClient/index.ts"],"sourcesContent":["import type { ComputerUseAction, ComputerUseObservation } from '../../types/computerUse';\nimport type { ComputerUseSessionView } from '../../types/computerUseApi';\n\nexport interface ComputerUseSessionClient {\n state(signal?: AbortSignal): Promise<ComputerUseSessionView>;\n /** Subscribes to lifecycle-owned state changes, without polling the session API. */\n subscribeStatus?(listener: (state: ComputerUseSessionView) => void): () => void;\n observe(signal?: AbortSignal): Promise<ComputerUseObservation>;\n act(action: ComputerUseAction, signal?: AbortSignal): Promise<unknown>;\n stop(signal?: AbortSignal): Promise<ComputerUseSessionView>;\n}\n\n/** Uses the host-owned typed service directly. Internal package APIs are in-process. */\nexport function createComputerUseSessionClient(host?: ComputerUseSessionClient): ComputerUseSessionClient | undefined {\n return host;\n}\n"],"mappings":";;AAaA,SAAgB,+BAA+B,MAAuE;CACpH,OAAO;AACT"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/services/traceRedaction/index.ts
|
|
2
|
+
function redactComputerUseTrace(input) {
|
|
3
|
+
return {
|
|
4
|
+
sequence: input.sequence,
|
|
5
|
+
timestamp: input.timestamp,
|
|
6
|
+
runId: input.runId,
|
|
7
|
+
bundleId: input.bundleId,
|
|
8
|
+
actionKind: input.action.kind,
|
|
9
|
+
...input.role === void 0 ? {} : { role: input.role },
|
|
10
|
+
...input.action.kind === "set_value" ? { textLength: input.action.value.length } : {},
|
|
11
|
+
durationMs: input.durationMs,
|
|
12
|
+
outcome: input.outcome,
|
|
13
|
+
...input.errorCode === void 0 ? {} : { errorCode: input.errorCode }
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
exports.redactComputerUseTrace = redactComputerUseTrace;
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/services/traceRedaction/index.ts"],"sourcesContent":["import type { ComputerUseAction, ComputerUseFailureCode } from '../../types/computerUse';\n\nexport interface ComputerUseTraceInput {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly action: ComputerUseAction;\n readonly role?: string;\n readonly durationMs: number;\n readonly outcome: 'succeeded' | 'failed' | 'uncertain';\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport interface ComputerUseTraceRecord {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly actionKind: ComputerUseAction['kind'];\n readonly role?: string;\n readonly textLength?: number;\n readonly durationMs: number;\n readonly outcome: ComputerUseTraceInput['outcome'];\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord {\n return {\n sequence: input.sequence,\n timestamp: input.timestamp,\n runId: input.runId,\n bundleId: input.bundleId,\n actionKind: input.action.kind,\n ...(input.role === undefined ? {} : { role: input.role }),\n ...(input.action.kind === 'set_value' ? { textLength: input.action.value.length } : {}),\n durationMs: input.durationMs,\n outcome: input.outcome,\n ...(input.errorCode === undefined ? {} : { errorCode: input.errorCode }),\n };\n}\n"],"mappings":";AA2BA,SAAgB,uBAAuB,OAAsD;CAC3F,OAAO;EACL,UAAU,MAAM;EAChB,WAAW,MAAM;EACjB,OAAO,MAAM;EACb,UAAU,MAAM;EAChB,YAAY,MAAM,OAAO;EACzB,GAAI,MAAM,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK;EACvD,GAAI,MAAM,OAAO,SAAS,cAAc,EAAE,YAAY,MAAM,OAAO,MAAM,OAAO,IAAI,CAAC;EACrF,YAAY,MAAM;EAClB,SAAS,MAAM;EACf,GAAI,MAAM,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW,MAAM,UAAU;CACxE;AACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ComputerUseAction, ComputerUseFailureCode } from "
|
|
2
|
-
//#region src/services/traceRedaction.d.ts
|
|
3
|
-
interface ComputerUseTraceInput {
|
|
1
|
+
import { ComputerUseAction, ComputerUseFailureCode } from "../../types/computerUse.cjs";
|
|
2
|
+
//#region src/services/traceRedaction/index.d.ts
|
|
3
|
+
export interface ComputerUseTraceInput {
|
|
4
4
|
readonly sequence: number;
|
|
5
5
|
readonly timestamp: number;
|
|
6
6
|
readonly runId: string;
|
|
@@ -11,7 +11,7 @@ interface ComputerUseTraceInput {
|
|
|
11
11
|
readonly outcome: 'succeeded' | 'failed' | 'uncertain';
|
|
12
12
|
readonly errorCode?: ComputerUseFailureCode;
|
|
13
13
|
}
|
|
14
|
-
interface ComputerUseTraceRecord {
|
|
14
|
+
export interface ComputerUseTraceRecord {
|
|
15
15
|
readonly sequence: number;
|
|
16
16
|
readonly timestamp: number;
|
|
17
17
|
readonly runId: string;
|
|
@@ -23,7 +23,6 @@ interface ComputerUseTraceRecord {
|
|
|
23
23
|
readonly outcome: ComputerUseTraceInput['outcome'];
|
|
24
24
|
readonly errorCode?: ComputerUseFailureCode;
|
|
25
25
|
}
|
|
26
|
-
declare function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord;
|
|
26
|
+
export declare function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord;
|
|
27
27
|
//#endregion
|
|
28
|
-
|
|
29
|
-
//# sourceMappingURL=traceRedaction.d.mts.map
|
|
28
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../../../src/services/traceRedaction/index.ts"],"mappings":";;iBAEiB;WACN;WACA;WACA;WACA;WACA,QAAQ;WACR;WACA;WACA;WACA,YAAY;;iBAGN;WACN;WACA;WACA;WACA;WACA,YAAY;WACZ;WACA;WACA;WACA,SAAS;WACT,YAAY;;wBAGP,uBAAuB,OAAO,wBAAwB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { ComputerUseAction, ComputerUseFailureCode } from "
|
|
2
|
-
//#region src/services/traceRedaction.d.ts
|
|
3
|
-
interface ComputerUseTraceInput {
|
|
1
|
+
import { ComputerUseAction, ComputerUseFailureCode } from "../../types/computerUse.mjs";
|
|
2
|
+
//#region src/services/traceRedaction/index.d.ts
|
|
3
|
+
export interface ComputerUseTraceInput {
|
|
4
4
|
readonly sequence: number;
|
|
5
5
|
readonly timestamp: number;
|
|
6
6
|
readonly runId: string;
|
|
@@ -11,7 +11,7 @@ interface ComputerUseTraceInput {
|
|
|
11
11
|
readonly outcome: 'succeeded' | 'failed' | 'uncertain';
|
|
12
12
|
readonly errorCode?: ComputerUseFailureCode;
|
|
13
13
|
}
|
|
14
|
-
interface ComputerUseTraceRecord {
|
|
14
|
+
export interface ComputerUseTraceRecord {
|
|
15
15
|
readonly sequence: number;
|
|
16
16
|
readonly timestamp: number;
|
|
17
17
|
readonly runId: string;
|
|
@@ -23,7 +23,6 @@ interface ComputerUseTraceRecord {
|
|
|
23
23
|
readonly outcome: ComputerUseTraceInput['outcome'];
|
|
24
24
|
readonly errorCode?: ComputerUseFailureCode;
|
|
25
25
|
}
|
|
26
|
-
declare function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord;
|
|
26
|
+
export declare function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord;
|
|
27
27
|
//#endregion
|
|
28
|
-
|
|
29
|
-
//# sourceMappingURL=traceRedaction.d.cts.map
|
|
28
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../../../src/services/traceRedaction/index.ts"],"mappings":";;iBAEiB;WACN;WACA;WACA;WACA;WACA,QAAQ;WACR;WACA;WACA;WACA,YAAY;;iBAGN;WACN;WACA;WACA;WACA;WACA,YAAY;WACZ;WACA;WACA;WACA,SAAS;WACT,YAAY;;wBAGP,uBAAuB,OAAO,wBAAwB"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/services/traceRedaction/index.ts
|
|
2
|
+
function redactComputerUseTrace(input) {
|
|
3
|
+
return {
|
|
4
|
+
sequence: input.sequence,
|
|
5
|
+
timestamp: input.timestamp,
|
|
6
|
+
runId: input.runId,
|
|
7
|
+
bundleId: input.bundleId,
|
|
8
|
+
actionKind: input.action.kind,
|
|
9
|
+
...input.role === void 0 ? {} : { role: input.role },
|
|
10
|
+
...input.action.kind === "set_value" ? { textLength: input.action.value.length } : {},
|
|
11
|
+
durationMs: input.durationMs,
|
|
12
|
+
outcome: input.outcome,
|
|
13
|
+
...input.errorCode === void 0 ? {} : { errorCode: input.errorCode }
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { redactComputerUseTrace };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/traceRedaction/index.ts"],"sourcesContent":["import type { ComputerUseAction, ComputerUseFailureCode } from '../../types/computerUse';\n\nexport interface ComputerUseTraceInput {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly action: ComputerUseAction;\n readonly role?: string;\n readonly durationMs: number;\n readonly outcome: 'succeeded' | 'failed' | 'uncertain';\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport interface ComputerUseTraceRecord {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly actionKind: ComputerUseAction['kind'];\n readonly role?: string;\n readonly textLength?: number;\n readonly durationMs: number;\n readonly outcome: ComputerUseTraceInput['outcome'];\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord {\n return {\n sequence: input.sequence,\n timestamp: input.timestamp,\n runId: input.runId,\n bundleId: input.bundleId,\n actionKind: input.action.kind,\n ...(input.role === undefined ? {} : { role: input.role }),\n ...(input.action.kind === 'set_value' ? { textLength: input.action.value.length } : {}),\n durationMs: input.durationMs,\n outcome: input.outcome,\n ...(input.errorCode === undefined ? {} : { errorCode: input.errorCode }),\n };\n}\n"],"mappings":";AA2BA,SAAgB,uBAAuB,OAAsD;CAC3F,OAAO;EACL,UAAU,MAAM;EAChB,WAAW,MAAM;EACjB,OAAO,MAAM;EACb,UAAU,MAAM;EAChB,YAAY,MAAM,OAAO;EACzB,GAAI,MAAM,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,MAAM,KAAK;EACvD,GAAI,MAAM,OAAO,SAAS,cAAc,EAAE,YAAY,MAAM,OAAO,MAAM,OAAO,IAAI,CAAC;EACrF,YAAY,MAAM;EAClB,SAAS,MAAM;EACf,GAAI,MAAM,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,WAAW,MAAM,UAAU;CACxE;AACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require("../../types/computerUseApi.cjs");
|
|
2
|
+
//#region src/services/webComputerUseAvailability/index.ts
|
|
3
|
+
var MissingComputerUseApiError = class extends Error {};
|
|
4
|
+
function computerUseSessionApiError(status, value) {
|
|
5
|
+
const error = typeof value === "object" && value !== null && !Array.isArray(value) ? value.error : void 0;
|
|
6
|
+
const message = typeof error === "string" ? error : `HTTP ${String(status)}`;
|
|
7
|
+
return status === 404 && message === `No API 'computer-use' in this session.` ? new MissingComputerUseApiError(message) : new Error(message);
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
exports.MissingComputerUseApiError = MissingComputerUseApiError;
|
|
11
|
+
exports.computerUseSessionApiError = computerUseSessionApiError;
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../src/services/webComputerUseAvailability/index.ts"],"sourcesContent":["import { API_BASE_PATH } from '../../types/computerUseApi';\n\nexport class MissingComputerUseApiError extends Error {}\n\nexport function computerUseSessionApiError(status: number, value: unknown): Error {\n const error =\n typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>).error\n : undefined;\n const message = typeof error === 'string' ? error : `HTTP ${String(status)}`;\n return status === 404 && message === `No API '${API_BASE_PATH}' in this session.`\n ? new MissingComputerUseApiError(message)\n : new Error(message);\n}\n\nexport function missingComputerUseApiRetryAt(now: number): number {\n return now + 5_000;\n}\n"],"mappings":";;AAEA,IAAa,6BAAb,cAAgD,MAAM,CAAC;AAEvD,SAAgB,2BAA2B,QAAgB,OAAuB;CAChF,MAAM,QACJ,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAC9D,MAAkC,QACnC,KAAA;CACN,MAAM,UAAU,OAAO,UAAU,WAAW,QAAQ,QAAQ,OAAO,MAAM;CACzE,OAAO,WAAW,OAAO,YAAY,2CACjC,IAAI,2BAA2B,OAAO,IACtC,IAAI,MAAM,OAAO;AACvB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import "../../types/computerUseApi.mjs";
|
|
2
|
+
//#region src/services/webComputerUseAvailability/index.ts
|
|
3
|
+
var MissingComputerUseApiError = class extends Error {};
|
|
4
|
+
function computerUseSessionApiError(status, value) {
|
|
5
|
+
const error = typeof value === "object" && value !== null && !Array.isArray(value) ? value.error : void 0;
|
|
6
|
+
const message = typeof error === "string" ? error : `HTTP ${String(status)}`;
|
|
7
|
+
return status === 404 && message === `No API 'computer-use' in this session.` ? new MissingComputerUseApiError(message) : new Error(message);
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { MissingComputerUseApiError, computerUseSessionApiError };
|
|
11
|
+
|
|
12
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../../../src/services/webComputerUseAvailability/index.ts"],"sourcesContent":["import { API_BASE_PATH } from '../../types/computerUseApi';\n\nexport class MissingComputerUseApiError extends Error {}\n\nexport function computerUseSessionApiError(status: number, value: unknown): Error {\n const error =\n typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>).error\n : undefined;\n const message = typeof error === 'string' ? error : `HTTP ${String(status)}`;\n return status === 404 && message === `No API '${API_BASE_PATH}' in this session.`\n ? new MissingComputerUseApiError(message)\n : new Error(message);\n}\n\nexport function missingComputerUseApiRetryAt(now: number): number {\n return now + 5_000;\n}\n"],"mappings":";;AAEA,IAAa,6BAAb,cAAgD,MAAM,CAAC;AAEvD,SAAgB,2BAA2B,QAAgB,OAAuB;CAChF,MAAM,QACJ,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK,IAC9D,MAAkC,QACnC,KAAA;CACN,MAAM,UAAU,OAAO,UAAU,WAAW,QAAQ,QAAQ,OAAO,MAAM;CACzE,OAAO,WAAW,OAAO,YAAY,2CACjC,IAAI,2BAA2B,OAAO,IACtC,IAAI,MAAM,OAAO;AACvB"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
const require_computerUseApi = require("../../types/computerUseApi.cjs");
|
|
2
|
+
const require_index = require("../webComputerUseAvailability/index.cjs");
|
|
3
|
+
let node_crypto = require("node:crypto");
|
|
4
|
+
//#region src/services/webComputerUseChannel/index.ts
|
|
5
|
+
/** Computer use runs on the DoomPi Desktop host, so every other client declines it. */
|
|
6
|
+
const DESKTOP_UNAVAILABLE = "DoomPi Desktop computer use is unavailable.";
|
|
7
|
+
function record(value) {
|
|
8
|
+
return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
|
|
9
|
+
}
|
|
10
|
+
function command(value) {
|
|
11
|
+
const input = record(value);
|
|
12
|
+
return input?.action === "status" || input?.action === "targets" || input?.action === "stop" || input?.action === "artifacts" ? { action: input.action } : void 0;
|
|
13
|
+
}
|
|
14
|
+
async function responseJson(response) {
|
|
15
|
+
const value = await response.json();
|
|
16
|
+
if (!response.ok) throw require_index.computerUseSessionApiError(response.status, value);
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
function sessionState(value) {
|
|
20
|
+
const input = record(value);
|
|
21
|
+
if (typeof input?.sessionId !== "string" || typeof input.revision !== "number" || typeof input.wake !== "number" || ![
|
|
22
|
+
"inactive",
|
|
23
|
+
"awaiting_confirmation",
|
|
24
|
+
"activating",
|
|
25
|
+
"active",
|
|
26
|
+
"stopping",
|
|
27
|
+
"failed"
|
|
28
|
+
].includes(input.phase)) return void 0;
|
|
29
|
+
return input;
|
|
30
|
+
}
|
|
31
|
+
function createComputerUseChannel() {
|
|
32
|
+
let receiveCommand;
|
|
33
|
+
return {
|
|
34
|
+
frameType: require_computerUseApi.computerUseChannelType,
|
|
35
|
+
lifecycle: "hub",
|
|
36
|
+
start(host) {
|
|
37
|
+
const scopes = /* @__PURE__ */ new Map();
|
|
38
|
+
const latest = /* @__PURE__ */ new Map();
|
|
39
|
+
const targets = /* @__PURE__ */ new Map();
|
|
40
|
+
const grants = /* @__PURE__ */ new Map();
|
|
41
|
+
const subscriptions = /* @__PURE__ */ new Map();
|
|
42
|
+
const processing = /* @__PURE__ */ new Set();
|
|
43
|
+
let activeSessionId;
|
|
44
|
+
let closed = false;
|
|
45
|
+
const sessionRequest = async (scope, path, method = "GET", value) => host.requestSessionApi(scope, {
|
|
46
|
+
basePath: require_computerUseApi.API_BASE_PATH,
|
|
47
|
+
path,
|
|
48
|
+
method,
|
|
49
|
+
...value === void 0 ? {} : { body: JSON.stringify(value) }
|
|
50
|
+
});
|
|
51
|
+
const publish = (scope, state) => {
|
|
52
|
+
if (state.phase === "active" || state.phase === "activating" || state.phase === "stopping") activeSessionId = scope.sessionId;
|
|
53
|
+
else if (activeSessionId === scope.sessionId) {
|
|
54
|
+
activeSessionId = void 0;
|
|
55
|
+
grants.delete(scope.sessionId);
|
|
56
|
+
}
|
|
57
|
+
const payload = {
|
|
58
|
+
state,
|
|
59
|
+
targets: targets.get(scope.sessionId) ?? [],
|
|
60
|
+
...activeSessionId !== void 0 && activeSessionId !== scope.sessionId ? { busy: true } : {}
|
|
61
|
+
};
|
|
62
|
+
latest.set(scope.sessionId, payload);
|
|
63
|
+
host.publish(scope.sessionId, payload);
|
|
64
|
+
};
|
|
65
|
+
const refresh = async (scope) => {
|
|
66
|
+
const state = sessionState(await responseJson(await sessionRequest(scope, require_computerUseApi.COMPUTER_USE_ROUTES.hubState)));
|
|
67
|
+
if (state === void 0) throw new Error("Computer-use API returned an invalid session state.");
|
|
68
|
+
publish(scope, state);
|
|
69
|
+
return state;
|
|
70
|
+
};
|
|
71
|
+
const completePending = async (scope, pending) => {
|
|
72
|
+
if (!host.computerUse?.available) throw new Error(DESKTOP_UNAVAILABLE);
|
|
73
|
+
try {
|
|
74
|
+
const result = await host.computerUse.request(scope, {
|
|
75
|
+
operation: pending.operation,
|
|
76
|
+
payload: pending.operation === "act" ? {
|
|
77
|
+
grantId: pending.grantId,
|
|
78
|
+
sequence: pending.sequence,
|
|
79
|
+
action: pending.payload
|
|
80
|
+
} : { grantId: pending.grantId }
|
|
81
|
+
});
|
|
82
|
+
await responseJson(await sessionRequest(scope, require_computerUseApi.COMPUTER_USE_ROUTES.hubComplete, "POST", {
|
|
83
|
+
id: pending.id,
|
|
84
|
+
result
|
|
85
|
+
}));
|
|
86
|
+
} catch (error) {
|
|
87
|
+
await responseJson(await sessionRequest(scope, require_computerUseApi.COMPUTER_USE_ROUTES.hubComplete, "POST", {
|
|
88
|
+
id: pending.id,
|
|
89
|
+
error: error instanceof Error ? error.message : String(error)
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const stopSession = async (scope) => {
|
|
94
|
+
const authorization = await responseJson(await sessionRequest(scope, require_computerUseApi.COMPUTER_USE_ROUTES.hubAuthorization));
|
|
95
|
+
let artifact;
|
|
96
|
+
if (authorization !== null && host.computerUse?.available) try {
|
|
97
|
+
artifact = await host.computerUse.request(scope, {
|
|
98
|
+
operation: "stop",
|
|
99
|
+
payload: { grantId: authorization.grantId }
|
|
100
|
+
});
|
|
101
|
+
} catch (error) {
|
|
102
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
103
|
+
artifact = {
|
|
104
|
+
artifactId: (0, node_crypto.randomUUID)(),
|
|
105
|
+
status: "failed",
|
|
106
|
+
failure: {
|
|
107
|
+
code: "recording_failed",
|
|
108
|
+
message: message.slice(0, 512)
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
host.onNotice(`computer-use Desktop stop was already unavailable (${message})`);
|
|
112
|
+
}
|
|
113
|
+
await responseJson(await sessionRequest(scope, require_computerUseApi.COMPUTER_USE_ROUTES.hubStop, "POST", { artifact }));
|
|
114
|
+
grants.delete(scope.sessionId);
|
|
115
|
+
if (activeSessionId === scope.sessionId) activeSessionId = void 0;
|
|
116
|
+
};
|
|
117
|
+
const processScope = async (scope, announced) => {
|
|
118
|
+
if (closed || processing.has(scope.sessionId)) return;
|
|
119
|
+
processing.add(scope.sessionId);
|
|
120
|
+
try {
|
|
121
|
+
const state = announced ?? await refresh(scope);
|
|
122
|
+
if (state.phase === "active") {
|
|
123
|
+
if (!grants.has(scope.sessionId)) {
|
|
124
|
+
const authorization = await responseJson(await sessionRequest(scope, require_computerUseApi.COMPUTER_USE_ROUTES.hubAuthorization));
|
|
125
|
+
if (authorization !== null) grants.set(scope.sessionId, authorization.grantId);
|
|
126
|
+
}
|
|
127
|
+
const expired = typeof state.expiresAt === "number" && state.expiresAt <= Date.now();
|
|
128
|
+
let owned = false;
|
|
129
|
+
if (!expired && host.computerUse?.available) try {
|
|
130
|
+
owned = record(await host.computerUse.request(scope, { operation: "status" }))?.ownedBySession === true;
|
|
131
|
+
} catch {
|
|
132
|
+
owned = true;
|
|
133
|
+
}
|
|
134
|
+
if (expired || !owned) {
|
|
135
|
+
await stopSession(scope);
|
|
136
|
+
await refresh(scope);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (state.phase === "awaiting_confirmation" && (activeSessionId === void 0 || activeSessionId === scope.sessionId)) {
|
|
141
|
+
const activation = await responseJson(await sessionRequest(scope, require_computerUseApi.COMPUTER_USE_ROUTES.hubActivation));
|
|
142
|
+
if (activation !== null && !host.computerUse?.available) {
|
|
143
|
+
await responseJson(await sessionRequest(scope, require_computerUseApi.COMPUTER_USE_ROUTES.hubStop, "POST", { error: DESKTOP_UNAVAILABLE }));
|
|
144
|
+
await refresh(scope);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (activation !== null && host.computerUse?.available) {
|
|
148
|
+
activeSessionId = scope.sessionId;
|
|
149
|
+
try {
|
|
150
|
+
const hostResult = await host.computerUse.request(scope, {
|
|
151
|
+
operation: "activate",
|
|
152
|
+
payload: activation
|
|
153
|
+
});
|
|
154
|
+
await responseJson(await sessionRequest(scope, require_computerUseApi.COMPUTER_USE_ROUTES.hubStop, "POST", { host: hostResult }));
|
|
155
|
+
const grantId = record(hostResult)?.grantId;
|
|
156
|
+
if (typeof grantId === "string") grants.set(scope.sessionId, grantId);
|
|
157
|
+
} catch (error) {
|
|
158
|
+
activeSessionId = void 0;
|
|
159
|
+
await responseJson(await sessionRequest(scope, require_computerUseApi.COMPUTER_USE_ROUTES.hubStop, "POST", { error: error instanceof Error ? error.message : String(error) }));
|
|
160
|
+
}
|
|
161
|
+
await refresh(scope);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (state.phase === "stopping") {
|
|
165
|
+
await stopSession(scope);
|
|
166
|
+
await refresh(scope);
|
|
167
|
+
}
|
|
168
|
+
const pending = await responseJson(await sessionRequest(scope, require_computerUseApi.COMPUTER_USE_ROUTES.hubNext));
|
|
169
|
+
if (pending !== null) await completePending(scope, pending);
|
|
170
|
+
} catch (error) {
|
|
171
|
+
if (error instanceof require_index.MissingComputerUseApiError) latest.delete(scope.sessionId);
|
|
172
|
+
else host.onNotice(`computer-use state handling failed for ${scope.sessionId} (${error instanceof Error ? error.message : String(error)})`);
|
|
173
|
+
} finally {
|
|
174
|
+
processing.delete(scope.sessionId);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
const onState = (scope, payload) => {
|
|
178
|
+
const state = sessionState(payload);
|
|
179
|
+
if (state === void 0 || state.sessionId !== scope.sessionId) return;
|
|
180
|
+
publish(scope, state);
|
|
181
|
+
processScope(scope, state);
|
|
182
|
+
};
|
|
183
|
+
receiveCommand = (scope, payload) => {
|
|
184
|
+
const parsed = command(payload);
|
|
185
|
+
if (parsed === void 0) return;
|
|
186
|
+
(async () => {
|
|
187
|
+
try {
|
|
188
|
+
if (parsed.action === "targets") {
|
|
189
|
+
const result = host.computerUse?.available ? await host.computerUse.request(scope, { operation: "targets" }) : [];
|
|
190
|
+
targets.set(scope.sessionId, Array.isArray(result) ? result.filter((item) => record(item) !== void 0) : []);
|
|
191
|
+
} else if (parsed.action === "stop") await stopSession(scope);
|
|
192
|
+
await refresh(scope);
|
|
193
|
+
processScope(scope);
|
|
194
|
+
} catch (error) {
|
|
195
|
+
if (error instanceof require_index.MissingComputerUseApiError) latest.delete(scope.sessionId);
|
|
196
|
+
else host.onNotice(`computer-use command failed for ${scope.sessionId} (${error instanceof Error ? error.message : String(error)})`);
|
|
197
|
+
}
|
|
198
|
+
})();
|
|
199
|
+
};
|
|
200
|
+
return {
|
|
201
|
+
payloadFor: (scope) => latest.get(scope.sessionId),
|
|
202
|
+
sessionAdded(scope) {
|
|
203
|
+
scopes.set(scope.sessionId, scope);
|
|
204
|
+
const unsubscribe = host.directEvents.subscribe(require_computerUseApi.computerUseChannelType, scope.sessionId, (payload) => onState(scope, payload), { replayLatest: true });
|
|
205
|
+
subscriptions.set(scope.sessionId, unsubscribe);
|
|
206
|
+
processScope(scope);
|
|
207
|
+
},
|
|
208
|
+
sessionRemoved(sessionId) {
|
|
209
|
+
const scope = scopes.get(sessionId);
|
|
210
|
+
const grantId = grants.get(sessionId);
|
|
211
|
+
subscriptions.get(sessionId)?.();
|
|
212
|
+
subscriptions.delete(sessionId);
|
|
213
|
+
if (scope !== void 0 && grantId !== void 0 && host.computerUse?.available) host.computerUse.request(scope, {
|
|
214
|
+
operation: "stop",
|
|
215
|
+
payload: { grantId }
|
|
216
|
+
}).catch((error) => host.onNotice(`computer-use session cleanup failed (${error instanceof Error ? error.message : String(error)})`));
|
|
217
|
+
scopes.delete(sessionId);
|
|
218
|
+
latest.delete(sessionId);
|
|
219
|
+
targets.delete(sessionId);
|
|
220
|
+
grants.delete(sessionId);
|
|
221
|
+
processing.delete(sessionId);
|
|
222
|
+
if (activeSessionId === sessionId) activeSessionId = void 0;
|
|
223
|
+
},
|
|
224
|
+
close() {
|
|
225
|
+
closed = true;
|
|
226
|
+
for (const unsubscribe of subscriptions.values()) unsubscribe();
|
|
227
|
+
subscriptions.clear();
|
|
228
|
+
if (host.computerUse?.available) for (const [sessionId, grantId] of grants) {
|
|
229
|
+
const scope = scopes.get(sessionId);
|
|
230
|
+
if (scope !== void 0) host.computerUse.request(scope, {
|
|
231
|
+
operation: "stop",
|
|
232
|
+
payload: { grantId }
|
|
233
|
+
}).catch(() => void 0);
|
|
234
|
+
}
|
|
235
|
+
scopes.clear();
|
|
236
|
+
latest.clear();
|
|
237
|
+
targets.clear();
|
|
238
|
+
grants.clear();
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
},
|
|
242
|
+
receive(scope, payload) {
|
|
243
|
+
receiveCommand?.(scope, payload);
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
//#endregion
|
|
248
|
+
exports.computerUseChannelType = require_computerUseApi.computerUseChannelType;
|
|
249
|
+
exports.createComputerUseChannel = createComputerUseChannel;
|
|
250
|
+
|
|
251
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["computerUseSessionApiError","computerUseChannelType","API_BASE_PATH","COMPUTER_USE_ROUTES","randomUUID","MissingComputerUseApiError"],"sources":["../../../../src/services/webComputerUseChannel/index.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { DoomHubChannelSource, DoomHubSessionScope, DoomHubChannel } from '@agimon-ai/doompi-core/hub-channel';\n\nimport { computerUseSessionApiError, MissingComputerUseApiError } from '../../services/webComputerUseAvailability';\nimport {\n API_BASE_PATH,\n computerUseChannelType,\n COMPUTER_USE_ROUTES,\n type ComputerUseActivationRequest,\n type ComputerUseBrokerRequest,\n type ComputerUseBrowserCommand,\n type ComputerUseChannelPayload,\n type ComputerUseSessionView,\n} from '../../types/computerUseApi';\nexport { computerUseChannelType };\n\n/** Computer use runs on the DoomPi Desktop host, so every other client declines it. */\nconst DESKTOP_UNAVAILABLE = 'DoomPi Desktop computer use is unavailable.';\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction command(value: unknown): ComputerUseBrowserCommand | undefined {\n const input = record(value);\n return input?.action === 'status' ||\n input?.action === 'targets' ||\n input?.action === 'stop' ||\n input?.action === 'artifacts'\n ? { action: input.action }\n : undefined;\n}\n\nasync function responseJson(response: Response): Promise<unknown> {\n const value = await response.json();\n if (!response.ok) throw computerUseSessionApiError(response.status, value);\n return value;\n}\n\nfunction sessionState(value: unknown): ComputerUseSessionView | undefined {\n const input = record(value);\n if (\n typeof input?.sessionId !== 'string' ||\n typeof input.revision !== 'number' ||\n typeof input.wake !== 'number' ||\n !['inactive', 'awaiting_confirmation', 'activating', 'active', 'stopping', 'failed'].includes(input.phase as string)\n )\n return undefined;\n return input as unknown as ComputerUseSessionView;\n}\n\nexport function createComputerUseChannel(): DoomHubChannel {\n let receiveCommand: ((scope: DoomHubSessionScope, payload: unknown) => void) | undefined;\n return {\n frameType: computerUseChannelType,\n lifecycle: 'hub',\n start(host) {\n const scopes = new Map<string, DoomHubSessionScope>();\n const latest = new Map<string, ComputerUseChannelPayload>();\n const targets = new Map<string, readonly Record<string, unknown>[]>();\n const grants = new Map<string, string>();\n const subscriptions = new Map<string, () => void>();\n const processing = new Set<string>();\n let activeSessionId: string | undefined;\n let closed = false;\n\n const sessionRequest = async (scope: DoomHubSessionScope, path: string, method = 'GET', value?: unknown) =>\n host.requestSessionApi(scope, {\n basePath: API_BASE_PATH,\n path,\n method,\n ...(value === undefined ? {} : { body: JSON.stringify(value) }),\n });\n\n const publish = (scope: DoomHubSessionScope, state: ComputerUseSessionView): void => {\n if (state.phase === 'active' || state.phase === 'activating' || state.phase === 'stopping') {\n activeSessionId = scope.sessionId;\n } else if (activeSessionId === scope.sessionId) {\n activeSessionId = undefined;\n grants.delete(scope.sessionId);\n }\n const payload: ComputerUseChannelPayload = {\n state,\n targets: targets.get(scope.sessionId) ?? [],\n ...(activeSessionId !== undefined && activeSessionId !== scope.sessionId ? { busy: true } : {}),\n };\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, payload);\n };\n\n const refresh = async (scope: DoomHubSessionScope): Promise<ComputerUseSessionView> => {\n const state = sessionState(await responseJson(await sessionRequest(scope, COMPUTER_USE_ROUTES.hubState)));\n if (state === undefined) throw new Error('Computer-use API returned an invalid session state.');\n publish(scope, state);\n return state;\n };\n\n const completePending = async (scope: DoomHubSessionScope, pending: ComputerUseBrokerRequest): Promise<void> => {\n if (!host.computerUse?.available) throw new Error(DESKTOP_UNAVAILABLE);\n try {\n const result = await host.computerUse.request(scope, {\n operation: pending.operation,\n payload:\n pending.operation === 'act'\n ? { grantId: pending.grantId, sequence: pending.sequence, action: pending.payload }\n : { grantId: pending.grantId },\n });\n await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubComplete, 'POST', { id: pending.id, result }),\n );\n } catch (error) {\n await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubComplete, 'POST', {\n id: pending.id,\n error: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n };\n\n const stopSession = async (scope: DoomHubSessionScope): Promise<void> => {\n const authorization = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubAuthorization),\n )) as { grantId: string } | null;\n let artifact: unknown;\n if (authorization !== null && host.computerUse?.available) {\n try {\n artifact = await host.computerUse.request(scope, {\n operation: 'stop',\n payload: { grantId: authorization.grantId },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n artifact = {\n artifactId: randomUUID(),\n status: 'failed',\n failure: { code: 'recording_failed', message: message.slice(0, 512) },\n };\n host.onNotice(`computer-use Desktop stop was already unavailable (${message})`);\n }\n }\n await responseJson(await sessionRequest(scope, COMPUTER_USE_ROUTES.hubStop, 'POST', { artifact }));\n grants.delete(scope.sessionId);\n if (activeSessionId === scope.sessionId) activeSessionId = undefined;\n };\n\n const processScope = async (scope: DoomHubSessionScope, announced?: ComputerUseSessionView): Promise<void> => {\n if (closed || processing.has(scope.sessionId)) return;\n processing.add(scope.sessionId);\n try {\n const state = announced ?? (await refresh(scope));\n if (state.phase === 'active') {\n if (!grants.has(scope.sessionId)) {\n const authorization = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubAuthorization),\n )) as { grantId: string } | null;\n if (authorization !== null) grants.set(scope.sessionId, authorization.grantId);\n }\n const expired = typeof state.expiresAt === 'number' && state.expiresAt <= Date.now();\n let owned = false;\n if (!expired && host.computerUse?.available) {\n try {\n const hostStatus = record(await host.computerUse.request(scope, { operation: 'status' }));\n owned = hostStatus?.ownedBySession === true;\n } catch {\n owned = true;\n }\n }\n if (expired || !owned) {\n await stopSession(scope);\n await refresh(scope);\n return;\n }\n }\n if (\n state.phase === 'awaiting_confirmation' &&\n (activeSessionId === undefined || activeSessionId === scope.sessionId)\n ) {\n const activation = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubActivation),\n )) as ComputerUseActivationRequest | null;\n if (activation !== null && !host.computerUse?.available) {\n // No desktop host: decline through the API's own failure path so the browser\n // shows why, instead of leaving the request pending or raising a server error.\n await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubStop, 'POST', { error: DESKTOP_UNAVAILABLE }),\n );\n await refresh(scope);\n return;\n }\n if (activation !== null && host.computerUse?.available) {\n activeSessionId = scope.sessionId;\n try {\n const hostResult = await host.computerUse.request(scope, {\n operation: 'activate',\n payload: activation,\n });\n await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubStop, 'POST', { host: hostResult }),\n );\n const grantId = record(hostResult)?.grantId;\n if (typeof grantId === 'string') grants.set(scope.sessionId, grantId);\n } catch (error) {\n activeSessionId = undefined;\n await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubStop, 'POST', {\n error: error instanceof Error ? error.message : String(error),\n }),\n );\n }\n await refresh(scope);\n }\n }\n if (state.phase === 'stopping') {\n await stopSession(scope);\n await refresh(scope);\n }\n const pending = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubNext),\n )) as ComputerUseBrokerRequest | null;\n if (pending !== null) await completePending(scope, pending);\n } catch (error) {\n if (error instanceof MissingComputerUseApiError) {\n latest.delete(scope.sessionId);\n } else {\n host.onNotice(\n `computer-use state handling failed for ${scope.sessionId} (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n } finally {\n processing.delete(scope.sessionId);\n }\n };\n\n const onState = (scope: DoomHubSessionScope, payload: unknown): void => {\n const state = sessionState(payload);\n if (state === undefined || state.sessionId !== scope.sessionId) return;\n publish(scope, state);\n void processScope(scope, state);\n };\n\n receiveCommand = (scope, payload) => {\n const parsed = command(payload);\n if (parsed === undefined) return;\n void (async () => {\n try {\n if (parsed.action === 'targets') {\n // Without a desktop host there is nothing to capture, so the browser sees an\n // empty target list rather than an error it cannot act on.\n const result = host.computerUse?.available\n ? await host.computerUse.request(scope, { operation: 'targets' })\n : [];\n targets.set(\n scope.sessionId,\n Array.isArray(result)\n ? result.filter((item): item is Record<string, unknown> => record(item) !== undefined)\n : [],\n );\n } else if (parsed.action === 'stop') {\n await stopSession(scope);\n }\n await refresh(scope);\n void processScope(scope);\n } catch (error) {\n if (error instanceof MissingComputerUseApiError) {\n latest.delete(scope.sessionId);\n } else {\n host.onNotice(\n `computer-use command failed for ${scope.sessionId} (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n }\n })();\n };\n\n const source: DoomHubChannelSource = {\n payloadFor: (scope) => latest.get(scope.sessionId),\n sessionAdded(scope) {\n scopes.set(scope.sessionId, scope);\n const unsubscribe = host.directEvents.subscribe(\n computerUseChannelType,\n scope.sessionId,\n (payload) => onState(scope, payload),\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n void processScope(scope);\n },\n sessionRemoved(sessionId) {\n const scope = scopes.get(sessionId);\n const grantId = grants.get(sessionId);\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n if (scope !== undefined && grantId !== undefined && host.computerUse?.available) {\n void host.computerUse\n .request(scope, { operation: 'stop', payload: { grantId } })\n .catch((error: unknown) =>\n host.onNotice(\n `computer-use session cleanup failed (${error instanceof Error ? error.message : String(error)})`,\n ),\n );\n }\n scopes.delete(sessionId);\n latest.delete(sessionId);\n targets.delete(sessionId);\n grants.delete(sessionId);\n processing.delete(sessionId);\n if (activeSessionId === sessionId) activeSessionId = undefined;\n },\n close() {\n closed = true;\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n if (host.computerUse?.available) {\n for (const [sessionId, grantId] of grants) {\n const scope = scopes.get(sessionId);\n if (scope !== undefined)\n void host.computerUse\n .request(scope, { operation: 'stop', payload: { grantId } })\n .catch(() => undefined);\n }\n }\n scopes.clear();\n latest.clear();\n targets.clear();\n grants.clear();\n },\n };\n return source;\n },\n receive(scope, payload) {\n receiveCommand?.(scope, payload);\n },\n };\n}\n"],"mappings":"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"}
|