@agimon-ai/doompi-computer-use 0.0.1-alpha.49 → 0.0.1-alpha.51

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.
@@ -1 +1 @@
1
- {"version":3,"file":"server.cjs","names":["defineApiRoutes","COMPUTER_USE_ROUTES","apiResponse","record","COMPUTER_USE_WAKE_LIMIT","computerUseChannelType","randomUUID","COMPUTER_USE_CONFIRMATION_WINDOW_MS","routes","path","ComputerScriptRunner","DefaultComputerUseExtensionService","COMPUTER_USE_MODE_ID","COMPUTER_USE_STATUS_KEY","defineMinorMode","modeState","API_BASE_PATH","serverMinorModes","observationOutput","computerScriptOutput","computerScriptFailure","COMMAND_NAME","COMMAND_DESCRIPTION","defineRoot","runtime","computerUseChannelType","API_BASE_PATH","COMPUTER_USE_ROUTES","randomUUID","defineChannel","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineServerPlugin","channelComputerUse","rootSession","composeRootHooks","apiRoute","commandComputerUse","hookBeforeAgentStart","hookSessionShutdown","toolRestrictionComputerUse","tool00ComputerState","tool10ComputerAction","tool20ComputerExec"],"sources":["../../src/services/mcpTools/index.ts","../../src/types/apiRoutes.ts","../../src/services/computerUseApi/index.ts","../../src/services/computerUseServer/index.ts","../../src/extensions/workspaces/sessions/(backend)/_runtime/index.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/services/webComputerUseAvailability/index.ts","../../src/services/webComputerUseChannel/index.ts","../../src/extensions/(backend)/channel/computer-use.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/computer-use/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/computer-use.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool-restriction/computer-use.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/00-computer-state.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/10-computer-action.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/20-computer-exec.server.ts","../../generated/server.ts"],"sourcesContent":["import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { COMPUTER_USE_MODE_ID } from '../../types/computerUseApi';\n\nexport const COMPUTER_USE_MCP_TOOLS_SERVICE = 'doom/computer-use-mcp-tools';\n\nconst MODE_LABEL = 'Computer Use';\n\nexport interface McpToolCatalog {\n get(name: string): DoomHeadlessTool | undefined;\n names(): readonly string[];\n}\n\nexport function mountMcpTools(tools: readonly DoomHeadlessTool[]) {\n return (context: Context): void => {\n context.plugin((providerContext) => {\n providerContext.provide(COMPUTER_USE_MCP_TOOLS_SERVICE, {\n get: (name) => tools.find((tool) => tool.name === name),\n names: () => tools.map((tool) => tool.name),\n } satisfies McpToolCatalog);\n });\n };\n}\n\nexport function bindMcpTool(context: DoomMcpPluginContext, name: string): DoomHeadlessTool | undefined {\n const catalog = context.services.get<McpToolCatalog>(COMPUTER_USE_MCP_TOOLS_SERVICE);\n const tool = catalog?.get(name);\n if (!tool || !catalog) return undefined;\n return {\n ...tool,\n execute(toolCallId, parameters, signal, onUpdate) {\n const activeModes = context.selection.read().state?.['minor-mode'] ?? [];\n if (!activeModes.includes(COMPUTER_USE_MODE_ID)) {\n const inactiveTools = [...catalog.names()].sort().join(', ');\n throw new Error(`${MODE_LABEL} minor mode is inactive. Inactive ${MODE_LABEL} tools: ${inactiveTools}.`);\n }\n const executionSignal = AbortSignal.any([context.signal, signal ?? context.signal]);\n return tool.execute(toolCallId, parameters, executionSignal, onUpdate, context.execution);\n },\n };\n}\n","import { apiResponse, defineApiRoutes } from '@agimon-ai/doompi-core/web';\n\nimport {\n COMPUTER_USE_ROUTES,\n type ComputerUseActivationRequest,\n type ComputerUseBrokerRequest,\n type ComputerUseSessionView,\n} from './computerUseApi';\n\n/**\n * This package's routes, as data.\n *\n * No scope and no base path: the build reads both off\n * `src/extensions/workspaces/sessions/(backend)/api/computer-use/`, so the\n * mount is stated once, by the folder that creates it.\n *\n * The paths come from `COMPUTER_USE_ROUTES` rather than being written out\n * again. That table already addressed the broker from the hub channel and from\n * the broker's own dispatcher, and a second copy here is exactly the\n * disagreement this file exists to prevent. The dispatcher now reads this\n * table, so the page, the broker and the hub all resolve one set of strings.\n *\n * Only `activate` is reachable from a browser. The `/agent/` and `/hub/` routes\n * each demand a host-issued bearer token and answer 404 without one; they are\n * declared here because they are this API's surface, not because a page calls\n * them.\n */\nexport default defineApiRoutes({\n activate: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.activate,\n response: apiResponse<ComputerUseSessionView>(),\n },\n agentState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.agentState,\n response: apiResponse<ComputerUseSessionView>(),\n },\n /** Answers whatever the admitted Desktop provider returned, which is runtime-defined JSON. */\n agentObserve: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentObserve,\n response: apiResponse<unknown>(),\n },\n agentAction: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentAction,\n response: apiResponse<unknown>(),\n },\n agentStop: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentStop,\n response: apiResponse<ComputerUseSessionView>(),\n },\n hubState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubState,\n response: apiResponse<ComputerUseSessionView>(),\n },\n /** Null until a reader has confirmed one; reading it moves the session to `activating`. */\n hubActivation: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubActivation,\n response: apiResponse<ComputerUseActivationRequest | null>(),\n },\n hubAuthorization: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubAuthorization,\n response: apiResponse<{ readonly grantId: string; readonly expiresAt?: number } | null>(),\n },\n hubNext: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubNext,\n response: apiResponse<ComputerUseBrokerRequest | null>(),\n },\n hubComplete: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.hubComplete,\n response: apiResponse<ComputerUseSessionView>(),\n },\n hubStop: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.hubStop,\n response: apiResponse<ComputerUseSessionView>(),\n },\n});\n","import { randomUUID } from 'node:crypto';\n\nimport type { DoomComputerUseSessionAccess, DoomDirectEventBus } from '@agimon-ai/doompi-core/hubChannel';\nimport { type DoomApi, type DoomApiContext, type DoomApiHandler } from '@agimon-ai/doompi-core/packageApi';\n\nimport routes from '../../types/apiRoutes';\nimport type { ComputerUseAction, ComputerUseObservation } from '../../types/computerUse';\nimport {\n API_BASE_PATH,\n computerUseChannelType,\n COMPUTER_USE_CONFIRMATION_WINDOW_MS,\n COMPUTER_USE_MAX_DURATION_MS,\n COMPUTER_USE_WAKE_LIMIT,\n type ComputerUseActivationRequest,\n type ComputerUseArtifactView,\n type ComputerUseBrokerRequest,\n type ComputerUseSessionView,\n} from '../../types/computerUseApi';\nimport type { ComputerUseSessionClient } from '../sessionApiClient';\n\ninterface PendingRequest {\n readonly request: ComputerUseBrokerRequest;\n readonly dispose: () => void;\n resolve(value: unknown): void;\n reject(error: Error): void;\n}\n\nfunction jsonError(message: string, status: number): Response {\n return Response.json({ error: message }, { status });\n}\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\nasync function body(request: Request): Promise<Record<string, unknown>> {\n try {\n return record(await request.json()) ?? {};\n } catch {\n return {};\n }\n}\n\nfunction semanticAction(value: Record<string, unknown>): boolean {\n const base =\n typeof value.snapshotId === 'string' &&\n value.snapshotId.length > 0 &&\n typeof value.elementRef === 'string' &&\n value.elementRef.length > 0;\n if (!base) return false;\n const allowed = (keys: readonly string[]) => Object.keys(value).every((key) => keys.includes(key));\n if (value.kind === 'press' || value.kind === 'focus') return allowed(['kind', 'snapshotId', 'elementRef']);\n if (value.kind === 'set_value')\n return typeof value.value === 'string' && allowed(['kind', 'snapshotId', 'elementRef', 'value']);\n if (value.kind === 'scroll')\n return (\n ['up', 'down', 'left', 'right'].includes(value.direction as string) &&\n (value.amount === 'line' || value.amount === 'page') &&\n allowed(['kind', 'snapshotId', 'elementRef', 'direction', 'amount'])\n );\n return false;\n}\nfunction artifactView(value: unknown): ComputerUseArtifactView | undefined {\n const input = record(value);\n if (typeof input?.artifactId !== 'string' || (input.status !== 'ready' && input.status !== 'failed'))\n return undefined;\n const safeUrl = (candidate: unknown) =>\n typeof candidate === 'string' && candidate.startsWith('/api/') ? candidate : undefined;\n const downloadUrl = safeUrl(input.downloadUrl);\n const previewUrl = safeUrl(input.previewUrl);\n const artifactFailure = record(input.failure);\n const safeFailure =\n typeof artifactFailure?.code === 'string' && typeof artifactFailure.message === 'string'\n ? { code: artifactFailure.code.slice(0, 128), message: artifactFailure.message.slice(0, 512) }\n : undefined;\n return {\n artifactId: input.artifactId,\n status: input.status,\n ...(downloadUrl === undefined ? {} : { downloadUrl }),\n ...(previewUrl === undefined ? {} : { previewUrl }),\n ...(typeof input.actionCount === 'number' ? { actionCount: input.actionCount } : {}),\n ...(typeof input.completedAt === 'string' ? { completedAt: input.completedAt } : {}),\n ...(safeFailure === undefined ? {} : { failure: safeFailure }),\n };\n}\n\nexport interface ComputerUseApiOptions {\n readonly sessionId?: string;\n readonly internalToken?: string;\n readonly hubToken?: string;\n readonly directEvents: DoomDirectEventBus;\n readonly requestTimeoutMs?: number;\n readonly desktop?: DoomComputerUseSessionAccess;\n readonly beforeActivate?: () => Promise<void>;\n}\n\nexport class ComputerUseRequestBroker implements DoomApiHandler {\n private readonly sessionId: string;\n private readonly internalToken?: string;\n private readonly hubToken?: string;\n private readonly directEvents: DoomDirectEventBus;\n private readonly requestTimeoutMs: number;\n private revision = 0;\n private wake = 0;\n private phase: ComputerUseSessionView['phase'] = 'inactive';\n private activation?: ComputerUseActivationRequest;\n private grantId?: string;\n private expiresAt?: number;\n private actionSequence = 0;\n private expiryTimer?: ReturnType<typeof setTimeout>;\n private failure?: ComputerUseSessionView['failure'];\n private artifact?: ComputerUseArtifactView;\n private pending?: PendingRequest;\n private closed = false;\n private readonly desktop?: DoomComputerUseSessionAccess;\n private readonly beforeActivate?: () => Promise<void>;\n private readonly listeners = new Set<(state: ComputerUseSessionView) => void>();\n private readonly unsubscribeDesktop?: () => void;\n\n private static readonly DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\n public constructor(options: ComputerUseApiOptions) {\n this.sessionId = options.sessionId ?? 'unknown';\n this.internalToken = options.internalToken;\n this.hubToken = options.hubToken;\n this.directEvents = options.directEvents;\n this.requestTimeoutMs = options.requestTimeoutMs ?? ComputerUseRequestBroker.DEFAULT_REQUEST_TIMEOUT_MS;\n this.desktop = options.desktop;\n this.beforeActivate = options.beforeActivate;\n this.unsubscribeDesktop = options.desktop?.subscribe(() => {\n clearTimeout(this.expiryTimer);\n if (!options.desktop?.available) {\n this.rejectPending('Desktop disconnected.');\n this.phase = 'failed';\n this.grantId = undefined;\n this.failure = { code: 'desktop_unavailable', message: 'Desktop disconnected.' };\n } else if (this.phase !== 'inactive' && this.phase !== 'failed') {\n this.phase = 'stopping';\n this.rejectPending('Control was stopped by Desktop.');\n }\n this.changed();\n });\n }\n\n public state(): ComputerUseSessionView {\n return Object.freeze({\n sessionId: this.sessionId,\n revision: this.revision,\n wake: this.wake,\n phase: this.phase,\n ...(this.activation === undefined\n ? {}\n : {\n requestId: this.activation.requestId,\n target: this.activation.target,\n durationMs: this.activation.durationSeconds * 1_000,\n }),\n ...(this.expiresAt === undefined ? {} : { expiresAt: this.expiresAt }),\n ...(this.failure === undefined ? {} : { failure: this.failure }),\n ...(this.artifact === undefined ? {} : { artifact: this.artifact }),\n });\n }\n\n /** Tools and the API share this broker. No socket, credential discovery, or second state store. */\n public sessionClient(): ComputerUseSessionClient {\n const result = async <T>(response: Response): Promise<T> => {\n const value = (await response.json()) as T & { error?: string };\n if (!response.ok) throw new Error(value.error ?? `Computer-use request failed (${response.status}).`);\n return value;\n };\n const requireDesktop = (): void => {\n if (this.closed || !this.desktop?.available || this.desktop.enabled === false)\n throw new Error('Desktop computer use is unavailable.');\n };\n return {\n state: async () => this.state(),\n subscribeStatus: (listener) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n },\n observe: async (signal, options = {}) => {\n requireDesktop();\n return result<ComputerUseObservation>(await this.enqueue('observe', options, signal));\n },\n act: async (action: ComputerUseAction, signal) => {\n requireDesktop();\n if (!semanticAction(action as unknown as Record<string, unknown>))\n throw new Error('A valid semantic action is required.');\n return result(await this.enqueue('act', action, signal));\n },\n stop: async (signal) => {\n signal?.throwIfAborted();\n if (this.phase !== 'inactive' && this.phase !== 'failed') {\n this.phase = 'stopping';\n this.rejectPending('Computer use was stopped.');\n this.changed();\n }\n return this.state();\n },\n };\n }\n private changed(): void {\n this.revision += 1;\n this.wake = (this.wake + 1) % COMPUTER_USE_WAKE_LIMIT;\n const state = this.state();\n for (const listener of this.listeners) listener(state);\n this.directEvents.publish(computerUseChannelType, this.sessionId, state);\n }\n\n private authorized(request: Request, token: string | undefined): boolean {\n return token !== undefined && request.headers.get('authorization') === `Bearer ${token}`;\n }\n\n private async requestActivation(request: Request): Promise<Response> {\n if (!this.desktop?.available || !this.desktop.authorize(request.headers)) return jsonError('Not found.', 404);\n if (this.desktop.enabled === false) return jsonError('Enable computer use in global Desktop settings first.', 409);\n // Only the owning native renderer can reach this point. Remote/browser caller stamps cannot grant access.\n const caller = { locality: 'local', stepUp: 'not-required' } as const;\n if (this.phase !== 'inactive' && this.phase !== 'failed') return jsonError('Computer use is already busy.', 409);\n const input = await body(request);\n const target = record(input.target);\n const durationMs = input.durationMs;\n if (target === undefined || typeof target.windowId !== 'string' || typeof target.bundleId !== 'string')\n return jsonError('A Desktop target is required.', 400);\n if (\n typeof durationMs !== 'number' ||\n !Number.isInteger(durationMs) ||\n durationMs < 1_000 ||\n durationMs > COMPUTER_USE_MAX_DURATION_MS\n )\n return jsonError('The requested duration is invalid.', 400);\n this.desktop.claim();\n try {\n await this.beforeActivate?.();\n } catch (error) {\n return jsonError(error instanceof Error ? error.message : String(error), 409);\n }\n if (this.closed || !this.desktop.available || (this.phase !== 'inactive' && this.phase !== 'failed')) {\n return jsonError('Computer use is unavailable or already busy.', 409);\n }\n const createdAt = Date.now();\n this.activation = Object.freeze({\n requestId: randomUUID(),\n target: Object.freeze({ ...target }),\n durationSeconds: durationMs / 1_000,\n createdAt,\n confirmationExpiresAt: createdAt + COMPUTER_USE_CONFIRMATION_WINDOW_MS,\n caller: Object.freeze({ ...caller }),\n });\n this.phase = 'awaiting_confirmation';\n this.failure = undefined;\n this.artifact = undefined;\n this.changed();\n return Response.json(this.state(), { status: 202 });\n }\n\n private rejectPending(message: string): void {\n const pending = this.pending;\n if (pending === undefined) return;\n this.pending = undefined;\n pending.dispose();\n pending.reject(new Error(message));\n }\n\n private stopAfterUncertainRequest(message: string): void {\n if (this.phase === 'active') {\n this.phase = 'stopping';\n this.changed();\n }\n this.rejectPending(message);\n }\n\n private async enqueue(\n operation: ComputerUseBrokerRequest['operation'],\n payload?: unknown,\n signal?: AbortSignal,\n ): Promise<Response> {\n if (this.phase !== 'active' || this.grantId === undefined) return jsonError('Computer use is not active.', 409);\n if (this.pending !== undefined) return jsonError('Another computer-use request is live.', 409);\n if (signal?.aborted === true) return jsonError('The computer-use request was cancelled.', 499);\n const sequence = operation === 'act' ? ++this.actionSequence : undefined;\n const request: ComputerUseBrokerRequest = {\n id: randomUUID(),\n operation,\n grantId: this.grantId,\n ...(sequence === undefined ? {} : { sequence }),\n ...(payload === undefined ? {} : { payload }),\n };\n const completion = new Promise<unknown>((resolve, reject) => {\n const onAbort = () => this.stopAfterUncertainRequest('The computer-use request was cancelled.');\n const timer = setTimeout(\n () => this.stopAfterUncertainRequest('The computer-use request timed out.'),\n this.requestTimeoutMs,\n );\n timer.unref?.();\n signal?.addEventListener('abort', onAbort, { once: true });\n this.pending = {\n request,\n resolve,\n reject,\n dispose: () => {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n },\n };\n });\n this.changed();\n try {\n return Response.json(await completion);\n } catch (error) {\n return jsonError(error instanceof Error ? error.message : String(error), 502);\n }\n }\n\n public async fetch(request: Request): Promise<Response> {\n if (this.closed) return jsonError('Computer-use broker is closed.', 503);\n const path = new URL(request.url).pathname;\n if (request.method === 'POST' && path === routes.activate.path) return this.requestActivation(request);\n const agent = path.startsWith('/agent/');\n const hub = path.startsWith('/hub/');\n if ((agent && !this.authorized(request, this.internalToken)) || (hub && !this.authorized(request, this.hubToken)))\n return jsonError('Not found.', 404);\n\n if (request.method === 'GET' && (path === routes.agentState.path || path === routes.hubState.path))\n return Response.json(this.state());\n if (request.method === 'POST' && path === routes.agentObserve.path)\n return this.enqueue('observe', undefined, request.signal);\n if (request.method === 'POST' && path === routes.agentAction.path) {\n const action = await body(request);\n if (!semanticAction(action)) return jsonError('A valid semantic action is required.', 400);\n return this.enqueue('act', action, request.signal);\n }\n if (request.method === 'POST' && path === routes.agentStop.path) {\n if (this.phase !== 'active') return jsonError('Computer use is not active.', 409);\n this.phase = 'stopping';\n this.rejectPending('The computer-use request was stopped.');\n this.changed();\n return Response.json(this.state(), { status: 202 });\n }\n if (request.method === 'GET' && path === routes.hubActivation.path) {\n if (this.activation === undefined || this.phase !== 'awaiting_confirmation') return Response.json(null);\n this.phase = 'activating';\n this.changed();\n return Response.json(this.activation);\n }\n if (request.method === 'GET' && path === routes.hubAuthorization.path)\n return Response.json(this.grantId === undefined ? null : { grantId: this.grantId, expiresAt: this.expiresAt });\n if (request.method === 'GET' && path === routes.hubNext.path) return Response.json(this.pending?.request ?? null);\n if (request.method === 'POST' && path === routes.hubComplete.path) {\n const input = await body(request);\n const id = typeof input.id === 'string' ? input.id : undefined;\n if (this.pending === undefined || this.pending.request.id !== id) return jsonError('The request is stale.', 409);\n const pending = this.pending;\n this.pending = undefined;\n pending.dispose();\n if (typeof input.error === 'string') {\n this.phase = 'stopping';\n pending.reject(new Error(input.error));\n } else pending.resolve(input.result);\n this.changed();\n return Response.json(this.state());\n }\n if (request.method === 'POST' && path === routes.hubStop.path) {\n const input = await body(request);\n if (this.phase === 'activating') {\n if (typeof input.error === 'string') {\n this.phase = 'failed';\n this.failure = { code: 'desktop_unavailable', message: input.error.slice(0, 512) };\n this.activation = undefined;\n } else {\n const host = record(input.host);\n if (\n typeof host?.grantId !== 'string' ||\n !Number.isFinite(host.expiresAt) ||\n (host.expiresAt as number) <= Date.now()\n )\n return jsonError('Desktop did not issue a complete grant.', 502);\n this.grantId = host.grantId;\n this.expiresAt = host.expiresAt as number;\n this.actionSequence = 0;\n this.phase = 'active';\n clearTimeout(this.expiryTimer);\n this.expiryTimer = setTimeout(\n () => {\n if (this.closed || this.phase !== 'active') return;\n this.phase = 'stopping';\n this.rejectPending('The computer-use grant expired.');\n this.changed();\n },\n Math.max(0, this.expiresAt - Date.now()),\n );\n this.expiryTimer.unref?.();\n }\n } else {\n clearTimeout(this.expiryTimer);\n this.rejectPending('The computer-use session stopped.');\n this.phase = 'inactive';\n this.grantId = undefined;\n this.expiresAt = undefined;\n this.activation = undefined;\n this.artifact = artifactView(input.artifact);\n }\n this.changed();\n return Response.json(this.state());\n }\n return jsonError('Not found.', 404);\n }\n\n public close(): void {\n if (this.closed) return;\n this.closed = true;\n clearTimeout(this.expiryTimer);\n this.unsubscribeDesktop?.();\n this.listeners.clear();\n this.rejectPending('Computer-use broker closed.');\n this.grantId = undefined;\n this.expiresAt = undefined;\n }\n}\n\nexport function createComputerUseApi(options: ComputerUseApiOptions): ComputerUseRequestBroker {\n return new ComputerUseRequestBroker(options);\n}\n\nexport const api: DoomApi = {\n basePath: API_BASE_PATH,\n start(context: DoomApiContext): DoomApiHandler {\n if (context.directEvents === undefined) throw new Error('Computer-use API requires the session direct event bus.');\n return createComputerUseApi({\n ...(context.sessionId === undefined ? {} : { sessionId: context.sessionId }),\n ...(context.internalToken === undefined ? {} : { internalToken: context.internalToken }),\n ...(context.hubToken === undefined ? {} : { hubToken: context.hubToken }),\n directEvents: context.directEvents,\n desktop: context.computerUse,\n });\n },\n};\n","import path from 'node:path';\n\nimport { type DoomHeadlessToolResult } from '@agimon-ai/doompi-core/headless';\nimport type { DoomApiContext } from '@agimon-ai/doompi-core/packageApi';\nimport { serverMinorModes } from '@agimon-ai/doompi-minor-mode';\nimport { defineMinorMode, type MinorModeOwner } from '@agimon-ai/doompi-minor-mode';\n\nimport { COMMAND_NAME, COMMAND_DESCRIPTION } from '../../constants/computerUse';\nimport { modeState } from '../../models/computerUseMode';\nimport { ComputerScriptRunner } from '../../services/computerScriptRunner';\nimport { DefaultComputerUseExtensionService } from '../../services/extensionService';\nimport type { ComputerScriptExecutionOptions } from '../../types/computerScript';\nimport type { ComputerUseAction } from '../../types/computerUse';\nimport { API_BASE_PATH, COMPUTER_USE_MODE_ID, COMPUTER_USE_STATUS_KEY } from '../../types/computerUseApi';\nimport type { ComputerUseSessionView } from '../../types/computerUseApi';\nimport {\n computerObservationOutput as observationOutput,\n computerScriptOutput,\n computerScriptFailure,\n} from '../computerToolOutput';\nimport { createComputerUseApi } from '../computerUseApi';\n\n/** This package's identity for mode, activity and restriction ownership, not a status key. */\nconst SOURCE = '@agimon-ai/doompi-computer-use';\n\nconst SCRIPT_PATHS_ENV = 'DOOMPI_COMPUTER_USE_SCRIPT_PATHS';\nconst GUIDANCE =\n '[COMPUTER USE ACTIVE]\\nUse computer_state before acting and after any action that may change the interface. Use only element refs and snapshot ids returned by computer_state. Never infer coordinates or bypass secure elements.';\n\nfunction output(value: unknown, isError = false): DoomHeadlessToolResult {\n return {\n content: [{ type: 'text', text: typeof value === 'string' ? value : JSON.stringify(value, null, 2) }],\n details: value,\n ...(isError ? { isError: true } : {}),\n };\n}\n\nimport {\n type DoomHeadlessHostService,\n type DoomHeadlessTool,\n type DoomHeadlessCommand,\n} from '@agimon-ai/doompi-core/headless';\nimport { type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nexport function createComputerUseServer(\n host: DoomHeadlessHostService,\n apiContext?: DoomApiContext,\n): Omit<DoomServerSessionPlugin, 'tools' | 'commands'> & {\n tools: readonly DoomHeadlessTool[];\n commands: readonly DoomHeadlessCommand[];\n} {\n if (!apiContext?.computerUse?.available || !apiContext.directEvents) return { tools: [], commands: [] };\n const desktop = apiContext.computerUse;\n const broker = createComputerUseApi({\n sessionId: host.context.sessionId,\n internalToken: apiContext.internalToken,\n hubToken: apiContext.hubToken,\n directEvents: apiContext.directEvents,\n desktop,\n beforeActivate: async () => {\n if (!modeSelected()) throw new Error('Enable computer use before authorizing an application.');\n const activity = await host.context.session.activity();\n if (!activity.isIdle || activity.hasPendingMessages)\n throw new Error('Wait for the agent and its queued prompts to finish before granting computer use.');\n },\n });\n const client = broker.sessionClient();\n const allowedScriptPaths = (host.context.environment[SCRIPT_PATHS_ENV] ?? '')\n .split(path.delimiter)\n .filter((entry) => entry.length > 0);\n const scriptRunner = new ComputerScriptRunner({ client, allowedScriptPaths, scriptRoot: host.context.cwd });\n const service = new DefaultComputerUseExtensionService(client);\n const dependencies = { client, scriptRunner, service };\n let state: ComputerUseSessionView | undefined = broker.state();\n const restrictionListeners = new Set<() => void>();\n let stopActivity: (() => void) | undefined;\n let modeOwner: MinorModeOwner | undefined;\n const modeSelected = (): boolean =>\n (host.context.selection.state?.['minor-mode'] ?? []).includes(COMPUTER_USE_MODE_ID);\n const publishMode = (): void => modeOwner?.publish();\n const applyState = (next: ComputerUseSessionView | undefined): void => {\n state = next;\n host.context.client.setStatus(\n COMPUTER_USE_STATUS_KEY,\n next === undefined || next.phase === 'inactive' ? undefined : `computer use: ${next.phase}`,\n );\n publishMode();\n for (const listener of restrictionListeners) listener();\n };\n const selectMode = async (enabled: boolean): Promise<void> => {\n const modes = (host.context.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== COMPUTER_USE_MODE_ID);\n await host.changeSelection({\n axis: 'state',\n key: 'minor-mode',\n values: enabled ? [...modes, COMPUTER_USE_MODE_ID] : modes,\n });\n publishMode();\n };\n const refresh = async (signal?: AbortSignal): Promise<void> => {\n if (!client) {\n applyState(undefined);\n return;\n }\n try {\n applyState(await client.state(signal));\n } catch {\n applyState(undefined);\n }\n };\n const requireActive = (): NonNullable<typeof client> => {\n if (!desktop.available || desktop.enabled === false || !modeSelected() || state?.phase !== 'active')\n throw new Error('Computer use is not active for this session.');\n return client;\n };\n modeOwner = defineMinorMode<undefined>({\n descriptor: {\n source: SOURCE,\n id: COMPUTER_USE_MODE_ID,\n label: 'Computer Use',\n description: 'Session-scoped semantic control through DoomPi Desktop.',\n order: 450,\n actions: [\n {\n id: 'activate',\n label: 'Activate',\n description: 'Enable computer use for this session.',\n contexts: ['headless'],\n parameters: [],\n },\n {\n id: 'deactivate',\n label: 'Deactivate',\n description: 'Stop this session computer-use run.',\n contexts: ['headless'],\n parameters: [],\n },\n {\n id: 'doctor',\n label: 'Doctor',\n description: 'Report Desktop availability and session state.',\n contexts: ['headless'],\n parameters: [],\n },\n ],\n },\n state: () => {\n const mode = modeState(state, modeSelected());\n return desktop.enabled === false\n ? {\n ...mode,\n condition: 'blocked',\n detail: 'Enable computer use in global Desktop settings.',\n actions: mode.actions.map((action) => ({\n ...action,\n enabled: false,\n disabledReason: 'Enable computer use in global Desktop settings.',\n })),\n }\n : mode;\n },\n async handleAction(_runtime, actionId, _argumentsValue, execution) {\n execution.signal.throwIfAborted();\n if (actionId === 'activate') {\n if (!desktop.available || desktop.enabled === false)\n throw new Error('Enable computer use in global Desktop settings first.');\n await selectMode(true);\n await refresh(execution.signal);\n return { message: 'Computer use is ready to configure in Activity.' };\n }\n if (actionId === 'doctor') {\n await refresh(execution.signal);\n return {\n message: client\n ? `Computer use is ${state?.phase ?? 'unavailable'}.`\n : 'DoomPi Desktop session API is unavailable.',\n };\n }\n if (actionId === 'deactivate') {\n if (client && state?.phase !== undefined && state.phase !== 'inactive' && state.phase !== 'failed')\n await client.stop(execution.signal);\n await selectMode(false);\n await refresh(execution.signal);\n return { message: 'Computer use deactivated.' };\n }\n throw new Error(`Unknown computer-use action: ${actionId}`);\n },\n }).createOwner(undefined);\n const unsubscribeState = client.subscribeStatus?.(applyState);\n return {\n api: [{ basePath: API_BASE_PATH, start: () => broker }],\n services: [\n (context) => {\n const fiber = context.plugin(serverMinorModes([modeOwner!]));\n context.effect(() =>\n desktop.subscribe(() => {\n if (!desktop.available) void fiber.dispose();\n }),\n );\n },\n ],\n toolRestrictions: [\n {\n source: SOURCE,\n restrict: () => ({\n excludedTools:\n desktop.available && desktop.enabled !== false && modeSelected() && state?.phase === 'active'\n ? []\n : ['computer_state', 'computer_action', 'computer_exec'],\n }),\n subscribe: (listener) => {\n restrictionListeners.add(listener);\n return () => {\n restrictionListeners.delete(listener);\n };\n },\n },\n ],\n activities: [\n {\n when: {\n state: { 'minor-mode': COMPUTER_USE_MODE_ID },\n attribution: { kind: 'minor', mode: COMPUTER_USE_MODE_ID },\n },\n name: SOURCE,\n async start() {\n await refresh();\n stopActivity = () => {\n void client.stop();\n };\n return () => {\n stopActivity?.();\n stopActivity = undefined;\n };\n },\n },\n ],\n tools: [\n {\n when: {\n state: { 'minor-mode': COMPUTER_USE_MODE_ID },\n attribution: { kind: 'minor', mode: COMPUTER_USE_MODE_ID },\n },\n name: 'computer_state',\n label: 'Computer State',\n description: 'Observe the authorized application window and return semantic accessibility state.',\n parameters: {\n type: 'object',\n properties: { includeScreenshot: { type: 'boolean' } },\n additionalProperties: false,\n },\n executionMode: 'serial',\n async execute(_toolCallId, _parameters, signal) {\n try {\n const session = requireActive();\n const observation = await session.observe(signal, {\n includeScreenshot: (_parameters as { includeScreenshot?: boolean }).includeScreenshot !== false,\n });\n return observationOutput(observation);\n } catch (error) {\n return output(error instanceof Error ? error.message : String(error), true);\n }\n },\n },\n {\n when: {\n state: { 'minor-mode': COMPUTER_USE_MODE_ID },\n attribution: { kind: 'minor', mode: COMPUTER_USE_MODE_ID },\n },\n name: 'computer_action',\n label: 'Computer Action',\n description: 'Perform one constrained semantic action in the authorized application window.',\n parameters: {\n type: 'object',\n properties: {\n kind: { type: 'string', enum: ['press', 'focus', 'set_value', 'scroll'] },\n snapshotId: { type: 'string', minLength: 1 },\n elementRef: { type: 'string', minLength: 1 },\n value: { type: 'string' },\n direction: { type: 'string', enum: ['up', 'down', 'left', 'right'] },\n amount: { type: 'string', enum: ['line', 'page'] },\n },\n required: ['kind', 'snapshotId', 'elementRef'],\n additionalProperties: false,\n },\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal) {\n try {\n const result = await requireActive().act(parameters as unknown as ComputerUseAction, signal);\n await refresh(signal);\n return output(result);\n } catch (error) {\n return output(error instanceof Error ? error.message : String(error), true);\n }\n },\n },\n {\n when: {\n state: { 'minor-mode': COMPUTER_USE_MODE_ID },\n attribution: { kind: 'minor', mode: COMPUTER_USE_MODE_ID },\n },\n name: 'computer_exec',\n label: 'Computer Script',\n description:\n 'Run a reusable function with only the authorized program API. Relative helpers are supported. Full Node requires trusted:true and an explicitly allowlisted path.',\n parameters: {\n type: 'object',\n properties: {\n scriptPath: { type: 'string', minLength: 1 },\n input: {},\n trusted: { type: 'boolean' },\n includeScreenshot: { type: 'boolean' },\n },\n required: ['scriptPath', 'input'],\n additionalProperties: false,\n },\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal) {\n try {\n requireActive();\n if (!dependencies.scriptRunner) throw new Error('Computer script execution is unavailable.');\n const input = parameters as { scriptPath: string; input: unknown } & ComputerScriptExecutionOptions;\n return computerScriptOutput(\n await dependencies.scriptRunner.execute(input.scriptPath, input.input, signal, input),\n );\n } catch (error) {\n return computerScriptFailure(error);\n }\n },\n },\n ],\n commands: [\n {\n name: COMMAND_NAME,\n description: COMMAND_DESCRIPTION,\n async execute(args, execution) {\n const result = await dependencies.service.execute();\n await execution.client.notify({ body: result.message, level: result.level });\n if (args.trim() === 'deactivate' && client && state?.phase !== 'inactive' && state?.phase !== 'failed') {\n await client.stop();\n await host.changeSelection({\n axis: 'state',\n key: 'minor-mode',\n values: (execution.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== COMPUTER_USE_MODE_ID),\n });\n await refresh();\n }\n },\n },\n ],\n hooks: [\n {\n when: {\n state: { 'minor-mode': COMPUTER_USE_MODE_ID },\n attribution: { kind: 'minor', mode: COMPUTER_USE_MODE_ID },\n },\n event: 'before_agent_start',\n handle(event) {\n if (state?.phase !== 'active') return undefined;\n const prompt = typeof event.systemPrompt === 'string' ? event.systemPrompt : '';\n return { systemPrompt: `${prompt}\\n\\n${GUIDANCE}`.trim() };\n },\n },\n {\n when: {\n state: { 'minor-mode': COMPUTER_USE_MODE_ID },\n attribution: { kind: 'minor', mode: COMPUTER_USE_MODE_ID },\n },\n event: 'session_shutdown',\n handle: async () => {\n stopActivity?.();\n if (client && state?.phase !== 'inactive' && state?.phase !== 'failed') await client.stop();\n },\n },\n ],\n onDispose() {\n stopActivity?.();\n stopActivity = undefined;\n unsubscribeState?.();\n broker.close();\n restrictionListeners.clear();\n host.context.client.setStatus(COMPUTER_USE_STATUS_KEY, undefined);\n },\n };\n}\n","import type { DoomServerPluginDefinition } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createComputerUseServer } from '../../../../../services/computerUseServer';\n\nexport default (({ agent, host }) =>\n agent ? createComputerUseServer(agent, host.context) : { tools: [], commands: [] }) satisfies NonNullable<\n DoomServerPluginDefinition['session']\n>;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { mountMcpTools } from '../../../../services/mcpTools';\nimport runtime from './_runtime/index.server';\n\nexport default defineRoot((context: Parameters<typeof runtime>[0]) => {\n const value = runtime(context);\n return {\n value,\n services: [...(value.services ?? []), ...(value.tools?.length ? [mountMcpTools(value.tools)] : [])],\n activities: value.activities,\n onStop: value.onStop,\n onDispose: value.onDispose,\n };\n});\n","import { API_BASE_PATH } from '../../types/computerUseApi';\n\nexport class MissingComputerUseApiError extends Error {}\n\nexport function computerUseSessionApiError(status: number, value: unknown): Error {\n const error =\n typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>).error\n : undefined;\n const message = typeof error === 'string' ? error : `HTTP ${String(status)}`;\n return status === 404 && message === `No API '${API_BASE_PATH}' in this session.`\n ? new MissingComputerUseApiError(message)\n : new Error(message);\n}\n\nexport function missingComputerUseApiRetryAt(now: number): number {\n return now + 5_000;\n}\n","import { randomUUID } from 'node:crypto';\n\nimport type { DoomHubChannelSource, DoomHubSessionScope, DoomHubChannel } from '@agimon-ai/doompi-core/hubChannel';\n\nimport { computerUseSessionApiError, MissingComputerUseApiError } from '../../services/webComputerUseAvailability';\nimport {\n API_BASE_PATH,\n computerUseChannelType,\n COMPUTER_USE_ROUTES,\n type ComputerUseActivationRequest,\n type ComputerUseBrokerRequest,\n type ComputerUseBrowserCommand,\n type ComputerUseChannelPayload,\n type ComputerUseSessionView,\n} from '../../types/computerUseApi';\nexport { computerUseChannelType };\n\n/** Computer use runs on the DoomPi Desktop host, so every other client declines it. */\nconst DESKTOP_UNAVAILABLE = 'DoomPi Desktop computer use is unavailable.';\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction command(value: unknown): ComputerUseBrowserCommand | undefined {\n const input = record(value);\n return input?.action === 'status' ||\n input?.action === 'targets' ||\n input?.action === 'stop' ||\n input?.action === 'artifacts'\n ? { action: input.action }\n : undefined;\n}\n\nasync function responseJson(response: Response): Promise<unknown> {\n const value = await response.json();\n if (!response.ok) throw computerUseSessionApiError(response.status, value);\n return value;\n}\n\nfunction sessionState(value: unknown): ComputerUseSessionView | undefined {\n const input = record(value);\n if (\n typeof input?.sessionId !== 'string' ||\n typeof input.revision !== 'number' ||\n typeof input.wake !== 'number' ||\n !['inactive', 'awaiting_confirmation', 'activating', 'active', 'stopping', 'failed'].includes(input.phase as string)\n )\n return undefined;\n return input as unknown as ComputerUseSessionView;\n}\n\nexport function createComputerUseChannel(): DoomHubChannel {\n let receiveCommand: ((scope: DoomHubSessionScope, payload: unknown) => void) | undefined;\n return {\n frameType: computerUseChannelType,\n lifecycle: 'hub',\n start(host) {\n const scopes = new Map<string, DoomHubSessionScope>();\n const latest = new Map<string, ComputerUseChannelPayload>();\n const targets = new Map<string, readonly Record<string, unknown>[]>();\n const grants = new Map<string, string>();\n const subscriptions = new Map<string, () => void>();\n const processing = new Set<string>();\n const rerun = new Map<string, ComputerUseSessionView | undefined>();\n const requests = new Map<string, AbortController>();\n let activeSessionId: string | undefined;\n let closed = false;\n\n const sessionRequest = async (scope: DoomHubSessionScope, path: string, method = 'GET', value?: unknown) =>\n host.requestSessionApi(scope, {\n basePath: API_BASE_PATH,\n path,\n method,\n ...(value === undefined ? {} : { body: JSON.stringify(value) }),\n });\n\n const publish = (scope: DoomHubSessionScope, state: ComputerUseSessionView): void => {\n if (state.phase === 'active' || state.phase === 'activating' || state.phase === 'stopping') {\n activeSessionId = scope.sessionId;\n } else if (activeSessionId === scope.sessionId) {\n activeSessionId = undefined;\n grants.delete(scope.sessionId);\n }\n const payload: ComputerUseChannelPayload = {\n state,\n targets: targets.get(scope.sessionId) ?? [],\n ...(activeSessionId !== undefined && activeSessionId !== scope.sessionId ? { busy: true } : {}),\n };\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, payload);\n };\n\n const refresh = async (scope: DoomHubSessionScope): Promise<ComputerUseSessionView> => {\n const state = sessionState(await responseJson(await sessionRequest(scope, COMPUTER_USE_ROUTES.hubState)));\n if (state === undefined) throw new Error('Computer-use API returned an invalid session state.');\n publish(scope, state);\n return state;\n };\n\n const completePending = async (scope: DoomHubSessionScope, pending: ComputerUseBrokerRequest): Promise<void> => {\n if (!host.computerUse?.available) throw new Error(DESKTOP_UNAVAILABLE);\n const controller = new AbortController();\n requests.set(scope.sessionId, controller);\n try {\n const result = await host.computerUse.request(scope, {\n operation: pending.operation,\n signal: controller.signal,\n payload:\n pending.operation === 'act'\n ? { grantId: pending.grantId, sequence: pending.sequence, action: pending.payload }\n : { grantId: pending.grantId, includeScreenshot: record(pending.payload)?.includeScreenshot !== false },\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 } finally {\n if (requests.get(scope.sessionId) === controller) requests.delete(scope.sessionId);\n }\n };\n\n const stopSession = async (scope: DoomHubSessionScope): Promise<void> => {\n requests.get(scope.sessionId)?.abort();\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 || !scopes.has(scope.sessionId)) return;\n if (processing.has(scope.sessionId)) {\n rerun.set(scope.sessionId, announced);\n return;\n }\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 = false;\n }\n }\n if (expired || !owned) {\n await stopSession(scope);\n await refresh(scope);\n return;\n }\n }\n if (\n state.phase === 'awaiting_confirmation' &&\n (activeSessionId === undefined || activeSessionId === scope.sessionId)\n ) {\n const activation = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubActivation),\n )) as ComputerUseActivationRequest | null;\n if (activation !== null && !host.computerUse?.available) {\n // No desktop host: decline through the API's own failure path so the browser\n // shows why, instead of leaving the request pending or raising a server error.\n await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubStop, 'POST', { error: DESKTOP_UNAVAILABLE }),\n );\n await refresh(scope);\n return;\n }\n if (activation !== null && host.computerUse?.available) {\n activeSessionId = scope.sessionId;\n const controller = new AbortController();\n requests.set(scope.sessionId, controller);\n try {\n const hostResult = await host.computerUse.request(scope, {\n operation: 'activate',\n payload: activation,\n signal: controller.signal,\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 } finally {\n if (requests.get(scope.sessionId) === controller) requests.delete(scope.sessionId);\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 if (!closed && scopes.has(scope.sessionId) && rerun.has(scope.sessionId)) {\n const next = rerun.get(scope.sessionId);\n rerun.delete(scope.sessionId);\n queueMicrotask(() => {\n void processScope(scope, next);\n });\n }\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 if (state.phase === 'stopping' || state.phase === 'failed' || state.phase === 'inactive')\n requests.get(scope.sessionId)?.abort();\n publish(scope, state);\n void processScope(scope, state);\n };\n\n receiveCommand = (scope, payload) => {\n const parsed = command(payload);\n if (parsed === undefined) return;\n void (async () => {\n try {\n if (parsed.action === 'targets') {\n // Without a desktop host there is nothing to capture, so the browser sees an\n // empty target list rather than an error it cannot act on.\n const result = host.computerUse?.available\n ? await host.computerUse.request(scope, { operation: 'targets' })\n : [];\n targets.set(\n scope.sessionId,\n Array.isArray(result)\n ? result.filter((item): item is Record<string, unknown> => record(item) !== undefined)\n : [],\n );\n } else if (parsed.action === 'stop') {\n await stopSession(scope);\n }\n await refresh(scope);\n void processScope(scope);\n } catch (error) {\n if (error instanceof MissingComputerUseApiError) {\n latest.delete(scope.sessionId);\n } else {\n host.onNotice(\n `computer-use command failed for ${scope.sessionId} (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n }\n })();\n };\n\n const source: DoomHubChannelSource = {\n payloadFor: (scope) => latest.get(scope.sessionId),\n sessionAdded(scope) {\n scopes.set(scope.sessionId, scope);\n const unsubscribe = host.directEvents.subscribe(\n computerUseChannelType,\n scope.sessionId,\n (payload) => onState(scope, payload),\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n void processScope(scope);\n },\n sessionRemoved(sessionId) {\n requests.get(sessionId)?.abort();\n requests.delete(sessionId);\n rerun.delete(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 controller of requests.values()) controller.abort();\n requests.clear();\n rerun.clear();\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, connection) {\n if (connection.desktopAuthorized !== true) return;\n receiveCommand?.(scope, payload);\n },\n };\n}\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createComputerUseChannel } from '../../../services/webComputerUseChannel';\n\nexport default defineChannel(createComputerUseChannel);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.api?.find((api) => api.basePath === 'computer-use'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.commands.find((command) => command.name === 'computer-use'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.hooks?.find((hook) => hook.event === 'before_agent_start'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.hooks?.find((hook) => hook.event === 'session_shutdown'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution((context: Context) => context.root.toolRestrictions?.[0], {\n cardinality: 'optional',\n});\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.tools.find((tool) => tool.name === 'computer_state'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.tools.find((tool) => tool.name === 'computer_action'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.tools.find((tool) => tool.name === 'computer_exec'),\n { cardinality: 'optional' },\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport channelComputerUse from '../src/extensions/(backend)/channel/computer-use.server';\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/computer-use/route.server';\nimport commandComputerUse from '../src/extensions/workspaces/sessions/(backend)/command/computer-use.server';\nimport hookBeforeAgentStart from '../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server';\nimport toolRestrictionComputerUse from '../src/extensions/workspaces/sessions/(backend)/tool-restriction/computer-use.server';\nimport tool00ComputerState from '../src/extensions/workspaces/sessions/(backend)/tool/00-computer-state.server';\nimport tool10ComputerAction from '../src/extensions/workspaces/sessions/(backend)/tool/10-computer-action.server';\nimport tool20ComputerExec from '../src/extensions/workspaces/sessions/(backend)/tool/20-computer-exec.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-computer-use',\n global: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'computer_use' }, channelComputerUse())]; },\n }),\n workspace: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'computer_use' }, channelComputerUse())]; },\n }),\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): DoomServerSessionPlugin['api'] { return defined([at(apiRoute, contextSession)]); },\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'computer_use' }, channelComputerUse())]; },\n get commands(): DoomServerSessionPlugin['commands'] { return defined([via({ name: 'computer-use' }, at(commandComputerUse, contextSession))]); },\n get hooks(): DoomServerSessionPlugin['hooks'] { return defined([via({ event: 'before_agent_start' }, at(hookBeforeAgentStart, contextSession)), via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession))]); },\n get toolRestrictions(): DoomServerSessionPlugin['toolRestrictions'] { return defined([at(toolRestrictionComputerUse, contextSession)]); },\n get tools(): DoomServerSessionPlugin['tools'] { return defined([via({ name: '00_computer_state' }, at(tool00ComputerState, contextSession)), via({ name: '10_computer_action' }, at(tool10ComputerAction, contextSession)), via({ name: '20_computer_exec' }, at(tool20ComputerExec, contextSession))]); },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.cjs","names":["defineApiRoutes","COMPUTER_USE_ROUTES","apiResponse","record","COMPUTER_USE_WAKE_LIMIT","computerUseChannelType","doomApiCallerFrom","randomUUID","COMPUTER_USE_CONFIRMATION_WINDOW_MS","routes","path","ComputerScriptRunner","DefaultComputerUseExtensionService","COMPUTER_USE_MODE_ID","COMPUTER_USE_STATUS_KEY","defineMinorMode","modeState","API_BASE_PATH","serverMinorModes","observationOutput","computerScriptOutput","computerScriptFailure","COMMAND_NAME","COMMAND_DESCRIPTION","defineRoot","runtime","computerUseChannelType","API_BASE_PATH","COMPUTER_USE_ROUTES","randomUUID","defineChannel","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineRoutedContribution","defineServerPlugin","channelComputerUse","rootSession","composeRootHooks","apiRoute","commandComputerUse","hookBeforeAgentStart","hookSessionShutdown","toolRestrictionComputerUse","tool00ComputerState","tool10ComputerAction","tool20ComputerExec"],"sources":["../../src/services/mcpTools/index.ts","../../src/types/apiRoutes.ts","../../src/services/computerUseApi/index.ts","../../src/services/computerUseServer/index.ts","../../src/extensions/workspaces/sessions/(backend)/_runtime/index.server.ts","../../src/extensions/workspaces/sessions/(backend)/root.server.ts","../../src/services/webComputerUseAvailability/index.ts","../../src/services/webComputerUseChannel/index.ts","../../src/extensions/(backend)/channel/computer-use.server.ts","../../src/extensions/workspaces/sessions/(backend)/api/computer-use/route.server.ts","../../src/extensions/workspaces/sessions/(backend)/command/computer-use.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server.ts","../../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool-restriction/computer-use.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/00-computer-state.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/10-computer-action.server.ts","../../src/extensions/workspaces/sessions/(backend)/tool/20-computer-exec.server.ts","../../generated/server.ts"],"sourcesContent":["import type { DoomHeadlessTool } from '@agimon-ai/doompi-core/headless';\nimport type { DoomMcpPluginContext } from '@agimon-ai/doompi-core/mcpFacet';\nimport type { Context } from '@deepseek-ai/cordis';\n\nimport { COMPUTER_USE_MODE_ID } from '../../types/computerUseApi';\n\nexport const COMPUTER_USE_MCP_TOOLS_SERVICE = 'doom/computer-use-mcp-tools';\n\nconst MODE_LABEL = 'Computer Use';\n\nexport interface McpToolCatalog {\n get(name: string): DoomHeadlessTool | undefined;\n names(): readonly string[];\n}\n\nexport function mountMcpTools(tools: readonly DoomHeadlessTool[]) {\n return (context: Context): void => {\n context.plugin((providerContext) => {\n providerContext.provide(COMPUTER_USE_MCP_TOOLS_SERVICE, {\n get: (name) => tools.find((tool) => tool.name === name),\n names: () => tools.map((tool) => tool.name),\n } satisfies McpToolCatalog);\n });\n };\n}\n\nexport function bindMcpTool(context: DoomMcpPluginContext, name: string): DoomHeadlessTool | undefined {\n const catalog = context.services.get<McpToolCatalog>(COMPUTER_USE_MCP_TOOLS_SERVICE);\n const tool = catalog?.get(name);\n if (!tool || !catalog) return undefined;\n return {\n ...tool,\n execute(toolCallId, parameters, signal, onUpdate) {\n const activeModes = context.selection.read().state?.['minor-mode'] ?? [];\n if (!activeModes.includes(COMPUTER_USE_MODE_ID)) {\n const inactiveTools = [...catalog.names()].sort().join(', ');\n throw new Error(`${MODE_LABEL} minor mode is inactive. Inactive ${MODE_LABEL} tools: ${inactiveTools}.`);\n }\n const executionSignal = AbortSignal.any([context.signal, signal ?? context.signal]);\n return tool.execute(toolCallId, parameters, executionSignal, onUpdate, context.execution);\n },\n };\n}\n","import { apiResponse, defineApiRoutes } from '@agimon-ai/doompi-core/web';\n\nimport {\n COMPUTER_USE_ROUTES,\n type ComputerUseActivationRequest,\n type ComputerUseBrokerRequest,\n type ComputerUseSessionView,\n} from './computerUseApi';\n\n/**\n * This package's routes, as data.\n *\n * No scope and no base path: the build reads both off\n * `src/extensions/workspaces/sessions/(backend)/api/computer-use/`, so the\n * mount is stated once, by the folder that creates it.\n *\n * The paths come from `COMPUTER_USE_ROUTES` rather than being written out\n * again. That table already addressed the broker from the hub channel and from\n * the broker's own dispatcher, and a second copy here is exactly the\n * disagreement this file exists to prevent. The dispatcher now reads this\n * table, so the page, the broker and the hub all resolve one set of strings.\n *\n * Activation, status, cancellation and recording reads are reachable from a browser. The `/agent/` and `/hub/` routes\n * each demand a host-issued bearer token and answer 404 without one; they are\n * declared here because they are this API's surface, not because a page calls\n * them.\n */\nexport default defineApiRoutes({\n artifact: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.artifact,\n query: ['artifactId', 'offset'],\n raw: true,\n },\n activationState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.activate,\n response: apiResponse<ComputerUseSessionView>(),\n },\n cancelActivation: {\n method: 'DELETE',\n path: COMPUTER_USE_ROUTES.activate,\n response: apiResponse<ComputerUseSessionView>(),\n },\n activate: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.activate,\n response: apiResponse<ComputerUseSessionView>(),\n },\n agentState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.agentState,\n response: apiResponse<ComputerUseSessionView>(),\n },\n /** Answers whatever the admitted Desktop provider returned, which is runtime-defined JSON. */\n agentObserve: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentObserve,\n response: apiResponse<unknown>(),\n },\n agentAction: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentAction,\n response: apiResponse<unknown>(),\n },\n agentStop: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentStop,\n response: apiResponse<ComputerUseSessionView>(),\n },\n hubState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubState,\n response: apiResponse<ComputerUseSessionView>(),\n },\n /** Null until a reader has confirmed one; reading it moves the session to `activating`. */\n hubActivation: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubActivation,\n response: apiResponse<ComputerUseActivationRequest | null>(),\n },\n hubAuthorization: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubAuthorization,\n response: apiResponse<{ readonly grantId: string; readonly expiresAt?: number } | null>(),\n },\n hubNext: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubNext,\n response: apiResponse<ComputerUseBrokerRequest | null>(),\n },\n hubComplete: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.hubComplete,\n response: apiResponse<ComputerUseSessionView>(),\n },\n hubStop: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.hubStop,\n response: apiResponse<ComputerUseSessionView>(),\n },\n});\n","import { randomUUID } from 'node:crypto';\n\nimport type { DoomComputerUseSessionAccess, DoomDirectEventBus } from '@agimon-ai/doompi-core/hubChannel';\nimport {\n doomApiCallerFrom,\n type DoomApi,\n type DoomApiContext,\n type DoomApiHandler,\n} from '@agimon-ai/doompi-core/packageApi';\n\nimport routes from '../../types/apiRoutes';\nimport type { ComputerUseAction, ComputerUseObservation } from '../../types/computerUse';\nimport {\n API_BASE_PATH,\n computerUseChannelType,\n COMPUTER_USE_CONFIRMATION_WINDOW_MS,\n COMPUTER_USE_MAX_DURATION_MS,\n COMPUTER_USE_WAKE_LIMIT,\n type ComputerUseActivationRequest,\n type ComputerUseArtifactView,\n type ComputerUseBrokerRequest,\n type ComputerUseSessionView,\n} from '../../types/computerUseApi';\nimport type { ComputerUseSessionClient } from '../sessionApiClient';\n\ninterface PendingRequest {\n readonly request: ComputerUseBrokerRequest;\n readonly dispose: () => void;\n resolve(value: unknown): void;\n reject(error: Error): void;\n}\n\nfunction jsonError(message: string, status: number): Response {\n return Response.json({ error: message }, { status });\n}\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\nasync function body(request: Request): Promise<Record<string, unknown>> {\n try {\n return record(await request.json()) ?? {};\n } catch {\n return {};\n }\n}\n\nfunction semanticAction(value: Record<string, unknown>): boolean {\n const base =\n typeof value.snapshotId === 'string' &&\n value.snapshotId.length > 0 &&\n typeof value.elementRef === 'string' &&\n value.elementRef.length > 0;\n if (!base) return false;\n const allowed = (keys: readonly string[]) => Object.keys(value).every((key) => keys.includes(key));\n if (value.kind === 'press' || value.kind === 'focus') return allowed(['kind', 'snapshotId', 'elementRef']);\n if (value.kind === 'set_value')\n return typeof value.value === 'string' && allowed(['kind', 'snapshotId', 'elementRef', 'value']);\n if (value.kind === 'scroll')\n return (\n ['up', 'down', 'left', 'right'].includes(value.direction as string) &&\n (value.amount === 'line' || value.amount === 'page') &&\n allowed(['kind', 'snapshotId', 'elementRef', 'direction', 'amount'])\n );\n return false;\n}\nfunction artifactView(value: unknown): ComputerUseArtifactView | undefined {\n const input = record(value);\n if (typeof input?.artifactId !== 'string' || (input.status !== 'ready' && input.status !== 'failed'))\n return undefined;\n const safeUrl = (candidate: unknown) =>\n typeof candidate === 'string' && candidate.startsWith('/api/') ? candidate : undefined;\n const downloadUrl = safeUrl(input.downloadUrl);\n const previewUrl = safeUrl(input.previewUrl);\n const artifactFailure = record(input.failure);\n const safeFailure =\n typeof artifactFailure?.code === 'string' && typeof artifactFailure.message === 'string'\n ? { code: artifactFailure.code.slice(0, 128), message: artifactFailure.message.slice(0, 512) }\n : undefined;\n return {\n artifactId: input.artifactId,\n status: input.status,\n ...(typeof input.sizeBytes === 'number' && Number.isSafeInteger(input.sizeBytes) && input.sizeBytes > 0\n ? { sizeBytes: input.sizeBytes }\n : {}),\n ...(downloadUrl === undefined ? {} : { downloadUrl }),\n ...(previewUrl === undefined ? {} : { previewUrl }),\n ...(typeof input.actionCount === 'number' ? { actionCount: input.actionCount } : {}),\n ...(typeof input.completedAt === 'string' ? { completedAt: input.completedAt } : {}),\n ...(safeFailure === undefined ? {} : { failure: safeFailure }),\n };\n}\n\nexport interface ComputerUseApiOptions {\n readonly sessionId?: string;\n readonly internalToken?: string;\n readonly hubToken?: string;\n readonly directEvents: DoomDirectEventBus;\n readonly requestTimeoutMs?: number;\n readonly desktop?: DoomComputerUseSessionAccess;\n readonly beforeActivate?: () => Promise<void>;\n}\n\nexport class ComputerUseRequestBroker implements DoomApiHandler {\n private readonly sessionId: string;\n private readonly internalToken?: string;\n private readonly hubToken?: string;\n private readonly directEvents: DoomDirectEventBus;\n private readonly requestTimeoutMs: number;\n private revision = 0;\n private wake = 0;\n private phase: ComputerUseSessionView['phase'] = 'inactive';\n private activation?: ComputerUseActivationRequest;\n private grantId?: string;\n private expiresAt?: number;\n private actionSequence = 0;\n private expiryTimer?: ReturnType<typeof setTimeout>;\n private failure?: ComputerUseSessionView['failure'];\n private artifact?: ComputerUseArtifactView;\n private pending?: PendingRequest;\n private closed = false;\n private readonly desktop?: DoomComputerUseSessionAccess;\n private readonly beforeActivate?: () => Promise<void>;\n private readonly listeners = new Set<(state: ComputerUseSessionView) => void>();\n private readonly unsubscribeDesktop?: () => void;\n\n private static readonly DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\n public constructor(options: ComputerUseApiOptions) {\n this.sessionId = options.sessionId ?? 'unknown';\n this.internalToken = options.internalToken;\n this.hubToken = options.hubToken;\n this.directEvents = options.directEvents;\n this.requestTimeoutMs = options.requestTimeoutMs ?? ComputerUseRequestBroker.DEFAULT_REQUEST_TIMEOUT_MS;\n this.desktop = options.desktop;\n this.beforeActivate = options.beforeActivate;\n this.unsubscribeDesktop = options.desktop?.subscribe(() => {\n clearTimeout(this.expiryTimer);\n if (!options.desktop?.available) {\n this.rejectPending('Desktop disconnected.');\n this.phase = 'failed';\n this.grantId = undefined;\n this.failure = { code: 'desktop_unavailable', message: 'Desktop disconnected.' };\n } else if (this.phase !== 'inactive' && this.phase !== 'failed') {\n this.phase = 'stopping';\n this.rejectPending('Control was stopped by Desktop.');\n }\n this.changed();\n });\n }\n\n public state(): ComputerUseSessionView {\n return Object.freeze({\n sessionId: this.sessionId,\n revision: this.revision,\n wake: this.wake,\n phase: this.phase,\n ...(this.activation === undefined\n ? {}\n : {\n requestId: this.activation.requestId,\n target: this.activation.target,\n durationMs: this.activation.durationSeconds * 1_000,\n }),\n ...(this.expiresAt === undefined ? {} : { expiresAt: this.expiresAt }),\n ...(this.failure === undefined ? {} : { failure: this.failure }),\n ...(this.artifact === undefined ? {} : { artifact: this.artifact }),\n });\n }\n\n /** Tools and the API share this broker. No socket, credential discovery, or second state store. */\n public sessionClient(): ComputerUseSessionClient {\n const result = async <T>(response: Response): Promise<T> => {\n const value = (await response.json()) as T & { error?: string };\n if (!response.ok) throw new Error(value.error ?? `Computer-use request failed (${response.status}).`);\n return value;\n };\n const requireDesktop = (): void => {\n if (this.closed || !this.desktop?.available || this.desktop.enabled === false)\n throw new Error('Desktop computer use is unavailable.');\n };\n return {\n state: async () => this.state(),\n subscribeStatus: (listener) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n },\n observe: async (signal, options = {}) => {\n requireDesktop();\n return result<ComputerUseObservation>(await this.enqueue('observe', options, signal));\n },\n act: async (action: ComputerUseAction, signal) => {\n requireDesktop();\n if (!semanticAction(action as unknown as Record<string, unknown>))\n throw new Error('A valid semantic action is required.');\n return result(await this.enqueue('act', action, signal));\n },\n stop: async (signal) => {\n signal?.throwIfAborted();\n if (this.phase !== 'inactive' && this.phase !== 'failed') {\n this.phase = 'stopping';\n this.rejectPending('Computer use was stopped.');\n this.changed();\n }\n return this.state();\n },\n };\n }\n private changed(): void {\n this.revision += 1;\n this.wake = (this.wake + 1) % COMPUTER_USE_WAKE_LIMIT;\n const state = this.state();\n for (const listener of this.listeners) listener(state);\n this.directEvents.publish(computerUseChannelType, this.sessionId, state);\n }\n\n private authorized(request: Request, token: string | undefined): boolean {\n return token !== undefined && request.headers.get('authorization') === `Bearer ${token}`;\n }\n\n private async requestActivation(request: Request): Promise<Response> {\n if (\n !this.desktop?.available ||\n !(this.desktop.authorizeActivation?.(request.headers) ?? this.desktop.authorize(request.headers))\n )\n return jsonError('Not found.', 404);\n if (this.desktop.enabled === false) return jsonError('Enable computer use in global Desktop settings first.', 409);\n // Caller stamps are admitted by the host only after native proof or sealed paired authentication.\n const stamped = doomApiCallerFrom(request.headers);\n const caller = stamped?.locality === 'remote' ? stamped : ({ locality: 'local', stepUp: 'not-required' } as const);\n if (this.phase !== 'inactive' && this.phase !== 'failed') return jsonError('Computer use is already busy.', 409);\n const input = await body(request);\n const target = record(input.target);\n const durationMs = input.durationMs;\n if (\n (target === undefined && (input.target !== undefined || caller.locality !== 'remote')) ||\n (target !== undefined && (typeof target.windowId !== 'string' || typeof target.bundleId !== 'string'))\n )\n return jsonError('A Desktop target is required, or a remote request must leave selection to the Mac.', 400);\n if (\n typeof durationMs !== 'number' ||\n !Number.isInteger(durationMs) ||\n durationMs < 1_000 ||\n durationMs > COMPUTER_USE_MAX_DURATION_MS\n )\n return jsonError('The requested duration is invalid.', 400);\n try {\n this.desktop.claim(request.headers);\n await this.beforeActivate?.();\n } catch (error) {\n return jsonError(error instanceof Error ? error.message : String(error), 409);\n }\n if (this.closed || !this.desktop.available || (this.phase !== 'inactive' && this.phase !== 'failed')) {\n return jsonError('Computer use is unavailable or already busy.', 409);\n }\n const createdAt = Date.now();\n this.activation = Object.freeze({\n requestId: randomUUID(),\n ...(target === undefined ? {} : { target: Object.freeze({ ...target }) }),\n durationSeconds: durationMs / 1_000,\n createdAt,\n confirmationExpiresAt: createdAt + COMPUTER_USE_CONFIRMATION_WINDOW_MS,\n caller: Object.freeze({ ...caller }),\n });\n this.phase = 'awaiting_confirmation';\n this.failure = undefined;\n this.artifact = undefined;\n this.changed();\n return Response.json(this.state(), { status: 202 });\n }\n\n private rejectPending(message: string): void {\n const pending = this.pending;\n if (pending === undefined) return;\n this.pending = undefined;\n pending.dispose();\n pending.reject(new Error(message));\n }\n\n private stopAfterUncertainRequest(message: string): void {\n if (this.phase === 'active') {\n this.phase = 'stopping';\n this.changed();\n }\n this.rejectPending(message);\n }\n\n private async enqueue(\n operation: ComputerUseBrokerRequest['operation'],\n payload?: unknown,\n signal?: AbortSignal,\n ): Promise<Response> {\n if (this.phase !== 'active' || this.grantId === undefined) return jsonError('Computer use is not active.', 409);\n if (this.pending !== undefined) return jsonError('Another computer-use request is live.', 409);\n if (signal?.aborted === true) return jsonError('The computer-use request was cancelled.', 499);\n const sequence = operation === 'act' ? ++this.actionSequence : undefined;\n const request: ComputerUseBrokerRequest = {\n id: randomUUID(),\n operation,\n grantId: this.grantId,\n ...(sequence === undefined ? {} : { sequence }),\n ...(payload === undefined ? {} : { payload }),\n };\n const completion = new Promise<unknown>((resolve, reject) => {\n const onAbort = () => this.stopAfterUncertainRequest('The computer-use request was cancelled.');\n const timer = setTimeout(\n () => this.stopAfterUncertainRequest('The computer-use request timed out.'),\n this.requestTimeoutMs,\n );\n timer.unref?.();\n signal?.addEventListener('abort', onAbort, { once: true });\n this.pending = {\n request,\n resolve,\n reject,\n dispose: () => {\n clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n },\n };\n });\n this.changed();\n try {\n return Response.json(await completion);\n } catch (error) {\n return jsonError(error instanceof Error ? error.message : String(error), 502);\n }\n }\n\n public async fetch(request: Request): Promise<Response> {\n if (this.closed) return jsonError('Computer-use broker is closed.', 503);\n const url = new URL(request.url);\n const path = url.pathname;\n if (request.method === 'GET' && path === routes.artifact.path) {\n if (\n !(this.desktop?.authorizeRecording?.(request.headers) ?? this.desktop?.authorize(request.headers)) ||\n !this.desktop?.fetchRecording\n )\n return jsonError('Not found.', 404);\n const artifactId = url.searchParams.get('artifactId') ?? '';\n const offsetText = url.searchParams.get('offset') ?? '';\n const offset = Number(offsetText);\n if (!/^[0-9]+$/u.test(offsetText) || !Number.isSafeInteger(offset) || offset < 0 || offset > 128 * 1024 * 1024)\n return jsonError('Invalid recording offset.', 400);\n return this.desktop.fetchRecording(artifactId, `bytes=${offset}-${offset + 1024 * 1024 - 1}`);\n }\n if (path === routes.activate.path && request.method === 'GET') {\n if (\n !this.desktop?.authorizePending?.(request.headers) &&\n !(this.desktop?.authorizeRecording?.(request.headers) ?? this.desktop?.authorize(request.headers))\n )\n return jsonError('Not found.', 404);\n return Response.json(this.state());\n }\n if (path === routes.activate.path && request.method === 'DELETE') {\n if (!this.desktop?.authorizePending?.(request.headers)) return jsonError('Not found.', 404);\n if (this.phase !== 'awaiting_confirmation' && this.phase !== 'activating')\n return jsonError('No activation is pending.', 409);\n this.phase = 'stopping';\n this.rejectPending('The activation was cancelled.');\n this.changed();\n return Response.json(this.state(), { status: 202 });\n }\n if (request.method === 'POST' && path === routes.activate.path) return this.requestActivation(request);\n const agent = path.startsWith('/agent/');\n const hub = path.startsWith('/hub/');\n if ((agent && !this.authorized(request, this.internalToken)) || (hub && !this.authorized(request, this.hubToken)))\n return jsonError('Not found.', 404);\n\n if (request.method === 'GET' && (path === routes.agentState.path || path === routes.hubState.path))\n return Response.json(this.state());\n if (request.method === 'POST' && path === routes.agentObserve.path)\n return this.enqueue('observe', undefined, request.signal);\n if (request.method === 'POST' && path === routes.agentAction.path) {\n const action = await body(request);\n if (!semanticAction(action)) return jsonError('A valid semantic action is required.', 400);\n return this.enqueue('act', action, request.signal);\n }\n if (request.method === 'POST' && path === routes.agentStop.path) {\n if (this.phase !== 'active') return jsonError('Computer use is not active.', 409);\n this.phase = 'stopping';\n this.rejectPending('The computer-use request was stopped.');\n this.changed();\n return Response.json(this.state(), { status: 202 });\n }\n if (request.method === 'GET' && path === routes.hubActivation.path) {\n if (this.activation === undefined || this.phase !== 'awaiting_confirmation') return Response.json(null);\n this.phase = 'activating';\n this.changed();\n return Response.json(this.activation);\n }\n if (request.method === 'GET' && path === routes.hubAuthorization.path)\n return Response.json(this.grantId === undefined ? null : { grantId: this.grantId, expiresAt: this.expiresAt });\n if (request.method === 'GET' && path === routes.hubNext.path) return Response.json(this.pending?.request ?? null);\n if (request.method === 'POST' && path === routes.hubComplete.path) {\n const input = await body(request);\n const id = typeof input.id === 'string' ? input.id : undefined;\n if (this.pending === undefined || this.pending.request.id !== id) return jsonError('The request is stale.', 409);\n const pending = this.pending;\n this.pending = undefined;\n pending.dispose();\n if (typeof input.error === 'string') {\n this.phase = 'stopping';\n pending.reject(new Error(input.error));\n } else pending.resolve(input.result);\n this.changed();\n return Response.json(this.state());\n }\n if (request.method === 'POST' && path === routes.hubStop.path) {\n const input = await body(request);\n if (this.phase === 'activating') {\n if (typeof input.error === 'string') {\n this.phase = 'failed';\n this.failure = { code: 'desktop_unavailable', message: input.error.slice(0, 512) };\n this.activation = undefined;\n } else {\n const host = record(input.host);\n if (\n typeof host?.grantId !== 'string' ||\n !Number.isFinite(host.expiresAt) ||\n (host.expiresAt as number) <= Date.now()\n )\n return jsonError('Desktop did not issue a complete grant.', 502);\n const selectedTarget = record(host.target);\n if (this.activation !== undefined && selectedTarget !== undefined)\n this.activation = Object.freeze({ ...this.activation, target: Object.freeze({ ...selectedTarget }) });\n this.grantId = host.grantId;\n this.expiresAt = host.expiresAt as number;\n this.actionSequence = 0;\n this.phase = 'active';\n clearTimeout(this.expiryTimer);\n this.expiryTimer = setTimeout(\n () => {\n if (this.closed || this.phase !== 'active') return;\n this.phase = 'stopping';\n this.rejectPending('The computer-use grant expired.');\n this.changed();\n },\n Math.max(0, this.expiresAt - Date.now()),\n );\n this.expiryTimer.unref?.();\n }\n } else {\n clearTimeout(this.expiryTimer);\n this.rejectPending('The computer-use session stopped.');\n this.phase = 'inactive';\n this.grantId = undefined;\n this.expiresAt = undefined;\n this.activation = undefined;\n this.artifact = artifactView(input.artifact) ?? this.artifact;\n }\n this.changed();\n return Response.json(this.state());\n }\n return jsonError('Not found.', 404);\n }\n\n public close(): void {\n if (this.closed) return;\n this.closed = true;\n clearTimeout(this.expiryTimer);\n this.unsubscribeDesktop?.();\n this.listeners.clear();\n this.rejectPending('Computer-use broker closed.');\n this.grantId = undefined;\n this.expiresAt = undefined;\n }\n}\n\nexport function createComputerUseApi(options: ComputerUseApiOptions): ComputerUseRequestBroker {\n return new ComputerUseRequestBroker(options);\n}\n\nexport const api: DoomApi = {\n basePath: API_BASE_PATH,\n start(context: DoomApiContext): DoomApiHandler {\n if (context.directEvents === undefined) throw new Error('Computer-use API requires the session direct event bus.');\n return createComputerUseApi({\n ...(context.sessionId === undefined ? {} : { sessionId: context.sessionId }),\n ...(context.internalToken === undefined ? {} : { internalToken: context.internalToken }),\n ...(context.hubToken === undefined ? {} : { hubToken: context.hubToken }),\n directEvents: context.directEvents,\n desktop: context.computerUse,\n });\n },\n};\n","import path from 'node:path';\n\nimport { type DoomHeadlessToolResult } from '@agimon-ai/doompi-core/headless';\nimport type { DoomApiContext } from '@agimon-ai/doompi-core/packageApi';\nimport { serverMinorModes } from '@agimon-ai/doompi-minor-mode';\nimport { defineMinorMode, type MinorModeOwner } from '@agimon-ai/doompi-minor-mode';\n\nimport { COMMAND_NAME, COMMAND_DESCRIPTION } from '../../constants/computerUse';\nimport { modeState } from '../../models/computerUseMode';\nimport { ComputerScriptRunner } from '../../services/computerScriptRunner';\nimport { DefaultComputerUseExtensionService } from '../../services/extensionService';\nimport type { ComputerScriptExecutionOptions } from '../../types/computerScript';\nimport type { ComputerUseAction } from '../../types/computerUse';\nimport { API_BASE_PATH, COMPUTER_USE_MODE_ID, COMPUTER_USE_STATUS_KEY } from '../../types/computerUseApi';\nimport type { ComputerUseSessionView } from '../../types/computerUseApi';\nimport {\n computerObservationOutput as observationOutput,\n computerScriptOutput,\n computerScriptFailure,\n} from '../computerToolOutput';\nimport { createComputerUseApi } from '../computerUseApi';\n\n/** This package's identity for mode, activity and restriction ownership, not a status key. */\nconst SOURCE = '@agimon-ai/doompi-computer-use';\n\nconst SCRIPT_PATHS_ENV = 'DOOMPI_COMPUTER_USE_SCRIPT_PATHS';\nconst GUIDANCE =\n '[COMPUTER USE ACTIVE]\\nUse computer_state before acting and after any action that may change the interface. Use only element refs and snapshot ids returned by computer_state. Never infer coordinates or bypass secure elements.';\n\nfunction output(value: unknown, isError = false): DoomHeadlessToolResult {\n return {\n content: [{ type: 'text', text: typeof value === 'string' ? value : JSON.stringify(value, null, 2) }],\n details: value,\n ...(isError ? { isError: true } : {}),\n };\n}\n\nimport {\n type DoomHeadlessHostService,\n type DoomHeadlessTool,\n type DoomHeadlessCommand,\n} from '@agimon-ai/doompi-core/headless';\nimport { type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nexport function createComputerUseServer(\n host: DoomHeadlessHostService,\n apiContext?: DoomApiContext,\n): Omit<DoomServerSessionPlugin, 'tools' | 'commands'> & {\n tools: readonly DoomHeadlessTool[];\n commands: readonly DoomHeadlessCommand[];\n} {\n if (!apiContext?.computerUse?.available || !apiContext.directEvents) return { tools: [], commands: [] };\n const desktop = apiContext.computerUse;\n const broker = createComputerUseApi({\n sessionId: host.context.sessionId,\n internalToken: apiContext.internalToken,\n hubToken: apiContext.hubToken,\n directEvents: apiContext.directEvents,\n desktop,\n beforeActivate: async () => {\n if (!modeSelected()) throw new Error('Enable computer use before authorizing an application.');\n const activity = await host.context.session.activity();\n if (!activity.isIdle || activity.hasPendingMessages)\n throw new Error('Wait for the agent and its queued prompts to finish before granting computer use.');\n },\n });\n const client = broker.sessionClient();\n const allowedScriptPaths = (host.context.environment[SCRIPT_PATHS_ENV] ?? '')\n .split(path.delimiter)\n .filter((entry) => entry.length > 0);\n const scriptRunner = new ComputerScriptRunner({ client, allowedScriptPaths, scriptRoot: host.context.cwd });\n const service = new DefaultComputerUseExtensionService(client);\n const dependencies = { client, scriptRunner, service };\n let state: ComputerUseSessionView | undefined = broker.state();\n const restrictionListeners = new Set<() => void>();\n let stopActivity: (() => void) | undefined;\n let modeOwner: MinorModeOwner | undefined;\n const modeSelected = (): boolean =>\n (host.context.selection.state?.['minor-mode'] ?? []).includes(COMPUTER_USE_MODE_ID);\n const publishMode = (): void => modeOwner?.publish();\n const applyState = (next: ComputerUseSessionView | undefined): void => {\n state = next;\n host.context.client.setStatus(\n COMPUTER_USE_STATUS_KEY,\n next === undefined || next.phase === 'inactive' ? undefined : `computer use: ${next.phase}`,\n );\n publishMode();\n for (const listener of restrictionListeners) listener();\n };\n const selectMode = async (enabled: boolean): Promise<void> => {\n const modes = (host.context.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== COMPUTER_USE_MODE_ID);\n await host.changeSelection({\n axis: 'state',\n key: 'minor-mode',\n values: enabled ? [...modes, COMPUTER_USE_MODE_ID] : modes,\n });\n publishMode();\n };\n const refresh = async (signal?: AbortSignal): Promise<void> => {\n if (!client) {\n applyState(undefined);\n return;\n }\n try {\n applyState(await client.state(signal));\n } catch {\n applyState(undefined);\n }\n };\n const requireActive = (): NonNullable<typeof client> => {\n if (!desktop.available || desktop.enabled === false || !modeSelected() || state?.phase !== 'active')\n throw new Error('Computer use is not active for this session.');\n return client;\n };\n modeOwner = defineMinorMode<undefined>({\n descriptor: {\n source: SOURCE,\n id: COMPUTER_USE_MODE_ID,\n label: 'Computer Use',\n description: 'Session-scoped semantic control through DoomPi Desktop.',\n order: 450,\n actions: [\n {\n id: 'activate',\n label: 'Activate',\n description: 'Enable computer use for this session.',\n contexts: ['headless'],\n parameters: [],\n },\n {\n id: 'deactivate',\n label: 'Deactivate',\n description: 'Stop this session computer-use run.',\n contexts: ['headless'],\n parameters: [],\n },\n {\n id: 'doctor',\n label: 'Doctor',\n description: 'Report Desktop availability and session state.',\n contexts: ['headless'],\n parameters: [],\n },\n ],\n },\n state: () => {\n const mode = modeState(state, modeSelected());\n return desktop.enabled === false\n ? {\n ...mode,\n condition: 'blocked',\n detail: 'Enable computer use in global Desktop settings.',\n actions: mode.actions.map((action) => ({\n ...action,\n enabled: false,\n disabledReason: 'Enable computer use in global Desktop settings.',\n })),\n }\n : mode;\n },\n async handleAction(_runtime, actionId, _argumentsValue, execution) {\n execution.signal.throwIfAborted();\n if (actionId === 'activate') {\n if (!desktop.available || desktop.enabled === false)\n throw new Error('Enable computer use in global Desktop settings first.');\n await selectMode(true);\n await refresh(execution.signal);\n return { message: 'Computer use is ready to configure in Activity.' };\n }\n if (actionId === 'doctor') {\n await refresh(execution.signal);\n return {\n message: client\n ? `Computer use is ${state?.phase ?? 'unavailable'}.`\n : 'DoomPi Desktop session API is unavailable.',\n };\n }\n if (actionId === 'deactivate') {\n if (client && state?.phase !== undefined && state.phase !== 'inactive' && state.phase !== 'failed')\n await client.stop(execution.signal);\n await selectMode(false);\n await refresh(execution.signal);\n return { message: 'Computer use deactivated.' };\n }\n throw new Error(`Unknown computer-use action: ${actionId}`);\n },\n }).createOwner(undefined);\n const unsubscribeState = client.subscribeStatus?.(applyState);\n return {\n api: [{ basePath: API_BASE_PATH, start: () => broker }],\n services: [\n (context) => {\n const fiber = context.plugin(serverMinorModes([modeOwner!]));\n context.effect(() =>\n desktop.subscribe(() => {\n if (!desktop.available) void fiber.dispose();\n }),\n );\n },\n ],\n toolRestrictions: [\n {\n source: SOURCE,\n restrict: () => ({\n excludedTools:\n desktop.available && desktop.enabled !== false && modeSelected() && state?.phase === 'active'\n ? []\n : ['computer_state', 'computer_action', 'computer_exec'],\n }),\n subscribe: (listener) => {\n restrictionListeners.add(listener);\n return () => {\n restrictionListeners.delete(listener);\n };\n },\n },\n ],\n activities: [\n {\n when: {\n state: { 'minor-mode': COMPUTER_USE_MODE_ID },\n attribution: { kind: 'minor', mode: COMPUTER_USE_MODE_ID },\n },\n name: SOURCE,\n async start() {\n await refresh();\n stopActivity = () => {\n void client.stop();\n };\n return () => {\n stopActivity?.();\n stopActivity = undefined;\n };\n },\n },\n ],\n tools: [\n {\n when: {\n state: { 'minor-mode': COMPUTER_USE_MODE_ID },\n attribution: { kind: 'minor', mode: COMPUTER_USE_MODE_ID },\n },\n name: 'computer_state',\n label: 'Computer State',\n description: 'Observe the authorized application window and return semantic accessibility state.',\n parameters: {\n type: 'object',\n properties: { includeScreenshot: { type: 'boolean' } },\n additionalProperties: false,\n },\n executionMode: 'serial',\n async execute(_toolCallId, _parameters, signal) {\n try {\n const session = requireActive();\n const observation = await session.observe(signal, {\n includeScreenshot: (_parameters as { includeScreenshot?: boolean }).includeScreenshot !== false,\n });\n return observationOutput(observation);\n } catch (error) {\n return output(error instanceof Error ? error.message : String(error), true);\n }\n },\n },\n {\n when: {\n state: { 'minor-mode': COMPUTER_USE_MODE_ID },\n attribution: { kind: 'minor', mode: COMPUTER_USE_MODE_ID },\n },\n name: 'computer_action',\n label: 'Computer Action',\n description: 'Perform one constrained semantic action in the authorized application window.',\n parameters: {\n type: 'object',\n properties: {\n kind: { type: 'string', enum: ['press', 'focus', 'set_value', 'scroll'] },\n snapshotId: { type: 'string', minLength: 1 },\n elementRef: { type: 'string', minLength: 1 },\n value: { type: 'string' },\n direction: { type: 'string', enum: ['up', 'down', 'left', 'right'] },\n amount: { type: 'string', enum: ['line', 'page'] },\n },\n required: ['kind', 'snapshotId', 'elementRef'],\n additionalProperties: false,\n },\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal) {\n try {\n const result = await requireActive().act(parameters as unknown as ComputerUseAction, signal);\n await refresh(signal);\n return output(result);\n } catch (error) {\n return output(error instanceof Error ? error.message : String(error), true);\n }\n },\n },\n {\n when: {\n state: { 'minor-mode': COMPUTER_USE_MODE_ID },\n attribution: { kind: 'minor', mode: COMPUTER_USE_MODE_ID },\n },\n name: 'computer_exec',\n label: 'Computer Script',\n description:\n 'Run a reusable function with only the authorized program API. Relative helpers are supported. Full Node requires trusted:true and an explicitly allowlisted path.',\n parameters: {\n type: 'object',\n properties: {\n scriptPath: { type: 'string', minLength: 1 },\n input: {},\n trusted: { type: 'boolean' },\n includeScreenshot: { type: 'boolean' },\n },\n required: ['scriptPath', 'input'],\n additionalProperties: false,\n },\n executionMode: 'serial',\n async execute(_toolCallId, parameters, signal) {\n try {\n requireActive();\n if (!dependencies.scriptRunner) throw new Error('Computer script execution is unavailable.');\n const input = parameters as { scriptPath: string; input: unknown } & ComputerScriptExecutionOptions;\n return computerScriptOutput(\n await dependencies.scriptRunner.execute(input.scriptPath, input.input, signal, input),\n );\n } catch (error) {\n return computerScriptFailure(error);\n }\n },\n },\n ],\n commands: [\n {\n name: COMMAND_NAME,\n description: COMMAND_DESCRIPTION,\n async execute(args, execution) {\n const result = await dependencies.service.execute();\n await execution.client.notify({ body: result.message, level: result.level });\n if (args.trim() === 'deactivate' && client && state?.phase !== 'inactive' && state?.phase !== 'failed') {\n await client.stop();\n await host.changeSelection({\n axis: 'state',\n key: 'minor-mode',\n values: (execution.selection.state?.['minor-mode'] ?? []).filter((mode) => mode !== COMPUTER_USE_MODE_ID),\n });\n await refresh();\n }\n },\n },\n ],\n hooks: [\n {\n when: {\n state: { 'minor-mode': COMPUTER_USE_MODE_ID },\n attribution: { kind: 'minor', mode: COMPUTER_USE_MODE_ID },\n },\n event: 'before_agent_start',\n handle(event) {\n if (state?.phase !== 'active') return undefined;\n const prompt = typeof event.systemPrompt === 'string' ? event.systemPrompt : '';\n return { systemPrompt: `${prompt}\\n\\n${GUIDANCE}`.trim() };\n },\n },\n {\n when: {\n state: { 'minor-mode': COMPUTER_USE_MODE_ID },\n attribution: { kind: 'minor', mode: COMPUTER_USE_MODE_ID },\n },\n event: 'session_shutdown',\n handle: async () => {\n stopActivity?.();\n if (client && state?.phase !== 'inactive' && state?.phase !== 'failed') await client.stop();\n },\n },\n ],\n onDispose() {\n stopActivity?.();\n stopActivity = undefined;\n unsubscribeState?.();\n broker.close();\n restrictionListeners.clear();\n host.context.client.setStatus(COMPUTER_USE_STATUS_KEY, undefined);\n },\n };\n}\n","import type { DoomServerPluginDefinition } from '@agimon-ai/doompi-core/serverFacet';\n\nimport { createComputerUseServer } from '../../../../../services/computerUseServer';\n\nexport default (({ agent, host }) =>\n agent ? createComputerUseServer(agent, host.context) : { tools: [], commands: [] }) satisfies NonNullable<\n DoomServerPluginDefinition['session']\n>;\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { mountMcpTools } from '../../../../services/mcpTools';\nimport runtime from './_runtime/index.server';\n\nexport default defineRoot((context: Parameters<typeof runtime>[0]) => {\n const value = runtime(context);\n return {\n value,\n services: [...(value.services ?? []), ...(value.tools?.length ? [mountMcpTools(value.tools)] : [])],\n activities: value.activities,\n onStop: value.onStop,\n onDispose: value.onDispose,\n };\n});\n","import { API_BASE_PATH } from '../../types/computerUseApi';\n\nexport class MissingComputerUseApiError extends Error {}\n\nexport function computerUseSessionApiError(status: number, value: unknown): Error {\n const error =\n typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>).error\n : undefined;\n const message = typeof error === 'string' ? error : `HTTP ${String(status)}`;\n return status === 404 && message === `No API '${API_BASE_PATH}' in this session.`\n ? new MissingComputerUseApiError(message)\n : new Error(message);\n}\n\nexport function missingComputerUseApiRetryAt(now: number): number {\n return now + 5_000;\n}\n","import { randomUUID } from 'node:crypto';\n\nimport type { DoomHubChannelSource, DoomHubSessionScope, DoomHubChannel } from '@agimon-ai/doompi-core/hubChannel';\n\nimport { computerUseSessionApiError, MissingComputerUseApiError } from '../../services/webComputerUseAvailability';\nimport {\n API_BASE_PATH,\n computerUseChannelType,\n COMPUTER_USE_ROUTES,\n type ComputerUseActivationRequest,\n type ComputerUseBrokerRequest,\n type ComputerUseBrowserCommand,\n type ComputerUseChannelPayload,\n type ComputerUseSessionView,\n} from '../../types/computerUseApi';\nexport { computerUseChannelType };\n\n/** Computer use runs on the DoomPi Desktop host, so every other client declines it. */\nconst DESKTOP_UNAVAILABLE = 'DoomPi Desktop computer use is unavailable.';\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction command(value: unknown): ComputerUseBrowserCommand | undefined {\n const input = record(value);\n return input?.action === 'status' ||\n input?.action === 'targets' ||\n input?.action === 'stop' ||\n input?.action === 'artifacts'\n ? { action: input.action }\n : undefined;\n}\n\nasync function responseJson(response: Response): Promise<unknown> {\n const value = await response.json();\n if (!response.ok) throw computerUseSessionApiError(response.status, value);\n return value;\n}\n\nfunction sessionState(value: unknown): ComputerUseSessionView | undefined {\n const input = record(value);\n if (\n typeof input?.sessionId !== 'string' ||\n typeof input.revision !== 'number' ||\n typeof input.wake !== 'number' ||\n !['inactive', 'awaiting_confirmation', 'activating', 'active', 'stopping', 'failed'].includes(input.phase as string)\n )\n return undefined;\n return input as unknown as ComputerUseSessionView;\n}\n\nexport function createComputerUseChannel(): DoomHubChannel {\n let receiveCommand: ((scope: DoomHubSessionScope, payload: unknown) => void) | undefined;\n return {\n frameType: computerUseChannelType,\n lifecycle: 'hub',\n start(host) {\n const scopes = new Map<string, DoomHubSessionScope>();\n const latest = new Map<string, ComputerUseChannelPayload>();\n const targets = new Map<string, readonly Record<string, unknown>[]>();\n const grants = new Map<string, string>();\n const subscriptions = new Map<string, () => void>();\n const processing = new Set<string>();\n const rerun = new Map<string, ComputerUseSessionView | undefined>();\n const requests = new Map<string, AbortController>();\n let activeSessionId: string | undefined;\n let closed = false;\n\n const sessionRequest = async (scope: DoomHubSessionScope, path: string, method = 'GET', value?: unknown) =>\n host.requestSessionApi(scope, {\n basePath: API_BASE_PATH,\n path,\n method,\n ...(value === undefined ? {} : { body: JSON.stringify(value) }),\n });\n\n const publish = (scope: DoomHubSessionScope, state: ComputerUseSessionView): void => {\n if (state.phase === 'active' || state.phase === 'activating' || state.phase === 'stopping') {\n activeSessionId = scope.sessionId;\n } else if (activeSessionId === scope.sessionId) {\n activeSessionId = undefined;\n grants.delete(scope.sessionId);\n }\n const payload: ComputerUseChannelPayload = {\n state,\n targets: targets.get(scope.sessionId) ?? [],\n ...(activeSessionId !== undefined && activeSessionId !== scope.sessionId ? { busy: true } : {}),\n };\n latest.set(scope.sessionId, payload);\n host.publish(scope.sessionId, payload);\n };\n\n const refresh = async (scope: DoomHubSessionScope): Promise<ComputerUseSessionView> => {\n const state = sessionState(await responseJson(await sessionRequest(scope, COMPUTER_USE_ROUTES.hubState)));\n if (state === undefined) throw new Error('Computer-use API returned an invalid session state.');\n publish(scope, state);\n return state;\n };\n\n const completePending = async (scope: DoomHubSessionScope, pending: ComputerUseBrokerRequest): Promise<void> => {\n if (!host.computerUse?.available) throw new Error(DESKTOP_UNAVAILABLE);\n const controller = new AbortController();\n requests.set(scope.sessionId, controller);\n try {\n const result = await host.computerUse.request(scope, {\n operation: pending.operation,\n signal: controller.signal,\n payload:\n pending.operation === 'act'\n ? { grantId: pending.grantId, sequence: pending.sequence, action: pending.payload }\n : { grantId: pending.grantId, includeScreenshot: record(pending.payload)?.includeScreenshot !== false },\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 } finally {\n if (requests.get(scope.sessionId) === controller) requests.delete(scope.sessionId);\n }\n };\n\n const stopSession = async (scope: DoomHubSessionScope): Promise<void> => {\n requests.get(scope.sessionId)?.abort();\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 const stopped = await host.computerUse.request(scope, {\n operation: 'stop',\n payload: { grantId: authorization.grantId },\n });\n artifact = record(stopped)?.artifact;\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 || !scopes.has(scope.sessionId)) return;\n if (processing.has(scope.sessionId)) {\n rerun.set(scope.sessionId, announced);\n return;\n }\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 = false;\n }\n }\n if (expired || !owned) {\n await stopSession(scope);\n await refresh(scope);\n return;\n }\n }\n if (\n state.phase === 'awaiting_confirmation' &&\n (activeSessionId === undefined || activeSessionId === scope.sessionId)\n ) {\n const activation = (await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubActivation),\n )) as ComputerUseActivationRequest | null;\n if (activation !== null && !host.computerUse?.available) {\n // No desktop host: decline through the API's own failure path so the browser\n // shows why, instead of leaving the request pending or raising a server error.\n await responseJson(\n await sessionRequest(scope, COMPUTER_USE_ROUTES.hubStop, 'POST', { error: DESKTOP_UNAVAILABLE }),\n );\n await refresh(scope);\n return;\n }\n if (activation !== null && host.computerUse?.available) {\n activeSessionId = scope.sessionId;\n const controller = new AbortController();\n requests.set(scope.sessionId, controller);\n try {\n const hostResult = await host.computerUse.request(scope, {\n operation: 'activate',\n payload: activation,\n signal: controller.signal,\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 } finally {\n if (requests.get(scope.sessionId) === controller) requests.delete(scope.sessionId);\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 if (!closed && scopes.has(scope.sessionId) && rerun.has(scope.sessionId)) {\n const next = rerun.get(scope.sessionId);\n rerun.delete(scope.sessionId);\n queueMicrotask(() => {\n void processScope(scope, next);\n });\n }\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 if (state.phase === 'stopping' || state.phase === 'failed' || state.phase === 'inactive')\n requests.get(scope.sessionId)?.abort();\n publish(scope, state);\n void processScope(scope, state);\n };\n\n receiveCommand = (scope, payload) => {\n const parsed = command(payload);\n if (parsed === undefined) return;\n void (async () => {\n try {\n if (parsed.action === 'targets') {\n // Without a desktop host there is nothing to capture, so the browser sees an\n // empty target list rather than an error it cannot act on.\n const result = host.computerUse?.available\n ? await host.computerUse.request(scope, { operation: 'targets' })\n : [];\n targets.set(\n scope.sessionId,\n Array.isArray(result)\n ? result.filter((item): item is Record<string, unknown> => record(item) !== undefined)\n : [],\n );\n } else if (parsed.action === 'stop') {\n await stopSession(scope);\n }\n await refresh(scope);\n void processScope(scope);\n } catch (error) {\n if (error instanceof MissingComputerUseApiError) {\n latest.delete(scope.sessionId);\n } else {\n host.onNotice(\n `computer-use command failed for ${scope.sessionId} (${error instanceof Error ? error.message : String(error)})`,\n );\n }\n }\n })();\n };\n\n const source: DoomHubChannelSource = {\n payloadFor: (scope) => latest.get(scope.sessionId),\n sessionAdded(scope) {\n scopes.set(scope.sessionId, scope);\n const unsubscribe = host.directEvents.subscribe(\n computerUseChannelType,\n scope.sessionId,\n (payload) => onState(scope, payload),\n { replayLatest: true },\n );\n subscriptions.set(scope.sessionId, unsubscribe);\n void processScope(scope);\n },\n sessionRemoved(sessionId) {\n requests.get(sessionId)?.abort();\n requests.delete(sessionId);\n rerun.delete(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 controller of requests.values()) controller.abort();\n requests.clear();\n rerun.clear();\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, connection) {\n if (connection.desktopAuthorized !== true && connection.computerUseAuthorized !== true) return;\n receiveCommand?.(scope, payload);\n },\n };\n}\n","import { defineChannel } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { createComputerUseChannel } from '../../../services/webComputerUseChannel';\n\nexport default defineChannel(createComputerUseChannel);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.api?.find((api) => api.basePath === 'computer-use'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.commands.find((command) => command.name === 'computer-use'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.hooks?.find((hook) => hook.event === 'before_agent_start'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.hooks?.find((hook) => hook.event === 'session_shutdown'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution((context: Context) => context.root.toolRestrictions?.[0], {\n cardinality: 'optional',\n});\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.tools.find((tool) => tool.name === 'computer_state'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.tools.find((tool) => tool.name === 'computer_action'),\n { cardinality: 'optional' },\n);\n","import { defineRoutedContribution, type WithRoot } from '@agimon-ai/doompi-core/extensionFile';\ntype Runtime = Awaited<ReturnType<typeof import('../root.server').default>>['value'];\n\ntype Context = WithRoot<unknown, Runtime>;\nexport default defineRoutedContribution(\n (context: Context) => context.root.tools.find((tool) => tool.name === 'computer_exec'),\n { cardinality: 'optional' },\n);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineServerPlugin, type DoomServerSessionPlugin } from '@agimon-ai/doompi-core/serverFacet';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.server';\nimport channelComputerUse from '../src/extensions/(backend)/channel/computer-use.server';\nimport apiRoute from '../src/extensions/workspaces/sessions/(backend)/api/computer-use/route.server';\nimport commandComputerUse from '../src/extensions/workspaces/sessions/(backend)/command/computer-use.server';\nimport hookBeforeAgentStart from '../src/extensions/workspaces/sessions/(backend)/hook/before-agent-start.server';\nimport hookSessionShutdown from '../src/extensions/workspaces/sessions/(backend)/hook/session-shutdown.server';\nimport toolRestrictionComputerUse from '../src/extensions/workspaces/sessions/(backend)/tool-restriction/computer-use.server';\nimport tool00ComputerState from '../src/extensions/workspaces/sessions/(backend)/tool/00-computer-state.server';\nimport tool10ComputerAction from '../src/extensions/workspaces/sessions/(backend)/tool/10-computer-action.server';\nimport tool20ComputerExec from '../src/extensions/workspaces/sessions/(backend)/tool/20-computer-exec.server';\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n/* v8 ignore next -- generated normalization branch */\nconst defined = <T>(values: readonly (T | undefined)[]): T[] =>\n values.filter((value): value is T => value !== undefined);\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const facet = defineServerPlugin({\n name: '@agimon-ai/doompi-computer-use',\n global: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'computer_use' }, channelComputerUse())]; },\n }),\n workspace: () => ({\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'computer_use' }, channelComputerUse())]; },\n }),\n session: async (context) => {\n const scopeSession = await rootSession(context);\n const contextSession = { ...context, root: scopeSession.value };\n return {\n ...composeRootHooks(scopeSession),\n get api(): DoomServerSessionPlugin['api'] { return defined([at(apiRoute, contextSession)]); },\n get channels(): DoomServerSessionPlugin['channels'] { return [() => via({ frameType: 'computer_use' }, channelComputerUse())]; },\n get commands(): DoomServerSessionPlugin['commands'] { return defined([via({ name: 'computer-use' }, at(commandComputerUse, contextSession))]); },\n get hooks(): DoomServerSessionPlugin['hooks'] { return defined([via({ event: 'before_agent_start' }, at(hookBeforeAgentStart, contextSession)), via({ event: 'session_shutdown' }, at(hookSessionShutdown, contextSession))]); },\n get toolRestrictions(): DoomServerSessionPlugin['toolRestrictions'] { return defined([at(toolRestrictionComputerUse, contextSession)]); },\n get tools(): DoomServerSessionPlugin['tools'] { return defined([via({ name: '00_computer_state' }, at(tool00ComputerState, contextSession)), via({ name: '10_computer_action' }, at(tool10ComputerAction, contextSession)), via({ name: '20_computer_exec' }, at(tool20ComputerExec, contextSession))]); },\n services: [...(scopeSession.services ?? [])],\n get activities(): DoomServerSessionPlugin['activities'] { return [...(scopeSession.activities ?? [])]; },\n };\n },\n});\n\nexport default facet;\n"],"mappings":"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"}