@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.
Files changed (207) hide show
  1. package/README.md +5 -1
  2. package/dist/api-contracts.cjs +1 -0
  3. package/dist/api-contracts.d.cts +2 -0
  4. package/dist/api-contracts.d.mts +2 -0
  5. package/dist/api-contracts.mjs +1 -0
  6. package/dist/constants/computerUse.cjs +3 -0
  7. package/dist/constants/computerUse.cjs.map +1 -0
  8. package/dist/{adapters/pi/extension.d.cts → constants/computerUse.d.cts} +3 -10
  9. package/dist/constants/computerUse.d.cts.map +1 -0
  10. package/dist/{adapters/pi/extension.d.mts → constants/computerUse.d.mts} +3 -10
  11. package/dist/constants/computerUse.d.mts.map +1 -0
  12. package/dist/constants/computerUse.mjs +3 -0
  13. package/dist/constants/computerUse.mjs.map +1 -0
  14. package/dist/controllers/computerUseApi.cjs +2 -0
  15. package/dist/controllers/computerUseApi.cjs.map +1 -0
  16. package/dist/controllers/computerUseApi.mjs +2 -0
  17. package/dist/controllers/computerUseApi.mjs.map +1 -0
  18. package/dist/controllers/computerUseCommand.cjs +2 -0
  19. package/dist/controllers/computerUseCommand.cjs.map +1 -0
  20. package/dist/controllers/computerUseCommand.mjs +2 -0
  21. package/dist/controllers/computerUseCommand.mjs.map +1 -0
  22. package/dist/controllers/computerUseRuntime.cjs +2 -0
  23. package/dist/controllers/computerUseRuntime.cjs.map +1 -0
  24. package/dist/controllers/computerUseRuntime.mjs +2 -0
  25. package/dist/controllers/computerUseRuntime.mjs.map +1 -0
  26. package/dist/controllers/computerUseServer.cjs +3 -0
  27. package/dist/controllers/computerUseServer.cjs.map +1 -0
  28. package/dist/controllers/computerUseServer.mjs +3 -0
  29. package/dist/controllers/computerUseServer.mjs.map +1 -0
  30. package/dist/controllers/webComputerUseChannel.cjs +2 -0
  31. package/dist/controllers/webComputerUseChannel.cjs.map +1 -0
  32. package/dist/controllers/webComputerUseChannel.mjs +2 -0
  33. package/dist/controllers/webComputerUseChannel.mjs.map +1 -0
  34. package/dist/extensions/pi.cjs +2 -1
  35. package/dist/extensions/pi.cjs.map +1 -0
  36. package/dist/extensions/pi.d.cts +6 -2
  37. package/dist/extensions/pi.d.cts.map +1 -0
  38. package/dist/extensions/pi.d.mts +6 -2
  39. package/dist/extensions/pi.d.mts.map +1 -0
  40. package/dist/extensions/pi.mjs +2 -1
  41. package/dist/extensions/pi.mjs.map +1 -0
  42. package/dist/extensions/server.cjs +2 -0
  43. package/dist/extensions/server.cjs.map +1 -0
  44. package/dist/extensions/server.d.cts +5 -0
  45. package/dist/extensions/server.d.cts.map +1 -0
  46. package/dist/extensions/server.d.mts +5 -0
  47. package/dist/extensions/server.d.mts.map +1 -0
  48. package/dist/extensions/server.mjs +2 -0
  49. package/dist/extensions/server.mjs.map +1 -0
  50. package/dist/index.cjs +1 -1
  51. package/dist/index.d.cts +9 -9
  52. package/dist/index.d.mts +9 -9
  53. package/dist/index.mjs +1 -1
  54. package/dist/models/computerUseMode.cjs +2 -0
  55. package/dist/models/computerUseMode.cjs.map +1 -0
  56. package/dist/models/computerUseMode.mjs +2 -0
  57. package/dist/models/computerUseMode.mjs.map +1 -0
  58. package/dist/{services/sessionController.cjs → models/computerUseState.cjs} +1 -1
  59. package/dist/models/computerUseState.cjs.map +1 -0
  60. package/dist/{services/sessionController.d.cts → models/computerUseState.d.cts} +2 -2
  61. package/dist/models/computerUseState.d.cts.map +1 -0
  62. package/dist/{services/sessionController.d.mts → models/computerUseState.d.mts} +2 -2
  63. package/dist/models/computerUseState.d.mts.map +1 -0
  64. package/dist/{services/sessionController.mjs → models/computerUseState.mjs} +1 -1
  65. package/dist/models/computerUseState.mjs.map +1 -0
  66. package/dist/schemas/apiContracts.cjs +2 -0
  67. package/dist/schemas/apiContracts.cjs.map +1 -0
  68. package/dist/schemas/apiContracts.d.cts +53 -0
  69. package/dist/schemas/apiContracts.d.cts.map +1 -0
  70. package/dist/schemas/apiContracts.d.mts +53 -0
  71. package/dist/schemas/apiContracts.d.mts.map +1 -0
  72. package/dist/schemas/apiContracts.mjs +2 -0
  73. package/dist/schemas/apiContracts.mjs.map +1 -0
  74. package/dist/{adapters/pi/computerScriptRunner.cjs → services/computerScriptRunner/index.cjs} +1 -1
  75. package/dist/{adapters/pi/computerScriptRunner.mjs.map → services/computerScriptRunner/index.cjs.map} +1 -1
  76. package/dist/{adapters/pi/computerScriptRunner.d.cts → services/computerScriptRunner/index.d.cts} +2 -2
  77. package/dist/services/computerScriptRunner/index.d.cts.map +1 -0
  78. package/dist/{adapters/pi/computerScriptRunner.d.mts → services/computerScriptRunner/index.d.mts} +2 -2
  79. package/dist/services/computerScriptRunner/index.d.mts.map +1 -0
  80. package/dist/{adapters/pi/computerScriptRunner.mjs → services/computerScriptRunner/index.mjs} +1 -1
  81. package/dist/services/computerScriptRunner/index.mjs.map +1 -0
  82. package/dist/services/dependencies/index.cjs +2 -0
  83. package/dist/services/dependencies/index.cjs.map +1 -0
  84. package/dist/services/dependencies/index.d.cts +6 -0
  85. package/dist/services/dependencies/index.d.cts.map +1 -0
  86. package/dist/services/dependencies/index.d.mts +6 -0
  87. package/dist/services/dependencies/index.d.mts.map +1 -0
  88. package/dist/services/dependencies/index.mjs +2 -0
  89. package/dist/services/dependencies/index.mjs.map +1 -0
  90. package/dist/services/{extensionService.cjs → extensionService/index.cjs} +1 -1
  91. package/dist/services/extensionService/index.cjs.map +1 -0
  92. package/dist/services/{extensionService.d.mts → extensionService/index.d.cts} +4 -4
  93. package/dist/services/extensionService/index.d.cts.map +1 -0
  94. package/dist/services/{extensionService.d.cts → extensionService/index.d.mts} +4 -4
  95. package/dist/services/extensionService/index.d.mts.map +1 -0
  96. package/dist/services/{extensionService.mjs → extensionService/index.mjs} +1 -1
  97. package/dist/services/extensionService/index.mjs.map +1 -0
  98. package/dist/services/sessionApiClient/index.cjs +2 -0
  99. package/dist/services/sessionApiClient/index.cjs.map +1 -0
  100. package/dist/services/sessionApiClient/index.d.cts +15 -0
  101. package/dist/services/sessionApiClient/index.d.cts.map +1 -0
  102. package/dist/services/sessionApiClient/index.d.mts +15 -0
  103. package/dist/services/sessionApiClient/index.d.mts.map +1 -0
  104. package/dist/services/sessionApiClient/index.mjs +2 -0
  105. package/dist/services/sessionApiClient/index.mjs.map +1 -0
  106. package/dist/services/{traceRedaction.cjs → traceRedaction/index.cjs} +1 -1
  107. package/dist/services/{traceRedaction.cjs.map → traceRedaction/index.cjs.map} +1 -1
  108. package/dist/services/{traceRedaction.d.cts → traceRedaction/index.d.cts} +3 -3
  109. package/dist/services/traceRedaction/index.d.cts.map +1 -0
  110. package/dist/services/{traceRedaction.d.mts → traceRedaction/index.d.mts} +3 -3
  111. package/dist/services/traceRedaction/index.d.mts.map +1 -0
  112. package/dist/services/{traceRedaction.mjs → traceRedaction/index.mjs} +1 -1
  113. package/dist/services/{traceRedaction.mjs.map → traceRedaction/index.mjs.map} +1 -1
  114. package/dist/services/webComputerUseAvailability/index.cjs +2 -0
  115. package/dist/services/webComputerUseAvailability/index.cjs.map +1 -0
  116. package/dist/services/webComputerUseAvailability/index.mjs +2 -0
  117. package/dist/services/webComputerUseAvailability/index.mjs.map +1 -0
  118. package/dist/types/computerScript.d.cts +1 -1
  119. package/dist/types/computerScript.d.mts +1 -1
  120. package/dist/types/computerUseApi.cjs.map +1 -1
  121. package/dist/types/computerUseApi.d.cts +1 -1
  122. package/dist/types/computerUseApi.d.mts +1 -1
  123. package/dist/types/computerUseApi.mjs.map +1 -1
  124. package/dist/types/extension.d.cts +1 -1
  125. package/dist/types/extension.d.mts +1 -1
  126. package/package.json +29 -21
  127. package/src/extensions/web.ts +51 -0
  128. package/src/types/computerUseApi.ts +2 -2
  129. package/src/web/components/ComputerActionToolCard.tsx +3 -2
  130. package/src/web/components/ComputerExecToolCard.tsx +3 -2
  131. package/src/web/components/ComputerStateToolCard.tsx +3 -2
  132. package/src/web/components/ComputerUsePanel.tsx +4 -3
  133. package/src/web/lib/computerActionToolRender.ts +1 -1
  134. package/src/web/lib/computerExecToolRender.ts +1 -1
  135. package/src/web/lib/computerStateToolRender.ts +1 -1
  136. package/src/web/lib/computerUseSettings.ts +1 -1
  137. package/src/web/stores/computerUseStore.ts +4 -3
  138. package/src/web/tsconfig.json +1 -7
  139. package/dist/adapters/computerUseApi.cjs +0 -2
  140. package/dist/adapters/computerUseApi.cjs.map +0 -1
  141. package/dist/adapters/computerUseApi.d.cts +0 -41
  142. package/dist/adapters/computerUseApi.d.cts.map +0 -1
  143. package/dist/adapters/computerUseApi.d.mts +0 -41
  144. package/dist/adapters/computerUseApi.d.mts.map +0 -1
  145. package/dist/adapters/computerUseApi.mjs +0 -2
  146. package/dist/adapters/computerUseApi.mjs.map +0 -1
  147. package/dist/adapters/pi/computerScriptRunner.cjs.map +0 -1
  148. package/dist/adapters/pi/computerScriptRunner.d.cts.map +0 -1
  149. package/dist/adapters/pi/computerScriptRunner.d.mts.map +0 -1
  150. package/dist/adapters/pi/extension.cjs +0 -3
  151. package/dist/adapters/pi/extension.cjs.map +0 -1
  152. package/dist/adapters/pi/extension.d.cts.map +0 -1
  153. package/dist/adapters/pi/extension.d.mts.map +0 -1
  154. package/dist/adapters/pi/extension.mjs +0 -3
  155. package/dist/adapters/pi/extension.mjs.map +0 -1
  156. package/dist/adapters/pi/sessionApiClient.cjs +0 -2
  157. package/dist/adapters/pi/sessionApiClient.cjs.map +0 -1
  158. package/dist/adapters/pi/sessionApiClient.d.cts +0 -25
  159. package/dist/adapters/pi/sessionApiClient.d.cts.map +0 -1
  160. package/dist/adapters/pi/sessionApiClient.d.mts +0 -25
  161. package/dist/adapters/pi/sessionApiClient.d.mts.map +0 -1
  162. package/dist/adapters/pi/sessionApiClient.mjs +0 -2
  163. package/dist/adapters/pi/sessionApiClient.mjs.map +0 -1
  164. package/dist/adapters/webComputerUseAvailability.cjs +0 -2
  165. package/dist/adapters/webComputerUseAvailability.cjs.map +0 -1
  166. package/dist/adapters/webComputerUseAvailability.mjs +0 -2
  167. package/dist/adapters/webComputerUseAvailability.mjs.map +0 -1
  168. package/dist/adapters/webComputerUseChannel.cjs +0 -2
  169. package/dist/adapters/webComputerUseChannel.cjs.map +0 -1
  170. package/dist/adapters/webComputerUseChannel.d.cts +0 -10
  171. package/dist/adapters/webComputerUseChannel.d.cts.map +0 -1
  172. package/dist/adapters/webComputerUseChannel.d.mts +0 -10
  173. package/dist/adapters/webComputerUseChannel.d.mts.map +0 -1
  174. package/dist/adapters/webComputerUseChannel.mjs +0 -2
  175. package/dist/adapters/webComputerUseChannel.mjs.map +0 -1
  176. package/dist/commands/computerUseCommand.cjs +0 -2
  177. package/dist/commands/computerUseCommand.cjs.map +0 -1
  178. package/dist/commands/computerUseCommand.mjs +0 -2
  179. package/dist/commands/computerUseCommand.mjs.map +0 -1
  180. package/dist/container/index.cjs +0 -2
  181. package/dist/container/index.cjs.map +0 -1
  182. package/dist/container/index.d.cts +0 -6
  183. package/dist/container/index.d.cts.map +0 -1
  184. package/dist/container/index.d.mts +0 -6
  185. package/dist/container/index.d.mts.map +0 -1
  186. package/dist/container/index.mjs +0 -2
  187. package/dist/container/index.mjs.map +0 -1
  188. package/dist/services/extensionService.cjs.map +0 -1
  189. package/dist/services/extensionService.d.cts.map +0 -1
  190. package/dist/services/extensionService.d.mts.map +0 -1
  191. package/dist/services/extensionService.mjs.map +0 -1
  192. package/dist/services/sessionController.cjs.map +0 -1
  193. package/dist/services/sessionController.d.cts.map +0 -1
  194. package/dist/services/sessionController.d.mts.map +0 -1
  195. package/dist/services/sessionController.mjs.map +0 -1
  196. package/dist/services/traceRedaction.d.cts.map +0 -1
  197. package/dist/services/traceRedaction.d.mts.map +0 -1
  198. package/dist/sessionApi.cjs +0 -1
  199. package/dist/sessionApi.d.cts +0 -2
  200. package/dist/sessionApi.d.mts +0 -2
  201. package/dist/sessionApi.mjs +0 -1
  202. package/dist/webHub.cjs +0 -1
  203. package/dist/webHub.d.cts +0 -3
  204. package/dist/webHub.d.mts +0 -3
  205. package/dist/webHub.mjs +0 -1
  206. package/src/exports/webClient.ts +0 -2
  207. package/src/web/index.ts +0 -47
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webComputerUseChannel.cjs","names":["computerUseSessionApiError","computerUseChannelType","API_BASE_PATH","COMPUTER_USE_ROUTES","randomUUID","MissingComputerUseApiError"],"sources":["../../src/controllers/webComputerUseChannel.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { DoomHubChannelSource, DoomHubSessionScope, DoomHubChannel } from '@agimon-ai/doompi-core/hub-channel';\n\nimport { computerUseSessionApiError, MissingComputerUseApiError } from '../services/webComputerUseAvailability';\nimport {\n API_BASE_PATH,\n computerUseChannelType,\n COMPUTER_USE_ROUTES,\n type ComputerUseActivationRequest,\n type ComputerUseBrokerRequest,\n type ComputerUseBrowserCommand,\n type ComputerUseChannelPayload,\n type ComputerUseSessionView,\n} from '../types/computerUseApi';\nexport { computerUseChannelType };\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction command(value: unknown): ComputerUseBrowserCommand | undefined {\n const input = record(value);\n return input?.action === 'status' ||\n input?.action === 'targets' ||\n input?.action === 'stop' ||\n input?.action === 'artifacts'\n ? { action: input.action }\n : undefined;\n}\n\nasync function responseJson(response: Response): Promise<unknown> {\n const value = await response.json();\n if (!response.ok) throw computerUseSessionApiError(response.status, value);\n return value;\n}\n\nfunction sessionState(value: unknown): ComputerUseSessionView | undefined {\n const input = record(value);\n if (\n typeof input?.sessionId !== 'string' ||\n typeof input.revision !== 'number' ||\n typeof input.wake !== 'number' ||\n !['inactive', 'awaiting_confirmation', 'activating', 'active', 'stopping', 'failed'].includes(input.phase as string)\n )\n return undefined;\n return input as unknown as ComputerUseSessionView;\n}\n\nexport function createComputerUseChannel(): DoomHubChannel {\n let receiveCommand: ((scope: DoomHubSessionScope, payload: unknown) => void) | undefined;\n return {\n frameType: computerUseChannelType,\n lifecycle: 'hub',\n start(host) {\n const scopes = new Map<string, DoomHubSessionScope>();\n const latest = new Map<string, ComputerUseChannelPayload>();\n const targets = new Map<string, readonly Record<string, unknown>[]>();\n const grants = new Map<string, string>();\n const subscriptions = new Map<string, () => void>();\n const processing = new Set<string>();\n let activeSessionId: string | undefined;\n let closed = false;\n\n const sessionRequest = async (scope: DoomHubSessionScope, path: string, method = 'GET', value?: unknown) =>\n host.requestSessionApi(scope, {\n basePath: API_BASE_PATH,\n path,\n method,\n ...(value === undefined ? {} : { body: JSON.stringify(value) }),\n });\n\n const publish = (scope: DoomHubSessionScope, state: ComputerUseSessionView): void => {\n if (state.phase === 'active' || state.phase === 'activating' || state.phase === 'stopping') {\n activeSessionId = scope.sessionId;\n } else if (activeSessionId === scope.sessionId) {\n activeSessionId = undefined;\n grants.delete(scope.sessionId);\n }\n const payload: ComputerUseChannelPayload = {\n state,\n targets: targets.get(scope.sessionId) ?? [],\n ...(activeSessionId !== undefined && activeSessionId !== scope.sessionId ? { busy: true } : {}),\n };\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, payload);\n };\n\n const refresh = async (scope: DoomHubSessionScope): Promise<ComputerUseSessionView> => {\n const state = sessionState(await responseJson(await sessionRequest(scope, COMPUTER_USE_ROUTES.hubState)));\n if (state === undefined) throw new Error('Computer-use API returned an invalid session state.');\n publish(scope, state);\n return state;\n };\n\n const completePending = async (scope: DoomHubSessionScope, pending: ComputerUseBrokerRequest): Promise<void> => {\n if (!host.computerUse?.available) throw new Error('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: DoomHubSessionScope): Promise<void> => {\n const authorization = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubAuthorization),\n )) as { grantId: string } | null;\n let artifact: unknown;\n if (authorization !== null && host.computerUse?.available) {\n try {\n artifact = await host.computerUse.request(scope, {\n operation: 'stop',\n payload: { grantId: authorization.grantId },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n artifact = {\n artifactId: randomUUID(),\n status: 'failed',\n failure: { code: 'recording_failed', message: message.slice(0, 512) },\n };\n host.onNotice(`computer-use Desktop stop was already unavailable (${message})`);\n }\n }\n await responseJson(await sessionRequest(scope, COMPUTER_USE_ROUTES.hubStop, 'POST', { artifact }));\n grants.delete(scope.sessionId);\n if (activeSessionId === scope.sessionId) activeSessionId = undefined;\n };\n\n const processScope = async (scope: DoomHubSessionScope, announced?: ComputerUseSessionView): Promise<void> => {\n if (closed || processing.has(scope.sessionId)) return;\n processing.add(scope.sessionId);\n try {\n const state = announced ?? (await refresh(scope));\n if (state.phase === 'active') {\n if (!grants.has(scope.sessionId)) {\n const authorization = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubAuthorization),\n )) as { grantId: string } | null;\n if (authorization !== null) grants.set(scope.sessionId, authorization.grantId);\n }\n const expired = typeof state.expiresAt === 'number' && state.expiresAt <= Date.now();\n let owned = false;\n if (!expired && host.computerUse?.available) {\n try {\n const hostStatus = record(await host.computerUse.request(scope, { operation: 'status' }));\n owned = hostStatus?.ownedBySession === true;\n } catch {\n owned = true;\n }\n }\n if (expired || !owned) {\n await stopSession(scope);\n await refresh(scope);\n return;\n }\n }\n if (\n state.phase === 'awaiting_confirmation' &&\n (activeSessionId === undefined || activeSessionId === scope.sessionId)\n ) {\n 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 latest.delete(scope.sessionId);\n } else {\n host.onNotice(\n `computer-use state handling failed for ${scope.sessionId} (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n } finally {\n processing.delete(scope.sessionId);\n }\n };\n\n const onState = (scope: DoomHubSessionScope, payload: unknown): void => {\n const state = sessionState(payload);\n if (state === undefined || state.sessionId !== scope.sessionId) return;\n publish(scope, state);\n void processScope(scope, state);\n };\n\n receiveCommand = (scope, payload) => {\n const parsed = command(payload);\n if (parsed === undefined) return;\n void (async () => {\n try {\n if (parsed.action === 'targets') {\n 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 void processScope(scope);\n } catch (error) {\n if (error instanceof MissingComputerUseApiError) {\n latest.delete(scope.sessionId);\n } else {\n host.onNotice(\n `computer-use command failed for ${scope.sessionId} (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n }\n })();\n };\n\n const source: DoomHubChannelSource = {\n payloadFor: (scope) => latest.get(scope.sessionId),\n sessionAdded(scope) {\n scopes.set(scope.sessionId, scope);\n const unsubscribe = host.directEvents.subscribe(\n computerUseChannelType,\n scope.sessionId,\n (payload) => onState(scope, payload),\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n void processScope(scope);\n },\n sessionRemoved(sessionId) {\n const scope = scopes.get(sessionId);\n const grantId = grants.get(sessionId);\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n if (scope !== undefined && grantId !== undefined && host.computerUse?.available) {\n void host.computerUse\n .request(scope, { operation: 'stop', payload: { grantId } })\n .catch((error: unknown) =>\n host.onNotice(\n `computer-use session cleanup failed (${error instanceof Error ? error.message : String(error)})`,\n ),\n );\n }\n scopes.delete(sessionId);\n latest.delete(sessionId);\n targets.delete(sessionId);\n grants.delete(sessionId);\n processing.delete(sessionId);\n if (activeSessionId === sessionId) activeSessionId = undefined;\n },\n close() {\n closed = true;\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n if (host.computerUse?.available) {\n for (const [sessionId, grantId] of grants) {\n const scope = scopes.get(sessionId);\n if (scope !== undefined)\n void host.computerUse\n .request(scope, { operation: 'stop', payload: { grantId } })\n .catch(() => undefined);\n }\n }\n scopes.clear();\n latest.clear();\n targets.clear();\n grants.clear();\n },\n };\n return source;\n },\n receive(scope, payload) {\n receiveCommand?.(scope, payload);\n },\n };\n}\n"],"mappings":"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"}
@@ -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}from"../services/webComputerUseAvailability/index.mjs";import{randomUUID as a}from"node:crypto";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(e){let t=o(e);if(typeof t?.sessionId==`string`&&typeof t.revision==`number`&&typeof t.wake==`number`&&[`inactive`,`awaiting_confirmation`,`activating`,`active`,`stopping`,`failed`].includes(t.phase))return t}function u(){let i;return{frameType:n,lifecycle:`hub`,start(u){let d=new Map,f=new Map,p=new Map,m=new Map,h=new Map,g=new Set,_,v=!1,y=async(t,n,r=`GET`,i)=>u.requestSessionApi(t,{basePath:e,path:n,method:r,...i===void 0?{}:{body:JSON.stringify(i)}}),b=(e,t)=>{t.phase===`active`||t.phase===`activating`||t.phase===`stopping`?_=e.sessionId:_===e.sessionId&&(_=void 0,m.delete(e.sessionId));let n={state:t,targets:p.get(e.sessionId)??[],..._!==void 0&&_!==e.sessionId?{busy:!0}:{}};f.set(e.sessionId,n),u.publish(e.sessionId,n)},x=async e=>{let n=l(await c(await y(e,t.hubState)));if(n===void 0)throw Error(`Computer-use API returned an invalid session state.`);return b(e,n),n},S=async(e,n)=>{if(!u.computerUse?.available)throw Error(`DoomPi Desktop computer use is unavailable.`);try{let r=await u.computerUse.request(e,{operation:n.operation,payload:n.operation===`act`?{grantId:n.grantId,sequence:n.sequence,action:n.payload}:{grantId:n.grantId}});await c(await y(e,t.hubComplete,`POST`,{id:n.id,result:r}))}catch(r){await c(await y(e,t.hubComplete,`POST`,{id:n.id,error:r instanceof Error?r.message:String(r)}))}},C=async e=>{let n=await c(await y(e,t.hubAuthorization)),r;if(n!==null&&u.computerUse?.available)try{r=await u.computerUse.request(e,{operation:`stop`,payload:{grantId:n.grantId}})}catch(e){let t=e instanceof Error?e.message:String(e);r={artifactId:a(),status:`failed`,failure:{code:`recording_failed`,message:t.slice(0,512)}},u.onNotice(`computer-use Desktop stop was already unavailable (${t})`)}await c(await y(e,t.hubStop,`POST`,{artifact:r})),m.delete(e.sessionId),_===e.sessionId&&(_=void 0)},w=async(e,n)=>{if(!(v||g.has(e.sessionId))){g.add(e.sessionId);try{let r=n??await x(e);if(r.phase===`active`){if(!m.has(e.sessionId)){let n=await c(await y(e,t.hubAuthorization));n!==null&&m.set(e.sessionId,n.grantId)}let n=typeof r.expiresAt==`number`&&r.expiresAt<=Date.now(),i=!1;if(!n&&u.computerUse?.available)try{i=o(await u.computerUse.request(e,{operation:`status`}))?.ownedBySession===!0}catch{i=!0}if(n||!i){await C(e),await x(e);return}}if(r.phase===`awaiting_confirmation`&&(_===void 0||_===e.sessionId)){if(!u.computerUse?.available)throw Error(`DoomPi Desktop computer use is unavailable.`);let n=await c(await y(e,t.hubActivation));if(n!==null){_=e.sessionId;try{let r=await u.computerUse.request(e,{operation:`activate`,payload:n});await c(await y(e,t.hubStop,`POST`,{host:r}));let i=o(r)?.grantId;typeof i==`string`&&m.set(e.sessionId,i)}catch(n){_=void 0,await c(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 c(await y(e,t.hubNext));i!==null&&await S(e,i)}catch(t){t instanceof r?f.delete(e.sessionId):u.onNotice(`computer-use state handling failed for ${e.sessionId} (${t instanceof Error?t.message:String(t)})`)}finally{g.delete(e.sessionId)}}},T=(e,t)=>{let n=l(t);n!==void 0&&n.sessionId===e.sessionId&&(b(e,n),w(e,n))};return i=(e,t)=>{let n=s(t);n!==void 0&&(async()=>{try{if(n.action===`targets`){if(!u.computerUse?.available)throw Error(`DoomPi Desktop computer use is unavailable.`);let t=await u.computerUse.request(e,{operation:`targets`});p.set(e.sessionId,Array.isArray(t)?t.filter(e=>o(e)!==void 0):[])}else n.action===`stop`&&await C(e);await x(e),w(e)}catch(t){t instanceof r?f.delete(e.sessionId):u.onNotice(`computer-use command failed for ${e.sessionId} (${t instanceof Error?t.message:String(t)})`)}})()},{payloadFor:e=>f.get(e.sessionId),sessionAdded(e){d.set(e.sessionId,e);let t=u.directEvents.subscribe(n,e.sessionId,t=>T(e,t),{replayLatest:!0});h.set(e.sessionId,t),w(e)},sessionRemoved(e){let t=d.get(e),n=m.get(e);h.get(e)?.(),h.delete(e),t!==void 0&&n!==void 0&&u.computerUse?.available&&u.computerUse.request(t,{operation:`stop`,payload:{grantId:n}}).catch(e=>u.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),g.delete(e),_===e&&(_=void 0)},close(){v=!0;for(let e of h.values())e();if(h.clear(),u.computerUse?.available)for(let[e,t]of m){let n=d.get(e);n!==void 0&&u.computerUse.request(n,{operation:`stop`,payload:{grantId:t}}).catch(()=>void 0)}d.clear(),f.clear(),p.clear(),m.clear()}}},receive(e,t){i?.(e,t)}}}export{n as computerUseChannelType,u as createComputerUseChannel};
2
+ //# sourceMappingURL=webComputerUseChannel.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webComputerUseChannel.mjs","names":[],"sources":["../../src/controllers/webComputerUseChannel.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { DoomHubChannelSource, DoomHubSessionScope, DoomHubChannel } from '@agimon-ai/doompi-core/hub-channel';\n\nimport { computerUseSessionApiError, MissingComputerUseApiError } from '../services/webComputerUseAvailability';\nimport {\n API_BASE_PATH,\n computerUseChannelType,\n COMPUTER_USE_ROUTES,\n type ComputerUseActivationRequest,\n type ComputerUseBrokerRequest,\n type ComputerUseBrowserCommand,\n type ComputerUseChannelPayload,\n type ComputerUseSessionView,\n} from '../types/computerUseApi';\nexport { computerUseChannelType };\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction command(value: unknown): ComputerUseBrowserCommand | undefined {\n const input = record(value);\n return input?.action === 'status' ||\n input?.action === 'targets' ||\n input?.action === 'stop' ||\n input?.action === 'artifacts'\n ? { action: input.action }\n : undefined;\n}\n\nasync function responseJson(response: Response): Promise<unknown> {\n const value = await response.json();\n if (!response.ok) throw computerUseSessionApiError(response.status, value);\n return value;\n}\n\nfunction sessionState(value: unknown): ComputerUseSessionView | undefined {\n const input = record(value);\n if (\n typeof input?.sessionId !== 'string' ||\n typeof input.revision !== 'number' ||\n typeof input.wake !== 'number' ||\n !['inactive', 'awaiting_confirmation', 'activating', 'active', 'stopping', 'failed'].includes(input.phase as string)\n )\n return undefined;\n return input as unknown as ComputerUseSessionView;\n}\n\nexport function createComputerUseChannel(): DoomHubChannel {\n let receiveCommand: ((scope: DoomHubSessionScope, payload: unknown) => void) | undefined;\n return {\n frameType: computerUseChannelType,\n lifecycle: 'hub',\n start(host) {\n const scopes = new Map<string, DoomHubSessionScope>();\n const latest = new Map<string, ComputerUseChannelPayload>();\n const targets = new Map<string, readonly Record<string, unknown>[]>();\n const grants = new Map<string, string>();\n const subscriptions = new Map<string, () => void>();\n const processing = new Set<string>();\n let activeSessionId: string | undefined;\n let closed = false;\n\n const sessionRequest = async (scope: DoomHubSessionScope, path: string, method = 'GET', value?: unknown) =>\n host.requestSessionApi(scope, {\n basePath: API_BASE_PATH,\n path,\n method,\n ...(value === undefined ? {} : { body: JSON.stringify(value) }),\n });\n\n const publish = (scope: DoomHubSessionScope, state: ComputerUseSessionView): void => {\n if (state.phase === 'active' || state.phase === 'activating' || state.phase === 'stopping') {\n activeSessionId = scope.sessionId;\n } else if (activeSessionId === scope.sessionId) {\n activeSessionId = undefined;\n grants.delete(scope.sessionId);\n }\n const payload: ComputerUseChannelPayload = {\n state,\n targets: targets.get(scope.sessionId) ?? [],\n ...(activeSessionId !== undefined && activeSessionId !== scope.sessionId ? { busy: true } : {}),\n };\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, payload);\n };\n\n const refresh = async (scope: DoomHubSessionScope): Promise<ComputerUseSessionView> => {\n const state = sessionState(await responseJson(await sessionRequest(scope, COMPUTER_USE_ROUTES.hubState)));\n if (state === undefined) throw new Error('Computer-use API returned an invalid session state.');\n publish(scope, state);\n return state;\n };\n\n const completePending = async (scope: DoomHubSessionScope, pending: ComputerUseBrokerRequest): Promise<void> => {\n if (!host.computerUse?.available) throw new Error('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: DoomHubSessionScope): Promise<void> => {\n const authorization = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubAuthorization),\n )) as { grantId: string } | null;\n let artifact: unknown;\n if (authorization !== null && host.computerUse?.available) {\n try {\n artifact = await host.computerUse.request(scope, {\n operation: 'stop',\n payload: { grantId: authorization.grantId },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n artifact = {\n artifactId: randomUUID(),\n status: 'failed',\n failure: { code: 'recording_failed', message: message.slice(0, 512) },\n };\n host.onNotice(`computer-use Desktop stop was already unavailable (${message})`);\n }\n }\n await responseJson(await sessionRequest(scope, COMPUTER_USE_ROUTES.hubStop, 'POST', { artifact }));\n grants.delete(scope.sessionId);\n if (activeSessionId === scope.sessionId) activeSessionId = undefined;\n };\n\n const processScope = async (scope: DoomHubSessionScope, announced?: ComputerUseSessionView): Promise<void> => {\n if (closed || processing.has(scope.sessionId)) return;\n processing.add(scope.sessionId);\n try {\n const state = announced ?? (await refresh(scope));\n if (state.phase === 'active') {\n if (!grants.has(scope.sessionId)) {\n const authorization = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubAuthorization),\n )) as { grantId: string } | null;\n if (authorization !== null) grants.set(scope.sessionId, authorization.grantId);\n }\n const expired = typeof state.expiresAt === 'number' && state.expiresAt <= Date.now();\n let owned = false;\n if (!expired && host.computerUse?.available) {\n try {\n const hostStatus = record(await host.computerUse.request(scope, { operation: 'status' }));\n owned = hostStatus?.ownedBySession === true;\n } catch {\n owned = true;\n }\n }\n if (expired || !owned) {\n await stopSession(scope);\n await refresh(scope);\n return;\n }\n }\n if (\n state.phase === 'awaiting_confirmation' &&\n (activeSessionId === undefined || activeSessionId === scope.sessionId)\n ) {\n 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 latest.delete(scope.sessionId);\n } else {\n host.onNotice(\n `computer-use state handling failed for ${scope.sessionId} (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n } finally {\n processing.delete(scope.sessionId);\n }\n };\n\n const onState = (scope: DoomHubSessionScope, payload: unknown): void => {\n const state = sessionState(payload);\n if (state === undefined || state.sessionId !== scope.sessionId) return;\n publish(scope, state);\n void processScope(scope, state);\n };\n\n receiveCommand = (scope, payload) => {\n const parsed = command(payload);\n if (parsed === undefined) return;\n void (async () => {\n try {\n if (parsed.action === 'targets') {\n 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 void processScope(scope);\n } catch (error) {\n if (error instanceof MissingComputerUseApiError) {\n latest.delete(scope.sessionId);\n } else {\n host.onNotice(\n `computer-use command failed for ${scope.sessionId} (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n }\n })();\n };\n\n const source: DoomHubChannelSource = {\n payloadFor: (scope) => latest.get(scope.sessionId),\n sessionAdded(scope) {\n scopes.set(scope.sessionId, scope);\n const unsubscribe = host.directEvents.subscribe(\n computerUseChannelType,\n scope.sessionId,\n (payload) => onState(scope, payload),\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n void processScope(scope);\n },\n sessionRemoved(sessionId) {\n const scope = scopes.get(sessionId);\n const grantId = grants.get(sessionId);\n subscriptions.get(sessionId)?.();\n subscriptions.delete(sessionId);\n if (scope !== undefined && grantId !== undefined && host.computerUse?.available) {\n void host.computerUse\n .request(scope, { operation: 'stop', payload: { grantId } })\n .catch((error: unknown) =>\n host.onNotice(\n `computer-use session cleanup failed (${error instanceof Error ? error.message : String(error)})`,\n ),\n );\n }\n scopes.delete(sessionId);\n latest.delete(sessionId);\n targets.delete(sessionId);\n grants.delete(sessionId);\n processing.delete(sessionId);\n if (activeSessionId === sessionId) activeSessionId = undefined;\n },\n close() {\n closed = true;\n for (const unsubscribe of subscriptions.values()) unsubscribe();\n subscriptions.clear();\n if (host.computerUse?.available) {\n for (const [sessionId, grantId] of grants) {\n const scope = scopes.get(sessionId);\n if (scope !== undefined)\n void host.computerUse\n .request(scope, { operation: 'stop', payload: { grantId } })\n .catch(() => undefined);\n }\n }\n scopes.clear();\n latest.clear();\n targets.clear();\n grants.clear();\n },\n };\n return source;\n },\n receive(scope, payload) {\n receiveCommand?.(scope, payload);\n },\n };\n}\n"],"mappings":"wRAiBA,SAAS,EAAO,EAAqD,CACnE,OAAO,OAAO,GAAU,UAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,EACrE,EACD,IAAA,EACN,CAEA,SAAS,EAAQ,EAAuD,CACtE,IAAM,EAAQ,EAAO,CAAK,EAC1B,OAAO,GAAO,SAAW,UACvB,GAAO,SAAW,WAClB,GAAO,SAAW,QAClB,GAAO,SAAW,YAChB,CAAE,OAAQ,EAAM,MAAO,EACvB,IAAA,EACN,CAEA,eAAe,EAAa,EAAsC,CAChE,IAAM,EAAQ,MAAM,EAAS,KAAK,EAClC,GAAI,CAAC,EAAS,GAAI,MAAM,EAA2B,EAAS,OAAQ,CAAK,EACzE,OAAO,CACT,CAEA,SAAS,EAAa,EAAoD,CACxE,IAAM,EAAQ,EAAO,CAAK,EAExB,UAAO,GAAO,WAAc,UAC5B,OAAO,EAAM,UAAa,UAC1B,OAAO,EAAM,MAAS,UACrB,CAAC,WAAY,wBAAyB,aAAc,SAAU,WAAY,QAAQ,CAAC,CAAC,SAAS,EAAM,KAAe,EAGrH,OAAO,CACT,CAEA,SAAgB,GAA2C,CACzD,IAAI,EACJ,MAAO,CACL,UAAW,EACX,UAAW,MACX,MAAM,EAAM,CACV,IAAM,EAAS,IAAI,IACb,EAAS,IAAI,IACb,EAAU,IAAI,IACd,EAAS,IAAI,IACb,EAAgB,IAAI,IACpB,EAAa,IAAI,IACnB,EACA,EAAS,GAEP,EAAiB,MAAO,EAA4B,EAAc,EAAS,MAAO,IACtF,EAAK,kBAAkB,EAAO,CAC5B,SAAU,EACV,OACA,SACA,GAAI,IAAU,IAAA,GAAY,CAAC,EAAI,CAAE,KAAM,KAAK,UAAU,CAAK,CAAE,CAC/D,CAAC,EAEG,GAAW,EAA4B,IAAwC,CAC/E,EAAM,QAAU,UAAY,EAAM,QAAU,cAAgB,EAAM,QAAU,WAC9E,EAAkB,EAAM,UACf,IAAoB,EAAM,YACnC,EAAkB,IAAA,GAClB,EAAO,OAAO,EAAM,SAAS,GAE/B,IAAM,EAAqC,CACzC,QACA,QAAS,EAAQ,IAAI,EAAM,SAAS,GAAK,CAAC,EAC1C,GAAI,IAAoB,IAAA,IAAa,IAAoB,EAAM,UAAY,CAAE,KAAM,EAAK,EAAI,CAAC,CAC/F,EACA,EAAO,IAAI,EAAM,UAAW,CAAO,EACnC,EAAK,QAAQ,EAAM,UAAW,CAAO,CACvC,EAEM,EAAU,KAAO,IAAgE,CACrF,IAAM,EAAQ,EAAa,MAAM,EAAa,MAAM,EAAe,EAAO,EAAoB,QAAQ,CAAC,CAAC,EACxG,GAAI,IAAU,IAAA,GAAW,MAAU,MAAM,qDAAqD,EAE9F,OADA,EAAQ,EAAO,CAAK,EACb,CACT,EAEM,EAAkB,MAAO,EAA4B,IAAqD,CAC9G,GAAI,CAAC,EAAK,aAAa,UAAW,MAAU,MAAM,6CAA6C,EAC/F,GAAI,CACF,IAAM,EAAS,MAAM,EAAK,YAAY,QAAQ,EAAO,CACnD,UAAW,EAAQ,UACnB,QACE,EAAQ,YAAc,MAClB,CAAE,QAAS,EAAQ,QAAS,SAAU,EAAQ,SAAU,OAAQ,EAAQ,OAAQ,EAChF,CAAE,QAAS,EAAQ,OAAQ,CACnC,CAAC,EACD,MAAM,EACJ,MAAM,EAAe,EAAO,EAAoB,YAAa,OAAQ,CAAE,GAAI,EAAQ,GAAI,QAAO,CAAC,CACjG,CACF,OAAS,EAAO,CACd,MAAM,EACJ,MAAM,EAAe,EAAO,EAAoB,YAAa,OAAQ,CACnE,GAAI,EAAQ,GACZ,MAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC9D,CAAC,CACH,CACF,CACF,EAEM,EAAc,KAAO,IAA8C,CACvE,IAAM,EAAiB,MAAM,EAC3B,MAAM,EAAe,EAAO,EAAoB,gBAAgB,CAClE,EACI,EACJ,GAAI,IAAkB,MAAQ,EAAK,aAAa,UAC9C,GAAI,CACF,EAAW,MAAM,EAAK,YAAY,QAAQ,EAAO,CAC/C,UAAW,OACX,QAAS,CAAE,QAAS,EAAc,OAAQ,CAC5C,CAAC,CACH,OAAS,EAAO,CACd,IAAM,EAAU,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EACrE,EAAW,CACT,WAAY,EAAW,EACvB,OAAQ,SACR,QAAS,CAAE,KAAM,mBAAoB,QAAS,EAAQ,MAAM,EAAG,GAAG,CAAE,CACtE,EACA,EAAK,SAAS,sDAAsD,EAAQ,EAAE,CAChF,CAEF,MAAM,EAAa,MAAM,EAAe,EAAO,EAAoB,QAAS,OAAQ,CAAE,UAAS,CAAC,CAAC,EACjG,EAAO,OAAO,EAAM,SAAS,EACzB,IAAoB,EAAM,YAAW,EAAkB,IAAA,GAC7D,EAEM,EAAe,MAAO,EAA4B,IAAsD,CACxG,QAAU,EAAW,IAAI,EAAM,SAAS,GAC5C,GAAW,IAAI,EAAM,SAAS,EAC9B,GAAI,CACF,IAAM,EAAQ,GAAc,MAAM,EAAQ,CAAK,EAC/C,GAAI,EAAM,QAAU,SAAU,CAC5B,GAAI,CAAC,EAAO,IAAI,EAAM,SAAS,EAAG,CAChC,IAAM,EAAiB,MAAM,EAC3B,MAAM,EAAe,EAAO,EAAoB,gBAAgB,CAClE,EACI,IAAkB,MAAM,EAAO,IAAI,EAAM,UAAW,EAAc,OAAO,CAC/E,CACA,IAAM,EAAU,OAAO,EAAM,WAAc,UAAY,EAAM,WAAa,KAAK,IAAI,EAC/E,EAAQ,GACZ,GAAI,CAAC,GAAW,EAAK,aAAa,UAChC,GAAI,CAEF,EADmB,EAAO,MAAM,EAAK,YAAY,QAAQ,EAAO,CAAE,UAAW,QAAS,CAAC,CACtE,CAAC,EAAE,iBAAmB,EACzC,MAAQ,CACN,EAAQ,EACV,CAEF,GAAI,GAAW,CAAC,EAAO,CACrB,MAAM,EAAY,CAAK,EACvB,MAAM,EAAQ,CAAK,EACnB,MACF,CACF,CACA,GACE,EAAM,QAAU,0BACf,IAAoB,IAAA,IAAa,IAAoB,EAAM,WAC5D,CACA,GAAI,CAAC,EAAK,aAAa,UAAW,MAAU,MAAM,6CAA6C,EAC/F,IAAM,EAAc,MAAM,EACxB,MAAM,EAAe,EAAO,EAAoB,aAAa,CAC/D,EACA,GAAI,IAAe,KAAM,CACvB,EAAkB,EAAM,UACxB,GAAI,CACF,IAAM,EAAa,MAAM,EAAK,YAAY,QAAQ,EAAO,CACvD,UAAW,WACX,QAAS,CACX,CAAC,EACD,MAAM,EACJ,MAAM,EAAe,EAAO,EAAoB,QAAS,OAAQ,CAAE,KAAM,CAAW,CAAC,CACvF,EACA,IAAM,EAAU,EAAO,CAAU,CAAC,EAAE,QAChC,OAAO,GAAY,UAAU,EAAO,IAAI,EAAM,UAAW,CAAO,CACtE,OAAS,EAAO,CACd,EAAkB,IAAA,GAClB,MAAM,EACJ,MAAM,EAAe,EAAO,EAAoB,QAAS,OAAQ,CAC/D,MAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,CAC9D,CAAC,CACH,CACF,CACA,MAAM,EAAQ,CAAK,CACrB,CACF,CACI,EAAM,QAAU,aAClB,MAAM,EAAY,CAAK,EACvB,MAAM,EAAQ,CAAK,GAErB,IAAM,EAAW,MAAM,EACrB,MAAM,EAAe,EAAO,EAAoB,OAAO,CACzD,EACI,IAAY,MAAM,MAAM,EAAgB,EAAO,CAAO,CAC5D,OAAS,EAAO,CACV,aAAiB,EACnB,EAAO,OAAO,EAAM,SAAS,EAE7B,EAAK,SACH,0CAA0C,EAAM,UAAU,IAAI,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,EACvH,CAEJ,QAAU,CACR,EAAW,OAAO,EAAM,SAAS,CACnC,CA3E8B,CA4EhC,EAEM,GAAW,EAA4B,IAA2B,CACtE,IAAM,EAAQ,EAAa,CAAO,EAC9B,IAAU,IAAA,IAAa,EAAM,YAAc,EAAM,YACrD,EAAQ,EAAO,CAAK,EACpB,EAAkB,EAAO,CAAK,EAChC,EAsFA,MApFA,IAAkB,EAAO,IAAY,CACnC,IAAM,EAAS,EAAQ,CAAO,EAC1B,IAAW,IAAA,KACT,SAAY,CAChB,GAAI,CACF,GAAI,EAAO,SAAW,UAAW,CAC/B,GAAI,CAAC,EAAK,aAAa,UAAW,MAAU,MAAM,6CAA6C,EAC/F,IAAM,EAAS,MAAM,EAAK,YAAY,QAAQ,EAAO,CAAE,UAAW,SAAU,CAAC,EAC7E,EAAQ,IACN,EAAM,UACN,MAAM,QAAQ,CAAM,EAChB,EAAO,OAAQ,GAA0C,EAAO,CAAI,IAAM,IAAA,EAAS,EACnF,CAAC,CACP,CACF,MAAW,EAAO,SAAW,QAC3B,MAAM,EAAY,CAAK,EAEzB,MAAM,EAAQ,CAAK,EACnB,EAAkB,CAAK,CACzB,OAAS,EAAO,CACV,aAAiB,EACnB,EAAO,OAAO,EAAM,SAAS,EAE7B,EAAK,SACH,mCAAmC,EAAM,UAAU,IAAI,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,EAChH,CAEJ,CACF,EAAA,CAAG,CACL,EAuDO,CApDL,WAAa,GAAU,EAAO,IAAI,EAAM,SAAS,EACjD,aAAa,EAAO,CAClB,EAAO,IAAI,EAAM,UAAW,CAAK,EACjC,IAAM,EAAc,EAAK,aAAa,UACpC,EACA,EAAM,UACL,GAAY,EAAQ,EAAO,CAAO,EACnC,CAAE,aAAc,EAAK,CACvB,EACA,EAAc,IAAI,EAAM,UAAW,CAAW,EAC9C,EAAkB,CAAK,CACzB,EACA,eAAe,EAAW,CACxB,IAAM,EAAQ,EAAO,IAAI,CAAS,EAC5B,EAAU,EAAO,IAAI,CAAS,EACpC,EAAc,IAAI,CAAS,CAAC,GAAG,EAC/B,EAAc,OAAO,CAAS,EAC1B,IAAU,IAAA,IAAa,IAAY,IAAA,IAAa,EAAK,aAAa,WACpE,EAAU,YACP,QAAQ,EAAO,CAAE,UAAW,OAAQ,QAAS,CAAE,SAAQ,CAAE,CAAC,CAAC,CAC3D,MAAO,GACN,EAAK,SACH,wCAAwC,aAAiB,MAAQ,EAAM,QAAU,OAAO,CAAK,EAAE,EACjG,CACF,EAEJ,EAAO,OAAO,CAAS,EACvB,EAAO,OAAO,CAAS,EACvB,EAAQ,OAAO,CAAS,EACxB,EAAO,OAAO,CAAS,EACvB,EAAW,OAAO,CAAS,EACvB,IAAoB,IAAW,EAAkB,IAAA,GACvD,EACA,OAAQ,CACN,EAAS,GACT,IAAK,IAAM,KAAe,EAAc,OAAO,EAAG,EAAY,EAE9D,GADA,EAAc,MAAM,EAChB,EAAK,aAAa,UACpB,IAAK,GAAM,CAAC,EAAW,KAAY,EAAQ,CACzC,IAAM,EAAQ,EAAO,IAAI,CAAS,EAC9B,IAAU,IAAA,IACZ,EAAU,YACP,QAAQ,EAAO,CAAE,UAAW,OAAQ,QAAS,CAAE,SAAQ,CAAE,CAAC,CAAC,CAC3D,UAAY,IAAA,EAAS,CAC5B,CAEF,EAAO,MAAM,EACb,EAAO,MAAM,EACb,EAAQ,MAAM,EACd,EAAO,MAAM,CACf,CAEU,CACd,EACA,QAAQ,EAAO,EAAS,CACtB,IAAiB,EAAO,CAAO,CACjC,CACF,CACF"}
@@ -1 +1,2 @@
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;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../services/dependencies/index.cjs"),t=require("../controllers/computerUseRuntime.cjs"),n=(0,require("@agimon-ai/doompi-core/pi-extension").definePiExtension)(`@agimon-ai/doompi-computer-use`,({options:n,signal:r})=>t.createComputerUseRuntime(n??e.createComputerUseDependencies(),r));exports.computerUseExtension=n,exports.default=n;
2
+ //# sourceMappingURL=pi.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.cjs","names":["definePiExtension","createComputerUseRuntime","createComputerUseDependencies"],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { definePiExtension } from '@agimon-ai/doompi-core/pi-extension';\n\nimport { createComputerUseRuntime } from '../controllers/computerUseRuntime';\nimport { createComputerUseDependencies } from '../services/dependencies';\nimport type { ComputerUseExtensionDependencies } from '../types/extension';\nexport const computerUseExtension = definePiExtension<ComputerUseExtensionDependencies>(\n '@agimon-ai/doompi-computer-use',\n ({ options, signal }) => createComputerUseRuntime(options ?? createComputerUseDependencies(), signal),\n);\nexport default computerUseExtension;\n"],"mappings":"wMAKa,GAAA,+CAAuBA,CAAAA,CAAAA,kBAAAA,CAClC,kCACC,CAAE,UAAS,YAAaC,EAAAA,yBAAyB,GAAWC,EAAAA,8BAA8B,EAAG,CAAM,CACtG"}
@@ -1,2 +1,6 @@
1
- import { activateComputerUseExtension } from "../adapters/pi/extension.cjs";
2
- export { activateComputerUseExtension, activateComputerUseExtension as default };
1
+ import { ComputerUseExtensionDependencies } from "../types/extension.cjs";
2
+ //#region src/extensions/pi.d.ts
3
+ export declare const computerUseExtension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<ComputerUseExtensionDependencies>;
4
+ //#endregion
5
+ export { computerUseExtension as default };
6
+ //# sourceMappingURL=pi.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.cts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";;qBAKa,4EAAoB,mBAAA"}
@@ -1,2 +1,6 @@
1
- import { activateComputerUseExtension } from "../adapters/pi/extension.mjs";
2
- export { activateComputerUseExtension, activateComputerUseExtension as default };
1
+ import { ComputerUseExtensionDependencies } from "../types/extension.mjs";
2
+ //#region src/extensions/pi.d.ts
3
+ export declare const computerUseExtension: import("@agimon-ai/doompi-core/runtime-pi-extension").DefinedPiExtension<ComputerUseExtensionDependencies>;
4
+ //#endregion
5
+ export { computerUseExtension as default };
6
+ //# sourceMappingURL=pi.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.mts","names":[],"sources":["../../src/extensions/pi.ts"],"mappings":";;qBAKa,4EAAoB,mBAAA"}
@@ -1 +1,2 @@
1
- import{activateComputerUseExtension as e}from"../adapters/pi/extension.mjs";export{e as activateComputerUseExtension,e as default};
1
+ import{createComputerUseDependencies as e}from"../services/dependencies/index.mjs";import{createComputerUseRuntime as t}from"../controllers/computerUseRuntime.mjs";import{definePiExtension as n}from"@agimon-ai/doompi-core/pi-extension";const r=n(`@agimon-ai/doompi-computer-use`,({options:n,signal:r})=>t(n??e(),r));export{r as computerUseExtension,r as default};
2
+ //# sourceMappingURL=pi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.mjs","names":[],"sources":["../../src/extensions/pi.ts"],"sourcesContent":["import { definePiExtension } from '@agimon-ai/doompi-core/pi-extension';\n\nimport { createComputerUseRuntime } from '../controllers/computerUseRuntime';\nimport { createComputerUseDependencies } from '../services/dependencies';\nimport type { ComputerUseExtensionDependencies } from '../types/extension';\nexport const computerUseExtension = definePiExtension<ComputerUseExtensionDependencies>(\n '@agimon-ai/doompi-computer-use',\n ({ options, signal }) => createComputerUseRuntime(options ?? createComputerUseDependencies(), signal),\n);\nexport default computerUseExtension;\n"],"mappings":"4OAKA,MAAa,EAAuB,EAClC,kCACC,CAAE,UAAS,YAAa,EAAyB,GAAW,EAA8B,EAAG,CAAM,CACtG"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require("../controllers/computerUseApi.cjs"),t=require("../controllers/computerUseServer.cjs"),n=require("../controllers/webComputerUseChannel.cjs"),r=(0,require("@agimon-ai/doompi-core/server-facet").defineServerPlugin)({name:`@agimon-ai/doompi-computer-use`,global:{channels:[n.createComputerUseChannel]},workspace:{channels:[n.createComputerUseChannel]},session:({agent:n})=>({...n?t.createComputerUseServer(n):{},api:[e.api]})});exports.computerUseServerFacet=r,exports.default=r;
2
+ //# sourceMappingURL=server.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.cjs","names":["defineServerPlugin","createComputerUseChannel","createComputerUseServer","api"],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { api } from '../controllers/computerUseApi';\nimport { createComputerUseServer } from '../controllers/computerUseServer';\nimport { createComputerUseChannel } from '../controllers/webComputerUseChannel';\nexport const computerUseServerFacet = defineServerPlugin({\n name: '@agimon-ai/doompi-computer-use',\n global: { channels: [createComputerUseChannel] },\n workspace: { channels: [createComputerUseChannel] },\n session: ({ agent }) => ({ ...(agent ? createComputerUseServer(agent) : {}), api: [api] }),\n});\nexport default computerUseServerFacet;\n"],"mappings":"4PAKa,GAAA,+CAAyBA,CAAAA,CAAAA,mBAAAA,CAAmB,CACvD,KAAM,iCACN,OAAQ,CAAE,SAAU,CAACC,EAAAA,wBAAwB,CAAE,EAC/C,UAAW,CAAE,SAAU,CAACA,EAAAA,wBAAwB,CAAE,EAClD,SAAU,CAAE,YAAa,CAAE,GAAI,EAAQC,EAAAA,wBAAwB,CAAK,EAAI,CAAC,EAAI,IAAK,CAACC,EAAAA,GAAG,CAAE,EAC1F,CAAC"}
@@ -0,0 +1,5 @@
1
+ //#region src/extensions/server.d.ts
2
+ export declare const computerUseServerFacet: import("@agimon-ai/doompi-core/server-facet").DoomServerFacet;
3
+ //#endregion
4
+ export { computerUseServerFacet as default };
5
+ //# sourceMappingURL=server.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.cts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAKa,sEAAsB"}
@@ -0,0 +1,5 @@
1
+ //#region src/extensions/server.d.ts
2
+ export declare const computerUseServerFacet: import("@agimon-ai/doompi-core/server-facet").DoomServerFacet;
3
+ //#endregion
4
+ export { computerUseServerFacet as default };
5
+ //# sourceMappingURL=server.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.mts","names":[],"sources":["../../src/extensions/server.ts"],"mappings":";qBAKa,sEAAsB"}
@@ -0,0 +1,2 @@
1
+ import{api as e}from"../controllers/computerUseApi.mjs";import{createComputerUseServer as t}from"../controllers/computerUseServer.mjs";import{createComputerUseChannel as n}from"../controllers/webComputerUseChannel.mjs";import{defineServerPlugin as r}from"@agimon-ai/doompi-core/server-facet";const i=r({name:`@agimon-ai/doompi-computer-use`,global:{channels:[n]},workspace:{channels:[n]},session:({agent:n})=>({...n?t(n):{},api:[e]})});export{i as computerUseServerFacet,i as default};
2
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.mjs","names":[],"sources":["../../src/extensions/server.ts"],"sourcesContent":["import { defineServerPlugin } from '@agimon-ai/doompi-core/server-facet';\n\nimport { api } from '../controllers/computerUseApi';\nimport { createComputerUseServer } from '../controllers/computerUseServer';\nimport { createComputerUseChannel } from '../controllers/webComputerUseChannel';\nexport const computerUseServerFacet = defineServerPlugin({\n name: '@agimon-ai/doompi-computer-use',\n global: { channels: [createComputerUseChannel] },\n workspace: { channels: [createComputerUseChannel] },\n session: ({ agent }) => ({ ...(agent ? createComputerUseServer(agent) : {}), api: [api] }),\n});\nexport default computerUseServerFacet;\n"],"mappings":"oSAKA,MAAa,EAAyB,EAAmB,CACvD,KAAM,iCACN,OAAQ,CAAE,SAAU,CAAC,CAAwB,CAAE,EAC/C,UAAW,CAAE,SAAU,CAAC,CAAwB,CAAE,EAClD,SAAU,CAAE,YAAa,CAAE,GAAI,EAAQ,EAAwB,CAAK,EAAI,CAAC,EAAI,IAAK,CAAC,CAAG,CAAE,EAC1F,CAAC"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./types/computerUseApi.cjs"),t=require("./adapters/pi/sessionApiClient.cjs"),n=require("./adapters/pi/computerScriptRunner.cjs"),r=require("./services/extensionService.cjs"),i=require("./container/index.cjs"),a=require("./adapters/pi/extension.cjs"),o=require("./services/sessionController.cjs"),s=require("./services/traceRedaction.cjs");exports.COMPUTER_USE_GUIDANCE=a.COMPUTER_USE_GUIDANCE,exports.COMPUTER_USE_MODE_ID=e.COMPUTER_USE_MODE_ID,exports.COMPUTER_USE_SCRIPT_PATHS_ENV=i.COMPUTER_USE_SCRIPT_PATHS_ENV,exports.COMPUTER_USE_TOOL_NAMES=a.COMPUTER_USE_TOOL_NAMES,exports.ComputerScriptRunner=n.ComputerScriptRunner,exports.DefaultComputerUseExtensionService=r.DefaultComputerUseExtensionService,exports.UnixComputerUseSessionClient=t.UnixComputerUseSessionClient,exports.activateComputerUseExtension=a.activateComputerUseExtension,exports.createComputerUseContainer=i.createComputerUseContainer,exports.createComputerUseSessionClient=t.createComputerUseSessionClient,exports.initialComputerUseState=o.initialComputerUseState,exports.redactComputerUseTrace=s.redactComputerUseTrace,exports.reduceComputerUseState=o.reduceComputerUseState;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./constants/computerUse.cjs"),t=require("./services/sessionApiClient/index.cjs"),n=require("./services/computerScriptRunner/index.cjs"),r=require("./services/extensionService/index.cjs"),i=require("./services/dependencies/index.cjs"),a=require("./models/computerUseState.cjs"),o=require("./services/traceRedaction/index.cjs");exports.COMPUTER_USE_GUIDANCE=e.COMPUTER_USE_GUIDANCE,exports.COMPUTER_USE_SCRIPT_PATHS_ENV=i.COMPUTER_USE_SCRIPT_PATHS_ENV,exports.COMPUTER_USE_TOOL_NAMES=e.COMPUTER_USE_TOOL_NAMES,exports.ComputerScriptRunner=n.ComputerScriptRunner,exports.DefaultComputerUseExtensionService=r.DefaultComputerUseExtensionService,exports.createComputerUseDependencies=i.createComputerUseDependencies,exports.createComputerUseSessionClient=t.createComputerUseSessionClient,exports.initialComputerUseState=a.initialComputerUseState,exports.redactComputerUseTrace=o.redactComputerUseTrace,exports.reduceComputerUseState=a.reduceComputerUseState;
package/dist/index.d.cts CHANGED
@@ -1,12 +1,12 @@
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";
1
+ import { COMPUTER_USE_GUIDANCE, COMPUTER_USE_TOOL_NAMES } from "./constants/computerUse.cjs";
2
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";
3
+ 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";
4
+ import { ComputerUseSessionClient, createComputerUseSessionClient } from "./services/sessionApiClient/index.cjs";
4
5
  import { ComputerScriptExecutionResult, ComputerScriptExecutor, ComputerScriptLogger, ComputerScriptProgram, ComputerScriptRun, ComputerScriptRunContext, ComputerScriptRunnerOptions } from "./types/computerScript.cjs";
5
6
  import { ComputerUseExtensionDependencies, ComputerUseExtensionResult, ComputerUseExtensionService, ComputerUseNotificationLevel } from "./types/extension.cjs";
6
- import { COMPUTER_USE_GUIDANCE, COMPUTER_USE_TOOL_NAMES, activateComputerUseExtension } from "./adapters/pi/extension.cjs";
7
- import { COMPUTER_USE_SCRIPT_PATHS_ENV, createComputerUseContainer } from "./container/index.cjs";
8
- import { ComputerScriptRunner } from "./adapters/pi/computerScriptRunner.cjs";
9
- import { DefaultComputerUseExtensionService } from "./services/extensionService.cjs";
10
- import { initialComputerUseState, reduceComputerUseState } from "./services/sessionController.cjs";
11
- import { redactComputerUseTrace } from "./services/traceRedaction.cjs";
12
- 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, COMPUTER_USE_SCRIPT_PATHS_ENV, type COMPUTER_USE_STATUS_KEY, COMPUTER_USE_TOOL_NAMES, type COMPUTER_USE_WAKE_LIMIT, type ComputerScriptExecutionResult, type ComputerScriptExecutor, type ComputerScriptLogger, type ComputerScriptProgram, type ComputerScriptRun, type ComputerScriptRunContext, ComputerScriptRunner, type ComputerScriptRunnerOptions, 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 };
7
+ import { COMPUTER_USE_SCRIPT_PATHS_ENV, createComputerUseDependencies } from "./services/dependencies/index.cjs";
8
+ import { ComputerScriptRunner } from "./services/computerScriptRunner/index.cjs";
9
+ import { DefaultComputerUseExtensionService } from "./services/extensionService/index.cjs";
10
+ import { initialComputerUseState, reduceComputerUseState } from "./models/computerUseState.cjs";
11
+ import { redactComputerUseTrace } from "./services/traceRedaction/index.cjs";
12
+ 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, type COMPUTER_USE_MODE_ID, type COMPUTER_USE_MODE_STATUS_KEY, type COMPUTER_USE_PHASES, type COMPUTER_USE_ROUTES, COMPUTER_USE_SCRIPT_PATHS_ENV, type COMPUTER_USE_STATUS_KEY, COMPUTER_USE_TOOL_NAMES, type COMPUTER_USE_WAKE_LIMIT, type ComputerScriptExecutionResult, type ComputerScriptExecutor, type ComputerScriptLogger, type ComputerScriptProgram, type ComputerScriptRun, type ComputerScriptRunContext, ComputerScriptRunner, type ComputerScriptRunnerOptions, 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, type activationUrl, type computerUseChannelType, createComputerUseDependencies, createComputerUseSessionClient, initialComputerUseState, redactComputerUseTrace, reduceComputerUseState };
package/dist/index.d.mts CHANGED
@@ -1,12 +1,12 @@
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";
1
+ import { COMPUTER_USE_GUIDANCE, COMPUTER_USE_TOOL_NAMES } from "./constants/computerUse.mjs";
2
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";
3
+ 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";
4
+ import { ComputerUseSessionClient, createComputerUseSessionClient } from "./services/sessionApiClient/index.mjs";
4
5
  import { ComputerScriptExecutionResult, ComputerScriptExecutor, ComputerScriptLogger, ComputerScriptProgram, ComputerScriptRun, ComputerScriptRunContext, ComputerScriptRunnerOptions } from "./types/computerScript.mjs";
5
6
  import { ComputerUseExtensionDependencies, ComputerUseExtensionResult, ComputerUseExtensionService, ComputerUseNotificationLevel } from "./types/extension.mjs";
6
- import { COMPUTER_USE_GUIDANCE, COMPUTER_USE_TOOL_NAMES, activateComputerUseExtension } from "./adapters/pi/extension.mjs";
7
- import { COMPUTER_USE_SCRIPT_PATHS_ENV, createComputerUseContainer } from "./container/index.mjs";
8
- import { ComputerScriptRunner } from "./adapters/pi/computerScriptRunner.mjs";
9
- import { DefaultComputerUseExtensionService } from "./services/extensionService.mjs";
10
- import { initialComputerUseState, reduceComputerUseState } from "./services/sessionController.mjs";
11
- import { redactComputerUseTrace } from "./services/traceRedaction.mjs";
12
- 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, COMPUTER_USE_SCRIPT_PATHS_ENV, type COMPUTER_USE_STATUS_KEY, COMPUTER_USE_TOOL_NAMES, type COMPUTER_USE_WAKE_LIMIT, type ComputerScriptExecutionResult, type ComputerScriptExecutor, type ComputerScriptLogger, type ComputerScriptProgram, type ComputerScriptRun, type ComputerScriptRunContext, ComputerScriptRunner, type ComputerScriptRunnerOptions, 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 };
7
+ import { COMPUTER_USE_SCRIPT_PATHS_ENV, createComputerUseDependencies } from "./services/dependencies/index.mjs";
8
+ import { ComputerScriptRunner } from "./services/computerScriptRunner/index.mjs";
9
+ import { DefaultComputerUseExtensionService } from "./services/extensionService/index.mjs";
10
+ import { initialComputerUseState, reduceComputerUseState } from "./models/computerUseState.mjs";
11
+ import { redactComputerUseTrace } from "./services/traceRedaction/index.mjs";
12
+ 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, type COMPUTER_USE_MODE_ID, type COMPUTER_USE_MODE_STATUS_KEY, type COMPUTER_USE_PHASES, type COMPUTER_USE_ROUTES, COMPUTER_USE_SCRIPT_PATHS_ENV, type COMPUTER_USE_STATUS_KEY, COMPUTER_USE_TOOL_NAMES, type COMPUTER_USE_WAKE_LIMIT, type ComputerScriptExecutionResult, type ComputerScriptExecutor, type ComputerScriptLogger, type ComputerScriptProgram, type ComputerScriptRun, type ComputerScriptRunContext, ComputerScriptRunner, type ComputerScriptRunnerOptions, 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, type activationUrl, type computerUseChannelType, createComputerUseDependencies, createComputerUseSessionClient, initialComputerUseState, redactComputerUseTrace, reduceComputerUseState };
package/dist/index.mjs CHANGED
@@ -1 +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{ComputerScriptRunner as r}from"./adapters/pi/computerScriptRunner.mjs";import{DefaultComputerUseExtensionService as i}from"./services/extensionService.mjs";import{COMPUTER_USE_SCRIPT_PATHS_ENV as a,createComputerUseContainer as o}from"./container/index.mjs";import{COMPUTER_USE_GUIDANCE as s,COMPUTER_USE_TOOL_NAMES as c,activateComputerUseExtension as l}from"./adapters/pi/extension.mjs";import{initialComputerUseState as u,reduceComputerUseState as d}from"./services/sessionController.mjs";import{redactComputerUseTrace as f}from"./services/traceRedaction.mjs";export{s as COMPUTER_USE_GUIDANCE,e as COMPUTER_USE_MODE_ID,a as COMPUTER_USE_SCRIPT_PATHS_ENV,c as COMPUTER_USE_TOOL_NAMES,r as ComputerScriptRunner,i as DefaultComputerUseExtensionService,t as UnixComputerUseSessionClient,l as activateComputerUseExtension,o as createComputerUseContainer,n as createComputerUseSessionClient,u as initialComputerUseState,f as redactComputerUseTrace,d as reduceComputerUseState};
1
+ import{COMPUTER_USE_GUIDANCE as e,COMPUTER_USE_TOOL_NAMES as t}from"./constants/computerUse.mjs";import{createComputerUseSessionClient as n}from"./services/sessionApiClient/index.mjs";import{ComputerScriptRunner as r}from"./services/computerScriptRunner/index.mjs";import{DefaultComputerUseExtensionService as i}from"./services/extensionService/index.mjs";import{COMPUTER_USE_SCRIPT_PATHS_ENV as a,createComputerUseDependencies as o}from"./services/dependencies/index.mjs";import{initialComputerUseState as s,reduceComputerUseState as c}from"./models/computerUseState.mjs";import{redactComputerUseTrace as l}from"./services/traceRedaction/index.mjs";export{e as COMPUTER_USE_GUIDANCE,a as COMPUTER_USE_SCRIPT_PATHS_ENV,t as COMPUTER_USE_TOOL_NAMES,r as ComputerScriptRunner,i as DefaultComputerUseExtensionService,o as createComputerUseDependencies,n as createComputerUseSessionClient,s as initialComputerUseState,l as redactComputerUseTrace,c as reduceComputerUseState};
@@ -0,0 +1,2 @@
1
+ const e=require("../constants/computerUse.cjs");function t(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 n(t){let n=new Set(e.COMPUTER_USE_TOOL_NAMES);return e=>t?e:e.filter(e=>!n.has(e))}exports.computerUseRestriction=n,exports.modeState=t;
2
+ //# sourceMappingURL=computerUseMode.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computerUseMode.cjs","names":["COMPUTER_USE_TOOL_NAMES"],"sources":["../../src/models/computerUseMode.ts"],"sourcesContent":["import type { DoomToolRestriction } from '@agimon-ai/doompi-core/tool-surface';\nimport type { MinorModeState } from '@agimon-ai/doompi-minor-mode';\n\nimport { COMPUTER_USE_TOOL_NAMES } from '../constants/computerUse';\nimport type { ComputerUseSessionView } from '../types/computerUseApi';\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\n/**\n * Hides the computer-use tools while the mode is off.\n *\n * The arbiter starts from every registered tool, so an active mode only has to\n * return the list untouched: nothing has to add the tools back.\n */\nexport function computerUseRestriction(active: boolean): DoomToolRestriction {\n const owned = new Set<string>(COMPUTER_USE_TOOL_NAMES);\n return (incoming) => (active ? incoming : incoming.filter((name) => !owned.has(name)));\n}\n"],"mappings":"gDAKA,SAAgB,EAAU,EAAgC,EAAU,GAAuB,CACzF,IAAM,EAAQ,GAAO,OAAS,WAExB,EAAc,GADJ,IAAU,YAAc,IAAU,SASlD,MAAO,CACL,WARiB,EACf,IAAU,WACR,eACA,IAAU,yBAA2B,IAAU,aAC7C,aACA,SACJ,WAGF,UACE,IAAU,wBACN,UACA,IAAU,SACR,SACA,IAAU,cAAgB,IAAU,WAClC,SACA,QACV,GAAI,GAAe,IAAU,WAAa,CAAE,OAAQ,oCAAqC,EAAI,CAAC,EAC9F,GAAI,IAAU,wBAA0B,CAAE,OAAQ,mCAAoC,EAAI,CAAC,EAC3F,QAAS,CACP,CACE,GAAI,WACJ,QAAS,CAAC,EACV,GAAK,EAAmB,CAAE,eAAgB,kCAAmC,EAA1D,CAAC,CACtB,EACA,CACE,GAAI,aACJ,QAAS,EACT,GAAI,EAAc,CAAC,EAAI,CAAE,eAAgB,8BAA+B,CAC1E,EACA,CAAE,GAAI,SAAU,QAAS,EAAK,CAChC,CACF,CACF,CAQA,SAAgB,EAAuB,EAAsC,CAC3E,IAAM,EAAQ,IAAI,IAAYA,EAAAA,uBAAuB,EACrD,MAAQ,IAAc,EAAS,EAAW,EAAS,OAAQ,GAAS,CAAC,EAAM,IAAI,CAAI,CAAC,CACtF"}
@@ -0,0 +1,2 @@
1
+ import{COMPUTER_USE_TOOL_NAMES as e}from"../constants/computerUse.mjs";function t(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 n(t){let n=new Set(e);return e=>t?e:e.filter(e=>!n.has(e))}export{n as computerUseRestriction,t as modeState};
2
+ //# sourceMappingURL=computerUseMode.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computerUseMode.mjs","names":[],"sources":["../../src/models/computerUseMode.ts"],"sourcesContent":["import type { DoomToolRestriction } from '@agimon-ai/doompi-core/tool-surface';\nimport type { MinorModeState } from '@agimon-ai/doompi-minor-mode';\n\nimport { COMPUTER_USE_TOOL_NAMES } from '../constants/computerUse';\nimport type { ComputerUseSessionView } from '../types/computerUseApi';\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\n/**\n * Hides the computer-use tools while the mode is off.\n *\n * The arbiter starts from every registered tool, so an active mode only has to\n * return the list untouched: nothing has to add the tools back.\n */\nexport function computerUseRestriction(active: boolean): DoomToolRestriction {\n const owned = new Set<string>(COMPUTER_USE_TOOL_NAMES);\n return (incoming) => (active ? incoming : incoming.filter((name) => !owned.has(name)));\n}\n"],"mappings":"uEAKA,SAAgB,EAAU,EAAgC,EAAU,GAAuB,CACzF,IAAM,EAAQ,GAAO,OAAS,WAExB,EAAc,GADJ,IAAU,YAAc,IAAU,SASlD,MAAO,CACL,WARiB,EACf,IAAU,WACR,eACA,IAAU,yBAA2B,IAAU,aAC7C,aACA,SACJ,WAGF,UACE,IAAU,wBACN,UACA,IAAU,SACR,SACA,IAAU,cAAgB,IAAU,WAClC,SACA,QACV,GAAI,GAAe,IAAU,WAAa,CAAE,OAAQ,oCAAqC,EAAI,CAAC,EAC9F,GAAI,IAAU,wBAA0B,CAAE,OAAQ,mCAAoC,EAAI,CAAC,EAC3F,QAAS,CACP,CACE,GAAI,WACJ,QAAS,CAAC,EACV,GAAK,EAAmB,CAAE,eAAgB,kCAAmC,EAA1D,CAAC,CACtB,EACA,CACE,GAAI,aACJ,QAAS,EACT,GAAI,EAAc,CAAC,EAAI,CAAE,eAAgB,8BAA+B,CAC1E,EACA,CAAE,GAAI,SAAU,QAAS,EAAK,CAChC,CACF,CACF,CAQA,SAAgB,EAAuB,EAAsC,CAC3E,IAAM,EAAQ,IAAI,IAAY,CAAuB,EACrD,MAAQ,IAAc,EAAS,EAAW,EAAS,OAAQ,GAAS,CAAC,EAAM,IAAI,CAAI,CAAC,CACtF"}
@@ -1,2 +1,2 @@
1
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
2
+ //# sourceMappingURL=computerUseState.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computerUseState.cjs","names":[],"sources":["../../src/models/computerUseState.ts"],"sourcesContent":["import type { ComputerUseState, ComputerUseStateEvent } from '../types/computerUse';\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,6 +1,6 @@
1
1
  import { ComputerUseState, ComputerUseStateEvent } from "../types/computerUse.cjs";
2
- //#region src/services/sessionController.d.ts
2
+ //#region src/models/computerUseState.d.ts
3
3
  export declare function initialComputerUseState(identity: ComputerUseState['identity']): ComputerUseState;
4
4
  export declare function reduceComputerUseState(state: ComputerUseState, event: ComputerUseStateEvent): ComputerUseState;
5
5
  //#endregion
6
- //# sourceMappingURL=sessionController.d.cts.map
6
+ //# sourceMappingURL=computerUseState.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computerUseState.d.cts","names":[],"sources":["../../src/models/computerUseState.ts"],"mappings":";;wBAcgB,wBAAwB,UAAU,+BAA+B;wBAIjE,uBAAuB,OAAO,kBAAkB,OAAO,wBAAwB"}
@@ -1,6 +1,6 @@
1
1
  import { ComputerUseState, ComputerUseStateEvent } from "../types/computerUse.mjs";
2
- //#region src/services/sessionController.d.ts
2
+ //#region src/models/computerUseState.d.ts
3
3
  export declare function initialComputerUseState(identity: ComputerUseState['identity']): ComputerUseState;
4
4
  export declare function reduceComputerUseState(state: ComputerUseState, event: ComputerUseStateEvent): ComputerUseState;
5
5
  //#endregion
6
- //# sourceMappingURL=sessionController.d.mts.map
6
+ //# sourceMappingURL=computerUseState.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computerUseState.d.mts","names":[],"sources":["../../src/models/computerUseState.ts"],"mappings":";;wBAcgB,wBAAwB,UAAU,+BAA+B;wBAIjE,uBAAuB,OAAO,kBAAkB,OAAO,wBAAwB"}
@@ -1,2 +1,2 @@
1
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
2
+ //# sourceMappingURL=computerUseState.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"computerUseState.mjs","names":[],"sources":["../../src/models/computerUseState.ts"],"sourcesContent":["import type { ComputerUseState, ComputerUseStateEvent } from '../types/computerUse';\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
+ let e=require("@agimon-ai/doompi-core/api-contracts"),t=require("typebox");const n=t.Type.String(),r=t.Type.Number(),i=t.Type.Optional,a=e=>t.Type.Union(e.map(e=>t.Type.Literal(e))),o=t.Type.Unknown({description:`Desktop provider JSON value. Targets, observations and action results are supplied by the admitted Desktop provider.`}),s=t.Type.Record(n,o),c=t.Type.Object({code:n,message:n}),l=t.Type.Object({artifactId:n,status:a([`ready`,`failed`]),downloadUrl:i(n),previewUrl:i(n),actionCount:i(r),completedAt:i(n),failure:i(c)}),u=t.Type.Object({sessionId:n,revision:r,wake:r,phase:a([`inactive`,`awaiting_confirmation`,`activating`,`active`,`stopping`,`failed`]),requestId:i(n),target:i(s),durationMs:i(r),expiresAt:i(r),failure:i(c),artifact:i(l)}),d={snapshotId:t.Type.String({minLength:1}),elementRef:t.Type.String({minLength:1})},f=t.Type.Union([t.Type.Object({kind:a([`press`,`focus`]),...d},{additionalProperties:!1}),t.Type.Object({kind:t.Type.Literal(`set_value`),...d,value:n},{additionalProperties:!1}),t.Type.Object({kind:t.Type.Literal(`scroll`),...d,direction:a([`up`,`down`,`left`,`right`]),amount:a([`line`,`page`])},{additionalProperties:!1})]),p=(n,r,i,a,o=200)=>({id:`computer.${r.slice(1).replaceAll(`/`,`.`)}`,scope:`session`,basePath:`computer-use`,path:r,method:n,authentication:`owner`,description:`Computer use broker ${r}. Requires the host-issued ${r.startsWith(`/agent/`)?`agent`:`hub`} bearer token.`,availability:`Internal broker route; ordinary browser credentials are insufficient.`,parameters:[{name:`Authorization`,in:`header`,required:!0,schema:t.Type.String({pattern:`^Bearer .+`})}],...a?{body:{required:!0,contentType:`application/json`,schema:a}}:{},responses:(0,e.jsonApiResponses)(i,o)}),m=(0,e.defineApiContract)({version:1,dynamic:[`Desktop provider target extensions, observations and operation results are runtime-defined JSON.`],http:[{id:`computer.activate`,scope:`session`,basePath:`computer-use`,path:`/activate`,method:`POST`,authentication:`owner`,description:`Request confirmed Desktop access with admitted caller and remote step-up context.`,body:{required:!0,contentType:`application/json`,schema:t.Type.Object({target:t.Type.Object({windowId:n,bundleId:n}),durationMs:t.Type.Integer({minimum:1e3,maximum:18e5})})},responses:(0,e.jsonApiResponses)(u,202)},p(`GET`,`/agent/state`,u),p(`GET`,`/hub/state`,u),p(`POST`,`/agent/observe`,o),p(`POST`,`/agent/action`,o,f),p(`POST`,`/agent/stop`,u,void 0,202),p(`GET`,`/hub/activation`,t.Type.Union([t.Type.Null(),t.Type.Object({requestId:n,target:s,durationSeconds:r,createdAt:r,confirmationExpiresAt:r,caller:t.Type.Object({locality:a([`local`,`remote`]),stepUp:n})})])),p(`GET`,`/hub/authorization`,t.Type.Union([t.Type.Null(),t.Type.Object({grantId:n,expiresAt:i(r)})])),p(`GET`,`/hub/next`,t.Type.Union([t.Type.Null(),t.Type.Object({id:n,operation:a([`observe`,`act`]),payload:i(o),grantId:n,sequence:i(r)})])),p(`POST`,`/hub/complete`,u,t.Type.Object({id:n,error:i(n),result:i(o)})),p(`POST`,`/hub/stop`,u,t.Type.Object({error:i(n),host:i(t.Type.Object({grantId:n,expiresAt:r})),artifact:i(l)}))],sockets:[`global`,`workspace`].flatMap(e=>[{id:`computer.state`,scope:e,service:`doompi.hub.v1`,member:`computer_use_state`,kind:`channel`,direction:`server-to-client`,description:`Computer use channel payload.`,input:t.Type.Object({state:u,targets:t.Type.Array(s),busy:i(t.Type.Literal(!0))})},{id:`computer.command`,scope:e,service:`doompi.hub.v1`,member:`computer_use_state`,kind:`channel`,direction:`client-to-server`,description:`Computer use browser channel command.`,input:t.Type.Object({action:a([`status`,`targets`,`stop`,`artifacts`])})}])});exports.ComputerActionSchema=f,exports.ComputerStateSchema=u,exports.apiContracts=m,exports.default=m;
2
+ //# sourceMappingURL=apiContracts.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.cjs","names":["Type","jsonApiResponses","defineApiContract"],"sources":["../../src/schemas/apiContracts.ts"],"sourcesContent":["import { defineApiContract, jsonApiResponses, type DoomHttpContract } from '@agimon-ai/doompi-core/api-contracts';\nimport { Type } from 'typebox';\n\nconst S = Type.String();\nconst N = Type.Number();\nconst O = Type.Optional;\nconst values = <T extends string>(items: T[]) => Type.Union(items.map((item) => Type.Literal(item)));\nconst Json = Type.Unknown({\n description:\n 'Desktop provider JSON value. Targets, observations and action results are supplied by the admitted Desktop provider.',\n});\nconst Target = Type.Record(S, Json);\nconst Error = Type.Object({ code: S, message: S });\nconst Artifact = Type.Object({\n artifactId: S,\n status: values(['ready', 'failed']),\n downloadUrl: O(S),\n previewUrl: O(S),\n actionCount: O(N),\n completedAt: O(S),\n failure: O(Error),\n});\nexport const ComputerStateSchema = Type.Object({\n sessionId: S,\n revision: N,\n wake: N,\n phase: values(['inactive', 'awaiting_confirmation', 'activating', 'active', 'stopping', 'failed']),\n requestId: O(S),\n target: O(Target),\n durationMs: O(N),\n expiresAt: O(N),\n failure: O(Error),\n artifact: O(Artifact),\n});\nconst Reference = { snapshotId: Type.String({ minLength: 1 }), elementRef: Type.String({ minLength: 1 }) };\nexport const ComputerActionSchema = Type.Union([\n Type.Object({ kind: values(['press', 'focus']), ...Reference }, { additionalProperties: false }),\n Type.Object({ kind: Type.Literal('set_value'), ...Reference, value: S }, { additionalProperties: false }),\n Type.Object(\n {\n kind: Type.Literal('scroll'),\n ...Reference,\n direction: values(['up', 'down', 'left', 'right']),\n amount: values(['line', 'page']),\n },\n { additionalProperties: false },\n ),\n]);\nconst internal = (\n method: 'GET' | 'POST',\n path: string,\n output: object,\n body?: object,\n status = 200,\n): DoomHttpContract => ({\n id: `computer.${path.slice(1).replaceAll('/', '.')}`,\n scope: 'session',\n basePath: 'computer-use',\n path,\n method,\n authentication: 'owner',\n description: `Computer use broker ${path}. Requires the host-issued ${path.startsWith('/agent/') ? 'agent' : 'hub'} bearer token.`,\n availability: 'Internal broker route; ordinary browser credentials are insufficient.',\n parameters: [{ name: 'Authorization', in: 'header', required: true, schema: Type.String({ pattern: '^Bearer .+' }) }],\n ...(body ? { body: { required: true, contentType: 'application/json', schema: body } } : {}),\n responses: jsonApiResponses(output, status),\n});\nexport const apiContracts = defineApiContract({\n version: 1,\n dynamic: ['Desktop provider target extensions, observations and operation results are runtime-defined JSON.'],\n http: [\n {\n id: 'computer.activate',\n scope: 'session',\n basePath: 'computer-use',\n path: '/activate',\n method: 'POST',\n authentication: 'owner',\n description: 'Request confirmed Desktop access with admitted caller and remote step-up context.',\n body: {\n required: true,\n contentType: 'application/json',\n schema: Type.Object({\n target: Type.Object({ windowId: S, bundleId: S }),\n durationMs: Type.Integer({ minimum: 1000, maximum: 1800000 }),\n }),\n },\n responses: jsonApiResponses(ComputerStateSchema, 202),\n },\n internal('GET', '/agent/state', ComputerStateSchema),\n internal('GET', '/hub/state', ComputerStateSchema),\n internal('POST', '/agent/observe', Json),\n internal('POST', '/agent/action', Json, ComputerActionSchema),\n internal('POST', '/agent/stop', ComputerStateSchema, undefined, 202),\n internal(\n 'GET',\n '/hub/activation',\n Type.Union([\n Type.Null(),\n Type.Object({\n requestId: S,\n target: Target,\n durationSeconds: N,\n createdAt: N,\n confirmationExpiresAt: N,\n caller: Type.Object({ locality: values(['local', 'remote']), stepUp: S }),\n }),\n ]),\n ),\n internal('GET', '/hub/authorization', Type.Union([Type.Null(), Type.Object({ grantId: S, expiresAt: O(N) })])),\n internal(\n 'GET',\n '/hub/next',\n Type.Union([\n Type.Null(),\n Type.Object({ id: S, operation: values(['observe', 'act']), payload: O(Json), grantId: S, sequence: O(N) }),\n ]),\n ),\n internal('POST', '/hub/complete', ComputerStateSchema, Type.Object({ id: S, error: O(S), result: O(Json) })),\n internal(\n 'POST',\n '/hub/stop',\n ComputerStateSchema,\n Type.Object({ error: O(S), host: O(Type.Object({ grantId: S, expiresAt: N })), artifact: O(Artifact) }),\n ),\n ],\n sockets: (['global', 'workspace'] as const).flatMap((scope) => [\n {\n id: 'computer.state',\n scope,\n service: 'doompi.hub.v1',\n member: 'computer_use_state',\n kind: 'channel',\n direction: 'server-to-client',\n description: 'Computer use channel payload.',\n input: Type.Object({ state: ComputerStateSchema, targets: Type.Array(Target), busy: O(Type.Literal(true)) }),\n },\n {\n id: 'computer.command',\n scope,\n service: 'doompi.hub.v1',\n member: 'computer_use_state',\n kind: 'channel',\n direction: 'client-to-server',\n description: 'Computer use browser channel command.',\n input: Type.Object({ action: values(['status', 'targets', 'stop', 'artifacts']) }),\n },\n ]),\n});\nexport default apiContracts;\n"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import "typebox";
2
+ //#region src/schemas/apiContracts.d.ts
3
+ export declare const apiContracts: {
4
+ version: 1;
5
+ protocols?: Record<string, string> | undefined;
6
+ schemas?: Record<string, boolean | object> | undefined;
7
+ http: {
8
+ id: string;
9
+ scope: "global" | "session" | "workspace";
10
+ basePath?: string | undefined;
11
+ path: string;
12
+ method: "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT";
13
+ description: string;
14
+ availability?: string | undefined;
15
+ authentication: "device" | "none" | "owner";
16
+ parameters?: {
17
+ name: string;
18
+ in: "header" | "path" | "query";
19
+ required: boolean;
20
+ schema: boolean | object;
21
+ }[] | undefined;
22
+ body?: {
23
+ contentType: string;
24
+ contentTypes?: string[] | undefined;
25
+ required: boolean;
26
+ schema: boolean | object;
27
+ } | undefined;
28
+ responses: Record<string, {
29
+ description: string;
30
+ contentType?: string | undefined;
31
+ schema?: boolean | object | undefined;
32
+ events?: Record<string, boolean | object> | undefined;
33
+ }>;
34
+ }[];
35
+ sockets: {
36
+ id: string;
37
+ scope: "global" | "session" | "workspace";
38
+ description: string;
39
+ availability?: string | undefined;
40
+ service: string;
41
+ member: string;
42
+ direction: "client-to-server" | "server-to-client";
43
+ kind: "channel" | "method" | "state";
44
+ input: boolean | object;
45
+ output?: boolean | object | undefined;
46
+ errors?: boolean | object | undefined;
47
+ }[];
48
+ dynamic: string[];
49
+ gaps?: string[] | undefined;
50
+ };
51
+ //#endregion
52
+ export { apiContracts as default };
53
+ //# sourceMappingURL=apiContracts.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.d.cts","names":[],"sources":["../../src/schemas/apiContracts.ts"],"mappings":";;qBAmEa"}
@@ -0,0 +1,53 @@
1
+ import { Type } from "typebox";
2
+ //#region src/schemas/apiContracts.d.ts
3
+ export declare const apiContracts: {
4
+ version: 1;
5
+ protocols?: Record<string, string> | undefined;
6
+ schemas?: Record<string, boolean | object> | undefined;
7
+ http: {
8
+ id: string;
9
+ scope: "global" | "session" | "workspace";
10
+ basePath?: string | undefined;
11
+ path: string;
12
+ method: "DELETE" | "GET" | "HEAD" | "OPTIONS" | "PATCH" | "POST" | "PUT";
13
+ description: string;
14
+ availability?: string | undefined;
15
+ authentication: "device" | "none" | "owner";
16
+ parameters?: {
17
+ name: string;
18
+ in: "header" | "path" | "query";
19
+ required: boolean;
20
+ schema: boolean | object;
21
+ }[] | undefined;
22
+ body?: {
23
+ contentType: string;
24
+ contentTypes?: string[] | undefined;
25
+ required: boolean;
26
+ schema: boolean | object;
27
+ } | undefined;
28
+ responses: Record<string, {
29
+ description: string;
30
+ contentType?: string | undefined;
31
+ schema?: boolean | object | undefined;
32
+ events?: Record<string, boolean | object> | undefined;
33
+ }>;
34
+ }[];
35
+ sockets: {
36
+ id: string;
37
+ scope: "global" | "session" | "workspace";
38
+ description: string;
39
+ availability?: string | undefined;
40
+ service: string;
41
+ member: string;
42
+ direction: "client-to-server" | "server-to-client";
43
+ kind: "channel" | "method" | "state";
44
+ input: boolean | object;
45
+ output?: boolean | object | undefined;
46
+ errors?: boolean | object | undefined;
47
+ }[];
48
+ dynamic: string[];
49
+ gaps?: string[] | undefined;
50
+ };
51
+ //#endregion
52
+ export { apiContracts as default };
53
+ //# sourceMappingURL=apiContracts.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiContracts.d.mts","names":[],"sources":["../../src/schemas/apiContracts.ts"],"mappings":";;qBAmEa"}
@@ -0,0 +1,2 @@
1
+ import{defineApiContract as e,jsonApiResponses as t}from"@agimon-ai/doompi-core/api-contracts";import{Type as n}from"typebox";const r=n.String(),i=n.Number(),a=n.Optional,o=e=>n.Union(e.map(e=>n.Literal(e))),s=n.Unknown({description:`Desktop provider JSON value. Targets, observations and action results are supplied by the admitted Desktop provider.`}),c=n.Record(r,s),l=n.Object({code:r,message:r}),u=n.Object({artifactId:r,status:o([`ready`,`failed`]),downloadUrl:a(r),previewUrl:a(r),actionCount:a(i),completedAt:a(r),failure:a(l)}),d=n.Object({sessionId:r,revision:i,wake:i,phase:o([`inactive`,`awaiting_confirmation`,`activating`,`active`,`stopping`,`failed`]),requestId:a(r),target:a(c),durationMs:a(i),expiresAt:a(i),failure:a(l),artifact:a(u)}),f={snapshotId:n.String({minLength:1}),elementRef:n.String({minLength:1})},p=n.Union([n.Object({kind:o([`press`,`focus`]),...f},{additionalProperties:!1}),n.Object({kind:n.Literal(`set_value`),...f,value:r},{additionalProperties:!1}),n.Object({kind:n.Literal(`scroll`),...f,direction:o([`up`,`down`,`left`,`right`]),amount:o([`line`,`page`])},{additionalProperties:!1})]),m=(e,r,i,a,o=200)=>({id:`computer.${r.slice(1).replaceAll(`/`,`.`)}`,scope:`session`,basePath:`computer-use`,path:r,method:e,authentication:`owner`,description:`Computer use broker ${r}. Requires the host-issued ${r.startsWith(`/agent/`)?`agent`:`hub`} bearer token.`,availability:`Internal broker route; ordinary browser credentials are insufficient.`,parameters:[{name:`Authorization`,in:`header`,required:!0,schema:n.String({pattern:`^Bearer .+`})}],...a?{body:{required:!0,contentType:`application/json`,schema:a}}:{},responses:t(i,o)}),h=e({version:1,dynamic:[`Desktop provider target extensions, observations and operation results are runtime-defined JSON.`],http:[{id:`computer.activate`,scope:`session`,basePath:`computer-use`,path:`/activate`,method:`POST`,authentication:`owner`,description:`Request confirmed Desktop access with admitted caller and remote step-up context.`,body:{required:!0,contentType:`application/json`,schema:n.Object({target:n.Object({windowId:r,bundleId:r}),durationMs:n.Integer({minimum:1e3,maximum:18e5})})},responses:t(d,202)},m(`GET`,`/agent/state`,d),m(`GET`,`/hub/state`,d),m(`POST`,`/agent/observe`,s),m(`POST`,`/agent/action`,s,p),m(`POST`,`/agent/stop`,d,void 0,202),m(`GET`,`/hub/activation`,n.Union([n.Null(),n.Object({requestId:r,target:c,durationSeconds:i,createdAt:i,confirmationExpiresAt:i,caller:n.Object({locality:o([`local`,`remote`]),stepUp:r})})])),m(`GET`,`/hub/authorization`,n.Union([n.Null(),n.Object({grantId:r,expiresAt:a(i)})])),m(`GET`,`/hub/next`,n.Union([n.Null(),n.Object({id:r,operation:o([`observe`,`act`]),payload:a(s),grantId:r,sequence:a(i)})])),m(`POST`,`/hub/complete`,d,n.Object({id:r,error:a(r),result:a(s)})),m(`POST`,`/hub/stop`,d,n.Object({error:a(r),host:a(n.Object({grantId:r,expiresAt:i})),artifact:a(u)}))],sockets:[`global`,`workspace`].flatMap(e=>[{id:`computer.state`,scope:e,service:`doompi.hub.v1`,member:`computer_use_state`,kind:`channel`,direction:`server-to-client`,description:`Computer use channel payload.`,input:n.Object({state:d,targets:n.Array(c),busy:a(n.Literal(!0))})},{id:`computer.command`,scope:e,service:`doompi.hub.v1`,member:`computer_use_state`,kind:`channel`,direction:`client-to-server`,description:`Computer use browser channel command.`,input:n.Object({action:o([`status`,`targets`,`stop`,`artifacts`])})}])});export{p as ComputerActionSchema,d as ComputerStateSchema,h as apiContracts,h as default};
2
+ //# sourceMappingURL=apiContracts.mjs.map