@agimon-ai/doompi-computer-use 0.0.1-alpha.13 → 0.0.1-alpha.14
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 +5 -1
- package/dist/api-contracts.cjs +1 -0
- package/dist/api-contracts.d.cts +2 -0
- package/dist/api-contracts.d.mts +2 -0
- package/dist/api-contracts.mjs +1 -0
- package/dist/constants/computerUse.cjs +3 -0
- package/dist/constants/computerUse.cjs.map +1 -0
- package/dist/{adapters/pi/extension.d.cts → constants/computerUse.d.cts} +3 -10
- package/dist/constants/computerUse.d.cts.map +1 -0
- package/dist/{adapters/pi/extension.d.mts → constants/computerUse.d.mts} +3 -10
- package/dist/constants/computerUse.d.mts.map +1 -0
- package/dist/constants/computerUse.mjs +3 -0
- package/dist/constants/computerUse.mjs.map +1 -0
- package/dist/controllers/computerUseApi.cjs +2 -0
- package/dist/controllers/computerUseApi.cjs.map +1 -0
- package/dist/controllers/computerUseApi.mjs +2 -0
- package/dist/controllers/computerUseApi.mjs.map +1 -0
- package/dist/controllers/computerUseCommand.cjs +2 -0
- package/dist/controllers/computerUseCommand.cjs.map +1 -0
- package/dist/controllers/computerUseCommand.mjs +2 -0
- package/dist/controllers/computerUseCommand.mjs.map +1 -0
- package/dist/controllers/computerUseRuntime.cjs +2 -0
- package/dist/controllers/computerUseRuntime.cjs.map +1 -0
- package/dist/controllers/computerUseRuntime.mjs +2 -0
- package/dist/controllers/computerUseRuntime.mjs.map +1 -0
- package/dist/controllers/computerUseServer.cjs +3 -0
- package/dist/controllers/computerUseServer.cjs.map +1 -0
- package/dist/controllers/computerUseServer.mjs +3 -0
- package/dist/controllers/computerUseServer.mjs.map +1 -0
- package/dist/controllers/webComputerUseChannel.cjs +2 -0
- package/dist/controllers/webComputerUseChannel.cjs.map +1 -0
- package/dist/controllers/webComputerUseChannel.mjs +2 -0
- package/dist/controllers/webComputerUseChannel.mjs.map +1 -0
- package/dist/extensions/pi.cjs +2 -1
- package/dist/extensions/pi.cjs.map +1 -0
- package/dist/extensions/pi.d.cts +6 -2
- package/dist/extensions/pi.d.cts.map +1 -0
- package/dist/extensions/pi.d.mts +6 -2
- package/dist/extensions/pi.d.mts.map +1 -0
- package/dist/extensions/pi.mjs +2 -1
- package/dist/extensions/pi.mjs.map +1 -0
- package/dist/extensions/server.cjs +2 -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 +2 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +9 -9
- package/dist/index.d.mts +9 -9
- package/dist/index.mjs +1 -1
- package/dist/models/computerUseMode.cjs +2 -0
- package/dist/models/computerUseMode.cjs.map +1 -0
- package/dist/models/computerUseMode.mjs +2 -0
- package/dist/models/computerUseMode.mjs.map +1 -0
- package/dist/{services/sessionController.cjs → models/computerUseState.cjs} +1 -1
- package/dist/models/computerUseState.cjs.map +1 -0
- package/dist/{services/sessionController.d.cts → models/computerUseState.d.cts} +2 -2
- package/dist/models/computerUseState.d.cts.map +1 -0
- package/dist/{services/sessionController.d.mts → models/computerUseState.d.mts} +2 -2
- package/dist/models/computerUseState.d.mts.map +1 -0
- package/dist/{services/sessionController.mjs → models/computerUseState.mjs} +1 -1
- package/dist/models/computerUseState.mjs.map +1 -0
- package/dist/schemas/apiContracts.cjs +2 -0
- package/dist/schemas/apiContracts.cjs.map +1 -0
- package/dist/schemas/apiContracts.d.cts +53 -0
- package/dist/schemas/apiContracts.d.cts.map +1 -0
- package/dist/schemas/apiContracts.d.mts +53 -0
- package/dist/schemas/apiContracts.d.mts.map +1 -0
- package/dist/schemas/apiContracts.mjs +2 -0
- package/dist/schemas/apiContracts.mjs.map +1 -0
- package/dist/{adapters/pi/computerScriptRunner.cjs → services/computerScriptRunner/index.cjs} +1 -1
- package/dist/{adapters/pi/computerScriptRunner.mjs.map → services/computerScriptRunner/index.cjs.map} +1 -1
- package/dist/{adapters/pi/computerScriptRunner.d.cts → services/computerScriptRunner/index.d.cts} +2 -2
- package/dist/services/computerScriptRunner/index.d.cts.map +1 -0
- package/dist/{adapters/pi/computerScriptRunner.d.mts → services/computerScriptRunner/index.d.mts} +2 -2
- package/dist/services/computerScriptRunner/index.d.mts.map +1 -0
- package/dist/{adapters/pi/computerScriptRunner.mjs → services/computerScriptRunner/index.mjs} +1 -1
- package/dist/services/computerScriptRunner/index.mjs.map +1 -0
- package/dist/services/dependencies/index.cjs +2 -0
- package/dist/services/dependencies/index.cjs.map +1 -0
- package/dist/services/dependencies/index.d.cts +6 -0
- package/dist/services/dependencies/index.d.cts.map +1 -0
- package/dist/services/dependencies/index.d.mts +6 -0
- package/dist/services/dependencies/index.d.mts.map +1 -0
- package/dist/services/dependencies/index.mjs +2 -0
- package/dist/services/dependencies/index.mjs.map +1 -0
- package/dist/services/{extensionService.cjs → extensionService/index.cjs} +1 -1
- package/dist/services/extensionService/index.cjs.map +1 -0
- package/dist/services/{extensionService.d.mts → extensionService/index.d.cts} +4 -4
- package/dist/services/extensionService/index.d.cts.map +1 -0
- package/dist/services/{extensionService.d.cts → extensionService/index.d.mts} +4 -4
- package/dist/services/extensionService/index.d.mts.map +1 -0
- package/dist/services/{extensionService.mjs → extensionService/index.mjs} +1 -1
- package/dist/services/extensionService/index.mjs.map +1 -0
- package/dist/services/sessionApiClient/index.cjs +2 -0
- package/dist/services/sessionApiClient/index.cjs.map +1 -0
- package/dist/services/sessionApiClient/index.d.cts +15 -0
- package/dist/services/sessionApiClient/index.d.cts.map +1 -0
- package/dist/services/sessionApiClient/index.d.mts +15 -0
- package/dist/services/sessionApiClient/index.d.mts.map +1 -0
- package/dist/services/sessionApiClient/index.mjs +2 -0
- package/dist/services/sessionApiClient/index.mjs.map +1 -0
- package/dist/services/{traceRedaction.cjs → traceRedaction/index.cjs} +1 -1
- package/dist/services/{traceRedaction.cjs.map → traceRedaction/index.cjs.map} +1 -1
- package/dist/services/{traceRedaction.d.cts → traceRedaction/index.d.cts} +3 -3
- package/dist/services/traceRedaction/index.d.cts.map +1 -0
- package/dist/services/{traceRedaction.d.mts → traceRedaction/index.d.mts} +3 -3
- package/dist/services/traceRedaction/index.d.mts.map +1 -0
- package/dist/services/{traceRedaction.mjs → traceRedaction/index.mjs} +1 -1
- package/dist/services/{traceRedaction.mjs.map → traceRedaction/index.mjs.map} +1 -1
- package/dist/services/webComputerUseAvailability/index.cjs +2 -0
- package/dist/services/webComputerUseAvailability/index.cjs.map +1 -0
- package/dist/services/webComputerUseAvailability/index.mjs +2 -0
- package/dist/services/webComputerUseAvailability/index.mjs.map +1 -0
- package/dist/types/computerScript.d.cts +1 -1
- package/dist/types/computerScript.d.mts +1 -1
- package/dist/types/computerUseApi.cjs.map +1 -1
- package/dist/types/computerUseApi.d.cts +1 -1
- package/dist/types/computerUseApi.d.mts +1 -1
- package/dist/types/computerUseApi.mjs.map +1 -1
- package/dist/types/extension.d.cts +1 -1
- package/dist/types/extension.d.mts +1 -1
- package/package.json +29 -21
- package/src/extensions/web.ts +51 -0
- package/src/types/computerUseApi.ts +2 -2
- package/src/web/components/ComputerActionToolCard.tsx +3 -2
- package/src/web/components/ComputerExecToolCard.tsx +3 -2
- package/src/web/components/ComputerStateToolCard.tsx +3 -2
- package/src/web/components/ComputerUsePanel.tsx +4 -3
- package/src/web/lib/computerActionToolRender.ts +1 -1
- package/src/web/lib/computerExecToolRender.ts +1 -1
- package/src/web/lib/computerStateToolRender.ts +1 -1
- package/src/web/lib/computerUseSettings.ts +1 -1
- package/src/web/stores/computerUseStore.ts +4 -3
- package/src/web/tsconfig.json +1 -7
- package/dist/adapters/computerUseApi.cjs +0 -2
- package/dist/adapters/computerUseApi.cjs.map +0 -1
- package/dist/adapters/computerUseApi.d.cts +0 -41
- package/dist/adapters/computerUseApi.d.cts.map +0 -1
- package/dist/adapters/computerUseApi.d.mts +0 -41
- 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/computerScriptRunner.cjs.map +0 -1
- package/dist/adapters/pi/computerScriptRunner.d.cts.map +0 -1
- package/dist/adapters/pi/computerScriptRunner.d.mts.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.map +0 -1
- 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 -25
- package/dist/adapters/pi/sessionApiClient.d.cts.map +0 -1
- package/dist/adapters/pi/sessionApiClient.d.mts +0 -25
- 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.map +0 -1
- package/dist/services/extensionService.d.cts.map +0 -1
- package/dist/services/extensionService.d.mts.map +0 -1
- package/dist/services/extensionService.mjs.map +0 -1
- package/dist/services/sessionController.cjs.map +0 -1
- package/dist/services/sessionController.d.cts.map +0 -1
- package/dist/services/sessionController.d.mts.map +0 -1
- package/dist/services/sessionController.mjs.map +0 -1
- package/dist/services/traceRedaction.d.cts.map +0 -1
- package/dist/services/traceRedaction.d.mts.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/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/index.ts +0 -47
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extension.cjs","names":["createComputerUseContainer","COMPUTER_USE_MODE_STATUS_KEY","COMPUTER_USE_STATUS_KEY","DOOM_MINOR_MODE_CATALOG_SERVICE","requireMinorModeCatalog","registerMinorModeOwner","COMPUTER_USE_MODE_ID","connectDoomCordisHost"],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import { connectDoomCordisHost } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n type MinorModeOwnerHandle,\n type MinorModeState,\n registerMinorModeOwner,\n requireMinorModeCatalog,\n} from '@agimon-ai/doompi-extension-contracts/mode';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { registerComputerUseCommand } from '../../commands/computerUseCommand.ts';\nimport { createComputerUseContainer } from '../../container/index.ts';\nimport {\n COMPUTER_USE_MODE_ID,\n COMPUTER_USE_MODE_STATUS_KEY,\n COMPUTER_USE_STATUS_KEY,\n type ComputerUseSessionView,\n} from '../../types/computerUseApi.ts';\nimport type { ComputerUseAction } from '../../types/computerUse.ts';\nimport type { ComputerUseExtensionDependencies } from '../../types/extension.ts';\n\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-computer-use';\nexport { COMPUTER_USE_MODE_ID };\nexport const COMPUTER_USE_TOOL_NAMES = ['computer_state', 'computer_action', 'computer_exec'] as const;\nexport const COMPUTER_USE_GUIDANCE = `[COMPUTER USE ACTIVE]\nUse computer_state before acting and after any action that may change the interface. Use only element refs and snapshot ids returned by computer_state. Use computer_action for one semantic press, focus, set_value, or scroll at a time. Use computer_exec only for a trusted, explicitly allowed local TypeScript script. Never infer coordinates, inspect another application, bypass secure elements, or retry an uncertain outcome. Stop computer use when the task is complete.`;\n\nexport function modeState(state?: ComputerUseSessionView, enabled = false): MinorModeState {\n const phase = state?.phase ?? 'inactive';\n const running = phase !== 'inactive' && phase !== 'failed';\n const modeEnabled = enabled || running;\n const activation = modeEnabled\n ? phase === 'stopping'\n ? 'deactivating'\n : phase === 'awaiting_confirmation' || phase === 'activating'\n ? 'activating'\n : 'active'\n : 'inactive';\n return {\n activation,\n condition:\n phase === 'awaiting_confirmation'\n ? 'blocked'\n : phase === 'failed'\n ? 'failed'\n : phase === 'activating' || phase === 'stopping'\n ? 'queued'\n : 'ready',\n ...(modeEnabled && phase === 'inactive' ? { detail: 'configure computer use in Activity' } : {}),\n ...(phase === 'awaiting_confirmation' ? { detail: 'awaiting confirmation in Activity' } : {}),\n actions: [\n {\n id: 'activate',\n enabled: !modeEnabled,\n ...(!modeEnabled ? {} : { disabledReason: 'Computer use is already enabled.' }),\n },\n {\n id: 'deactivate',\n enabled: modeEnabled,\n ...(modeEnabled ? {} : { disabledReason: 'Computer use is not enabled.' }),\n },\n { id: 'doctor', enabled: true },\n ],\n };\n}\n\nexport function reconcileTools(pi: Pick<ExtensionAPI, 'getActiveTools' | 'setActiveTools'>, active: boolean): void {\n const owned = new Set<string>(COMPUTER_USE_TOOL_NAMES);\n const current = pi.getActiveTools();\n const next = current.filter((name) => !owned.has(name));\n if (active) next.push(...COMPUTER_USE_TOOL_NAMES);\n if (next.length !== current.length || next.some((name, index) => name !== current[index])) pi.setActiveTools(next);\n}\n\nexport function installComputerUseRuntime(\n cordis: Context,\n pi: ExtensionAPI,\n dependencies: ComputerUseExtensionDependencies = createComputerUseContainer(),\n): void {\n const client = dependencies.client;\n let state: ComputerUseSessionView | undefined;\n let enabled = false;\n let globallyEnabled = false;\n let mode: MinorModeOwnerHandle | undefined;\n let syncModeOwner = (): void => undefined;\n let timer: ReturnType<typeof setInterval> | undefined;\n let activeContext: ExtensionContext | undefined;\n let publishedMode = '';\n let publishedModeStatus: string | undefined;\n let publishedActivityStatus: string | undefined;\n const publish = (): void => {\n const phase = state?.phase ?? 'inactive';\n const projection = `${enabled}:${phase}:${state?.revision ?? 'none'}`;\n if (mode !== undefined && projection !== publishedMode) {\n mode.publish(modeState(state, enabled));\n publishedMode = projection;\n }\n const modeStatus = state === undefined ? undefined : enabled || phase !== 'inactive' ? phase : '';\n if (activeContext !== undefined && modeStatus !== publishedModeStatus) {\n activeContext.ui.setStatus(COMPUTER_USE_MODE_STATUS_KEY, modeStatus);\n publishedModeStatus = modeStatus;\n }\n const activityStatus = enabled || phase !== 'inactive' ? `computer use: ${phase}` : undefined;\n if (activeContext !== undefined && activityStatus !== publishedActivityStatus) {\n activeContext.ui.setStatus(COMPUTER_USE_STATUS_KEY, activityStatus);\n publishedActivityStatus = activityStatus;\n }\n };\n const refresh = async (): Promise<void> => {\n let nextGloballyEnabled = false;\n try {\n nextGloballyEnabled = (await dependencies.enabled?.()) === true;\n } catch {\n nextGloballyEnabled = false;\n }\n if (nextGloballyEnabled !== globallyEnabled) {\n globallyEnabled = nextGloballyEnabled;\n if (!globallyEnabled) {\n if (client !== undefined && state !== undefined && state.phase !== 'inactive' && state.phase !== 'failed') {\n try {\n await client.stop();\n } catch {\n // The global opt-in is still authoritative even when remote cleanup fails.\n }\n }\n enabled = false;\n state = undefined;\n reconcileTools(pi, false);\n }\n syncModeOwner();\n }\n if (!globallyEnabled || client === undefined) {\n state = undefined;\n reconcileTools(pi, false);\n publish();\n return;\n }\n try {\n state = await client.state();\n reconcileTools(pi, state.phase === 'active');\n publish();\n } catch {\n state = undefined;\n reconcileTools(pi, false);\n publish();\n }\n };\n\n pi.registerTool({\n name: 'computer_state',\n label: 'Computer State',\n description: 'Observe the authorized application window and return its semantic accessibility state.',\n promptSnippet: 'Observe the authorized application before choosing a semantic action',\n parameters: { type: 'object', properties: {}, additionalProperties: false },\n async execute(_toolCallId, _params, signal) {\n if (!globallyEnabled || client === undefined || state?.phase !== 'active')\n throw new Error('Computer use is not active for this session.');\n const observation = await client.observe(signal);\n return { content: [{ type: 'text', text: JSON.stringify(observation, null, 2) }], details: observation };\n },\n });\n pi.registerTool({\n name: 'computer_action',\n label: 'Computer Action',\n description: 'Perform one constrained semantic action in the authorized application window.',\n promptSnippet: 'Perform one action using a current computer_state snapshot and element ref',\n parameters: {\n type: 'object',\n properties: {\n kind: { type: 'string', enum: ['press', 'focus', 'set_value', 'scroll'] },\n snapshotId: { type: 'string' },\n elementRef: { type: 'string' },\n value: { type: 'string' },\n direction: { type: 'string', enum: ['up', 'down', 'left', 'right'] },\n amount: { type: 'string', enum: ['line', 'page'] },\n },\n required: ['kind', 'snapshotId', 'elementRef'],\n additionalProperties: false,\n },\n async execute(_toolCallId, params, signal) {\n if (!globallyEnabled || client === undefined || state?.phase !== 'active')\n throw new Error('Computer use is not active for this session.');\n const result = await client.act(params as unknown as ComputerUseAction, signal);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }], details: result };\n },\n });\n pi.registerTool({\n name: 'computer_exec',\n label: 'Computer Script',\n description:\n 'Run a trusted, explicitly allowed local TypeScript script against the authorized application session.',\n promptSnippet: 'Run a trusted reusable computer script by its explicitly allowed path and JSON input',\n parameters: {\n type: 'object',\n properties: {\n scriptPath: { type: 'string' },\n input: {},\n },\n required: ['scriptPath', 'input'],\n additionalProperties: false,\n },\n async execute(_toolCallId, params, signal) {\n if (!globallyEnabled || client === undefined || state?.phase !== 'active')\n throw new Error('Computer use is not active for this session.');\n if (dependencies.scriptRunner === undefined) throw new Error('Computer script execution is unavailable.');\n const input = params as { scriptPath: string; input: unknown };\n const result = await dependencies.scriptRunner.execute(input.scriptPath, input.input, signal);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }], details: result };\n },\n });\n cordis.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (context) => {\n const catalog = requireMinorModeCatalog(context);\n const registerOwner = (): MinorModeOwnerHandle =>\n registerMinorModeOwner<ExtensionContext>(catalog, {\n descriptor: {\n source: PACKAGE_SOURCE,\n id: COMPUTER_USE_MODE_ID,\n label: 'Computer Use',\n description: 'Session-scoped semantic control through DoomPi Desktop.',\n order: 450,\n actions: [\n {\n id: 'activate',\n label: 'Activate',\n description: 'Open the cockpit activation workflow and native confirmation.',\n contexts: ['tui', 'headless'],\n parameters: [],\n },\n {\n id: 'deactivate',\n label: 'Deactivate',\n description: 'Stop this session computer-use run.',\n contexts: ['tui', 'headless'],\n parameters: [],\n },\n {\n id: 'doctor',\n label: 'Doctor',\n description: 'Report Desktop availability and session state.',\n contexts: ['tui', 'headless'],\n parameters: [],\n },\n ],\n },\n initialState: modeState(state, enabled),\n async handleAction(actionId, _argumentsValue, execution) {\n activeContext = execution.context;\n if (actionId === 'activate') {\n if ((await dependencies.enabled?.()) !== true) {\n await refresh();\n throw new Error('Enable computer use in global settings first.');\n }\n if (client === undefined) throw new Error('DoomPi Desktop computer use is unavailable.');\n enabled = true;\n await refresh();\n publish();\n return { message: 'Computer use is ready to configure in Activity.' };\n }\n if (actionId === 'doctor') {\n await refresh();\n return {\n message:\n client === undefined\n ? 'DoomPi Desktop session API is unavailable.'\n : `Computer use is ${state?.phase.replaceAll('_', ' ') ?? 'unavailable'}.`,\n };\n }\n if (actionId === 'deactivate') {\n if (client === undefined) throw new Error('DoomPi Desktop computer use is unavailable.');\n if (state !== undefined && state.phase !== 'inactive' && state.phase !== 'failed')\n await client.stop(execution.signal);\n enabled = false;\n await refresh();\n publish();\n return { message: 'Computer use is off.' };\n }\n throw new Error(`Unknown computer-use action: ${actionId}`);\n },\n });\n syncModeOwner = (): void => {\n if (globallyEnabled && mode === undefined) {\n publishedMode = '';\n mode = registerOwner();\n } else if (!globallyEnabled && mode !== undefined) {\n mode.dispose();\n mode = undefined;\n publishedMode = '';\n }\n };\n syncModeOwner();\n return () => {\n syncModeOwner = () => undefined;\n mode?.dispose();\n mode = undefined;\n };\n });\n\n pi.on('before_agent_start', (event) =>\n globallyEnabled && state?.phase === 'active'\n ? { systemPrompt: `${event.systemPrompt}\\n\\n${COMPUTER_USE_GUIDANCE}` }\n : undefined,\n );\n pi.on('session_start', (_event, context) => {\n activeContext = context;\n reconcileTools(pi, false);\n void refresh();\n if (timer) clearInterval(timer);\n timer = setInterval(() => void refresh(), 250);\n timer.unref?.();\n });\n cordis.effect(\n () => () => {\n if (timer) clearInterval(timer);\n timer = undefined;\n reconcileTools(pi, false);\n activeContext?.ui.setStatus(COMPUTER_USE_MODE_STATUS_KEY, undefined);\n activeContext?.ui.setStatus(COMPUTER_USE_STATUS_KEY, undefined);\n activeContext = undefined;\n mode?.dispose();\n mode = undefined;\n },\n `${PACKAGE_SOURCE}/runtime`,\n );\n\n registerComputerUseCommand(pi, dependencies.service);\n}\n\ninterface ComputerUsePluginConfig {\n readonly pi: ExtensionAPI;\n readonly dependencies: ComputerUseExtensionDependencies;\n}\n\nfunction computerUsePlugin(cordis: Context, config: ComputerUsePluginConfig): void {\n installComputerUseRuntime(cordis, config.pi, config.dependencies);\n}\n\nexport async function activateComputerUseExtension(\n pi: ExtensionAPI,\n dependencies: ComputerUseExtensionDependencies = createComputerUseContainer(),\n): Promise<void> {\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE, { allowStandalone: true });\n const fiber = connection.root.plugin(computerUsePlugin, { pi, dependencies });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n\nexport default activateComputerUseExtension;\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extension.d.cts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;;;;;qBAuBa;qBACA;wBAwTS,6BACpB,IAAI,cACJ,eAAc,mCACb"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extension.d.mts","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"mappings":";;;;;;qBAuBa;qBACA;wBAwTS,6BACpB,IAAI,cACJ,eAAc,mCACb"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{registerComputerUseCommand as e}from"../../commands/computerUseCommand.mjs";import{COMPUTER_USE_MODE_ID as t,COMPUTER_USE_MODE_STATUS_KEY as n,COMPUTER_USE_STATUS_KEY as r}from"../../types/computerUseApi.mjs";import{createComputerUseContainer as i}from"../../container/index.mjs";import{connectDoomCordisHost as a}from"@agimon-ai/doompi-extension-contracts/cordis-host";import{DOOM_MINOR_MODE_CATALOG_SERVICE as o,registerMinorModeOwner as s,requireMinorModeCatalog as c}from"@agimon-ai/doompi-extension-contracts/mode";const l=`@agimon-ai/doompi-computer-use`,u=[`computer_state`,`computer_action`,`computer_exec`],d=`[COMPUTER USE ACTIVE]
|
|
2
|
-
Use computer_state before acting and after any action that may change the interface. Use only element refs and snapshot ids returned by computer_state. Use computer_action for one semantic press, focus, set_value, or scroll at a time. Use computer_exec only for a trusted, explicitly allowed local TypeScript script. Never infer coordinates, inspect another application, bypass secure elements, or retry an uncertain outcome. Stop computer use when the task is complete.`;function f(e,t=!1){let n=e?.phase??`inactive`,r=t||n!==`inactive`&&n!==`failed`;return{activation:r?n===`stopping`?`deactivating`:n===`awaiting_confirmation`||n===`activating`?`activating`:`active`:`inactive`,condition:n===`awaiting_confirmation`?`blocked`:n===`failed`?`failed`:n===`activating`||n===`stopping`?`queued`:`ready`,...r&&n===`inactive`?{detail:`configure computer use in Activity`}:{},...n===`awaiting_confirmation`?{detail:`awaiting confirmation in Activity`}:{},actions:[{id:`activate`,enabled:!r,...r?{disabledReason:`Computer use is already enabled.`}:{}},{id:`deactivate`,enabled:r,...r?{}:{disabledReason:`Computer use is not enabled.`}},{id:`doctor`,enabled:!0}]}}function p(e,t){let n=new Set(u),r=e.getActiveTools(),i=r.filter(e=>!n.has(e));t&&i.push(...u),(i.length!==r.length||i.some((e,t)=>e!==r[t]))&&e.setActiveTools(i)}function m(a,u,m=i()){let h=m.client,g,_=!1,v=!1,y,b=()=>void 0,x,S,C=``,w,T,E=()=>{let e=g?.phase??`inactive`,t=`${_}:${e}:${g?.revision??`none`}`;y!==void 0&&t!==C&&(y.publish(f(g,_)),C=t);let i=g===void 0?void 0:_||e!==`inactive`?e:``;S!==void 0&&i!==w&&(S.ui.setStatus(n,i),w=i);let a=_||e!==`inactive`?`computer use: ${e}`:void 0;S!==void 0&&a!==T&&(S.ui.setStatus(r,a),T=a)},D=async()=>{let e=!1;try{e=await m.enabled?.()===!0}catch{e=!1}if(e!==v){if(v=e,!v){if(h!==void 0&&g!==void 0&&g.phase!==`inactive`&&g.phase!==`failed`)try{await h.stop()}catch{}_=!1,g=void 0,p(u,!1)}b()}if(!v||h===void 0){g=void 0,p(u,!1),E();return}try{g=await h.state(),p(u,g.phase===`active`),E()}catch{g=void 0,p(u,!1),E()}};u.registerTool({name:`computer_state`,label:`Computer State`,description:`Observe the authorized application window and return its semantic accessibility state.`,promptSnippet:`Observe the authorized application before choosing a semantic action`,parameters:{type:`object`,properties:{},additionalProperties:!1},async execute(e,t,n){if(!v||h===void 0||g?.phase!==`active`)throw Error(`Computer use is not active for this session.`);let r=await h.observe(n);return{content:[{type:`text`,text:JSON.stringify(r,null,2)}],details:r}}}),u.registerTool({name:`computer_action`,label:`Computer Action`,description:`Perform one constrained semantic action in the authorized application window.`,promptSnippet:`Perform one action using a current computer_state snapshot and element ref`,parameters:{type:`object`,properties:{kind:{type:`string`,enum:[`press`,`focus`,`set_value`,`scroll`]},snapshotId:{type:`string`},elementRef:{type:`string`},value:{type:`string`},direction:{type:`string`,enum:[`up`,`down`,`left`,`right`]},amount:{type:`string`,enum:[`line`,`page`]}},required:[`kind`,`snapshotId`,`elementRef`],additionalProperties:!1},async execute(e,t,n){if(!v||h===void 0||g?.phase!==`active`)throw Error(`Computer use is not active for this session.`);let r=await h.act(t,n);return{content:[{type:`text`,text:JSON.stringify(r,null,2)}],details:r}}}),u.registerTool({name:`computer_exec`,label:`Computer Script`,description:`Run a trusted, explicitly allowed local TypeScript script against the authorized application session.`,promptSnippet:`Run a trusted reusable computer script by its explicitly allowed path and JSON input`,parameters:{type:`object`,properties:{scriptPath:{type:`string`},input:{}},required:[`scriptPath`,`input`],additionalProperties:!1},async execute(e,t,n){if(!v||h===void 0||g?.phase!==`active`)throw Error(`Computer use is not active for this session.`);if(m.scriptRunner===void 0)throw Error(`Computer script execution is unavailable.`);let r=t,i=await m.scriptRunner.execute(r.scriptPath,r.input,n);return{content:[{type:`text`,text:JSON.stringify(i,null,2)}],details:i}}}),a.inject([o],e=>{let n=c(e),r=()=>s(n,{descriptor:{source:l,id:t,label:`Computer Use`,description:`Session-scoped semantic control through DoomPi Desktop.`,order:450,actions:[{id:`activate`,label:`Activate`,description:`Open the cockpit activation workflow and native confirmation.`,contexts:[`tui`,`headless`],parameters:[]},{id:`deactivate`,label:`Deactivate`,description:`Stop this session computer-use run.`,contexts:[`tui`,`headless`],parameters:[]},{id:`doctor`,label:`Doctor`,description:`Report Desktop availability and session state.`,contexts:[`tui`,`headless`],parameters:[]}]},initialState:f(g,_),async handleAction(e,t,n){if(S=n.context,e===`activate`){if(await m.enabled?.()!==!0)throw await D(),Error(`Enable computer use in global settings first.`);if(h===void 0)throw Error(`DoomPi Desktop computer use is unavailable.`);return _=!0,await D(),E(),{message:`Computer use is ready to configure in Activity.`}}if(e===`doctor`)return await D(),{message:h===void 0?`DoomPi Desktop session API is unavailable.`:`Computer use is ${g?.phase.replaceAll(`_`,` `)??`unavailable`}.`};if(e===`deactivate`){if(h===void 0)throw Error(`DoomPi Desktop computer use is unavailable.`);return g!==void 0&&g.phase!==`inactive`&&g.phase!==`failed`&&await h.stop(n.signal),_=!1,await D(),E(),{message:`Computer use is off.`}}throw Error(`Unknown computer-use action: ${e}`)}});return b=()=>{v&&y===void 0?(C=``,y=r()):!v&&y!==void 0&&(y.dispose(),y=void 0,C=``)},b(),()=>{b=()=>void 0,y?.dispose(),y=void 0}}),u.on(`before_agent_start`,e=>v&&g?.phase===`active`?{systemPrompt:`${e.systemPrompt}\n\n${d}`}:void 0),u.on(`session_start`,(e,t)=>{S=t,p(u,!1),D(),x&&clearInterval(x),x=setInterval(()=>void D(),250),x.unref?.()}),a.effect(()=>()=>{x&&clearInterval(x),x=void 0,p(u,!1),S?.ui.setStatus(n,void 0),S?.ui.setStatus(r,void 0),S=void 0,y?.dispose(),y=void 0},`${l}/runtime`),e(u,m.service)}function h(e,t){m(e,t.pi,t.dependencies)}async function g(e,t=i()){let n=await a(e,l,{allowStandalone:!0}),r=n.root.plugin(h,{pi:e,dependencies:t});try{await r}catch(e){try{await r.dispose()}finally{await n.dispose()}throw e}let o;e.on(`session_shutdown`,()=>o??=(async()=>{try{await r.dispose()}finally{await n.dispose()}})())}export{d as COMPUTER_USE_GUIDANCE,t as COMPUTER_USE_MODE_ID,u as COMPUTER_USE_TOOL_NAMES,g as activateComputerUseExtension,g as default,m as installComputerUseRuntime,f as modeState,p as reconcileTools};
|
|
3
|
-
//# sourceMappingURL=extension.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extension.mjs","names":[],"sources":["../../../src/adapters/pi/extension.ts"],"sourcesContent":["import { connectDoomCordisHost } from '@agimon-ai/doompi-extension-contracts/cordis-host';\nimport {\n DOOM_MINOR_MODE_CATALOG_SERVICE,\n type MinorModeOwnerHandle,\n type MinorModeState,\n registerMinorModeOwner,\n requireMinorModeCatalog,\n} from '@agimon-ai/doompi-extension-contracts/mode';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { registerComputerUseCommand } from '../../commands/computerUseCommand.ts';\nimport { createComputerUseContainer } from '../../container/index.ts';\nimport {\n COMPUTER_USE_MODE_ID,\n COMPUTER_USE_MODE_STATUS_KEY,\n COMPUTER_USE_STATUS_KEY,\n type ComputerUseSessionView,\n} from '../../types/computerUseApi.ts';\nimport type { ComputerUseAction } from '../../types/computerUse.ts';\nimport type { ComputerUseExtensionDependencies } from '../../types/extension.ts';\n\nconst PACKAGE_SOURCE = '@agimon-ai/doompi-computer-use';\nexport { COMPUTER_USE_MODE_ID };\nexport const COMPUTER_USE_TOOL_NAMES = ['computer_state', 'computer_action', 'computer_exec'] as const;\nexport const COMPUTER_USE_GUIDANCE = `[COMPUTER USE ACTIVE]\nUse computer_state before acting and after any action that may change the interface. Use only element refs and snapshot ids returned by computer_state. Use computer_action for one semantic press, focus, set_value, or scroll at a time. Use computer_exec only for a trusted, explicitly allowed local TypeScript script. Never infer coordinates, inspect another application, bypass secure elements, or retry an uncertain outcome. Stop computer use when the task is complete.`;\n\nexport function modeState(state?: ComputerUseSessionView, enabled = false): MinorModeState {\n const phase = state?.phase ?? 'inactive';\n const running = phase !== 'inactive' && phase !== 'failed';\n const modeEnabled = enabled || running;\n const activation = modeEnabled\n ? phase === 'stopping'\n ? 'deactivating'\n : phase === 'awaiting_confirmation' || phase === 'activating'\n ? 'activating'\n : 'active'\n : 'inactive';\n return {\n activation,\n condition:\n phase === 'awaiting_confirmation'\n ? 'blocked'\n : phase === 'failed'\n ? 'failed'\n : phase === 'activating' || phase === 'stopping'\n ? 'queued'\n : 'ready',\n ...(modeEnabled && phase === 'inactive' ? { detail: 'configure computer use in Activity' } : {}),\n ...(phase === 'awaiting_confirmation' ? { detail: 'awaiting confirmation in Activity' } : {}),\n actions: [\n {\n id: 'activate',\n enabled: !modeEnabled,\n ...(!modeEnabled ? {} : { disabledReason: 'Computer use is already enabled.' }),\n },\n {\n id: 'deactivate',\n enabled: modeEnabled,\n ...(modeEnabled ? {} : { disabledReason: 'Computer use is not enabled.' }),\n },\n { id: 'doctor', enabled: true },\n ],\n };\n}\n\nexport function reconcileTools(pi: Pick<ExtensionAPI, 'getActiveTools' | 'setActiveTools'>, active: boolean): void {\n const owned = new Set<string>(COMPUTER_USE_TOOL_NAMES);\n const current = pi.getActiveTools();\n const next = current.filter((name) => !owned.has(name));\n if (active) next.push(...COMPUTER_USE_TOOL_NAMES);\n if (next.length !== current.length || next.some((name, index) => name !== current[index])) pi.setActiveTools(next);\n}\n\nexport function installComputerUseRuntime(\n cordis: Context,\n pi: ExtensionAPI,\n dependencies: ComputerUseExtensionDependencies = createComputerUseContainer(),\n): void {\n const client = dependencies.client;\n let state: ComputerUseSessionView | undefined;\n let enabled = false;\n let globallyEnabled = false;\n let mode: MinorModeOwnerHandle | undefined;\n let syncModeOwner = (): void => undefined;\n let timer: ReturnType<typeof setInterval> | undefined;\n let activeContext: ExtensionContext | undefined;\n let publishedMode = '';\n let publishedModeStatus: string | undefined;\n let publishedActivityStatus: string | undefined;\n const publish = (): void => {\n const phase = state?.phase ?? 'inactive';\n const projection = `${enabled}:${phase}:${state?.revision ?? 'none'}`;\n if (mode !== undefined && projection !== publishedMode) {\n mode.publish(modeState(state, enabled));\n publishedMode = projection;\n }\n const modeStatus = state === undefined ? undefined : enabled || phase !== 'inactive' ? phase : '';\n if (activeContext !== undefined && modeStatus !== publishedModeStatus) {\n activeContext.ui.setStatus(COMPUTER_USE_MODE_STATUS_KEY, modeStatus);\n publishedModeStatus = modeStatus;\n }\n const activityStatus = enabled || phase !== 'inactive' ? `computer use: ${phase}` : undefined;\n if (activeContext !== undefined && activityStatus !== publishedActivityStatus) {\n activeContext.ui.setStatus(COMPUTER_USE_STATUS_KEY, activityStatus);\n publishedActivityStatus = activityStatus;\n }\n };\n const refresh = async (): Promise<void> => {\n let nextGloballyEnabled = false;\n try {\n nextGloballyEnabled = (await dependencies.enabled?.()) === true;\n } catch {\n nextGloballyEnabled = false;\n }\n if (nextGloballyEnabled !== globallyEnabled) {\n globallyEnabled = nextGloballyEnabled;\n if (!globallyEnabled) {\n if (client !== undefined && state !== undefined && state.phase !== 'inactive' && state.phase !== 'failed') {\n try {\n await client.stop();\n } catch {\n // The global opt-in is still authoritative even when remote cleanup fails.\n }\n }\n enabled = false;\n state = undefined;\n reconcileTools(pi, false);\n }\n syncModeOwner();\n }\n if (!globallyEnabled || client === undefined) {\n state = undefined;\n reconcileTools(pi, false);\n publish();\n return;\n }\n try {\n state = await client.state();\n reconcileTools(pi, state.phase === 'active');\n publish();\n } catch {\n state = undefined;\n reconcileTools(pi, false);\n publish();\n }\n };\n\n pi.registerTool({\n name: 'computer_state',\n label: 'Computer State',\n description: 'Observe the authorized application window and return its semantic accessibility state.',\n promptSnippet: 'Observe the authorized application before choosing a semantic action',\n parameters: { type: 'object', properties: {}, additionalProperties: false },\n async execute(_toolCallId, _params, signal) {\n if (!globallyEnabled || client === undefined || state?.phase !== 'active')\n throw new Error('Computer use is not active for this session.');\n const observation = await client.observe(signal);\n return { content: [{ type: 'text', text: JSON.stringify(observation, null, 2) }], details: observation };\n },\n });\n pi.registerTool({\n name: 'computer_action',\n label: 'Computer Action',\n description: 'Perform one constrained semantic action in the authorized application window.',\n promptSnippet: 'Perform one action using a current computer_state snapshot and element ref',\n parameters: {\n type: 'object',\n properties: {\n kind: { type: 'string', enum: ['press', 'focus', 'set_value', 'scroll'] },\n snapshotId: { type: 'string' },\n elementRef: { type: 'string' },\n value: { type: 'string' },\n direction: { type: 'string', enum: ['up', 'down', 'left', 'right'] },\n amount: { type: 'string', enum: ['line', 'page'] },\n },\n required: ['kind', 'snapshotId', 'elementRef'],\n additionalProperties: false,\n },\n async execute(_toolCallId, params, signal) {\n if (!globallyEnabled || client === undefined || state?.phase !== 'active')\n throw new Error('Computer use is not active for this session.');\n const result = await client.act(params as unknown as ComputerUseAction, signal);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }], details: result };\n },\n });\n pi.registerTool({\n name: 'computer_exec',\n label: 'Computer Script',\n description:\n 'Run a trusted, explicitly allowed local TypeScript script against the authorized application session.',\n promptSnippet: 'Run a trusted reusable computer script by its explicitly allowed path and JSON input',\n parameters: {\n type: 'object',\n properties: {\n scriptPath: { type: 'string' },\n input: {},\n },\n required: ['scriptPath', 'input'],\n additionalProperties: false,\n },\n async execute(_toolCallId, params, signal) {\n if (!globallyEnabled || client === undefined || state?.phase !== 'active')\n throw new Error('Computer use is not active for this session.');\n if (dependencies.scriptRunner === undefined) throw new Error('Computer script execution is unavailable.');\n const input = params as { scriptPath: string; input: unknown };\n const result = await dependencies.scriptRunner.execute(input.scriptPath, input.input, signal);\n return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }], details: result };\n },\n });\n cordis.inject([DOOM_MINOR_MODE_CATALOG_SERVICE], (context) => {\n const catalog = requireMinorModeCatalog(context);\n const registerOwner = (): MinorModeOwnerHandle =>\n registerMinorModeOwner<ExtensionContext>(catalog, {\n descriptor: {\n source: PACKAGE_SOURCE,\n id: COMPUTER_USE_MODE_ID,\n label: 'Computer Use',\n description: 'Session-scoped semantic control through DoomPi Desktop.',\n order: 450,\n actions: [\n {\n id: 'activate',\n label: 'Activate',\n description: 'Open the cockpit activation workflow and native confirmation.',\n contexts: ['tui', 'headless'],\n parameters: [],\n },\n {\n id: 'deactivate',\n label: 'Deactivate',\n description: 'Stop this session computer-use run.',\n contexts: ['tui', 'headless'],\n parameters: [],\n },\n {\n id: 'doctor',\n label: 'Doctor',\n description: 'Report Desktop availability and session state.',\n contexts: ['tui', 'headless'],\n parameters: [],\n },\n ],\n },\n initialState: modeState(state, enabled),\n async handleAction(actionId, _argumentsValue, execution) {\n activeContext = execution.context;\n if (actionId === 'activate') {\n if ((await dependencies.enabled?.()) !== true) {\n await refresh();\n throw new Error('Enable computer use in global settings first.');\n }\n if (client === undefined) throw new Error('DoomPi Desktop computer use is unavailable.');\n enabled = true;\n await refresh();\n publish();\n return { message: 'Computer use is ready to configure in Activity.' };\n }\n if (actionId === 'doctor') {\n await refresh();\n return {\n message:\n client === undefined\n ? 'DoomPi Desktop session API is unavailable.'\n : `Computer use is ${state?.phase.replaceAll('_', ' ') ?? 'unavailable'}.`,\n };\n }\n if (actionId === 'deactivate') {\n if (client === undefined) throw new Error('DoomPi Desktop computer use is unavailable.');\n if (state !== undefined && state.phase !== 'inactive' && state.phase !== 'failed')\n await client.stop(execution.signal);\n enabled = false;\n await refresh();\n publish();\n return { message: 'Computer use is off.' };\n }\n throw new Error(`Unknown computer-use action: ${actionId}`);\n },\n });\n syncModeOwner = (): void => {\n if (globallyEnabled && mode === undefined) {\n publishedMode = '';\n mode = registerOwner();\n } else if (!globallyEnabled && mode !== undefined) {\n mode.dispose();\n mode = undefined;\n publishedMode = '';\n }\n };\n syncModeOwner();\n return () => {\n syncModeOwner = () => undefined;\n mode?.dispose();\n mode = undefined;\n };\n });\n\n pi.on('before_agent_start', (event) =>\n globallyEnabled && state?.phase === 'active'\n ? { systemPrompt: `${event.systemPrompt}\\n\\n${COMPUTER_USE_GUIDANCE}` }\n : undefined,\n );\n pi.on('session_start', (_event, context) => {\n activeContext = context;\n reconcileTools(pi, false);\n void refresh();\n if (timer) clearInterval(timer);\n timer = setInterval(() => void refresh(), 250);\n timer.unref?.();\n });\n cordis.effect(\n () => () => {\n if (timer) clearInterval(timer);\n timer = undefined;\n reconcileTools(pi, false);\n activeContext?.ui.setStatus(COMPUTER_USE_MODE_STATUS_KEY, undefined);\n activeContext?.ui.setStatus(COMPUTER_USE_STATUS_KEY, undefined);\n activeContext = undefined;\n mode?.dispose();\n mode = undefined;\n },\n `${PACKAGE_SOURCE}/runtime`,\n );\n\n registerComputerUseCommand(pi, dependencies.service);\n}\n\ninterface ComputerUsePluginConfig {\n readonly pi: ExtensionAPI;\n readonly dependencies: ComputerUseExtensionDependencies;\n}\n\nfunction computerUsePlugin(cordis: Context, config: ComputerUsePluginConfig): void {\n installComputerUseRuntime(cordis, config.pi, config.dependencies);\n}\n\nexport async function activateComputerUseExtension(\n pi: ExtensionAPI,\n dependencies: ComputerUseExtensionDependencies = createComputerUseContainer(),\n): Promise<void> {\n const connection = await connectDoomCordisHost(pi, PACKAGE_SOURCE, { allowStandalone: true });\n const fiber = connection.root.plugin(computerUsePlugin, { pi, dependencies });\n try {\n await fiber;\n } catch (error) {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n throw error;\n }\n let disposal: Promise<void> | undefined;\n pi.on(\n 'session_shutdown',\n () =>\n (disposal ??= (async () => {\n try {\n await fiber.dispose();\n } finally {\n await connection.dispose();\n }\n })()),\n );\n}\n\nexport default activateComputerUseExtension;\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../../_virtual/_rolldown/runtime.cjs"),t=require("../../types/computerUseApi.cjs");let n=require("node:http");n=e.__toESM(n,1);let r=require("@agimon-ai/doompi-extension-contracts/package-api");var i=class{options;constructor(e){this.options=e}request(e,i,a,o){return new Promise((s,c)=>{let l=a===void 0?void 0:JSON.stringify(a),u=n.default.request({socketPath:this.options.socketPath,path:`${r.DOOM_API_ROUTE_PREFIX}/${t.API_BASE_PATH}${e}`,method:i,headers:{authorization:`Bearer ${this.options.token}`,...l===void 0?{}:{"content-type":`application/json`,"content-length":Buffer.byteLength(l)}},signal:o},e=>{let t=[];e.on(`data`,e=>t.push(e)),e.on(`end`,()=>{try{let n=JSON.parse(Buffer.concat(t).toString(`utf8`));if((e.statusCode??500)>=400){let t=typeof n==`object`&&n&&`error`in n?String(n.error):`HTTP ${e.statusCode}`;c(Error(t))}else s(n)}catch(e){c(e)}})});u.on(`error`,c),l!==void 0&&u.write(l),u.end()})}async state(e){return await this.request(t.COMPUTER_USE_ROUTES.agentState,`GET`,void 0,e)}async observe(e){return await this.request(t.COMPUTER_USE_ROUTES.agentObserve,`POST`,{},e)}act(e,n){return this.request(t.COMPUTER_USE_ROUTES.agentAction,`POST`,e,n)}async stop(e){return await this.request(t.COMPUTER_USE_ROUTES.agentStop,`POST`,{},e)}};function a(e=process.env){let t=e[r.DOOM_API_SOCKET_ENV],n=e[r.DOOM_API_INTERNAL_TOKEN_ENV];return t&&n?new i({socketPath:t,token:n}):void 0}exports.UnixComputerUseSessionClient=i,exports.createComputerUseSessionClient=a;
|
|
2
|
-
//# sourceMappingURL=sessionApiClient.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessionApiClient.cjs","names":["http","DOOM_API_ROUTE_PREFIX","API_BASE_PATH","COMPUTER_USE_ROUTES","DOOM_API_SOCKET_ENV","DOOM_API_INTERNAL_TOKEN_ENV"],"sources":["../../../src/adapters/pi/sessionApiClient.ts"],"sourcesContent":["import http from 'node:http';\nimport {\n DOOM_API_INTERNAL_TOKEN_ENV,\n DOOM_API_ROUTE_PREFIX,\n DOOM_API_SOCKET_ENV,\n} from '@agimon-ai/doompi-extension-contracts/package-api';\nimport { API_BASE_PATH, COMPUTER_USE_ROUTES, type ComputerUseSessionView } from '../../types/computerUseApi.ts';\nimport type { ComputerUseAction, ComputerUseObservation } from '../../types/computerUse.ts';\n\nexport interface ComputerUseSessionClient {\n state(signal?: AbortSignal): Promise<ComputerUseSessionView>;\n observe(signal?: AbortSignal): Promise<ComputerUseObservation>;\n act(action: ComputerUseAction, signal?: AbortSignal): Promise<unknown>;\n stop(signal?: AbortSignal): Promise<ComputerUseSessionView>;\n}\n\ninterface ClientOptions {\n readonly socketPath: string;\n readonly token: string;\n}\n\nexport class UnixComputerUseSessionClient implements ComputerUseSessionClient {\n public constructor(private readonly options: ClientOptions) {}\n\n private request(path: string, method: 'GET' | 'POST', value?: unknown, signal?: AbortSignal): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const body = value === undefined ? undefined : JSON.stringify(value);\n const request = http.request(\n {\n socketPath: this.options.socketPath,\n path: `${DOOM_API_ROUTE_PREFIX}/${API_BASE_PATH}${path}`,\n method,\n headers: {\n authorization: `Bearer ${this.options.token}`,\n ...(body === undefined\n ? {}\n : { 'content-type': 'application/json', 'content-length': Buffer.byteLength(body) }),\n },\n signal,\n },\n (response) => {\n const chunks: Buffer[] = [];\n response.on('data', (chunk: Buffer) => chunks.push(chunk));\n response.on('end', () => {\n try {\n const parsed = JSON.parse(Buffer.concat(chunks).toString('utf8')) as unknown;\n if ((response.statusCode ?? 500) >= 400) {\n const message =\n typeof parsed === 'object' && parsed !== null && 'error' in parsed\n ? String(parsed.error)\n : `HTTP ${response.statusCode}`;\n reject(new Error(message));\n } else resolve(parsed);\n } catch (error) {\n reject(error);\n }\n });\n },\n );\n request.on('error', reject);\n if (body !== undefined) request.write(body);\n request.end();\n });\n }\n\n public async state(signal?: AbortSignal): Promise<ComputerUseSessionView> {\n return (await this.request(COMPUTER_USE_ROUTES.agentState, 'GET', undefined, signal)) as ComputerUseSessionView;\n }\n\n public async observe(signal?: AbortSignal): Promise<ComputerUseObservation> {\n return (await this.request(COMPUTER_USE_ROUTES.agentObserve, 'POST', {}, signal)) as ComputerUseObservation;\n }\n\n public act(action: ComputerUseAction, signal?: AbortSignal): Promise<unknown> {\n return this.request(COMPUTER_USE_ROUTES.agentAction, 'POST', action, signal);\n }\n\n public async stop(signal?: AbortSignal): Promise<ComputerUseSessionView> {\n return (await this.request(COMPUTER_USE_ROUTES.agentStop, 'POST', {}, signal)) as ComputerUseSessionView;\n }\n}\n\nexport function createComputerUseSessionClient(\n environment: NodeJS.ProcessEnv = process.env,\n): ComputerUseSessionClient | undefined {\n const socketPath = environment[DOOM_API_SOCKET_ENV];\n const token = environment[DOOM_API_INTERNAL_TOKEN_ENV];\n return socketPath && token ? new UnixComputerUseSessionClient({ socketPath, token }) : undefined;\n}\n"],"mappings":"mNAqBA,IAAa,EAAb,KAA8E,CACxC,QAApC,YAAmB,EAAyC,CAAxB,KAAA,QAAA,CAAyB,CAE7D,QAAgB,EAAc,EAAwB,EAAiB,EAAwC,CAC7G,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,IAAM,EAAO,IAAU,IAAA,GAAY,IAAA,GAAY,KAAK,UAAU,CAAK,EAC7D,EAAUA,EAAAA,QAAK,QACnB,CACE,WAAY,KAAK,QAAQ,WACzB,KAAM,GAAGC,EAAAA,sBAAsB,GAAGC,EAAAA,gBAAgB,IAClD,SACA,QAAS,CACP,cAAe,UAAU,KAAK,QAAQ,QACtC,GAAI,IAAS,IAAA,GACT,CAAC,EACD,CAAE,eAAgB,mBAAoB,iBAAkB,OAAO,WAAW,CAAI,CAAE,CACtF,EACA,QACF,EACC,GAAa,CACZ,IAAM,EAAmB,CAAC,EAC1B,EAAS,GAAG,OAAS,GAAkB,EAAO,KAAK,CAAK,CAAC,EACzD,EAAS,GAAG,UAAa,CACvB,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,OAAO,OAAO,CAAM,CAAC,CAAC,SAAS,MAAM,CAAC,EAChE,IAAK,EAAS,YAAc,MAAQ,IAAK,CACvC,IAAM,EACJ,OAAO,GAAW,UAAY,GAAmB,UAAW,EACxD,OAAO,EAAO,KAAK,EACnB,QAAQ,EAAS,aACvB,EAAW,MAAM,CAAO,CAAC,CAC3B,MAAO,EAAQ,CAAM,CACvB,OAAS,EAAO,CACd,EAAO,CAAK,CACd,CACF,CAAC,CACH,CACF,EACA,EAAQ,GAAG,QAAS,CAAM,EACtB,IAAS,IAAA,IAAW,EAAQ,MAAM,CAAI,EAC1C,EAAQ,IAAI,CACd,CAAC,CACH,CAEA,MAAa,MAAM,EAAuD,CACxE,OAAQ,MAAM,KAAK,QAAQC,EAAAA,oBAAoB,WAAY,MAAO,IAAA,GAAW,CAAM,CACrF,CAEA,MAAa,QAAQ,EAAuD,CAC1E,OAAQ,MAAM,KAAK,QAAQA,EAAAA,oBAAoB,aAAc,OAAQ,CAAC,EAAG,CAAM,CACjF,CAEA,IAAW,EAA2B,EAAwC,CAC5E,OAAO,KAAK,QAAQA,EAAAA,oBAAoB,YAAa,OAAQ,EAAQ,CAAM,CAC7E,CAEA,MAAa,KAAK,EAAuD,CACvE,OAAQ,MAAM,KAAK,QAAQA,EAAAA,oBAAoB,UAAW,OAAQ,CAAC,EAAG,CAAM,CAC9E,CACF,EAEA,SAAgB,EACd,EAAiC,QAAQ,IACH,CACtC,IAAM,EAAa,EAAYC,EAAAA,qBACzB,EAAQ,EAAYC,EAAAA,6BAC1B,OAAO,GAAc,EAAQ,IAAI,EAA6B,CAAE,aAAY,OAAM,CAAC,EAAI,IAAA,EACzF"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { ComputerUseSessionView } from "../../types/computerUseApi.cjs";
|
|
2
|
-
import { ComputerUseAction, ComputerUseObservation } from "../../types/computerUse.cjs";
|
|
3
|
-
//#region src/adapters/pi/sessionApiClient.d.ts
|
|
4
|
-
export interface ComputerUseSessionClient {
|
|
5
|
-
state(signal?: AbortSignal): Promise<ComputerUseSessionView>;
|
|
6
|
-
observe(signal?: AbortSignal): Promise<ComputerUseObservation>;
|
|
7
|
-
act(action: ComputerUseAction, signal?: AbortSignal): Promise<unknown>;
|
|
8
|
-
stop(signal?: AbortSignal): Promise<ComputerUseSessionView>;
|
|
9
|
-
}
|
|
10
|
-
interface ClientOptions {
|
|
11
|
-
readonly socketPath: string;
|
|
12
|
-
readonly token: string;
|
|
13
|
-
}
|
|
14
|
-
export declare class UnixComputerUseSessionClient implements ComputerUseSessionClient {
|
|
15
|
-
private readonly options;
|
|
16
|
-
constructor(options: ClientOptions);
|
|
17
|
-
private request;
|
|
18
|
-
state(signal?: AbortSignal): Promise<ComputerUseSessionView>;
|
|
19
|
-
observe(signal?: AbortSignal): Promise<ComputerUseObservation>;
|
|
20
|
-
act(action: ComputerUseAction, signal?: AbortSignal): Promise<unknown>;
|
|
21
|
-
stop(signal?: AbortSignal): Promise<ComputerUseSessionView>;
|
|
22
|
-
}
|
|
23
|
-
export declare function createComputerUseSessionClient(environment?: NodeJS.ProcessEnv): ComputerUseSessionClient | undefined;
|
|
24
|
-
//#endregion
|
|
25
|
-
//# sourceMappingURL=sessionApiClient.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessionApiClient.d.cts","names":[],"sources":["../../../src/adapters/pi/sessionApiClient.ts"],"mappings":";;;iBASiB;EACf,MAAM,SAAS,cAAc,QAAQ;EACrC,QAAQ,SAAS,cAAc,QAAQ;EACvC,IAAI,QAAQ,mBAAmB,SAAS,cAAc;EACtD,KAAK,SAAS,cAAc,QAAQ;;UAG5B;WACC;WACA;;qBAGE,wCAAwC;mBACf;EAApC,YAAoC,SAAS;UAErC;EAyCK,MAAM,SAAS,cAAc,QAAQ;EAIrC,QAAQ,SAAS,cAAc,QAAQ;EAI7C,IAAI,QAAQ,mBAAmB,SAAS,cAAc;EAIhD,KAAK,SAAS,cAAc,QAAQ;;wBAKnC,+BACd,cAAa,OAAO,aACnB"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { ComputerUseSessionView } from "../../types/computerUseApi.mjs";
|
|
2
|
-
import { ComputerUseAction, ComputerUseObservation } from "../../types/computerUse.mjs";
|
|
3
|
-
//#region src/adapters/pi/sessionApiClient.d.ts
|
|
4
|
-
export interface ComputerUseSessionClient {
|
|
5
|
-
state(signal?: AbortSignal): Promise<ComputerUseSessionView>;
|
|
6
|
-
observe(signal?: AbortSignal): Promise<ComputerUseObservation>;
|
|
7
|
-
act(action: ComputerUseAction, signal?: AbortSignal): Promise<unknown>;
|
|
8
|
-
stop(signal?: AbortSignal): Promise<ComputerUseSessionView>;
|
|
9
|
-
}
|
|
10
|
-
interface ClientOptions {
|
|
11
|
-
readonly socketPath: string;
|
|
12
|
-
readonly token: string;
|
|
13
|
-
}
|
|
14
|
-
export declare class UnixComputerUseSessionClient implements ComputerUseSessionClient {
|
|
15
|
-
private readonly options;
|
|
16
|
-
constructor(options: ClientOptions);
|
|
17
|
-
private request;
|
|
18
|
-
state(signal?: AbortSignal): Promise<ComputerUseSessionView>;
|
|
19
|
-
observe(signal?: AbortSignal): Promise<ComputerUseObservation>;
|
|
20
|
-
act(action: ComputerUseAction, signal?: AbortSignal): Promise<unknown>;
|
|
21
|
-
stop(signal?: AbortSignal): Promise<ComputerUseSessionView>;
|
|
22
|
-
}
|
|
23
|
-
export declare function createComputerUseSessionClient(environment?: NodeJS.ProcessEnv): ComputerUseSessionClient | undefined;
|
|
24
|
-
//#endregion
|
|
25
|
-
//# sourceMappingURL=sessionApiClient.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessionApiClient.d.mts","names":[],"sources":["../../../src/adapters/pi/sessionApiClient.ts"],"mappings":";;;iBASiB;EACf,MAAM,SAAS,cAAc,QAAQ;EACrC,QAAQ,SAAS,cAAc,QAAQ;EACvC,IAAI,QAAQ,mBAAmB,SAAS,cAAc;EACtD,KAAK,SAAS,cAAc,QAAQ;;UAG5B;WACC;WACA;;qBAGE,wCAAwC;mBACf;EAApC,YAAoC,SAAS;UAErC;EAyCK,MAAM,SAAS,cAAc,QAAQ;EAIrC,QAAQ,SAAS,cAAc,QAAQ;EAI7C,IAAI,QAAQ,mBAAmB,SAAS,cAAc;EAIhD,KAAK,SAAS,cAAc,QAAQ;;wBAKnC,+BACd,cAAa,OAAO,aACnB"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{API_BASE_PATH as e,COMPUTER_USE_ROUTES as t}from"../../types/computerUseApi.mjs";import n from"node:http";import{DOOM_API_INTERNAL_TOKEN_ENV as r,DOOM_API_ROUTE_PREFIX as i,DOOM_API_SOCKET_ENV as a}from"@agimon-ai/doompi-extension-contracts/package-api";var o=class{options;constructor(e){this.options=e}request(t,r,a,o){return new Promise((s,c)=>{let l=a===void 0?void 0:JSON.stringify(a),u=n.request({socketPath:this.options.socketPath,path:`${i}/${e}${t}`,method:r,headers:{authorization:`Bearer ${this.options.token}`,...l===void 0?{}:{"content-type":`application/json`,"content-length":Buffer.byteLength(l)}},signal:o},e=>{let t=[];e.on(`data`,e=>t.push(e)),e.on(`end`,()=>{try{let n=JSON.parse(Buffer.concat(t).toString(`utf8`));if((e.statusCode??500)>=400){let t=typeof n==`object`&&n&&`error`in n?String(n.error):`HTTP ${e.statusCode}`;c(Error(t))}else s(n)}catch(e){c(e)}})});u.on(`error`,c),l!==void 0&&u.write(l),u.end()})}async state(e){return await this.request(t.agentState,`GET`,void 0,e)}async observe(e){return await this.request(t.agentObserve,`POST`,{},e)}act(e,n){return this.request(t.agentAction,`POST`,e,n)}async stop(e){return await this.request(t.agentStop,`POST`,{},e)}};function s(e=process.env){let t=e[a],n=e[r];return t&&n?new o({socketPath:t,token:n}):void 0}export{o as UnixComputerUseSessionClient,s as createComputerUseSessionClient};
|
|
2
|
-
//# sourceMappingURL=sessionApiClient.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessionApiClient.mjs","names":[],"sources":["../../../src/adapters/pi/sessionApiClient.ts"],"sourcesContent":["import http from 'node:http';\nimport {\n DOOM_API_INTERNAL_TOKEN_ENV,\n DOOM_API_ROUTE_PREFIX,\n DOOM_API_SOCKET_ENV,\n} from '@agimon-ai/doompi-extension-contracts/package-api';\nimport { API_BASE_PATH, COMPUTER_USE_ROUTES, type ComputerUseSessionView } from '../../types/computerUseApi.ts';\nimport type { ComputerUseAction, ComputerUseObservation } from '../../types/computerUse.ts';\n\nexport interface ComputerUseSessionClient {\n state(signal?: AbortSignal): Promise<ComputerUseSessionView>;\n observe(signal?: AbortSignal): Promise<ComputerUseObservation>;\n act(action: ComputerUseAction, signal?: AbortSignal): Promise<unknown>;\n stop(signal?: AbortSignal): Promise<ComputerUseSessionView>;\n}\n\ninterface ClientOptions {\n readonly socketPath: string;\n readonly token: string;\n}\n\nexport class UnixComputerUseSessionClient implements ComputerUseSessionClient {\n public constructor(private readonly options: ClientOptions) {}\n\n private request(path: string, method: 'GET' | 'POST', value?: unknown, signal?: AbortSignal): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const body = value === undefined ? undefined : JSON.stringify(value);\n const request = http.request(\n {\n socketPath: this.options.socketPath,\n path: `${DOOM_API_ROUTE_PREFIX}/${API_BASE_PATH}${path}`,\n method,\n headers: {\n authorization: `Bearer ${this.options.token}`,\n ...(body === undefined\n ? {}\n : { 'content-type': 'application/json', 'content-length': Buffer.byteLength(body) }),\n },\n signal,\n },\n (response) => {\n const chunks: Buffer[] = [];\n response.on('data', (chunk: Buffer) => chunks.push(chunk));\n response.on('end', () => {\n try {\n const parsed = JSON.parse(Buffer.concat(chunks).toString('utf8')) as unknown;\n if ((response.statusCode ?? 500) >= 400) {\n const message =\n typeof parsed === 'object' && parsed !== null && 'error' in parsed\n ? String(parsed.error)\n : `HTTP ${response.statusCode}`;\n reject(new Error(message));\n } else resolve(parsed);\n } catch (error) {\n reject(error);\n }\n });\n },\n );\n request.on('error', reject);\n if (body !== undefined) request.write(body);\n request.end();\n });\n }\n\n public async state(signal?: AbortSignal): Promise<ComputerUseSessionView> {\n return (await this.request(COMPUTER_USE_ROUTES.agentState, 'GET', undefined, signal)) as ComputerUseSessionView;\n }\n\n public async observe(signal?: AbortSignal): Promise<ComputerUseObservation> {\n return (await this.request(COMPUTER_USE_ROUTES.agentObserve, 'POST', {}, signal)) as ComputerUseObservation;\n }\n\n public act(action: ComputerUseAction, signal?: AbortSignal): Promise<unknown> {\n return this.request(COMPUTER_USE_ROUTES.agentAction, 'POST', action, signal);\n }\n\n public async stop(signal?: AbortSignal): Promise<ComputerUseSessionView> {\n return (await this.request(COMPUTER_USE_ROUTES.agentStop, 'POST', {}, signal)) as ComputerUseSessionView;\n }\n}\n\nexport function createComputerUseSessionClient(\n environment: NodeJS.ProcessEnv = process.env,\n): ComputerUseSessionClient | undefined {\n const socketPath = environment[DOOM_API_SOCKET_ENV];\n const token = environment[DOOM_API_INTERNAL_TOKEN_ENV];\n return socketPath && token ? new UnixComputerUseSessionClient({ socketPath, token }) : undefined;\n}\n"],"mappings":"qQAqBA,IAAa,EAAb,KAA8E,CACxC,QAApC,YAAmB,EAAyC,CAAxB,KAAA,QAAA,CAAyB,CAE7D,QAAgB,EAAc,EAAwB,EAAiB,EAAwC,CAC7G,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,IAAM,EAAO,IAAU,IAAA,GAAY,IAAA,GAAY,KAAK,UAAU,CAAK,EAC7D,EAAU,EAAK,QACnB,CACE,WAAY,KAAK,QAAQ,WACzB,KAAM,GAAG,EAAsB,GAAG,IAAgB,IAClD,SACA,QAAS,CACP,cAAe,UAAU,KAAK,QAAQ,QACtC,GAAI,IAAS,IAAA,GACT,CAAC,EACD,CAAE,eAAgB,mBAAoB,iBAAkB,OAAO,WAAW,CAAI,CAAE,CACtF,EACA,QACF,EACC,GAAa,CACZ,IAAM,EAAmB,CAAC,EAC1B,EAAS,GAAG,OAAS,GAAkB,EAAO,KAAK,CAAK,CAAC,EACzD,EAAS,GAAG,UAAa,CACvB,GAAI,CACF,IAAM,EAAS,KAAK,MAAM,OAAO,OAAO,CAAM,CAAC,CAAC,SAAS,MAAM,CAAC,EAChE,IAAK,EAAS,YAAc,MAAQ,IAAK,CACvC,IAAM,EACJ,OAAO,GAAW,UAAY,GAAmB,UAAW,EACxD,OAAO,EAAO,KAAK,EACnB,QAAQ,EAAS,aACvB,EAAW,MAAM,CAAO,CAAC,CAC3B,MAAO,EAAQ,CAAM,CACvB,OAAS,EAAO,CACd,EAAO,CAAK,CACd,CACF,CAAC,CACH,CACF,EACA,EAAQ,GAAG,QAAS,CAAM,EACtB,IAAS,IAAA,IAAW,EAAQ,MAAM,CAAI,EAC1C,EAAQ,IAAI,CACd,CAAC,CACH,CAEA,MAAa,MAAM,EAAuD,CACxE,OAAQ,MAAM,KAAK,QAAQ,EAAoB,WAAY,MAAO,IAAA,GAAW,CAAM,CACrF,CAEA,MAAa,QAAQ,EAAuD,CAC1E,OAAQ,MAAM,KAAK,QAAQ,EAAoB,aAAc,OAAQ,CAAC,EAAG,CAAM,CACjF,CAEA,IAAW,EAA2B,EAAwC,CAC5E,OAAO,KAAK,QAAQ,EAAoB,YAAa,OAAQ,EAAQ,CAAM,CAC7E,CAEA,MAAa,KAAK,EAAuD,CACvE,OAAQ,MAAM,KAAK,QAAQ,EAAoB,UAAW,OAAQ,CAAC,EAAG,CAAM,CAC9E,CACF,EAEA,SAAgB,EACd,EAAiC,QAAQ,IACH,CACtC,IAAM,EAAa,EAAY,GACzB,EAAQ,EAAY,GAC1B,OAAO,GAAc,EAAQ,IAAI,EAA6B,CAAE,aAAY,OAAM,CAAC,EAAI,IAAA,EACzF"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
require("../types/computerUseApi.cjs");var e=class extends Error{};function t(t,n){let r=typeof n==`object`&&n&&!Array.isArray(n)?n.error:void 0,i=typeof r==`string`?r:`HTTP ${String(t)}`;return t===404&&i===`No API 'computer-use' in this session.`?new e(i):Error(i)}function n(e){return e+5e3}exports.MissingComputerUseApiError=e,exports.computerUseSessionApiError=t,exports.missingComputerUseApiRetryAt=n;
|
|
2
|
-
//# sourceMappingURL=webComputerUseAvailability.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webComputerUseAvailability.cjs","names":[],"sources":["../../src/adapters/webComputerUseAvailability.ts"],"sourcesContent":["import { API_BASE_PATH } from '../types/computerUseApi.ts';\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":"uCAEA,IAAa,EAAb,cAAgD,KAAM,CAAC,EAEvD,SAAgB,EAA2B,EAAgB,EAAuB,CAChF,IAAM,EACJ,OAAO,GAAU,UAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,EAC9D,EAAkC,MACnC,IAAA,GACA,EAAU,OAAO,GAAU,SAAW,EAAQ,QAAQ,OAAO,CAAM,IACzE,OAAO,IAAW,KAAO,IAAY,yCACjC,IAAI,EAA2B,CAAO,EAClC,MAAM,CAAO,CACvB,CAEA,SAAgB,EAA6B,EAAqB,CAChE,OAAO,EAAM,GACf"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import"../types/computerUseApi.mjs";var e=class extends Error{};function t(t,n){let r=typeof n==`object`&&n&&!Array.isArray(n)?n.error:void 0,i=typeof r==`string`?r:`HTTP ${String(t)}`;return t===404&&i===`No API 'computer-use' in this session.`?new e(i):Error(i)}function n(e){return e+5e3}export{e as MissingComputerUseApiError,t as computerUseSessionApiError,n as missingComputerUseApiRetryAt};
|
|
2
|
-
//# sourceMappingURL=webComputerUseAvailability.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webComputerUseAvailability.mjs","names":[],"sources":["../../src/adapters/webComputerUseAvailability.ts"],"sourcesContent":["import { API_BASE_PATH } from '../types/computerUseApi.ts';\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":"oCAEA,IAAa,EAAb,cAAgD,KAAM,CAAC,EAEvD,SAAgB,EAA2B,EAAgB,EAAuB,CAChF,IAAM,EACJ,OAAO,GAAU,UAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,EAC9D,EAAkC,MACnC,IAAA,GACA,EAAU,OAAO,GAAU,SAAW,EAAQ,QAAQ,OAAO,CAAM,IACzE,OAAO,IAAW,KAAO,IAAY,yCACjC,IAAI,EAA2B,CAAO,EAClC,MAAM,CAAO,CACvB,CAEA,SAAgB,EAA6B,EAAqB,CAChE,OAAO,EAAM,GACf"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../types/computerUseApi.cjs"),t=require("./webComputerUseAvailability.cjs");let n=require("node:crypto");function r(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function i(e){let t=r(e);return t?.action===`status`||t?.action===`targets`||t?.action===`stop`||t?.action===`artifacts`?{action:t.action}:void 0}async function a(e){let n=await e.json();if(!e.ok)throw t.computerUseSessionApiError(e.status,n);return n}function o(o={}){let s;return{frameType:e.computerUseChannelType,lifecycle:`hub`,start(c){let l=new Map,u=new Map,d=new Map,f=new Map,p=new Set,m=new Map,h,g=!1,_=async(t,n,r=`GET`,i)=>c.requestSessionApi(t,{basePath:e.API_BASE_PATH,path:n,method:r,...i===void 0?{}:{body:JSON.stringify(i)}}),v=(e,t)=>{let n={state:t,targets:d.get(e.sessionId)??[],...h!==void 0&&h!==e.sessionId?{busy:!0}:{}};u.set(e.sessionId,n),c.publish(e.sessionId,n)},y=async t=>{let n=await a(await _(t,e.COMPUTER_USE_ROUTES.hubState));if(n.phase===`active`||n.phase===`activating`||n.phase===`stopping`){if(h=t.sessionId,n.phase===`active`&&!f.has(t.sessionId)){let n=await a(await _(t,e.COMPUTER_USE_ROUTES.hubAuthorization));n!==null&&f.set(t.sessionId,n.grantId)}}else h===t.sessionId&&(h=void 0),f.delete(t.sessionId);return m.delete(t.sessionId),v(t,n),n},b=async(t,n)=>{if(!c.computerUse?.available)throw Error(`DoomPi Desktop computer use is unavailable.`);try{let r=await c.computerUse.request(t,{operation:n.operation,payload:n.operation===`act`?{grantId:n.grantId,sequence:n.sequence,action:n.payload}:{grantId:n.grantId}});await a(await _(t,e.COMPUTER_USE_ROUTES.hubComplete,`POST`,{id:n.id,result:r}))}catch(r){await a(await _(t,e.COMPUTER_USE_ROUTES.hubComplete,`POST`,{id:n.id,error:r instanceof Error?r.message:String(r)}))}},x=async t=>{let r=await a(await _(t,e.COMPUTER_USE_ROUTES.hubAuthorization)),i;if(r!==null&&c.computerUse?.available)try{i=await c.computerUse.request(t,{operation:`stop`,payload:{grantId:r.grantId}})}catch(e){let t=e instanceof Error?e.message:String(e);i={artifactId:(0,n.randomUUID)(),status:`failed`,failure:{code:`recording_failed`,message:t.slice(0,512)}},c.onNotice(`computer-use Desktop stop was already unavailable (${t})`)}await a(await _(t,e.COMPUTER_USE_ROUTES.hubStop,`POST`,{artifact:i})),f.delete(t.sessionId),h===t.sessionId&&(h=void 0)},S=async n=>{if(!(g||p.has(n.sessionId))&&!((m.get(n.sessionId)??0)>Date.now())){p.add(n.sessionId);try{let t=await y(n);if(t.phase===`active`){let e=typeof t.expiresAt==`number`&&t.expiresAt<=Date.now(),i=!1;if(!e&&c.computerUse?.available)try{i=r(await c.computerUse.request(n,{operation:`status`}))?.ownedBySession===!0}catch{i=!0}if(e||!i){await x(n),await y(n);return}}if(t.phase===`awaiting_confirmation`&&(h===void 0||h===n.sessionId)){if(!c.computerUse?.available)throw Error(`DoomPi Desktop computer use is unavailable.`);let t=await a(await _(n,e.COMPUTER_USE_ROUTES.hubActivation));if(t!==null){h=n.sessionId;try{let i=await c.computerUse.request(n,{operation:`activate`,payload:t});await a(await _(n,e.COMPUTER_USE_ROUTES.hubStop,`POST`,{host:i}));let o=r(i)?.grantId;typeof o==`string`&&f.set(n.sessionId,o)}catch(t){h=void 0,await a(await _(n,e.COMPUTER_USE_ROUTES.hubStop,`POST`,{error:t instanceof Error?t.message:String(t)}))}await y(n)}}t.phase===`stopping`&&(await x(n),await y(n));let i=await a(await _(n,e.COMPUTER_USE_ROUTES.hubNext));i!==null&&await b(n,i)}catch(e){e instanceof t.MissingComputerUseApiError?(m.set(n.sessionId,t.missingComputerUseApiRetryAt(Date.now())),u.delete(n.sessionId)):c.onNotice(`computer-use poll failed for ${n.sessionId} (${e instanceof Error?e.message:String(e)})`)}finally{p.delete(n.sessionId)}}};s=(e,n)=>{let a=i(n);a!==void 0&&(m.delete(e.sessionId),(async()=>{try{if(a.action===`targets`){if(!c.computerUse?.available)throw Error(`DoomPi Desktop computer use is unavailable.`);let t=await c.computerUse.request(e,{operation:`targets`});d.set(e.sessionId,Array.isArray(t)?t.filter(e=>r(e)!==void 0):[])}else a.action===`stop`&&await x(e);await y(e)}catch(n){n instanceof t.MissingComputerUseApiError?(m.set(e.sessionId,t.missingComputerUseApiRetryAt(Date.now())),u.delete(e.sessionId)):c.onNotice(`computer-use command failed for ${e.sessionId} (${n instanceof Error?n.message:String(n)})`)}})())};let C=setInterval(()=>{for(let e of l.values())S(e)},o.pollMs??250);return{payloadFor:e=>u.get(e.sessionId),sessionAdded(e){l.set(e.sessionId,e),S(e)},sessionRemoved(e){let t=l.get(e),n=f.get(e);t!==void 0&&n!==void 0&&c.computerUse?.available&&c.computerUse.request(t,{operation:`stop`,payload:{grantId:n}}).catch(e=>c.onNotice(`computer-use session cleanup failed (${e instanceof Error?e.message:String(e)})`)),l.delete(e),u.delete(e),d.delete(e),f.delete(e),p.delete(e),m.delete(e),h===e&&(h=void 0)},close(){if(g=!0,clearInterval(C),c.computerUse?.available)for(let[e,t]of f){let n=l.get(e);n!==void 0&&c.computerUse.request(n,{operation:`stop`,payload:{grantId:t}}).catch(()=>void 0)}l.clear(),u.clear(),d.clear(),f.clear(),m.clear()}}},receive(e,t){s?.(e,t)}}}const s=[o()];exports.computerUseChannelType=e.computerUseChannelType,exports.createComputerUseChannel=o,exports.webHubChannels=s;
|
|
2
|
-
//# sourceMappingURL=webComputerUseChannel.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webComputerUseChannel.cjs","names":["computerUseSessionApiError","computerUseChannelType","API_BASE_PATH","COMPUTER_USE_ROUTES","randomUUID","MissingComputerUseApiError","missingComputerUseApiRetryAt"],"sources":["../../src/adapters/webComputerUseChannel.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { HubChannelSource, HubSessionScope, WebHubChannel } from '@agimon-ai/doompi-web-contracts';\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.ts';\nimport {\n computerUseSessionApiError,\n MissingComputerUseApiError,\n missingComputerUseApiRetryAt,\n} from './webComputerUseAvailability.ts';\nexport { computerUseChannelType };\n\nconst POLL_MS = 250;\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\nexport function createComputerUseChannel(options: { pollMs?: number } = {}): WebHubChannel {\n let receiveCommand: ((scope: HubSessionScope, payload: unknown) => void) | undefined;\n return {\n frameType: computerUseChannelType,\n lifecycle: 'hub',\n start(host) {\n const scopes = new Map<string, HubSessionScope>();\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 processing = new Set<string>();\n const unavailableUntil = new Map<string, number>();\n let activeSessionId: string | undefined;\n let closed = false;\n\n const sessionRequest = async (scope: HubSessionScope, 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: HubSessionScope, state: ComputerUseSessionView): void => {\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: HubSessionScope): Promise<ComputerUseSessionView> => {\n const state = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubState),\n )) as ComputerUseSessionView;\n if (state.phase === 'active' || state.phase === 'activating' || state.phase === 'stopping') {\n activeSessionId = scope.sessionId;\n if (state.phase === 'active' && !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 } else {\n if (activeSessionId === scope.sessionId) activeSessionId = undefined;\n grants.delete(scope.sessionId);\n }\n unavailableUntil.delete(scope.sessionId);\n publish(scope, state);\n return state;\n };\n\n const completePending = async (scope: HubSessionScope, pending: ComputerUseBrokerRequest): Promise<void> => {\n if (!host.computerUse?.available) throw new Error('DoomPi Desktop computer use is 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: HubSessionScope): 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 const pollScope = async (scope: HubSessionScope): Promise<void> => {\n if (closed || processing.has(scope.sessionId)) return;\n if ((unavailableUntil.get(scope.sessionId) ?? 0) > Date.now()) return;\n processing.add(scope.sessionId);\n try {\n const state = await refresh(scope);\n if (state.phase === 'active') {\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 if (!host.computerUse?.available) throw new Error('DoomPi Desktop computer use is unavailable.');\n const activation = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubActivation),\n )) as ComputerUseActivationRequest | null;\n if (activation !== null) {\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 unavailableUntil.set(scope.sessionId, missingComputerUseApiRetryAt(Date.now()));\n latest.delete(scope.sessionId);\n } else {\n host.onNotice(\n `computer-use poll failed for ${scope.sessionId} (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n } finally {\n processing.delete(scope.sessionId);\n }\n };\n\n receiveCommand = (scope, payload) => {\n const parsed = command(payload);\n if (parsed === undefined) return;\n unavailableUntil.delete(scope.sessionId);\n void (async () => {\n try {\n if (parsed.action === 'targets') {\n if (!host.computerUse?.available) throw new Error('DoomPi Desktop computer use is unavailable.');\n const result = await host.computerUse.request(scope, { operation: 'targets' });\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 } catch (error) {\n if (error instanceof MissingComputerUseApiError) {\n unavailableUntil.set(scope.sessionId, missingComputerUseApiRetryAt(Date.now()));\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 timer: ReturnType<typeof setInterval> = setInterval(() => {\n for (const scope of scopes.values()) void pollScope(scope);\n }, options.pollMs ?? POLL_MS);\n\n const source: HubChannelSource = {\n payloadFor: (scope) => latest.get(scope.sessionId),\n sessionAdded(scope) {\n scopes.set(scope.sessionId, scope);\n void pollScope(scope);\n },\n sessionRemoved(sessionId) {\n const scope = scopes.get(sessionId);\n const grantId = grants.get(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 unavailableUntil.delete(sessionId);\n if (activeSessionId === sessionId) activeSessionId = undefined;\n },\n close() {\n closed = true;\n clearInterval(timer);\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 unavailableUntil.clear();\n },\n };\n return source;\n },\n receive(scope, payload) {\n receiveCommand?.(scope, payload);\n },\n };\n}\n\nexport const webHubChannels: readonly WebHubChannel[] = [createComputerUseChannel()];\n"],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { computerUseChannelType } from "../types/computerUseApi.cjs";
|
|
2
|
-
import { WebHubChannel } from "@agimon-ai/doompi-web-contracts";
|
|
3
|
-
//#region src/adapters/webComputerUseChannel.d.ts
|
|
4
|
-
export declare function createComputerUseChannel(options?: {
|
|
5
|
-
pollMs?: number;
|
|
6
|
-
}): WebHubChannel;
|
|
7
|
-
export declare const webHubChannels: readonly WebHubChannel[];
|
|
8
|
-
//#endregion
|
|
9
|
-
export { computerUseChannelType };
|
|
10
|
-
//# sourceMappingURL=webComputerUseChannel.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webComputerUseChannel.d.cts","names":[],"sources":["../../src/adapters/webComputerUseChannel.ts"],"mappings":";;;wBA2CgB,yBAAyB;EAAW;IAAyB;qBA2QhE,yBAAyB"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { computerUseChannelType } from "../types/computerUseApi.mjs";
|
|
2
|
-
import { WebHubChannel } from "@agimon-ai/doompi-web-contracts";
|
|
3
|
-
//#region src/adapters/webComputerUseChannel.d.ts
|
|
4
|
-
export declare function createComputerUseChannel(options?: {
|
|
5
|
-
pollMs?: number;
|
|
6
|
-
}): WebHubChannel;
|
|
7
|
-
export declare const webHubChannels: readonly WebHubChannel[];
|
|
8
|
-
//#endregion
|
|
9
|
-
export { computerUseChannelType };
|
|
10
|
-
//# sourceMappingURL=webComputerUseChannel.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webComputerUseChannel.d.mts","names":[],"sources":["../../src/adapters/webComputerUseChannel.ts"],"mappings":";;;wBA2CgB,yBAAyB;EAAW;IAAyB;qBA2QhE,yBAAyB"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{API_BASE_PATH as e,COMPUTER_USE_ROUTES as t,computerUseChannelType as n}from"../types/computerUseApi.mjs";import{MissingComputerUseApiError as r,computerUseSessionApiError as i,missingComputerUseApiRetryAt as a}from"./webComputerUseAvailability.mjs";import{randomUUID as o}from"node:crypto";function s(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function c(e){let t=s(e);return t?.action===`status`||t?.action===`targets`||t?.action===`stop`||t?.action===`artifacts`?{action:t.action}:void 0}async function l(e){let t=await e.json();if(!e.ok)throw i(e.status,t);return t}function u(i={}){let u;return{frameType:n,lifecycle:`hub`,start(n){let d=new Map,f=new Map,p=new Map,m=new Map,h=new Set,g=new Map,_,v=!1,y=async(t,r,i=`GET`,a)=>n.requestSessionApi(t,{basePath:e,path:r,method:i,...a===void 0?{}:{body:JSON.stringify(a)}}),b=(e,t)=>{let r={state:t,targets:p.get(e.sessionId)??[],..._!==void 0&&_!==e.sessionId?{busy:!0}:{}};f.set(e.sessionId,r),n.publish(e.sessionId,r)},x=async e=>{let n=await l(await y(e,t.hubState));if(n.phase===`active`||n.phase===`activating`||n.phase===`stopping`){if(_=e.sessionId,n.phase===`active`&&!m.has(e.sessionId)){let n=await l(await y(e,t.hubAuthorization));n!==null&&m.set(e.sessionId,n.grantId)}}else _===e.sessionId&&(_=void 0),m.delete(e.sessionId);return g.delete(e.sessionId),b(e,n),n},S=async(e,r)=>{if(!n.computerUse?.available)throw Error(`DoomPi Desktop computer use is unavailable.`);try{let i=await n.computerUse.request(e,{operation:r.operation,payload:r.operation===`act`?{grantId:r.grantId,sequence:r.sequence,action:r.payload}:{grantId:r.grantId}});await l(await y(e,t.hubComplete,`POST`,{id:r.id,result:i}))}catch(n){await l(await y(e,t.hubComplete,`POST`,{id:r.id,error:n instanceof Error?n.message:String(n)}))}},C=async e=>{let r=await l(await y(e,t.hubAuthorization)),i;if(r!==null&&n.computerUse?.available)try{i=await n.computerUse.request(e,{operation:`stop`,payload:{grantId:r.grantId}})}catch(e){let t=e instanceof Error?e.message:String(e);i={artifactId:o(),status:`failed`,failure:{code:`recording_failed`,message:t.slice(0,512)}},n.onNotice(`computer-use Desktop stop was already unavailable (${t})`)}await l(await y(e,t.hubStop,`POST`,{artifact:i})),m.delete(e.sessionId),_===e.sessionId&&(_=void 0)},w=async e=>{if(!(v||h.has(e.sessionId))&&!((g.get(e.sessionId)??0)>Date.now())){h.add(e.sessionId);try{let r=await x(e);if(r.phase===`active`){let t=typeof r.expiresAt==`number`&&r.expiresAt<=Date.now(),i=!1;if(!t&&n.computerUse?.available)try{i=s(await n.computerUse.request(e,{operation:`status`}))?.ownedBySession===!0}catch{i=!0}if(t||!i){await C(e),await x(e);return}}if(r.phase===`awaiting_confirmation`&&(_===void 0||_===e.sessionId)){if(!n.computerUse?.available)throw Error(`DoomPi Desktop computer use is unavailable.`);let r=await l(await y(e,t.hubActivation));if(r!==null){_=e.sessionId;try{let i=await n.computerUse.request(e,{operation:`activate`,payload:r});await l(await y(e,t.hubStop,`POST`,{host:i}));let a=s(i)?.grantId;typeof a==`string`&&m.set(e.sessionId,a)}catch(n){_=void 0,await l(await y(e,t.hubStop,`POST`,{error:n instanceof Error?n.message:String(n)}))}await x(e)}}r.phase===`stopping`&&(await C(e),await x(e));let i=await l(await y(e,t.hubNext));i!==null&&await S(e,i)}catch(t){t instanceof r?(g.set(e.sessionId,a(Date.now())),f.delete(e.sessionId)):n.onNotice(`computer-use poll failed for ${e.sessionId} (${t instanceof Error?t.message:String(t)})`)}finally{h.delete(e.sessionId)}}};u=(e,t)=>{let i=c(t);i!==void 0&&(g.delete(e.sessionId),(async()=>{try{if(i.action===`targets`){if(!n.computerUse?.available)throw Error(`DoomPi Desktop computer use is unavailable.`);let t=await n.computerUse.request(e,{operation:`targets`});p.set(e.sessionId,Array.isArray(t)?t.filter(e=>s(e)!==void 0):[])}else i.action===`stop`&&await C(e);await x(e)}catch(t){t instanceof r?(g.set(e.sessionId,a(Date.now())),f.delete(e.sessionId)):n.onNotice(`computer-use command failed for ${e.sessionId} (${t instanceof Error?t.message:String(t)})`)}})())};let T=setInterval(()=>{for(let e of d.values())w(e)},i.pollMs??250);return{payloadFor:e=>f.get(e.sessionId),sessionAdded(e){d.set(e.sessionId,e),w(e)},sessionRemoved(e){let t=d.get(e),r=m.get(e);t!==void 0&&r!==void 0&&n.computerUse?.available&&n.computerUse.request(t,{operation:`stop`,payload:{grantId:r}}).catch(e=>n.onNotice(`computer-use session cleanup failed (${e instanceof Error?e.message:String(e)})`)),d.delete(e),f.delete(e),p.delete(e),m.delete(e),h.delete(e),g.delete(e),_===e&&(_=void 0)},close(){if(v=!0,clearInterval(T),n.computerUse?.available)for(let[e,t]of m){let r=d.get(e);r!==void 0&&n.computerUse.request(r,{operation:`stop`,payload:{grantId:t}}).catch(()=>void 0)}d.clear(),f.clear(),p.clear(),m.clear(),g.clear()}}},receive(e,t){u?.(e,t)}}}const d=[u()];export{n as computerUseChannelType,u as createComputerUseChannel,d as webHubChannels};
|
|
2
|
-
//# sourceMappingURL=webComputerUseChannel.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webComputerUseChannel.mjs","names":[],"sources":["../../src/adapters/webComputerUseChannel.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport type { HubChannelSource, HubSessionScope, WebHubChannel } from '@agimon-ai/doompi-web-contracts';\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.ts';\nimport {\n computerUseSessionApiError,\n MissingComputerUseApiError,\n missingComputerUseApiRetryAt,\n} from './webComputerUseAvailability.ts';\nexport { computerUseChannelType };\n\nconst POLL_MS = 250;\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\nexport function createComputerUseChannel(options: { pollMs?: number } = {}): WebHubChannel {\n let receiveCommand: ((scope: HubSessionScope, payload: unknown) => void) | undefined;\n return {\n frameType: computerUseChannelType,\n lifecycle: 'hub',\n start(host) {\n const scopes = new Map<string, HubSessionScope>();\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 processing = new Set<string>();\n const unavailableUntil = new Map<string, number>();\n let activeSessionId: string | undefined;\n let closed = false;\n\n const sessionRequest = async (scope: HubSessionScope, 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: HubSessionScope, state: ComputerUseSessionView): void => {\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: HubSessionScope): Promise<ComputerUseSessionView> => {\n const state = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubState),\n )) as ComputerUseSessionView;\n if (state.phase === 'active' || state.phase === 'activating' || state.phase === 'stopping') {\n activeSessionId = scope.sessionId;\n if (state.phase === 'active' && !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 } else {\n if (activeSessionId === scope.sessionId) activeSessionId = undefined;\n grants.delete(scope.sessionId);\n }\n unavailableUntil.delete(scope.sessionId);\n publish(scope, state);\n return state;\n };\n\n const completePending = async (scope: HubSessionScope, pending: ComputerUseBrokerRequest): Promise<void> => {\n if (!host.computerUse?.available) throw new Error('DoomPi Desktop computer use is 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: HubSessionScope): 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 const pollScope = async (scope: HubSessionScope): Promise<void> => {\n if (closed || processing.has(scope.sessionId)) return;\n if ((unavailableUntil.get(scope.sessionId) ?? 0) > Date.now()) return;\n processing.add(scope.sessionId);\n try {\n const state = await refresh(scope);\n if (state.phase === 'active') {\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 if (!host.computerUse?.available) throw new Error('DoomPi Desktop computer use is unavailable.');\n const activation = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubActivation),\n )) as ComputerUseActivationRequest | null;\n if (activation !== null) {\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 unavailableUntil.set(scope.sessionId, missingComputerUseApiRetryAt(Date.now()));\n latest.delete(scope.sessionId);\n } else {\n host.onNotice(\n `computer-use poll failed for ${scope.sessionId} (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n } finally {\n processing.delete(scope.sessionId);\n }\n };\n\n receiveCommand = (scope, payload) => {\n const parsed = command(payload);\n if (parsed === undefined) return;\n unavailableUntil.delete(scope.sessionId);\n void (async () => {\n try {\n if (parsed.action === 'targets') {\n if (!host.computerUse?.available) throw new Error('DoomPi Desktop computer use is unavailable.');\n const result = await host.computerUse.request(scope, { operation: 'targets' });\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 } catch (error) {\n if (error instanceof MissingComputerUseApiError) {\n unavailableUntil.set(scope.sessionId, missingComputerUseApiRetryAt(Date.now()));\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 timer: ReturnType<typeof setInterval> = setInterval(() => {\n for (const scope of scopes.values()) void pollScope(scope);\n }, options.pollMs ?? POLL_MS);\n\n const source: HubChannelSource = {\n payloadFor: (scope) => latest.get(scope.sessionId),\n sessionAdded(scope) {\n scopes.set(scope.sessionId, scope);\n void pollScope(scope);\n },\n sessionRemoved(sessionId) {\n const scope = scopes.get(sessionId);\n const grantId = grants.get(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 unavailableUntil.delete(sessionId);\n if (activeSessionId === sessionId) activeSessionId = undefined;\n },\n close() {\n closed = true;\n clearInterval(timer);\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 unavailableUntil.clear();\n },\n };\n return source;\n },\n receive(scope, payload) {\n receiveCommand?.(scope, payload);\n },\n };\n}\n\nexport const webHubChannels: readonly WebHubChannel[] = [createComputerUseChannel()];\n"],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=`computer-use`,t=`Inspect or manage the session computer use mode`;function n(n,r){n.registerCommand(e,{description:t,handler:async(e,t)=>{let n=await r.execute();t.hasUI&&t.ui.notify(n.message,n.level)}})}exports.COMMAND_DESCRIPTION=t,exports.COMMAND_NAME=e,exports.registerComputerUseCommand=n;
|
|
2
|
-
//# sourceMappingURL=computerUseCommand.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"computerUseCommand.cjs","names":[],"sources":["../../src/commands/computerUseCommand.ts"],"sourcesContent":["// @scaffold-generated\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport type { ComputerUseExtensionService } from '../types/extension.ts';\n\nexport const COMMAND_NAME = 'computer-use';\nexport const COMMAND_DESCRIPTION = 'Inspect or manage the session computer use mode';\n\nexport function registerComputerUseCommand(\n pi: Pick<ExtensionAPI, 'registerCommand'>,\n service: ComputerUseExtensionService,\n): void {\n pi.registerCommand(COMMAND_NAME, {\n description: COMMAND_DESCRIPTION,\n handler: async (_args, ctx) => {\n const result = await service.execute();\n if (ctx.hasUI) ctx.ui.notify(result.message, result.level);\n },\n });\n}\n"],"mappings":"AAIA,MAAa,EAAe,eACf,EAAsB,kDAEnC,SAAgB,EACd,EACA,EACM,CACN,EAAG,gBAAgB,EAAc,CAC/B,YAAa,EACb,QAAS,MAAO,EAAO,IAAQ,CAC7B,IAAM,EAAS,MAAM,EAAQ,QAAQ,EACjC,EAAI,OAAO,EAAI,GAAG,OAAO,EAAO,QAAS,EAAO,KAAK,CAC3D,CACF,CAAC,CACH"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=`computer-use`,t=`Inspect or manage the session computer use mode`;function n(n,r){n.registerCommand(e,{description:t,handler:async(e,t)=>{let n=await r.execute();t.hasUI&&t.ui.notify(n.message,n.level)}})}export{t as COMMAND_DESCRIPTION,e as COMMAND_NAME,n as registerComputerUseCommand};
|
|
2
|
-
//# sourceMappingURL=computerUseCommand.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"computerUseCommand.mjs","names":[],"sources":["../../src/commands/computerUseCommand.ts"],"sourcesContent":["// @scaffold-generated\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\nimport type { ComputerUseExtensionService } from '../types/extension.ts';\n\nexport const COMMAND_NAME = 'computer-use';\nexport const COMMAND_DESCRIPTION = 'Inspect or manage the session computer use mode';\n\nexport function registerComputerUseCommand(\n pi: Pick<ExtensionAPI, 'registerCommand'>,\n service: ComputerUseExtensionService,\n): void {\n pi.registerCommand(COMMAND_NAME, {\n description: COMMAND_DESCRIPTION,\n handler: async (_args, ctx) => {\n const result = await service.execute();\n if (ctx.hasUI) ctx.ui.notify(result.message, result.level);\n },\n });\n}\n"],"mappings":"AAIA,MAAa,EAAe,eACf,EAAsB,kDAEnC,SAAgB,EACd,EACA,EACM,CACN,EAAG,gBAAgB,EAAc,CAC/B,YAAa,EACb,QAAS,MAAO,EAAO,IAAQ,CAC7B,IAAM,EAAS,MAAM,EAAQ,QAAQ,EACjC,EAAI,OAAO,EAAI,GAAG,OAAO,EAAO,QAAS,EAAO,KAAK,CAC3D,CACF,CAAC,CACH"}
|
package/dist/container/index.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../adapters/pi/sessionApiClient.cjs"),n=require("../adapters/pi/computerScriptRunner.cjs"),r=require("../services/extensionService.cjs");let i=require("node:path");i=e.__toESM(i,1);let a=require("@agimon-ai/doompi-config");function o(e={}){let o=e.client??t.createComputerUseSessionClient(),s=(process.env.DOOMPI_COMPUTER_USE_SCRIPT_PATHS??``).split(i.default.delimiter).filter(e=>e.length>0);return{service:e.service??new r.DefaultComputerUseExtensionService(o),enabled:e.enabled??(()=>(0,a.loadDoomConfig)(process.env.PI_PROJECT_ROOT??process.cwd()).computerUse?.enabled===!0),...o===void 0?{}:{client:o},...e.scriptRunner===void 0?o===void 0?{}:{scriptRunner:new n.ComputerScriptRunner({client:o,allowedScriptPaths:s})}:{scriptRunner:e.scriptRunner}}}exports.COMPUTER_USE_SCRIPT_PATHS_ENV=`DOOMPI_COMPUTER_USE_SCRIPT_PATHS`,exports.createComputerUseContainer=o;
|
|
2
|
-
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["createComputerUseSessionClient","path","DefaultComputerUseExtensionService","loadDoomConfig","ComputerScriptRunner"],"sources":["../../src/container/index.ts"],"sourcesContent":["import path from 'node:path';\nimport { loadDoomConfig } from '@agimon-ai/doompi-config';\nimport { createComputerUseSessionClient } from '../adapters/pi/sessionApiClient.ts';\nimport { ComputerScriptRunner } from '../adapters/pi/computerScriptRunner.ts';\nimport { DefaultComputerUseExtensionService } from '../services/extensionService.ts';\nimport type { ComputerUseExtensionDependencies } from '../types/extension.ts';\n\nexport const COMPUTER_USE_SCRIPT_PATHS_ENV = 'DOOMPI_COMPUTER_USE_SCRIPT_PATHS';\nexport function createComputerUseContainer(\n overrides: Partial<ComputerUseExtensionDependencies> = {},\n): ComputerUseExtensionDependencies {\n const client = overrides.client ?? createComputerUseSessionClient();\n const allowedScriptPaths = (process.env[COMPUTER_USE_SCRIPT_PATHS_ENV] ?? '')\n .split(path.delimiter)\n .filter((entry) => entry.length > 0);\n return {\n service: overrides.service ?? new DefaultComputerUseExtensionService(client),\n enabled:\n overrides.enabled ??\n (() => loadDoomConfig(process.env.PI_PROJECT_ROOT ?? process.cwd()).computerUse?.enabled === true),\n ...(client === undefined ? {} : { client }),\n ...(overrides.scriptRunner !== undefined\n ? { scriptRunner: overrides.scriptRunner }\n : client === undefined\n ? {}\n : { scriptRunner: new ComputerScriptRunner({ client, allowedScriptPaths }) }),\n };\n}\n"],"mappings":"+RAQA,SAAgB,EACd,EAAuD,CAAC,EACtB,CAClC,IAAM,EAAS,EAAU,QAAUA,EAAAA,+BAA+B,EAC5D,GAAsB,QAAQ,IAAA,kCAAsC,GAAA,CACvE,MAAMC,EAAAA,QAAK,SAAS,CAAC,CACrB,OAAQ,GAAU,EAAM,OAAS,CAAC,EACrC,MAAO,CACL,QAAS,EAAU,SAAW,IAAIC,EAAAA,mCAAmC,CAAM,EAC3E,QACE,EAAU,eAAA,EACHC,EAAAA,eAAAA,CAAe,QAAQ,IAAI,iBAAmB,QAAQ,IAAI,CAAC,CAAC,CAAC,aAAa,UAAY,IAC/F,GAAI,IAAW,IAAA,GAAY,CAAC,EAAI,CAAE,QAAO,EACzC,GAAI,EAAU,eAAiB,IAAA,GAE3B,IAAW,IAAA,GACT,CAAC,EACD,CAAE,aAAc,IAAIC,EAAAA,qBAAqB,CAAE,SAAQ,oBAAmB,CAAC,CAAE,EAH3E,CAAE,aAAc,EAAU,YAAa,CAI7C,CACF"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { ComputerUseExtensionDependencies } from "../types/extension.cjs";
|
|
2
|
-
//#region src/container/index.d.ts
|
|
3
|
-
export declare const COMPUTER_USE_SCRIPT_PATHS_ENV = "DOOMPI_COMPUTER_USE_SCRIPT_PATHS";
|
|
4
|
-
export declare function createComputerUseContainer(overrides?: Partial<ComputerUseExtensionDependencies>): ComputerUseExtensionDependencies;
|
|
5
|
-
//#endregion
|
|
6
|
-
//# sourceMappingURL=index.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/container/index.ts"],"mappings":";;qBAOa;wBACG,2BACd,YAAW,QAAQ,oCAClB"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import { ComputerUseExtensionDependencies } from "../types/extension.mjs";
|
|
2
|
-
//#region src/container/index.d.ts
|
|
3
|
-
export declare const COMPUTER_USE_SCRIPT_PATHS_ENV = "DOOMPI_COMPUTER_USE_SCRIPT_PATHS";
|
|
4
|
-
export declare function createComputerUseContainer(overrides?: Partial<ComputerUseExtensionDependencies>): ComputerUseExtensionDependencies;
|
|
5
|
-
//#endregion
|
|
6
|
-
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/container/index.ts"],"mappings":";;qBAOa;wBACG,2BACd,YAAW,QAAQ,oCAClB"}
|
package/dist/container/index.mjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{createComputerUseSessionClient as e}from"../adapters/pi/sessionApiClient.mjs";import{ComputerScriptRunner as t}from"../adapters/pi/computerScriptRunner.mjs";import{DefaultComputerUseExtensionService as n}from"../services/extensionService.mjs";import r from"node:path";import{loadDoomConfig as i}from"@agimon-ai/doompi-config";const a=`DOOMPI_COMPUTER_USE_SCRIPT_PATHS`;function o(a={}){let o=a.client??e(),s=(process.env.DOOMPI_COMPUTER_USE_SCRIPT_PATHS??``).split(r.delimiter).filter(e=>e.length>0);return{service:a.service??new n(o),enabled:a.enabled??(()=>i(process.env.PI_PROJECT_ROOT??process.cwd()).computerUse?.enabled===!0),...o===void 0?{}:{client:o},...a.scriptRunner===void 0?o===void 0?{}:{scriptRunner:new t({client:o,allowedScriptPaths:s})}:{scriptRunner:a.scriptRunner}}}export{a as COMPUTER_USE_SCRIPT_PATHS_ENV,o as createComputerUseContainer};
|
|
2
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/container/index.ts"],"sourcesContent":["import path from 'node:path';\nimport { loadDoomConfig } from '@agimon-ai/doompi-config';\nimport { createComputerUseSessionClient } from '../adapters/pi/sessionApiClient.ts';\nimport { ComputerScriptRunner } from '../adapters/pi/computerScriptRunner.ts';\nimport { DefaultComputerUseExtensionService } from '../services/extensionService.ts';\nimport type { ComputerUseExtensionDependencies } from '../types/extension.ts';\n\nexport const COMPUTER_USE_SCRIPT_PATHS_ENV = 'DOOMPI_COMPUTER_USE_SCRIPT_PATHS';\nexport function createComputerUseContainer(\n overrides: Partial<ComputerUseExtensionDependencies> = {},\n): ComputerUseExtensionDependencies {\n const client = overrides.client ?? createComputerUseSessionClient();\n const allowedScriptPaths = (process.env[COMPUTER_USE_SCRIPT_PATHS_ENV] ?? '')\n .split(path.delimiter)\n .filter((entry) => entry.length > 0);\n return {\n service: overrides.service ?? new DefaultComputerUseExtensionService(client),\n enabled:\n overrides.enabled ??\n (() => loadDoomConfig(process.env.PI_PROJECT_ROOT ?? process.cwd()).computerUse?.enabled === true),\n ...(client === undefined ? {} : { client }),\n ...(overrides.scriptRunner !== undefined\n ? { scriptRunner: overrides.scriptRunner }\n : client === undefined\n ? {}\n : { scriptRunner: new ComputerScriptRunner({ client, allowedScriptPaths }) }),\n };\n}\n"],"mappings":"6UAOA,MAAa,EAAgC,mCAC7C,SAAgB,EACd,EAAuD,CAAC,EACtB,CAClC,IAAM,EAAS,EAAU,QAAU,EAA+B,EAC5D,GAAsB,QAAQ,IAAA,kCAAsC,GAAA,CACvE,MAAM,EAAK,SAAS,CAAC,CACrB,OAAQ,GAAU,EAAM,OAAS,CAAC,EACrC,MAAO,CACL,QAAS,EAAU,SAAW,IAAI,EAAmC,CAAM,EAC3E,QACE,EAAU,cACH,EAAe,QAAQ,IAAI,iBAAmB,QAAQ,IAAI,CAAC,CAAC,CAAC,aAAa,UAAY,IAC/F,GAAI,IAAW,IAAA,GAAY,CAAC,EAAI,CAAE,QAAO,EACzC,GAAI,EAAU,eAAiB,IAAA,GAE3B,IAAW,IAAA,GACT,CAAC,EACD,CAAE,aAAc,IAAI,EAAqB,CAAE,SAAQ,oBAAmB,CAAC,CAAE,EAH3E,CAAE,aAAc,EAAU,YAAa,CAI7C,CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extensionService.cjs","names":[],"sources":["../../src/services/extensionService.ts"],"sourcesContent":["import type { ComputerUseSessionClient } from '../adapters/pi/sessionApiClient.ts';\nimport type { ComputerUseExtensionResult, ComputerUseExtensionService } from '../types/extension.ts';\n\nexport class DefaultComputerUseExtensionService implements ComputerUseExtensionService {\n public constructor(private readonly client?: ComputerUseSessionClient) {}\n\n public async execute(): Promise<ComputerUseExtensionResult> {\n if (this.client === undefined)\n return { message: 'Computer use requires a DoomPi Desktop session.', level: 'error' };\n const state = await this.client.state();\n return { message: `Computer use is ${state.phase.replaceAll('_', ' ')}.`, level: 'info' };\n }\n}\n"],"mappings":"AAGA,IAAa,EAAb,KAAuF,CACjD,OAApC,YAAmB,EAAoD,CAAnC,KAAA,OAAA,CAAoC,CAExE,MAAa,SAA+C,CAI1D,OAHI,KAAK,SAAW,IAAA,GACX,CAAE,QAAS,kDAAmD,MAAO,OAAQ,EAE/E,CAAE,QAAS,oBAAmB,MADjB,KAAK,OAAO,MAAM,EAAA,CACK,MAAM,WAAW,IAAK,GAAG,EAAE,GAAI,MAAO,MAAO,CAC1F,CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extensionService.d.cts","names":[],"sources":["../../src/services/extensionService.ts"],"mappings":";;;qBAGa,8CAA8C;mBACrB;EAApC,YAAoC,SAAS;EAEhC,WAAW,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extensionService.d.mts","names":[],"sources":["../../src/services/extensionService.ts"],"mappings":";;;qBAGa,8CAA8C;mBACrB;EAApC,YAAoC,SAAS;EAEhC,WAAW,QAAQ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extensionService.mjs","names":[],"sources":["../../src/services/extensionService.ts"],"sourcesContent":["import type { ComputerUseSessionClient } from '../adapters/pi/sessionApiClient.ts';\nimport type { ComputerUseExtensionResult, ComputerUseExtensionService } from '../types/extension.ts';\n\nexport class DefaultComputerUseExtensionService implements ComputerUseExtensionService {\n public constructor(private readonly client?: ComputerUseSessionClient) {}\n\n public async execute(): Promise<ComputerUseExtensionResult> {\n if (this.client === undefined)\n return { message: 'Computer use requires a DoomPi Desktop session.', level: 'error' };\n const state = await this.client.state();\n return { message: `Computer use is ${state.phase.replaceAll('_', ' ')}.`, level: 'info' };\n }\n}\n"],"mappings":"AAGA,IAAa,EAAb,KAAuF,CACjD,OAApC,YAAmB,EAAoD,CAAnC,KAAA,OAAA,CAAoC,CAExE,MAAa,SAA+C,CAI1D,OAHI,KAAK,SAAW,IAAA,GACX,CAAE,QAAS,kDAAmD,MAAO,OAAQ,EAE/E,CAAE,QAAS,oBAAmB,MADjB,KAAK,OAAO,MAAM,EAAA,CACK,MAAM,WAAW,IAAK,GAAG,EAAE,GAAI,MAAO,MAAO,CAC1F,CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessionController.cjs","names":[],"sources":["../../src/services/sessionController.ts"],"sourcesContent":["import type { ComputerUseState, ComputerUseStateEvent } from '../types/computerUse.ts';\n\nfunction requireRequest(state: ComputerUseState, requestId: string): void {\n if (state.requestId !== requestId) throw new Error('The computer-use activation request is stale.');\n}\n\nfunction next(state: ComputerUseState, patch: Omit<ComputerUseState, 'revision' | 'identity'>): ComputerUseState {\n return {\n revision: state.revision + 1,\n identity: state.identity,\n ...patch,\n };\n}\n\nexport function initialComputerUseState(identity: ComputerUseState['identity']): ComputerUseState {\n return { revision: 0, phase: 'inactive', identity };\n}\n\nexport function reduceComputerUseState(state: ComputerUseState, event: ComputerUseStateEvent): ComputerUseState {\n if (event.type === 'fail') {\n return next(state, {\n phase: 'failed',\n failure: { code: event.code, message: event.message },\n ...(state.requestId === undefined ? {} : { requestId: state.requestId }),\n ...(state.target === undefined ? {} : { target: state.target }),\n ...(state.grant === undefined ? {} : { grant: state.grant }),\n });\n }\n\n if (event.type === 'reset') {\n if (state.phase !== 'failed') throw new Error('Only a failed computer-use state can be reset.');\n return next(state, { phase: 'inactive' });\n }\n\n switch (state.phase) {\n case 'inactive': {\n if (event.type !== 'request') throw new Error('Computer use is inactive.');\n return next(state, {\n phase: 'requesting',\n requestId: event.requestId,\n target: event.target,\n });\n }\n case 'requesting': {\n if (event.type !== 'await_confirmation') throw new Error('Computer use is preparing an activation request.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'awaiting_confirmation',\n requestId: event.requestId,\n target: state.target,\n });\n }\n case 'awaiting_confirmation': {\n if (event.type === 'deny') {\n requireRequest(state, event.requestId);\n return next(state, { phase: 'inactive' });\n }\n if (event.type !== 'confirm') throw new Error('Computer use is waiting for confirmation.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'activating',\n requestId: event.requestId,\n target: state.target,\n });\n }\n case 'activating': {\n if (event.type !== 'activated') throw new Error('Computer use is activating.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'active',\n requestId: event.requestId,\n target: state.target,\n grant: event.grant,\n });\n }\n case 'active': {\n if (event.type !== 'stop') throw new Error('Computer use is active.');\n return next(state, {\n phase: 'stopping',\n requestId: state.requestId,\n target: state.target,\n grant: state.grant,\n });\n }\n case 'stopping': {\n if (event.type !== 'stopped') throw new Error('Computer use is stopping.');\n return next(state, { phase: 'inactive' });\n }\n case 'failed':\n throw new Error('Computer use must be reset before another transition.');\n }\n}\n"],"mappings":"AAEA,SAAS,EAAe,EAAyB,EAAyB,CACxE,GAAI,EAAM,YAAc,EAAW,MAAU,MAAM,+CAA+C,CACpG,CAEA,SAAS,EAAK,EAAyB,EAA0E,CAC/G,MAAO,CACL,SAAU,EAAM,SAAW,EAC3B,SAAU,EAAM,SAChB,GAAG,CACL,CACF,CAEA,SAAgB,EAAwB,EAA0D,CAChG,MAAO,CAAE,SAAU,EAAG,MAAO,WAAY,UAAS,CACpD,CAEA,SAAgB,EAAuB,EAAyB,EAAgD,CAC9G,GAAI,EAAM,OAAS,OACjB,OAAO,EAAK,EAAO,CACjB,MAAO,SACP,QAAS,CAAE,KAAM,EAAM,KAAM,QAAS,EAAM,OAAQ,EACpD,GAAI,EAAM,YAAc,IAAA,GAAY,CAAC,EAAI,CAAE,UAAW,EAAM,SAAU,EACtE,GAAI,EAAM,SAAW,IAAA,GAAY,CAAC,EAAI,CAAE,OAAQ,EAAM,MAAO,EAC7D,GAAI,EAAM,QAAU,IAAA,GAAY,CAAC,EAAI,CAAE,MAAO,EAAM,KAAM,CAC5D,CAAC,EAGH,GAAI,EAAM,OAAS,QAAS,CAC1B,GAAI,EAAM,QAAU,SAAU,MAAU,MAAM,gDAAgD,EAC9F,OAAO,EAAK,EAAO,CAAE,MAAO,UAAW,CAAC,CAC1C,CAEA,OAAQ,EAAM,MAAd,CACE,IAAK,WACH,GAAI,EAAM,OAAS,UAAW,MAAU,MAAM,2BAA2B,EACzE,OAAO,EAAK,EAAO,CACjB,MAAO,aACP,UAAW,EAAM,UACjB,OAAQ,EAAM,MAChB,CAAC,EAEH,IAAK,aACH,GAAI,EAAM,OAAS,qBAAsB,MAAU,MAAM,kDAAkD,EAE3G,OADA,EAAe,EAAO,EAAM,SAAS,EAC9B,EAAK,EAAO,CACjB,MAAO,wBACP,UAAW,EAAM,UACjB,OAAQ,EAAM,MAChB,CAAC,EAEH,IAAK,wBACH,GAAI,EAAM,OAAS,OAEjB,OADA,EAAe,EAAO,EAAM,SAAS,EAC9B,EAAK,EAAO,CAAE,MAAO,UAAW,CAAC,EAE1C,GAAI,EAAM,OAAS,UAAW,MAAU,MAAM,2CAA2C,EAEzF,OADA,EAAe,EAAO,EAAM,SAAS,EAC9B,EAAK,EAAO,CACjB,MAAO,aACP,UAAW,EAAM,UACjB,OAAQ,EAAM,MAChB,CAAC,EAEH,IAAK,aACH,GAAI,EAAM,OAAS,YAAa,MAAU,MAAM,6BAA6B,EAE7E,OADA,EAAe,EAAO,EAAM,SAAS,EAC9B,EAAK,EAAO,CACjB,MAAO,SACP,UAAW,EAAM,UACjB,OAAQ,EAAM,OACd,MAAO,EAAM,KACf,CAAC,EAEH,IAAK,SACH,GAAI,EAAM,OAAS,OAAQ,MAAU,MAAM,yBAAyB,EACpE,OAAO,EAAK,EAAO,CACjB,MAAO,WACP,UAAW,EAAM,UACjB,OAAQ,EAAM,OACd,MAAO,EAAM,KACf,CAAC,EAEH,IAAK,WACH,GAAI,EAAM,OAAS,UAAW,MAAU,MAAM,2BAA2B,EACzE,OAAO,EAAK,EAAO,CAAE,MAAO,UAAW,CAAC,EAE1C,IAAK,SACH,MAAU,MAAM,uDAAuD,CAC3E,CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessionController.d.cts","names":[],"sources":["../../src/services/sessionController.ts"],"mappings":";;wBAcgB,wBAAwB,UAAU,+BAA+B;wBAIjE,uBAAuB,OAAO,kBAAkB,OAAO,wBAAwB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessionController.d.mts","names":[],"sources":["../../src/services/sessionController.ts"],"mappings":";;wBAcgB,wBAAwB,UAAU,+BAA+B;wBAIjE,uBAAuB,OAAO,kBAAkB,OAAO,wBAAwB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessionController.mjs","names":[],"sources":["../../src/services/sessionController.ts"],"sourcesContent":["import type { ComputerUseState, ComputerUseStateEvent } from '../types/computerUse.ts';\n\nfunction requireRequest(state: ComputerUseState, requestId: string): void {\n if (state.requestId !== requestId) throw new Error('The computer-use activation request is stale.');\n}\n\nfunction next(state: ComputerUseState, patch: Omit<ComputerUseState, 'revision' | 'identity'>): ComputerUseState {\n return {\n revision: state.revision + 1,\n identity: state.identity,\n ...patch,\n };\n}\n\nexport function initialComputerUseState(identity: ComputerUseState['identity']): ComputerUseState {\n return { revision: 0, phase: 'inactive', identity };\n}\n\nexport function reduceComputerUseState(state: ComputerUseState, event: ComputerUseStateEvent): ComputerUseState {\n if (event.type === 'fail') {\n return next(state, {\n phase: 'failed',\n failure: { code: event.code, message: event.message },\n ...(state.requestId === undefined ? {} : { requestId: state.requestId }),\n ...(state.target === undefined ? {} : { target: state.target }),\n ...(state.grant === undefined ? {} : { grant: state.grant }),\n });\n }\n\n if (event.type === 'reset') {\n if (state.phase !== 'failed') throw new Error('Only a failed computer-use state can be reset.');\n return next(state, { phase: 'inactive' });\n }\n\n switch (state.phase) {\n case 'inactive': {\n if (event.type !== 'request') throw new Error('Computer use is inactive.');\n return next(state, {\n phase: 'requesting',\n requestId: event.requestId,\n target: event.target,\n });\n }\n case 'requesting': {\n if (event.type !== 'await_confirmation') throw new Error('Computer use is preparing an activation request.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'awaiting_confirmation',\n requestId: event.requestId,\n target: state.target,\n });\n }\n case 'awaiting_confirmation': {\n if (event.type === 'deny') {\n requireRequest(state, event.requestId);\n return next(state, { phase: 'inactive' });\n }\n if (event.type !== 'confirm') throw new Error('Computer use is waiting for confirmation.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'activating',\n requestId: event.requestId,\n target: state.target,\n });\n }\n case 'activating': {\n if (event.type !== 'activated') throw new Error('Computer use is activating.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'active',\n requestId: event.requestId,\n target: state.target,\n grant: event.grant,\n });\n }\n case 'active': {\n if (event.type !== 'stop') throw new Error('Computer use is active.');\n return next(state, {\n phase: 'stopping',\n requestId: state.requestId,\n target: state.target,\n grant: state.grant,\n });\n }\n case 'stopping': {\n if (event.type !== 'stopped') throw new Error('Computer use is stopping.');\n return next(state, { phase: 'inactive' });\n }\n case 'failed':\n throw new Error('Computer use must be reset before another transition.');\n }\n}\n"],"mappings":"AAEA,SAAS,EAAe,EAAyB,EAAyB,CACxE,GAAI,EAAM,YAAc,EAAW,MAAU,MAAM,+CAA+C,CACpG,CAEA,SAAS,EAAK,EAAyB,EAA0E,CAC/G,MAAO,CACL,SAAU,EAAM,SAAW,EAC3B,SAAU,EAAM,SAChB,GAAG,CACL,CACF,CAEA,SAAgB,EAAwB,EAA0D,CAChG,MAAO,CAAE,SAAU,EAAG,MAAO,WAAY,UAAS,CACpD,CAEA,SAAgB,EAAuB,EAAyB,EAAgD,CAC9G,GAAI,EAAM,OAAS,OACjB,OAAO,EAAK,EAAO,CACjB,MAAO,SACP,QAAS,CAAE,KAAM,EAAM,KAAM,QAAS,EAAM,OAAQ,EACpD,GAAI,EAAM,YAAc,IAAA,GAAY,CAAC,EAAI,CAAE,UAAW,EAAM,SAAU,EACtE,GAAI,EAAM,SAAW,IAAA,GAAY,CAAC,EAAI,CAAE,OAAQ,EAAM,MAAO,EAC7D,GAAI,EAAM,QAAU,IAAA,GAAY,CAAC,EAAI,CAAE,MAAO,EAAM,KAAM,CAC5D,CAAC,EAGH,GAAI,EAAM,OAAS,QAAS,CAC1B,GAAI,EAAM,QAAU,SAAU,MAAU,MAAM,gDAAgD,EAC9F,OAAO,EAAK,EAAO,CAAE,MAAO,UAAW,CAAC,CAC1C,CAEA,OAAQ,EAAM,MAAd,CACE,IAAK,WACH,GAAI,EAAM,OAAS,UAAW,MAAU,MAAM,2BAA2B,EACzE,OAAO,EAAK,EAAO,CACjB,MAAO,aACP,UAAW,EAAM,UACjB,OAAQ,EAAM,MAChB,CAAC,EAEH,IAAK,aACH,GAAI,EAAM,OAAS,qBAAsB,MAAU,MAAM,kDAAkD,EAE3G,OADA,EAAe,EAAO,EAAM,SAAS,EAC9B,EAAK,EAAO,CACjB,MAAO,wBACP,UAAW,EAAM,UACjB,OAAQ,EAAM,MAChB,CAAC,EAEH,IAAK,wBACH,GAAI,EAAM,OAAS,OAEjB,OADA,EAAe,EAAO,EAAM,SAAS,EAC9B,EAAK,EAAO,CAAE,MAAO,UAAW,CAAC,EAE1C,GAAI,EAAM,OAAS,UAAW,MAAU,MAAM,2CAA2C,EAEzF,OADA,EAAe,EAAO,EAAM,SAAS,EAC9B,EAAK,EAAO,CACjB,MAAO,aACP,UAAW,EAAM,UACjB,OAAQ,EAAM,MAChB,CAAC,EAEH,IAAK,aACH,GAAI,EAAM,OAAS,YAAa,MAAU,MAAM,6BAA6B,EAE7E,OADA,EAAe,EAAO,EAAM,SAAS,EAC9B,EAAK,EAAO,CACjB,MAAO,SACP,UAAW,EAAM,UACjB,OAAQ,EAAM,OACd,MAAO,EAAM,KACf,CAAC,EAEH,IAAK,SACH,GAAI,EAAM,OAAS,OAAQ,MAAU,MAAM,yBAAyB,EACpE,OAAO,EAAK,EAAO,CACjB,MAAO,WACP,UAAW,EAAM,UACjB,OAAQ,EAAM,OACd,MAAO,EAAM,KACf,CAAC,EAEH,IAAK,WACH,GAAI,EAAM,OAAS,UAAW,MAAU,MAAM,2BAA2B,EACzE,OAAO,EAAK,EAAO,CAAE,MAAO,UAAW,CAAC,EAE1C,IAAK,SACH,MAAU,MAAM,uDAAuD,CAC3E,CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"traceRedaction.d.cts","names":[],"sources":["../../src/services/traceRedaction.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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"traceRedaction.d.mts","names":[],"sources":["../../src/services/traceRedaction.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"}
|
package/dist/sessionApi.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./adapters/computerUseApi.cjs");exports.ComputerUseRequestBroker=e.ComputerUseRequestBroker,exports.api=e.api,exports.createComputerUseApi=e.createComputerUseApi;
|
package/dist/sessionApi.d.cts
DELETED
package/dist/sessionApi.d.mts
DELETED
package/dist/sessionApi.mjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{ComputerUseRequestBroker as e,api as t,createComputerUseApi as n}from"./adapters/computerUseApi.mjs";export{e as ComputerUseRequestBroker,t as api,n as createComputerUseApi};
|