@ai-agent-forge/plugin-desktop-macos-input 0.0.0-stage → 0.88.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MANUAL.md +16 -0
- package/README.md +55 -2
- package/agent-forge.json +31 -0
- package/dist/capability.d.ts +21 -0
- package/dist/capability.d.ts.map +1 -0
- package/dist/capability.js +456 -0
- package/dist/capability.js.map +1 -0
- package/dist/entry.d.ts +16 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +17 -0
- package/dist/entry.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/macos-ax-adapter.d.ts +72 -0
- package/dist/macos-ax-adapter.d.ts.map +1 -0
- package/dist/macos-ax-adapter.js +805 -0
- package/dist/macos-ax-adapter.js.map +1 -0
- package/dist/projection.d.ts +114 -0
- package/dist/projection.d.ts.map +1 -0
- package/dist/projection.js +226 -0
- package/dist/projection.js.map +1 -0
- package/dist/shared.d.ts +15 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +30 -0
- package/dist/shared.js.map +1 -0
- package/dist/types.d.ts +223 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +21 -0
- package/dist/types.js.map +1 -0
- package/package.json +56 -5
- package/plugin.json +20 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"macos-ax-adapter.js","sourceRoot":"","sources":["../src/macos-ax-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * macOS Accessibility driver (query + bounded input actions) and the input\n * adapter facade for this package. Structurally mirrors the Windows package's\n * `windows-uia-adapter.ts` + `windows-input-adapter.ts` (inlined from\n * agent-forge `src/plugins/desktop/*`, D-075 S3) with these deliberate\n * differences:\n * - Driver boundary is `osascript -l JavaScript -e <script>` (JXA) instead of\n * PowerShell UIA. The query script walks the System Events accessibility\n * tree (`Application(\"com.apple.systemevents\")`); the action script re-locates the\n * observed target by its deterministic enumeration identity\n * (`window-<pid>-<windowIndex>` / `<windowId>:<role>:<childIndex>`; Windows\n * uses native HWND handles instead — mac AX exposes no stable handles).\n * - Bounded actions: focus (frontmost + AXRaise / AXFocused), click\n * (AXPress with a CGEvent coordinate-click fallback, plus screen-coordinate\n * click targets — click-only by ruling), type (focus + System Events\n * keystroke), key (System Events keyCode/keystroke over a minimal SendKeys\n * aligned table, parsed host-side), scroll (CGEvent scroll wheel).\n * - The facade exposes no replay method (this package ships no replay);\n * sensitive actions stay behind the shared `requiresDesktopUserConfirmation`\n * fail-closed gate.\n * - Non-darwin platforms never throw at import or call time: probe reports\n * `{available:false, reason:\"macOS Accessibility requires darwin\"}` and\n * every tool returns an explicit `unsupported` result. Missing\n * Accessibility (assistive access) permission is reported fail-closed as\n * `accessibility-permission-required`; no degraded mode.\n * This file is a deliberate copy shared (not imported) with the observe\n * package's adapter; the observe copy carries the query script only.\n */\nimport { spawnSync as nodeSpawnSync } from \"node:child_process\";\nimport { detachedFreeze } from \"@agent-forge/plugin-sdk\";\nimport type {\n\tDesktopActionV1,\n\tDesktopCapabilityIdV1,\n\tDesktopControlIdentityV1,\n\tDesktopErrorV1,\n\tDesktopFullControlAdapterV1,\n\tDesktopMacosDriverV1,\n\tDesktopMacosProbeV1,\n\tDesktopObservationV1,\n\tDesktopOperationRequestV1,\n\tDesktopOperationResultV1,\n\tDesktopPostconditionV1,\n\tDesktopSessionRequestV1,\n\tDesktopSessionResultV1,\n\tDesktopSessionV1,\n\tDesktopTargetRefV1,\n\tDesktopVerificationV1,\n\tDesktopWindowIdentityV1,\n} from \"./types.ts\";\nimport { requiresDesktopUserConfirmation } from \"./types.ts\";\n\ntype RawWindow = {\n\tid?: string;\n\tprocessId?: number;\n\tprocessName?: string;\n\tname?: string;\n\tx?: number;\n\ty?: number;\n\twidth?: number;\n\theight?: number;\n};\ntype RawControl = {\n\twindowId?: string;\n\tcontrolId?: string;\n\trole?: string;\n\tname?: string;\n\tenabled?: boolean;\n\tvalue?: string;\n\tx?: number;\n\ty?: number;\n\twidth?: number;\n\theight?: number;\n};\ntype RawSnapshot = {\n\tavailable?: boolean;\n\treason?: string;\n\twindows?: RawWindow[];\n\tcontrols?: RawControl[];\n\tfocusedControlId?: string;\n};\n\ntype MacosSpawnResult = {\n\treadonly error?: Error;\n\treadonly status: number | null;\n\treadonly stdout: string;\n\treadonly stderr?: string;\n};\n\ntype MacosSpawn = (\n\tcommand: string,\n\targs: readonly string[],\n\toptions: {\n\t\treadonly encoding: \"utf8\";\n\t\treadonly timeout: number;\n\t\treadonly windowsHide: boolean;\n\t\treadonly env: NodeJS.ProcessEnv;\n\t},\n) => MacosSpawnResult;\n\nexport interface MacosAccessibilityDriverOptions {\n\t/** Override the osascript executable for a brokered host or test harness. */\n\treadonly command?: string;\n\treadonly timeoutMs?: number;\n\t/** Injectable host boundary for deterministic tests and brokered deployments. */\n\treadonly spawnSync?: MacosSpawn;\n\t/** Override the platform reported to the driver; intended for host adapters/tests. */\n\treadonly platform?: NodeJS.Platform;\n}\n\nconst READONLY_CAPABILITIES: readonly DesktopCapabilityIdV1[] = [\"desktop-session\", \"desktop-uia\", \"desktop-input\"];\nconst SUPPORTED_ACTIONS: readonly DesktopActionV1[\"kind\"][] = [\"focus\", \"click\", \"type\", \"key\", \"scroll\"];\n\nconst error = (code: string, message: string, causeCode?: string): DesktopErrorV1 => ({\n\tversion: 1,\n\tcode,\n\tmessage,\n\t...(causeCode === undefined ? {} : { causeCode }),\n});\n\nconst unsupported = (\n\toperationId: string,\n\treason: string,\n\tcauseCode = \"platform-unavailable\",\n): DesktopOperationResultV1 => ({\n\tversion: 1,\n\toperationId,\n\tstatus: \"unsupported\",\n\tsummary: reason,\n\terror: error(causeCode === \"action-unsupported\" ? \"action_unsupported\" : \"platform_unavailable\", reason, causeCode),\n});\n\nconst rectangle = (raw: { x?: number; y?: number; width?: number; height?: number }) => ({\n\tx: Number.isFinite(raw.x) ? Number(raw.x) : 0,\n\ty: Number.isFinite(raw.y) ? Number(raw.y) : 0,\n\twidth: Number.isFinite(raw.width) ? Number(raw.width) : 0,\n\theight: Number.isFinite(raw.height) ? Number(raw.height) : 0,\n});\n\nconst isPermissionReason = (value: string): boolean =>\n\t/assistive access|not authorized|accessibility-permission-required/i.test(value);\n\n/**\n * JXA observation script. Enumerates every non-background System Events\n * process's windows (caps: 64 windows, 256 controls total, mirroring the\n * projection budgets) with role/name/position/size/enabled/value per control,\n * plus the frontmost process's focused element matched by role and frame.\n * Permission or automation failures are reported in-band as\n * `{available:false, reason:...}` so the probe can classify them; the reason\n * literal `accessibility-permission-required` is reserved for missing\n * Accessibility (assistive access) grants.\n */\nconst QUERY_SCRIPT = `\nvar se = Application('com.apple.systemevents');\nfunction safe(fn) { try { return fn(); } catch (e) { return undefined; } }\nfunction rectOf(el) {\n var p = safe(function() { return el.position(); });\n var z = safe(function() { return el.size(); });\n if (p === undefined || z === undefined || p.length < 2 || z.length < 2) return {x: 0, y: 0, width: 0, height: 0};\n return {x: Math.round(p[0]), y: Math.round(p[1]), width: Math.round(z[0]), height: Math.round(z[1])};\n}\nfunction axReason(e) {\n var msg = String(e && e.message !== undefined ? e.message : e);\n var num = e && typeof e.errorNumber === 'number' ? e.errorNumber : 0;\n if (msg.indexOf('assistive access') !== -1 || msg.indexOf('not authorized') !== -1 ||\n num === -25211 || num === -1719 || num === -1743) return 'accessibility-permission-required';\n return msg;\n}\ntry {\n var out = {available: true, windows: [], controls: [], focusedControlId: null};\n var procs = se.processes();\n var focused = null;\n for (var fi = 0; fi < procs.length; fi++) {\n var fp = procs[fi];\n if (safe(function() { return fp.frontmost(); }) !== true) continue;\n var fe = safe(function() { return fp.attributes['AXFocusedUIElement'].value(); });\n if (fe !== undefined) focused = {role: safe(function() { return fe.role(); }), rect: rectOf(fe)};\n break;\n }\n var windowCount = 0;\n var controlCount = 0;\n for (var pi = 0; pi < procs.length && windowCount < 64; pi++) {\n var proc = procs[pi];\n if (safe(function() { return proc.backgroundOnly(); }) === true) continue;\n var wins = safe(function() { return proc.windows(); });\n if (wins === undefined || wins.length === 0) continue;\n var pid = safe(function() { return proc.unixId(); });\n var pname = safe(function() { return proc.name(); });\n if (typeof pname !== 'string' || pname.length === 0) pname = 'unknown';\n for (var wi = 0; wi < wins.length && windowCount < 64; wi++) {\n var win = wins[wi];\n var winRect = rectOf(win);\n var winId = 'window-' + pid + '-' + wi;\n windowCount++;\n out.windows.push({id: winId, processId: pid, processName: pname,\n name: safe(function() { return win.name(); }) || '', x: winRect.x, y: winRect.y,\n width: winRect.width, height: winRect.height});\n var contents = safe(function() { return win.entireContents(); });\n if (contents === undefined) continue;\n for (var ci = 0; ci < contents.length && controlCount < 256; ci++) {\n var el = contents[ci];\n var role = safe(function() { return el.role(); });\n if (typeof role !== 'string' || role.length === 0) continue;\n var r = rectOf(el);\n var controlId = winId + ':' + role + ':' + ci;\n var value = safe(function() { return el.value(); });\n out.controls.push({windowId: winId, controlId: controlId, role: role,\n name: safe(function() { return el.name(); }) || safe(function() { return el.title(); }) || '',\n enabled: safe(function() { return el.enabled(); }) !== false,\n value: typeof value === 'string' && value.length > 0 ? value : undefined,\n x: r.x, y: r.y, width: r.width, height: r.height});\n controlCount++;\n if (focused !== null && out.focusedControlId === null && role === focused.role &&\n r.x === focused.rect.x && r.y === focused.rect.y &&\n r.width === focused.rect.width && r.height === focused.rect.height) {\n out.focusedControlId = controlId;\n }\n }\n }\n }\n JSON.stringify(out);\n} catch (e) {\n JSON.stringify({available: false, reason: axReason(e)});\n}`;\n\n/**\n * JXA bounded-input script. Reads the JSON payload from\n * `AGENT_FORGE_MACOS_AX_INPUT`: `{kind, target:{windowId?, controlId?,\n * coordinates?}, text?, key:{keyCode?, text?, modifiers?},\n * scroll:{up, lines}}`. The target is re-located through the same\n * deterministic enumeration the query script used; an unfound identity is a\n * stale target. Output: `{ok:true}` or `{ok:false, code, reason}`.\n */\nconst ACTION_SCRIPT = `\nObjC.import('CoreGraphics');\nvar se = Application('com.apple.systemevents');\nfunction safe(fn) { try { return fn(); } catch (e) { return undefined; } }\nfunction rectOf(el) {\n var p = safe(function() { return el.position(); });\n var z = safe(function() { return el.size(); });\n if (p === undefined || z === undefined || p.length < 2 || z.length < 2) return {x: 0, y: 0, width: 0, height: 0};\n return {x: Math.round(p[0]), y: Math.round(p[1]), width: Math.round(z[0]), height: Math.round(z[1])};\n}\nfunction findProcess(pid) {\n var procs = se.processes();\n for (var i = 0; i < procs.length; i++) {\n if (safe(function() { return procs[i].unixId(); }) === pid) return procs[i];\n }\n return undefined;\n}\nfunction parseWindowId(windowId) {\n var m = /^window-(\\\\d+)-(\\\\d+)$/.exec(String(windowId));\n return m === null ? undefined : {pid: Number(m[1]), index: Number(m[2])};\n}\nfunction findWindow(windowId) {\n var parsed = parseWindowId(windowId);\n if (parsed === undefined) return undefined;\n var proc = findProcess(parsed.pid);\n if (proc === undefined) return undefined;\n var wins = safe(function() { return proc.windows(); });\n if (wins === undefined || parsed.index >= wins.length) return undefined;\n return {proc: proc, win: wins[parsed.index]};\n}\nfunction findControl(windowId, controlId) {\n var located = findWindow(windowId);\n if (located === undefined) return undefined;\n var parts = String(controlId).split(':');\n if (parts.length < 3) return undefined;\n var index = Number(parts[parts.length - 1]);\n var role = parts[parts.length - 2];\n var contents = safe(function() { return located.win.entireContents(); });\n if (contents === undefined || index >= contents.length) return undefined;\n var el = contents[index];\n if (safe(function() { return el.role(); }) !== role) return undefined;\n return {proc: located.proc, win: located.win, el: el};\n}\nfunction cgClick(x, y) {\n var pt = {x: x, y: y};\n var move = $.CGEventCreateMouseEvent($(), $.kCGEventMouseMoved, pt, $.kCGMouseButtonLeft);\n $.CGEventPost($.kCGHIDEventTap, move);\n var down = $.CGEventCreateMouseEvent($(), $.kCGEventLeftMouseDown, pt, $.kCGMouseButtonLeft);\n $.CGEventPost($.kCGHIDEventTap, down);\n var up = $.CGEventCreateMouseEvent($(), $.kCGEventLeftMouseUp, pt, $.kCGMouseButtonLeft);\n $.CGEventPost($.kCGHIDEventTap, up);\n}\nfunction cgScroll(x, y, lines, up) {\n var pt = {x: x, y: y};\n var move = $.CGEventCreateMouseEvent($(), $.kCGEventMouseMoved, pt, $.kCGMouseButtonLeft);\n $.CGEventPost($.kCGHIDEventTap, move);\n var ev = $.CGEventCreateScrollWheelEvent($(), $.kCGScrollEventUnitLine, 1, up ? lines : -lines);\n $.CGEventPost($.kCGHIDEventTap, ev);\n}\nfunction setFocused(el) {\n try { el.focused = true; return true; } catch (e) { return false; }\n}\ntry {\n var payload = JSON.parse($.NSProcessInfo.processInfo.environment.objectForKey('AGENT_FORGE_MACOS_AX_INPUT').js);\n var target = payload.target || {};\n var el = undefined;\n var win = undefined;\n var proc = undefined;\n if (target.windowId !== undefined && target.controlId !== undefined) {\n var control = findControl(target.windowId, target.controlId);\n if (control === undefined) throw {stale: true};\n el = control.el; win = control.win; proc = control.proc;\n } else if (target.windowId !== undefined) {\n var located = findWindow(target.windowId);\n if (located === undefined) throw {stale: true};\n win = located.win; proc = located.proc;\n }\n if (payload.kind === 'focus') {\n if (el !== undefined) {\n if (!setFocused(el)) throw {reason: 'focus_failed'};\n } else if (win !== undefined) {\n try { proc.frontmost = true; } catch (e) {}\n if (safe(function() { return win.actions['AXRaise'].perform(); }) === undefined && safe(function() { return proc.frontmost(); }) !== true) {\n throw {reason: 'focus_failed'};\n }\n } else {\n throw {reason: 'ax_action_exception'};\n }\n } else if (payload.kind === 'click') {\n if (target.coordinates !== undefined) {\n cgClick(Number(target.coordinates.x), Number(target.coordinates.y));\n } else if (el !== undefined) {\n var performed = false;\n try { el.actions['AXPress'].perform(); performed = true; } catch (e) {}\n if (!performed) {\n var r = rectOf(el);\n if (r.width <= 0 && r.height <= 0) throw {reason: 'press_unavailable'};\n cgClick(r.x + Math.floor(r.width / 2), r.y + Math.floor(r.height / 2));\n }\n } else if (win !== undefined) {\n var wr = rectOf(win);\n cgClick(wr.x + Math.floor(wr.width / 2), wr.y + Math.floor(wr.height / 2));\n } else {\n throw {reason: 'ax_action_exception'};\n }\n } else if (payload.kind === 'type') {\n if (el !== undefined && !setFocused(el)) throw {reason: 'focus_failed'};\n if (el === undefined && win !== undefined) {\n try { proc.frontmost = true; } catch (e) {}\n }\n se.keystroke(String(payload.text));\n } else if (payload.kind === 'key') {\n if (el !== undefined && !setFocused(el)) throw {reason: 'focus_failed'};\n var using = Array.isArray(payload.key.modifiers) && payload.key.modifiers.length > 0 ? {using: payload.key.modifiers} : {};\n if (typeof payload.key.keyCode === 'number') {\n se.keyCode(payload.key.keyCode, using);\n } else {\n se.keystroke(String(payload.key.text), using);\n }\n } else if (payload.kind === 'scroll') {\n var center = target.coordinates !== undefined\n ? {x: Number(target.coordinates.x), y: Number(target.coordinates.y)}\n : (el !== undefined ? rectOf(el) : (win !== undefined ? rectOf(win) : {x: 0, y: 0, width: 0, height: 0}));\n cgScroll(center.x + Math.floor((center.width || 0) / 2), center.y + Math.floor((center.height || 0) / 2),\n Number(payload.scroll.lines), payload.scroll.up === true);\n } else {\n throw {reason: 'ax_action_exception'};\n }\n JSON.stringify({ok: true});\n} catch (e) {\n if (e && e.stale === true) {\n JSON.stringify({ok: false, code: 'stale_target', reason: 'ax_action_exception'});\n } else {\n var reason = e && typeof e.reason === 'string' ? e.reason : 'ax_action_exception';\n JSON.stringify({ok: false, code: 'action_failed', reason: reason});\n }\n}`;\n\nconst parseJson = (stdout: string): Record<string, unknown> | undefined => {\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(stdout.trim());\n\t\treturn typeof parsed === \"object\" && parsed !== null ? (parsed as Record<string, unknown>) : undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n};\n\n/**\n * Minimal SendKeys-aligned key grammar, parsed host-side because JXA has no\n * SendKeys equivalent. Grammar: optional modifier prefixes (`+` shift,\n * `^` control, `%` option — the Windows SendKeys mapping) followed by either\n * one `{NAME}` special key or exactly one literal character.\n */\nconst MAC_KEY_CODES: Readonly<Record<string, number>> = Object.freeze({\n\tRETURN: 36,\n\tENTER: 36,\n\tTAB: 48,\n\tESC: 53,\n\tESCAPE: 53,\n\tDEL: 117,\n\tDELETE: 117,\n\tBS: 51,\n\tBKSP: 51,\n\tBACKSPACE: 51,\n\tUP: 126,\n\tDOWN: 125,\n\tLEFT: 123,\n\tRIGHT: 124,\n\tHOME: 115,\n\tEND: 119,\n\tPGUP: 116,\n\tPAGEUP: 116,\n\tPGDN: 121,\n\tPAGEDOWN: 121,\n\tSPACE: 49,\n\tF1: 122,\n\tF2: 120,\n\tF3: 99,\n\tF4: 118,\n\tF5: 96,\n\tF6: 97,\n\tF7: 98,\n\tF8: 100,\n\tF9: 101,\n\tF10: 109,\n\tF11: 103,\n\tF12: 111,\n});\n\ntype MacosKeyStroke = {\n\treadonly keyCode?: number;\n\treadonly text?: string;\n\treadonly modifiers?: readonly string[];\n};\n\nconst parseMacKey = (key: string): MacosKeyStroke | undefined => {\n\tconst modifiers: string[] = [];\n\tlet index = 0;\n\tfor (; index < key.length; index += 1) {\n\t\tconst modifier = key[index];\n\t\tif (modifier === \"+\") modifiers.push(\"shift down\");\n\t\telse if (modifier === \"^\") modifiers.push(\"control down\");\n\t\telse if (modifier === \"%\") modifiers.push(\"option down\");\n\t\telse break;\n\t}\n\tconst unit = key.slice(index);\n\tconst braced = /^\\{([A-Z0-9]+)\\}$/.exec(unit);\n\tif (braced !== null) {\n\t\tconst keyCode = MAC_KEY_CODES[braced[1] ?? \"\"];\n\t\tif (keyCode === undefined) return undefined;\n\t\treturn { keyCode, ...(modifiers.length === 0 ? {} : { modifiers }) };\n\t}\n\tif (unit.length !== 1) return undefined;\n\treturn { text: unit, ...(modifiers.length === 0 ? {} : { modifiers }) };\n};\n\nconst parseMacScroll = (text: string): { readonly up: boolean; readonly lines: number } | undefined => {\n\tconst match = /^(up|down)(?::(\\d+))?$/.exec(text);\n\tif (match === null) return undefined;\n\tconst lines = match[2] === undefined ? 3 : Number(match[2]);\n\tif (lines < 1 || lines > 100) return undefined;\n\treturn { up: match[1] === \"up\", lines };\n};\n\nexport class MacosAccessibilityDriver implements DesktopMacosDriverV1 {\n\treadonly driverId = \"macos-ax\";\n\treadonly driverVersion = \"1.0.0\";\n\tprivate readonly command: string;\n\tprivate readonly timeoutMs: number;\n\tprivate readonly platform: NodeJS.Platform;\n\tprivate readonly spawn: MacosSpawn;\n\tprivate readonly sessions = new Map<string, DesktopSessionV1>();\n\tprivate readonly targets = new Map<\n\t\tstring,\n\t\t{\n\t\t\treadonly sessionId: string;\n\t\t\treadonly observationId: string;\n\t\t\treadonly windowId: string;\n\t\t\treadonly controlId?: string;\n\t\t}\n\t>();\n\tprivate readonly sessionTargetKeys = new Map<string, Set<string>>();\n\tprivate readonly latestObservationIds = new Map<string, string>();\n\tprivate readonly observedSessions = new Set<string>();\n\tprivate nextSessionId = 1;\n\tprivate nextObservationId = 1;\n\n\tconstructor(options: MacosAccessibilityDriverOptions = {}) {\n\t\tthis.command = options.command ?? \"osascript\";\n\t\t// 60s: Apple events from an SSH (Background launchd) session run ~100x\n\t\t// slower than a GUI session — one full enumeration measured 38s there;\n\t\t// GUI sessions complete in seconds and stay unaffected by the raise.\n\t\tthis.timeoutMs = options.timeoutMs ?? 60_000;\n\t\tthis.platform = options.platform ?? process.platform;\n\t\tthis.spawn =\n\t\t\toptions.spawnSync ??\n\t\t\t((command, args, spawnOptions) => nodeSpawnSync(command, args, spawnOptions) as unknown as MacosSpawnResult);\n\t}\n\n\tprobe(): DesktopMacosProbeV1 {\n\t\tif (this.platform !== \"darwin\") {\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tplatform: this.platform,\n\t\t\t\tdriver: \"macos-ax\",\n\t\t\t\treason: \"macOS Accessibility requires darwin\",\n\t\t\t};\n\t\t}\n\t\tconst run = this.run(QUERY_SCRIPT);\n\t\tif (run === undefined)\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tplatform: this.platform,\n\t\t\t\tdriver: \"macos-ax\",\n\t\t\t\treason: \"macOS Accessibility requires darwin\",\n\t\t\t};\n\t\tif (run.failed)\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tplatform: this.platform,\n\t\t\t\tdriver: \"macos-ax\",\n\t\t\t\treason: isPermissionReason(run.stderr) ? \"accessibility-permission-required\" : \"osascript is unavailable\",\n\t\t\t};\n\t\tconst raw = parseJson(run.stdout);\n\t\tif (raw === undefined)\n\t\t\treturn {\n\t\t\t\tavailable: false,\n\t\t\t\tplatform: this.platform,\n\t\t\t\tdriver: \"macos-ax\",\n\t\t\t\treason: \"osascript is unavailable\",\n\t\t\t};\n\t\tif (raw.available === true)\n\t\t\treturn {\n\t\t\t\tavailable: true,\n\t\t\t\tplatform: this.platform,\n\t\t\t\tdriver: \"macos-ax\",\n\t\t\t\tcapabilities: READONLY_CAPABILITIES,\n\t\t\t};\n\t\tconst reason =\n\t\t\ttypeof raw.reason === \"string\" && raw.reason.trim() !== \"\" ? raw.reason : \"macOS Accessibility probe failed\";\n\t\treturn { available: false, platform: this.platform, driver: \"macos-ax\", reason };\n\t}\n\n\topenSession(request: DesktopSessionRequestV1): DesktopSessionResultV1 {\n\t\tconst probe = this.probe();\n\t\tif (!probe.available)\n\t\t\treturn {\n\t\t\t\tstatus: \"unsupported\",\n\t\t\t\terror: error(\n\t\t\t\t\t\"platform_unavailable\",\n\t\t\t\t\tprobe.reason ?? \"macOS Accessibility is unavailable\",\n\t\t\t\t\t\"platform-unavailable\",\n\t\t\t\t),\n\t\t\t};\n\t\tconst session = detachedFreeze({\n\t\t\tversion: 1 as const,\n\t\t\tsessionId: `desktop-macos-session-${this.nextSessionId++}`,\n\t\t\tisolation: request.isolation,\n\t\t\tstatus: \"ready\" as const,\n\t\t\t...(request.applicationId === undefined ? {} : { applicationId: request.applicationId }),\n\t\t});\n\t\tthis.sessions.set(session.sessionId, session);\n\t\treturn { status: \"succeeded\", session };\n\t}\n\n\tobserve(sessionId: string): DesktopObservationV1 | DesktopOperationResultV1 {\n\t\tconst session = this.sessions.get(sessionId);\n\t\tif (session === undefined) return this.failed(\"observe\", \"session_not_found\", \"Session does not exist\");\n\t\tif (session.status === \"stopped\") return this.cancelled(\"observe\", \"Session has been stopped\");\n\t\tconst run = this.run(QUERY_SCRIPT);\n\t\tconst raw = run === undefined || run.failed ? undefined : parseJson(run.stdout);\n\t\tif (raw === undefined || raw.available !== true) {\n\t\t\tthis.invalidateObservation(sessionId);\n\t\t\treturn unsupported(\"observe\", \"macOS Accessibility observation failed\");\n\t\t}\n\t\treturn this.toObservation(session, raw as unknown as RawSnapshot);\n\t}\n\n\texecute(request: DesktopOperationRequestV1): DesktopOperationResultV1 {\n\t\tconst session = this.sessions.get(request.sessionId);\n\t\tif (session === undefined) return this.failed(request.operationId, \"session_not_found\", \"Session does not exist\");\n\t\tif (session.status === \"stopped\") return this.cancelled(request.operationId, \"Session has been stopped\");\n\t\tif (requiresDesktopUserConfirmation(request.action.kind))\n\t\t\treturn {\n\t\t\t\tversion: 1,\n\t\t\t\toperationId: request.operationId,\n\t\t\t\tstatus: \"needs_user\",\n\t\t\t\tsummary: `User confirmation required for ${request.action.kind}`,\n\t\t\t\terror: error(\"needs_user\", `The ${request.action.kind} action is paused for the user`, request.action.kind),\n\t\t\t};\n\t\tif (!SUPPORTED_ACTIONS.includes(request.action.kind))\n\t\t\treturn unsupported(\n\t\t\t\trequest.operationId,\n\t\t\t\t\"The selected macOS Accessibility adapter does not support this action\",\n\t\t\t\t\"action-unsupported\",\n\t\t\t);\n\t\tif (request.action.target === undefined)\n\t\t\treturn this.failed(request.operationId, \"target_required\", \"This desktop action requires an observed target\");\n\t\tif (request.action.target.kind === \"coordinates\" && request.action.kind !== \"click\")\n\t\t\treturn this.failed(\n\t\t\t\trequest.operationId,\n\t\t\t\t\"coordinates_unsupported\",\n\t\t\t\t\"Coordinate targets are supported by the click action only\",\n\t\t\t);\n\t\tif (request.action.kind === \"type\" && typeof request.action.text !== \"string\")\n\t\t\treturn this.failed(request.operationId, \"text_required\", \"Type action requires text\");\n\t\tif (request.action.kind === \"key\" && typeof request.action.key !== \"string\")\n\t\t\treturn this.failed(request.operationId, \"key_required\", \"Key action requires a key sequence\");\n\t\tif (request.action.kind === \"scroll\" && typeof request.action.text !== \"string\")\n\t\t\treturn this.failed(request.operationId, \"direction_required\", \"Scroll action requires an up/down direction\");\n\t\tconst postconditions = request.postconditions ?? [];\n\t\tif (postconditions.length > 0 && request.reobserveAfterAction === false)\n\t\t\treturn this.failed(\n\t\t\t\trequest.operationId,\n\t\t\t\t\"reobserve_required\",\n\t\t\t\t\"Postconditions require an action re-observation\",\n\t\t\t);\n\t\tconst payload = this.actionPayload(request);\n\t\tif (payload === undefined)\n\t\t\treturn this.failed(request.operationId, payloadErrorCode(request.action), payloadErrorMessage(request.action));\n\t\tconst raw = this.run(ACTION_SCRIPT, payload);\n\t\tif (raw === undefined || raw.failed) return unsupported(request.operationId, \"macOS Accessibility action failed\");\n\t\tconst parsed = parseJson(raw.stdout);\n\t\tif (parsed === undefined) return unsupported(request.operationId, \"macOS Accessibility action failed\");\n\t\tif (parsed.ok !== true) {\n\t\t\tif (parsed.code === \"stale_target\") {\n\t\t\t\tthis.invalidateObservation(request.sessionId);\n\t\t\t\treturn this.failed(\n\t\t\t\t\trequest.operationId,\n\t\t\t\t\t\"stale_target\",\n\t\t\t\t\t\"Target identity is stale; reobserve the desktop before retrying\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst causeCode =\n\t\t\t\ttypeof parsed.reason === \"string\" &&\n\t\t\t\t[\"focus_failed\", \"press_unavailable\", \"coordinate_click_failed\", \"ax_action_exception\"].includes(\n\t\t\t\t\tparsed.reason,\n\t\t\t\t)\n\t\t\t\t\t? parsed.reason\n\t\t\t\t\t: \"ax_action_exception\";\n\t\t\treturn this.failed(request.operationId, \"action_failed\", \"Accessibility action failed\", causeCode);\n\t\t}\n\t\tconst observation = request.reobserveAfterAction === false ? undefined : this.observe(request.sessionId);\n\t\tconst verification = this.verifyPostconditions(postconditions, observation);\n\t\tif (postconditions.length > 0 && verification.status === \"unknown\")\n\t\t\treturn {\n\t\t\t\tversion: 1,\n\t\t\t\toperationId: request.operationId,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tsummary: \"Desktop action completed but could not be re-observed\",\n\t\t\t\tverification,\n\t\t\t\terror: error(\n\t\t\t\t\t\"verification_unavailable\",\n\t\t\t\t\t\"The requested desktop state could not be re-observed\",\n\t\t\t\t\t\"reobserve-failed\",\n\t\t\t\t),\n\t\t\t};\n\t\tif (verification.status === \"failed\")\n\t\t\treturn {\n\t\t\t\tversion: 1,\n\t\t\t\toperationId: request.operationId,\n\t\t\t\tstatus: \"failed\",\n\t\t\t\tsummary: \"Desktop action completed but a postcondition failed\",\n\t\t\t\t...(observation !== undefined && \"observationId\" in observation ? { observation } : {}),\n\t\t\t\tverification,\n\t\t\t\terror: error(\"postcondition_failed\", \"The requested desktop state was not observed\", \"verification-failed\"),\n\t\t\t};\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\toperationId: request.operationId,\n\t\t\tstatus: \"succeeded\",\n\t\t\tsummary: \"Desktop action completed through macOS Accessibility\",\n\t\t\t...(observation !== undefined && \"observationId\" in observation ? { observation } : {}),\n\t\t\tverification,\n\t\t};\n\t}\n\n\tstop(sessionId: string): DesktopSessionV1 | DesktopOperationResultV1 {\n\t\tconst session = this.sessions.get(sessionId);\n\t\tif (session === undefined) return this.failed(\"stop\", \"session_not_found\", \"Session does not exist\");\n\t\tconst stopped = detachedFreeze({ ...session, status: \"stopped\" as const });\n\t\tthis.sessions.set(sessionId, stopped);\n\t\tthis.invalidateObservation(sessionId);\n\t\treturn stopped;\n\t}\n\n\tprivate actionPayload(request: DesktopOperationRequestV1):\n\t\t| {\n\t\t\t\treadonly kind: DesktopActionV1[\"kind\"];\n\t\t\t\treadonly target: {\n\t\t\t\t\treadonly windowId?: string;\n\t\t\t\t\treadonly controlId?: string;\n\t\t\t\t\treadonly coordinates?: { readonly x: number; readonly y: number };\n\t\t\t\t};\n\t\t\t\treadonly text?: string;\n\t\t\t\treadonly key?: MacosKeyStroke;\n\t\t\t\treadonly scroll?: { readonly up: boolean; readonly lines: number };\n\t\t }\n\t\t| undefined {\n\t\tconst target = request.action.target;\n\t\tif (target === undefined) return undefined;\n\t\tconst resolvedTarget =\n\t\t\ttarget.kind === \"coordinates\"\n\t\t\t\t? { coordinates: { x: target.x, y: target.y } }\n\t\t\t\t: (this.resolveTarget(request.sessionId, target) ?? undefined);\n\t\tif (resolvedTarget === undefined) return undefined;\n\t\tif (request.action.kind === \"key\") {\n\t\t\tconst key = parseMacKey(request.action.key ?? \"\");\n\t\t\tif (key === undefined) return undefined;\n\t\t\treturn { kind: request.action.kind, target: resolvedTarget, key };\n\t\t}\n\t\tif (request.action.kind === \"scroll\") {\n\t\t\tconst scroll = parseMacScroll(request.action.text ?? \"\");\n\t\t\tif (scroll === undefined) return undefined;\n\t\t\treturn { kind: request.action.kind, target: resolvedTarget, scroll };\n\t\t}\n\t\treturn {\n\t\t\tkind: request.action.kind,\n\t\t\ttarget: resolvedTarget,\n\t\t\t...(request.action.text === undefined ? {} : { text: request.action.text }),\n\t\t};\n\t}\n\n\tprivate run(\n\t\tscript: string,\n\t\tpayload?: unknown,\n\t): { readonly stdout: string; readonly stderr: string; readonly failed: boolean } | undefined {\n\t\tif (this.platform !== \"darwin\") return undefined;\n\t\tconst env: NodeJS.ProcessEnv = {};\n\t\tfor (const key of [\"PATH\", \"HOME\", \"TMPDIR\", \"USER\", \"LOGNAME\"] as const) {\n\t\t\tconst value = process.env[key];\n\t\t\tif (value !== undefined) env[key] = value;\n\t\t}\n\t\tif (payload !== undefined) env.AGENT_FORGE_MACOS_AX_INPUT = JSON.stringify(payload);\n\t\tconst result = this.spawn(this.command, [\"-l\", \"JavaScript\", \"-e\", script], {\n\t\t\tencoding: \"utf8\",\n\t\t\ttimeout: this.timeoutMs,\n\t\t\twindowsHide: true,\n\t\t\tenv,\n\t\t});\n\t\tif (result.error !== undefined || result.status !== 0)\n\t\t\treturn { stdout: result.stdout, stderr: result.stderr ?? \"\", failed: true };\n\t\treturn { stdout: result.stdout, stderr: result.stderr ?? \"\", failed: false };\n\t}\n\n\tprivate toObservation(session: DesktopSessionV1, raw: RawSnapshot): DesktopObservationV1 {\n\t\tthis.invalidateObservation(session.sessionId);\n\t\tconst observationId = `desktop-macos-observation-${this.nextObservationId++}`;\n\t\tconst targetKeys = new Set<string>();\n\t\tthis.sessionTargetKeys.set(session.sessionId, targetKeys);\n\t\tconst windows: DesktopWindowIdentityV1[] = [];\n\t\tfor (const item of raw.windows ?? []) {\n\t\t\tif (typeof item.id !== \"string\" || item.id === \"\") continue;\n\t\t\tconst windowId = item.id;\n\t\t\twindows.push({\n\t\t\t\tversion: 1,\n\t\t\t\twindowId,\n\t\t\t\tappId: `process:${Number(item.processId ?? 0)}`,\n\t\t\t\ttitle: item.name ?? \"\",\n\t\t\t\tbounds: rectangle(item),\n\t\t\t});\n\t\t}\n\t\tconst visibleWindows =\n\t\t\tsession.applicationId === undefined\n\t\t\t\t? windows\n\t\t\t\t: windows.filter((window) => window.appId === session.applicationId);\n\t\tfor (const window of visibleWindows) {\n\t\t\tconst key = this.targetKey(session.sessionId, \"window\", window.windowId);\n\t\t\tthis.targets.set(key, { sessionId: session.sessionId, observationId, windowId: window.windowId });\n\t\t\ttargetKeys.add(key);\n\t\t}\n\t\tconst controls: DesktopControlIdentityV1[] = [];\n\t\tfor (const item of raw.controls ?? []) {\n\t\t\tif (typeof item.windowId !== \"string\" || !visibleWindows.some((window) => window.windowId === item.windowId))\n\t\t\t\tcontinue;\n\t\t\tconst controlId = item.controlId ?? \"\";\n\t\t\tconst key = this.targetKey(session.sessionId, \"control\", controlId);\n\t\t\tthis.targets.set(key, {\n\t\t\t\tsessionId: session.sessionId,\n\t\t\t\tobservationId,\n\t\t\t\twindowId: item.windowId,\n\t\t\t\tcontrolId,\n\t\t\t});\n\t\t\ttargetKeys.add(key);\n\t\t\tcontrols.push({\n\t\t\t\tversion: 1,\n\t\t\t\tcontrolId,\n\t\t\t\twindowId: item.windowId,\n\t\t\t\trole: item.role ?? \"\",\n\t\t\t\tname: item.name ?? \"\",\n\t\t\t\tbounds: rectangle(item),\n\t\t\t\tenabled: item.enabled !== false,\n\t\t\t\t...(typeof item.value === \"string\" && item.value.length > 0 ? { value: item.value } : {}),\n\t\t\t});\n\t\t}\n\t\tconst focusedControlId =\n\t\t\ttypeof raw.focusedControlId === \"string\" &&\n\t\t\tcontrols.some((control) => control.controlId === raw.focusedControlId)\n\t\t\t\t? raw.focusedControlId\n\t\t\t\t: undefined;\n\t\tconst observation = detachedFreeze({\n\t\t\tversion: 1 as const,\n\t\t\tsessionId: session.sessionId,\n\t\t\tobservationId,\n\t\t\tsource: \"macos-ax\" as const,\n\t\t\twindows: visibleWindows,\n\t\t\tcontrols,\n\t\t\t...(focusedControlId !== undefined ? { focusedControlId } : {}),\n\t\t});\n\t\tthis.latestObservationIds.set(session.sessionId, observationId);\n\t\tthis.observedSessions.add(session.sessionId);\n\t\treturn observation;\n\t}\n\n\tprivate resolveTarget(\n\t\tsessionId: string,\n\t\ttarget: Exclude<DesktopTargetRefV1, { kind: \"coordinates\" }>,\n\t): { windowId?: string; controlId?: string } | undefined {\n\t\tconst identity = target.kind === \"control\" ? target.controlId : target.windowId;\n\t\tconst record = this.targets.get(this.targetKey(sessionId, target.kind, identity));\n\t\tif (\n\t\t\trecord === undefined ||\n\t\t\trecord.sessionId !== sessionId ||\n\t\t\trecord.observationId !== this.latestObservationIds.get(sessionId)\n\t\t)\n\t\t\treturn undefined;\n\t\treturn {\n\t\t\twindowId: record.windowId,\n\t\t\t...(record.controlId === undefined ? {} : { controlId: record.controlId }),\n\t\t};\n\t}\n\n\tprivate targetKey(sessionId: string, kind: DesktopTargetRefV1[\"kind\"], identity: string): string {\n\t\treturn `${sessionId}:${kind}:${identity}`;\n\t}\n\n\tprivate invalidateObservation(sessionId: string): void {\n\t\tfor (const key of this.sessionTargetKeys.get(sessionId) ?? []) this.targets.delete(key);\n\t\tthis.sessionTargetKeys.delete(sessionId);\n\t\tthis.latestObservationIds.delete(sessionId);\n\t}\n\n\tprivate verifyPostconditions(\n\t\tpostconditions: readonly DesktopPostconditionV1[],\n\t\tobservation: DesktopObservationV1 | DesktopOperationResultV1 | undefined,\n\t): DesktopVerificationV1 {\n\t\tif (postconditions.length === 0) return { status: \"passed\", checks: [] };\n\t\tif (observation === undefined || !(\"observationId\" in observation))\n\t\t\treturn { status: \"unknown\", checks: [\"observation-unavailable\"] };\n\t\tconst checks: string[] = [];\n\t\tfor (const condition of postconditions) {\n\t\t\tconst passed = this.checkPostcondition(condition, observation);\n\t\t\tchecks.push(`${condition.kind}:${passed ? \"passed\" : \"failed\"}`);\n\t\t\tif (!passed) return { status: \"failed\", checks };\n\t\t}\n\t\treturn { status: \"passed\", checks };\n\t}\n\n\tprivate checkPostcondition(condition: DesktopPostconditionV1, observation: DesktopObservationV1): boolean {\n\t\tif (condition.kind === \"window-exists\")\n\t\t\treturn observation.windows.some((window) => window.windowId === condition.windowId);\n\t\tif (condition.kind === \"control-exists\")\n\t\t\treturn observation.controls.some((control) => control.controlId === condition.controlId);\n\t\tif (condition.kind === \"focused\") return observation.focusedControlId === condition.controlId;\n\t\tconst target = condition.target;\n\t\tif (target.kind === \"window\") {\n\t\t\tconst window = observation.windows.find((item) => item.windowId === target.windowId);\n\t\t\tif (window === undefined || condition.property !== \"name\") return false;\n\t\t\treturn window.title === condition.expected;\n\t\t}\n\t\t// A coordinate target identifies no observed control, so it can never\n\t\t// satisfy a property-equals postcondition.\n\t\tif (target.kind === \"coordinates\") return false;\n\t\tconst control = observation.controls.find((item) => {\n\t\t\tif (item.controlId !== target.controlId) return false;\n\t\t\treturn target.windowId === undefined || item.windowId === target.windowId;\n\t\t});\n\t\tif (control === undefined) return false;\n\t\tif (condition.property === \"enabled\") return control.enabled === condition.expected;\n\t\tif (condition.property === \"name\") return control.name === condition.expected;\n\t\treturn control.value === condition.expected;\n\t}\n\n\tprivate failed(operationId: string, code: string, message: string, causeCode?: string): DesktopOperationResultV1 {\n\t\treturn { version: 1, operationId, status: \"failed\", summary: message, error: error(code, message, causeCode) };\n\t}\n\tprivate cancelled(operationId: string, message: string): DesktopOperationResultV1 {\n\t\treturn {\n\t\t\tversion: 1,\n\t\t\toperationId,\n\t\t\tstatus: \"cancelled\",\n\t\t\tsummary: message,\n\t\t\terror: error(\"cancelled\", message, \"stopped\"),\n\t\t};\n\t}\n}\n\nconst payloadErrorCode = (action: DesktopActionV1): string => {\n\tif (action.kind === \"key\") return \"key_unsupported\";\n\tif (action.kind === \"scroll\") return \"direction_invalid\";\n\treturn \"target_not_found\";\n};\n\nconst payloadErrorMessage = (action: DesktopActionV1): string => {\n\tif (action.kind === \"key\") return \"Key sequence does not match the supported macOS key grammar\";\n\tif (action.kind === \"scroll\") return \"Scroll direction must be up or down with optional :lines\";\n\treturn \"Target identity was not observed by macOS Accessibility\";\n};\n\n/**\n * The production input facade intentionally exposes no replay method. The\n * driver remains responsible for using observed Accessibility identities\n * (or explicit click coordinates) rather than global keyboard injection.\n */\nexport class DesktopMacosInputAdapter implements DesktopFullControlAdapterV1 {\n\treadonly adapterId = \"desktop-macos-ax\";\n\treadonly adapterVersion = \"1.0.0\";\n\tprivate readonly driver: DesktopMacosDriverV1;\n\n\tconstructor(driver: DesktopMacosDriverV1 = new MacosAccessibilityDriver()) {\n\t\tthis.driver = driver;\n\t}\n\n\tprobe(): DesktopMacosProbeV1 {\n\t\treturn this.driver.probe();\n\t}\n\n\topenSession(request: DesktopSessionRequestV1): DesktopSessionResultV1 {\n\t\treturn this.driver.openSession(request);\n\t}\n\n\tobserve(sessionId: string): DesktopObservationV1 | DesktopOperationResultV1 {\n\t\treturn this.driver.observe(sessionId);\n\t}\n\n\treobserve(sessionId: string): DesktopObservationV1 | DesktopOperationResultV1 {\n\t\treturn this.driver.observe(sessionId);\n\t}\n\n\texecute(request: DesktopOperationRequestV1): DesktopOperationResultV1 {\n\t\tif (requiresDesktopUserConfirmation(request.action.kind)) {\n\t\t\treturn {\n\t\t\t\tversion: 1,\n\t\t\t\toperationId: request.operationId,\n\t\t\t\tstatus: \"needs_user\",\n\t\t\t\tsummary: `User confirmation required for ${request.action.kind}`,\n\t\t\t\terror: {\n\t\t\t\t\tversion: 1,\n\t\t\t\t\tcode: \"needs_user\",\n\t\t\t\t\tmessage: `The ${request.action.kind} action is paused for the user`,\n\t\t\t\t\tcauseCode: request.action.kind,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t\treturn this.driver.execute(request);\n\t}\n\n\tstop(sessionId: string): DesktopSessionV1 | DesktopOperationResultV1 {\n\t\treturn this.driver.stop(sessionId);\n\t}\n}\n"]}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inlined from agent-forge `src/profile/runtime-capabilities-desktop.ts`
|
|
3
|
+
* (D-075 S3 extraction), mirrored from the Windows desktop plugin packages,
|
|
4
|
+
* so this package keeps its dependency closure limited to the plugin SDK and
|
|
5
|
+
* typebox. Semantics are unchanged. Differences from the Windows copies:
|
|
6
|
+
* - Desktop V1 types import from the package-local `types.ts` copy.
|
|
7
|
+
* - The accepted observation `source` literals are `"mock"` and `"macos-ax"`
|
|
8
|
+
* instead of `"windows-uia"`.
|
|
9
|
+
* Budgets and truncation logic are unchanged (64 windows / 256 controls /
|
|
10
|
+
* 256 chars / 64 KiB result budget). Deliberate copy shared (subset-compatible)
|
|
11
|
+
* with `plugins/desktop-macos-input/src/projection.ts`; keep both in sync.
|
|
12
|
+
*/
|
|
13
|
+
import type { DesktopCapabilityIdV1, DesktopControlIdentityV1, DesktopObservationV1, DesktopWindowIdentityV1 } from "./types.ts";
|
|
14
|
+
export declare const DESKTOP_MAX_STRING_CHARS_V1 = 256;
|
|
15
|
+
export declare const DESKTOP_MAX_POSTCONDITIONS_V1 = 32;
|
|
16
|
+
export declare const DESKTOP_MAX_TYPE_TEXT_CHARS_V1 = 4096;
|
|
17
|
+
export declare const DESKTOP_MAX_REPLAY_ACTIONS_V1 = 32;
|
|
18
|
+
export declare function desktopFailure(operationId: string, code: string, message: string, status?: "failed" | "unsupported" | "cancelled" | "needs_user"): {
|
|
19
|
+
version: 1;
|
|
20
|
+
operationId: string;
|
|
21
|
+
status: "cancelled" | "failed" | "needs_user" | "unsupported";
|
|
22
|
+
summary: string;
|
|
23
|
+
error: {
|
|
24
|
+
version: 1;
|
|
25
|
+
code: string;
|
|
26
|
+
message: string;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
export declare function desktopBoundedString(value: unknown, label: string): string;
|
|
30
|
+
export declare function desktopClampedString(value: unknown, label: string): string;
|
|
31
|
+
export declare function desktopRequiredString(value: unknown, label: string): string;
|
|
32
|
+
declare function desktopCapabilities(value: unknown): readonly DesktopCapabilityIdV1[] | undefined;
|
|
33
|
+
export declare function projectDesktopObservation(value: unknown): {
|
|
34
|
+
readonly observation: DesktopObservationV1;
|
|
35
|
+
readonly truncated: {
|
|
36
|
+
readonly windows: boolean;
|
|
37
|
+
readonly controls: boolean;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
export declare function desktopResultWithinBudget<T>(value: T): T;
|
|
41
|
+
declare function desktopObservationResult(value: unknown, operationId: string): {
|
|
42
|
+
version: 1;
|
|
43
|
+
operationId: string;
|
|
44
|
+
status: "cancelled" | "failed" | "needs_user" | "unsupported";
|
|
45
|
+
summary: string;
|
|
46
|
+
error: {
|
|
47
|
+
version: 1;
|
|
48
|
+
code: string;
|
|
49
|
+
message: string;
|
|
50
|
+
};
|
|
51
|
+
} | {
|
|
52
|
+
version: number;
|
|
53
|
+
operationId: string;
|
|
54
|
+
status: "succeeded";
|
|
55
|
+
observation: {
|
|
56
|
+
version: 1;
|
|
57
|
+
sessionId: string;
|
|
58
|
+
observationId: string;
|
|
59
|
+
source: "macos-ax" | "mock";
|
|
60
|
+
focusedControlId?: string | undefined;
|
|
61
|
+
controls: DesktopControlIdentityV1[];
|
|
62
|
+
windows: DesktopWindowIdentityV1[];
|
|
63
|
+
};
|
|
64
|
+
truncated: {
|
|
65
|
+
windows: boolean;
|
|
66
|
+
controls: boolean;
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
declare function desktopSessionResult(value: unknown, operationId: string): {
|
|
70
|
+
version: 1;
|
|
71
|
+
operationId: string;
|
|
72
|
+
status: "cancelled" | "failed" | "needs_user" | "unsupported";
|
|
73
|
+
summary: string;
|
|
74
|
+
error: {
|
|
75
|
+
version: 1;
|
|
76
|
+
code: string;
|
|
77
|
+
message: string;
|
|
78
|
+
};
|
|
79
|
+
} | {
|
|
80
|
+
version: number;
|
|
81
|
+
operationId: string;
|
|
82
|
+
status: "succeeded";
|
|
83
|
+
session: {
|
|
84
|
+
version: number;
|
|
85
|
+
sessionId: string;
|
|
86
|
+
isolation: string;
|
|
87
|
+
status: string;
|
|
88
|
+
applicationId?: string | undefined;
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
declare function desktopStopResult(value: unknown, operationId: string): {
|
|
92
|
+
version: 1;
|
|
93
|
+
operationId: string;
|
|
94
|
+
status: "cancelled" | "failed" | "needs_user" | "unsupported";
|
|
95
|
+
summary: string;
|
|
96
|
+
error: {
|
|
97
|
+
version: 1;
|
|
98
|
+
code: string;
|
|
99
|
+
message: string;
|
|
100
|
+
};
|
|
101
|
+
} | {
|
|
102
|
+
version: number;
|
|
103
|
+
operationId: string;
|
|
104
|
+
status: "succeeded";
|
|
105
|
+
session: {
|
|
106
|
+
version: number;
|
|
107
|
+
sessionId: string;
|
|
108
|
+
isolation: string;
|
|
109
|
+
status: string;
|
|
110
|
+
applicationId?: string | undefined;
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
export { desktopCapabilities, desktopObservationResult, desktopSessionResult, desktopStopResult };
|
|
114
|
+
//# sourceMappingURL=projection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.d.ts","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EACX,qBAAqB,EACrB,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,MAAM,YAAY,CAAC;AAIpB,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAChD,eAAO,MAAM,8BAA8B,OAAO,CAAC;AACnD,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAShD,wBAAgB,cAAc,CAC7B,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,QAAQ,GAAG,aAAa,GAAG,WAAW,GAAG,YAAuB;;;;;;;;;;EASxE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI1E;AAKD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI1E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI3E;AAED,iBAAS,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,qBAAqB,EAAE,GAAG,SAAS,CAQzF;AAiDD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG;IAC1D,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;CAC9E,CAgCA;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAIxD;AAED,iBAAS,wBAAwB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkDpE;AAED,iBAAS,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;EAsChE;AAED,iBAAS,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;EAS7D;AAED,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,CAAC","sourcesContent":["/**\n * Inlined from agent-forge `src/profile/runtime-capabilities-desktop.ts`\n * (D-075 S3 extraction), mirrored from the Windows desktop plugin packages,\n * so this package keeps its dependency closure limited to the plugin SDK and\n * typebox. Semantics are unchanged. Differences from the Windows copies:\n * - Desktop V1 types import from the package-local `types.ts` copy.\n * - The accepted observation `source` literals are `\"mock\"` and `\"macos-ax\"`\n * instead of `\"windows-uia\"`.\n * Budgets and truncation logic are unchanged (64 windows / 256 controls /\n * 256 chars / 64 KiB result budget). Deliberate copy shared (subset-compatible)\n * with `plugins/desktop-macos-input/src/projection.ts`; keep both in sync.\n */\nimport type {\n\tDesktopCapabilityIdV1,\n\tDesktopControlIdentityV1,\n\tDesktopObservationV1,\n\tDesktopWindowIdentityV1,\n} from \"./types.ts\";\n\nconst DESKTOP_MAX_WINDOWS_V1 = 64;\nconst DESKTOP_MAX_CONTROLS_V1 = 256;\nexport const DESKTOP_MAX_STRING_CHARS_V1 = 256;\nconst DESKTOP_MAX_RESULT_BYTES_V1 = 64 * 1024;\nexport const DESKTOP_MAX_POSTCONDITIONS_V1 = 32;\nexport const DESKTOP_MAX_TYPE_TEXT_CHARS_V1 = 4096;\nexport const DESKTOP_MAX_REPLAY_ACTIONS_V1 = 32;\nconst DESKTOP_CAPABILITY_IDS_V1: readonly DesktopCapabilityIdV1[] = [\n\t\"desktop-session\",\n\t\"desktop-uia\",\n\t\"desktop-input\",\n\t\"desktop-vision\",\n\t\"desktop-replay\",\n];\n\nexport function desktopFailure(\n\toperationId: string,\n\tcode: string,\n\tmessage: string,\n\tstatus: \"failed\" | \"unsupported\" | \"cancelled\" | \"needs_user\" = \"failed\",\n) {\n\treturn {\n\t\tversion: 1 as const,\n\t\toperationId,\n\t\tstatus,\n\t\tsummary: message,\n\t\terror: { version: 1 as const, code, message },\n\t};\n}\n\nexport function desktopBoundedString(value: unknown, label: string): string {\n\tif (typeof value !== \"string\" || value.length > DESKTOP_MAX_STRING_CHARS_V1)\n\t\tthrow new Error(`desktop-result-budget:${label}`);\n\treturn value;\n}\n\n/// 观察投影专用:显示文本超长时截断而非抛异常(dogfood 2026-09-25 实测,真实桌面\n/// 单控件文本超上限很常见)。输入校验(type text/key/target)仍用 desktopBoundedString\n/// 严格拒绝——截断输入等于静默打错字。\nexport function desktopClampedString(value: unknown, label: string): string {\n\tif (typeof value !== \"string\") throw new Error(`desktop-result-budget:${label}`);\n\tif (value.length > DESKTOP_MAX_STRING_CHARS_V1) return value.slice(0, DESKTOP_MAX_STRING_CHARS_V1);\n\treturn value;\n}\n\nexport function desktopRequiredString(value: unknown, label: string): string {\n\tconst result = desktopBoundedString(value, label);\n\tif (result.trim() === \"\") throw new Error(`desktop-result-invalid:${label}`);\n\treturn result;\n}\n\nfunction desktopCapabilities(value: unknown): readonly DesktopCapabilityIdV1[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst capabilities = value.filter(\n\t\t(item): item is DesktopCapabilityIdV1 =>\n\t\t\ttypeof item === \"string\" && DESKTOP_CAPABILITY_IDS_V1.includes(item as DesktopCapabilityIdV1),\n\t);\n\tconst unique = [...new Set(capabilities)].slice(0, DESKTOP_CAPABILITY_IDS_V1.length);\n\treturn unique.length === 0 ? undefined : unique;\n}\n\nfunction desktopBounds(value: unknown): {\n\treadonly x: number;\n\treadonly y: number;\n\treadonly width: number;\n\treadonly height: number;\n} {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"desktop-result-invalid\");\n\tconst record = value as Record<string, unknown>;\n\tconst bounds = { x: record.x, y: record.y, width: record.width, height: record.height };\n\tif (\n\t\tObject.values(bounds).some((item) => typeof item !== \"number\" || !Number.isFinite(item)) ||\n\t\t(bounds.width as number) < 0 ||\n\t\t(bounds.height as number) < 0\n\t)\n\t\tthrow new Error(\"desktop-result-invalid\");\n\treturn bounds as { x: number; y: number; width: number; height: number };\n}\n\nfunction projectDesktopWindow(value: unknown): DesktopWindowIdentityV1 {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"desktop-result-invalid\");\n\tconst record = value as Record<string, unknown>;\n\tif (record.version !== 1) throw new Error(\"desktop-result-invalid\");\n\treturn {\n\t\tversion: 1,\n\t\twindowId: desktopClampedString(record.windowId, \"windowId\"),\n\t\tappId: desktopClampedString(record.appId, \"appId\"),\n\t\ttitle: desktopClampedString(record.title, \"title\"),\n\t\tbounds: desktopBounds(record.bounds),\n\t};\n}\n\nfunction projectDesktopControl(value: unknown): DesktopControlIdentityV1 {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"desktop-result-invalid\");\n\tconst record = value as Record<string, unknown>;\n\tif (record.version !== 1 || typeof record.enabled !== \"boolean\") throw new Error(\"desktop-result-invalid\");\n\treturn {\n\t\tversion: 1,\n\t\tcontrolId: desktopClampedString(record.controlId, \"controlId\"),\n\t\twindowId: desktopClampedString(record.windowId, \"windowId\"),\n\t\trole: desktopClampedString(record.role, \"role\"),\n\t\tname: desktopClampedString(record.name, \"name\"),\n\t\tbounds: desktopBounds(record.bounds),\n\t\tenabled: record.enabled,\n\t\t...(record.value === undefined ? {} : { value: desktopClampedString(record.value, \"value\") }),\n\t};\n}\n\nexport function projectDesktopObservation(value: unknown): {\n\treadonly observation: DesktopObservationV1;\n\treadonly truncated: { readonly windows: boolean; readonly controls: boolean };\n} {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"desktop-result-invalid\");\n\tconst record = value as Record<string, unknown>;\n\tif (\n\t\trecord.version !== 1 ||\n\t\ttypeof record.sessionId !== \"string\" ||\n\t\ttypeof record.observationId !== \"string\" ||\n\t\t(record.source !== \"mock\" && record.source !== \"macos-ax\") ||\n\t\t!Array.isArray(record.windows) ||\n\t\t!Array.isArray(record.controls)\n\t)\n\t\tthrow new Error(\"desktop-result-invalid\");\n\tconst windows = record.windows.slice(0, DESKTOP_MAX_WINDOWS_V1).map(projectDesktopWindow);\n\tconst controls = record.controls.slice(0, DESKTOP_MAX_CONTROLS_V1).map(projectDesktopControl);\n\tconst observation = {\n\t\tversion: 1 as const,\n\t\tsessionId: desktopClampedString(record.sessionId, \"sessionId\"),\n\t\tobservationId: desktopClampedString(record.observationId, \"observationId\"),\n\t\tsource: record.source,\n\t\twindows,\n\t\tcontrols,\n\t\t...(record.focusedControlId === undefined\n\t\t\t? {}\n\t\t\t: { focusedControlId: desktopClampedString(record.focusedControlId, \"focusedControlId\") }),\n\t} satisfies DesktopObservationV1;\n\treturn {\n\t\tobservation,\n\t\ttruncated: {\n\t\t\twindows: record.windows.length > DESKTOP_MAX_WINDOWS_V1,\n\t\t\tcontrols: record.controls.length > DESKTOP_MAX_CONTROLS_V1,\n\t\t},\n\t};\n}\n\nexport function desktopResultWithinBudget<T>(value: T): T {\n\tif (new TextEncoder().encode(JSON.stringify(value)).byteLength > DESKTOP_MAX_RESULT_BYTES_V1)\n\t\tthrow new Error(\"desktop-result-budget\");\n\treturn value;\n}\n\nfunction desktopObservationResult(value: unknown, operationId: string) {\n\tif (value !== null && typeof value === \"object\" && !Array.isArray(value) && \"observationId\" in value) {\n\t\tconst projected = projectDesktopObservation(value);\n\t\t// 真实桌面控件数轻松超出 64KB 结果预算(dogfood 2026-09-25 实测):超预算时\n\t\t// 控件/窗口逐级减半裁剪并如实标记 truncated,而不是让整次观察失败。\n\t\tconst controls = projected.observation.controls;\n\t\tconst windows = projected.observation.windows;\n\t\tlet controlCount = controls.length;\n\t\tlet windowCount = windows.length;\n\t\tfor (;;) {\n\t\t\ttry {\n\t\t\t\treturn desktopResultWithinBudget({\n\t\t\t\t\tversion: 1,\n\t\t\t\t\toperationId,\n\t\t\t\t\tstatus: \"succeeded\" as const,\n\t\t\t\t\tobservation: {\n\t\t\t\t\t\t...projected.observation,\n\t\t\t\t\t\tcontrols: controls.slice(0, controlCount),\n\t\t\t\t\t\twindows: windows.slice(0, windowCount),\n\t\t\t\t\t},\n\t\t\t\t\ttruncated: {\n\t\t\t\t\t\twindows: projected.truncated.windows || windowCount < windows.length,\n\t\t\t\t\t\tcontrols: projected.truncated.controls || controlCount < controls.length,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\tif (controlCount > 0) controlCount = Math.floor(controlCount / 2);\n\t\t\t\telse if (windowCount > 0) windowCount = Math.floor(windowCount / 2);\n\t\t\t\telse throw new Error(\"desktop-result-budget\");\n\t\t\t}\n\t\t}\n\t}\n\tif (value !== null && typeof value === \"object\" && !Array.isArray(value) && \"status\" in value) {\n\t\tconst status = value.status;\n\t\tif (status === \"unsupported\" || status === \"failed\" || status === \"cancelled\" || status === \"needs_user\") {\n\t\t\tconst record0 = value as Record<string, unknown>;\n\t\t\tconst adapterError =\n\t\t\t\t\"error\" in record0 && record0.error !== null && typeof record0.error === \"object\"\n\t\t\t\t\t? (record0.error as Record<string, unknown>)\n\t\t\t\t\t: undefined;\n\t\t\tconst errorCode =\n\t\t\t\tadapterError && typeof adapterError.code === \"string\" ? adapterError.code : \"desktop_adapter_failed\";\n\t\t\tconst errorMessage =\n\t\t\t\tadapterError && typeof adapterError.message === \"string\"\n\t\t\t\t\t? adapterError.message\n\t\t\t\t\t: \"Desktop observation is unavailable\";\n\t\t\treturn desktopFailure(operationId, errorCode, errorMessage, status);\n\t\t}\n\t}\n\tthrow new Error(\"desktop-result-invalid\");\n}\n\nfunction desktopSessionResult(value: unknown, operationId: string) {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value) || !(\"status\" in value))\n\t\tthrow new Error(\"desktop-result-invalid\");\n\tconst record = value as Record<string, unknown>;\n\tif (record.status !== \"succeeded\" && record.status !== \"unsupported\" && record.status !== \"failed\")\n\t\tthrow new Error(\"desktop-result-invalid\");\n\tif (record.status !== \"succeeded\")\n\t\treturn desktopFailure(\n\t\t\toperationId,\n\t\t\t\"desktop_adapter_unavailable\",\n\t\t\t\"Desktop session is unavailable\",\n\t\t\trecord.status,\n\t\t);\n\tconst session = record.session;\n\tif (session === null || typeof session !== \"object\" || Array.isArray(session))\n\t\tthrow new Error(\"desktop-result-invalid\");\n\tconst item = session as Record<string, unknown>;\n\tif (\n\t\titem.version !== 1 ||\n\t\ttypeof item.sessionId !== \"string\" ||\n\t\t(item.isolation !== \"foreground\" && item.isolation !== \"vm\" && item.isolation !== \"mock\") ||\n\t\t(item.status !== \"ready\" && item.status !== \"unavailable\" && item.status !== \"stopped\")\n\t)\n\t\tthrow new Error(\"desktop-result-invalid\");\n\treturn desktopResultWithinBudget({\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus: \"succeeded\" as const,\n\t\tsession: {\n\t\t\tversion: 1,\n\t\t\tsessionId: desktopBoundedString(item.sessionId, \"sessionId\"),\n\t\t\tisolation: item.isolation,\n\t\t\tstatus: item.status,\n\t\t\t...(item.applicationId === undefined\n\t\t\t\t? {}\n\t\t\t\t: { applicationId: desktopBoundedString(item.applicationId, \"applicationId\") }),\n\t\t},\n\t});\n}\n\nfunction desktopStopResult(value: unknown, operationId: string) {\n\tif (value !== null && typeof value === \"object\" && !Array.isArray(value) && \"sessionId\" in value)\n\t\treturn desktopSessionResult({ status: \"succeeded\", session: value }, operationId);\n\tif (value !== null && typeof value === \"object\" && !Array.isArray(value) && \"status\" in value) {\n\t\tconst status = value.status;\n\t\tif (status === \"unsupported\" || status === \"failed\" || status === \"cancelled\" || status === \"needs_user\")\n\t\t\treturn desktopFailure(operationId, \"desktop_adapter_failed\", \"Desktop session could not be stopped\", status);\n\t}\n\tthrow new Error(\"desktop-result-invalid\");\n}\n\nexport { desktopCapabilities, desktopObservationResult, desktopSessionResult, desktopStopResult };\n"]}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
const DESKTOP_MAX_WINDOWS_V1 = 64;
|
|
2
|
+
const DESKTOP_MAX_CONTROLS_V1 = 256;
|
|
3
|
+
export const DESKTOP_MAX_STRING_CHARS_V1 = 256;
|
|
4
|
+
const DESKTOP_MAX_RESULT_BYTES_V1 = 64 * 1024;
|
|
5
|
+
export const DESKTOP_MAX_POSTCONDITIONS_V1 = 32;
|
|
6
|
+
export const DESKTOP_MAX_TYPE_TEXT_CHARS_V1 = 4096;
|
|
7
|
+
export const DESKTOP_MAX_REPLAY_ACTIONS_V1 = 32;
|
|
8
|
+
const DESKTOP_CAPABILITY_IDS_V1 = [
|
|
9
|
+
"desktop-session",
|
|
10
|
+
"desktop-uia",
|
|
11
|
+
"desktop-input",
|
|
12
|
+
"desktop-vision",
|
|
13
|
+
"desktop-replay",
|
|
14
|
+
];
|
|
15
|
+
export function desktopFailure(operationId, code, message, status = "failed") {
|
|
16
|
+
return {
|
|
17
|
+
version: 1,
|
|
18
|
+
operationId,
|
|
19
|
+
status,
|
|
20
|
+
summary: message,
|
|
21
|
+
error: { version: 1, code, message },
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function desktopBoundedString(value, label) {
|
|
25
|
+
if (typeof value !== "string" || value.length > DESKTOP_MAX_STRING_CHARS_V1)
|
|
26
|
+
throw new Error(`desktop-result-budget:${label}`);
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
/// 观察投影专用:显示文本超长时截断而非抛异常(dogfood 2026-09-25 实测,真实桌面
|
|
30
|
+
/// 单控件文本超上限很常见)。输入校验(type text/key/target)仍用 desktopBoundedString
|
|
31
|
+
/// 严格拒绝——截断输入等于静默打错字。
|
|
32
|
+
export function desktopClampedString(value, label) {
|
|
33
|
+
if (typeof value !== "string")
|
|
34
|
+
throw new Error(`desktop-result-budget:${label}`);
|
|
35
|
+
if (value.length > DESKTOP_MAX_STRING_CHARS_V1)
|
|
36
|
+
return value.slice(0, DESKTOP_MAX_STRING_CHARS_V1);
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
export function desktopRequiredString(value, label) {
|
|
40
|
+
const result = desktopBoundedString(value, label);
|
|
41
|
+
if (result.trim() === "")
|
|
42
|
+
throw new Error(`desktop-result-invalid:${label}`);
|
|
43
|
+
return result;
|
|
44
|
+
}
|
|
45
|
+
function desktopCapabilities(value) {
|
|
46
|
+
if (!Array.isArray(value))
|
|
47
|
+
return undefined;
|
|
48
|
+
const capabilities = value.filter((item) => typeof item === "string" && DESKTOP_CAPABILITY_IDS_V1.includes(item));
|
|
49
|
+
const unique = [...new Set(capabilities)].slice(0, DESKTOP_CAPABILITY_IDS_V1.length);
|
|
50
|
+
return unique.length === 0 ? undefined : unique;
|
|
51
|
+
}
|
|
52
|
+
function desktopBounds(value) {
|
|
53
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
54
|
+
throw new Error("desktop-result-invalid");
|
|
55
|
+
const record = value;
|
|
56
|
+
const bounds = { x: record.x, y: record.y, width: record.width, height: record.height };
|
|
57
|
+
if (Object.values(bounds).some((item) => typeof item !== "number" || !Number.isFinite(item)) ||
|
|
58
|
+
bounds.width < 0 ||
|
|
59
|
+
bounds.height < 0)
|
|
60
|
+
throw new Error("desktop-result-invalid");
|
|
61
|
+
return bounds;
|
|
62
|
+
}
|
|
63
|
+
function projectDesktopWindow(value) {
|
|
64
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
65
|
+
throw new Error("desktop-result-invalid");
|
|
66
|
+
const record = value;
|
|
67
|
+
if (record.version !== 1)
|
|
68
|
+
throw new Error("desktop-result-invalid");
|
|
69
|
+
return {
|
|
70
|
+
version: 1,
|
|
71
|
+
windowId: desktopClampedString(record.windowId, "windowId"),
|
|
72
|
+
appId: desktopClampedString(record.appId, "appId"),
|
|
73
|
+
title: desktopClampedString(record.title, "title"),
|
|
74
|
+
bounds: desktopBounds(record.bounds),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function projectDesktopControl(value) {
|
|
78
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
79
|
+
throw new Error("desktop-result-invalid");
|
|
80
|
+
const record = value;
|
|
81
|
+
if (record.version !== 1 || typeof record.enabled !== "boolean")
|
|
82
|
+
throw new Error("desktop-result-invalid");
|
|
83
|
+
return {
|
|
84
|
+
version: 1,
|
|
85
|
+
controlId: desktopClampedString(record.controlId, "controlId"),
|
|
86
|
+
windowId: desktopClampedString(record.windowId, "windowId"),
|
|
87
|
+
role: desktopClampedString(record.role, "role"),
|
|
88
|
+
name: desktopClampedString(record.name, "name"),
|
|
89
|
+
bounds: desktopBounds(record.bounds),
|
|
90
|
+
enabled: record.enabled,
|
|
91
|
+
...(record.value === undefined ? {} : { value: desktopClampedString(record.value, "value") }),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
export function projectDesktopObservation(value) {
|
|
95
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
96
|
+
throw new Error("desktop-result-invalid");
|
|
97
|
+
const record = value;
|
|
98
|
+
if (record.version !== 1 ||
|
|
99
|
+
typeof record.sessionId !== "string" ||
|
|
100
|
+
typeof record.observationId !== "string" ||
|
|
101
|
+
(record.source !== "mock" && record.source !== "macos-ax") ||
|
|
102
|
+
!Array.isArray(record.windows) ||
|
|
103
|
+
!Array.isArray(record.controls))
|
|
104
|
+
throw new Error("desktop-result-invalid");
|
|
105
|
+
const windows = record.windows.slice(0, DESKTOP_MAX_WINDOWS_V1).map(projectDesktopWindow);
|
|
106
|
+
const controls = record.controls.slice(0, DESKTOP_MAX_CONTROLS_V1).map(projectDesktopControl);
|
|
107
|
+
const observation = {
|
|
108
|
+
version: 1,
|
|
109
|
+
sessionId: desktopClampedString(record.sessionId, "sessionId"),
|
|
110
|
+
observationId: desktopClampedString(record.observationId, "observationId"),
|
|
111
|
+
source: record.source,
|
|
112
|
+
windows,
|
|
113
|
+
controls,
|
|
114
|
+
...(record.focusedControlId === undefined
|
|
115
|
+
? {}
|
|
116
|
+
: { focusedControlId: desktopClampedString(record.focusedControlId, "focusedControlId") }),
|
|
117
|
+
};
|
|
118
|
+
return {
|
|
119
|
+
observation,
|
|
120
|
+
truncated: {
|
|
121
|
+
windows: record.windows.length > DESKTOP_MAX_WINDOWS_V1,
|
|
122
|
+
controls: record.controls.length > DESKTOP_MAX_CONTROLS_V1,
|
|
123
|
+
},
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export function desktopResultWithinBudget(value) {
|
|
127
|
+
if (new TextEncoder().encode(JSON.stringify(value)).byteLength > DESKTOP_MAX_RESULT_BYTES_V1)
|
|
128
|
+
throw new Error("desktop-result-budget");
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
function desktopObservationResult(value, operationId) {
|
|
132
|
+
if (value !== null && typeof value === "object" && !Array.isArray(value) && "observationId" in value) {
|
|
133
|
+
const projected = projectDesktopObservation(value);
|
|
134
|
+
// 真实桌面控件数轻松超出 64KB 结果预算(dogfood 2026-09-25 实测):超预算时
|
|
135
|
+
// 控件/窗口逐级减半裁剪并如实标记 truncated,而不是让整次观察失败。
|
|
136
|
+
const controls = projected.observation.controls;
|
|
137
|
+
const windows = projected.observation.windows;
|
|
138
|
+
let controlCount = controls.length;
|
|
139
|
+
let windowCount = windows.length;
|
|
140
|
+
for (;;) {
|
|
141
|
+
try {
|
|
142
|
+
return desktopResultWithinBudget({
|
|
143
|
+
version: 1,
|
|
144
|
+
operationId,
|
|
145
|
+
status: "succeeded",
|
|
146
|
+
observation: {
|
|
147
|
+
...projected.observation,
|
|
148
|
+
controls: controls.slice(0, controlCount),
|
|
149
|
+
windows: windows.slice(0, windowCount),
|
|
150
|
+
},
|
|
151
|
+
truncated: {
|
|
152
|
+
windows: projected.truncated.windows || windowCount < windows.length,
|
|
153
|
+
controls: projected.truncated.controls || controlCount < controls.length,
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
if (controlCount > 0)
|
|
159
|
+
controlCount = Math.floor(controlCount / 2);
|
|
160
|
+
else if (windowCount > 0)
|
|
161
|
+
windowCount = Math.floor(windowCount / 2);
|
|
162
|
+
else
|
|
163
|
+
throw new Error("desktop-result-budget");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (value !== null && typeof value === "object" && !Array.isArray(value) && "status" in value) {
|
|
168
|
+
const status = value.status;
|
|
169
|
+
if (status === "unsupported" || status === "failed" || status === "cancelled" || status === "needs_user") {
|
|
170
|
+
const record0 = value;
|
|
171
|
+
const adapterError = "error" in record0 && record0.error !== null && typeof record0.error === "object"
|
|
172
|
+
? record0.error
|
|
173
|
+
: undefined;
|
|
174
|
+
const errorCode = adapterError && typeof adapterError.code === "string" ? adapterError.code : "desktop_adapter_failed";
|
|
175
|
+
const errorMessage = adapterError && typeof adapterError.message === "string"
|
|
176
|
+
? adapterError.message
|
|
177
|
+
: "Desktop observation is unavailable";
|
|
178
|
+
return desktopFailure(operationId, errorCode, errorMessage, status);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
throw new Error("desktop-result-invalid");
|
|
182
|
+
}
|
|
183
|
+
function desktopSessionResult(value, operationId) {
|
|
184
|
+
if (value === null || typeof value !== "object" || Array.isArray(value) || !("status" in value))
|
|
185
|
+
throw new Error("desktop-result-invalid");
|
|
186
|
+
const record = value;
|
|
187
|
+
if (record.status !== "succeeded" && record.status !== "unsupported" && record.status !== "failed")
|
|
188
|
+
throw new Error("desktop-result-invalid");
|
|
189
|
+
if (record.status !== "succeeded")
|
|
190
|
+
return desktopFailure(operationId, "desktop_adapter_unavailable", "Desktop session is unavailable", record.status);
|
|
191
|
+
const session = record.session;
|
|
192
|
+
if (session === null || typeof session !== "object" || Array.isArray(session))
|
|
193
|
+
throw new Error("desktop-result-invalid");
|
|
194
|
+
const item = session;
|
|
195
|
+
if (item.version !== 1 ||
|
|
196
|
+
typeof item.sessionId !== "string" ||
|
|
197
|
+
(item.isolation !== "foreground" && item.isolation !== "vm" && item.isolation !== "mock") ||
|
|
198
|
+
(item.status !== "ready" && item.status !== "unavailable" && item.status !== "stopped"))
|
|
199
|
+
throw new Error("desktop-result-invalid");
|
|
200
|
+
return desktopResultWithinBudget({
|
|
201
|
+
version: 1,
|
|
202
|
+
operationId,
|
|
203
|
+
status: "succeeded",
|
|
204
|
+
session: {
|
|
205
|
+
version: 1,
|
|
206
|
+
sessionId: desktopBoundedString(item.sessionId, "sessionId"),
|
|
207
|
+
isolation: item.isolation,
|
|
208
|
+
status: item.status,
|
|
209
|
+
...(item.applicationId === undefined
|
|
210
|
+
? {}
|
|
211
|
+
: { applicationId: desktopBoundedString(item.applicationId, "applicationId") }),
|
|
212
|
+
},
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
function desktopStopResult(value, operationId) {
|
|
216
|
+
if (value !== null && typeof value === "object" && !Array.isArray(value) && "sessionId" in value)
|
|
217
|
+
return desktopSessionResult({ status: "succeeded", session: value }, operationId);
|
|
218
|
+
if (value !== null && typeof value === "object" && !Array.isArray(value) && "status" in value) {
|
|
219
|
+
const status = value.status;
|
|
220
|
+
if (status === "unsupported" || status === "failed" || status === "cancelled" || status === "needs_user")
|
|
221
|
+
return desktopFailure(operationId, "desktop_adapter_failed", "Desktop session could not be stopped", status);
|
|
222
|
+
}
|
|
223
|
+
throw new Error("desktop-result-invalid");
|
|
224
|
+
}
|
|
225
|
+
export { desktopCapabilities, desktopObservationResult, desktopSessionResult, desktopStopResult };
|
|
226
|
+
//# sourceMappingURL=projection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projection.js","sourceRoot":"","sources":["../src/projection.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Inlined from agent-forge `src/profile/runtime-capabilities-desktop.ts`\n * (D-075 S3 extraction), mirrored from the Windows desktop plugin packages,\n * so this package keeps its dependency closure limited to the plugin SDK and\n * typebox. Semantics are unchanged. Differences from the Windows copies:\n * - Desktop V1 types import from the package-local `types.ts` copy.\n * - The accepted observation `source` literals are `\"mock\"` and `\"macos-ax\"`\n * instead of `\"windows-uia\"`.\n * Budgets and truncation logic are unchanged (64 windows / 256 controls /\n * 256 chars / 64 KiB result budget). Deliberate copy shared (subset-compatible)\n * with `plugins/desktop-macos-input/src/projection.ts`; keep both in sync.\n */\nimport type {\n\tDesktopCapabilityIdV1,\n\tDesktopControlIdentityV1,\n\tDesktopObservationV1,\n\tDesktopWindowIdentityV1,\n} from \"./types.ts\";\n\nconst DESKTOP_MAX_WINDOWS_V1 = 64;\nconst DESKTOP_MAX_CONTROLS_V1 = 256;\nexport const DESKTOP_MAX_STRING_CHARS_V1 = 256;\nconst DESKTOP_MAX_RESULT_BYTES_V1 = 64 * 1024;\nexport const DESKTOP_MAX_POSTCONDITIONS_V1 = 32;\nexport const DESKTOP_MAX_TYPE_TEXT_CHARS_V1 = 4096;\nexport const DESKTOP_MAX_REPLAY_ACTIONS_V1 = 32;\nconst DESKTOP_CAPABILITY_IDS_V1: readonly DesktopCapabilityIdV1[] = [\n\t\"desktop-session\",\n\t\"desktop-uia\",\n\t\"desktop-input\",\n\t\"desktop-vision\",\n\t\"desktop-replay\",\n];\n\nexport function desktopFailure(\n\toperationId: string,\n\tcode: string,\n\tmessage: string,\n\tstatus: \"failed\" | \"unsupported\" | \"cancelled\" | \"needs_user\" = \"failed\",\n) {\n\treturn {\n\t\tversion: 1 as const,\n\t\toperationId,\n\t\tstatus,\n\t\tsummary: message,\n\t\terror: { version: 1 as const, code, message },\n\t};\n}\n\nexport function desktopBoundedString(value: unknown, label: string): string {\n\tif (typeof value !== \"string\" || value.length > DESKTOP_MAX_STRING_CHARS_V1)\n\t\tthrow new Error(`desktop-result-budget:${label}`);\n\treturn value;\n}\n\n/// 观察投影专用:显示文本超长时截断而非抛异常(dogfood 2026-09-25 实测,真实桌面\n/// 单控件文本超上限很常见)。输入校验(type text/key/target)仍用 desktopBoundedString\n/// 严格拒绝——截断输入等于静默打错字。\nexport function desktopClampedString(value: unknown, label: string): string {\n\tif (typeof value !== \"string\") throw new Error(`desktop-result-budget:${label}`);\n\tif (value.length > DESKTOP_MAX_STRING_CHARS_V1) return value.slice(0, DESKTOP_MAX_STRING_CHARS_V1);\n\treturn value;\n}\n\nexport function desktopRequiredString(value: unknown, label: string): string {\n\tconst result = desktopBoundedString(value, label);\n\tif (result.trim() === \"\") throw new Error(`desktop-result-invalid:${label}`);\n\treturn result;\n}\n\nfunction desktopCapabilities(value: unknown): readonly DesktopCapabilityIdV1[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tconst capabilities = value.filter(\n\t\t(item): item is DesktopCapabilityIdV1 =>\n\t\t\ttypeof item === \"string\" && DESKTOP_CAPABILITY_IDS_V1.includes(item as DesktopCapabilityIdV1),\n\t);\n\tconst unique = [...new Set(capabilities)].slice(0, DESKTOP_CAPABILITY_IDS_V1.length);\n\treturn unique.length === 0 ? undefined : unique;\n}\n\nfunction desktopBounds(value: unknown): {\n\treadonly x: number;\n\treadonly y: number;\n\treadonly width: number;\n\treadonly height: number;\n} {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"desktop-result-invalid\");\n\tconst record = value as Record<string, unknown>;\n\tconst bounds = { x: record.x, y: record.y, width: record.width, height: record.height };\n\tif (\n\t\tObject.values(bounds).some((item) => typeof item !== \"number\" || !Number.isFinite(item)) ||\n\t\t(bounds.width as number) < 0 ||\n\t\t(bounds.height as number) < 0\n\t)\n\t\tthrow new Error(\"desktop-result-invalid\");\n\treturn bounds as { x: number; y: number; width: number; height: number };\n}\n\nfunction projectDesktopWindow(value: unknown): DesktopWindowIdentityV1 {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"desktop-result-invalid\");\n\tconst record = value as Record<string, unknown>;\n\tif (record.version !== 1) throw new Error(\"desktop-result-invalid\");\n\treturn {\n\t\tversion: 1,\n\t\twindowId: desktopClampedString(record.windowId, \"windowId\"),\n\t\tappId: desktopClampedString(record.appId, \"appId\"),\n\t\ttitle: desktopClampedString(record.title, \"title\"),\n\t\tbounds: desktopBounds(record.bounds),\n\t};\n}\n\nfunction projectDesktopControl(value: unknown): DesktopControlIdentityV1 {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"desktop-result-invalid\");\n\tconst record = value as Record<string, unknown>;\n\tif (record.version !== 1 || typeof record.enabled !== \"boolean\") throw new Error(\"desktop-result-invalid\");\n\treturn {\n\t\tversion: 1,\n\t\tcontrolId: desktopClampedString(record.controlId, \"controlId\"),\n\t\twindowId: desktopClampedString(record.windowId, \"windowId\"),\n\t\trole: desktopClampedString(record.role, \"role\"),\n\t\tname: desktopClampedString(record.name, \"name\"),\n\t\tbounds: desktopBounds(record.bounds),\n\t\tenabled: record.enabled,\n\t\t...(record.value === undefined ? {} : { value: desktopClampedString(record.value, \"value\") }),\n\t};\n}\n\nexport function projectDesktopObservation(value: unknown): {\n\treadonly observation: DesktopObservationV1;\n\treadonly truncated: { readonly windows: boolean; readonly controls: boolean };\n} {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"desktop-result-invalid\");\n\tconst record = value as Record<string, unknown>;\n\tif (\n\t\trecord.version !== 1 ||\n\t\ttypeof record.sessionId !== \"string\" ||\n\t\ttypeof record.observationId !== \"string\" ||\n\t\t(record.source !== \"mock\" && record.source !== \"macos-ax\") ||\n\t\t!Array.isArray(record.windows) ||\n\t\t!Array.isArray(record.controls)\n\t)\n\t\tthrow new Error(\"desktop-result-invalid\");\n\tconst windows = record.windows.slice(0, DESKTOP_MAX_WINDOWS_V1).map(projectDesktopWindow);\n\tconst controls = record.controls.slice(0, DESKTOP_MAX_CONTROLS_V1).map(projectDesktopControl);\n\tconst observation = {\n\t\tversion: 1 as const,\n\t\tsessionId: desktopClampedString(record.sessionId, \"sessionId\"),\n\t\tobservationId: desktopClampedString(record.observationId, \"observationId\"),\n\t\tsource: record.source,\n\t\twindows,\n\t\tcontrols,\n\t\t...(record.focusedControlId === undefined\n\t\t\t? {}\n\t\t\t: { focusedControlId: desktopClampedString(record.focusedControlId, \"focusedControlId\") }),\n\t} satisfies DesktopObservationV1;\n\treturn {\n\t\tobservation,\n\t\ttruncated: {\n\t\t\twindows: record.windows.length > DESKTOP_MAX_WINDOWS_V1,\n\t\t\tcontrols: record.controls.length > DESKTOP_MAX_CONTROLS_V1,\n\t\t},\n\t};\n}\n\nexport function desktopResultWithinBudget<T>(value: T): T {\n\tif (new TextEncoder().encode(JSON.stringify(value)).byteLength > DESKTOP_MAX_RESULT_BYTES_V1)\n\t\tthrow new Error(\"desktop-result-budget\");\n\treturn value;\n}\n\nfunction desktopObservationResult(value: unknown, operationId: string) {\n\tif (value !== null && typeof value === \"object\" && !Array.isArray(value) && \"observationId\" in value) {\n\t\tconst projected = projectDesktopObservation(value);\n\t\t// 真实桌面控件数轻松超出 64KB 结果预算(dogfood 2026-09-25 实测):超预算时\n\t\t// 控件/窗口逐级减半裁剪并如实标记 truncated,而不是让整次观察失败。\n\t\tconst controls = projected.observation.controls;\n\t\tconst windows = projected.observation.windows;\n\t\tlet controlCount = controls.length;\n\t\tlet windowCount = windows.length;\n\t\tfor (;;) {\n\t\t\ttry {\n\t\t\t\treturn desktopResultWithinBudget({\n\t\t\t\t\tversion: 1,\n\t\t\t\t\toperationId,\n\t\t\t\t\tstatus: \"succeeded\" as const,\n\t\t\t\t\tobservation: {\n\t\t\t\t\t\t...projected.observation,\n\t\t\t\t\t\tcontrols: controls.slice(0, controlCount),\n\t\t\t\t\t\twindows: windows.slice(0, windowCount),\n\t\t\t\t\t},\n\t\t\t\t\ttruncated: {\n\t\t\t\t\t\twindows: projected.truncated.windows || windowCount < windows.length,\n\t\t\t\t\t\tcontrols: projected.truncated.controls || controlCount < controls.length,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\tif (controlCount > 0) controlCount = Math.floor(controlCount / 2);\n\t\t\t\telse if (windowCount > 0) windowCount = Math.floor(windowCount / 2);\n\t\t\t\telse throw new Error(\"desktop-result-budget\");\n\t\t\t}\n\t\t}\n\t}\n\tif (value !== null && typeof value === \"object\" && !Array.isArray(value) && \"status\" in value) {\n\t\tconst status = value.status;\n\t\tif (status === \"unsupported\" || status === \"failed\" || status === \"cancelled\" || status === \"needs_user\") {\n\t\t\tconst record0 = value as Record<string, unknown>;\n\t\t\tconst adapterError =\n\t\t\t\t\"error\" in record0 && record0.error !== null && typeof record0.error === \"object\"\n\t\t\t\t\t? (record0.error as Record<string, unknown>)\n\t\t\t\t\t: undefined;\n\t\t\tconst errorCode =\n\t\t\t\tadapterError && typeof adapterError.code === \"string\" ? adapterError.code : \"desktop_adapter_failed\";\n\t\t\tconst errorMessage =\n\t\t\t\tadapterError && typeof adapterError.message === \"string\"\n\t\t\t\t\t? adapterError.message\n\t\t\t\t\t: \"Desktop observation is unavailable\";\n\t\t\treturn desktopFailure(operationId, errorCode, errorMessage, status);\n\t\t}\n\t}\n\tthrow new Error(\"desktop-result-invalid\");\n}\n\nfunction desktopSessionResult(value: unknown, operationId: string) {\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value) || !(\"status\" in value))\n\t\tthrow new Error(\"desktop-result-invalid\");\n\tconst record = value as Record<string, unknown>;\n\tif (record.status !== \"succeeded\" && record.status !== \"unsupported\" && record.status !== \"failed\")\n\t\tthrow new Error(\"desktop-result-invalid\");\n\tif (record.status !== \"succeeded\")\n\t\treturn desktopFailure(\n\t\t\toperationId,\n\t\t\t\"desktop_adapter_unavailable\",\n\t\t\t\"Desktop session is unavailable\",\n\t\t\trecord.status,\n\t\t);\n\tconst session = record.session;\n\tif (session === null || typeof session !== \"object\" || Array.isArray(session))\n\t\tthrow new Error(\"desktop-result-invalid\");\n\tconst item = session as Record<string, unknown>;\n\tif (\n\t\titem.version !== 1 ||\n\t\ttypeof item.sessionId !== \"string\" ||\n\t\t(item.isolation !== \"foreground\" && item.isolation !== \"vm\" && item.isolation !== \"mock\") ||\n\t\t(item.status !== \"ready\" && item.status !== \"unavailable\" && item.status !== \"stopped\")\n\t)\n\t\tthrow new Error(\"desktop-result-invalid\");\n\treturn desktopResultWithinBudget({\n\t\tversion: 1,\n\t\toperationId,\n\t\tstatus: \"succeeded\" as const,\n\t\tsession: {\n\t\t\tversion: 1,\n\t\t\tsessionId: desktopBoundedString(item.sessionId, \"sessionId\"),\n\t\t\tisolation: item.isolation,\n\t\t\tstatus: item.status,\n\t\t\t...(item.applicationId === undefined\n\t\t\t\t? {}\n\t\t\t\t: { applicationId: desktopBoundedString(item.applicationId, \"applicationId\") }),\n\t\t},\n\t});\n}\n\nfunction desktopStopResult(value: unknown, operationId: string) {\n\tif (value !== null && typeof value === \"object\" && !Array.isArray(value) && \"sessionId\" in value)\n\t\treturn desktopSessionResult({ status: \"succeeded\", session: value }, operationId);\n\tif (value !== null && typeof value === \"object\" && !Array.isArray(value) && \"status\" in value) {\n\t\tconst status = value.status;\n\t\tif (status === \"unsupported\" || status === \"failed\" || status === \"cancelled\" || status === \"needs_user\")\n\t\t\treturn desktopFailure(operationId, \"desktop_adapter_failed\", \"Desktop session could not be stopped\", status);\n\t}\n\tthrow new Error(\"desktop-result-invalid\");\n}\n\nexport { desktopCapabilities, desktopObservationResult, desktopSessionResult, desktopStopResult };\n"]}
|
package/dist/shared.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inlined from agent-forge `src/profile/runtime-capabilities-shared.ts`
|
|
3
|
+
* (D-075 S3 extraction), mirrored from the Windows desktop plugin packages,
|
|
4
|
+
* so this package keeps its dependency closure limited to the plugin SDK and
|
|
5
|
+
* typebox. Semantics are unchanged; the artifact-ref schema helpers stay
|
|
6
|
+
* host-side because desktop tools do not use them. Deliberate copy shared
|
|
7
|
+
* with `plugins/desktop-macos-input/src/shared.ts`; keep both copies in sync.
|
|
8
|
+
*/
|
|
9
|
+
export declare function toolInvocation(first: unknown, second: unknown): {
|
|
10
|
+
readonly input: Record<string, unknown>;
|
|
11
|
+
readonly operationId: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function signalFrom(value: unknown): AbortSignal | undefined;
|
|
14
|
+
export declare function nonEmptyString(value: unknown, label: string): string;
|
|
15
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH,wBAAgB,cAAc,CAC7B,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,OAAO,GACb;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAK3E;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAElE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGpE","sourcesContent":["/**\n * Inlined from agent-forge `src/profile/runtime-capabilities-shared.ts`\n * (D-075 S3 extraction), mirrored from the Windows desktop plugin packages,\n * so this package keeps its dependency closure limited to the plugin SDK and\n * typebox. Semantics are unchanged; the artifact-ref schema helpers stay\n * host-side because desktop tools do not use them. Deliberate copy shared\n * with `plugins/desktop-macos-input/src/shared.ts`; keep both copies in sync.\n */\n\nfunction objectInput(first: unknown, second: unknown): Record<string, unknown> {\n\tconst value = second === undefined ? first : second;\n\tif (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n\t\tthrow new Error(\"Plugin tool input must be an object\");\n\t}\n\treturn value as Record<string, unknown>;\n}\n\nexport function toolInvocation(\n\tfirst: unknown,\n\tsecond: unknown,\n): { readonly input: Record<string, unknown>; readonly operationId: string } {\n\treturn {\n\t\tinput: objectInput(first, second),\n\t\toperationId: typeof first === \"string\" && first.trim() !== \"\" ? first : \"profile-runtime-tool-call\",\n\t};\n}\n\nexport function signalFrom(value: unknown): AbortSignal | undefined {\n\treturn value instanceof AbortSignal ? value : undefined;\n}\n\nexport function nonEmptyString(value: unknown, label: string): string {\n\tif (typeof value !== \"string\" || value.trim() === \"\") throw new Error(`${label} must be a non-empty string`);\n\treturn value;\n}\n"]}
|
package/dist/shared.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inlined from agent-forge `src/profile/runtime-capabilities-shared.ts`
|
|
3
|
+
* (D-075 S3 extraction), mirrored from the Windows desktop plugin packages,
|
|
4
|
+
* so this package keeps its dependency closure limited to the plugin SDK and
|
|
5
|
+
* typebox. Semantics are unchanged; the artifact-ref schema helpers stay
|
|
6
|
+
* host-side because desktop tools do not use them. Deliberate copy shared
|
|
7
|
+
* with `plugins/desktop-macos-input/src/shared.ts`; keep both copies in sync.
|
|
8
|
+
*/
|
|
9
|
+
function objectInput(first, second) {
|
|
10
|
+
const value = second === undefined ? first : second;
|
|
11
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
12
|
+
throw new Error("Plugin tool input must be an object");
|
|
13
|
+
}
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
export function toolInvocation(first, second) {
|
|
17
|
+
return {
|
|
18
|
+
input: objectInput(first, second),
|
|
19
|
+
operationId: typeof first === "string" && first.trim() !== "" ? first : "profile-runtime-tool-call",
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export function signalFrom(value) {
|
|
23
|
+
return value instanceof AbortSignal ? value : undefined;
|
|
24
|
+
}
|
|
25
|
+
export function nonEmptyString(value, label) {
|
|
26
|
+
if (typeof value !== "string" || value.trim() === "")
|
|
27
|
+
throw new Error(`${label} must be a non-empty string`);
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=shared.js.map
|