@agimon-ai/doompi-computer-use 0.0.1-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +49 -0
- package/dist/_virtual/_rolldown/runtime.cjs +1 -0
- package/dist/adapters/computerUseApi.cjs +2 -0
- package/dist/adapters/computerUseApi.cjs.map +1 -0
- package/dist/adapters/computerUseApi.d.cts +37 -0
- package/dist/adapters/computerUseApi.d.cts.map +1 -0
- package/dist/adapters/computerUseApi.d.mts +37 -0
- package/dist/adapters/computerUseApi.d.mts.map +1 -0
- package/dist/adapters/computerUseApi.mjs +2 -0
- package/dist/adapters/computerUseApi.mjs.map +1 -0
- package/dist/adapters/pi/extension.cjs +3 -0
- package/dist/adapters/pi/extension.cjs.map +1 -0
- package/dist/adapters/pi/extension.d.cts +12 -0
- package/dist/adapters/pi/extension.d.cts.map +1 -0
- package/dist/adapters/pi/extension.d.mts +12 -0
- package/dist/adapters/pi/extension.d.mts.map +1 -0
- package/dist/adapters/pi/extension.mjs +3 -0
- package/dist/adapters/pi/extension.mjs.map +1 -0
- package/dist/adapters/pi/sessionApiClient.cjs +2 -0
- package/dist/adapters/pi/sessionApiClient.cjs.map +1 -0
- package/dist/adapters/pi/sessionApiClient.d.cts +26 -0
- package/dist/adapters/pi/sessionApiClient.d.cts.map +1 -0
- package/dist/adapters/pi/sessionApiClient.d.mts +26 -0
- package/dist/adapters/pi/sessionApiClient.d.mts.map +1 -0
- package/dist/adapters/pi/sessionApiClient.mjs +2 -0
- package/dist/adapters/pi/sessionApiClient.mjs.map +1 -0
- package/dist/adapters/webComputerUseAvailability.cjs +2 -0
- package/dist/adapters/webComputerUseAvailability.cjs.map +1 -0
- package/dist/adapters/webComputerUseAvailability.mjs +2 -0
- package/dist/adapters/webComputerUseAvailability.mjs.map +1 -0
- package/dist/adapters/webComputerUseChannel.cjs +2 -0
- package/dist/adapters/webComputerUseChannel.cjs.map +1 -0
- package/dist/adapters/webComputerUseChannel.d.cts +10 -0
- package/dist/adapters/webComputerUseChannel.d.cts.map +1 -0
- package/dist/adapters/webComputerUseChannel.d.mts +10 -0
- package/dist/adapters/webComputerUseChannel.d.mts.map +1 -0
- package/dist/adapters/webComputerUseChannel.mjs +2 -0
- package/dist/adapters/webComputerUseChannel.mjs.map +1 -0
- package/dist/commands/computerUseCommand.cjs +2 -0
- package/dist/commands/computerUseCommand.cjs.map +1 -0
- package/dist/commands/computerUseCommand.mjs +2 -0
- package/dist/commands/computerUseCommand.mjs.map +1 -0
- package/dist/container/index.cjs +2 -0
- package/dist/container/index.cjs.map +1 -0
- package/dist/container/index.d.cts +6 -0
- package/dist/container/index.d.cts.map +1 -0
- package/dist/container/index.d.mts +6 -0
- package/dist/container/index.d.mts.map +1 -0
- package/dist/container/index.mjs +2 -0
- package/dist/container/index.mjs.map +1 -0
- package/dist/extensions/pi.cjs +1 -0
- package/dist/extensions/pi.d.cts +2 -0
- package/dist/extensions/pi.d.mts +2 -0
- package/dist/extensions/pi.mjs +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.cts +10 -0
- package/dist/index.d.mts +10 -0
- package/dist/index.mjs +1 -0
- package/dist/services/extensionService.cjs +2 -0
- package/dist/services/extensionService.cjs.map +1 -0
- package/dist/services/extensionService.d.cts +11 -0
- package/dist/services/extensionService.d.cts.map +1 -0
- package/dist/services/extensionService.d.mts +11 -0
- package/dist/services/extensionService.d.mts.map +1 -0
- package/dist/services/extensionService.mjs +2 -0
- package/dist/services/extensionService.mjs.map +1 -0
- package/dist/services/sessionController.cjs +2 -0
- package/dist/services/sessionController.cjs.map +1 -0
- package/dist/services/sessionController.d.cts +7 -0
- package/dist/services/sessionController.d.cts.map +1 -0
- package/dist/services/sessionController.d.mts +7 -0
- package/dist/services/sessionController.d.mts.map +1 -0
- package/dist/services/sessionController.mjs +2 -0
- package/dist/services/sessionController.mjs.map +1 -0
- package/dist/services/traceRedaction.cjs +2 -0
- package/dist/services/traceRedaction.cjs.map +1 -0
- package/dist/services/traceRedaction.d.cts +29 -0
- package/dist/services/traceRedaction.d.cts.map +1 -0
- package/dist/services/traceRedaction.d.mts +29 -0
- package/dist/services/traceRedaction.d.mts.map +1 -0
- package/dist/services/traceRedaction.mjs +2 -0
- package/dist/services/traceRedaction.mjs.map +1 -0
- package/dist/sessionApi.cjs +1 -0
- package/dist/sessionApi.d.cts +2 -0
- package/dist/sessionApi.d.mts +2 -0
- package/dist/sessionApi.mjs +1 -0
- package/dist/types/computerUse.d.cts +104 -0
- package/dist/types/computerUse.d.cts.map +1 -0
- package/dist/types/computerUse.d.mts +104 -0
- package/dist/types/computerUse.d.mts.map +1 -0
- package/dist/types/computerUseApi.cjs +2 -0
- package/dist/types/computerUseApi.cjs.map +1 -0
- package/dist/types/computerUseApi.d.cts +75 -0
- package/dist/types/computerUseApi.d.cts.map +1 -0
- package/dist/types/computerUseApi.d.mts +75 -0
- package/dist/types/computerUseApi.d.mts.map +1 -0
- package/dist/types/computerUseApi.mjs +2 -0
- package/dist/types/computerUseApi.mjs.map +1 -0
- package/dist/types/extension.d.cts +17 -0
- package/dist/types/extension.d.cts.map +1 -0
- package/dist/types/extension.d.mts +17 -0
- package/dist/types/extension.d.mts.map +1 -0
- package/dist/webHub.cjs +1 -0
- package/dist/webHub.d.cts +3 -0
- package/dist/webHub.d.mts +3 -0
- package/dist/webHub.mjs +1 -0
- package/llms.txt +11 -0
- package/package.json +124 -0
- package/src/exports/webClient.ts +2 -0
- package/src/prompts/doompi-use-computer-use/SKILL.md +20 -0
- package/src/types/computerUse.ts +117 -0
- package/src/types/computerUseApi.ts +78 -0
- package/src/web/ComputerActionToolCard.tsx +51 -0
- package/src/web/ComputerStateToolCard.tsx +51 -0
- package/src/web/ComputerUsePanel.tsx +136 -0
- package/src/web/computerActionToolRender.ts +20 -0
- package/src/web/computerStateToolRender.ts +18 -0
- package/src/web/computerUseStore.ts +26 -0
- package/src/web/index.ts +41 -0
- package/src/web/tsconfig.json +28 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webComputerUseChannel.cjs","names":["computerUseSessionApiError","computerUseChannelType","API_BASE_PATH","COMPUTER_USE_ROUTES","MissingComputerUseApiError","missingComputerUseApiRetryAt"],"sources":["../../src/adapters/webComputerUseChannel.ts"],"sourcesContent":["import 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 host.onNotice(\n `computer-use Desktop stop was already unavailable (${error instanceof Error ? error.message : String(error)})`,\n );\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 responseJson(await sessionRequest(scope, COMPUTER_USE_ROUTES.hubStop, 'POST'));\n grants.delete(scope.sessionId);\n if (activeSessionId === scope.sessionId) activeSessionId = undefined;\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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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { computerUseChannelType } from "../types/computerUseApi.cjs";
|
|
2
|
+
import { WebHubChannel } from "@agimon-ai/doompi-web-contracts";
|
|
3
|
+
//#region src/adapters/webComputerUseChannel.d.ts
|
|
4
|
+
declare function createComputerUseChannel(options?: {
|
|
5
|
+
pollMs?: number;
|
|
6
|
+
}): WebHubChannel;
|
|
7
|
+
declare const webHubChannels: readonly WebHubChannel[];
|
|
8
|
+
//#endregion
|
|
9
|
+
export { computerUseChannelType, createComputerUseChannel, webHubChannels };
|
|
10
|
+
//# sourceMappingURL=webComputerUseChannel.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webComputerUseChannel.d.cts","names":[],"sources":["../../src/adapters/webComputerUseChannel.ts"],"mappings":";;;iBA0CgB,yBAAyB;EAAW;IAAyB;cAyQhE,yBAAyB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { computerUseChannelType } from "../types/computerUseApi.mjs";
|
|
2
|
+
import { WebHubChannel } from "@agimon-ai/doompi-web-contracts";
|
|
3
|
+
//#region src/adapters/webComputerUseChannel.d.ts
|
|
4
|
+
declare function createComputerUseChannel(options?: {
|
|
5
|
+
pollMs?: number;
|
|
6
|
+
}): WebHubChannel;
|
|
7
|
+
declare const webHubChannels: readonly WebHubChannel[];
|
|
8
|
+
//#endregion
|
|
9
|
+
export { computerUseChannelType, createComputerUseChannel, webHubChannels };
|
|
10
|
+
//# sourceMappingURL=webComputerUseChannel.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webComputerUseChannel.d.mts","names":[],"sources":["../../src/adapters/webComputerUseChannel.ts"],"mappings":";;;iBA0CgB,yBAAyB;EAAW;IAAyB;cAyQhE,yBAAyB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
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";function o(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:void 0}function s(e){let t=o(e);return t?.action===`status`||t?.action===`targets`||t?.action===`stop`||t?.action===`artifacts`?{action:t.action}:void 0}async function c(e){let t=await e.json();if(!e.ok)throw i(e.status,t);return t}function l(i={}){let l;return{frameType:n,lifecycle:`hub`,start(n){let u=new Map,d=new Map,f=new Map,p=new Map,m=new Set,h=new Map,g,_=!1,v=async(t,r,i=`GET`,a)=>n.requestSessionApi(t,{basePath:e,path:r,method:i,...a===void 0?{}:{body:JSON.stringify(a)}}),y=(e,t)=>{let r={state:t,targets:f.get(e.sessionId)??[],...g!==void 0&&g!==e.sessionId?{busy:!0}:{}};d.set(e.sessionId,r),n.publish(e.sessionId,r)},b=async e=>{let n=await c(await v(e,t.hubState));if(n.phase===`active`||n.phase===`activating`||n.phase===`stopping`){if(g=e.sessionId,n.phase===`active`&&!p.has(e.sessionId)){let n=await c(await v(e,t.hubAuthorization));n!==null&&p.set(e.sessionId,n.grantId)}}else g===e.sessionId&&(g=void 0),p.delete(e.sessionId);return h.delete(e.sessionId),y(e,n),n},x=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 c(await v(e,t.hubComplete,`POST`,{id:r.id,result:i}))}catch(n){await c(await v(e,t.hubComplete,`POST`,{id:r.id,error:n instanceof Error?n.message:String(n)}))}},S=async e=>{let r=await c(await v(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){n.onNotice(`computer-use Desktop stop was already unavailable (${e instanceof Error?e.message:String(e)})`)}await c(await v(e,t.hubStop,`POST`,{artifact:i})),p.delete(e.sessionId),g===e.sessionId&&(g=void 0)},C=async e=>{if(!(_||m.has(e.sessionId))&&!((h.get(e.sessionId)??0)>Date.now())){m.add(e.sessionId);try{let r=await b(e);if(r.phase===`active`){let i=typeof r.expiresAt==`number`&&r.expiresAt<=Date.now(),a=!1;if(!i&&n.computerUse?.available)try{a=o(await n.computerUse.request(e,{operation:`status`}))?.ownedBySession===!0}catch{a=!0}if(i||!a){await c(await v(e,t.hubStop,`POST`)),p.delete(e.sessionId),g===e.sessionId&&(g=void 0),await b(e);return}}if(r.phase===`awaiting_confirmation`&&(g===void 0||g===e.sessionId)){if(!n.computerUse?.available)throw Error(`DoomPi Desktop computer use is unavailable.`);let r=await c(await v(e,t.hubActivation));if(r!==null){g=e.sessionId;try{let i=await n.computerUse.request(e,{operation:`activate`,payload:r});await c(await v(e,t.hubStop,`POST`,{host:i}));let a=o(i)?.grantId;typeof a==`string`&&p.set(e.sessionId,a)}catch(n){g=void 0,await c(await v(e,t.hubStop,`POST`,{error:n instanceof Error?n.message:String(n)}))}await b(e)}}r.phase===`stopping`&&(await S(e),await b(e));let i=await c(await v(e,t.hubNext));i!==null&&await x(e,i)}catch(t){t instanceof r?(h.set(e.sessionId,a(Date.now())),d.delete(e.sessionId)):n.onNotice(`computer-use poll failed for ${e.sessionId} (${t instanceof Error?t.message:String(t)})`)}finally{m.delete(e.sessionId)}}};l=(e,t)=>{let i=s(t);i!==void 0&&(h.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`});f.set(e.sessionId,Array.isArray(t)?t.filter(e=>o(e)!==void 0):[])}else i.action===`stop`&&await S(e);await b(e)}catch(t){t instanceof r?(h.set(e.sessionId,a(Date.now())),d.delete(e.sessionId)):n.onNotice(`computer-use command failed for ${e.sessionId} (${t instanceof Error?t.message:String(t)})`)}})())};let w=setInterval(()=>{for(let e of u.values())C(e)},i.pollMs??250);return{payloadFor:e=>d.get(e.sessionId),sessionAdded(e){u.set(e.sessionId,e),C(e)},sessionRemoved(e){let t=u.get(e),r=p.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)})`)),u.delete(e),d.delete(e),f.delete(e),p.delete(e),m.delete(e),h.delete(e),g===e&&(g=void 0)},close(){if(_=!0,clearInterval(w),n.computerUse?.available)for(let[e,t]of p){let r=u.get(e);r!==void 0&&n.computerUse.request(r,{operation:`stop`,payload:{grantId:t}}).catch(()=>void 0)}u.clear(),d.clear(),f.clear(),p.clear(),h.clear()}}},receive(e,t){l?.(e,t)}}}const u=[l()];export{n as computerUseChannelType,l as createComputerUseChannel,u as webHubChannels};
|
|
2
|
+
//# sourceMappingURL=webComputerUseChannel.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webComputerUseChannel.mjs","names":[],"sources":["../../src/adapters/webComputerUseChannel.ts"],"sourcesContent":["import 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 host.onNotice(\n `computer-use Desktop stop was already unavailable (${error instanceof Error ? error.message : String(error)})`,\n );\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 responseJson(await sessionRequest(scope, COMPUTER_USE_ROUTES.hubStop, 'POST'));\n grants.delete(scope.sessionId);\n if (activeSessionId === scope.sessionId) activeSessionId = undefined;\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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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../adapters/pi/sessionApiClient.cjs"),t=require("../services/extensionService.cjs");function n(n={}){let r=n.client??e.createComputerUseSessionClient();return{service:n.service??new t.DefaultComputerUseExtensionService(r),...r===void 0?{}:{client:r}}}exports.createComputerUseContainer=n;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["createComputerUseSessionClient","DefaultComputerUseExtensionService"],"sources":["../../src/container/index.ts"],"sourcesContent":["import { createComputerUseSessionClient } from '../adapters/pi/sessionApiClient.ts';\nimport { DefaultComputerUseExtensionService } from '../services/extensionService.ts';\nimport type { ComputerUseExtensionDependencies } from '../types/extension.ts';\n\nexport function createComputerUseContainer(\n overrides: Partial<ComputerUseExtensionDependencies> = {},\n): ComputerUseExtensionDependencies {\n const client = overrides.client ?? createComputerUseSessionClient();\n return {\n service: overrides.service ?? new DefaultComputerUseExtensionService(client),\n ...(client === undefined ? {} : { client }),\n };\n}\n"],"mappings":"qGAIA,SAAgB,EACd,EAAuD,CAAC,EACtB,CAClC,IAAM,EAAS,EAAU,QAAUA,EAAAA,+BAA+B,EAClE,MAAO,CACL,QAAS,EAAU,SAAW,IAAIC,EAAAA,mCAAmC,CAAM,EAC3E,GAAI,IAAW,IAAA,GAAY,CAAC,EAAI,CAAE,QAAO,CAC3C,CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ComputerUseExtensionDependencies } from "../types/extension.cjs";
|
|
2
|
+
//#region src/container/index.d.ts
|
|
3
|
+
declare function createComputerUseContainer(overrides?: Partial<ComputerUseExtensionDependencies>): ComputerUseExtensionDependencies;
|
|
4
|
+
//#endregion
|
|
5
|
+
export { createComputerUseContainer };
|
|
6
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../../src/container/index.ts"],"mappings":";;iBAIgB,2BACd,YAAW,QAAQ,oCAClB"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { ComputerUseExtensionDependencies } from "../types/extension.mjs";
|
|
2
|
+
//#region src/container/index.d.ts
|
|
3
|
+
declare function createComputerUseContainer(overrides?: Partial<ComputerUseExtensionDependencies>): ComputerUseExtensionDependencies;
|
|
4
|
+
//#endregion
|
|
5
|
+
export { createComputerUseContainer };
|
|
6
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/container/index.ts"],"mappings":";;iBAIgB,2BACd,YAAW,QAAQ,oCAClB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createComputerUseSessionClient as e}from"../adapters/pi/sessionApiClient.mjs";import{DefaultComputerUseExtensionService as t}from"../services/extensionService.mjs";function n(n={}){let r=n.client??e();return{service:n.service??new t(r),...r===void 0?{}:{client:r}}}export{n as createComputerUseContainer};
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/container/index.ts"],"sourcesContent":["import { createComputerUseSessionClient } from '../adapters/pi/sessionApiClient.ts';\nimport { DefaultComputerUseExtensionService } from '../services/extensionService.ts';\nimport type { ComputerUseExtensionDependencies } from '../types/extension.ts';\n\nexport function createComputerUseContainer(\n overrides: Partial<ComputerUseExtensionDependencies> = {},\n): ComputerUseExtensionDependencies {\n const client = overrides.client ?? createComputerUseSessionClient();\n return {\n service: overrides.service ?? new DefaultComputerUseExtensionService(client),\n ...(client === undefined ? {} : { client }),\n };\n}\n"],"mappings":"2KAIA,SAAgB,EACd,EAAuD,CAAC,EACtB,CAClC,IAAM,EAAS,EAAU,QAAU,EAA+B,EAClE,MAAO,CACL,QAAS,EAAU,SAAW,IAAI,EAAmC,CAAM,EAC3E,GAAI,IAAW,IAAA,GAAY,CAAC,EAAI,CAAE,QAAO,CAC3C,CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../adapters/pi/extension.cjs");exports.activateComputerUseExtension=e.activateComputerUseExtension,exports.default=e.activateComputerUseExtension;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{activateComputerUseExtension as e}from"../adapters/pi/extension.mjs";export{e as activateComputerUseExtension,e as default};
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./types/computerUseApi.cjs"),t=require("./adapters/pi/sessionApiClient.cjs"),n=require("./services/extensionService.cjs"),r=require("./container/index.cjs"),i=require("./adapters/pi/extension.cjs"),a=require("./services/sessionController.cjs"),o=require("./services/traceRedaction.cjs");exports.COMPUTER_USE_GUIDANCE=i.COMPUTER_USE_GUIDANCE,exports.COMPUTER_USE_MODE_ID=e.COMPUTER_USE_MODE_ID,exports.COMPUTER_USE_TOOL_NAMES=i.COMPUTER_USE_TOOL_NAMES,exports.DefaultComputerUseExtensionService=n.DefaultComputerUseExtensionService,exports.UnixComputerUseSessionClient=t.UnixComputerUseSessionClient,exports.activateComputerUseExtension=i.activateComputerUseExtension,exports.createComputerUseContainer=r.createComputerUseContainer,exports.createComputerUseSessionClient=t.createComputerUseSessionClient,exports.initialComputerUseState=a.initialComputerUseState,exports.redactComputerUseTrace=o.redactComputerUseTrace,exports.reduceComputerUseState=a.reduceComputerUseState;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { API_BASE_PATH, COMPUTER_USE_CONFIRMATION_WINDOW_MS, COMPUTER_USE_DEFAULT_DURATION_MS, COMPUTER_USE_MAX_DURATION_MS, COMPUTER_USE_MODE_ID, COMPUTER_USE_MODE_STATUS_KEY, COMPUTER_USE_ROUTES, COMPUTER_USE_STATUS_KEY, COMPUTER_USE_WAKE_LIMIT, ComputerUseActivationRequest, ComputerUseArtifactView, ComputerUseBrokerRequest, ComputerUseBrowserCommand, ComputerUseChannelPayload, ComputerUseSessionView, SESSION_QUERY_PARAM, activationUrl, computerUseChannelType } from "./types/computerUseApi.cjs";
|
|
2
|
+
import { COMPUTER_USE_PHASES, ComputerUseAction, ComputerUseActionKind, ComputerUseElement, ComputerUseFailureCode, ComputerUseGrant, ComputerUseObservation, ComputerUsePhase, ComputerUseSessionIdentity, ComputerUseState, ComputerUseStateEvent, ComputerUseTarget } from "./types/computerUse.cjs";
|
|
3
|
+
import { ComputerUseSessionClient, UnixComputerUseSessionClient, createComputerUseSessionClient } from "./adapters/pi/sessionApiClient.cjs";
|
|
4
|
+
import { ComputerUseExtensionDependencies, ComputerUseExtensionResult, ComputerUseExtensionService, ComputerUseNotificationLevel } from "./types/extension.cjs";
|
|
5
|
+
import { COMPUTER_USE_GUIDANCE, COMPUTER_USE_TOOL_NAMES, activateComputerUseExtension } from "./adapters/pi/extension.cjs";
|
|
6
|
+
import { createComputerUseContainer } from "./container/index.cjs";
|
|
7
|
+
import { DefaultComputerUseExtensionService } from "./services/extensionService.cjs";
|
|
8
|
+
import { initialComputerUseState, reduceComputerUseState } from "./services/sessionController.cjs";
|
|
9
|
+
import { redactComputerUseTrace } from "./services/traceRedaction.cjs";
|
|
10
|
+
export { type API_BASE_PATH, type COMPUTER_USE_CONFIRMATION_WINDOW_MS, type COMPUTER_USE_DEFAULT_DURATION_MS, COMPUTER_USE_GUIDANCE, type COMPUTER_USE_MAX_DURATION_MS, COMPUTER_USE_MODE_ID, type COMPUTER_USE_MODE_STATUS_KEY, type COMPUTER_USE_PHASES, type COMPUTER_USE_ROUTES, type COMPUTER_USE_STATUS_KEY, COMPUTER_USE_TOOL_NAMES, type COMPUTER_USE_WAKE_LIMIT, type ComputerUseAction, type ComputerUseActionKind, type ComputerUseActivationRequest, type ComputerUseArtifactView, type ComputerUseBrokerRequest, type ComputerUseBrowserCommand, type ComputerUseChannelPayload, type ComputerUseElement, type ComputerUseExtensionDependencies, type ComputerUseExtensionResult, type ComputerUseExtensionService, type ComputerUseFailureCode, type ComputerUseGrant, type ComputerUseNotificationLevel, type ComputerUseObservation, type ComputerUsePhase, type ComputerUseSessionClient, type ComputerUseSessionIdentity, type ComputerUseSessionView, type ComputerUseState, type ComputerUseStateEvent, type ComputerUseTarget, DefaultComputerUseExtensionService, type SESSION_QUERY_PARAM, UnixComputerUseSessionClient, activateComputerUseExtension, type activationUrl, type computerUseChannelType, createComputerUseContainer, createComputerUseSessionClient, initialComputerUseState, redactComputerUseTrace, reduceComputerUseState };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { API_BASE_PATH, COMPUTER_USE_CONFIRMATION_WINDOW_MS, COMPUTER_USE_DEFAULT_DURATION_MS, COMPUTER_USE_MAX_DURATION_MS, COMPUTER_USE_MODE_ID, COMPUTER_USE_MODE_STATUS_KEY, COMPUTER_USE_ROUTES, COMPUTER_USE_STATUS_KEY, COMPUTER_USE_WAKE_LIMIT, ComputerUseActivationRequest, ComputerUseArtifactView, ComputerUseBrokerRequest, ComputerUseBrowserCommand, ComputerUseChannelPayload, ComputerUseSessionView, SESSION_QUERY_PARAM, activationUrl, computerUseChannelType } from "./types/computerUseApi.mjs";
|
|
2
|
+
import { COMPUTER_USE_PHASES, ComputerUseAction, ComputerUseActionKind, ComputerUseElement, ComputerUseFailureCode, ComputerUseGrant, ComputerUseObservation, ComputerUsePhase, ComputerUseSessionIdentity, ComputerUseState, ComputerUseStateEvent, ComputerUseTarget } from "./types/computerUse.mjs";
|
|
3
|
+
import { ComputerUseSessionClient, UnixComputerUseSessionClient, createComputerUseSessionClient } from "./adapters/pi/sessionApiClient.mjs";
|
|
4
|
+
import { ComputerUseExtensionDependencies, ComputerUseExtensionResult, ComputerUseExtensionService, ComputerUseNotificationLevel } from "./types/extension.mjs";
|
|
5
|
+
import { COMPUTER_USE_GUIDANCE, COMPUTER_USE_TOOL_NAMES, activateComputerUseExtension } from "./adapters/pi/extension.mjs";
|
|
6
|
+
import { createComputerUseContainer } from "./container/index.mjs";
|
|
7
|
+
import { DefaultComputerUseExtensionService } from "./services/extensionService.mjs";
|
|
8
|
+
import { initialComputerUseState, reduceComputerUseState } from "./services/sessionController.mjs";
|
|
9
|
+
import { redactComputerUseTrace } from "./services/traceRedaction.mjs";
|
|
10
|
+
export { type API_BASE_PATH, type COMPUTER_USE_CONFIRMATION_WINDOW_MS, type COMPUTER_USE_DEFAULT_DURATION_MS, COMPUTER_USE_GUIDANCE, type COMPUTER_USE_MAX_DURATION_MS, COMPUTER_USE_MODE_ID, type COMPUTER_USE_MODE_STATUS_KEY, type COMPUTER_USE_PHASES, type COMPUTER_USE_ROUTES, type COMPUTER_USE_STATUS_KEY, COMPUTER_USE_TOOL_NAMES, type COMPUTER_USE_WAKE_LIMIT, type ComputerUseAction, type ComputerUseActionKind, type ComputerUseActivationRequest, type ComputerUseArtifactView, type ComputerUseBrokerRequest, type ComputerUseBrowserCommand, type ComputerUseChannelPayload, type ComputerUseElement, type ComputerUseExtensionDependencies, type ComputerUseExtensionResult, type ComputerUseExtensionService, type ComputerUseFailureCode, type ComputerUseGrant, type ComputerUseNotificationLevel, type ComputerUseObservation, type ComputerUsePhase, type ComputerUseSessionClient, type ComputerUseSessionIdentity, type ComputerUseSessionView, type ComputerUseState, type ComputerUseStateEvent, type ComputerUseTarget, DefaultComputerUseExtensionService, type SESSION_QUERY_PARAM, UnixComputerUseSessionClient, activateComputerUseExtension, type activationUrl, type computerUseChannelType, createComputerUseContainer, createComputerUseSessionClient, initialComputerUseState, redactComputerUseTrace, reduceComputerUseState };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{COMPUTER_USE_MODE_ID as e}from"./types/computerUseApi.mjs";import{UnixComputerUseSessionClient as t,createComputerUseSessionClient as n}from"./adapters/pi/sessionApiClient.mjs";import{DefaultComputerUseExtensionService as r}from"./services/extensionService.mjs";import{createComputerUseContainer as i}from"./container/index.mjs";import{COMPUTER_USE_GUIDANCE as a,COMPUTER_USE_TOOL_NAMES as o,activateComputerUseExtension as s}from"./adapters/pi/extension.mjs";import{initialComputerUseState as c,reduceComputerUseState as l}from"./services/sessionController.mjs";import{redactComputerUseTrace as u}from"./services/traceRedaction.mjs";export{a as COMPUTER_USE_GUIDANCE,e as COMPUTER_USE_MODE_ID,o as COMPUTER_USE_TOOL_NAMES,r as DefaultComputerUseExtensionService,t as UnixComputerUseSessionClient,s as activateComputerUseExtension,i as createComputerUseContainer,n as createComputerUseSessionClient,c as initialComputerUseState,u as redactComputerUseTrace,l as reduceComputerUseState};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=class{client;constructor(e){this.client=e}async execute(){return this.client===void 0?{message:`Computer use requires a DoomPi Desktop session.`,level:`error`}:{message:`Computer use is ${(await this.client.state()).phase.replaceAll(`_`,` `)}.`,level:`info`}}};exports.DefaultComputerUseExtensionService=e;
|
|
2
|
+
//# sourceMappingURL=extensionService.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ComputerUseSessionClient } from "../adapters/pi/sessionApiClient.cjs";
|
|
2
|
+
import { ComputerUseExtensionResult, ComputerUseExtensionService } from "../types/extension.cjs";
|
|
3
|
+
//#region src/services/extensionService.d.ts
|
|
4
|
+
declare class DefaultComputerUseExtensionService implements ComputerUseExtensionService {
|
|
5
|
+
private readonly client?;
|
|
6
|
+
constructor(client?: ComputerUseSessionClient | undefined);
|
|
7
|
+
execute(): Promise<ComputerUseExtensionResult>;
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { DefaultComputerUseExtensionService };
|
|
11
|
+
//# sourceMappingURL=extensionService.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensionService.d.cts","names":[],"sources":["../../src/services/extensionService.ts"],"mappings":";;;cAGa,8CAA8C;mBACrB;EAApC,YAAoC,SAAS;EAEhC,WAAW,QAAQ"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ComputerUseSessionClient } from "../adapters/pi/sessionApiClient.mjs";
|
|
2
|
+
import { ComputerUseExtensionResult, ComputerUseExtensionService } from "../types/extension.mjs";
|
|
3
|
+
//#region src/services/extensionService.d.ts
|
|
4
|
+
declare class DefaultComputerUseExtensionService implements ComputerUseExtensionService {
|
|
5
|
+
private readonly client?;
|
|
6
|
+
constructor(client?: ComputerUseSessionClient | undefined);
|
|
7
|
+
execute(): Promise<ComputerUseExtensionResult>;
|
|
8
|
+
}
|
|
9
|
+
//#endregion
|
|
10
|
+
export { DefaultComputerUseExtensionService };
|
|
11
|
+
//# sourceMappingURL=extensionService.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensionService.d.mts","names":[],"sources":["../../src/services/extensionService.ts"],"mappings":";;;cAGa,8CAA8C;mBACrB;EAApC,YAAoC,SAAS;EAEhC,WAAW,QAAQ"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var e=class{client;constructor(e){this.client=e}async execute(){return this.client===void 0?{message:`Computer use requires a DoomPi Desktop session.`,level:`error`}:{message:`Computer use is ${(await this.client.state()).phase.replaceAll(`_`,` `)}.`,level:`info`}}};export{e as DefaultComputerUseExtensionService};
|
|
2
|
+
//# sourceMappingURL=extensionService.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e,t){if(e.requestId!==t)throw Error(`The computer-use activation request is stale.`)}function t(e,t){return{revision:e.revision+1,identity:e.identity,...t}}function n(e){return{revision:0,phase:`inactive`,identity:e}}function r(n,r){if(r.type===`fail`)return t(n,{phase:`failed`,failure:{code:r.code,message:r.message},...n.requestId===void 0?{}:{requestId:n.requestId},...n.target===void 0?{}:{target:n.target},...n.grant===void 0?{}:{grant:n.grant}});if(r.type===`reset`){if(n.phase!==`failed`)throw Error(`Only a failed computer-use state can be reset.`);return t(n,{phase:`inactive`})}switch(n.phase){case`inactive`:if(r.type!==`request`)throw Error(`Computer use is inactive.`);return t(n,{phase:`requesting`,requestId:r.requestId,target:r.target});case`requesting`:if(r.type!==`await_confirmation`)throw Error(`Computer use is preparing an activation request.`);return e(n,r.requestId),t(n,{phase:`awaiting_confirmation`,requestId:r.requestId,target:n.target});case`awaiting_confirmation`:if(r.type===`deny`)return e(n,r.requestId),t(n,{phase:`inactive`});if(r.type!==`confirm`)throw Error(`Computer use is waiting for confirmation.`);return e(n,r.requestId),t(n,{phase:`activating`,requestId:r.requestId,target:n.target});case`activating`:if(r.type!==`activated`)throw Error(`Computer use is activating.`);return e(n,r.requestId),t(n,{phase:`active`,requestId:r.requestId,target:n.target,grant:r.grant});case`active`:if(r.type!==`stop`)throw Error(`Computer use is active.`);return t(n,{phase:`stopping`,requestId:n.requestId,target:n.target,grant:n.grant});case`stopping`:if(r.type!==`stopped`)throw Error(`Computer use is stopping.`);return t(n,{phase:`inactive`});case`failed`:throw Error(`Computer use must be reset before another transition.`)}}exports.initialComputerUseState=n,exports.reduceComputerUseState=r;
|
|
2
|
+
//# sourceMappingURL=sessionController.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ComputerUseState, ComputerUseStateEvent } from "../types/computerUse.cjs";
|
|
2
|
+
//#region src/services/sessionController.d.ts
|
|
3
|
+
declare function initialComputerUseState(identity: ComputerUseState['identity']): ComputerUseState;
|
|
4
|
+
declare function reduceComputerUseState(state: ComputerUseState, event: ComputerUseStateEvent): ComputerUseState;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { initialComputerUseState, reduceComputerUseState };
|
|
7
|
+
//# sourceMappingURL=sessionController.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionController.d.cts","names":[],"sources":["../../src/services/sessionController.ts"],"mappings":";;iBAcgB,wBAAwB,UAAU,+BAA+B;iBAIjE,uBAAuB,OAAO,kBAAkB,OAAO,wBAAwB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ComputerUseState, ComputerUseStateEvent } from "../types/computerUse.mjs";
|
|
2
|
+
//#region src/services/sessionController.d.ts
|
|
3
|
+
declare function initialComputerUseState(identity: ComputerUseState['identity']): ComputerUseState;
|
|
4
|
+
declare function reduceComputerUseState(state: ComputerUseState, event: ComputerUseStateEvent): ComputerUseState;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { initialComputerUseState, reduceComputerUseState };
|
|
7
|
+
//# sourceMappingURL=sessionController.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionController.d.mts","names":[],"sources":["../../src/services/sessionController.ts"],"mappings":";;iBAcgB,wBAAwB,UAAU,+BAA+B;iBAIjE,uBAAuB,OAAO,kBAAkB,OAAO,wBAAwB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e,t){if(e.requestId!==t)throw Error(`The computer-use activation request is stale.`)}function t(e,t){return{revision:e.revision+1,identity:e.identity,...t}}function n(e){return{revision:0,phase:`inactive`,identity:e}}function r(n,r){if(r.type===`fail`)return t(n,{phase:`failed`,failure:{code:r.code,message:r.message},...n.requestId===void 0?{}:{requestId:n.requestId},...n.target===void 0?{}:{target:n.target},...n.grant===void 0?{}:{grant:n.grant}});if(r.type===`reset`){if(n.phase!==`failed`)throw Error(`Only a failed computer-use state can be reset.`);return t(n,{phase:`inactive`})}switch(n.phase){case`inactive`:if(r.type!==`request`)throw Error(`Computer use is inactive.`);return t(n,{phase:`requesting`,requestId:r.requestId,target:r.target});case`requesting`:if(r.type!==`await_confirmation`)throw Error(`Computer use is preparing an activation request.`);return e(n,r.requestId),t(n,{phase:`awaiting_confirmation`,requestId:r.requestId,target:n.target});case`awaiting_confirmation`:if(r.type===`deny`)return e(n,r.requestId),t(n,{phase:`inactive`});if(r.type!==`confirm`)throw Error(`Computer use is waiting for confirmation.`);return e(n,r.requestId),t(n,{phase:`activating`,requestId:r.requestId,target:n.target});case`activating`:if(r.type!==`activated`)throw Error(`Computer use is activating.`);return e(n,r.requestId),t(n,{phase:`active`,requestId:r.requestId,target:n.target,grant:r.grant});case`active`:if(r.type!==`stop`)throw Error(`Computer use is active.`);return t(n,{phase:`stopping`,requestId:n.requestId,target:n.target,grant:n.grant});case`stopping`:if(r.type!==`stopped`)throw Error(`Computer use is stopping.`);return t(n,{phase:`inactive`});case`failed`:throw Error(`Computer use must be reset before another transition.`)}}export{n as initialComputerUseState,r as reduceComputerUseState};
|
|
2
|
+
//# sourceMappingURL=sessionController.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){return{sequence:e.sequence,timestamp:e.timestamp,runId:e.runId,bundleId:e.bundleId,actionKind:e.action.kind,...e.role===void 0?{}:{role:e.role},...e.action.kind===`set_value`?{textLength:e.action.value.length}:{},durationMs:e.durationMs,outcome:e.outcome,...e.errorCode===void 0?{}:{errorCode:e.errorCode}}}exports.redactComputerUseTrace=e;
|
|
2
|
+
//# sourceMappingURL=traceRedaction.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceRedaction.cjs","names":[],"sources":["../../src/services/traceRedaction.ts"],"sourcesContent":["import type { ComputerUseAction, ComputerUseFailureCode } from '../types/computerUse.ts';\n\nexport interface ComputerUseTraceInput {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly action: ComputerUseAction;\n readonly role?: string;\n readonly durationMs: number;\n readonly outcome: 'succeeded' | 'failed' | 'uncertain';\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport interface ComputerUseTraceRecord {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly actionKind: ComputerUseAction['kind'];\n readonly role?: string;\n readonly textLength?: number;\n readonly durationMs: number;\n readonly outcome: ComputerUseTraceInput['outcome'];\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord {\n return {\n sequence: input.sequence,\n timestamp: input.timestamp,\n runId: input.runId,\n bundleId: input.bundleId,\n actionKind: input.action.kind,\n ...(input.role === undefined ? {} : { role: input.role }),\n ...(input.action.kind === 'set_value' ? { textLength: input.action.value.length } : {}),\n durationMs: input.durationMs,\n outcome: input.outcome,\n ...(input.errorCode === undefined ? {} : { errorCode: input.errorCode }),\n };\n}\n"],"mappings":"AA2BA,SAAgB,EAAuB,EAAsD,CAC3F,MAAO,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,MAAO,EAAM,MACb,SAAU,EAAM,SAChB,WAAY,EAAM,OAAO,KACzB,GAAI,EAAM,OAAS,IAAA,GAAY,CAAC,EAAI,CAAE,KAAM,EAAM,IAAK,EACvD,GAAI,EAAM,OAAO,OAAS,YAAc,CAAE,WAAY,EAAM,OAAO,MAAM,MAAO,EAAI,CAAC,EACrF,WAAY,EAAM,WAClB,QAAS,EAAM,QACf,GAAI,EAAM,YAAc,IAAA,GAAY,CAAC,EAAI,CAAE,UAAW,EAAM,SAAU,CACxE,CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ComputerUseAction, ComputerUseFailureCode } from "../types/computerUse.cjs";
|
|
2
|
+
//#region src/services/traceRedaction.d.ts
|
|
3
|
+
interface ComputerUseTraceInput {
|
|
4
|
+
readonly sequence: number;
|
|
5
|
+
readonly timestamp: number;
|
|
6
|
+
readonly runId: string;
|
|
7
|
+
readonly bundleId: string;
|
|
8
|
+
readonly action: ComputerUseAction;
|
|
9
|
+
readonly role?: string;
|
|
10
|
+
readonly durationMs: number;
|
|
11
|
+
readonly outcome: 'succeeded' | 'failed' | 'uncertain';
|
|
12
|
+
readonly errorCode?: ComputerUseFailureCode;
|
|
13
|
+
}
|
|
14
|
+
interface ComputerUseTraceRecord {
|
|
15
|
+
readonly sequence: number;
|
|
16
|
+
readonly timestamp: number;
|
|
17
|
+
readonly runId: string;
|
|
18
|
+
readonly bundleId: string;
|
|
19
|
+
readonly actionKind: ComputerUseAction['kind'];
|
|
20
|
+
readonly role?: string;
|
|
21
|
+
readonly textLength?: number;
|
|
22
|
+
readonly durationMs: number;
|
|
23
|
+
readonly outcome: ComputerUseTraceInput['outcome'];
|
|
24
|
+
readonly errorCode?: ComputerUseFailureCode;
|
|
25
|
+
}
|
|
26
|
+
declare function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord;
|
|
27
|
+
//#endregion
|
|
28
|
+
export { ComputerUseTraceInput, ComputerUseTraceRecord, redactComputerUseTrace };
|
|
29
|
+
//# sourceMappingURL=traceRedaction.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceRedaction.d.cts","names":[],"sources":["../../src/services/traceRedaction.ts"],"mappings":";;UAEiB;WACN;WACA;WACA;WACA;WACA,QAAQ;WACR;WACA;WACA;WACA,YAAY;;UAGN;WACN;WACA;WACA;WACA;WACA,YAAY;WACZ;WACA;WACA;WACA,SAAS;WACT,YAAY;;iBAGP,uBAAuB,OAAO,wBAAwB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ComputerUseAction, ComputerUseFailureCode } from "../types/computerUse.mjs";
|
|
2
|
+
//#region src/services/traceRedaction.d.ts
|
|
3
|
+
interface ComputerUseTraceInput {
|
|
4
|
+
readonly sequence: number;
|
|
5
|
+
readonly timestamp: number;
|
|
6
|
+
readonly runId: string;
|
|
7
|
+
readonly bundleId: string;
|
|
8
|
+
readonly action: ComputerUseAction;
|
|
9
|
+
readonly role?: string;
|
|
10
|
+
readonly durationMs: number;
|
|
11
|
+
readonly outcome: 'succeeded' | 'failed' | 'uncertain';
|
|
12
|
+
readonly errorCode?: ComputerUseFailureCode;
|
|
13
|
+
}
|
|
14
|
+
interface ComputerUseTraceRecord {
|
|
15
|
+
readonly sequence: number;
|
|
16
|
+
readonly timestamp: number;
|
|
17
|
+
readonly runId: string;
|
|
18
|
+
readonly bundleId: string;
|
|
19
|
+
readonly actionKind: ComputerUseAction['kind'];
|
|
20
|
+
readonly role?: string;
|
|
21
|
+
readonly textLength?: number;
|
|
22
|
+
readonly durationMs: number;
|
|
23
|
+
readonly outcome: ComputerUseTraceInput['outcome'];
|
|
24
|
+
readonly errorCode?: ComputerUseFailureCode;
|
|
25
|
+
}
|
|
26
|
+
declare function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord;
|
|
27
|
+
//#endregion
|
|
28
|
+
export { ComputerUseTraceInput, ComputerUseTraceRecord, redactComputerUseTrace };
|
|
29
|
+
//# sourceMappingURL=traceRedaction.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceRedaction.d.mts","names":[],"sources":["../../src/services/traceRedaction.ts"],"mappings":";;UAEiB;WACN;WACA;WACA;WACA;WACA,QAAQ;WACR;WACA;WACA;WACA,YAAY;;UAGN;WACN;WACA;WACA;WACA;WACA,YAAY;WACZ;WACA;WACA;WACA,SAAS;WACT,YAAY;;iBAGP,uBAAuB,OAAO,wBAAwB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){return{sequence:e.sequence,timestamp:e.timestamp,runId:e.runId,bundleId:e.bundleId,actionKind:e.action.kind,...e.role===void 0?{}:{role:e.role},...e.action.kind===`set_value`?{textLength:e.action.value.length}:{},durationMs:e.durationMs,outcome:e.outcome,...e.errorCode===void 0?{}:{errorCode:e.errorCode}}}export{e as redactComputerUseTrace};
|
|
2
|
+
//# sourceMappingURL=traceRedaction.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traceRedaction.mjs","names":[],"sources":["../../src/services/traceRedaction.ts"],"sourcesContent":["import type { ComputerUseAction, ComputerUseFailureCode } from '../types/computerUse.ts';\n\nexport interface ComputerUseTraceInput {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly action: ComputerUseAction;\n readonly role?: string;\n readonly durationMs: number;\n readonly outcome: 'succeeded' | 'failed' | 'uncertain';\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport interface ComputerUseTraceRecord {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly actionKind: ComputerUseAction['kind'];\n readonly role?: string;\n readonly textLength?: number;\n readonly durationMs: number;\n readonly outcome: ComputerUseTraceInput['outcome'];\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord {\n return {\n sequence: input.sequence,\n timestamp: input.timestamp,\n runId: input.runId,\n bundleId: input.bundleId,\n actionKind: input.action.kind,\n ...(input.role === undefined ? {} : { role: input.role }),\n ...(input.action.kind === 'set_value' ? { textLength: input.action.value.length } : {}),\n durationMs: input.durationMs,\n outcome: input.outcome,\n ...(input.errorCode === undefined ? {} : { errorCode: input.errorCode }),\n };\n}\n"],"mappings":"AA2BA,SAAgB,EAAuB,EAAsD,CAC3F,MAAO,CACL,SAAU,EAAM,SAChB,UAAW,EAAM,UACjB,MAAO,EAAM,MACb,SAAU,EAAM,SAChB,WAAY,EAAM,OAAO,KACzB,GAAI,EAAM,OAAS,IAAA,GAAY,CAAC,EAAI,CAAE,KAAM,EAAM,IAAK,EACvD,GAAI,EAAM,OAAO,OAAS,YAAc,CAAE,WAAY,EAAM,OAAO,MAAM,MAAO,EAAI,CAAC,EACrF,WAAY,EAAM,WAClB,QAAS,EAAM,QACf,GAAI,EAAM,YAAc,IAAA,GAAY,CAAC,EAAI,CAAE,UAAW,EAAM,SAAU,CACxE,CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
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;
|
|
@@ -0,0 +1 @@
|
|
|
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};
|