@neuralnomads/codenomad-dev 0.20.1-dev-20261019-7eb401eb → 0.20.1-dev-20261019-e32d9331

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/automation/browser-page.js +97 -0
  2. package/dist/automation/browser-page.js.map +1 -0
  3. package/dist/automation/browser-page.test.js +119 -0
  4. package/dist/automation/browser-page.test.js.map +1 -0
  5. package/dist/automation/page/actions.js +107 -83
  6. package/dist/automation/page/actions.js.map +1 -1
  7. package/dist/automation/page/input.js +130 -0
  8. package/dist/automation/page/input.js.map +1 -0
  9. package/dist/automation/page/input.test.js +71 -0
  10. package/dist/automation/page/input.test.js.map +1 -0
  11. package/dist/automation/page/keys.js +99 -0
  12. package/dist/automation/page/keys.js.map +1 -0
  13. package/dist/automation/page/keys.test.js +32 -0
  14. package/dist/automation/page/keys.test.js.map +1 -0
  15. package/dist/automation/page/parse.js +79 -0
  16. package/dist/automation/page/parse.js.map +1 -0
  17. package/dist/automation/page/protocol.js +143 -0
  18. package/dist/automation/page/protocol.js.map +1 -0
  19. package/dist/developer-cdp.js +7 -10
  20. package/dist/developer-cdp.js.map +1 -1
  21. package/dist/developer-cdp.test.js +49 -15
  22. package/dist/developer-cdp.test.js.map +1 -1
  23. package/dist/opencode/automation/desktop-plugin.js +10 -6
  24. package/dist/opencode/automation/desktop-plugin.js.map +1 -1
  25. package/dist/opencode/automation-plugin.js +33 -41
  26. package/dist/opencode/automation-plugin.js.map +1 -1
  27. package/dist/opencode/automation-plugin.test.js +42 -1
  28. package/dist/opencode/automation-plugin.test.js.map +1 -1
  29. package/dist/plugins/automation/plugin.mjs +230 -40
  30. package/dist/plugins/missions/plugin.mjs +21 -0
  31. package/dist/server/routes/automation-plugin.js +7 -5
  32. package/dist/server/routes/automation-plugin.js.map +1 -1
  33. package/dist/server/routes/automation-plugin.test.js +17 -4
  34. package/dist/server/routes/automation-plugin.test.js.map +1 -1
  35. package/package.json +1 -1
  36. package/public/assets/{App-7u0r589J.js → App-DZMdkLQJ.js} +8 -8
  37. package/public/assets/{App-7u0r589J.js.map → App-DZMdkLQJ.js.map} +1 -1
  38. package/public/assets/{FilesPanel-DmdwCBoM.js → FilesPanel-CgFgL4q7.js} +2 -2
  39. package/public/assets/{FilesPanel-DmdwCBoM.js.map → FilesPanel-CgFgL4q7.js.map} +1 -1
  40. package/public/assets/{StatusTab-CPfdwHzQ.js → StatusTab-CaQz8RwN.js} +2 -2
  41. package/public/assets/{StatusTab-CPfdwHzQ.js.map → StatusTab-CaQz8RwN.js.map} +1 -1
  42. package/public/assets/{client-state-Dbg3RTSW.js → client-state-DikXRKzG.js} +2 -2
  43. package/public/assets/{client-state-Dbg3RTSW.js.map → client-state-DikXRKzG.js.map} +1 -1
  44. package/public/assets/{client-state-_VkciMC3.js → client-state-kpF1cbUu.js} +2 -2
  45. package/public/assets/{client-state-_VkciMC3.js.map → client-state-kpF1cbUu.js.map} +1 -1
  46. package/public/assets/client-state-owner-commands-BMJJQYT-.js +2 -0
  47. package/public/assets/{client-state-owner-commands-C_V-9FL7.js.map → client-state-owner-commands-BMJJQYT-.js.map} +1 -1
  48. package/public/assets/{diff-viewer-EKYtk2Kn.js → diff-viewer-iFIylM56.js} +2 -2
  49. package/public/assets/{diff-viewer-EKYtk2Kn.js.map → diff-viewer-iFIylM56.js.map} +1 -1
  50. package/public/assets/{main-CSjPT-d2.js → main-B0L3f7sD.js} +52 -52
  51. package/public/assets/main-B0L3f7sD.js.map +1 -0
  52. package/public/assets/{markdown-BCaUmWNf.js → markdown-Bh1QlJgA.js} +2 -2
  53. package/public/assets/{markdown-BCaUmWNf.js.map → markdown-Bh1QlJgA.js.map} +1 -1
  54. package/public/assets/{opener-startup-state-settings-card-DcDRs1t6.js → opener-startup-state-settings-card-mzh22bq8.js} +2 -2
  55. package/public/assets/{opener-startup-state-settings-card-DcDRs1t6.js.map → opener-startup-state-settings-card-mzh22bq8.js.map} +1 -1
  56. package/public/assets/{startup-state-settings-card-CQaOfOwm.js → startup-state-settings-card-B1UMzsQK.js} +2 -2
  57. package/public/assets/{startup-state-settings-card-CQaOfOwm.js.map → startup-state-settings-card-B1UMzsQK.js.map} +1 -1
  58. package/public/assets/{startup-state-settings-view-Cd3LgXsC.js → startup-state-settings-view-nZNbhUhQ.js} +2 -2
  59. package/public/assets/{startup-state-settings-view-Cd3LgXsC.js.map → startup-state-settings-view-nZNbhUhQ.js.map} +1 -1
  60. package/public/assets/{terminal-square-CBQGNjjn.js → terminal-square-CdJ4Gt6Y.js} +2 -2
  61. package/public/assets/{terminal-square-CBQGNjjn.js.map → terminal-square-CdJ4Gt6Y.js.map} +1 -1
  62. package/public/assets/{tool-call-Q2b_KH6g.js → tool-call-C9ux0znU.js} +4 -4
  63. package/public/assets/{tool-call-Q2b_KH6g.js.map → tool-call-C9ux0znU.js.map} +1 -1
  64. package/public/assets/{unified-picker-Dubi2nCg.js → unified-picker-DOP29DIt.js} +2 -2
  65. package/public/assets/{unified-picker-Dubi2nCg.js.map → unified-picker-DOP29DIt.js.map} +1 -1
  66. package/public/index.html +1 -1
  67. package/public/sw.js +1 -1
  68. package/public/sw.js.map +1 -1
  69. package/public/assets/client-state-owner-commands-C_V-9FL7.js +0 -2
  70. package/public/assets/main-CSjPT-d2.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"automation-plugin.js","sourceRoot":"","sources":["../../src/opencode/automation-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes, timingSafeEqual } from \"node:crypto\"\nimport { execFileSync, spawn } from \"node:child_process\"\nimport { mkdir, open, opendir, readFile, rename, rm, writeFile } from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport type { Plugin } from \"@opencode/plugin\"\nimport { MissionControlError } from \"../missions/control-error\"\nimport { signNativeRecurrenceControl, type RecurrenceControlProofBody } from \"../missions/recurrence-control-proof\"\nimport { missionRecoveryError } from \"../missions/recovery-error\"\n\nexport const AUTOMATION_BRIDGE_PATH = \"/api/opencode-plugin/automation\"\nconst REQUEST_TIMEOUT_MS = 95_000\nconst PROBE_TIMEOUT_MS = 5_000\n// Mission ownership may require a cold, validated linked-worktree inventory.\nconst MISSION_PROBE_TIMEOUT_MS = 30_000\nconst INSPECTION_TIMEOUT_MS = 15_000\nconst RECONNECT_INTERVAL_MS = 250\nconst MAX_REGISTRATIONS = 64\nconst MAX_LOCAL_REGISTRY_FILES = 4096\nconst MAX_REGISTRATION_BYTES = 4 * 1024\nconst MAX_BRIDGE_RESPONSE_BYTES = 8 * 1024 * 1024\nconst PROBE_CONCURRENCY = 4\nconst REGISTRATION_NAME = /^(\\d+)-\\d+-[A-Za-z0-9_-]+\\.json$/\nconst WINDOWS_INTEROP = Symbol(\"windowsInterop\")\nlet cachedWslWindowsLocalAppData: string | null | undefined\n\nexport type DeveloperAction =\n | { action: \"inspect\"; ref?: string; query?: string }\n | { action: \"click\"; ref: string }\n | { action: \"type\"; ref: string; text: string; clear: boolean }\n | { action: \"select\"; ref: string; values: string[] }\n | { action: \"restart\" }\n | { action: \"screenshot\" }\n\nconst MAX_SELECT_VALUES = 64\nconst MAX_QUERY_LENGTH = 200\n\nexport type BrowserAction =\n | { action: \"open\"; url: string }\n | { action: \"navigate\"; url: string }\n | { action: \"snapshot\" }\n | { action: \"click\"; ref: string }\n | { action: \"type\"; ref: string; text: string; clear?: boolean }\n | { action: \"screenshot\" }\n\nexport interface AutomationBridgeRegistration {\n version: 1\n url: string\n token: string\n pid: number\n startedAt: number\n}\n\ntype ToolDraft = Parameters<Parameters<Plugin.Context[\"tool\"][\"transform\"]>[0]>[0]\ninterface AutomationPluginContext {\n tool: { transform(callback: (draft: Pick<ToolDraft, \"add\">) => void): Promise<unknown> }\n}\n\ninterface BridgeResponse {\n result?: unknown\n error?: string\n code?: unknown\n}\n\ninterface ProbedBridge {\n registration: DiscoveredBridgeRegistration\n nativeIdentity: string\n runId: string\n}\n\ntype DiscoveredBridgeRegistration = AutomationBridgeRegistration & { [WINDOWS_INTEROP]?: true }\n\nexport function automationBridgeDirectory(): string {\n return automationBridgeDirectories()[0]\n}\n\nexport function automationBridgeDirectories(options: {\n platform?: NodeJS.Platform\n env?: NodeJS.ProcessEnv\n home?: string\n windowsLocalAppData?: string\n} = {}): string[] {\n const platform = options.platform ?? process.platform\n const env = options.env ?? process.env\n const paths = platform === \"win32\" ? path.win32 : path.posix\n const home = options.home ?? os.homedir()\n const primary = platform === \"win32\" && env.LOCALAPPDATA\n ? paths.join(env.LOCALAPPDATA, \"CodeNomad\", \"automation-bridges\")\n : env.XDG_RUNTIME_DIR\n ? paths.join(env.XDG_RUNTIME_DIR, \"codenomad\", \"automation-bridges\")\n : paths.join(home, \".config\", \"codenomad\", \"automation-bridges\")\n if (platform !== \"linux\" || !env.WSL_DISTRO_NAME) return [primary]\n const windowsLocalAppData = options.windowsLocalAppData ?? resolveWslWindowsLocalAppData()\n return windowsLocalAppData\n ? [...new Set([primary, path.posix.join(windowsLocalAppData, \"CodeNomad\", \"automation-bridges\")])]\n : [primary]\n}\n\nfunction resolveWslWindowsLocalAppData(): string | undefined {\n if (cachedWslWindowsLocalAppData !== undefined) return cachedWslWindowsLocalAppData ?? undefined\n try {\n const windowsPath = execFileSync(\"cmd.exe\", [\"/d\", \"/s\", \"/c\", \"echo %LOCALAPPDATA%\"], {\n encoding: \"utf8\",\n timeout: 2_000,\n windowsHide: true,\n }).trim()\n const translated = execFileSync(\"wslpath\", [\"-u\", windowsPath], {\n encoding: \"utf8\",\n timeout: 2_000,\n }).trim()\n cachedWslWindowsLocalAppData = path.posix.isAbsolute(translated) ? translated : null\n } catch {\n cachedWslWindowsLocalAppData = null\n }\n return cachedWslWindowsLocalAppData ?? undefined\n}\n\nexport function createAutomationBridgeRegistration(url: string): AutomationBridgeRegistration {\n return {\n version: 1,\n url: new URL(AUTOMATION_BRIDGE_PATH, url).href,\n token: randomBytes(32).toString(\"base64url\"),\n pid: process.pid,\n startedAt: Date.now(),\n }\n}\n\nexport async function publishAutomationBridge(registration: AutomationBridgeRegistration): Promise<() => Promise<void>> {\n const directory = automationBridgeDirectory()\n await mkdir(directory, { recursive: true })\n await pruneDeadLocalRegistrations(directory)\n const published = { ...registration, startedAt: Date.now() }\n const target = path.join(directory, `${published.startedAt}-${published.pid}-${published.token.slice(0, 12)}.json`)\n await writeAtomic(target, `${JSON.stringify(published)}\\n`)\n return () => rm(target, { force: true })\n}\n\nexport async function removeLegacyAutomationPlugin(\n configRoot = process.env.XDG_CONFIG_HOME || path.join(os.homedir(), \".config\"),\n): Promise<boolean> {\n const pluginPath = path.join(configRoot, \"opencode\", \"plugins\", \"codenomad-automation.ts\")\n let source: string\n try {\n source = await readFile(pluginPath, \"utf8\")\n } catch {\n return false\n }\n if (!isLegacyAutomationPlugin(source)) return false\n await rm(pluginPath, { force: true })\n return true\n}\n\nexport function isLegacyAutomationPlugin(source: string): boolean {\n const match = /^export \\{ default \\} from (\"(?:[^\"\\\\]|\\\\.)*\")\\s*$/.exec(source)\n if (!match) return false\n let target: URL\n try {\n target = new URL(JSON.parse(match[1]) as string)\n } catch {\n return false\n }\n if (target.protocol !== \"file:\" || !/(?:\\/server\\/dist|\\/packages\\/server\\/src)\\/opencode\\/automation-plugin\\.(?:js|ts)$/.test(target.pathname)) {\n return false\n }\n return true\n}\n\nasync function writeAtomic(target: string, content: string): Promise<void> {\n const temporary = `${target}.${process.pid}.${randomBytes(6).toString(\"hex\")}.tmp`\n await writeFile(temporary, content, { encoding: \"utf8\", mode: 0o600 })\n await rename(temporary, target)\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"EPERM\"\n }\n}\n\nasync function readRegistration(target: string): Promise<AutomationBridgeRegistration | undefined> {\n try {\n const file = await open(target, \"r\")\n const buffer = Buffer.alloc(MAX_REGISTRATION_BYTES + 1)\n let bytesRead = 0\n try {\n bytesRead = (await file.read(buffer, 0, buffer.length, 0)).bytesRead\n } finally {\n await file.close()\n }\n if (bytesRead > MAX_REGISTRATION_BYTES) return undefined\n const value = JSON.parse(buffer.subarray(0, bytesRead).toString(\"utf8\")) as Partial<AutomationBridgeRegistration>\n if (value.version !== 1 || typeof value.url !== \"string\" || typeof value.token !== \"string\"\n || !Number.isSafeInteger(value.pid) || value.pid! <= 0\n || !Number.isSafeInteger(value.startedAt) || value.startedAt! <= 0) return undefined\n const url = new URL(value.url)\n if (url.protocol !== \"http:\" || url.hostname !== \"127.0.0.1\" || url.pathname !== AUTOMATION_BRIDGE_PATH) return undefined\n return value as AutomationBridgeRegistration\n } catch {\n return undefined\n }\n}\n\nasync function pruneDeadLocalRegistrations(directory: string): Promise<void> {\n try {\n const stream = await opendir(directory)\n const entries: Array<{ name: string; startedAt: number }> = []\n for await (const entry of stream) {\n if (!entry.isFile()) continue\n const match = REGISTRATION_NAME.exec(entry.name)\n if (!match) continue\n entries.push({ name: entry.name, startedAt: Number(match[1]) })\n if (entries.length > MAX_LOCAL_REGISTRY_FILES * 2) {\n entries.sort((left, right) => right.startedAt - left.startedAt)\n entries.length = MAX_LOCAL_REGISTRY_FILES\n }\n }\n entries.sort((left, right) => right.startedAt - left.startedAt)\n entries.length = Math.min(entries.length, MAX_LOCAL_REGISTRY_FILES)\n for (const entry of entries) {\n const target = path.join(directory, entry.name)\n const registration = await readRegistration(target)\n if (!registration || !isProcessAlive(registration.pid)) await rm(target, { force: true })\n }\n } catch {\n // Registry cleanup is best effort; publication and discovery still proceed.\n }\n}\n\nexport function parseDeveloperAction(input: unknown): DeveloperAction {\n if (!input || typeof input !== \"object\") throw new Error(\"Native automation input must be an object\")\n const value = input as Record<string, unknown>\n switch (value.action) {\n case \"inspect\": {\n if (value.ref !== undefined && typeof value.ref !== \"string\") throw new Error(\"inspect ref must be a ref from the latest inspection\")\n if (value.query !== undefined && (typeof value.query !== \"string\" || value.query.length > MAX_QUERY_LENGTH)) {\n throw new Error(`inspect query must be text of at most ${MAX_QUERY_LENGTH} characters`)\n }\n return { action: \"inspect\", ...(value.ref ? { ref: value.ref } : {}), ...(value.query?.trim() ? { query: value.query } : {}) }\n }\n case \"restart\":\n case \"screenshot\":\n return { action: value.action }\n case \"click\":\n if (typeof value.ref !== \"string\") throw new Error(\"click requires ref from the latest inspection\")\n return { action: \"click\", ref: value.ref }\n case \"type\":\n if (typeof value.ref !== \"string\" || typeof value.text !== \"string\") throw new Error(\"type requires ref and text\")\n if (value.clear !== undefined && typeof value.clear !== \"boolean\") throw new Error(\"type clear must be true or false\")\n return { action: \"type\", ref: value.ref, text: value.text, clear: value.clear !== false }\n case \"select\":\n if (typeof value.ref !== \"string\" || !Array.isArray(value.values) || value.values.length > MAX_SELECT_VALUES\n || !value.values.every(item => typeof item === \"string\")) {\n throw new Error(\"select requires ref and values: the option labels or values to choose\")\n }\n return { action: \"select\", ref: value.ref, values: value.values as string[] }\n default:\n throw new Error(\"Unsupported native automation action\")\n }\n}\n\nexport function parseBrowserAction(input: unknown): BrowserAction {\n if (!input || typeof input !== \"object\") throw new Error(\"Browser input must be an object\")\n const value = input as Record<string, unknown>\n switch (value.action) {\n case \"open\":\n case \"navigate\":\n if (typeof value.url !== \"string\") throw new Error(`${value.action} requires url`)\n return { action: value.action, url: value.url }\n case \"snapshot\":\n case \"screenshot\":\n return { action: value.action }\n case \"click\":\n if (typeof value.ref !== \"string\") throw new Error(\"click requires ref from the latest snapshot\")\n return { action: \"click\", ref: value.ref }\n case \"type\":\n if (typeof value.ref !== \"string\" || typeof value.text !== \"string\") throw new Error(\"type requires ref and text\")\n return { action: \"type\", ref: value.ref, text: value.text, clear: value.clear !== false }\n default:\n throw new Error(\"Unsupported browser action\")\n }\n}\n\n/** Fixed human-answer proof callback. The cookie exists only in this private\n * transport envelope; native storage/model output never receives it. */\nexport async function verifyHumanAnswerBridge(body: import(\"../missions/human-answer\").HumanAnswerProof, proof: string): Promise<boolean> {\n const { assertHumanAnswerFresh, humanAnswerProof } = await import(\"../missions/human-answer\")\n assertHumanAnswerFresh(body)\n for (const registration of await registrations()) {\n if (humanAnswerProof(body, registration.token) !== proof) continue\n try {\n const result = await callBridge(registration, { mode: \"human-answer-verify\", sessionID: body.sessionID, command: body })\n assertHumanAnswerFresh(body)\n return result.status === 200 && (result.body.result as { admitted?: unknown } | undefined)?.admitted === true\n } catch { return false }\n }\n return false\n}\n\nasync function registrations(pruneStale = true): Promise<DiscoveredBridgeRegistration[]> {\n const found: DiscoveredBridgeRegistration[] = []\n const directories = automationBridgeDirectories()\n for (const [directoryIndex, directory] of directories.entries()) {\n let entries: Array<{ name: string; startedAt: number }> = []\n const entryLimit = directoryIndex === 0 ? MAX_LOCAL_REGISTRY_FILES : MAX_REGISTRATIONS\n try {\n const stream = await opendir(directory)\n for await (const entry of stream) {\n if (!entry.isFile()) continue\n const match = REGISTRATION_NAME.exec(entry.name)\n if (!match) continue\n entries.push({ name: entry.name, startedAt: Number(match[1]) })\n if (entries.length > entryLimit * 2) {\n entries.sort((left, right) => right.startedAt - left.startedAt)\n entries.length = entryLimit\n }\n }\n } catch {\n continue\n }\n entries.sort((left, right) => right.startedAt - left.startedAt)\n entries.length = Math.min(entries.length, entryLimit)\n for (const entry of entries) {\n const target = path.join(directory, entry.name)\n const registration = await readRegistration(target) as DiscoveredBridgeRegistration | undefined\n if (!registration) continue\n if (directoryIndex === 0 && !isProcessAlive(registration.pid)) {\n if (pruneStale) await rm(target, { force: true }).catch(() => undefined)\n continue\n }\n if (process.platform === \"linux\" && process.env.WSL_DISTRO_NAME && directoryIndex > 0) registration[WINDOWS_INTEROP] = true\n found.push(registration)\n }\n }\n return found.sort((left, right) => right.startedAt - left.startedAt).slice(0, MAX_REGISTRATIONS)\n}\n\n/** An HMAC alone could identify an old registration. Demand a fresh response\n * from the selected live backend's existing authenticated bridge as well. */\nexport async function verifyRecurrenceBridge(body: RecurrenceControlProofBody, proof: string): Promise<boolean> {\n if (!/^[a-f0-9]{64}$/.test(proof)) return false\n for (const registration of await registrations(false)) {\n const digest = Buffer.from(signNativeRecurrenceControl(body, registration.token), \"hex\")\n if (!timingSafeEqual(digest, Buffer.from(proof, \"hex\"))) continue\n try {\n const reply = await callBridge(registration, { mode: \"recurrence-control-verify\", sessionID: body.sessionID, command: body })\n if (reply.status === 200 && reply.body.result && typeof reply.body.result === \"object\"\n && \"admitted\" in reply.body.result && reply.body.result.admitted === true) return true\n } catch { /* Missing backend is not a reusable human grant. */ }\n }\n return false\n}\n\nasync function callBridge(\n registration: DiscoveredBridgeRegistration,\n body: Record<string, unknown>,\n timeoutMs = PROBE_TIMEOUT_MS,\n): Promise<{ status: number; body: BridgeResponse }> {\n if (registration[WINDOWS_INTEROP]) return callWindowsBridge(registration, body, timeoutMs)\n const response = await fetch(registration.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"x-codenomad-automation-token\": registration.token },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(timeoutMs),\n })\n const contentLength = Number(response.headers.get(\"content-length\"))\n if (Number.isFinite(contentLength) && contentLength > MAX_BRIDGE_RESPONSE_BYTES) {\n throw new Error(\"Native automation bridge response is too large\")\n }\n const reader = response.body?.getReader()\n const chunks: Buffer[] = []\n let bytes = 0\n if (reader) {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n bytes += value.byteLength\n if (bytes > MAX_BRIDGE_RESPONSE_BYTES) {\n await reader.cancel()\n throw new Error(\"Native automation bridge response is too large\")\n }\n chunks.push(Buffer.from(value))\n }\n }\n return {\n status: response.status,\n body: JSON.parse(Buffer.concat(chunks, bytes).toString(\"utf8\")) as BridgeResponse,\n }\n}\n\nfunction callWindowsBridge(\n registration: AutomationBridgeRegistration,\n body: Record<string, unknown>,\n timeoutMs: number,\n): Promise<{ status: number; body: BridgeResponse }> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"curl.exe\", [\n \"--silent\", \"--show-error\", \"--max-time\", String(timeoutMs / 1_000),\n \"--request\", \"POST\",\n \"--header\", \"content-type: application/json\",\n \"--header\", `x-codenomad-automation-token: ${registration.token}`,\n \"--data-binary\", \"@-\",\n \"--write-out\", \"\\n%{http_code}\",\n registration.url,\n ], { stdio: [\"pipe\", \"pipe\", \"pipe\"], windowsHide: true })\n const stdout: Buffer[] = []\n const stderr: Buffer[] = []\n let stdoutBytes = 0\n let settled = false\n const finish = (error?: Error) => {\n if (settled) return false\n settled = true\n clearTimeout(timer)\n if (error) reject(error)\n return true\n }\n const timer = setTimeout(() => {\n child.kill()\n finish(new Error(\"Native automation bridge request timed out\"))\n }, timeoutMs)\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdoutBytes += chunk.length\n if (stdoutBytes > MAX_BRIDGE_RESPONSE_BYTES + 16) {\n child.kill()\n finish(new Error(\"Native automation bridge response is too large\"))\n return\n }\n stdout.push(chunk)\n })\n child.stderr.on(\"data\", (chunk: Buffer) => {\n if (stderr.reduce((total, value) => total + value.length, 0) < MAX_REGISTRATION_BYTES) stderr.push(chunk)\n })\n child.on(\"error\", (error) => finish(error))\n child.on(\"close\", (code) => {\n if (!finish()) return\n const output = Buffer.concat(stdout, stdoutBytes).toString(\"utf8\")\n const separator = output.lastIndexOf(\"\\n\")\n const status = separator >= 0 ? Number(output.slice(separator + 1)) : NaN\n if (code !== 0 || !Number.isInteger(status)) {\n reject(new Error(Buffer.concat(stderr).toString(\"utf8\").trim() || \"Windows native automation bridge request failed\"))\n return\n }\n try {\n resolve({ status, body: JSON.parse(output.slice(0, separator)) as BridgeResponse })\n } catch {\n reject(new Error(\"Native automation bridge returned an invalid response\"))\n }\n })\n child.stdin.on(\"error\", (error) => finish(error))\n child.stdin.end(JSON.stringify(body))\n })\n}\n\ninterface InspectionResult {\n target: { title: string; url: string }\n context: { windowId: string; instanceId: string | null; sessionId: string | null }\n snapshot: string\n collapsed: number\n diagnostics: Array<{ level: string; text: string }>\n}\n\n/** Plain text: an indented outline reads far cheaper than the same tree as indented JSON. */\nexport function formatInspection(result: InspectionResult): string {\n const { target, context } = result\n const lines = [\n `CodeNomad window ${context.windowId} · workspace ${context.instanceId ?? \"none\"} · conversation ${context.sessionId ?? \"none\"}`,\n `${target.title} — ${target.url}`,\n \"\",\n result.snapshot,\n ]\n if (result.collapsed > 0) {\n lines.push(\"\", \"A line ending in (+N hidden) collapses that element: inspect its ref to expand it. (+N more) stands for omitted siblings: inspect their parent's ref, or use query to find them.\")\n }\n if (result.diagnostics.length) lines.push(\"\", \"Runtime diagnostics:\", ...result.diagnostics.map(item => `- ${item.level}: ${item.text}`))\n return lines.join(\"\\n\")\n}\n\nfunction formatBridgeResult(resultValue: unknown, screenshot = { text: \"Captured the connected CodeNomad build.\", name: \"codenomad.png\" }) {\n const result = resultValue as { image?: { data: string; mime: string }; [key: string]: unknown } | undefined\n if (typeof result?.snapshot === \"string\" && result.target && result.context && Array.isArray(result.diagnostics)) {\n return { content: formatInspection(result as unknown as InspectionResult) }\n }\n if (result?.image) {\n const content = [\n { type: \"text\", text: screenshot.text },\n { type: \"file\", uri: `data:${result.image.mime};base64,${result.image.data}`, mime: result.image.mime, name: screenshot.name },\n ] as const\n return {\n content,\n }\n }\n return { content: JSON.stringify(result ?? null, null, 2) }\n}\n\nasync function probeBridge(registration: DiscoveredBridgeRegistration, sessionID: string): Promise<ProbedBridge | undefined> {\n try {\n const response = await callBridge(registration, { mode: \"developer-probe\", sessionID })\n const result = response.body.result as { available?: unknown; nativeIdentity?: unknown; runId?: unknown } | undefined\n return response.status === 200 && result?.available === true && typeof result.nativeIdentity === \"string\" && typeof result.runId === \"string\"\n ? { registration, nativeIdentity: result.nativeIdentity, runId: result.runId }\n : undefined\n } catch {\n return undefined\n }\n}\n\nasync function probeBridges(\n active: DiscoveredBridgeRegistration[],\n sessionID: string,\n options: { limit?: number; accept?: (bridge: ProbedBridge) => boolean } = {},\n): Promise<ProbedBridge[]> {\n const found: ProbedBridge[] = []\n const limit = options.limit ?? 2\n for (let index = 0; index < active.length && found.length < limit; index += PROBE_CONCURRENCY) {\n const batch = await Promise.all(active.slice(index, index + PROBE_CONCURRENCY)\n .map((registration) => probeBridge(registration, sessionID)))\n for (const value of batch) {\n if (value && (options.accept?.(value) ?? true)) found.push(value)\n }\n }\n return found.slice(0, limit)\n}\n\nasync function probeBrowserBridges(\n active: DiscoveredBridgeRegistration[],\n sessionID: string,\n mode: \"browser-claim\" | \"browser-probe\",\n timeoutMs = PROBE_TIMEOUT_MS,\n): Promise<DiscoveredBridgeRegistration[]> {\n const found: DiscoveredBridgeRegistration[] = []\n for (let index = 0; index < active.length && found.length < 2; index += PROBE_CONCURRENCY) {\n const batch = await Promise.all(active.slice(index, index + PROBE_CONCURRENCY).map(async (registration) => {\n try {\n return (await callBridge(registration, { mode, sessionID }, timeoutMs)).status === 200 ? registration : undefined\n } catch {\n return undefined\n }\n }))\n for (const registration of batch) {\n if (registration) found.push(registration)\n }\n }\n return found.slice(0, 2)\n}\n\nexport async function sendMissionInput(sessionID: string,\n kind: \"prompt\" | \"synthetic\" | \"cleanup\" | \"lifecycle\" | \"create-root\" | \"prepare\" | \"task-sessions\" | \"interrupt\", input: unknown): Promise<unknown> {\n const targets = await probeBrowserBridges(await registrations(), sessionID, \"browser-claim\", MISSION_PROBE_TIMEOUT_MS)\n if (targets.length !== 1) throw new Error(\"Mission dispatch requires exactly one owning CodeNomad backend\")\n const response = await callBridge(targets[0], { mode: \"mission-input\", sessionID, command: { kind, input } }, REQUEST_TIMEOUT_MS)\n if (response.status !== 200) {\n const recovery = missionRecoveryError(response.body.code)\n if (recovery && recovery.status === response.status) throw new MissionControlError(recovery.message, recovery.code)\n throw new Error(\"CodeNomad could not admit the mission input; inspect ownership/environment and retry the same task\")\n }\n return response.body.result\n}\n\nexport async function executeBrowserTool(sessionID: string, input: unknown) {\n const command = parseBrowserAction(input)\n const mode = command.action === \"open\" ? \"browser-claim\" : \"browser-probe\"\n const targets = await probeBrowserBridges(await registrations(), sessionID, mode)\n if (targets.length === 0) {\n throw new Error(command.action === \"open\"\n ? \"No local CodeNomad window owns this session\"\n : \"No visible local CodeNomad browser is attached to this session\")\n }\n if (targets.length > 1) {\n throw new Error(command.action === \"open\"\n ? \"Multiple CodeNomad instances own this session\"\n : \"Multiple CodeNomad windows expose a browser for this session\")\n }\n const response = await callBridge(targets[0], { mode: \"browser-execute\", sessionID, command }, REQUEST_TIMEOUT_MS)\n if (response.status !== 200) throw new Error(response.body.error || `Browser command failed (${response.status})`)\n return formatBridgeResult(response.body.result, { text: \"Captured the visible CodeNomad browser.\", name: \"browser.png\" })\n}\n\nasync function executeDeveloperTool(inspectedTargets: Map<string, ProbedBridge>, sessionID: string, command: DeveloperAction) {\n let target = inspectedTargets.get(sessionID)\n if (command.action === \"inspect\") {\n const targets = await probeBridges(await registrations(), sessionID)\n if (targets.length === 0) throw new Error(\"No visible CodeNomad session is available for native automation\")\n if (targets.length > 1) throw new Error(\"Multiple CodeNomad instances expose native automation for this session\")\n target = targets[0]\n } else if (!target) {\n throw new Error(\"Run codenomad.inspect before acting on or restarting CodeNomad\")\n }\n const existingTokens = command.action === \"restart\"\n ? new Set((await registrations()).map((registration) => registration.token))\n : undefined\n const response = await callBridge(target.registration, { mode: \"developer-execute\", sessionID, command }, REQUEST_TIMEOUT_MS)\n if (response.status !== 200) throw new Error(response.body.error || `Native automation failed (${response.status})`)\n if (command.action === \"restart\") {\n return waitForRestart(inspectedTargets, sessionID, target.nativeIdentity, target.runId, existingTokens!)\n }\n if (command.action === \"inspect\") inspectedTargets.set(sessionID, target)\n return formatBridgeResult(response.body.result)\n}\n\nasync function waitForRestart(\n inspectedTargets: Map<string, ProbedBridge>,\n sessionID: string,\n nativeIdentity: string,\n previousRunId: string,\n existingTokens: ReadonlySet<string>,\n) {\n const deadline = Date.now() + REQUEST_TIMEOUT_MS\n while (Date.now() < deadline) {\n const active = await registrations()\n const candidates = await probeBridges(\n active.filter((registration) => !existingTokens.has(registration.token)),\n sessionID,\n {\n limit: 1,\n accept: (candidate) => candidate.nativeIdentity === nativeIdentity && candidate.runId !== previousRunId,\n },\n )\n for (const candidate of candidates) {\n try {\n const inspection = await callBridge(candidate.registration, {\n mode: \"developer-execute\",\n sessionID,\n command: { action: \"inspect\" },\n }, INSPECTION_TIMEOUT_MS)\n if (inspection.status === 200) {\n inspectedTargets.set(sessionID, candidate)\n return formatBridgeResult(inspection.body.result)\n }\n } catch {\n // The desktop backend and renderer become ready at different points during relaunch.\n }\n }\n await new Promise((resolve) => setTimeout(resolve, Math.min(RECONNECT_INTERVAL_MS, Math.max(0, deadline - Date.now()))))\n }\n throw new Error(\"CodeNomad did not reconnect to the persistent OpenCode session after restart\")\n}\n\nexport function createDeveloperToolTransform() {\n const inspectedTargets = new Map<string, ProbedBridge>()\n return (draft: Pick<ToolDraft, \"add\">) => {\n draft.add({\n name: \"inspect\",\n description: \"Inspect the connected CodeNomad desktop build: an indented accessibility outline with element refs, runtime diagnostics and the visible conversation. Large parts are collapsed and say so; pass ref to expand one element's subtree, or query to keep only elements whose text or role matches, with their ancestors.\",\n input: {\n type: \"object\",\n properties: {\n ref: { type: \"string\", description: \"Expand only this element's subtree (a ref from the latest inspection)\" },\n query: { type: \"string\", description: \"Keep only elements whose name, value or description contains this text, or whose role is exactly this text\" },\n },\n additionalProperties: false,\n },\n options: { namespace: \"codenomad\", codemode: false },\n execute: (input, tool) => executeDeveloperTool(inspectedTargets, tool.sessionID,\n parseDeveloperAction({ ...(input && typeof input === \"object\" ? input : {}), action: \"inspect\" })),\n })\n draft.add({\n name: \"act\",\n description: \"Act on a ref from the latest codenomad.inspect: click it, type into a field (replacing its text unless clear is false), or select native <select> options by label or value. restart gracefully relaunches CodeNomad and waits for reconnection.\",\n input: {\n type: \"object\",\n properties: {\n action: { type: \"string\", enum: [\"click\", \"type\", \"select\", \"restart\"] },\n ref: { type: \"string\", description: \"Element ref from the latest inspection\" },\n text: { type: \"string\", description: \"Text for type\" },\n clear: { type: \"boolean\", description: \"type only: replace the field's current text (default true); false appends\" },\n values: { type: \"array\", items: { type: \"string\" }, description: \"select only: option labels or values to choose; one for an ordinary select\" },\n },\n required: [\"action\"],\n additionalProperties: false,\n },\n options: { namespace: \"codenomad\", codemode: false },\n execute: (input, tool) => executeDeveloperTool(inspectedTargets, tool.sessionID, parseDeveloperAction(input)),\n })\n draft.add({\n name: \"screenshot\",\n description: \"Capture the visible page of the connected CodeNomad desktop build.\",\n input: { type: \"object\", properties: {}, additionalProperties: false },\n options: { namespace: \"codenomad\", codemode: false },\n execute: (_input, tool) => executeDeveloperTool(inspectedTargets, tool.sessionID, { action: \"screenshot\" }),\n })\n }\n}\n\nexport async function setupAutomationPlugin(context: AutomationPluginContext): Promise<void> {\n await context.tool.transform(createDeveloperToolTransform())\n}\n"]}
1
+ {"version":3,"file":"automation-plugin.js","sourceRoot":"","sources":["../../src/opencode/automation-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes, timingSafeEqual } from \"node:crypto\"\nimport { execFileSync, spawn } from \"node:child_process\"\nimport { mkdir, open, opendir, readFile, rename, rm, writeFile } from \"node:fs/promises\"\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport type { Plugin } from \"@opencode/plugin\"\nimport { MissionControlError } from \"../missions/control-error\"\nimport { signNativeRecurrenceControl, type RecurrenceControlProofBody } from \"../missions/recurrence-control-proof\"\nimport { missionRecoveryError } from \"../missions/recovery-error\"\nimport { PAGE_ACTION_PROPERTIES, PAGE_ACTIONS, parsePageAction, type RefAction } from \"../automation/page/parse\"\n\nexport const AUTOMATION_BRIDGE_PATH = \"/api/opencode-plugin/automation\"\nconst REQUEST_TIMEOUT_MS = 95_000\nconst PROBE_TIMEOUT_MS = 5_000\n// Mission ownership may require a cold, validated linked-worktree inventory.\nconst MISSION_PROBE_TIMEOUT_MS = 30_000\nconst INSPECTION_TIMEOUT_MS = 15_000\nconst RECONNECT_INTERVAL_MS = 250\nconst MAX_REGISTRATIONS = 64\nconst MAX_LOCAL_REGISTRY_FILES = 4096\nconst MAX_REGISTRATION_BYTES = 4 * 1024\nconst MAX_BRIDGE_RESPONSE_BYTES = 8 * 1024 * 1024\nconst PROBE_CONCURRENCY = 4\nconst REGISTRATION_NAME = /^(\\d+)-\\d+-[A-Za-z0-9_-]+\\.json$/\nconst WINDOWS_INTEROP = Symbol(\"windowsInterop\")\nlet cachedWslWindowsLocalAppData: string | null | undefined\n\nexport type DeveloperAction =\n | { action: \"inspect\"; ref?: string; query?: string }\n | RefAction\n | { action: \"restart\" }\n | { action: \"screenshot\" }\n\nconst MAX_QUERY_LENGTH = 200\n\nexport type BrowserAction =\n | { action: \"open\"; url: string }\n | { action: \"navigate\"; url: string }\n | { action: \"snapshot\"; ref?: string; query?: string }\n | RefAction\n | { action: \"screenshot\" }\n\nexport interface AutomationBridgeRegistration {\n version: 1\n url: string\n token: string\n pid: number\n startedAt: number\n}\n\ntype ToolDraft = Parameters<Parameters<Plugin.Context[\"tool\"][\"transform\"]>[0]>[0]\ninterface AutomationPluginContext {\n tool: { transform(callback: (draft: Pick<ToolDraft, \"add\">) => void): Promise<unknown> }\n}\n\ninterface BridgeResponse {\n result?: unknown\n error?: string\n code?: unknown\n}\n\ninterface ProbedBridge {\n registration: DiscoveredBridgeRegistration\n nativeIdentity: string\n runId: string\n}\n\ntype DiscoveredBridgeRegistration = AutomationBridgeRegistration & { [WINDOWS_INTEROP]?: true }\n\nexport function automationBridgeDirectory(): string {\n return automationBridgeDirectories()[0]\n}\n\nexport function automationBridgeDirectories(options: {\n platform?: NodeJS.Platform\n env?: NodeJS.ProcessEnv\n home?: string\n windowsLocalAppData?: string\n} = {}): string[] {\n const platform = options.platform ?? process.platform\n const env = options.env ?? process.env\n const paths = platform === \"win32\" ? path.win32 : path.posix\n const home = options.home ?? os.homedir()\n const primary = platform === \"win32\" && env.LOCALAPPDATA\n ? paths.join(env.LOCALAPPDATA, \"CodeNomad\", \"automation-bridges\")\n : env.XDG_RUNTIME_DIR\n ? paths.join(env.XDG_RUNTIME_DIR, \"codenomad\", \"automation-bridges\")\n : paths.join(home, \".config\", \"codenomad\", \"automation-bridges\")\n if (platform !== \"linux\" || !env.WSL_DISTRO_NAME) return [primary]\n const windowsLocalAppData = options.windowsLocalAppData ?? resolveWslWindowsLocalAppData()\n return windowsLocalAppData\n ? [...new Set([primary, path.posix.join(windowsLocalAppData, \"CodeNomad\", \"automation-bridges\")])]\n : [primary]\n}\n\nfunction resolveWslWindowsLocalAppData(): string | undefined {\n if (cachedWslWindowsLocalAppData !== undefined) return cachedWslWindowsLocalAppData ?? undefined\n try {\n const windowsPath = execFileSync(\"cmd.exe\", [\"/d\", \"/s\", \"/c\", \"echo %LOCALAPPDATA%\"], {\n encoding: \"utf8\",\n timeout: 2_000,\n windowsHide: true,\n }).trim()\n const translated = execFileSync(\"wslpath\", [\"-u\", windowsPath], {\n encoding: \"utf8\",\n timeout: 2_000,\n }).trim()\n cachedWslWindowsLocalAppData = path.posix.isAbsolute(translated) ? translated : null\n } catch {\n cachedWslWindowsLocalAppData = null\n }\n return cachedWslWindowsLocalAppData ?? undefined\n}\n\nexport function createAutomationBridgeRegistration(url: string): AutomationBridgeRegistration {\n return {\n version: 1,\n url: new URL(AUTOMATION_BRIDGE_PATH, url).href,\n token: randomBytes(32).toString(\"base64url\"),\n pid: process.pid,\n startedAt: Date.now(),\n }\n}\n\nexport async function publishAutomationBridge(registration: AutomationBridgeRegistration): Promise<() => Promise<void>> {\n const directory = automationBridgeDirectory()\n await mkdir(directory, { recursive: true })\n await pruneDeadLocalRegistrations(directory)\n const published = { ...registration, startedAt: Date.now() }\n const target = path.join(directory, `${published.startedAt}-${published.pid}-${published.token.slice(0, 12)}.json`)\n await writeAtomic(target, `${JSON.stringify(published)}\\n`)\n return () => rm(target, { force: true })\n}\n\nexport async function removeLegacyAutomationPlugin(\n configRoot = process.env.XDG_CONFIG_HOME || path.join(os.homedir(), \".config\"),\n): Promise<boolean> {\n const pluginPath = path.join(configRoot, \"opencode\", \"plugins\", \"codenomad-automation.ts\")\n let source: string\n try {\n source = await readFile(pluginPath, \"utf8\")\n } catch {\n return false\n }\n if (!isLegacyAutomationPlugin(source)) return false\n await rm(pluginPath, { force: true })\n return true\n}\n\nexport function isLegacyAutomationPlugin(source: string): boolean {\n const match = /^export \\{ default \\} from (\"(?:[^\"\\\\]|\\\\.)*\")\\s*$/.exec(source)\n if (!match) return false\n let target: URL\n try {\n target = new URL(JSON.parse(match[1]) as string)\n } catch {\n return false\n }\n if (target.protocol !== \"file:\" || !/(?:\\/server\\/dist|\\/packages\\/server\\/src)\\/opencode\\/automation-plugin\\.(?:js|ts)$/.test(target.pathname)) {\n return false\n }\n return true\n}\n\nasync function writeAtomic(target: string, content: string): Promise<void> {\n const temporary = `${target}.${process.pid}.${randomBytes(6).toString(\"hex\")}.tmp`\n await writeFile(temporary, content, { encoding: \"utf8\", mode: 0o600 })\n await rename(temporary, target)\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0)\n return true\n } catch (error) {\n return (error as NodeJS.ErrnoException).code === \"EPERM\"\n }\n}\n\nasync function readRegistration(target: string): Promise<AutomationBridgeRegistration | undefined> {\n try {\n const file = await open(target, \"r\")\n const buffer = Buffer.alloc(MAX_REGISTRATION_BYTES + 1)\n let bytesRead = 0\n try {\n bytesRead = (await file.read(buffer, 0, buffer.length, 0)).bytesRead\n } finally {\n await file.close()\n }\n if (bytesRead > MAX_REGISTRATION_BYTES) return undefined\n const value = JSON.parse(buffer.subarray(0, bytesRead).toString(\"utf8\")) as Partial<AutomationBridgeRegistration>\n if (value.version !== 1 || typeof value.url !== \"string\" || typeof value.token !== \"string\"\n || !Number.isSafeInteger(value.pid) || value.pid! <= 0\n || !Number.isSafeInteger(value.startedAt) || value.startedAt! <= 0) return undefined\n const url = new URL(value.url)\n if (url.protocol !== \"http:\" || url.hostname !== \"127.0.0.1\" || url.pathname !== AUTOMATION_BRIDGE_PATH) return undefined\n return value as AutomationBridgeRegistration\n } catch {\n return undefined\n }\n}\n\nasync function pruneDeadLocalRegistrations(directory: string): Promise<void> {\n try {\n const stream = await opendir(directory)\n const entries: Array<{ name: string; startedAt: number }> = []\n for await (const entry of stream) {\n if (!entry.isFile()) continue\n const match = REGISTRATION_NAME.exec(entry.name)\n if (!match) continue\n entries.push({ name: entry.name, startedAt: Number(match[1]) })\n if (entries.length > MAX_LOCAL_REGISTRY_FILES * 2) {\n entries.sort((left, right) => right.startedAt - left.startedAt)\n entries.length = MAX_LOCAL_REGISTRY_FILES\n }\n }\n entries.sort((left, right) => right.startedAt - left.startedAt)\n entries.length = Math.min(entries.length, MAX_LOCAL_REGISTRY_FILES)\n for (const entry of entries) {\n const target = path.join(directory, entry.name)\n const registration = await readRegistration(target)\n if (!registration || !isProcessAlive(registration.pid)) await rm(target, { force: true })\n }\n } catch {\n // Registry cleanup is best effort; publication and discovery still proceed.\n }\n}\n\nexport function parseDeveloperAction(input: unknown): DeveloperAction {\n if (!input || typeof input !== \"object\") throw new Error(\"Native automation input must be an object\")\n const value = input as Record<string, unknown>\n switch (value.action) {\n case \"inspect\": {\n return { action: \"inspect\", ...inspectionScope(value, \"inspect\") }\n }\n case \"restart\":\n case \"screenshot\":\n return { action: value.action }\n default: {\n const page = parsePageAction(value, \"inspection\")\n if (!page) throw new Error(\"Unsupported native automation action\")\n return page\n }\n }\n}\n\nexport function parseBrowserAction(input: unknown): BrowserAction {\n if (!input || typeof input !== \"object\") throw new Error(\"Browser input must be an object\")\n const value = input as Record<string, unknown>\n switch (value.action) {\n case \"open\":\n case \"navigate\":\n if (typeof value.url !== \"string\") throw new Error(`${value.action} requires url`)\n return { action: value.action, url: value.url }\n case \"snapshot\":\n return { action: \"snapshot\", ...inspectionScope(value, \"snapshot\") }\n case \"screenshot\":\n return { action: value.action }\n default: {\n const page = parsePageAction(value, \"snapshot\")\n if (!page) throw new Error(\"Unsupported browser action\")\n return page\n }\n }\n}\n\nfunction inspectionScope(value: Record<string, unknown>, action: string): { ref?: string; query?: string } {\n if (value.ref !== undefined && typeof value.ref !== \"string\") throw new Error(`${action} ref must be a ref from the latest inspection`)\n if (value.query !== undefined && (typeof value.query !== \"string\" || value.query.length > MAX_QUERY_LENGTH)) {\n throw new Error(`${action} query must be text of at most ${MAX_QUERY_LENGTH} characters`)\n }\n return { ...(value.ref ? { ref: value.ref as string } : {}),\n ...(typeof value.query === \"string\" && value.query.trim() ? { query: value.query } : {}) }\n}\n\n/** Fixed human-answer proof callback. The cookie exists only in this private\n * transport envelope; native storage/model output never receives it. */\nexport async function verifyHumanAnswerBridge(body: import(\"../missions/human-answer\").HumanAnswerProof, proof: string): Promise<boolean> {\n const { assertHumanAnswerFresh, humanAnswerProof } = await import(\"../missions/human-answer\")\n assertHumanAnswerFresh(body)\n for (const registration of await registrations()) {\n if (humanAnswerProof(body, registration.token) !== proof) continue\n try {\n const result = await callBridge(registration, { mode: \"human-answer-verify\", sessionID: body.sessionID, command: body })\n assertHumanAnswerFresh(body)\n return result.status === 200 && (result.body.result as { admitted?: unknown } | undefined)?.admitted === true\n } catch { return false }\n }\n return false\n}\n\nasync function registrations(pruneStale = true): Promise<DiscoveredBridgeRegistration[]> {\n const found: DiscoveredBridgeRegistration[] = []\n const directories = automationBridgeDirectories()\n for (const [directoryIndex, directory] of directories.entries()) {\n let entries: Array<{ name: string; startedAt: number }> = []\n const entryLimit = directoryIndex === 0 ? MAX_LOCAL_REGISTRY_FILES : MAX_REGISTRATIONS\n try {\n const stream = await opendir(directory)\n for await (const entry of stream) {\n if (!entry.isFile()) continue\n const match = REGISTRATION_NAME.exec(entry.name)\n if (!match) continue\n entries.push({ name: entry.name, startedAt: Number(match[1]) })\n if (entries.length > entryLimit * 2) {\n entries.sort((left, right) => right.startedAt - left.startedAt)\n entries.length = entryLimit\n }\n }\n } catch {\n continue\n }\n entries.sort((left, right) => right.startedAt - left.startedAt)\n entries.length = Math.min(entries.length, entryLimit)\n for (const entry of entries) {\n const target = path.join(directory, entry.name)\n const registration = await readRegistration(target) as DiscoveredBridgeRegistration | undefined\n if (!registration) continue\n if (directoryIndex === 0 && !isProcessAlive(registration.pid)) {\n if (pruneStale) await rm(target, { force: true }).catch(() => undefined)\n continue\n }\n if (process.platform === \"linux\" && process.env.WSL_DISTRO_NAME && directoryIndex > 0) registration[WINDOWS_INTEROP] = true\n found.push(registration)\n }\n }\n return found.sort((left, right) => right.startedAt - left.startedAt).slice(0, MAX_REGISTRATIONS)\n}\n\n/** An HMAC alone could identify an old registration. Demand a fresh response\n * from the selected live backend's existing authenticated bridge as well. */\nexport async function verifyRecurrenceBridge(body: RecurrenceControlProofBody, proof: string): Promise<boolean> {\n if (!/^[a-f0-9]{64}$/.test(proof)) return false\n for (const registration of await registrations(false)) {\n const digest = Buffer.from(signNativeRecurrenceControl(body, registration.token), \"hex\")\n if (!timingSafeEqual(digest, Buffer.from(proof, \"hex\"))) continue\n try {\n const reply = await callBridge(registration, { mode: \"recurrence-control-verify\", sessionID: body.sessionID, command: body })\n if (reply.status === 200 && reply.body.result && typeof reply.body.result === \"object\"\n && \"admitted\" in reply.body.result && reply.body.result.admitted === true) return true\n } catch { /* Missing backend is not a reusable human grant. */ }\n }\n return false\n}\n\nasync function callBridge(\n registration: DiscoveredBridgeRegistration,\n body: Record<string, unknown>,\n timeoutMs = PROBE_TIMEOUT_MS,\n): Promise<{ status: number; body: BridgeResponse }> {\n if (registration[WINDOWS_INTEROP]) return callWindowsBridge(registration, body, timeoutMs)\n const response = await fetch(registration.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", \"x-codenomad-automation-token\": registration.token },\n body: JSON.stringify(body),\n signal: AbortSignal.timeout(timeoutMs),\n })\n const contentLength = Number(response.headers.get(\"content-length\"))\n if (Number.isFinite(contentLength) && contentLength > MAX_BRIDGE_RESPONSE_BYTES) {\n throw new Error(\"Native automation bridge response is too large\")\n }\n const reader = response.body?.getReader()\n const chunks: Buffer[] = []\n let bytes = 0\n if (reader) {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n bytes += value.byteLength\n if (bytes > MAX_BRIDGE_RESPONSE_BYTES) {\n await reader.cancel()\n throw new Error(\"Native automation bridge response is too large\")\n }\n chunks.push(Buffer.from(value))\n }\n }\n return {\n status: response.status,\n body: JSON.parse(Buffer.concat(chunks, bytes).toString(\"utf8\")) as BridgeResponse,\n }\n}\n\nfunction callWindowsBridge(\n registration: AutomationBridgeRegistration,\n body: Record<string, unknown>,\n timeoutMs: number,\n): Promise<{ status: number; body: BridgeResponse }> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"curl.exe\", [\n \"--silent\", \"--show-error\", \"--max-time\", String(timeoutMs / 1_000),\n \"--request\", \"POST\",\n \"--header\", \"content-type: application/json\",\n \"--header\", `x-codenomad-automation-token: ${registration.token}`,\n \"--data-binary\", \"@-\",\n \"--write-out\", \"\\n%{http_code}\",\n registration.url,\n ], { stdio: [\"pipe\", \"pipe\", \"pipe\"], windowsHide: true })\n const stdout: Buffer[] = []\n const stderr: Buffer[] = []\n let stdoutBytes = 0\n let settled = false\n const finish = (error?: Error) => {\n if (settled) return false\n settled = true\n clearTimeout(timer)\n if (error) reject(error)\n return true\n }\n const timer = setTimeout(() => {\n child.kill()\n finish(new Error(\"Native automation bridge request timed out\"))\n }, timeoutMs)\n child.stdout.on(\"data\", (chunk: Buffer) => {\n stdoutBytes += chunk.length\n if (stdoutBytes > MAX_BRIDGE_RESPONSE_BYTES + 16) {\n child.kill()\n finish(new Error(\"Native automation bridge response is too large\"))\n return\n }\n stdout.push(chunk)\n })\n child.stderr.on(\"data\", (chunk: Buffer) => {\n if (stderr.reduce((total, value) => total + value.length, 0) < MAX_REGISTRATION_BYTES) stderr.push(chunk)\n })\n child.on(\"error\", (error) => finish(error))\n child.on(\"close\", (code) => {\n if (!finish()) return\n const output = Buffer.concat(stdout, stdoutBytes).toString(\"utf8\")\n const separator = output.lastIndexOf(\"\\n\")\n const status = separator >= 0 ? Number(output.slice(separator + 1)) : NaN\n if (code !== 0 || !Number.isInteger(status)) {\n reject(new Error(Buffer.concat(stderr).toString(\"utf8\").trim() || \"Windows native automation bridge request failed\"))\n return\n }\n try {\n resolve({ status, body: JSON.parse(output.slice(0, separator)) as BridgeResponse })\n } catch {\n reject(new Error(\"Native automation bridge returned an invalid response\"))\n }\n })\n child.stdin.on(\"error\", (error) => finish(error))\n child.stdin.end(JSON.stringify(body))\n })\n}\n\ninterface InspectionResult {\n target: { title: string; url: string }\n context: { windowId: string; instanceId: string | null; sessionId: string | null }\n snapshot: string\n collapsed: number\n diagnostics: Array<{ level: string; text: string }>\n}\n\n/** Plain text: an indented outline reads far cheaper than the same tree as indented JSON. */\nexport function formatInspection(result: InspectionResult): string {\n const { target, context } = result\n const lines = [\n `CodeNomad window ${context.windowId} · workspace ${context.instanceId ?? \"none\"} · conversation ${context.sessionId ?? \"none\"}`,\n `${target.title} — ${target.url}`,\n \"\",\n result.snapshot,\n ]\n if (result.collapsed > 0) {\n lines.push(\"\", \"A line ending in (+N hidden) collapses that element: inspect its ref to expand it. (+N more) stands for omitted siblings: inspect their parent's ref, or use query to find them.\")\n }\n if (result.diagnostics.length) lines.push(\"\", \"Runtime diagnostics:\", ...result.diagnostics.map(item => `- ${item.level}: ${item.text}`))\n return lines.join(\"\\n\")\n}\n\nexport function formatBrowserSnapshot(result: { url: string; snapshot: string; collapsed?: number }): string {\n return `${result.url}\\n\\n${result.snapshot}${result.collapsed ? \"\\n\\nCollapsed elements: snapshot with their ref to expand them. (+N more) omits siblings: use their parent's ref or query to find them.\" : \"\"}`\n}\n\nfunction formatBridgeResult(resultValue: unknown, screenshot = { text: \"Captured the connected CodeNomad build.\", name: \"codenomad.png\" }) {\n const result = resultValue as { image?: { data: string; mime: string }; [key: string]: unknown } | undefined\n if (typeof result?.snapshot === \"string\" && result.target && result.context && Array.isArray(result.diagnostics)) {\n return { content: formatInspection(result as unknown as InspectionResult) }\n }\n if (typeof result?.snapshot === \"string\" && typeof result.url === \"string\") {\n return { content: formatBrowserSnapshot(result as { url: string; snapshot: string; collapsed?: number }) }\n }\n if (result?.image) {\n const content = [\n { type: \"text\", text: screenshot.text },\n { type: \"file\", uri: `data:${result.image.mime};base64,${result.image.data}`, mime: result.image.mime, name: screenshot.name },\n ] as const\n return {\n content,\n }\n }\n return { content: JSON.stringify(result ?? null, null, 2) }\n}\n\nasync function probeBridge(registration: DiscoveredBridgeRegistration, sessionID: string): Promise<ProbedBridge | undefined> {\n try {\n const response = await callBridge(registration, { mode: \"developer-probe\", sessionID })\n const result = response.body.result as { available?: unknown; nativeIdentity?: unknown; runId?: unknown } | undefined\n return response.status === 200 && result?.available === true && typeof result.nativeIdentity === \"string\" && typeof result.runId === \"string\"\n ? { registration, nativeIdentity: result.nativeIdentity, runId: result.runId }\n : undefined\n } catch {\n return undefined\n }\n}\n\nasync function probeBridges(\n active: DiscoveredBridgeRegistration[],\n sessionID: string,\n options: { limit?: number; accept?: (bridge: ProbedBridge) => boolean } = {},\n): Promise<ProbedBridge[]> {\n const found: ProbedBridge[] = []\n const limit = options.limit ?? 2\n for (let index = 0; index < active.length && found.length < limit; index += PROBE_CONCURRENCY) {\n const batch = await Promise.all(active.slice(index, index + PROBE_CONCURRENCY)\n .map((registration) => probeBridge(registration, sessionID)))\n for (const value of batch) {\n if (value && (options.accept?.(value) ?? true)) found.push(value)\n }\n }\n return found.slice(0, limit)\n}\n\nasync function probeBrowserBridges(\n active: DiscoveredBridgeRegistration[],\n sessionID: string,\n mode: \"browser-claim\" | \"browser-probe\",\n timeoutMs = PROBE_TIMEOUT_MS,\n): Promise<DiscoveredBridgeRegistration[]> {\n const found: DiscoveredBridgeRegistration[] = []\n for (let index = 0; index < active.length && found.length < 2; index += PROBE_CONCURRENCY) {\n const batch = await Promise.all(active.slice(index, index + PROBE_CONCURRENCY).map(async (registration) => {\n try {\n return (await callBridge(registration, { mode, sessionID }, timeoutMs)).status === 200 ? registration : undefined\n } catch {\n return undefined\n }\n }))\n for (const registration of batch) {\n if (registration) found.push(registration)\n }\n }\n return found.slice(0, 2)\n}\n\nexport async function sendMissionInput(sessionID: string,\n kind: \"prompt\" | \"synthetic\" | \"cleanup\" | \"lifecycle\" | \"create-root\" | \"prepare\" | \"task-sessions\" | \"interrupt\", input: unknown): Promise<unknown> {\n const targets = await probeBrowserBridges(await registrations(), sessionID, \"browser-claim\", MISSION_PROBE_TIMEOUT_MS)\n if (targets.length !== 1) throw new Error(\"Mission dispatch requires exactly one owning CodeNomad backend\")\n const response = await callBridge(targets[0], { mode: \"mission-input\", sessionID, command: { kind, input } }, REQUEST_TIMEOUT_MS)\n if (response.status !== 200) {\n const recovery = missionRecoveryError(response.body.code)\n if (recovery && recovery.status === response.status) throw new MissionControlError(recovery.message, recovery.code)\n throw new Error(\"CodeNomad could not admit the mission input; inspect ownership/environment and retry the same task\")\n }\n return response.body.result\n}\n\nexport async function executeBrowserTool(sessionID: string, input: unknown) {\n const command = parseBrowserAction(input)\n const mode = command.action === \"open\" ? \"browser-claim\" : \"browser-probe\"\n const targets = await probeBrowserBridges(await registrations(), sessionID, mode)\n if (targets.length === 0) {\n throw new Error(command.action === \"open\"\n ? \"No local CodeNomad window owns this session\"\n : \"No visible local CodeNomad browser is attached to this session\")\n }\n if (targets.length > 1) {\n throw new Error(command.action === \"open\"\n ? \"Multiple CodeNomad instances own this session\"\n : \"Multiple CodeNomad windows expose a browser for this session\")\n }\n const response = await callBridge(targets[0], { mode: \"browser-execute\", sessionID, command }, REQUEST_TIMEOUT_MS)\n if (response.status !== 200) throw new Error(response.body.error || `Browser command failed (${response.status})`)\n return formatBridgeResult(response.body.result, { text: \"Captured the visible CodeNomad browser.\", name: \"browser.png\" })\n}\n\nasync function executeDeveloperTool(inspectedTargets: Map<string, ProbedBridge>, sessionID: string, command: DeveloperAction) {\n let target = inspectedTargets.get(sessionID)\n if (command.action === \"inspect\") {\n const targets = await probeBridges(await registrations(), sessionID)\n if (targets.length === 0) throw new Error(\"No visible CodeNomad session is available for native automation\")\n if (targets.length > 1) throw new Error(\"Multiple CodeNomad instances expose native automation for this session\")\n target = targets[0]\n } else if (!target) {\n throw new Error(\"Run codenomad.inspect before acting on or restarting CodeNomad\")\n }\n const existingTokens = command.action === \"restart\"\n ? new Set((await registrations()).map((registration) => registration.token))\n : undefined\n const response = await callBridge(target.registration, { mode: \"developer-execute\", sessionID, command }, REQUEST_TIMEOUT_MS)\n if (response.status !== 200) throw new Error(response.body.error || `Native automation failed (${response.status})`)\n if (command.action === \"restart\") {\n return waitForRestart(inspectedTargets, sessionID, target.nativeIdentity, target.runId, existingTokens!)\n }\n if (command.action === \"inspect\") inspectedTargets.set(sessionID, target)\n return formatBridgeResult(response.body.result)\n}\n\nasync function waitForRestart(\n inspectedTargets: Map<string, ProbedBridge>,\n sessionID: string,\n nativeIdentity: string,\n previousRunId: string,\n existingTokens: ReadonlySet<string>,\n) {\n const deadline = Date.now() + REQUEST_TIMEOUT_MS\n while (Date.now() < deadline) {\n const active = await registrations()\n const candidates = await probeBridges(\n active.filter((registration) => !existingTokens.has(registration.token)),\n sessionID,\n {\n limit: 1,\n accept: (candidate) => candidate.nativeIdentity === nativeIdentity && candidate.runId !== previousRunId,\n },\n )\n for (const candidate of candidates) {\n try {\n const inspection = await callBridge(candidate.registration, {\n mode: \"developer-execute\",\n sessionID,\n command: { action: \"inspect\" },\n }, INSPECTION_TIMEOUT_MS)\n if (inspection.status === 200) {\n inspectedTargets.set(sessionID, candidate)\n return formatBridgeResult(inspection.body.result)\n }\n } catch {\n // The desktop backend and renderer become ready at different points during relaunch.\n }\n }\n await new Promise((resolve) => setTimeout(resolve, Math.min(RECONNECT_INTERVAL_MS, Math.max(0, deadline - Date.now()))))\n }\n throw new Error(\"CodeNomad did not reconnect to the persistent OpenCode session after restart\")\n}\n\nexport function createDeveloperToolTransform() {\n const inspectedTargets = new Map<string, ProbedBridge>()\n return (draft: Pick<ToolDraft, \"add\">) => {\n draft.add({\n name: \"inspect\",\n description: \"Inspect the connected CodeNomad desktop build: an indented accessibility outline with element refs, runtime diagnostics and the visible conversation. Large parts are collapsed and say so; pass ref to expand one element's subtree, or query to keep only elements whose text or role matches, with their ancestors.\",\n input: {\n type: \"object\",\n properties: {\n ref: { type: \"string\", description: \"Expand only this element's subtree (a ref from the latest inspection)\" },\n query: { type: \"string\", description: \"Keep only elements whose name, value or description contains this text, or whose role is exactly this text\" },\n },\n additionalProperties: false,\n },\n options: { namespace: \"codenomad\", codemode: false },\n execute: (input, tool) => executeDeveloperTool(inspectedTargets, tool.sessionID,\n parseDeveloperAction({ ...(input && typeof input === \"object\" ? input : {}), action: \"inspect\" })),\n })\n draft.add({\n name: \"act\",\n description: \"Act on refs from the latest codenomad.inspect like a user: click (real pointer at the element's visible centre, refused when covered), type into a field (replacing its text unless clear is false), select native <select> options by label or value, hover, drag onto another ref, scroll (a ref or the page), press a key or chord (optionally after focusing a ref), or wait for text to appear or disappear. restart gracefully relaunches CodeNomad and waits for reconnection.\",\n input: {\n type: \"object\",\n properties: {\n action: { type: \"string\", enum: [...PAGE_ACTIONS, \"restart\"] },\n ...PAGE_ACTION_PROPERTIES,\n },\n required: [\"action\"],\n additionalProperties: false,\n },\n options: { namespace: \"codenomad\", codemode: false },\n execute: (input, tool) => executeDeveloperTool(inspectedTargets, tool.sessionID, parseDeveloperAction(input)),\n })\n draft.add({\n name: \"screenshot\",\n description: \"Capture the visible page of the connected CodeNomad desktop build.\",\n input: { type: \"object\", properties: {}, additionalProperties: false },\n options: { namespace: \"codenomad\", codemode: false },\n execute: (_input, tool) => executeDeveloperTool(inspectedTargets, tool.sessionID, { action: \"screenshot\" }),\n })\n }\n}\n\nexport async function setupAutomationPlugin(context: AutomationPluginContext): Promise<void> {\n await context.tool.transform(createDeveloperToolTransform())\n}\n"]}
@@ -4,7 +4,7 @@ import http from "node:http";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
6
6
  import test from "node:test";
7
- import { AUTOMATION_BRIDGE_PATH, automationBridgeDirectory, automationBridgeDirectories, createAutomationBridgeRegistration, parseBrowserAction, parseDeveloperAction, formatInspection, publishAutomationBridge, removeLegacyAutomationPlugin, setupAutomationPlugin, sendMissionInput, } from "./automation-plugin";
7
+ import { AUTOMATION_BRIDGE_PATH, automationBridgeDirectory, automationBridgeDirectories, createAutomationBridgeRegistration, parseBrowserAction, parseDeveloperAction, formatInspection, formatBrowserSnapshot, publishAutomationBridge, removeLegacyAutomationPlugin, setupAutomationPlugin, sendMissionInput, } from "./automation-plugin";
8
8
  function listen(handler) {
9
9
  return new Promise((resolve) => {
10
10
  const server = http.createServer((request, response) => {
@@ -73,6 +73,32 @@ test("validates Developer Mode actions", () => {
73
73
  assert.deepEqual(parseDeveloperAction({ action: "restart" }), { action: "restart" });
74
74
  assert.throws(() => parseDeveloperAction({ action: "click" }), /click requires ref/);
75
75
  });
76
+ test("validates trusted-input actions, and parsing is idempotent across the bridge", () => {
77
+ const cases = [
78
+ [{ action: "click", ref: "e1", button: "right" }, { action: "click", ref: "e1", button: "right" }],
79
+ [{ action: "click", ref: "e1", button: "left" }, { action: "click", ref: "e1" }],
80
+ [{ action: "hover", ref: "e2" }, { action: "hover", ref: "e2" }],
81
+ [{ action: "drag", ref: "e2", to: "e3" }, { action: "drag", ref: "e2", to: "e3" }],
82
+ [{ action: "scroll", direction: "down" }, { action: "scroll", direction: "down", amount: 600 }],
83
+ [{ action: "scroll", ref: "e4", direction: "left", amount: 120 }, { action: "scroll", ref: "e4", direction: "left", amount: 120 }],
84
+ [{ action: "press", key: "Shift+Tab" }, { action: "press", key: "Shift+Tab" }],
85
+ [{ action: "press", key: "Enter", ref: "e5" }, { action: "press", key: "Enter", ref: "e5" }],
86
+ [{ action: "wait", text: "Ready" }, { action: "wait", text: "Ready", gone: false, timeout: 5_000 }],
87
+ [{ action: "wait", text: "Saving", gone: true, timeout: 0 }, { action: "wait", text: "Saving", gone: true, timeout: 0 }],
88
+ ];
89
+ for (const [input, expected] of cases) {
90
+ assert.deepEqual(parseDeveloperAction(input), expected);
91
+ assert.deepEqual(parseDeveloperAction(parseDeveloperAction(input)), expected, "the backend re-parses the same flat command");
92
+ }
93
+ assert.throws(() => parseDeveloperAction({ action: "click", ref: "e1", button: "middle" }), /left or right/);
94
+ assert.throws(() => parseDeveloperAction({ action: "drag", ref: "e1" }), /drag requires to/);
95
+ assert.throws(() => parseDeveloperAction({ action: "scroll", direction: "sideways" }), /up, down, left or right/);
96
+ assert.throws(() => parseDeveloperAction({ action: "scroll", direction: "up", amount: 10_001 }), /from 1 to 10000/);
97
+ assert.throws(() => parseDeveloperAction({ action: "press", key: "" }), /press requires key/);
98
+ assert.throws(() => parseDeveloperAction({ action: "press", key: "Hyper+Q" }), /Unknown modifier/);
99
+ assert.throws(() => parseDeveloperAction({ action: "wait", text: " " }), /wait requires text/);
100
+ assert.throws(() => parseDeveloperAction({ action: "wait", text: "x", timeout: 20_000 }), /from 0 to 15000/);
101
+ });
76
102
  test("an inspection reads as a plain outline with its window, collapse note and diagnostics", () => {
77
103
  const text = formatInspection({
78
104
  target: { title: "CodeNomad", url: "http://127.0.0.1:9899/" },
@@ -140,6 +166,21 @@ test("validates browser actions", () => {
140
166
  clear: false,
141
167
  });
142
168
  assert.throws(() => parseBrowserAction({ action: "open" }), /open requires url/);
169
+ for (const input of [
170
+ { action: "select", ref: "e1", values: ["Exploration"] },
171
+ { action: "hover", ref: "e1" },
172
+ { action: "press", key: "Shift+Tab" },
173
+ { action: "scroll", ref: "e1", direction: "down", amount: 120 },
174
+ { action: "drag", ref: "e1", to: "e2" },
175
+ { action: "wait", text: "Ready", timeout: 1000, gone: false },
176
+ ]) {
177
+ assert.deepEqual(parseBrowserAction(input), parseDeveloperAction(input), "both surfaces use the same page action contract");
178
+ }
179
+ assert.deepEqual(parseBrowserAction({ action: "snapshot", query: "dialog", ref: "e1" }), { action: "snapshot", query: "dialog", ref: "e1" });
180
+ assert.throws(() => parseBrowserAction({ action: "type", ref: "e1", text: "x", clear: "no" }), /clear must be/);
181
+ assert.throws(() => parseBrowserAction({ action: "snapshot", query: "x".repeat(201) }), /at most 200/);
182
+ assert.throws(() => parseBrowserAction({ action: "evaluate", expression: "document.cookie" }), /Unsupported browser action/);
183
+ assert.equal(formatBrowserSnapshot({ url: "https://example.test", snapshot: '- button "Go" [e1]', collapsed: 0 }), 'https://example.test\n\n- button "Go" [e1]', "browser outlines are plain text too, not escaped JSON");
143
184
  });
144
185
  test("registers developer tools while execution remains session-gated", async () => {
145
186
  const tools = [];
@@ -1 +1 @@
1
- {"version":3,"file":"automation-plugin.test.js","sourceRoot":"","sources":["../../src/opencode/automation-plugin.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\"\nimport { mkdir, mkdtemp, readFile, readdir, rm, writeFile } from \"node:fs/promises\"\nimport http from \"node:http\"\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport test from \"node:test\"\nimport {\n AUTOMATION_BRIDGE_PATH,\n automationBridgeDirectory,\n automationBridgeDirectories,\n createAutomationBridgeRegistration,\n parseBrowserAction,\n parseDeveloperAction,\n formatInspection,\n publishAutomationBridge,\n removeLegacyAutomationPlugin,\n setupAutomationPlugin,\n sendMissionInput,\n} from \"./automation-plugin\"\n\ntype ToolDefinition = {\n name: string\n execute(input: unknown, context: { sessionID: string }): Promise<{ content: unknown }>\n}\n\nfunction listen(handler: (body: Record<string, unknown>) => Promise<Record<string, unknown>>) {\n return new Promise<{ server: http.Server; url: string }>((resolve) => {\n const server = http.createServer((request, response) => {\n const chunks: Buffer[] = []\n request.on(\"data\", (chunk) => chunks.push(Buffer.from(chunk)))\n request.on(\"end\", () => {\n void handler(JSON.parse(Buffer.concat(chunks).toString(\"utf8\"))).then((body) => {\n response.setHeader(\"content-type\", \"application/json\")\n response.end(JSON.stringify(body))\n })\n })\n })\n server.listen(0, \"127.0.0.1\", () => {\n const address = server.address() as { port: number }\n resolve({ server, url: `http://127.0.0.1:${address.port}` })\n })\n })\n}\n\nasync function collectTools(): Promise<ToolDefinition[]> {\n const definitions: ToolDefinition[] = []\n await setupAutomationPlugin({\n tool: { transform: async (callback) => callback({ add: (value) => definitions.push(value as ToolDefinition) }) },\n })\n return definitions\n}\n\nfunction closeServer(server: http.Server | undefined): Promise<void> {\n return new Promise((resolve) => server?.close(() => resolve()) ?? resolve())\n}\n\nfunction isolateAutomationBridgeRegistry(root: string): () => void {\n const previousLocalAppData = process.env.LOCALAPPDATA\n const previousXdgRuntimeDir = process.env.XDG_RUNTIME_DIR\n const previousWslDistroName = process.env.WSL_DISTRO_NAME\n process.env.LOCALAPPDATA = root\n process.env.XDG_RUNTIME_DIR = root\n delete process.env.WSL_DISTRO_NAME\n return () => {\n if (previousLocalAppData === undefined) delete process.env.LOCALAPPDATA\n else process.env.LOCALAPPDATA = previousLocalAppData\n if (previousXdgRuntimeDir === undefined) delete process.env.XDG_RUNTIME_DIR\n else process.env.XDG_RUNTIME_DIR = previousXdgRuntimeDir\n if (previousWslDistroName === undefined) delete process.env.WSL_DISTRO_NAME\n else process.env.WSL_DISTRO_NAME = previousWslDistroName\n }\n}\n\ntest(\"validates Developer Mode actions\", () => {\n assert.deepEqual(parseDeveloperAction({ action: \"type\", ref: \"e4\", text: \"CodeNomad\" }), {\n action: \"type\",\n ref: \"e4\",\n text: \"CodeNomad\",\n clear: true,\n })\n assert.deepEqual(parseDeveloperAction({ action: \"type\", ref: \"e4\", text: \" more\", clear: false }), { action: \"type\", ref: \"e4\", text: \" more\", clear: false })\n assert.throws(() => parseDeveloperAction({ action: \"type\", ref: \"e4\", text: \"x\", clear: \"no\" }), /clear must be true or false/)\n assert.deepEqual(parseDeveloperAction({ action: \"select\", ref: \"e5\", values: [\"Exploration\"] }), { action: \"select\", ref: \"e5\", values: [\"Exploration\"] })\n assert.throws(() => parseDeveloperAction({ action: \"select\", ref: \"e5\", values: \"Exploration\" }), /select requires ref and values/)\n assert.throws(() => parseDeveloperAction({ action: \"select\", ref: \"e5\", values: [1] }), /select requires ref and values/)\n assert.deepEqual(parseDeveloperAction({ action: \"inspect\", ref: \"e9\", query: \" \" }), { action: \"inspect\", ref: \"e9\" })\n assert.deepEqual(parseDeveloperAction({ action: \"inspect\", query: \"Playbook\" }), { action: \"inspect\", query: \"Playbook\" })\n assert.throws(() => parseDeveloperAction({ action: \"inspect\", query: \"x\".repeat(201) }), /at most 200 characters/)\n assert.deepEqual(parseDeveloperAction({ action: \"restart\" }), { action: \"restart\" })\n assert.throws(() => parseDeveloperAction({ action: \"click\" }), /click requires ref/)\n})\n\ntest(\"an inspection reads as a plain outline with its window, collapse note and diagnostics\", () => {\n const text = formatInspection({\n target: { title: \"CodeNomad\", url: \"http://127.0.0.1:9899/\" },\n context: { windowId: \"window-1\", instanceId: null, sessionId: \"ses_1\" },\n snapshot: \"- main [e1]\\n - log \\\"Transcript\\\" [e2] (+40 hidden)\",\n collapsed: 1,\n diagnostics: [{ level: \"error\", text: \"boom\" }],\n })\n assert.equal(text, [\n \"CodeNomad window window-1 · workspace none · conversation ses_1\",\n \"CodeNomad — http://127.0.0.1:9899/\",\n \"\",\n \"- main [e1]\",\n \" - log \\\"Transcript\\\" [e2] (+40 hidden)\",\n \"\",\n \"A line ending in (+N hidden) collapses that element: inspect its ref to expand it. (+N more) stands for omitted siblings: inspect their parent's ref, or use query to find them.\",\n \"\",\n \"Runtime diagnostics:\",\n \"- error: boom\",\n ].join(\"\\n\"))\n})\n\ntest(\"mission discovery waits for cold ownership validation and still rejects competing owners\", { timeout: 20_000 }, async () => {\n const root = await mkdtemp(path.join(os.tmpdir(), \"codenomad-mission-cold-owner-\"))\n const restore = isolateAutomationBridgeRegistry(root)\n const removals: Array<() => Promise<void>> = []\n const servers: http.Server[] = []\n let admissions = 0\n let cold = true\n try {\n const owner = await listen(async body => {\n if (body.mode === \"browser-claim\") {\n if (cold) await new Promise(resolve => setTimeout(resolve, 5_200))\n return { result: { available: true } }\n }\n admissions++\n return { result: { admitted: true } }\n })\n servers.push(owner.server)\n removals.push(await publishAutomationBridge(createAutomationBridgeRegistration(owner.url)))\n assert.deepEqual(await sendMissionInput(\"ses_cold\", \"prompt\", {}), { admitted: true })\n cold = false\n const competing = await listen(async () => ({ result: { available: true } }))\n servers.push(competing.server)\n removals.push(await publishAutomationBridge(createAutomationBridgeRegistration(competing.url)))\n await assert.rejects(sendMissionInput(\"ses_cold\", \"prompt\", {}), /exactly one owning/)\n assert.equal(admissions, 1)\n } finally {\n await Promise.all(removals.map(remove => remove()))\n await Promise.all(servers.map(closeServer))\n restore()\n await rm(root, { recursive: true, force: true })\n }\n})\n\ntest(\"validates browser actions\", () => {\n assert.deepEqual(parseBrowserAction({ action: \"open\", url: \"https://example.com\" }), {\n action: \"open\",\n url: \"https://example.com\",\n })\n assert.deepEqual(parseBrowserAction({ action: \"type\", ref: \"e2\", text: \"hello\", clear: false }), {\n action: \"type\",\n ref: \"e2\",\n text: \"hello\",\n clear: false,\n })\n assert.throws(() => parseBrowserAction({ action: \"open\" }), /open requires url/)\n})\n\ntest(\"registers developer tools while execution remains session-gated\", async () => {\n const tools: string[] = []\n await setupAutomationPlugin({\n tool: { transform: async (callback) => callback({ add: (value) => tools.push(value.name) }) },\n })\n\n assert.deepEqual(tools, [\"inspect\", \"act\", \"screenshot\"])\n})\n\ntest(\"discovers the Windows bridge registry from a WSL plugin\", () => {\n assert.deepEqual(automationBridgeDirectories({\n platform: \"linux\",\n env: { WSL_DISTRO_NAME: \"Ubuntu\", XDG_RUNTIME_DIR: \"/run/user/1000\" },\n home: \"/home/dev\",\n windowsLocalAppData: \"/mnt/c/Users/dev/AppData/Local\",\n }), [\n \"/run/user/1000/codenomad/automation-bridges\",\n \"/mnt/c/Users/dev/AppData/Local/CodeNomad/automation-bridges\",\n ])\n})\n\ntest(\"removes only the generated legacy global plugin shim\", async () => {\n const root = await mkdtemp(path.join(os.tmpdir(), \"codenomad-legacy-plugin-\"))\n const plugin = path.join(root, \"opencode\", \"plugins\", \"codenomad-automation.ts\")\n await mkdir(path.dirname(plugin), { recursive: true })\n try {\n await writeFile(plugin, 'export { default } from \"file:///C:/CodeNomad/resources/server/dist/opencode/automation-plugin.js\"\\n')\n assert.equal(await removeLegacyAutomationPlugin(root), true)\n await assert.rejects(readFile(plugin, \"utf8\"), { code: \"ENOENT\" })\n\n await writeFile(plugin, \"export default { id: 'user-plugin' }\\n\")\n assert.equal(await removeLegacyAutomationPlugin(root), false)\n assert.match(await readFile(plugin, \"utf8\"), /user-plugin/)\n } finally {\n await rm(root, { recursive: true, force: true })\n }\n})\n\ntest(\"restart waits for a new native generation and returns a fresh inspection\", async () => {\n const root = await mkdtemp(path.join(os.tmpdir(), \"codenomad-automation-restart-\"))\n const restoreBridgeRegistry = isolateAutomationBridgeRegistry(root)\n const definitions: ToolDefinition[] = []\n let removeOld: (() => Promise<void>) | undefined\n let removeNew: (() => Promise<void>) | undefined\n let removePreexisting: (() => Promise<void>) | undefined\n const removeDistractors: Array<() => Promise<void>> = []\n let oldServer: http.Server | undefined\n let newServer: http.Server | undefined\n let preexistingServer: http.Server | undefined\n const distractorServers: http.Server[] = []\n let restarting = false\n\n try {\n await setupAutomationPlugin({\n tool: { transform: async (callback) => callback({ add: (value) => definitions.push(value as typeof definitions[number]) }) },\n })\n const replacement = await listen(async (body) => body.mode === \"developer-probe\"\n ? { result: { available: true, nativeIdentity: \"electron:test\", runId: \"run-new\" } }\n : { result: { target: { id: \"page-new\", title: \"Restarted\", url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } })\n newServer = replacement.server\n const preexisting = await listen(async (body) => body.mode === \"developer-probe\" && restarting\n ? { result: { available: true, nativeIdentity: \"electron:test\", runId: \"run-preexisting\" } }\n : body.mode === \"developer-probe\"\n ? { result: { available: false } }\n : { result: { target: { id: \"page-wrong\", title: \"Pre-existing\", url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } })\n preexistingServer = preexisting.server\n removePreexisting = await publishAutomationBridge(createAutomationBridgeRegistration(preexisting.url))\n const distractors = await Promise.all(Array.from({ length: 5 }, (_, index) => listen(async (body) => body.mode === \"developer-probe\"\n ? { result: { available: true, nativeIdentity: `electron:distractor-${index}`, runId: `run-distractor-${index}` } }\n : { result: { target: { id: `page-${index}`, title: \"Distractor\", url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } })))\n distractorServers.push(...distractors.map((value) => value.server))\n const old = await listen(async (body) => {\n if (body.mode === \"developer-probe\") return { result: { available: true, nativeIdentity: \"electron:test\", runId: \"run-old\" } }\n if (body.command && (body.command as { action?: unknown }).action === \"inspect\") {\n return { result: { target: { id: \"page-old\", title: \"Original\", url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } }\n }\n restarting = true\n removeNew = await publishAutomationBridge(createAutomationBridgeRegistration(replacement.url))\n for (const distractor of distractors) {\n await new Promise((resolve) => setTimeout(resolve, 2))\n removeDistractors.push(await publishAutomationBridge(createAutomationBridgeRegistration(distractor.url)))\n }\n return { result: { state: \"starting\" } }\n })\n oldServer = old.server\n removeOld = await publishAutomationBridge(createAutomationBridgeRegistration(old.url))\n\n const inspect = definitions.find((definition) => definition.name === \"inspect\")!\n await inspect.execute({}, { sessionID: \"session-1\" })\n const act = definitions.find((definition) => definition.name === \"act\")!\n const result = await act.execute({ action: \"restart\" }, { sessionID: \"session-1\" })\n assert.match(String(result.content), /Restarted/)\n } finally {\n await removeOld?.()\n await removeNew?.()\n await removePreexisting?.()\n await Promise.all(removeDistractors.map((remove) => remove()))\n await closeServer(oldServer)\n await closeServer(newServer)\n await closeServer(preexistingServer)\n await Promise.all(distractorServers.map(closeServer))\n restoreBridgeRegistry()\n await rm(root, { recursive: true, force: true })\n }\n})\n\ntest(\"keeps inspected targets isolated per plugin setup\", async () => {\n const root = await mkdtemp(path.join(os.tmpdir(), \"codenomad-automation-isolation-\"))\n const restoreBridgeRegistry = isolateAutomationBridgeRegistry(root)\n let removeBridge: (() => Promise<void>) | undefined\n let server: http.Server | undefined\n try {\n const bridge = await listen(async (body) => body.mode === \"developer-probe\"\n ? { result: { available: true, nativeIdentity: \"electron:isolation\", runId: \"run-isolation\" } }\n : { result: { target: { id: \"isolated\", title: \"Isolated\", url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } })\n server = bridge.server\n removeBridge = await publishAutomationBridge(createAutomationBridgeRegistration(bridge.url))\n const first = await collectTools()\n const second = await collectTools()\n await first.find((definition) => definition.name === \"inspect\")!.execute({}, { sessionID: \"session-isolation\" })\n await assert.rejects(\n second.find((definition) => definition.name === \"screenshot\")!.execute({}, { sessionID: \"session-isolation\" }),\n /Run codenomad\\.inspect/,\n )\n } finally {\n await removeBridge?.()\n await closeServer(server)\n restoreBridgeRegistry()\n await rm(root, { recursive: true, force: true })\n }\n})\n\ntest(\"pins parallel sessions to their independently inspected bridges\", async () => {\n const root = await mkdtemp(path.join(os.tmpdir(), \"codenomad-automation-sessions-\"))\n const restoreBridgeRegistry = isolateAutomationBridgeRegistry(root)\n const removals: Array<() => Promise<void>> = []\n const servers: http.Server[] = []\n try {\n for (const sessionID of [\"session-a\", \"session-b\"]) {\n const bridge = await listen(async (body) => body.mode === \"developer-probe\"\n ? { result: { available: body.sessionID === sessionID, nativeIdentity: `electron:${sessionID}`, runId: `run-${sessionID}` } }\n : { result: { target: { id: sessionID, title: sessionID, url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } })\n servers.push(bridge.server)\n removals.push(await publishAutomationBridge(createAutomationBridgeRegistration(bridge.url)))\n }\n const tools = await collectTools()\n const inspect = tools.find((definition) => definition.name === \"inspect\")!\n const screenshot = tools.find((definition) => definition.name === \"screenshot\")!\n await inspect.execute({}, { sessionID: \"session-a\" })\n await inspect.execute({}, { sessionID: \"session-b\" })\n assert.match(String((await screenshot.execute({}, { sessionID: \"session-a\" })).content), /session-a/)\n assert.match(String((await screenshot.execute({}, { sessionID: \"session-b\" })).content), /session-b/)\n } finally {\n await Promise.all(removals.map((remove) => remove()))\n await Promise.all(servers.map(closeServer))\n restoreBridgeRegistry()\n await rm(root, { recursive: true, force: true })\n }\n})\n\ntest(\"prunes stale registry pressure before limiting discovery\", async () => {\n const root = await mkdtemp(path.join(os.tmpdir(), \"codenomad-automation-stale-\"))\n const restoreBridgeRegistry = isolateAutomationBridgeRegistry(root)\n let removeBridge: (() => Promise<void>) | undefined\n let server: http.Server | undefined\n try {\n const bridge = await listen(async (body) => body.mode === \"developer-probe\"\n ? { result: { available: true, nativeIdentity: \"electron:live\", runId: \"run-live\" } }\n : { result: { target: { id: \"live\", title: \"Live\", url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } })\n server = bridge.server\n removeBridge = await publishAutomationBridge(createAutomationBridgeRegistration(bridge.url))\n const directory = automationBridgeDirectory()\n assert.equal(path.dirname(path.dirname(directory)), root)\n const base = Date.now() + 10_000\n for (let index = 0; index < 70; index += 1) {\n const startedAt = base + index\n const token = `dead${String(index).padStart(8, \"0\")}`\n await writeFile(path.join(directory, `${startedAt}-99999999-${token}.json`), JSON.stringify({\n version: 1,\n url: new URL(AUTOMATION_BRIDGE_PATH, bridge.url).href,\n token,\n pid: 99_999_999,\n startedAt,\n }))\n }\n const inspect = (await collectTools()).find((definition) => definition.name === \"inspect\")!\n assert.match(String((await inspect.execute({}, { sessionID: \"session-live\" })).content), /Live/)\n assert.equal((await readdir(directory)).length, 1)\n } finally {\n await removeBridge?.()\n await closeServer(server)\n restoreBridgeRegistry()\n await rm(root, { recursive: true, force: true })\n }\n})\n"]}
1
+ {"version":3,"file":"automation-plugin.test.js","sourceRoot":"","sources":["../../src/opencode/automation-plugin.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\"\nimport { mkdir, mkdtemp, readFile, readdir, rm, writeFile } from \"node:fs/promises\"\nimport http from \"node:http\"\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport test from \"node:test\"\nimport {\n AUTOMATION_BRIDGE_PATH,\n automationBridgeDirectory,\n automationBridgeDirectories,\n createAutomationBridgeRegistration,\n parseBrowserAction,\n parseDeveloperAction,\n formatInspection,\n formatBrowserSnapshot,\n publishAutomationBridge,\n removeLegacyAutomationPlugin,\n setupAutomationPlugin,\n sendMissionInput,\n} from \"./automation-plugin\"\n\ntype ToolDefinition = {\n name: string\n execute(input: unknown, context: { sessionID: string }): Promise<{ content: unknown }>\n}\n\nfunction listen(handler: (body: Record<string, unknown>) => Promise<Record<string, unknown>>) {\n return new Promise<{ server: http.Server; url: string }>((resolve) => {\n const server = http.createServer((request, response) => {\n const chunks: Buffer[] = []\n request.on(\"data\", (chunk) => chunks.push(Buffer.from(chunk)))\n request.on(\"end\", () => {\n void handler(JSON.parse(Buffer.concat(chunks).toString(\"utf8\"))).then((body) => {\n response.setHeader(\"content-type\", \"application/json\")\n response.end(JSON.stringify(body))\n })\n })\n })\n server.listen(0, \"127.0.0.1\", () => {\n const address = server.address() as { port: number }\n resolve({ server, url: `http://127.0.0.1:${address.port}` })\n })\n })\n}\n\nasync function collectTools(): Promise<ToolDefinition[]> {\n const definitions: ToolDefinition[] = []\n await setupAutomationPlugin({\n tool: { transform: async (callback) => callback({ add: (value) => definitions.push(value as ToolDefinition) }) },\n })\n return definitions\n}\n\nfunction closeServer(server: http.Server | undefined): Promise<void> {\n return new Promise((resolve) => server?.close(() => resolve()) ?? resolve())\n}\n\nfunction isolateAutomationBridgeRegistry(root: string): () => void {\n const previousLocalAppData = process.env.LOCALAPPDATA\n const previousXdgRuntimeDir = process.env.XDG_RUNTIME_DIR\n const previousWslDistroName = process.env.WSL_DISTRO_NAME\n process.env.LOCALAPPDATA = root\n process.env.XDG_RUNTIME_DIR = root\n delete process.env.WSL_DISTRO_NAME\n return () => {\n if (previousLocalAppData === undefined) delete process.env.LOCALAPPDATA\n else process.env.LOCALAPPDATA = previousLocalAppData\n if (previousXdgRuntimeDir === undefined) delete process.env.XDG_RUNTIME_DIR\n else process.env.XDG_RUNTIME_DIR = previousXdgRuntimeDir\n if (previousWslDistroName === undefined) delete process.env.WSL_DISTRO_NAME\n else process.env.WSL_DISTRO_NAME = previousWslDistroName\n }\n}\n\ntest(\"validates Developer Mode actions\", () => {\n assert.deepEqual(parseDeveloperAction({ action: \"type\", ref: \"e4\", text: \"CodeNomad\" }), {\n action: \"type\",\n ref: \"e4\",\n text: \"CodeNomad\",\n clear: true,\n })\n assert.deepEqual(parseDeveloperAction({ action: \"type\", ref: \"e4\", text: \" more\", clear: false }), { action: \"type\", ref: \"e4\", text: \" more\", clear: false })\n assert.throws(() => parseDeveloperAction({ action: \"type\", ref: \"e4\", text: \"x\", clear: \"no\" }), /clear must be true or false/)\n assert.deepEqual(parseDeveloperAction({ action: \"select\", ref: \"e5\", values: [\"Exploration\"] }), { action: \"select\", ref: \"e5\", values: [\"Exploration\"] })\n assert.throws(() => parseDeveloperAction({ action: \"select\", ref: \"e5\", values: \"Exploration\" }), /select requires ref and values/)\n assert.throws(() => parseDeveloperAction({ action: \"select\", ref: \"e5\", values: [1] }), /select requires ref and values/)\n assert.deepEqual(parseDeveloperAction({ action: \"inspect\", ref: \"e9\", query: \" \" }), { action: \"inspect\", ref: \"e9\" })\n assert.deepEqual(parseDeveloperAction({ action: \"inspect\", query: \"Playbook\" }), { action: \"inspect\", query: \"Playbook\" })\n assert.throws(() => parseDeveloperAction({ action: \"inspect\", query: \"x\".repeat(201) }), /at most 200 characters/)\n assert.deepEqual(parseDeveloperAction({ action: \"restart\" }), { action: \"restart\" })\n assert.throws(() => parseDeveloperAction({ action: \"click\" }), /click requires ref/)\n})\n\ntest(\"validates trusted-input actions, and parsing is idempotent across the bridge\", () => {\n const cases: Array<[Record<string, unknown>, unknown]> = [\n [{ action: \"click\", ref: \"e1\", button: \"right\" }, { action: \"click\", ref: \"e1\", button: \"right\" }],\n [{ action: \"click\", ref: \"e1\", button: \"left\" }, { action: \"click\", ref: \"e1\" }],\n [{ action: \"hover\", ref: \"e2\" }, { action: \"hover\", ref: \"e2\" }],\n [{ action: \"drag\", ref: \"e2\", to: \"e3\" }, { action: \"drag\", ref: \"e2\", to: \"e3\" }],\n [{ action: \"scroll\", direction: \"down\" }, { action: \"scroll\", direction: \"down\", amount: 600 }],\n [{ action: \"scroll\", ref: \"e4\", direction: \"left\", amount: 120 }, { action: \"scroll\", ref: \"e4\", direction: \"left\", amount: 120 }],\n [{ action: \"press\", key: \"Shift+Tab\" }, { action: \"press\", key: \"Shift+Tab\" }],\n [{ action: \"press\", key: \"Enter\", ref: \"e5\" }, { action: \"press\", key: \"Enter\", ref: \"e5\" }],\n [{ action: \"wait\", text: \"Ready\" }, { action: \"wait\", text: \"Ready\", gone: false, timeout: 5_000 }],\n [{ action: \"wait\", text: \"Saving\", gone: true, timeout: 0 }, { action: \"wait\", text: \"Saving\", gone: true, timeout: 0 }],\n ]\n for (const [input, expected] of cases) {\n assert.deepEqual(parseDeveloperAction(input), expected)\n assert.deepEqual(parseDeveloperAction(parseDeveloperAction(input)), expected, \"the backend re-parses the same flat command\")\n }\n assert.throws(() => parseDeveloperAction({ action: \"click\", ref: \"e1\", button: \"middle\" }), /left or right/)\n assert.throws(() => parseDeveloperAction({ action: \"drag\", ref: \"e1\" }), /drag requires to/)\n assert.throws(() => parseDeveloperAction({ action: \"scroll\", direction: \"sideways\" }), /up, down, left or right/)\n assert.throws(() => parseDeveloperAction({ action: \"scroll\", direction: \"up\", amount: 10_001 }), /from 1 to 10000/)\n assert.throws(() => parseDeveloperAction({ action: \"press\", key: \"\" }), /press requires key/)\n assert.throws(() => parseDeveloperAction({ action: \"press\", key: \"Hyper+Q\" }), /Unknown modifier/)\n assert.throws(() => parseDeveloperAction({ action: \"wait\", text: \" \" }), /wait requires text/)\n assert.throws(() => parseDeveloperAction({ action: \"wait\", text: \"x\", timeout: 20_000 }), /from 0 to 15000/)\n})\n\ntest(\"an inspection reads as a plain outline with its window, collapse note and diagnostics\", () => {\n const text = formatInspection({\n target: { title: \"CodeNomad\", url: \"http://127.0.0.1:9899/\" },\n context: { windowId: \"window-1\", instanceId: null, sessionId: \"ses_1\" },\n snapshot: \"- main [e1]\\n - log \\\"Transcript\\\" [e2] (+40 hidden)\",\n collapsed: 1,\n diagnostics: [{ level: \"error\", text: \"boom\" }],\n })\n assert.equal(text, [\n \"CodeNomad window window-1 · workspace none · conversation ses_1\",\n \"CodeNomad — http://127.0.0.1:9899/\",\n \"\",\n \"- main [e1]\",\n \" - log \\\"Transcript\\\" [e2] (+40 hidden)\",\n \"\",\n \"A line ending in (+N hidden) collapses that element: inspect its ref to expand it. (+N more) stands for omitted siblings: inspect their parent's ref, or use query to find them.\",\n \"\",\n \"Runtime diagnostics:\",\n \"- error: boom\",\n ].join(\"\\n\"))\n})\n\ntest(\"mission discovery waits for cold ownership validation and still rejects competing owners\", { timeout: 20_000 }, async () => {\n const root = await mkdtemp(path.join(os.tmpdir(), \"codenomad-mission-cold-owner-\"))\n const restore = isolateAutomationBridgeRegistry(root)\n const removals: Array<() => Promise<void>> = []\n const servers: http.Server[] = []\n let admissions = 0\n let cold = true\n try {\n const owner = await listen(async body => {\n if (body.mode === \"browser-claim\") {\n if (cold) await new Promise(resolve => setTimeout(resolve, 5_200))\n return { result: { available: true } }\n }\n admissions++\n return { result: { admitted: true } }\n })\n servers.push(owner.server)\n removals.push(await publishAutomationBridge(createAutomationBridgeRegistration(owner.url)))\n assert.deepEqual(await sendMissionInput(\"ses_cold\", \"prompt\", {}), { admitted: true })\n cold = false\n const competing = await listen(async () => ({ result: { available: true } }))\n servers.push(competing.server)\n removals.push(await publishAutomationBridge(createAutomationBridgeRegistration(competing.url)))\n await assert.rejects(sendMissionInput(\"ses_cold\", \"prompt\", {}), /exactly one owning/)\n assert.equal(admissions, 1)\n } finally {\n await Promise.all(removals.map(remove => remove()))\n await Promise.all(servers.map(closeServer))\n restore()\n await rm(root, { recursive: true, force: true })\n }\n})\n\ntest(\"validates browser actions\", () => {\n assert.deepEqual(parseBrowserAction({ action: \"open\", url: \"https://example.com\" }), {\n action: \"open\",\n url: \"https://example.com\",\n })\n assert.deepEqual(parseBrowserAction({ action: \"type\", ref: \"e2\", text: \"hello\", clear: false }), {\n action: \"type\",\n ref: \"e2\",\n text: \"hello\",\n clear: false,\n })\n assert.throws(() => parseBrowserAction({ action: \"open\" }), /open requires url/)\n for (const input of [\n { action: \"select\", ref: \"e1\", values: [\"Exploration\"] },\n { action: \"hover\", ref: \"e1\" },\n { action: \"press\", key: \"Shift+Tab\" },\n { action: \"scroll\", ref: \"e1\", direction: \"down\", amount: 120 },\n { action: \"drag\", ref: \"e1\", to: \"e2\" },\n { action: \"wait\", text: \"Ready\", timeout: 1000, gone: false },\n ]) {\n assert.deepEqual(parseBrowserAction(input), parseDeveloperAction(input), \"both surfaces use the same page action contract\")\n }\n assert.deepEqual(parseBrowserAction({ action: \"snapshot\", query: \"dialog\", ref: \"e1\" }), { action: \"snapshot\", query: \"dialog\", ref: \"e1\" })\n assert.throws(() => parseBrowserAction({ action: \"type\", ref: \"e1\", text: \"x\", clear: \"no\" }), /clear must be/)\n assert.throws(() => parseBrowserAction({ action: \"snapshot\", query: \"x\".repeat(201) }), /at most 200/)\n assert.throws(() => parseBrowserAction({ action: \"evaluate\", expression: \"document.cookie\" }), /Unsupported browser action/)\n assert.equal(formatBrowserSnapshot({ url: \"https://example.test\", snapshot: '- button \"Go\" [e1]', collapsed: 0 }),\n 'https://example.test\\n\\n- button \"Go\" [e1]', \"browser outlines are plain text too, not escaped JSON\")\n})\n\ntest(\"registers developer tools while execution remains session-gated\", async () => {\n const tools: string[] = []\n await setupAutomationPlugin({\n tool: { transform: async (callback) => callback({ add: (value) => tools.push(value.name) }) },\n })\n\n assert.deepEqual(tools, [\"inspect\", \"act\", \"screenshot\"])\n})\n\ntest(\"discovers the Windows bridge registry from a WSL plugin\", () => {\n assert.deepEqual(automationBridgeDirectories({\n platform: \"linux\",\n env: { WSL_DISTRO_NAME: \"Ubuntu\", XDG_RUNTIME_DIR: \"/run/user/1000\" },\n home: \"/home/dev\",\n windowsLocalAppData: \"/mnt/c/Users/dev/AppData/Local\",\n }), [\n \"/run/user/1000/codenomad/automation-bridges\",\n \"/mnt/c/Users/dev/AppData/Local/CodeNomad/automation-bridges\",\n ])\n})\n\ntest(\"removes only the generated legacy global plugin shim\", async () => {\n const root = await mkdtemp(path.join(os.tmpdir(), \"codenomad-legacy-plugin-\"))\n const plugin = path.join(root, \"opencode\", \"plugins\", \"codenomad-automation.ts\")\n await mkdir(path.dirname(plugin), { recursive: true })\n try {\n await writeFile(plugin, 'export { default } from \"file:///C:/CodeNomad/resources/server/dist/opencode/automation-plugin.js\"\\n')\n assert.equal(await removeLegacyAutomationPlugin(root), true)\n await assert.rejects(readFile(plugin, \"utf8\"), { code: \"ENOENT\" })\n\n await writeFile(plugin, \"export default { id: 'user-plugin' }\\n\")\n assert.equal(await removeLegacyAutomationPlugin(root), false)\n assert.match(await readFile(plugin, \"utf8\"), /user-plugin/)\n } finally {\n await rm(root, { recursive: true, force: true })\n }\n})\n\ntest(\"restart waits for a new native generation and returns a fresh inspection\", async () => {\n const root = await mkdtemp(path.join(os.tmpdir(), \"codenomad-automation-restart-\"))\n const restoreBridgeRegistry = isolateAutomationBridgeRegistry(root)\n const definitions: ToolDefinition[] = []\n let removeOld: (() => Promise<void>) | undefined\n let removeNew: (() => Promise<void>) | undefined\n let removePreexisting: (() => Promise<void>) | undefined\n const removeDistractors: Array<() => Promise<void>> = []\n let oldServer: http.Server | undefined\n let newServer: http.Server | undefined\n let preexistingServer: http.Server | undefined\n const distractorServers: http.Server[] = []\n let restarting = false\n\n try {\n await setupAutomationPlugin({\n tool: { transform: async (callback) => callback({ add: (value) => definitions.push(value as typeof definitions[number]) }) },\n })\n const replacement = await listen(async (body) => body.mode === \"developer-probe\"\n ? { result: { available: true, nativeIdentity: \"electron:test\", runId: \"run-new\" } }\n : { result: { target: { id: \"page-new\", title: \"Restarted\", url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } })\n newServer = replacement.server\n const preexisting = await listen(async (body) => body.mode === \"developer-probe\" && restarting\n ? { result: { available: true, nativeIdentity: \"electron:test\", runId: \"run-preexisting\" } }\n : body.mode === \"developer-probe\"\n ? { result: { available: false } }\n : { result: { target: { id: \"page-wrong\", title: \"Pre-existing\", url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } })\n preexistingServer = preexisting.server\n removePreexisting = await publishAutomationBridge(createAutomationBridgeRegistration(preexisting.url))\n const distractors = await Promise.all(Array.from({ length: 5 }, (_, index) => listen(async (body) => body.mode === \"developer-probe\"\n ? { result: { available: true, nativeIdentity: `electron:distractor-${index}`, runId: `run-distractor-${index}` } }\n : { result: { target: { id: `page-${index}`, title: \"Distractor\", url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } })))\n distractorServers.push(...distractors.map((value) => value.server))\n const old = await listen(async (body) => {\n if (body.mode === \"developer-probe\") return { result: { available: true, nativeIdentity: \"electron:test\", runId: \"run-old\" } }\n if (body.command && (body.command as { action?: unknown }).action === \"inspect\") {\n return { result: { target: { id: \"page-old\", title: \"Original\", url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } }\n }\n restarting = true\n removeNew = await publishAutomationBridge(createAutomationBridgeRegistration(replacement.url))\n for (const distractor of distractors) {\n await new Promise((resolve) => setTimeout(resolve, 2))\n removeDistractors.push(await publishAutomationBridge(createAutomationBridgeRegistration(distractor.url)))\n }\n return { result: { state: \"starting\" } }\n })\n oldServer = old.server\n removeOld = await publishAutomationBridge(createAutomationBridgeRegistration(old.url))\n\n const inspect = definitions.find((definition) => definition.name === \"inspect\")!\n await inspect.execute({}, { sessionID: \"session-1\" })\n const act = definitions.find((definition) => definition.name === \"act\")!\n const result = await act.execute({ action: \"restart\" }, { sessionID: \"session-1\" })\n assert.match(String(result.content), /Restarted/)\n } finally {\n await removeOld?.()\n await removeNew?.()\n await removePreexisting?.()\n await Promise.all(removeDistractors.map((remove) => remove()))\n await closeServer(oldServer)\n await closeServer(newServer)\n await closeServer(preexistingServer)\n await Promise.all(distractorServers.map(closeServer))\n restoreBridgeRegistry()\n await rm(root, { recursive: true, force: true })\n }\n})\n\ntest(\"keeps inspected targets isolated per plugin setup\", async () => {\n const root = await mkdtemp(path.join(os.tmpdir(), \"codenomad-automation-isolation-\"))\n const restoreBridgeRegistry = isolateAutomationBridgeRegistry(root)\n let removeBridge: (() => Promise<void>) | undefined\n let server: http.Server | undefined\n try {\n const bridge = await listen(async (body) => body.mode === \"developer-probe\"\n ? { result: { available: true, nativeIdentity: \"electron:isolation\", runId: \"run-isolation\" } }\n : { result: { target: { id: \"isolated\", title: \"Isolated\", url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } })\n server = bridge.server\n removeBridge = await publishAutomationBridge(createAutomationBridgeRegistration(bridge.url))\n const first = await collectTools()\n const second = await collectTools()\n await first.find((definition) => definition.name === \"inspect\")!.execute({}, { sessionID: \"session-isolation\" })\n await assert.rejects(\n second.find((definition) => definition.name === \"screenshot\")!.execute({}, { sessionID: \"session-isolation\" }),\n /Run codenomad\\.inspect/,\n )\n } finally {\n await removeBridge?.()\n await closeServer(server)\n restoreBridgeRegistry()\n await rm(root, { recursive: true, force: true })\n }\n})\n\ntest(\"pins parallel sessions to their independently inspected bridges\", async () => {\n const root = await mkdtemp(path.join(os.tmpdir(), \"codenomad-automation-sessions-\"))\n const restoreBridgeRegistry = isolateAutomationBridgeRegistry(root)\n const removals: Array<() => Promise<void>> = []\n const servers: http.Server[] = []\n try {\n for (const sessionID of [\"session-a\", \"session-b\"]) {\n const bridge = await listen(async (body) => body.mode === \"developer-probe\"\n ? { result: { available: body.sessionID === sessionID, nativeIdentity: `electron:${sessionID}`, runId: `run-${sessionID}` } }\n : { result: { target: { id: sessionID, title: sessionID, url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } })\n servers.push(bridge.server)\n removals.push(await publishAutomationBridge(createAutomationBridgeRegistration(bridge.url)))\n }\n const tools = await collectTools()\n const inspect = tools.find((definition) => definition.name === \"inspect\")!\n const screenshot = tools.find((definition) => definition.name === \"screenshot\")!\n await inspect.execute({}, { sessionID: \"session-a\" })\n await inspect.execute({}, { sessionID: \"session-b\" })\n assert.match(String((await screenshot.execute({}, { sessionID: \"session-a\" })).content), /session-a/)\n assert.match(String((await screenshot.execute({}, { sessionID: \"session-b\" })).content), /session-b/)\n } finally {\n await Promise.all(removals.map((remove) => remove()))\n await Promise.all(servers.map(closeServer))\n restoreBridgeRegistry()\n await rm(root, { recursive: true, force: true })\n }\n})\n\ntest(\"prunes stale registry pressure before limiting discovery\", async () => {\n const root = await mkdtemp(path.join(os.tmpdir(), \"codenomad-automation-stale-\"))\n const restoreBridgeRegistry = isolateAutomationBridgeRegistry(root)\n let removeBridge: (() => Promise<void>) | undefined\n let server: http.Server | undefined\n try {\n const bridge = await listen(async (body) => body.mode === \"developer-probe\"\n ? { result: { available: true, nativeIdentity: \"electron:live\", runId: \"run-live\" } }\n : { result: { target: { id: \"live\", title: \"Live\", url: \"http://app.test\" }, context: { windowId: \"window-1\", instanceId: null, sessionId: null }, snapshot: \"\", collapsed: 0, diagnostics: [] } })\n server = bridge.server\n removeBridge = await publishAutomationBridge(createAutomationBridgeRegistration(bridge.url))\n const directory = automationBridgeDirectory()\n assert.equal(path.dirname(path.dirname(directory)), root)\n const base = Date.now() + 10_000\n for (let index = 0; index < 70; index += 1) {\n const startedAt = base + index\n const token = `dead${String(index).padStart(8, \"0\")}`\n await writeFile(path.join(directory, `${startedAt}-99999999-${token}.json`), JSON.stringify({\n version: 1,\n url: new URL(AUTOMATION_BRIDGE_PATH, bridge.url).href,\n token,\n pid: 99_999_999,\n startedAt,\n }))\n }\n const inspect = (await collectTools()).find((definition) => definition.name === \"inspect\")!\n assert.match(String((await inspect.execute({}, { sessionID: \"session-live\" })).content), /Live/)\n assert.equal((await readdir(directory)).length, 1)\n } finally {\n await removeBridge?.()\n await closeServer(server)\n restoreBridgeRegistry()\n await rm(root, { recursive: true, force: true })\n }\n})\n"]}