farming-code 2.2.30 → 2.2.32

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 (377) hide show
  1. package/THIRD_PARTY_NOTICES.md +7 -0
  2. package/backend/acp/{client-services.js → client-services.cjs} +132 -134
  3. package/backend/acp/packaged-claude-acp.cjs +37 -0
  4. package/backend/acp/packaged-codex-acp.cjs +37 -0
  5. package/backend/acp/patch-decisions.cjs +182 -0
  6. package/backend/acp/permission-security.cjs +131 -0
  7. package/backend/{acp-checkpoint-store.js → acp-checkpoint-store.cjs} +90 -59
  8. package/backend/{acp-runtime.js → acp-runtime.cjs} +1220 -1112
  9. package/backend/acp-session-state.cjs +622 -0
  10. package/backend/acp-transcript.cjs +525 -0
  11. package/backend/agent-env.cjs +257 -0
  12. package/backend/agent-extension-discovery.cjs +452 -0
  13. package/backend/agent-extension-inventory.cjs +116 -0
  14. package/backend/agent-json-stream.cjs +283 -0
  15. package/backend/agent-lifecycle-journal.cjs +185 -0
  16. package/backend/{agent-manager.js → agent-manager.cjs} +3116 -4275
  17. package/backend/agent-order-transaction.cjs +85 -0
  18. package/backend/agent-order.cjs +159 -0
  19. package/backend/agent-provider-session.cjs +98 -0
  20. package/backend/agent-runtime-binding.cjs +179 -0
  21. package/backend/agent-session-history.cjs +1022 -0
  22. package/backend/agent-session-inventory.cjs +291 -0
  23. package/backend/async-cache.cjs +104 -0
  24. package/backend/atomic-json-store.cjs +67 -0
  25. package/backend/auth.cjs +261 -0
  26. package/backend/authoritative-inventory-cache.cjs +383 -0
  27. package/backend/business-health.cjs +68 -0
  28. package/backend/chat-runtime.cjs +50 -0
  29. package/backend/claude-settings.cjs +132 -0
  30. package/backend/cli-agents.cjs +435 -0
  31. package/backend/codex-context-window.cjs +196 -0
  32. package/backend/codex-models.cjs +228 -0
  33. package/backend/codex-session-archive.cjs +82 -0
  34. package/backend/codex-session-history.cjs +590 -0
  35. package/backend/{codex-terminal-profile.js → codex-terminal-profile.cjs} +149 -155
  36. package/backend/codex-transcript-sanitizer.cjs +130 -0
  37. package/backend/codex-transcript.cjs +2107 -0
  38. package/backend/command-runner-child.cjs +105 -0
  39. package/backend/config-manager.cjs +1263 -0
  40. package/backend/control-api.cjs +439 -0
  41. package/backend/data/LICENSE.cua +21 -0
  42. package/backend/executable-discovery.cjs +204 -0
  43. package/backend/farming-agent-bootstrap.cjs +81 -0
  44. package/backend/farming-agent-bootstrap.zh_cn.md +6 -2
  45. package/backend/{farming-app-cli.js → farming-app-cli.cjs} +441 -493
  46. package/backend/farming-cli.cjs +414 -0
  47. package/backend/farming-net-pass.cjs +319 -0
  48. package/backend/farming-net-registry.cjs +123 -0
  49. package/backend/farming-net-server.cjs +309 -0
  50. package/backend/farming-session-store.cjs +651 -0
  51. package/backend/git-worktree-info.cjs +181 -0
  52. package/backend/haiku-token.cjs +828 -0
  53. package/backend/index-html.cjs +96 -0
  54. package/backend/input-parts.cjs +68 -0
  55. package/backend/input-routing.cjs +40 -0
  56. package/backend/{local-session-engine.js → local-session-engine.cjs} +276 -282
  57. package/backend/main-agent-skills.cjs +309 -0
  58. package/backend/main-page-session.cjs +132 -0
  59. package/backend/native-pty-controller-generation.cjs +139 -0
  60. package/backend/{native-pty-host-client.js → native-pty-host-client.cjs} +338 -346
  61. package/backend/native-pty-host-identity.cjs +125 -0
  62. package/backend/native-pty-host-path.cjs +68 -0
  63. package/backend/{native-pty-host.js → native-pty-host.cjs} +480 -569
  64. package/backend/native-session-engine.cjs +296 -0
  65. package/backend/network.cjs +57 -0
  66. package/backend/npm-update-helper.cjs +399 -0
  67. package/backend/packaged-node-pty.cjs +120 -0
  68. package/backend/preview-session-manager.cjs +89 -0
  69. package/backend/provider-adapters.cjs +492 -0
  70. package/backend/provider-home-configuration.cjs +211 -0
  71. package/backend/provider-session-id.cjs +79 -0
  72. package/backend/provider-session-service.cjs +333 -0
  73. package/backend/qr-share-tickets.cjs +119 -0
  74. package/backend/resource-broadcast-protocol.cjs +50 -0
  75. package/backend/review-diff-router.cjs +202 -0
  76. package/backend/review-diff-service.cjs +1267 -0
  77. package/backend/review-session-router.cjs +93 -0
  78. package/backend/review-session-service.cjs +470 -0
  79. package/backend/review-session-store.cjs +161 -0
  80. package/backend/review-state-router.cjs +132 -0
  81. package/backend/review-state-store.cjs +299 -0
  82. package/backend/run-history-store.cjs +97 -0
  83. package/backend/runtime-dependency-manager.cjs +893 -0
  84. package/backend/runtime-executable-invocation.cjs +37 -0
  85. package/backend/runtime-observation.cjs +96 -0
  86. package/backend/server-process-identity.cjs +70 -0
  87. package/backend/server.cjs +3356 -0
  88. package/backend/session-engine-bridge.cjs +144 -0
  89. package/backend/session-engine-router.cjs +105 -0
  90. package/backend/session-engine.cjs +64 -0
  91. package/backend/session-stream-protocol.cjs +181 -0
  92. package/backend/shell-busy-integration.cjs +442 -0
  93. package/backend/slash-command-discovery.cjs +423 -0
  94. package/backend/storage-layout.cjs +263 -0
  95. package/backend/system-monitor.cjs +96 -0
  96. package/backend/terminal-attach-checkpoint.cjs +73 -0
  97. package/backend/terminal-exit-quiescence.cjs +57 -0
  98. package/backend/{terminal-reducer-flow-control.js → terminal-reducer-flow-control.cjs} +45 -22
  99. package/backend/terminal-runtime-cleanup.cjs +99 -0
  100. package/backend/{terminal-screen-state.js → terminal-screen-state.cjs} +100 -108
  101. package/backend/{terminal-screen-worker-pool.js → terminal-screen-worker-pool.cjs} +89 -79
  102. package/backend/{terminal-screen-worker-thread.js → terminal-screen-worker-thread.cjs} +64 -65
  103. package/backend/terminal-screen-worker.cjs +352 -0
  104. package/backend/terminal-state-serialization.cjs +147 -0
  105. package/backend/{terminal-status.js → terminal-status.cjs} +137 -187
  106. package/backend/theme-manager.cjs +185 -0
  107. package/backend/{update-service.js → update-service.cjs} +258 -248
  108. package/backend/usage-forecast.cjs +95 -0
  109. package/backend/{usage-history-client.js → usage-history-client.cjs} +144 -94
  110. package/backend/usage-history-smoke.cjs +85 -0
  111. package/backend/usage-history-worker.cjs +60 -0
  112. package/backend/{usage-monitor.js → usage-monitor.cjs} +363 -390
  113. package/backend/workspace-directory.cjs +239 -0
  114. package/backend/workspace-discovery.cjs +271 -0
  115. package/backend/{workspace-file-router.js → workspace-file-router.cjs} +213 -282
  116. package/backend/{workspace-file-service.js → workspace-file-service.cjs} +1139 -1318
  117. package/backend/workspace-root-registry.cjs +192 -0
  118. package/bin/farming +1 -1
  119. package/dist/acp/codex-acp-1.1.4.mjs +18 -1
  120. package/dist/assets/App-BCkdpWB6.css +1 -0
  121. package/dist/assets/App-CRjKpaGp.js +697 -0
  122. package/dist/assets/CodeSelect-Ci8sKZPU.js +1 -0
  123. package/dist/assets/CodeSelect-T2eNzrOc.css +1 -0
  124. package/dist/assets/{FileEditorMarkdownPreview-Cs9cLv8a.js → FileEditorMarkdownPreview-V06QHlAg.js} +55 -55
  125. package/dist/assets/FileEditorPane-BX-Wjg9U.js +2 -0
  126. package/dist/assets/IconGlyphs-YhV7tqd4.js +1 -0
  127. package/dist/assets/ProjectFilesSection-BDT2_r0o.js +12 -0
  128. package/dist/assets/ReviewPage-BqAs5sG1.js +3 -0
  129. package/dist/assets/code-dark-B7eM_9G9.css +1 -0
  130. package/dist/assets/{cssMode-Bdg5RpcJ.js → cssMode-ADdAlxTO.js} +1 -1
  131. package/dist/assets/{editor.api2-D74ufkbr.js → editor.api2-BFLAr0YF.js} +162 -162
  132. package/dist/assets/file-icons-BpeqWkIB.js +1 -0
  133. package/dist/assets/{freemarker2-DfMDJfnE.js → freemarker2-C90q5jrp.js} +1 -1
  134. package/dist/assets/{handlebars-BEdPtzMT.js → handlebars-BwUQcEDq.js} +1 -1
  135. package/dist/assets/{html-B1fPb1QD.js → html-1s3uPKfh.js} +1 -1
  136. package/dist/assets/{htmlMode-CY2ZjHxH.js → htmlMode-xtKD99de.js} +1 -1
  137. package/dist/assets/{index-D-zetSol.js → index-C8MchCem.js} +3 -3
  138. package/dist/assets/{javascript-BV2OsWA0.js → javascript-Ph7ijyny.js} +1 -1
  139. package/dist/assets/{jsonMode-zd07aeuX.js → jsonMode-D-jGAnFH.js} +1 -1
  140. package/dist/assets/linkComputer-CbGyI_qx.js +1 -0
  141. package/dist/assets/{liquid-BParI24X.js → liquid-0IamE_cI.js} +1 -1
  142. package/dist/assets/{lspLanguageFeatures-BzredkoV.js → lspLanguageFeatures-BxnQunWF.js} +1 -1
  143. package/dist/assets/main-CLKXa6hf.css +1 -0
  144. package/dist/assets/{mdx-vGzUJN98.js → mdx-DdNmfivn.js} +1 -1
  145. package/dist/assets/{monaco.contribution-BmaeBQEc.js → monaco.contribution-B43jsUs1.js} +2 -2
  146. package/dist/assets/{python-CUwdLgsI.js → python-IAt4X5TS.js} +1 -1
  147. package/dist/assets/{razor-BScebUxU.js → razor-DRkFYW0S.js} +1 -1
  148. package/dist/assets/review-C8-oPKXk.css +1 -0
  149. package/dist/assets/{tsMode-DzUAibXK.js → tsMode-_d_4U2gf.js} +1 -1
  150. package/dist/assets/{typescript-D9EOeM7N.js → typescript-C7zcMq9l.js} +1 -1
  151. package/dist/assets/{workers-DAiomYZM.js → workers-D0nOyJzf.js} +1 -1
  152. package/dist/assets/workspace-editor-model-DND_Y-Bj.js +1 -0
  153. package/dist/assets/workspace-editor-monaco-BPWhgcIB.js +4 -0
  154. package/dist/assets/workspace-editor-monaco-N641qPjX.js +1 -0
  155. package/dist/assets/workspace-view-state-k1bTlJ_Z.js +13 -0
  156. package/dist/assets/{xml-wWl1dhkQ.js → xml-BR-HvxT8.js} +1 -1
  157. package/dist/assets/{yaml-Dc2WDaOZ.js → yaml-YtFQwh4q.js} +1 -1
  158. package/dist/index.html +1 -1
  159. package/extensions/browser/backend/agent-browser-runtime.cjs +1040 -0
  160. package/extensions/browser/backend/agent-capability.cjs +85 -0
  161. package/extensions/browser/backend/browser-mcp-server.cjs +655 -0
  162. package/extensions/browser/backend/browser-resource-manager.cjs +1486 -0
  163. package/extensions/browser/backend/browser-resource-store.cjs +228 -0
  164. package/extensions/browser/backend/browser-router.cjs +203 -0
  165. package/extensions/browser/backend/executable-discovery.cjs +248 -0
  166. package/extensions/browser/backend/farming-browser-client.cjs +116 -0
  167. package/extensions/browser/backend/index.cjs +32 -0
  168. package/extensions/browser/backend/managed-chromium-installer.cjs +833 -0
  169. package/extensions/browser/bin/farming-browser +16 -7
  170. package/extensions/computer/backend/agent-capability.cjs +72 -0
  171. package/extensions/computer/backend/computer-constants.cjs +59 -0
  172. package/extensions/computer/backend/computer-mcp-server.cjs +182 -0
  173. package/extensions/computer/backend/computer-resource-manager.cjs +1219 -0
  174. package/extensions/computer/backend/computer-resource-store.cjs +190 -0
  175. package/extensions/computer/backend/computer-router.cjs +257 -0
  176. package/extensions/computer/backend/cua-tools.json +3067 -0
  177. package/extensions/computer/backend/farming-computer-client.cjs +84 -0
  178. package/extensions/computer/backend/index.cjs +35 -0
  179. package/extensions/computer/backend/isolated-browser-provider.cjs +157 -0
  180. package/extensions/computer/bin/farming-computer +131 -0
  181. package/frontend/farming-net/app.js +255 -262
  182. package/frontend/ghostty-loader.js +24 -20
  183. package/frontend/reading-anchor.js +210 -193
  184. package/frontend/runtime-paths.js +24 -26
  185. package/frontend/session-bridge.js +90 -111
  186. package/frontend/session-modal-bridge.js +184 -302
  187. package/frontend/skin-bridge.js +20 -23
  188. package/frontend/skins/crt/app.js +7686 -7901
  189. package/frontend/skins/crt/effects.js +7 -6
  190. package/frontend/skins/crt/index.html +6 -6
  191. package/frontend/skins/crt/styles/markdown.css +4 -4
  192. package/frontend/terminal-bridge.js +174 -181
  193. package/frontend/terminal-replay.js +320 -345
  194. package/frontend/theme-loader.js +55 -71
  195. package/package.json +64 -37
  196. package/shared/backend-connection-status.js +38 -69
  197. package/shared/browser-protocol.js +235 -110
  198. package/shared/websocket-liveness.js +40 -0
  199. package/backend/acp/packaged-claude-acp.js +0 -13
  200. package/backend/acp/packaged-codex-acp.js +0 -13
  201. package/backend/acp/patch-decisions.js +0 -153
  202. package/backend/acp/permission-security.js +0 -108
  203. package/backend/acp-session-state.js +0 -634
  204. package/backend/acp-transcript.js +0 -512
  205. package/backend/agent-env.js +0 -250
  206. package/backend/agent-json-stream.js +0 -268
  207. package/backend/agent-lifecycle-journal.js +0 -133
  208. package/backend/agent-order.js +0 -166
  209. package/backend/agent-provider-session.js +0 -76
  210. package/backend/agent-runtime-binding.js +0 -174
  211. package/backend/agent-session-history.js +0 -986
  212. package/backend/async-cache.js +0 -94
  213. package/backend/atomic-json-store.js +0 -37
  214. package/backend/auth.js +0 -251
  215. package/backend/chat-runtime.js +0 -28
  216. package/backend/claude-settings.js +0 -121
  217. package/backend/cli-agents.js +0 -486
  218. package/backend/codex-context-window.js +0 -189
  219. package/backend/codex-models.js +0 -226
  220. package/backend/codex-session-archive.js +0 -65
  221. package/backend/codex-session-history.js +0 -647
  222. package/backend/codex-transcript-sanitizer.js +0 -115
  223. package/backend/codex-transcript.js +0 -2362
  224. package/backend/command-runner-child.js +0 -67
  225. package/backend/config-manager.js +0 -1117
  226. package/backend/control-api.js +0 -455
  227. package/backend/executable-discovery.js +0 -216
  228. package/backend/farming-agent-bootstrap.js +0 -49
  229. package/backend/farming-cli.js +0 -403
  230. package/backend/farming-net-pass.js +0 -285
  231. package/backend/farming-net-registry.js +0 -112
  232. package/backend/farming-net-server.js +0 -298
  233. package/backend/farming-session-store.js +0 -677
  234. package/backend/git-worktree-info.js +0 -181
  235. package/backend/haiku-token.js +0 -772
  236. package/backend/index-html.js +0 -80
  237. package/backend/input-parts.js +0 -54
  238. package/backend/input-routing.js +0 -24
  239. package/backend/json-cli-runtime.js +0 -275
  240. package/backend/main-agent-skills.js +0 -288
  241. package/backend/main-page-session.js +0 -122
  242. package/backend/native-pty-controller-generation.js +0 -106
  243. package/backend/native-pty-host-identity.js +0 -86
  244. package/backend/native-pty-host-path.js +0 -42
  245. package/backend/native-session-engine.js +0 -268
  246. package/backend/network.js +0 -23
  247. package/backend/npm-update-helper.js +0 -374
  248. package/backend/packaged-node-pty.js +0 -99
  249. package/backend/preview-session-manager.js +0 -68
  250. package/backend/provider-adapters.js +0 -399
  251. package/backend/provider-session-id.js +0 -47
  252. package/backend/provider-session-service.js +0 -345
  253. package/backend/qr-share-tickets.js +0 -100
  254. package/backend/review-diff-router.js +0 -180
  255. package/backend/review-diff-service.js +0 -1270
  256. package/backend/review-session-router.js +0 -74
  257. package/backend/review-session-service.js +0 -446
  258. package/backend/review-session-store.js +0 -151
  259. package/backend/review-state-router.js +0 -116
  260. package/backend/review-state-store.js +0 -286
  261. package/backend/run-history-store.js +0 -67
  262. package/backend/runtime-dependency-manager.js +0 -759
  263. package/backend/runtime-executable-invocation.js +0 -20
  264. package/backend/runtime-observation.js +0 -81
  265. package/backend/server-process-identity.js +0 -47
  266. package/backend/server.js +0 -3225
  267. package/backend/session-engine-bridge.js +0 -129
  268. package/backend/session-engine-router.js +0 -66
  269. package/backend/session-engine.js +0 -39
  270. package/backend/session-stream-protocol.js +0 -185
  271. package/backend/shell-busy-integration.js +0 -472
  272. package/backend/slash-command-discovery.js +0 -433
  273. package/backend/storage-layout.js +0 -205
  274. package/backend/system-monitor.js +0 -77
  275. package/backend/terminal-attach-checkpoint.js +0 -74
  276. package/backend/terminal-exit-quiescence.js +0 -39
  277. package/backend/terminal-runtime-cleanup.js +0 -80
  278. package/backend/terminal-screen-worker.js +0 -337
  279. package/backend/terminal-state-serialization.js +0 -127
  280. package/backend/theme-manager.js +0 -163
  281. package/backend/usage-forecast.js +0 -86
  282. package/backend/usage-history-scanner.ts +0 -2718
  283. package/backend/usage-history-smoke.js +0 -64
  284. package/backend/usage-history-worker.js +0 -34
  285. package/backend/workspace-directory.js +0 -232
  286. package/backend/workspace-discovery.js +0 -311
  287. package/backend/workspace-root-registry.js +0 -166
  288. package/dist/assets/App-BKNUILuL.css +0 -1
  289. package/dist/assets/App-Z1N7T0eM.js +0 -695
  290. package/dist/assets/FileEditorPane-CNtuGjQ3.js +0 -2
  291. package/dist/assets/IconGlyphs-BClgag6E.js +0 -1
  292. package/dist/assets/ProjectFilesSection-K3GHuQ4U.js +0 -12
  293. package/dist/assets/ReviewPage-BRuxFaH5.js +0 -3
  294. package/dist/assets/code-dark-kLsQLvpf.css +0 -1
  295. package/dist/assets/file-icons-BOlcJ0ZF.js +0 -1
  296. package/dist/assets/main-DUTz-Rd2.css +0 -1
  297. package/dist/assets/review-BcnwQtJv.css +0 -1
  298. package/dist/assets/workspace-editor-model-CSGCl21x.js +0 -1
  299. package/dist/assets/workspace-editor-monaco-CJNwbpCy.js +0 -4
  300. package/dist/assets/workspace-editor-monaco-CO9w8YV0.js +0 -1
  301. package/dist/assets/workspace-view-state-BjKPYp0E.js +0 -7
  302. package/extensions/browser/backend/agent-browser-runtime.js +0 -1041
  303. package/extensions/browser/backend/agent-capability.js +0 -55
  304. package/extensions/browser/backend/browser-mcp-server.js +0 -621
  305. package/extensions/browser/backend/browser-resource-manager.js +0 -1331
  306. package/extensions/browser/backend/browser-resource-store.js +0 -190
  307. package/extensions/browser/backend/browser-router.js +0 -141
  308. package/extensions/browser/backend/executable-discovery.js +0 -238
  309. package/extensions/browser/backend/farming-browser-client.js +0 -83
  310. package/extensions/browser/backend/index.js +0 -7
  311. package/extensions/browser/backend/managed-chromium-installer.js +0 -593
  312. package/extensions/browser/frontend/BrowserSidebarPortals.tsx +0 -360
  313. package/extensions/browser/frontend/BrowserViewer.tsx +0 -500
  314. package/extensions/browser/frontend/browser-resource-state.ts +0 -60
  315. package/extensions/browser/frontend/browser.css +0 -567
  316. package/extensions/browser/frontend/types.ts +0 -38
  317. package/extensions/browser/frontend/useBrowserResources.ts +0 -166
  318. package/frontend/vendor/ghostty-web/index.d.ts +0 -1842
  319. package/shared/backend-connection-status.d.ts +0 -37
  320. package/shared/browser-protocol.d.ts +0 -5
  321. /package/dist/assets/{api-w2x5QfxB.js → api-ByCV9MEr.js} +0 -0
  322. /package/dist/assets/{core-vPkV8P_m.js → core-Czwdx12k.js} +0 -0
  323. /package/dist/assets/{fsharp-DNZNZyEE.js → fsharp-BjPpkoJe.js} +0 -0
  324. /package/dist/assets/{go-_kPJjNc_.js → go-BkIDmSUP.js} +0 -0
  325. /package/dist/assets/{graphql-4HCNVt5g.js → graphql-CCJTpqi1.js} +0 -0
  326. /package/dist/assets/{hcl-C87ymY0o.js → hcl-s4z8lUFg.js} +0 -0
  327. /package/dist/assets/{ini-BYrrGNTc.js → ini-CyUW1I7Z.js} +0 -0
  328. /package/dist/assets/{java-B211rJbk.js → java-CFCcGRiM.js} +0 -0
  329. /package/dist/assets/{julia-DVPsRtBm.js → julia-DQyH_EYb.js} +0 -0
  330. /package/dist/assets/{kotlin-BYyNerjp.js → kotlin-B8hA5O51.js} +0 -0
  331. /package/dist/assets/{less-EC9UblGE.js → less-DaVdaas0.js} +0 -0
  332. /package/dist/assets/{lexon-B1yuUdqW.js → lexon-DLBhPd3y.js} +0 -0
  333. /package/dist/assets/{lua-Bo6GFzxT.js → lua-gB1c_cif.js} +0 -0
  334. /package/dist/assets/{m3-C-Y9cBVI.js → m3-C2T3z3gB.js} +0 -0
  335. /package/dist/assets/{markdown-BHu-wLbe.js → markdown-CKq-Euj1.js} +0 -0
  336. /package/dist/assets/{mips-Dkds26rX.js → mips-Bcs5qIDX.js} +0 -0
  337. /package/dist/assets/{msdax-PU4g-8_g.js → msdax-CBP48FHF.js} +0 -0
  338. /package/dist/assets/{mysql-fPpuGpS7.js → mysql-c7tiPcFj.js} +0 -0
  339. /package/dist/assets/{objective-c-Wy1e5JUf.js → objective-c-D4BZkeEV.js} +0 -0
  340. /package/dist/assets/{pascal-BIXwvrqU.js → pascal-CJDZg0MN.js} +0 -0
  341. /package/dist/assets/{pascaligo-DwR0AtL_.js → pascaligo-Bygi8Ynl.js} +0 -0
  342. /package/dist/assets/{perl-CGHAl8my.js → perl-aS8bkf7E.js} +0 -0
  343. /package/dist/assets/{pgsql-B91M73E2.js → pgsql-CzNAYFYl.js} +0 -0
  344. /package/dist/assets/{php-C70ttrCx.js → php-DOtoEFTT.js} +0 -0
  345. /package/dist/assets/{pla-BNrXaRh0.js → pla-DugRnao1.js} +0 -0
  346. /package/dist/assets/{postiats-Dv2IAZR9.js → postiats-DsXwusKh.js} +0 -0
  347. /package/dist/assets/{powerquery-CkY5Wq7J.js → powerquery-DL3o72oD.js} +0 -0
  348. /package/dist/assets/{powershell-uGIYLU3C.js → powershell-C1qHekys.js} +0 -0
  349. /package/dist/assets/{protobuf-CavfmJu-.js → protobuf-DHgsc-cH.js} +0 -0
  350. /package/dist/assets/{pug-Drqnyitx.js → pug-FZXlE_Iu.js} +0 -0
  351. /package/dist/assets/{qrcode-7uGsTEmi.js → qrcode-DJDTdjL7.js} +0 -0
  352. /package/dist/assets/{qsharp-C7yF-Dti.js → qsharp-bLyhI3DT.js} +0 -0
  353. /package/dist/assets/{r-HXLGP0_-.js → r-DjFGXbAa.js} +0 -0
  354. /package/dist/assets/{redis-C4y6mf2p.js → redis-DSoZ_V6u.js} +0 -0
  355. /package/dist/assets/{redshift-DdQrFPrv.js → redshift-CzkdCsrg.js} +0 -0
  356. /package/dist/assets/{restructuredtext-CBrf2PNj.js → restructuredtext-B_XPrGCQ.js} +0 -0
  357. /package/dist/assets/{ruby-CVtMoX2B.js → ruby-Cry2RneJ.js} +0 -0
  358. /package/dist/assets/{rust-Ckq4sbMP.js → rust-CWzdbFq1.js} +0 -0
  359. /package/dist/assets/{sb-er66OpE3.js → sb-DmofU59h.js} +0 -0
  360. /package/dist/assets/{scala-BdWZz-hH.js → scala-BUC2l-vN.js} +0 -0
  361. /package/dist/assets/{scheme-kTV_s2kP.js → scheme-CNIB_72f.js} +0 -0
  362. /package/dist/assets/{scss-Bymy2VJQ.js → scss-DcL4-NbX.js} +0 -0
  363. /package/dist/assets/{shell-bwEP1LQ1.js → shell-CgAGvSSA.js} +0 -0
  364. /package/dist/assets/{solidity-DCddeBgL.js → solidity-DSkt6O_P.js} +0 -0
  365. /package/dist/assets/{sophia-BMN3AQig.js → sophia--5ytcjDN.js} +0 -0
  366. /package/dist/assets/{sparql-CSXOLjzi.js → sparql-C1Srr7cD.js} +0 -0
  367. /package/dist/assets/{sql-COg8ewmK.js → sql-2k_O5fj7.js} +0 -0
  368. /package/dist/assets/{st-CIaZtBS_.js → st-DCCCPqfz.js} +0 -0
  369. /package/dist/assets/{swift-DXiOhUHu.js → swift-Dd8mAfOt.js} +0 -0
  370. /package/dist/assets/{systemverilog-BTDE6Dr2.js → systemverilog-B0-aZYXu.js} +0 -0
  371. /package/dist/assets/{tcl-B0zy9NvV.js → tcl-CZAZwPVX.js} +0 -0
  372. /package/dist/assets/{twig-D594l4Z1.js → twig-D-Ag0tdS.js} +0 -0
  373. /package/dist/assets/{typespec-XKVjaPqo.js → typespec-B7kTFp0Z.js} +0 -0
  374. /package/dist/assets/{useWorkspaceMenuKeyboard-Bpy_s69Z.js → useWorkspaceMenuKeyboard-uYZpDxhU.js} +0 -0
  375. /package/dist/assets/{vb-B2wYoKRV.js → vb-20w1JPum.js} +0 -0
  376. /package/dist/assets/{wgsl-D0Yf2LbK.js → wgsl-CLJfqFt0.js} +0 -0
  377. /package/dist/assets/{workspace-working-copy-C3FSR3N6.js → workspace-working-copy-Cfz07cOd.js} +0 -0
@@ -0,0 +1,3067 @@
1
+ {
2
+ "version": 1,
3
+ "driverVersion": "0.12.4",
4
+ "sourceImage": "trycua/xfce-cua@sha256:274eb636f5cf3fc58f705916ee72b7a701270b3877369d08533a385c5325be9b",
5
+ "toolCount": 53,
6
+ "tools": [
7
+ {
8
+ "name": "computer_list_apps",
9
+ "upstreamName": "list_apps",
10
+ "description": "List Linux apps — both currently running and installed-but-not-running — with per-app state flags:\n\n- running: is a process for this app live? (pid is 0 when false)\n- active: reserved (Linux X11/Wayland focus model differs from frontmost-app); always false.\n- kind: `\"desktop\"` for XDG `.desktop` launcher entries.\n- launch_path: the launcher command from `Exec=` (field codes stripped). Pass to `launch_app(launch_path=...)`.\n- bundle_id: the XDG \"desktop file id\" — the `.desktop` file's path relative to its XDG `applications/` root with the `.desktop` suffix stripped and path separators replaced with `-` (e.g. `kde4/konqbrowser.desktop` → `kde4-konqbrowser`).\n- last_used: RFC3339 mtime of the `.desktop` file, when readable.\n\nRunning apps come from `/proc`. Installed apps come from XDG Desktop Entry files in $XDG_DATA_HOME/applications and each $XDG_DATA_DIRS entry's applications/ subdir. Entries with `NoDisplay=true` or `Hidden=true` are filtered. A `.desktop` file whose launcher matches a running process (by basename) is merged into a single entry with `running: true`.\n\nUse this for \"is X installed?\" as well as \"is X running?\". For per-window state — visibility, geometry, titles — call list_windows instead.",
11
+ "inputSchema": {
12
+ "additionalProperties": false,
13
+ "properties": {},
14
+ "type": "object"
15
+ },
16
+ "annotations": {
17
+ "destructiveHint": false,
18
+ "idempotentHint": true,
19
+ "openWorldHint": false,
20
+ "readOnlyHint": true
21
+ },
22
+ "_meta": {
23
+ "farming.dev/upstream": "cua-driver",
24
+ "farming.dev/capabilities": [
25
+ "app.list"
26
+ ],
27
+ "farming.dev/risk": {
28
+ "class": "r1",
29
+ "enforcement": "metadata_only",
30
+ "operation_sensitive": false,
31
+ "version": "1"
32
+ }
33
+ }
34
+ },
35
+ {
36
+ "name": "computer_list_windows",
37
+ "upstreamName": "list_windows",
38
+ "description": "List top-level X11 windows via _NET_CLIENT_LIST.",
39
+ "inputSchema": {
40
+ "additionalProperties": false,
41
+ "properties": {
42
+ "on_screen_only": {
43
+ "description": "When true, filter to visible windows only. Default false.",
44
+ "type": "boolean"
45
+ },
46
+ "pid": {
47
+ "type": "integer"
48
+ }
49
+ },
50
+ "type": "object"
51
+ },
52
+ "annotations": {
53
+ "destructiveHint": false,
54
+ "idempotentHint": true,
55
+ "openWorldHint": false,
56
+ "readOnlyHint": true
57
+ },
58
+ "_meta": {
59
+ "farming.dev/upstream": "cua-driver",
60
+ "farming.dev/capabilities": [
61
+ "window.list"
62
+ ],
63
+ "farming.dev/risk": {
64
+ "class": "r1",
65
+ "enforcement": "metadata_only",
66
+ "operation_sensitive": false,
67
+ "version": "1"
68
+ }
69
+ }
70
+ },
71
+ {
72
+ "name": "computer_get_window_state",
73
+ "upstreamName": "get_window_state",
74
+ "description": "Walk a running app's AT-SPI tree and return BOTH a structured `elements` array (preferred) AND a Markdown rendering of the same tree (back-compat). Every actionable element is tagged with [element_index N] in the markdown and as `element_index` in the structured array.\n\nPREFERRED CONSUMERS read `structuredContent.elements` (one entry per indexed row with `element_index`, `role`, `label`, `frame: {x,y,w,h}` when AT-SPI reports usable bounds, `parent_index`, `depth`). The markdown `tree_markdown` stays available and unchanged in shape for existing text-parsing callers — but new fields will only be added to the structured side.\n\nAlways returns BOTH the element tree AND a screenshot — ground on both and cross-check (the tree lies on some surfaces). Choose the modality at ACTION time: an element ax action (element_index/element_token → accessibility rung) or an element px action (x,y → pixel rung off this screenshot). capture_mode is deprecated and ignored.\n\nOptional `max_elements` / `max_depth` bound the AT-SPI walk to mitigate context-window blow-up on Electron / large web apps that produce 10k+ element trees. When applied, BOTH the markdown and the structured elements are truncated identically. Omit both for current default behaviour.",
75
+ "inputSchema": {
76
+ "additionalProperties": false,
77
+ "properties": {
78
+ "capture_mode": {
79
+ "description": "DEPRECATED and ignored. get_window_state always returns BOTH the element tree and a screenshot — ground on both. The modality is chosen at action time by how you address the target: an element ax action (element_index/element_token) or an element px action (x,y). Any value (including the old \"som\"/\"screenshot\" aliases) is accepted but has no effect.",
80
+ "enum": [
81
+ "ax",
82
+ "vision"
83
+ ],
84
+ "type": "string"
85
+ },
86
+ "include_screenshot": {
87
+ "description": "Default true — returns a grounding screenshot alongside the tree. Set false to skip the grab and return tree only (the cheap path for re-indexing before an element ax action).",
88
+ "type": "boolean"
89
+ },
90
+ "max_depth": {
91
+ "description": "Cap on the AT-SPI tree walk depth. Omit for the default (uncapped). Lower for deeply nested apps.",
92
+ "minimum": 1,
93
+ "type": "integer"
94
+ },
95
+ "max_elements": {
96
+ "description": "Cap on total AT-SPI nodes walked. Omit for the default (5 000). Lower for huge web/Electron trees.",
97
+ "minimum": 1,
98
+ "type": "integer"
99
+ },
100
+ "pid": {
101
+ "type": "integer"
102
+ },
103
+ "query": {
104
+ "type": "string"
105
+ },
106
+ "screenshot_out_file": {
107
+ "description": "When set, write the PNG to this file path (~ expanded) instead of embedding base64 in the response. The structured output carries screenshot_file_path instead.",
108
+ "type": "string"
109
+ },
110
+ "session": {
111
+ "description": "Optional session id: declares/uses the agent cursor and per-session state for this run. The same id works over MCP, the CLI, or the raw socket, and follows the run across apps/windows. Omit to run cursor-less.",
112
+ "type": "string"
113
+ },
114
+ "window_id": {
115
+ "description": "X11 XID from list_windows.",
116
+ "type": "integer"
117
+ }
118
+ },
119
+ "required": [
120
+ "pid",
121
+ "window_id"
122
+ ],
123
+ "type": "object"
124
+ },
125
+ "annotations": {
126
+ "destructiveHint": false,
127
+ "idempotentHint": true,
128
+ "openWorldHint": false,
129
+ "readOnlyHint": true
130
+ },
131
+ "_meta": {
132
+ "farming.dev/upstream": "cua-driver",
133
+ "farming.dev/capabilities": [
134
+ "accessibility.window_state",
135
+ "accessibility.tree",
136
+ "accessibility.tree.structured",
137
+ "accessibility.tree.bounded",
138
+ "accessibility.element_tokens",
139
+ "screen.capture",
140
+ "screen.capture.window"
141
+ ],
142
+ "farming.dev/risk": {
143
+ "class": "r2",
144
+ "enforcement": "metadata_only",
145
+ "operation_sensitive": false,
146
+ "version": "1"
147
+ }
148
+ }
149
+ },
150
+ {
151
+ "name": "computer_launch_app",
152
+ "upstreamName": "launch_app",
153
+ "description": "Launch a Linux app in the background. Provide launch_path (preferred — round-trip the value from list_apps), name (app name, launched via xdg-open or direct exec), bundle_id (ignored on Linux), or urls (list of URLs to open). Resolution precedence: launch_path > name > bundle_id.",
154
+ "inputSchema": {
155
+ "additionalProperties": false,
156
+ "properties": {
157
+ "additional_arguments": {
158
+ "description": "Extra command-line arguments passed to the launched process.",
159
+ "items": {
160
+ "type": "string"
161
+ },
162
+ "type": "array"
163
+ },
164
+ "bundle_id": {
165
+ "description": "Ignored on Linux (macOS/Windows concept).",
166
+ "type": "string"
167
+ },
168
+ "launch_path": {
169
+ "description": "Round-trip the `launch_path` returned by `list_apps` — the Exec= command from the .desktop file with XDG field codes already stripped. Highest precedence on Linux; spawned directly via the system shell.",
170
+ "type": "string"
171
+ },
172
+ "name": {
173
+ "description": "App name or command to launch.",
174
+ "type": "string"
175
+ },
176
+ "urls": {
177
+ "description": "URLs to open via xdg-open.",
178
+ "items": {
179
+ "type": "string"
180
+ },
181
+ "type": "array"
182
+ }
183
+ },
184
+ "type": "object"
185
+ },
186
+ "annotations": {
187
+ "destructiveHint": false,
188
+ "idempotentHint": false,
189
+ "openWorldHint": true,
190
+ "readOnlyHint": false
191
+ },
192
+ "_meta": {
193
+ "farming.dev/upstream": "cua-driver",
194
+ "farming.dev/capabilities": [
195
+ "app.launch"
196
+ ],
197
+ "farming.dev/risk": {
198
+ "class": "r1",
199
+ "enforcement": "metadata_only",
200
+ "operation_sensitive": false,
201
+ "version": "1"
202
+ }
203
+ }
204
+ },
205
+ {
206
+ "name": "computer_kill_app",
207
+ "upstreamName": "kill_app",
208
+ "description": "Force-terminate a process by pid (kill -9 equivalent on Linux). Use as escalation when the cooperative close path failed to make the process exit. Unsaved state is lost — prefer the cooperative path first.",
209
+ "inputSchema": {
210
+ "additionalProperties": false,
211
+ "properties": {
212
+ "pid": {
213
+ "description": "PID of the process to terminate.",
214
+ "type": "integer"
215
+ }
216
+ },
217
+ "required": [
218
+ "pid"
219
+ ],
220
+ "type": "object"
221
+ },
222
+ "annotations": {
223
+ "destructiveHint": true,
224
+ "idempotentHint": true,
225
+ "openWorldHint": false,
226
+ "readOnlyHint": false
227
+ },
228
+ "_meta": {
229
+ "farming.dev/upstream": "cua-driver",
230
+ "farming.dev/capabilities": [
231
+ "app.kill"
232
+ ],
233
+ "farming.dev/risk": {
234
+ "class": "r1",
235
+ "enforcement": "metadata_only",
236
+ "operation_sensitive": false,
237
+ "version": "1"
238
+ }
239
+ }
240
+ },
241
+ {
242
+ "name": "computer_bring_to_front",
243
+ "upstreamName": "bring_to_front",
244
+ "description": "Persistently activate a window so subsequent input lands on it. X11: EWMH _NET_ACTIVE_WINDOW activation (the `wmctrl -a` equivalent, proper timestamp handling to beat focus-stealing prevention) — call it before `delivery_mode:\"foreground\"` input to avoid a per-call flash, or to escalate when background injection didn't land. Wayland: activates through a target-addressable compositor adapter (wlroots foreign-toplevel or the GNOME Shell helper) and refuses when the compositor offers no safe adapter. Matches the macOS / Windows bring_to_front rung.",
245
+ "inputSchema": {
246
+ "additionalProperties": false,
247
+ "properties": {
248
+ "pid": {
249
+ "type": "integer"
250
+ },
251
+ "window_id": {
252
+ "description": "X11 window id (xid) to activate. If omitted, the first window of `pid` is used.",
253
+ "type": "integer"
254
+ }
255
+ },
256
+ "required": [
257
+ "pid"
258
+ ],
259
+ "type": "object"
260
+ },
261
+ "annotations": {
262
+ "destructiveHint": false,
263
+ "idempotentHint": true,
264
+ "openWorldHint": false,
265
+ "readOnlyHint": false
266
+ },
267
+ "_meta": {
268
+ "farming.dev/upstream": "cua-driver",
269
+ "farming.dev/capabilities": [
270
+ "window.activate"
271
+ ],
272
+ "farming.dev/risk": {
273
+ "class": "r1",
274
+ "enforcement": "metadata_only",
275
+ "operation_sensitive": false,
276
+ "version": "1"
277
+ }
278
+ }
279
+ },
280
+ {
281
+ "name": "computer_click",
282
+ "upstreamName": "click",
283
+ "description": "Click against a target pid. **Prefer `element_index` over pixel coordinates** — element_index works on backgrounded / hidden windows, surfaces a stable handle, and tells you what you're clicking via the cached AT-SPI element's role + label. Reach for `x, y` only when the target is a canvas / custom-drawn surface that doesn't appear in the AT-SPI tree.\n\nProvide either (window_id + x/y) or (pid + element_index). Routes via XSendEvent (no focus steal). element_index cache is scoped per (pid, window_id) and is replaced by the next get_window_state of the same window — re-snapshot every turn before clicking.\n\nAfter a zoom call, pass from_zoom=true to auto-translate zoom-image coords back to full-window space.\n\nbutton: \"left\" (default), \"right\", or \"middle\". Defaults to left so the field is fully back-compat. X11: routes through XSendEvent ButtonPress/Release with the matching button code. Native Wayland: only left-button is supported via the virtual-pointer protocol — right/middle return an error rather than silently degrading to left.",
284
+ "inputSchema": {
285
+ "additionalProperties": false,
286
+ "properties": {
287
+ "button": {
288
+ "description": "Mouse button. Default: \"left\" (legacy back-compat). X11: routed via ButtonPress/Release with the matching evdev code. Native Wayland: only left-button is supported via the virtual-pointer protocol; right/middle return an error.",
289
+ "enum": [
290
+ "left",
291
+ "right",
292
+ "middle"
293
+ ],
294
+ "type": "string"
295
+ },
296
+ "count": {
297
+ "type": "integer"
298
+ },
299
+ "cursor_id": {
300
+ "description": "Optional multi-cursor instance id. Default: 'default'.",
301
+ "type": "string"
302
+ },
303
+ "delivery_mode": {
304
+ "default": "background",
305
+ "description": "Input delivery mode. 'background' (default) never activates or raises the target window. On X11 it injects via XTEST / the XInput2 master pointer (no focus steal). On Wayland it goes through libei + xdg-desktop-portal, which injects to the compositor's input focus — Wayland's security model has no per-window background targeting, so a specific non-focused window cannot be aimed at; when no libei backend is available the tool returns a structured background_unavailable error. 'foreground' is the explicit escalation: activate the target (X11 _NET_ACTIVE_WINDOW; Wayland compositor activate), inject, then restore the prior active window — a brief focus swap unless the target was already active. Call bring_to_front first to avoid the flash. Matches the macOS / Windows delivery_mode surface.",
306
+ "enum": [
307
+ "background",
308
+ "foreground"
309
+ ],
310
+ "type": "string"
311
+ },
312
+ "element_index": {
313
+ "description": "Element index from the last get_window_state. REQUIRES `pid` and `window_id` alongside it — element_index alone (no pid) fails fast, it is not a silent no-op.",
314
+ "type": "integer"
315
+ },
316
+ "element_token": {
317
+ "description": "Opaque per-snapshot element handle from `structuredContent.elements[].element_token`. Takes precedence over element_index when both are supplied. Returns an explicit \"stale\" error once a newer snapshot supersedes it — re-snapshot in that case.",
318
+ "type": "string"
319
+ },
320
+ "from_zoom": {
321
+ "description": "Set true after a zoom call to auto-translate zoom-image pixel coordinates back to full-window space.",
322
+ "type": "boolean"
323
+ },
324
+ "pid": {
325
+ "type": "integer"
326
+ },
327
+ "scope": {
328
+ "default": "window",
329
+ "enum": [
330
+ "window",
331
+ "desktop"
332
+ ],
333
+ "type": "string"
334
+ },
335
+ "session": {
336
+ "description": "Optional session id: declares/uses the agent cursor and per-session state for this run. The same id works over MCP, the CLI, or the raw socket, and follows the run across apps/windows. Omit to run cursor-less.",
337
+ "type": "string"
338
+ },
339
+ "window_id": {
340
+ "type": "integer"
341
+ },
342
+ "x": {
343
+ "type": "number"
344
+ },
345
+ "y": {
346
+ "type": "number"
347
+ }
348
+ },
349
+ "required": [],
350
+ "type": "object"
351
+ },
352
+ "annotations": {
353
+ "destructiveHint": true,
354
+ "idempotentHint": false,
355
+ "openWorldHint": true,
356
+ "readOnlyHint": false
357
+ },
358
+ "_meta": {
359
+ "farming.dev/upstream": "cua-driver",
360
+ "farming.dev/capabilities": [
361
+ "input.pointer.click",
362
+ "input.pointer.click.left",
363
+ "accessibility.element_tokens",
364
+ "input.delivery_mode"
365
+ ],
366
+ "farming.dev/risk": {
367
+ "class": "r1",
368
+ "enforcement": "metadata_only",
369
+ "operation_sensitive": false,
370
+ "version": "1"
371
+ }
372
+ }
373
+ },
374
+ {
375
+ "name": "computer_double_click",
376
+ "upstreamName": "double_click",
377
+ "description": "Double-click at (x,y) or an element_index (AT-SPI bounds) via XSendEvent. No focus steal. Provide either (window_id + x/y) or (pid + element_index). After a zoom call, pass from_zoom=true to auto-translate zoom-image coords.",
378
+ "inputSchema": {
379
+ "additionalProperties": false,
380
+ "properties": {
381
+ "cursor_id": {
382
+ "description": "Optional multi-cursor instance id. Default: 'default'.",
383
+ "type": "string"
384
+ },
385
+ "delivery_mode": {
386
+ "default": "background",
387
+ "description": "Input delivery mode. 'background' (default) never activates or raises the target window. On X11 it injects via XTEST / the XInput2 master pointer (no focus steal). On Wayland it goes through libei + xdg-desktop-portal, which injects to the compositor's input focus — Wayland's security model has no per-window background targeting, so a specific non-focused window cannot be aimed at; when no libei backend is available the tool returns a structured background_unavailable error. 'foreground' is the explicit escalation: activate the target (X11 _NET_ACTIVE_WINDOW; Wayland compositor activate), inject, then restore the prior active window — a brief focus swap unless the target was already active. Call bring_to_front first to avoid the flash. Matches the macOS / Windows delivery_mode surface.",
388
+ "enum": [
389
+ "background",
390
+ "foreground"
391
+ ],
392
+ "type": "string"
393
+ },
394
+ "element_index": {
395
+ "description": "Element index from the last get_window_state. REQUIRES `pid` and `window_id` alongside it — element_index alone (no pid) fails fast, it is not a silent no-op.",
396
+ "type": "integer"
397
+ },
398
+ "element_token": {
399
+ "description": "Opaque per-snapshot element handle from `structuredContent.elements[].element_token`. Takes precedence over element_index when both are supplied. Returns an explicit \"stale\" error once a newer snapshot supersedes it — re-snapshot in that case.",
400
+ "type": "string"
401
+ },
402
+ "from_zoom": {
403
+ "description": "Set true after a zoom call to auto-translate zoom-image pixel coordinates back to full-window space.",
404
+ "type": "boolean"
405
+ },
406
+ "pid": {
407
+ "type": "integer"
408
+ },
409
+ "session": {
410
+ "description": "Optional session id: declares/uses the agent cursor and per-session state for this run. The same id works over MCP, the CLI, or the raw socket, and follows the run across apps/windows. Omit to run cursor-less.",
411
+ "type": "string"
412
+ },
413
+ "window_id": {
414
+ "type": "integer"
415
+ },
416
+ "x": {
417
+ "type": "number"
418
+ },
419
+ "y": {
420
+ "type": "number"
421
+ }
422
+ },
423
+ "required": [
424
+ "pid"
425
+ ],
426
+ "type": "object"
427
+ },
428
+ "annotations": {
429
+ "destructiveHint": true,
430
+ "idempotentHint": false,
431
+ "openWorldHint": true,
432
+ "readOnlyHint": false
433
+ },
434
+ "_meta": {
435
+ "farming.dev/upstream": "cua-driver",
436
+ "farming.dev/capabilities": [
437
+ "input.pointer.click",
438
+ "input.pointer.click.left",
439
+ "input.pointer.click.double",
440
+ "accessibility.element_tokens",
441
+ "input.delivery_mode"
442
+ ],
443
+ "farming.dev/risk": {
444
+ "class": "r1",
445
+ "enforcement": "metadata_only",
446
+ "operation_sensitive": false,
447
+ "version": "1"
448
+ }
449
+ }
450
+ },
451
+ {
452
+ "name": "computer_right_click",
453
+ "upstreamName": "right_click",
454
+ "description": "Right-click at (x,y) or an element_index (AT-SPI bounds) via XSendEvent. No focus steal. Provide either (window_id + x/y) or (pid + element_index). After a zoom call, pass from_zoom=true to auto-translate zoom-image coords.",
455
+ "inputSchema": {
456
+ "additionalProperties": false,
457
+ "properties": {
458
+ "cursor_id": {
459
+ "description": "Optional multi-cursor instance id. Default: 'default'.",
460
+ "type": "string"
461
+ },
462
+ "delivery_mode": {
463
+ "default": "background",
464
+ "description": "Input delivery mode. 'background' (default) never activates or raises the target window. On X11 it injects via XTEST / the XInput2 master pointer (no focus steal). On Wayland it goes through libei + xdg-desktop-portal, which injects to the compositor's input focus — Wayland's security model has no per-window background targeting, so a specific non-focused window cannot be aimed at; when no libei backend is available the tool returns a structured background_unavailable error. 'foreground' is the explicit escalation: activate the target (X11 _NET_ACTIVE_WINDOW; Wayland compositor activate), inject, then restore the prior active window — a brief focus swap unless the target was already active. Call bring_to_front first to avoid the flash. Matches the macOS / Windows delivery_mode surface.",
465
+ "enum": [
466
+ "background",
467
+ "foreground"
468
+ ],
469
+ "type": "string"
470
+ },
471
+ "element_index": {
472
+ "description": "Element index from the last get_window_state. REQUIRES `pid` and `window_id` alongside it — element_index alone (no pid) fails fast, it is not a silent no-op.",
473
+ "type": "integer"
474
+ },
475
+ "element_token": {
476
+ "description": "Opaque per-snapshot element handle from `structuredContent.elements[].element_token`. Takes precedence over element_index when both are supplied. Returns an explicit \"stale\" error once a newer snapshot supersedes it — re-snapshot in that case.",
477
+ "type": "string"
478
+ },
479
+ "from_zoom": {
480
+ "description": "Set true after a zoom call to auto-translate zoom-image pixel coordinates back to full-window space.",
481
+ "type": "boolean"
482
+ },
483
+ "modifier": {
484
+ "description": "Modifier keys held during the action: cmd, shift, option/alt, ctrl.",
485
+ "items": {
486
+ "type": "string"
487
+ },
488
+ "type": "array"
489
+ },
490
+ "pid": {
491
+ "type": "integer"
492
+ },
493
+ "session": {
494
+ "description": "Optional session id: declares/uses the agent cursor and per-session state for this run. The same id works over MCP, the CLI, or the raw socket, and follows the run across apps/windows. Omit to run cursor-less.",
495
+ "type": "string"
496
+ },
497
+ "window_id": {
498
+ "type": "integer"
499
+ },
500
+ "x": {
501
+ "type": "number"
502
+ },
503
+ "y": {
504
+ "type": "number"
505
+ }
506
+ },
507
+ "required": [
508
+ "pid"
509
+ ],
510
+ "type": "object"
511
+ },
512
+ "annotations": {
513
+ "destructiveHint": true,
514
+ "idempotentHint": false,
515
+ "openWorldHint": true,
516
+ "readOnlyHint": false
517
+ },
518
+ "_meta": {
519
+ "farming.dev/upstream": "cua-driver",
520
+ "farming.dev/capabilities": [
521
+ "input.pointer.click",
522
+ "input.pointer.click.right",
523
+ "accessibility.element_tokens",
524
+ "input.delivery_mode"
525
+ ],
526
+ "farming.dev/risk": {
527
+ "class": "r1",
528
+ "enforcement": "metadata_only",
529
+ "operation_sensitive": false,
530
+ "version": "1"
531
+ }
532
+ }
533
+ },
534
+ {
535
+ "name": "computer_drag",
536
+ "upstreamName": "drag",
537
+ "description": "Press-drag-release gesture from (from_x, from_y) to (to_x, to_y) in window-local screenshot pixels via XSendEvent (ButtonPress + MotionNotify × steps + ButtonRelease). duration_ms (default 500), steps (default 20). No focus steal.",
538
+ "inputSchema": {
539
+ "additionalProperties": false,
540
+ "properties": {
541
+ "button": {
542
+ "description": "Mouse button. Default \"left\".",
543
+ "enum": [
544
+ "left",
545
+ "right",
546
+ "middle"
547
+ ],
548
+ "type": "string"
549
+ },
550
+ "cursor_id": {
551
+ "description": "Optional multi-cursor instance id. Default: 'default'.",
552
+ "type": "string"
553
+ },
554
+ "delivery_mode": {
555
+ "default": "background",
556
+ "description": "Input delivery mode. 'background' (default) never activates or raises the target window. On X11 it injects via XTEST / the XInput2 master pointer (no focus steal). On Wayland it goes through libei + xdg-desktop-portal, which injects to the compositor's input focus — Wayland's security model has no per-window background targeting, so a specific non-focused window cannot be aimed at; when no libei backend is available the tool returns a structured background_unavailable error. 'foreground' is the explicit escalation: activate the target (X11 _NET_ACTIVE_WINDOW; Wayland compositor activate), inject, then restore the prior active window — a brief focus swap unless the target was already active. Call bring_to_front first to avoid the flash. Matches the macOS / Windows delivery_mode surface.",
557
+ "enum": [
558
+ "background",
559
+ "foreground"
560
+ ],
561
+ "type": "string"
562
+ },
563
+ "duration_ms": {
564
+ "description": "Total drag duration. Default: 500.",
565
+ "maximum": 10000,
566
+ "minimum": 0,
567
+ "type": "integer"
568
+ },
569
+ "from_x": {
570
+ "type": "number"
571
+ },
572
+ "from_y": {
573
+ "type": "number"
574
+ },
575
+ "from_zoom": {
576
+ "type": "boolean"
577
+ },
578
+ "modifier": {
579
+ "description": "Modifier keys held during the action: cmd, shift, option/alt, ctrl.",
580
+ "items": {
581
+ "type": "string"
582
+ },
583
+ "type": "array"
584
+ },
585
+ "pid": {
586
+ "type": "integer"
587
+ },
588
+ "scope": {
589
+ "default": "window",
590
+ "enum": [
591
+ "window",
592
+ "desktop"
593
+ ],
594
+ "type": "string"
595
+ },
596
+ "session": {
597
+ "description": "Optional session id: declares/uses the agent cursor and per-session state for this run. The same id works over MCP, the CLI, or the raw socket, and follows the run across apps/windows. Omit to run cursor-less.",
598
+ "type": "string"
599
+ },
600
+ "steps": {
601
+ "description": "Intermediate MotionNotify events. Default: 20.",
602
+ "maximum": 200,
603
+ "minimum": 1,
604
+ "type": "integer"
605
+ },
606
+ "to_x": {
607
+ "type": "number"
608
+ },
609
+ "to_y": {
610
+ "type": "number"
611
+ },
612
+ "window_id": {
613
+ "description": "Target window XID. Required.",
614
+ "type": "integer"
615
+ }
616
+ },
617
+ "required": [
618
+ "from_x",
619
+ "from_y",
620
+ "to_x",
621
+ "to_y"
622
+ ],
623
+ "type": "object"
624
+ },
625
+ "annotations": {
626
+ "destructiveHint": true,
627
+ "idempotentHint": false,
628
+ "openWorldHint": true,
629
+ "readOnlyHint": false
630
+ },
631
+ "_meta": {
632
+ "farming.dev/upstream": "cua-driver",
633
+ "farming.dev/capabilities": [
634
+ "input.pointer.drag",
635
+ "input.delivery_mode"
636
+ ],
637
+ "farming.dev/risk": {
638
+ "class": "r1",
639
+ "enforcement": "metadata_only",
640
+ "operation_sensitive": false,
641
+ "version": "1"
642
+ }
643
+ }
644
+ },
645
+ {
646
+ "name": "computer_mouse_button_down",
647
+ "upstreamName": "mouse_button_down",
648
+ "description": "Press and hold a mouse button at (x,y) via background X11 delivery. Does not release the button; pair with mouse_drag / mouse_button_up. Returns the current held-button state.",
649
+ "inputSchema": {
650
+ "additionalProperties": false,
651
+ "properties": {
652
+ "button": {
653
+ "description": "Mouse button. Default \"left\".",
654
+ "enum": [
655
+ "left",
656
+ "right",
657
+ "middle"
658
+ ],
659
+ "type": "string"
660
+ },
661
+ "cursor_id": {
662
+ "description": "Optional multi-cursor instance id. Default: 'default'.",
663
+ "type": "string"
664
+ },
665
+ "from_zoom": {
666
+ "description": "Set true after a zoom call to auto-translate zoom-image pixel coordinates back to full-window space.",
667
+ "type": "boolean"
668
+ },
669
+ "pid": {
670
+ "type": "integer"
671
+ },
672
+ "session": {
673
+ "description": "Optional multi-cursor session id; takes precedence over cursor_id.",
674
+ "type": "string"
675
+ },
676
+ "window_id": {
677
+ "type": "integer"
678
+ },
679
+ "x": {
680
+ "type": "number"
681
+ },
682
+ "y": {
683
+ "type": "number"
684
+ }
685
+ },
686
+ "required": [
687
+ "pid",
688
+ "window_id",
689
+ "x",
690
+ "y"
691
+ ],
692
+ "type": "object"
693
+ },
694
+ "annotations": {
695
+ "destructiveHint": true,
696
+ "idempotentHint": false,
697
+ "openWorldHint": true,
698
+ "readOnlyHint": false
699
+ },
700
+ "_meta": {
701
+ "farming.dev/upstream": "cua-driver",
702
+ "farming.dev/capabilities": [
703
+ "input.pointer.button"
704
+ ],
705
+ "farming.dev/risk": {
706
+ "class": "r1",
707
+ "enforcement": "metadata_only",
708
+ "operation_sensitive": false,
709
+ "version": "1"
710
+ }
711
+ }
712
+ },
713
+ {
714
+ "name": "computer_mouse_drag",
715
+ "upstreamName": "mouse_drag",
716
+ "description": "Move a previously-held mouse button to a new point via background X11 delivery. Requires an active mouse_button_down state; does not release the button. Returns the updated held-button state.",
717
+ "inputSchema": {
718
+ "additionalProperties": false,
719
+ "properties": {
720
+ "cursor_id": {
721
+ "description": "Optional multi-cursor instance id. Default: 'default'.",
722
+ "type": "string"
723
+ },
724
+ "duration_ms": {
725
+ "description": "Total drag duration. Default: 500.",
726
+ "maximum": 10000,
727
+ "minimum": 0,
728
+ "type": "integer"
729
+ },
730
+ "from_zoom": {
731
+ "description": "Set true after a zoom call to auto-translate zoom-image pixel coordinates back to full-window space.",
732
+ "type": "boolean"
733
+ },
734
+ "pid": {
735
+ "type": "integer"
736
+ },
737
+ "session": {
738
+ "description": "Optional multi-cursor session id; takes precedence over cursor_id.",
739
+ "type": "string"
740
+ },
741
+ "steps": {
742
+ "description": "Intermediate MotionNotify events. Default: 20.",
743
+ "maximum": 200,
744
+ "minimum": 1,
745
+ "type": "integer"
746
+ },
747
+ "window_id": {
748
+ "type": "integer"
749
+ },
750
+ "x": {
751
+ "type": "number"
752
+ },
753
+ "y": {
754
+ "type": "number"
755
+ }
756
+ },
757
+ "required": [
758
+ "x",
759
+ "y"
760
+ ],
761
+ "type": "object"
762
+ },
763
+ "annotations": {
764
+ "destructiveHint": true,
765
+ "idempotentHint": false,
766
+ "openWorldHint": true,
767
+ "readOnlyHint": false
768
+ },
769
+ "_meta": {
770
+ "farming.dev/upstream": "cua-driver",
771
+ "farming.dev/capabilities": [
772
+ "input.pointer.drag"
773
+ ],
774
+ "farming.dev/risk": {
775
+ "class": "r1",
776
+ "enforcement": "metadata_only",
777
+ "operation_sensitive": false,
778
+ "version": "1"
779
+ }
780
+ }
781
+ },
782
+ {
783
+ "name": "computer_mouse_button_up",
784
+ "upstreamName": "mouse_button_up",
785
+ "description": "Release a previously-held mouse button via background X11 delivery. If x/y are omitted, releases at the last held position. Returns the current held-button state.",
786
+ "inputSchema": {
787
+ "additionalProperties": false,
788
+ "properties": {
789
+ "cursor_id": {
790
+ "description": "Optional multi-cursor instance id. Default: 'default'.",
791
+ "type": "string"
792
+ },
793
+ "from_zoom": {
794
+ "description": "Set true after a zoom call to auto-translate zoom-image pixel coordinates back to full-window space.",
795
+ "type": "boolean"
796
+ },
797
+ "pid": {
798
+ "type": "integer"
799
+ },
800
+ "session": {
801
+ "description": "Optional multi-cursor session id; takes precedence over cursor_id.",
802
+ "type": "string"
803
+ },
804
+ "window_id": {
805
+ "type": "integer"
806
+ },
807
+ "x": {
808
+ "type": "number"
809
+ },
810
+ "y": {
811
+ "type": "number"
812
+ }
813
+ },
814
+ "type": "object"
815
+ },
816
+ "annotations": {
817
+ "destructiveHint": true,
818
+ "idempotentHint": false,
819
+ "openWorldHint": true,
820
+ "readOnlyHint": false
821
+ },
822
+ "_meta": {
823
+ "farming.dev/upstream": "cua-driver",
824
+ "farming.dev/capabilities": [
825
+ "input.pointer.button"
826
+ ],
827
+ "farming.dev/risk": {
828
+ "class": "r1",
829
+ "enforcement": "metadata_only",
830
+ "operation_sensitive": false,
831
+ "version": "1"
832
+ }
833
+ }
834
+ },
835
+ {
836
+ "name": "computer_parallel_mouse_drag",
837
+ "upstreamName": "parallel_mouse_drag",
838
+ "description": "Run multiple mouse drag gestures concurrently via Linux MPX/XI2 virtual master pointers. Each drag item runs on its own session-scoped master pointer (true same-window concurrent draws on X11). Each item presses once, glides continuously through its whole path, and releases once — one smooth held drag, not a chain of clicks. A path is given either as a straight segment (from_x/from_y → to_x/to_y) or as a function `fn` = y(x) sampled over [x_from, x_to] in window-local pixels (e.g. fn:\"x\" is a diagonal, fn:\"300+120*sin(x/40)\" a sine wave). Functions support + - * / ^, sin/cos/tan, sqrt, abs, exp, ln, pi, e.",
839
+ "inputSchema": {
840
+ "additionalProperties": false,
841
+ "properties": {
842
+ "drags": {
843
+ "items": {
844
+ "additionalProperties": false,
845
+ "properties": {
846
+ "button": {
847
+ "description": "Mouse button. Default \"left\".",
848
+ "enum": [
849
+ "left",
850
+ "right",
851
+ "middle"
852
+ ],
853
+ "type": "string"
854
+ },
855
+ "duration_ms": {
856
+ "description": "Default: 1500 for fn paths, 500 for straight.",
857
+ "maximum": 10000,
858
+ "minimum": 0,
859
+ "type": "integer"
860
+ },
861
+ "fn": {
862
+ "description": "Expression y(x) in window-local pixels; sampled over [x_from,x_to]. Mutually exclusive with from_x/to_x.",
863
+ "type": "string"
864
+ },
865
+ "from_x": {
866
+ "type": "number"
867
+ },
868
+ "from_y": {
869
+ "type": "number"
870
+ },
871
+ "path": {
872
+ "description": "Explicit window-local waypoints [[x,y],...] (>=2); pressed once, glided through, released once. Takes precedence over fn/from-to.",
873
+ "items": {
874
+ "items": {
875
+ "type": "number"
876
+ },
877
+ "type": "array"
878
+ },
879
+ "type": "array"
880
+ },
881
+ "samples": {
882
+ "description": "Waypoints sampled along `fn`. Default: 80.",
883
+ "maximum": 400,
884
+ "minimum": 2,
885
+ "type": "integer"
886
+ },
887
+ "session": {
888
+ "description": "Session/cursor id; also keys the virtual master pointer.",
889
+ "type": "string"
890
+ },
891
+ "steps": {
892
+ "description": "Motion sub-steps along the whole path. Default: scaled to path length.",
893
+ "maximum": 300,
894
+ "minimum": 1,
895
+ "type": "integer"
896
+ },
897
+ "to_x": {
898
+ "type": "number"
899
+ },
900
+ "to_y": {
901
+ "type": "number"
902
+ },
903
+ "window_id": {
904
+ "type": "integer"
905
+ },
906
+ "x_from": {
907
+ "description": "Domain start (window-local x) when `fn` is used.",
908
+ "type": "number"
909
+ },
910
+ "x_to": {
911
+ "description": "Domain end (window-local x) when `fn` is used.",
912
+ "type": "number"
913
+ }
914
+ },
915
+ "required": [
916
+ "session",
917
+ "window_id"
918
+ ],
919
+ "type": "object"
920
+ },
921
+ "minItems": 2,
922
+ "type": "array"
923
+ }
924
+ },
925
+ "required": [
926
+ "drags"
927
+ ],
928
+ "type": "object"
929
+ },
930
+ "annotations": {
931
+ "destructiveHint": true,
932
+ "idempotentHint": false,
933
+ "openWorldHint": true,
934
+ "readOnlyHint": false
935
+ },
936
+ "_meta": {
937
+ "farming.dev/upstream": "cua-driver",
938
+ "farming.dev/capabilities": [
939
+ "input.pointer.drag"
940
+ ],
941
+ "farming.dev/risk": {
942
+ "class": "r1",
943
+ "enforcement": "metadata_only",
944
+ "operation_sensitive": false,
945
+ "version": "1"
946
+ }
947
+ }
948
+ },
949
+ {
950
+ "name": "computer_type_text",
951
+ "upstreamName": "type_text",
952
+ "description": "Type text to a window via XSendEvent (KeyPress/KeyRelease). No focus steal.",
953
+ "inputSchema": {
954
+ "additionalProperties": false,
955
+ "properties": {
956
+ "delivery_mode": {
957
+ "default": "background",
958
+ "description": "Input delivery mode. 'background' (default) never activates or raises the target window. On X11 it injects via XTEST / the XInput2 master pointer (no focus steal). On Wayland it goes through libei + xdg-desktop-portal, which injects to the compositor's input focus — Wayland's security model has no per-window background targeting, so a specific non-focused window cannot be aimed at; when no libei backend is available the tool returns a structured background_unavailable error. 'foreground' is the explicit escalation: activate the target (X11 _NET_ACTIVE_WINDOW; Wayland compositor activate), inject, then restore the prior active window — a brief focus swap unless the target was already active. Call bring_to_front first to avoid the flash. Matches the macOS / Windows delivery_mode surface.",
959
+ "enum": [
960
+ "background",
961
+ "foreground"
962
+ ],
963
+ "type": "string"
964
+ },
965
+ "element_index": {
966
+ "description": "Element index from the last get_window_state. REQUIRES `pid` and `window_id` alongside it — element_index alone (no pid) fails fast, it is not a silent no-op.",
967
+ "type": "integer"
968
+ },
969
+ "element_token": {
970
+ "description": "Opaque per-snapshot element handle from `structuredContent.elements[].element_token`. Takes precedence over element_index when both are supplied. Returns an explicit \"stale\" error once a newer snapshot supersedes it — re-snapshot in that case.",
971
+ "type": "string"
972
+ },
973
+ "pid": {
974
+ "type": "integer"
975
+ },
976
+ "scope": {
977
+ "default": "window",
978
+ "enum": [
979
+ "window",
980
+ "desktop"
981
+ ],
982
+ "type": "string"
983
+ },
984
+ "session": {
985
+ "description": "Optional session id: declares/uses the agent cursor and per-session state for this run. The same id works over MCP, the CLI, or the raw socket, and follows the run across apps/windows. Omit to run cursor-less.",
986
+ "type": "string"
987
+ },
988
+ "text": {
989
+ "type": "string"
990
+ },
991
+ "window_id": {
992
+ "type": "integer"
993
+ },
994
+ "x": {
995
+ "description": "Screenshot-pixel X of the field to type into — the element px action form. Pass x,y (no element_index) and the tool pixel-clicks there to establish real renderer focus, then types. Use for Chromium/Electron inputs the AX path can't reach. Read straight off the get_window_state PNG, same convention as click.",
996
+ "type": "number"
997
+ },
998
+ "y": {
999
+ "description": "Screenshot-pixel Y of the field (see x).",
1000
+ "type": "number"
1001
+ }
1002
+ },
1003
+ "required": [
1004
+ "text"
1005
+ ],
1006
+ "type": "object"
1007
+ },
1008
+ "annotations": {
1009
+ "destructiveHint": true,
1010
+ "idempotentHint": false,
1011
+ "openWorldHint": true,
1012
+ "readOnlyHint": false
1013
+ },
1014
+ "_meta": {
1015
+ "farming.dev/upstream": "cua-driver",
1016
+ "farming.dev/capabilities": [
1017
+ "input.keyboard.type",
1018
+ "input.keyboard.type.terminal_safe",
1019
+ "accessibility.element_tokens",
1020
+ "input.delivery_mode"
1021
+ ],
1022
+ "farming.dev/risk": {
1023
+ "class": "r1",
1024
+ "enforcement": "metadata_only",
1025
+ "operation_sensitive": false,
1026
+ "version": "1"
1027
+ }
1028
+ }
1029
+ },
1030
+ {
1031
+ "name": "computer_press_key",
1032
+ "upstreamName": "press_key",
1033
+ "description": "Press a key via XSendEvent to a window. No focus steal.",
1034
+ "inputSchema": {
1035
+ "additionalProperties": false,
1036
+ "properties": {
1037
+ "delivery_mode": {
1038
+ "default": "background",
1039
+ "description": "Input delivery mode. 'background' (default) never activates or raises the target window. On X11 it injects via XTEST / the XInput2 master pointer (no focus steal). On Wayland it goes through libei + xdg-desktop-portal, which injects to the compositor's input focus — Wayland's security model has no per-window background targeting, so a specific non-focused window cannot be aimed at; when no libei backend is available the tool returns a structured background_unavailable error. 'foreground' is the explicit escalation: activate the target (X11 _NET_ACTIVE_WINDOW; Wayland compositor activate), inject, then restore the prior active window — a brief focus swap unless the target was already active. Call bring_to_front first to avoid the flash. Matches the macOS / Windows delivery_mode surface.",
1040
+ "enum": [
1041
+ "background",
1042
+ "foreground"
1043
+ ],
1044
+ "type": "string"
1045
+ },
1046
+ "element_index": {
1047
+ "description": "Element index from the last get_window_state. REQUIRES `pid` and `window_id` alongside it — element_index alone (no pid) fails fast, it is not a silent no-op.",
1048
+ "type": "integer"
1049
+ },
1050
+ "element_token": {
1051
+ "description": "Opaque per-snapshot element handle from `structuredContent.elements[].element_token`. Takes precedence over element_index when both are supplied. Returns an explicit \"stale\" error once a newer snapshot supersedes it — re-snapshot in that case.",
1052
+ "type": "string"
1053
+ },
1054
+ "key": {
1055
+ "type": "string"
1056
+ },
1057
+ "modifiers": {
1058
+ "items": {
1059
+ "type": "string"
1060
+ },
1061
+ "type": "array"
1062
+ },
1063
+ "pid": {
1064
+ "type": "integer"
1065
+ },
1066
+ "scope": {
1067
+ "default": "window",
1068
+ "enum": [
1069
+ "window",
1070
+ "desktop"
1071
+ ],
1072
+ "type": "string"
1073
+ },
1074
+ "session": {
1075
+ "description": "Optional session id: declares/uses the agent cursor and per-session state for this run. The same id works over MCP, the CLI, or the raw socket, and follows the run across apps/windows. Omit to run cursor-less.",
1076
+ "type": "string"
1077
+ },
1078
+ "window_id": {
1079
+ "type": "integer"
1080
+ },
1081
+ "x": {
1082
+ "description": "Screenshot-pixel X — the element px action form: pixel-click there to focus, then send the key. Use when the key must go to a Chromium/Electron surface the AX path can't focus. Pass with y, no element_index.",
1083
+ "type": "number"
1084
+ },
1085
+ "y": {
1086
+ "description": "Screenshot-pixel Y (see x).",
1087
+ "type": "number"
1088
+ }
1089
+ },
1090
+ "required": [
1091
+ "key"
1092
+ ],
1093
+ "type": "object"
1094
+ },
1095
+ "annotations": {
1096
+ "destructiveHint": true,
1097
+ "idempotentHint": false,
1098
+ "openWorldHint": true,
1099
+ "readOnlyHint": false
1100
+ },
1101
+ "_meta": {
1102
+ "farming.dev/upstream": "cua-driver",
1103
+ "farming.dev/capabilities": [
1104
+ "input.keyboard.press",
1105
+ "accessibility.element_tokens",
1106
+ "input.delivery_mode"
1107
+ ],
1108
+ "farming.dev/risk": {
1109
+ "class": "r1",
1110
+ "enforcement": "metadata_only",
1111
+ "operation_sensitive": false,
1112
+ "version": "1"
1113
+ }
1114
+ }
1115
+ },
1116
+ {
1117
+ "name": "computer_hotkey",
1118
+ "upstreamName": "hotkey",
1119
+ "description": "Press a combination of keys simultaneously, e.g. [\"ctrl\",\"c\"] for Copy. Sent via XSendEvent directly to the target pid; target does NOT need to be frontmost.",
1120
+ "inputSchema": {
1121
+ "additionalProperties": false,
1122
+ "properties": {
1123
+ "delivery_mode": {
1124
+ "default": "background",
1125
+ "description": "Input delivery mode. 'background' (default) never activates or raises the target window. On X11 it injects via XTEST / the XInput2 master pointer (no focus steal). On Wayland it goes through libei + xdg-desktop-portal, which injects to the compositor's input focus — Wayland's security model has no per-window background targeting, so a specific non-focused window cannot be aimed at; when no libei backend is available the tool returns a structured background_unavailable error. 'foreground' is the explicit escalation: activate the target (X11 _NET_ACTIVE_WINDOW; Wayland compositor activate), inject, then restore the prior active window — a brief focus swap unless the target was already active. Call bring_to_front first to avoid the flash. Matches the macOS / Windows delivery_mode surface.",
1126
+ "enum": [
1127
+ "background",
1128
+ "foreground"
1129
+ ],
1130
+ "type": "string"
1131
+ },
1132
+ "element_index": {
1133
+ "description": "Element index from the last get_window_state. REQUIRES `pid` and `window_id` alongside it — element_index alone (no pid) fails fast, it is not a silent no-op.",
1134
+ "type": "integer"
1135
+ },
1136
+ "element_token": {
1137
+ "description": "Opaque per-snapshot element handle from `structuredContent.elements[].element_token`. Takes precedence over element_index when both are supplied. Returns an explicit \"stale\" error once a newer snapshot supersedes it — re-snapshot in that case.",
1138
+ "type": "string"
1139
+ },
1140
+ "keys": {
1141
+ "description": "Modifier(s) + one non-modifier key, e.g. [\"ctrl\",\"c\"].",
1142
+ "items": {
1143
+ "type": "string"
1144
+ },
1145
+ "minItems": 2,
1146
+ "type": "array"
1147
+ },
1148
+ "pid": {
1149
+ "type": "integer"
1150
+ },
1151
+ "scope": {
1152
+ "default": "window",
1153
+ "enum": [
1154
+ "window",
1155
+ "desktop"
1156
+ ],
1157
+ "type": "string"
1158
+ },
1159
+ "session": {
1160
+ "description": "Optional session id: declares/uses the agent cursor and per-session state for this run. The same id works over MCP, the CLI, or the raw socket, and follows the run across apps/windows. Omit to run cursor-less.",
1161
+ "type": "string"
1162
+ },
1163
+ "window_id": {
1164
+ "type": "integer"
1165
+ },
1166
+ "x": {
1167
+ "description": "Screenshot-pixel X — the element px action form: pixel-click there to focus, then send the combo (so e.g. Ctrl+V pastes into that field). Pass with y. Use for Chromium/Electron surfaces the background combo can't reach.",
1168
+ "type": "number"
1169
+ },
1170
+ "y": {
1171
+ "description": "Screenshot-pixel Y (see x).",
1172
+ "type": "number"
1173
+ }
1174
+ },
1175
+ "required": [
1176
+ "keys"
1177
+ ],
1178
+ "type": "object"
1179
+ },
1180
+ "annotations": {
1181
+ "destructiveHint": true,
1182
+ "idempotentHint": false,
1183
+ "openWorldHint": true,
1184
+ "readOnlyHint": false
1185
+ },
1186
+ "_meta": {
1187
+ "farming.dev/upstream": "cua-driver",
1188
+ "farming.dev/capabilities": [
1189
+ "input.keyboard.hotkey",
1190
+ "input.delivery_mode"
1191
+ ],
1192
+ "farming.dev/risk": {
1193
+ "class": "r1",
1194
+ "enforcement": "metadata_only",
1195
+ "operation_sensitive": false,
1196
+ "version": "1"
1197
+ }
1198
+ }
1199
+ },
1200
+ {
1201
+ "name": "computer_set_value",
1202
+ "upstreamName": "set_value",
1203
+ "description": "Set value of an AT-SPI element via SetValue action.",
1204
+ "inputSchema": {
1205
+ "additionalProperties": false,
1206
+ "properties": {
1207
+ "element_index": {
1208
+ "description": "Element index from the last get_window_state. REQUIRES `pid` and `window_id` alongside it — element_index alone (no pid) fails fast, it is not a silent no-op.",
1209
+ "type": "integer"
1210
+ },
1211
+ "element_token": {
1212
+ "description": "Opaque per-snapshot element handle from `structuredContent.elements[].element_token`. Takes precedence over element_index when both are supplied. Returns an explicit \"stale\" error once a newer snapshot supersedes it — re-snapshot in that case.",
1213
+ "type": "string"
1214
+ },
1215
+ "pid": {
1216
+ "type": "integer"
1217
+ },
1218
+ "session": {
1219
+ "description": "Optional session id: declares/uses the agent cursor and per-session state for this run. The same id works over MCP, the CLI, or the raw socket, and follows the run across apps/windows. Omit to run cursor-less.",
1220
+ "type": "string"
1221
+ },
1222
+ "value": {
1223
+ "type": "string"
1224
+ },
1225
+ "window_id": {
1226
+ "description": "Required when element_index is used; optional when element_token is supplied (the token carries it).",
1227
+ "type": "integer"
1228
+ }
1229
+ },
1230
+ "required": [
1231
+ "pid",
1232
+ "value"
1233
+ ],
1234
+ "type": "object"
1235
+ },
1236
+ "annotations": {
1237
+ "destructiveHint": true,
1238
+ "idempotentHint": false,
1239
+ "openWorldHint": true,
1240
+ "readOnlyHint": false
1241
+ },
1242
+ "_meta": {
1243
+ "farming.dev/upstream": "cua-driver",
1244
+ "farming.dev/capabilities": [
1245
+ "input.keyboard.type",
1246
+ "accessibility.element_tokens"
1247
+ ],
1248
+ "farming.dev/risk": {
1249
+ "class": "r1",
1250
+ "enforcement": "metadata_only",
1251
+ "operation_sensitive": false,
1252
+ "version": "1"
1253
+ }
1254
+ }
1255
+ },
1256
+ {
1257
+ "name": "computer_scroll",
1258
+ "upstreamName": "scroll",
1259
+ "description": "Scroll the target pid's focused region via XSendEvent Button4/5. direction required; by defaults to line, amount defaults to 3.",
1260
+ "inputSchema": {
1261
+ "additionalProperties": false,
1262
+ "properties": {
1263
+ "amount": {
1264
+ "maximum": 50,
1265
+ "minimum": 1,
1266
+ "type": "integer"
1267
+ },
1268
+ "by": {
1269
+ "enum": [
1270
+ "line",
1271
+ "page"
1272
+ ],
1273
+ "type": "string"
1274
+ },
1275
+ "cursor_id": {
1276
+ "description": "Optional multi-cursor instance id. Default: 'default'.",
1277
+ "type": "string"
1278
+ },
1279
+ "delivery_mode": {
1280
+ "default": "background",
1281
+ "description": "Input delivery mode. 'background' (default) never activates or raises the target window. On X11 it injects via XTEST / the XInput2 master pointer (no focus steal). On Wayland it goes through libei + xdg-desktop-portal, which injects to the compositor's input focus — Wayland's security model has no per-window background targeting, so a specific non-focused window cannot be aimed at; when no libei backend is available the tool returns a structured background_unavailable error. 'foreground' is the explicit escalation: activate the target (X11 _NET_ACTIVE_WINDOW; Wayland compositor activate), inject, then restore the prior active window — a brief focus swap unless the target was already active. Call bring_to_front first to avoid the flash. Matches the macOS / Windows delivery_mode surface.",
1282
+ "enum": [
1283
+ "background",
1284
+ "foreground"
1285
+ ],
1286
+ "type": "string"
1287
+ },
1288
+ "direction": {
1289
+ "enum": [
1290
+ "up",
1291
+ "down",
1292
+ "left",
1293
+ "right"
1294
+ ],
1295
+ "type": "string"
1296
+ },
1297
+ "element_index": {
1298
+ "description": "Element index from the last get_window_state. REQUIRES `pid` and `window_id` alongside it — element_index alone (no pid) fails fast, it is not a silent no-op.",
1299
+ "type": "integer"
1300
+ },
1301
+ "element_token": {
1302
+ "description": "Opaque per-snapshot element handle from `structuredContent.elements[].element_token`. Takes precedence over element_index when both are supplied. Returns an explicit \"stale\" error once a newer snapshot supersedes it — re-snapshot in that case.",
1303
+ "type": "string"
1304
+ },
1305
+ "pid": {
1306
+ "type": "integer"
1307
+ },
1308
+ "scope": {
1309
+ "default": "window",
1310
+ "enum": [
1311
+ "window",
1312
+ "desktop"
1313
+ ],
1314
+ "type": "string"
1315
+ },
1316
+ "session": {
1317
+ "description": "Optional session id: declares/uses the agent cursor and per-session state for this run. The same id works over MCP, the CLI, or the raw socket, and follows the run across apps/windows. Omit to run cursor-less.",
1318
+ "type": "string"
1319
+ },
1320
+ "window_id": {
1321
+ "type": "integer"
1322
+ },
1323
+ "x": {
1324
+ "description": "Window-local screenshot-pixel X of the scroll target. Pass with y and without element_index.",
1325
+ "type": "number"
1326
+ },
1327
+ "y": {
1328
+ "description": "Window-local screenshot-pixel Y of the scroll target. Pass with x and without element_index.",
1329
+ "type": "number"
1330
+ }
1331
+ },
1332
+ "required": [
1333
+ "direction"
1334
+ ],
1335
+ "type": "object"
1336
+ },
1337
+ "annotations": {
1338
+ "destructiveHint": false,
1339
+ "idempotentHint": false,
1340
+ "openWorldHint": true,
1341
+ "readOnlyHint": false
1342
+ },
1343
+ "_meta": {
1344
+ "farming.dev/upstream": "cua-driver",
1345
+ "farming.dev/capabilities": [
1346
+ "input.pointer.scroll",
1347
+ "accessibility.element_tokens",
1348
+ "input.delivery_mode"
1349
+ ],
1350
+ "farming.dev/risk": {
1351
+ "class": "r1",
1352
+ "enforcement": "metadata_only",
1353
+ "operation_sensitive": false,
1354
+ "version": "1"
1355
+ }
1356
+ }
1357
+ },
1358
+ {
1359
+ "name": "computer_get_screen_size",
1360
+ "upstreamName": "get_screen_size",
1361
+ "description": "Return the logical size of the main display in points plus its backing scale factor. Agents click in points; Retina displays have scale_factor 2.0. Requires no TCC permissions.",
1362
+ "inputSchema": {
1363
+ "additionalProperties": false,
1364
+ "properties": {
1365
+ "session": {
1366
+ "description": "Optional session id: declares/uses the agent cursor and per-session state for this run. The same id works over MCP, the CLI, or the raw socket, and follows the run across apps/windows. Omit to run cursor-less.",
1367
+ "type": "string"
1368
+ }
1369
+ },
1370
+ "type": "object"
1371
+ },
1372
+ "annotations": {
1373
+ "destructiveHint": false,
1374
+ "idempotentHint": true,
1375
+ "openWorldHint": false,
1376
+ "readOnlyHint": true
1377
+ },
1378
+ "_meta": {
1379
+ "farming.dev/upstream": "cua-driver",
1380
+ "farming.dev/capabilities": [
1381
+ "screen.dimensions"
1382
+ ],
1383
+ "farming.dev/risk": {
1384
+ "class": "r0",
1385
+ "enforcement": "metadata_only",
1386
+ "operation_sensitive": false,
1387
+ "version": "1"
1388
+ }
1389
+ }
1390
+ },
1391
+ {
1392
+ "name": "computer_get_desktop_state",
1393
+ "upstreamName": "get_desktop_state",
1394
+ "description": "Full-display vision screenshot in true screen pixels (no downscale), for capture_scope=\"desktop\" GUI loops. Captures the entire display (root window) as native-size PNG so screen-absolute pixel coordinates land exactly. No AT-SPI walk.",
1395
+ "inputSchema": {
1396
+ "additionalProperties": false,
1397
+ "properties": {
1398
+ "screenshot_out_file": {
1399
+ "description": "Write PNG here instead of base64.",
1400
+ "type": "string"
1401
+ },
1402
+ "session": {
1403
+ "description": "Optional session id.",
1404
+ "type": "string"
1405
+ }
1406
+ },
1407
+ "type": "object"
1408
+ },
1409
+ "annotations": {
1410
+ "destructiveHint": false,
1411
+ "idempotentHint": false,
1412
+ "openWorldHint": false,
1413
+ "readOnlyHint": true
1414
+ },
1415
+ "_meta": {
1416
+ "farming.dev/upstream": "cua-driver",
1417
+ "farming.dev/capabilities": [
1418
+ "screen.capture",
1419
+ "screen.dimensions"
1420
+ ],
1421
+ "farming.dev/risk": {
1422
+ "class": "r2",
1423
+ "enforcement": "metadata_only",
1424
+ "operation_sensitive": false,
1425
+ "version": "1"
1426
+ }
1427
+ }
1428
+ },
1429
+ {
1430
+ "name": "computer_get_cursor_position",
1431
+ "upstreamName": "get_cursor_position",
1432
+ "description": "Return the current mouse cursor position in screen points (origin top-left).",
1433
+ "inputSchema": {
1434
+ "additionalProperties": false,
1435
+ "properties": {
1436
+ "session": {
1437
+ "description": "Optional session id: declares/uses the agent cursor and per-session state for this run. The same id works over MCP, the CLI, or the raw socket, and follows the run across apps/windows. Omit to run cursor-less.",
1438
+ "type": "string"
1439
+ }
1440
+ },
1441
+ "type": "object"
1442
+ },
1443
+ "annotations": {
1444
+ "destructiveHint": false,
1445
+ "idempotentHint": true,
1446
+ "openWorldHint": false,
1447
+ "readOnlyHint": true
1448
+ },
1449
+ "_meta": {
1450
+ "farming.dev/upstream": "cua-driver",
1451
+ "farming.dev/capabilities": [
1452
+ "screen.cursor.position"
1453
+ ],
1454
+ "farming.dev/risk": {
1455
+ "class": "r0",
1456
+ "enforcement": "metadata_only",
1457
+ "operation_sensitive": false,
1458
+ "version": "1"
1459
+ }
1460
+ }
1461
+ },
1462
+ {
1463
+ "name": "computer_move_cursor",
1464
+ "upstreamName": "move_cursor",
1465
+ "description": "Move the agent cursor overlay, or with scope=desktop move the real OS pointer in get_desktop_state coordinates.",
1466
+ "inputSchema": {
1467
+ "additionalProperties": false,
1468
+ "properties": {
1469
+ "cursor_id": {
1470
+ "type": "string"
1471
+ },
1472
+ "scope": {
1473
+ "default": "window",
1474
+ "enum": [
1475
+ "window",
1476
+ "desktop"
1477
+ ],
1478
+ "type": "string"
1479
+ },
1480
+ "session": {
1481
+ "description": "Optional session id: declares/uses the agent cursor and per-session state for this run. The same id works over MCP, the CLI, or the raw socket, and follows the run across apps/windows. Omit to run cursor-less.",
1482
+ "type": "string"
1483
+ },
1484
+ "x": {
1485
+ "type": "number"
1486
+ },
1487
+ "y": {
1488
+ "type": "number"
1489
+ }
1490
+ },
1491
+ "required": [
1492
+ "x",
1493
+ "y"
1494
+ ],
1495
+ "type": "object"
1496
+ },
1497
+ "annotations": {
1498
+ "destructiveHint": false,
1499
+ "idempotentHint": true,
1500
+ "openWorldHint": false,
1501
+ "readOnlyHint": false
1502
+ },
1503
+ "_meta": {
1504
+ "farming.dev/upstream": "cua-driver",
1505
+ "farming.dev/capabilities": [
1506
+ "agent_cursor.move",
1507
+ "input.pointer.move"
1508
+ ],
1509
+ "farming.dev/risk": {
1510
+ "class": "r1",
1511
+ "enforcement": "metadata_only",
1512
+ "operation_sensitive": false,
1513
+ "version": "1"
1514
+ }
1515
+ }
1516
+ },
1517
+ {
1518
+ "name": "computer_set_agent_cursor_enabled",
1519
+ "upstreamName": "set_agent_cursor_enabled",
1520
+ "description": "Show or hide the agent cursor overlay.",
1521
+ "inputSchema": {
1522
+ "additionalProperties": false,
1523
+ "properties": {
1524
+ "cursor_id": {
1525
+ "type": "string"
1526
+ },
1527
+ "enabled": {
1528
+ "type": "boolean"
1529
+ },
1530
+ "session": {
1531
+ "type": "string"
1532
+ }
1533
+ },
1534
+ "required": [
1535
+ "enabled"
1536
+ ],
1537
+ "type": "object"
1538
+ },
1539
+ "annotations": {
1540
+ "destructiveHint": false,
1541
+ "idempotentHint": true,
1542
+ "openWorldHint": false,
1543
+ "readOnlyHint": false
1544
+ },
1545
+ "_meta": {
1546
+ "farming.dev/upstream": "cua-driver",
1547
+ "farming.dev/capabilities": [
1548
+ "agent_cursor.set_enabled"
1549
+ ],
1550
+ "farming.dev/risk": {
1551
+ "class": "r1",
1552
+ "enforcement": "metadata_only",
1553
+ "operation_sensitive": false,
1554
+ "version": "1"
1555
+ }
1556
+ }
1557
+ },
1558
+ {
1559
+ "name": "computer_set_agent_cursor_motion",
1560
+ "upstreamName": "set_agent_cursor_motion",
1561
+ "description": "Configure the visual appearance and motion curve of an agent cursor instance.\n\n- cursor_id: instance name (default='default')\n- cursor_icon: built-in ('arrow' | 'teardrop') or a path to a PNG/JPEG/SVG/ICO file; '' reverts to the default cursor\n- cursor_color: hex color e.g. '#00FFFF' or CSS name\n- cursor_label: short text shown near the cursor\n- cursor_size: dot radius in points (default=16)\n- cursor_opacity: 0.0–1.0 (default=0.85)\n\nMotion curve (Bezier):\n- arc_size: perpendicular deflection as fraction of path length [0,1]. Default 0.25\n- spring: settle damping [0.3,1.0]; 1.0=no overshoot. Default 0.72\n- glide_duration_ms: fixed flight duration per move [50,5000]; omit for speed-based\n- dwell_after_click_ms: pause after click ripple [0,5000]. Default 80\n- idle_hide_ms: auto-hide delay [0,60000]; 0=never. Default 20000",
1562
+ "inputSchema": {
1563
+ "additionalProperties": false,
1564
+ "properties": {
1565
+ "arc_flow": {
1566
+ "description": "Asymmetry bias [-1,1]. Default 0.0.",
1567
+ "type": "number"
1568
+ },
1569
+ "arc_size": {
1570
+ "description": "Arc deflection as fraction of path length [0,1]. Default 0.25.",
1571
+ "type": "number"
1572
+ },
1573
+ "cursor_color": {
1574
+ "type": "string"
1575
+ },
1576
+ "cursor_icon": {
1577
+ "type": "string"
1578
+ },
1579
+ "cursor_id": {
1580
+ "type": "string"
1581
+ },
1582
+ "cursor_label": {
1583
+ "type": "string"
1584
+ },
1585
+ "cursor_opacity": {
1586
+ "type": "number"
1587
+ },
1588
+ "cursor_size": {
1589
+ "type": "number"
1590
+ },
1591
+ "dwell_after_click_ms": {
1592
+ "maximum": 5000,
1593
+ "minimum": 0,
1594
+ "type": "number"
1595
+ },
1596
+ "end_handle": {
1597
+ "description": "End-handle fraction [0,1]. Default 0.3.",
1598
+ "type": "number"
1599
+ },
1600
+ "glide_duration_ms": {
1601
+ "maximum": 5000,
1602
+ "minimum": 50,
1603
+ "type": "number"
1604
+ },
1605
+ "idle_hide_ms": {
1606
+ "maximum": 60000,
1607
+ "minimum": 0,
1608
+ "type": "number"
1609
+ },
1610
+ "session": {
1611
+ "type": "string"
1612
+ },
1613
+ "spring": {
1614
+ "description": "Settle damping [0.3,1.0]. Default 0.72.",
1615
+ "type": "number"
1616
+ },
1617
+ "start_handle": {
1618
+ "description": "Start-handle fraction [0,1]. Default 0.3.",
1619
+ "type": "number"
1620
+ },
1621
+ "turn_radius": {
1622
+ "maximum": 1000,
1623
+ "minimum": 1,
1624
+ "type": "number"
1625
+ }
1626
+ },
1627
+ "type": "object"
1628
+ },
1629
+ "annotations": {
1630
+ "destructiveHint": false,
1631
+ "idempotentHint": true,
1632
+ "openWorldHint": false,
1633
+ "readOnlyHint": false
1634
+ },
1635
+ "_meta": {
1636
+ "farming.dev/upstream": "cua-driver",
1637
+ "farming.dev/capabilities": [
1638
+ "agent_cursor.set_motion"
1639
+ ],
1640
+ "farming.dev/risk": {
1641
+ "class": "r1",
1642
+ "enforcement": "metadata_only",
1643
+ "operation_sensitive": false,
1644
+ "version": "1"
1645
+ }
1646
+ }
1647
+ },
1648
+ {
1649
+ "name": "computer_get_agent_cursor_state",
1650
+ "upstreamName": "get_agent_cursor_state",
1651
+ "description": "Return the current state of all agent cursor instances.",
1652
+ "inputSchema": {
1653
+ "additionalProperties": false,
1654
+ "properties": {
1655
+ "cursor_id": {
1656
+ "type": "string"
1657
+ },
1658
+ "session": {
1659
+ "type": "string"
1660
+ }
1661
+ },
1662
+ "type": "object"
1663
+ },
1664
+ "annotations": {
1665
+ "destructiveHint": false,
1666
+ "idempotentHint": true,
1667
+ "openWorldHint": false,
1668
+ "readOnlyHint": true
1669
+ },
1670
+ "_meta": {
1671
+ "farming.dev/upstream": "cua-driver",
1672
+ "farming.dev/capabilities": [
1673
+ "agent_cursor.state"
1674
+ ],
1675
+ "farming.dev/risk": {
1676
+ "class": "r0",
1677
+ "enforcement": "metadata_only",
1678
+ "operation_sensitive": false,
1679
+ "version": "1"
1680
+ }
1681
+ }
1682
+ },
1683
+ {
1684
+ "name": "computer_set_agent_cursor_style",
1685
+ "upstreamName": "set_agent_cursor_style",
1686
+ "description": "Update the visual style of the agent cursor overlay.\n\n- gradient_colors: array of CSS hex strings (e.g. [\"#FF0000\",\"#0000FF\"]) used as the arrow fill gradient from tip to tail. Empty array reverts to the default palette colours.\n- bloom_color: hex string for the radial halo/bloom behind the cursor (e.g. \"#00FFFF\"). Empty string reverts to the default.\n- image_path: path to a PNG, JPEG, SVG, or ICO file to use as the cursor icon instead of the default silhouette. Empty string reverts to the default cursor.\nAll parameters are optional; omit any you do not want to change.",
1687
+ "inputSchema": {
1688
+ "additionalProperties": false,
1689
+ "properties": {
1690
+ "bloom_color": {
1691
+ "description": "Hex bloom/halo colour (e.g. '#00FFFF'). '' = revert to default.",
1692
+ "type": "string"
1693
+ },
1694
+ "cursor_id": {
1695
+ "description": "Cursor instance. Default: 'default'.",
1696
+ "type": "string"
1697
+ },
1698
+ "gradient_colors": {
1699
+ "description": "CSS hex gradient stops tip→tail. [] = revert to default.",
1700
+ "items": {
1701
+ "type": "string"
1702
+ },
1703
+ "type": "array"
1704
+ },
1705
+ "image_path": {
1706
+ "description": "Path to PNG/JPEG/SVG/ICO cursor image. '' = revert to the default cursor.",
1707
+ "type": "string"
1708
+ },
1709
+ "session": {
1710
+ "description": "Optional multi-cursor session id; takes precedence over cursor_id.",
1711
+ "type": "string"
1712
+ }
1713
+ },
1714
+ "type": "object"
1715
+ },
1716
+ "annotations": {
1717
+ "destructiveHint": false,
1718
+ "idempotentHint": true,
1719
+ "openWorldHint": false,
1720
+ "readOnlyHint": false
1721
+ },
1722
+ "_meta": {
1723
+ "farming.dev/upstream": "cua-driver",
1724
+ "farming.dev/capabilities": [
1725
+ "agent_cursor.set_style"
1726
+ ],
1727
+ "farming.dev/risk": {
1728
+ "class": "r1",
1729
+ "enforcement": "metadata_only",
1730
+ "operation_sensitive": false,
1731
+ "version": "1"
1732
+ }
1733
+ }
1734
+ },
1735
+ {
1736
+ "name": "computer_check_permissions",
1737
+ "upstreamName": "check_permissions",
1738
+ "description": "Check required permissions for cua-driver-rs on Linux.",
1739
+ "inputSchema": {
1740
+ "additionalProperties": false,
1741
+ "properties": {},
1742
+ "type": "object"
1743
+ },
1744
+ "annotations": {
1745
+ "destructiveHint": false,
1746
+ "idempotentHint": true,
1747
+ "openWorldHint": false,
1748
+ "readOnlyHint": true
1749
+ },
1750
+ "_meta": {
1751
+ "farming.dev/upstream": "cua-driver",
1752
+ "farming.dev/capabilities": [
1753
+ "system.permissions.tcc",
1754
+ "system.permissions.tcc.accessibility",
1755
+ "system.permissions.tcc.screen_recording"
1756
+ ],
1757
+ "farming.dev/risk": {
1758
+ "class": "r0",
1759
+ "enforcement": "metadata_only",
1760
+ "operation_sensitive": false,
1761
+ "version": "1"
1762
+ }
1763
+ }
1764
+ },
1765
+ {
1766
+ "name": "computer_health_report",
1767
+ "upstreamName": "health_report",
1768
+ "description": "Single-call end-to-end driver diagnostics. Designed to let downstream consumers ship one stable call instead of stitching together check_permissions, doctor, version, bundle attribution, and platform capability status. On macOS, prompt-capable direct capture is deliberately skipped; use `cua-driver permissions grant` to verify it explicitly. cua-driver owns the health model; consumers stay thin.\n\nInput — all optional:\n {\n \"include\": [\"<check_name>\", ...], // run only these\n \"skip\": [\"<check_name>\", ...] // skip these\n }\nIf both are given, `include` wins.\n\nCanonical check names:\n macOS : binary_version, platform_supported, session_active,\n bundle_identity, tcc_accessibility, tcc_screen_recording,\n ax_capability, screen_capture_capability\n Windows: binary_version, platform_supported, session_active,\n ax_capability (via UIA), screen_capture_capability (via DXGI)\n Linux : binary_version, platform_supported, session_active,\n ax_capability (via AT-SPI), screen_capture_capability (via X11)\n\nOutput — stable contract, schema_version=\"1\":\n {\n \"schema_version\": \"1\",\n \"platform\": \"darwin\" | \"win32\" | \"linux\",\n \"driver_version\": \"<semver>\",\n \"overall\": \"ok\" | \"degraded\" | \"failed\",\n \"checks\": [\n {\n \"name\": \"<one of the canonical names above>\",\n \"status\": \"pass\" | \"fail\" | \"skip\",\n \"message\": \"<one-line summary, always present>\",\n \"hint\": \"<remediation step, present when status=fail>\",\n \"data\": { /* check-specific structured fields */ }\n },\n ...\n ]\n }\n\n`overall` rules:\n - `ok` — every non-skipped check passes\n - `degraded` — at least one non-core check fails (binary is still usable)\n - `failed` — any core check fails (binary_version, platform_supported, session_active)\n\nStability: schema_version=\"1\" is the contract. Future breaking changes will be `\"2\"`. Adding new check names under the same schema_version is non-breaking; consumers must tolerate unknown check names.",
1769
+ "inputSchema": {
1770
+ "additionalProperties": false,
1771
+ "properties": {
1772
+ "include": {
1773
+ "description": "Only run these checks (canonical names). Wins over `skip`.",
1774
+ "items": {
1775
+ "type": "string"
1776
+ },
1777
+ "type": "array"
1778
+ },
1779
+ "skip": {
1780
+ "description": "Skip these checks (canonical names). Ignored when `include` is set.",
1781
+ "items": {
1782
+ "type": "string"
1783
+ },
1784
+ "type": "array"
1785
+ }
1786
+ },
1787
+ "type": "object"
1788
+ },
1789
+ "annotations": {
1790
+ "destructiveHint": false,
1791
+ "idempotentHint": true,
1792
+ "openWorldHint": false,
1793
+ "readOnlyHint": true
1794
+ },
1795
+ "_meta": {
1796
+ "farming.dev/upstream": "cua-driver",
1797
+ "farming.dev/capabilities": [],
1798
+ "farming.dev/risk": {
1799
+ "class": "r0",
1800
+ "enforcement": "metadata_only",
1801
+ "operation_sensitive": false,
1802
+ "version": "1"
1803
+ }
1804
+ }
1805
+ },
1806
+ {
1807
+ "name": "computer_get_config",
1808
+ "upstreamName": "get_config",
1809
+ "description": "Return current cua-driver-rs configuration.",
1810
+ "inputSchema": {
1811
+ "additionalProperties": false,
1812
+ "properties": {},
1813
+ "type": "object"
1814
+ },
1815
+ "annotations": {
1816
+ "destructiveHint": false,
1817
+ "idempotentHint": true,
1818
+ "openWorldHint": false,
1819
+ "readOnlyHint": true
1820
+ },
1821
+ "_meta": {
1822
+ "farming.dev/upstream": "cua-driver",
1823
+ "farming.dev/capabilities": [
1824
+ "system.config.read"
1825
+ ],
1826
+ "farming.dev/risk": {
1827
+ "class": "r0",
1828
+ "enforcement": "metadata_only",
1829
+ "operation_sensitive": false,
1830
+ "version": "1"
1831
+ }
1832
+ }
1833
+ },
1834
+ {
1835
+ "name": "computer_set_config",
1836
+ "upstreamName": "set_config",
1837
+ "description": "Update cua-driver-rs configuration. capture_mode / max_image_dimension take effect immediately.\n\nTwo input shapes (both accepted, matching Windows/Swift):\n- **{key, value}** (preferred): `{\"key\": \"max_image_dimension\", \"value\": 800}` — single leaf write.\n- **Legacy per-field**: `{\"capture_mode\": \"som\", \"max_image_dimension\": 0}`.\n\nThe experimental_pip keys persist to ~/.cua-driver/config.json and apply on next daemon restart (the PiP backend is initialised once at startup; Linux ships only the trait stub today — see issue #1729).",
1838
+ "inputSchema": {
1839
+ "additionalProperties": false,
1840
+ "properties": {
1841
+ "capture_mode": {
1842
+ "description": "Legacy per-field shape. Default capture mode for get_window_state. (\"som\"/\"screenshot\" still decode as deprecated aliases.)",
1843
+ "enum": [
1844
+ "ax",
1845
+ "vision"
1846
+ ],
1847
+ "type": "string"
1848
+ },
1849
+ "experimental_pip": {
1850
+ "description": "Enable the experimental PiP preview window (applies next restart; Linux backend stubbed).",
1851
+ "type": "boolean"
1852
+ },
1853
+ "experimental_pip_geometry": {
1854
+ "description": "PiP window size + optional position in `WxH` or `WxH+X+Y` form.",
1855
+ "type": "string"
1856
+ },
1857
+ "key": {
1858
+ "description": "Name of a single config field to write ({key, value} shape). Pair with `value`.",
1859
+ "type": "string"
1860
+ },
1861
+ "max_image_dimension": {
1862
+ "description": "Legacy per-field shape. Max dimension for screenshot resizing (0 = no limit).",
1863
+ "type": "integer"
1864
+ },
1865
+ "value": {
1866
+ "description": "New value for `key`. JSON type depends on the key."
1867
+ }
1868
+ },
1869
+ "type": "object"
1870
+ },
1871
+ "annotations": {
1872
+ "destructiveHint": false,
1873
+ "idempotentHint": true,
1874
+ "openWorldHint": false,
1875
+ "readOnlyHint": false
1876
+ },
1877
+ "_meta": {
1878
+ "farming.dev/upstream": "cua-driver",
1879
+ "farming.dev/capabilities": [
1880
+ "system.config.write"
1881
+ ],
1882
+ "farming.dev/risk": {
1883
+ "class": "r2",
1884
+ "enforcement": "metadata_only",
1885
+ "operation_sensitive": false,
1886
+ "version": "1"
1887
+ }
1888
+ }
1889
+ },
1890
+ {
1891
+ "name": "computer_get_accessibility_tree",
1892
+ "upstreamName": "get_accessibility_tree",
1893
+ "description": "Return a lightweight snapshot of the desktop: running processes and on-screen visible X11 windows with their bounds and owner pid.\n\nFor the full AT-SPI subtree of a single window (with interactive element indices you can click by), use get_window_state instead — this is a fast discovery read.",
1894
+ "inputSchema": {
1895
+ "additionalProperties": false,
1896
+ "properties": {},
1897
+ "type": "object"
1898
+ },
1899
+ "annotations": {
1900
+ "destructiveHint": false,
1901
+ "idempotentHint": true,
1902
+ "openWorldHint": false,
1903
+ "readOnlyHint": true
1904
+ },
1905
+ "_meta": {
1906
+ "farming.dev/upstream": "cua-driver",
1907
+ "farming.dev/capabilities": [
1908
+ "accessibility.tree",
1909
+ "accessibility.tree.structured"
1910
+ ],
1911
+ "farming.dev/risk": {
1912
+ "class": "r2",
1913
+ "enforcement": "metadata_only",
1914
+ "operation_sensitive": false,
1915
+ "version": "1"
1916
+ }
1917
+ }
1918
+ },
1919
+ {
1920
+ "name": "computer_zoom",
1921
+ "upstreamName": "zoom",
1922
+ "description": "Capture a cropped JPEG of a window region (x1,y1)–(x2,y2) in screenshot pixels, with 20% padding. Output is at most 500 px wide.\n\nAfter a zoom, pass from_zoom=true to click/type_text to auto-translate coordinates back to full-window space.",
1923
+ "inputSchema": {
1924
+ "additionalProperties": false,
1925
+ "properties": {
1926
+ "pid": {
1927
+ "description": "Target pid — required for from_zoom click/type translation.",
1928
+ "type": "integer"
1929
+ },
1930
+ "window_id": {
1931
+ "type": "integer"
1932
+ },
1933
+ "x1": {
1934
+ "type": "number"
1935
+ },
1936
+ "x2": {
1937
+ "type": "number"
1938
+ },
1939
+ "y1": {
1940
+ "type": "number"
1941
+ },
1942
+ "y2": {
1943
+ "type": "number"
1944
+ }
1945
+ },
1946
+ "required": [
1947
+ "window_id",
1948
+ "x1",
1949
+ "y1",
1950
+ "x2",
1951
+ "y2"
1952
+ ],
1953
+ "type": "object"
1954
+ },
1955
+ "annotations": {
1956
+ "destructiveHint": false,
1957
+ "idempotentHint": true,
1958
+ "openWorldHint": false,
1959
+ "readOnlyHint": true
1960
+ },
1961
+ "_meta": {
1962
+ "farming.dev/upstream": "cua-driver",
1963
+ "farming.dev/capabilities": [
1964
+ "screen.capture",
1965
+ "screen.capture.window",
1966
+ "screen.capture.region"
1967
+ ],
1968
+ "farming.dev/risk": {
1969
+ "class": "r2",
1970
+ "enforcement": "metadata_only",
1971
+ "operation_sensitive": false,
1972
+ "version": "1"
1973
+ }
1974
+ }
1975
+ },
1976
+ {
1977
+ "name": "computer_page",
1978
+ "upstreamName": "page",
1979
+ "description": "Legacy browser compatibility tool. Prefer get_browser_state and the typed browser_* tools for exact targeting, endpoint ownership, and consent. Read-only get_text and query_dom remain available by default. Mutating actions require the daemon operator to set CUA_DRIVER_ENABLE_LEGACY_PAGE_MUTATIONS=1 before daemon startup (restart the daemon after changing it); this escape hatch does not provide the typed browser surface's exact binding or existing-profile grant guarantees. Supports Chrome, Brave, Edge, Safari (via AppleScript on macOS), Electron apps (via CDP), Chromium/Firefox on Windows (via UIA for read; CDP for execute_javascript when --remote-debugging-port is set), and WKWebView/Tauri/AT-SPI fallbacks.\n\nActions:\n- execute_javascript: Run JS and return the result.\n- get_text: Extract visible text from the page.\n- query_dom: Find elements matching a CSS selector.\n- click_element: Click a CSS-selected element AND animate the agent cursor to its on-screen center first (so the user sees what the agent is doing). Prefer over `execute_javascript('el.click()')` whenever you want visible cursor feedback.\n- insert_text: Insert `text` at whatever currently holds DOM focus in one native operation (CDP Input.insertText) — no synthesized key events, but more durable than a one-shot execute_javascript write since rich-text editors already have to treat it like an IME commit. Try this before type_keystrokes on a contenteditable that discarded an execute_javascript write. Click/focus the target field first.\n- type_keystrokes: Type `text` via real per-character keystroke events into whatever currently holds DOM focus. Slower than insert_text but the most durable rung — use it when insert_text also gets discarded, or the editor's own keydown/keyup handlers need to see real keys. Click/focus the target field first.\n- enable_javascript_apple_events: macOS-only — patch the browser's Preferences to allow JS from Apple Events (Chrome/Brave/Edge, requires user confirmation and a browser restart).",
1980
+ "inputSchema": {
1981
+ "additionalProperties": false,
1982
+ "properties": {
1983
+ "action": {
1984
+ "description": "Action to perform.",
1985
+ "enum": [
1986
+ "execute_javascript",
1987
+ "get_text",
1988
+ "query_dom",
1989
+ "click_element",
1990
+ "insert_text",
1991
+ "type_keystrokes",
1992
+ "enable_javascript_apple_events"
1993
+ ],
1994
+ "type": "string"
1995
+ },
1996
+ "attributes": {
1997
+ "description": "Element attributes to include in query_dom results.",
1998
+ "items": {
1999
+ "type": "string"
2000
+ },
2001
+ "type": "array"
2002
+ },
2003
+ "bundle_id": {
2004
+ "description": "Bundle ID of the browser. Required for enable_javascript_apple_events (macOS only).",
2005
+ "type": "string"
2006
+ },
2007
+ "cdp_port": {
2008
+ "description": "Optional, for execute_javascript/insert_text/type_keystrokes: use this exact CDP port instead of auto-discovering one from pid. Needed when the port was opened via the browser's own remote-debugging toggle rather than a launch-time flag, since that path may not answer the auto-discovery probe.",
2009
+ "maximum": 65535,
2010
+ "minimum": 1,
2011
+ "type": "integer"
2012
+ },
2013
+ "css_selector": {
2014
+ "description": "CSS selector for query_dom (e.g. 'a', 'button', 'input', 'h1'-'h6', 'p', 'img', 'select', '*').",
2015
+ "type": "string"
2016
+ },
2017
+ "javascript": {
2018
+ "description": "JavaScript to execute. Required for execute_javascript.",
2019
+ "type": "string"
2020
+ },
2021
+ "pid": {
2022
+ "description": "Target process ID.",
2023
+ "type": "integer"
2024
+ },
2025
+ "selector": {
2026
+ "description": "CSS selector for click_element (e.g. 'button.submit', '#login a').",
2027
+ "type": "string"
2028
+ },
2029
+ "target_url_contains": {
2030
+ "description": "Optional, for execute_javascript/insert_text/type_keystrokes: require exactly one browser tab whose URL contains this substring. Use this on a multi-tab browser — there's no built-in link between window_id and which tab a CDP call reaches.",
2031
+ "type": "string"
2032
+ },
2033
+ "text": {
2034
+ "description": "Text to insert or type. Required for insert_text and type_keystrokes. The target field must already have DOM focus (click/focus it first).",
2035
+ "type": "string"
2036
+ },
2037
+ "user_has_confirmed_enabling": {
2038
+ "description": "Must be true to proceed with enable_javascript_apple_events. This will quit and relaunch the browser.",
2039
+ "type": "boolean"
2040
+ },
2041
+ "window_id": {
2042
+ "description": "Target window ID from list_windows.",
2043
+ "type": "integer"
2044
+ }
2045
+ },
2046
+ "required": [
2047
+ "action"
2048
+ ],
2049
+ "type": "object"
2050
+ },
2051
+ "annotations": {
2052
+ "destructiveHint": false,
2053
+ "idempotentHint": false,
2054
+ "openWorldHint": true,
2055
+ "readOnlyHint": false
2056
+ },
2057
+ "_meta": {
2058
+ "farming.dev/upstream": "cua-driver",
2059
+ "farming.dev/capabilities": [
2060
+ "page.action"
2061
+ ],
2062
+ "farming.dev/risk": {
2063
+ "class": "r3",
2064
+ "enforcement": "metadata_only",
2065
+ "operation_sensitive": true,
2066
+ "version": "1"
2067
+ }
2068
+ }
2069
+ },
2070
+ {
2071
+ "name": "computer_get_browser_state",
2072
+ "upstreamName": "get_browser_state",
2073
+ "description": "Read-only browser inspection. Mode 1 (bind): pass pid + window_id of a native browser window to classify it, correlate it to a CDP target (exact-or-refuse), and mint a session-scoped target id plus tab ids. Mode 2 (snapshot): pass target_id + tab_id. The dom_refs_v1 compatibility format returns composed DOM refs. semantic_v2 joins accessibility, DOM, layout, and viewport state; ranks visible content before retained/offscreen state; and returns a semantic outline, typed action refs, content refs, scoped reads, and opaque continuation. Never performs setup — a missing endpoint is a structured browser_requires_setup refusal pointing at browser_prepare.",
2074
+ "inputSchema": {
2075
+ "additionalProperties": true,
2076
+ "properties": {
2077
+ "continuation": {
2078
+ "description": "Opaque continuation minted by an earlier semantic_v2 response.",
2079
+ "type": "string"
2080
+ },
2081
+ "include_screenshot": {
2082
+ "default": false,
2083
+ "description": "Capture the exact tab viewport as PNG through CDP without selecting the tab or foregrounding its native window. The request refuses if capture cannot be completed.",
2084
+ "type": "boolean"
2085
+ },
2086
+ "pid": {
2087
+ "description": "Native browser process id (bind mode).",
2088
+ "type": "integer"
2089
+ },
2090
+ "query": {
2091
+ "description": "Read-only semantic match over role, accessible name, and visible text.",
2092
+ "type": "string"
2093
+ },
2094
+ "scope_ref": {
2095
+ "description": "Current semantic/content ref whose subtree should be observed.",
2096
+ "type": "string"
2097
+ },
2098
+ "session": {
2099
+ "description": "Stable caller-declared session id. Browser targets, tabs, and refs are scoped to this session.",
2100
+ "type": "string"
2101
+ },
2102
+ "snapshot_format": {
2103
+ "description": "Versioned snapshot contract. dom_refs_v1 remains the compatibility default.",
2104
+ "enum": [
2105
+ "dom_refs_v1",
2106
+ "semantic_v2"
2107
+ ],
2108
+ "type": "string"
2109
+ },
2110
+ "tab_id": {
2111
+ "description": "Opaque tab id from get_browser_state (session-scoped).",
2112
+ "type": "string"
2113
+ },
2114
+ "target_id": {
2115
+ "description": "Opaque browser target id minted by get_browser_state (session-scoped; never a CDP id).",
2116
+ "type": "string"
2117
+ },
2118
+ "window_id": {
2119
+ "description": "Native window id owned by pid (bind mode).",
2120
+ "type": "integer"
2121
+ }
2122
+ },
2123
+ "type": "object"
2124
+ },
2125
+ "annotations": {
2126
+ "destructiveHint": false,
2127
+ "idempotentHint": true,
2128
+ "openWorldHint": false,
2129
+ "readOnlyHint": true
2130
+ },
2131
+ "_meta": {
2132
+ "farming.dev/upstream": "cua-driver",
2133
+ "farming.dev/capabilities": [
2134
+ "browser.state"
2135
+ ],
2136
+ "farming.dev/risk": {
2137
+ "class": "r2",
2138
+ "enforcement": "metadata_only",
2139
+ "operation_sensitive": false,
2140
+ "version": "1"
2141
+ }
2142
+ }
2143
+ },
2144
+ {
2145
+ "name": "computer_browser_prepare",
2146
+ "upstreamName": "browser_prepare",
2147
+ "description": "Explicitly prepare an owned DevTools endpoint for a browser pid. Existing endpoints are detected without side effects. Acting setup for an isolated profile requires host approval or a short-lived setup token plus allow_launch=true. It launches a separate browser and never copies, modifies, or terminates the requested user profile. Existing-profile attachment is explicit and follows the daemon's immutable permission mode: standard requires a certified protected-consent provider, bounded requires a launch-approved exact resource manifest plus protected indicator, and unrestricted requires explicit trusted startup risk acceptance. Ordinary MCP transport approval never proves profile consent. On proven platforms, an authorized request also permits one bounded exact-window setup: open the recognized browser product's fixed remote-debugging page, toggle its uniquely matched per-instance checkbox, prove the PID-owned loopback endpoint, and close the temporary tab. Every visible effect is reported; ambiguity is refused.",
2148
+ "inputSchema": {
2149
+ "additionalProperties": true,
2150
+ "properties": {
2151
+ "allow_launch": {
2152
+ "description": "Allow a separate driver-owned isolated Chromium process to be launched (default false).",
2153
+ "type": "boolean"
2154
+ },
2155
+ "approval_token": {
2156
+ "description": "Legacy single-use setup token. Existing-profile use is disabled unless a trusted launcher explicitly enables the same-user-writable compatibility path.",
2157
+ "type": "string"
2158
+ },
2159
+ "pid": {
2160
+ "description": "Browser process id to prepare.",
2161
+ "type": "integer"
2162
+ },
2163
+ "profile": {
2164
+ "additionalProperties": false,
2165
+ "properties": {
2166
+ "mode": {
2167
+ "enum": [
2168
+ "isolated_new",
2169
+ "isolated_named"
2170
+ ],
2171
+ "type": "string"
2172
+ },
2173
+ "name": {
2174
+ "description": "Required only for isolated_named; 1-64 path-safe ASCII characters.",
2175
+ "type": "string"
2176
+ }
2177
+ },
2178
+ "required": [
2179
+ "mode"
2180
+ ],
2181
+ "type": "object"
2182
+ },
2183
+ "session": {
2184
+ "description": "Stable caller-declared session id. Browser targets, tabs, and refs are scoped to this session.",
2185
+ "type": "string"
2186
+ },
2187
+ "strategy": {
2188
+ "additionalProperties": false,
2189
+ "properties": {
2190
+ "kind": {
2191
+ "enum": [
2192
+ "existing_profile"
2193
+ ],
2194
+ "type": "string"
2195
+ }
2196
+ },
2197
+ "required": [
2198
+ "kind"
2199
+ ],
2200
+ "type": "object"
2201
+ },
2202
+ "window_id": {
2203
+ "description": "Exact native window approval anchor; required for strategy.kind=existing_profile.",
2204
+ "type": "integer"
2205
+ }
2206
+ },
2207
+ "required": [
2208
+ "pid"
2209
+ ],
2210
+ "type": "object"
2211
+ },
2212
+ "annotations": {
2213
+ "destructiveHint": true,
2214
+ "idempotentHint": false,
2215
+ "openWorldHint": true,
2216
+ "readOnlyHint": false
2217
+ },
2218
+ "_meta": {
2219
+ "farming.dev/upstream": "cua-driver",
2220
+ "farming.dev/capabilities": [
2221
+ "browser.prepare"
2222
+ ],
2223
+ "farming.dev/risk": {
2224
+ "class": "r2",
2225
+ "enforcement": "metadata_only",
2226
+ "operation_sensitive": true,
2227
+ "version": "1"
2228
+ }
2229
+ }
2230
+ },
2231
+ {
2232
+ "name": "computer_browser_navigate",
2233
+ "upstreamName": "browser_navigate",
2234
+ "description": "Navigate one tab of an exactly-bound browser target to a new URL (http/https/about only). Refused for heuristic bindings. Navigation invalidates all p<snapshot>:<index> refs for the tab.",
2235
+ "inputSchema": {
2236
+ "additionalProperties": true,
2237
+ "properties": {
2238
+ "session": {
2239
+ "description": "Stable caller-declared session id. Browser targets, tabs, and refs are scoped to this session.",
2240
+ "type": "string"
2241
+ },
2242
+ "tab_id": {
2243
+ "description": "Opaque tab id from get_browser_state (session-scoped).",
2244
+ "type": "string"
2245
+ },
2246
+ "target_id": {
2247
+ "description": "Opaque browser target id minted by get_browser_state (session-scoped; never a CDP id).",
2248
+ "type": "string"
2249
+ },
2250
+ "url": {
2251
+ "description": "Destination URL (http:, https:, or about:).",
2252
+ "type": "string"
2253
+ }
2254
+ },
2255
+ "required": [
2256
+ "target_id",
2257
+ "tab_id",
2258
+ "url"
2259
+ ],
2260
+ "type": "object"
2261
+ },
2262
+ "annotations": {
2263
+ "destructiveHint": false,
2264
+ "idempotentHint": false,
2265
+ "openWorldHint": true,
2266
+ "readOnlyHint": false
2267
+ },
2268
+ "_meta": {
2269
+ "farming.dev/upstream": "cua-driver",
2270
+ "farming.dev/capabilities": [
2271
+ "browser.navigate"
2272
+ ],
2273
+ "farming.dev/risk": {
2274
+ "class": "r2",
2275
+ "enforcement": "metadata_only",
2276
+ "operation_sensitive": false,
2277
+ "version": "1"
2278
+ }
2279
+ }
2280
+ },
2281
+ {
2282
+ "name": "computer_browser_click",
2283
+ "upstreamName": "browser_click",
2284
+ "description": "Click a page element (by ref) or viewport coordinates in an exactly-bound tab. Default route is trusted hardware-like input (Input.dispatchMouseEvent), and refuses where that route cannot preserve standalone-browser background posture. input_route=\"dom_event\" (synthetic el.click(), ref required) is used only when explicitly requested. Refused for heuristic bindings.",
2285
+ "inputSchema": {
2286
+ "additionalProperties": true,
2287
+ "properties": {
2288
+ "input_route": {
2289
+ "description": "\"trusted\" (default): Input.dispatchMouseEvent. It refuses rather than foregrounding a standalone browser. \"dom_event\": synthetic full-background DOM click, only when explicitly requested.",
2290
+ "enum": [
2291
+ "trusted",
2292
+ "dom_event"
2293
+ ],
2294
+ "type": "string"
2295
+ },
2296
+ "ref": {
2297
+ "description": "Page element ref in the p<snapshot>:<index> namespace from get_browser_state. Refs are invalidated by navigation and by newer snapshots of the same tab.",
2298
+ "type": "string"
2299
+ },
2300
+ "session": {
2301
+ "description": "Stable caller-declared session id. Browser targets, tabs, and refs are scoped to this session.",
2302
+ "type": "string"
2303
+ },
2304
+ "tab_id": {
2305
+ "description": "Opaque tab id from get_browser_state (session-scoped).",
2306
+ "type": "string"
2307
+ },
2308
+ "target_id": {
2309
+ "description": "Opaque browser target id minted by get_browser_state (session-scoped; never a CDP id).",
2310
+ "type": "string"
2311
+ },
2312
+ "x": {
2313
+ "description": "Viewport x (CSS px) — alternative to ref.",
2314
+ "type": "number"
2315
+ },
2316
+ "y": {
2317
+ "description": "Viewport y (CSS px) — alternative to ref.",
2318
+ "type": "number"
2319
+ }
2320
+ },
2321
+ "required": [
2322
+ "target_id",
2323
+ "tab_id"
2324
+ ],
2325
+ "type": "object"
2326
+ },
2327
+ "annotations": {
2328
+ "destructiveHint": false,
2329
+ "idempotentHint": false,
2330
+ "openWorldHint": true,
2331
+ "readOnlyHint": false
2332
+ },
2333
+ "_meta": {
2334
+ "farming.dev/upstream": "cua-driver",
2335
+ "farming.dev/capabilities": [
2336
+ "browser.input.click"
2337
+ ],
2338
+ "farming.dev/risk": {
2339
+ "class": "r2",
2340
+ "enforcement": "metadata_only",
2341
+ "operation_sensitive": false,
2342
+ "version": "1"
2343
+ }
2344
+ }
2345
+ },
2346
+ {
2347
+ "name": "computer_browser_type",
2348
+ "upstreamName": "browser_type",
2349
+ "description": "Type text into an exactly-bound tab via the Input domain. mode=\"insert_text\" (default) uses Input.insertText; mode=\"keystrokes\" dispatches per-character key events. Pass a ref to an editable element from the latest snapshot. A ref is required; heuristic bindings are refused.",
2350
+ "inputSchema": {
2351
+ "additionalProperties": true,
2352
+ "properties": {
2353
+ "mode": {
2354
+ "description": "insert_text (default): bulk Input.insertText. keystrokes: per-character Input.dispatchKeyEvent.",
2355
+ "enum": [
2356
+ "insert_text",
2357
+ "keystrokes"
2358
+ ],
2359
+ "type": "string"
2360
+ },
2361
+ "ref": {
2362
+ "description": "Page element ref in the p<snapshot>:<index> namespace from get_browser_state. Refs are invalidated by navigation and by newer snapshots of the same tab.",
2363
+ "type": "string"
2364
+ },
2365
+ "session": {
2366
+ "description": "Stable caller-declared session id. Browser targets, tabs, and refs are scoped to this session.",
2367
+ "type": "string"
2368
+ },
2369
+ "tab_id": {
2370
+ "description": "Opaque tab id from get_browser_state (session-scoped).",
2371
+ "type": "string"
2372
+ },
2373
+ "target_id": {
2374
+ "description": "Opaque browser target id minted by get_browser_state (session-scoped; never a CDP id).",
2375
+ "type": "string"
2376
+ },
2377
+ "text": {
2378
+ "description": "Text to type.",
2379
+ "type": "string"
2380
+ }
2381
+ },
2382
+ "required": [
2383
+ "target_id",
2384
+ "tab_id",
2385
+ "ref",
2386
+ "text"
2387
+ ],
2388
+ "type": "object"
2389
+ },
2390
+ "annotations": {
2391
+ "destructiveHint": false,
2392
+ "idempotentHint": false,
2393
+ "openWorldHint": true,
2394
+ "readOnlyHint": false
2395
+ },
2396
+ "_meta": {
2397
+ "farming.dev/upstream": "cua-driver",
2398
+ "farming.dev/capabilities": [
2399
+ "browser.input.type"
2400
+ ],
2401
+ "farming.dev/risk": {
2402
+ "class": "r2",
2403
+ "enforcement": "metadata_only",
2404
+ "operation_sensitive": false,
2405
+ "version": "1"
2406
+ }
2407
+ }
2408
+ },
2409
+ {
2410
+ "name": "computer_browser_dialog",
2411
+ "upstreamName": "browser_dialog",
2412
+ "description": "Inspect or resolve a page-owned JavaScript alert, confirm, prompt, or beforeunload dialog on one exactly-bound tab. This never handles browser permission UI, extension UI, native dialogs, or file pickers. Inspect returns an opaque dialog_id; accept/dismiss require that exact current id. Resolution defaults to background delivery; Linux callers must explicitly request foreground delivery because Chromium's native modal cannot be resolved there without changing foreground posture.",
2413
+ "inputSchema": {
2414
+ "additionalProperties": true,
2415
+ "properties": {
2416
+ "action": {
2417
+ "enum": [
2418
+ "inspect",
2419
+ "accept",
2420
+ "dismiss"
2421
+ ],
2422
+ "type": "string"
2423
+ },
2424
+ "delivery_mode": {
2425
+ "default": "background",
2426
+ "description": "Requested foreground posture for accept/dismiss. Linux Chromium requires foreground; inspect is read-only.",
2427
+ "enum": [
2428
+ "background",
2429
+ "foreground"
2430
+ ],
2431
+ "type": "string"
2432
+ },
2433
+ "dialog_id": {
2434
+ "description": "Opaque current dialog generation returned by action=inspect.",
2435
+ "type": "string"
2436
+ },
2437
+ "prompt_text": {
2438
+ "description": "Sensitive response text, valid only when accepting a prompt dialog.",
2439
+ "type": "string"
2440
+ },
2441
+ "session": {
2442
+ "description": "Stable caller-declared session id. Browser targets, tabs, and refs are scoped to this session.",
2443
+ "type": "string"
2444
+ },
2445
+ "tab_id": {
2446
+ "description": "Opaque tab id from get_browser_state (session-scoped).",
2447
+ "type": "string"
2448
+ },
2449
+ "target_id": {
2450
+ "description": "Opaque browser target id minted by get_browser_state (session-scoped; never a CDP id).",
2451
+ "type": "string"
2452
+ }
2453
+ },
2454
+ "required": [
2455
+ "target_id",
2456
+ "tab_id",
2457
+ "action"
2458
+ ],
2459
+ "type": "object"
2460
+ },
2461
+ "annotations": {
2462
+ "destructiveHint": false,
2463
+ "idempotentHint": false,
2464
+ "openWorldHint": true,
2465
+ "readOnlyHint": false
2466
+ },
2467
+ "_meta": {
2468
+ "farming.dev/upstream": "cua-driver",
2469
+ "farming.dev/capabilities": [
2470
+ "browser.dialog",
2471
+ "input.delivery_mode"
2472
+ ],
2473
+ "farming.dev/risk": {
2474
+ "class": "r3",
2475
+ "enforcement": "metadata_only",
2476
+ "operation_sensitive": true,
2477
+ "version": "1"
2478
+ }
2479
+ }
2480
+ },
2481
+ {
2482
+ "name": "computer_browser_set_input_files",
2483
+ "upstreamName": "browser_set_input_files",
2484
+ "description": "Assign one or more explicit absolute local files to an exact live <input type=file> ref through CDP. This bypasses native file pickers, rejects symlinks and non-regular files, and never returns local paths.",
2485
+ "inputSchema": {
2486
+ "additionalProperties": true,
2487
+ "properties": {
2488
+ "files": {
2489
+ "items": {
2490
+ "description": "Absolute path to one local regular file.",
2491
+ "type": "string"
2492
+ },
2493
+ "maxItems": 32,
2494
+ "minItems": 1,
2495
+ "type": "array"
2496
+ },
2497
+ "ref": {
2498
+ "description": "Page element ref in the p<snapshot>:<index> namespace from get_browser_state. Refs are invalidated by navigation and by newer snapshots of the same tab.",
2499
+ "type": "string"
2500
+ },
2501
+ "session": {
2502
+ "description": "Stable caller-declared session id. Browser targets, tabs, and refs are scoped to this session.",
2503
+ "type": "string"
2504
+ },
2505
+ "tab_id": {
2506
+ "description": "Opaque tab id from get_browser_state (session-scoped).",
2507
+ "type": "string"
2508
+ },
2509
+ "target_id": {
2510
+ "description": "Opaque browser target id minted by get_browser_state (session-scoped; never a CDP id).",
2511
+ "type": "string"
2512
+ }
2513
+ },
2514
+ "required": [
2515
+ "target_id",
2516
+ "tab_id",
2517
+ "ref",
2518
+ "files"
2519
+ ],
2520
+ "type": "object"
2521
+ },
2522
+ "annotations": {
2523
+ "destructiveHint": false,
2524
+ "idempotentHint": false,
2525
+ "openWorldHint": true,
2526
+ "readOnlyHint": false
2527
+ },
2528
+ "_meta": {
2529
+ "farming.dev/upstream": "cua-driver",
2530
+ "farming.dev/capabilities": [
2531
+ "browser.input.files"
2532
+ ],
2533
+ "farming.dev/risk": {
2534
+ "class": "r3",
2535
+ "enforcement": "metadata_only",
2536
+ "operation_sensitive": false,
2537
+ "version": "1"
2538
+ }
2539
+ }
2540
+ },
2541
+ {
2542
+ "name": "computer_browser_download",
2543
+ "upstreamName": "browser_download",
2544
+ "description": "Trigger one download through an exact live browser ref and save it inside an explicitly approved directory. Requires MCP-host destructive-tool approval, refuses ambiguous or stale capabilities, and never returns the source URL, filename, or destination path.",
2545
+ "inputSchema": {
2546
+ "additionalProperties": true,
2547
+ "properties": {
2548
+ "destination_root": {
2549
+ "description": "Absolute, existing, canonical directory approved to receive the download.",
2550
+ "type": "string"
2551
+ },
2552
+ "ref": {
2553
+ "description": "Live page ref whose activation initiates the download.",
2554
+ "type": "string"
2555
+ },
2556
+ "session": {
2557
+ "description": "Explicit caller session owning the browser capabilities.",
2558
+ "type": "string"
2559
+ },
2560
+ "tab_id": {
2561
+ "description": "Opaque exact tab id from get_browser_state.",
2562
+ "type": "string"
2563
+ },
2564
+ "target_id": {
2565
+ "description": "Opaque exact browser target id from get_browser_state.",
2566
+ "type": "string"
2567
+ }
2568
+ },
2569
+ "required": [
2570
+ "session",
2571
+ "target_id",
2572
+ "tab_id",
2573
+ "ref",
2574
+ "destination_root"
2575
+ ],
2576
+ "type": "object"
2577
+ },
2578
+ "annotations": {
2579
+ "destructiveHint": true,
2580
+ "idempotentHint": false,
2581
+ "openWorldHint": true,
2582
+ "readOnlyHint": false
2583
+ },
2584
+ "_meta": {
2585
+ "farming.dev/upstream": "cua-driver",
2586
+ "farming.dev/capabilities": [
2587
+ "browser.download"
2588
+ ],
2589
+ "farming.dev/risk": {
2590
+ "class": "r3",
2591
+ "enforcement": "metadata_only",
2592
+ "operation_sensitive": false,
2593
+ "version": "1"
2594
+ }
2595
+ }
2596
+ },
2597
+ {
2598
+ "name": "computer_browser_pointer",
2599
+ "upstreamName": "browser_pointer",
2600
+ "description": "Perform hover, right-click, double-click, scroll, or drag in an exactly-bound browser tab. Semantic refs must declare pointer for hover, right-click, double-click, and drag; scroll accepts a scroll or pointer capability. The trusted route uses CDP Input events and refuses if standalone background posture cannot be preserved. The explicit dom_event route requires a page ref and synthesizes full-background DOM events. Never activates or brings a tab to the foreground.",
2601
+ "inputSchema": {
2602
+ "additionalProperties": true,
2603
+ "properties": {
2604
+ "action": {
2605
+ "enum": [
2606
+ "hover",
2607
+ "right_click",
2608
+ "double_click",
2609
+ "scroll",
2610
+ "drag"
2611
+ ],
2612
+ "type": "string"
2613
+ },
2614
+ "delta_x": {
2615
+ "description": "Horizontal scroll delta in CSS pixels.",
2616
+ "type": "number"
2617
+ },
2618
+ "delta_y": {
2619
+ "description": "Vertical scroll delta in CSS pixels.",
2620
+ "type": "number"
2621
+ },
2622
+ "destination_ref": {
2623
+ "description": "Drag destination page ref in the exact same frame.",
2624
+ "type": "string"
2625
+ },
2626
+ "input_route": {
2627
+ "default": "trusted",
2628
+ "enum": [
2629
+ "trusted",
2630
+ "dom_event"
2631
+ ],
2632
+ "type": "string"
2633
+ },
2634
+ "ref": {
2635
+ "description": "Origin page ref. Alternative to x/y.",
2636
+ "type": "string"
2637
+ },
2638
+ "session": {
2639
+ "description": "Explicit caller session owning the browser capabilities.",
2640
+ "type": "string"
2641
+ },
2642
+ "tab_id": {
2643
+ "description": "Opaque tab id minted by get_browser_state.",
2644
+ "type": "string"
2645
+ },
2646
+ "target_id": {
2647
+ "description": "Opaque target id minted by get_browser_state.",
2648
+ "type": "string"
2649
+ },
2650
+ "to_x": {
2651
+ "description": "Drag destination viewport x in CSS pixels.",
2652
+ "type": "number"
2653
+ },
2654
+ "to_y": {
2655
+ "description": "Drag destination viewport y in CSS pixels.",
2656
+ "type": "number"
2657
+ },
2658
+ "x": {
2659
+ "description": "Origin viewport x in CSS pixels.",
2660
+ "type": "number"
2661
+ },
2662
+ "y": {
2663
+ "description": "Origin viewport y in CSS pixels.",
2664
+ "type": "number"
2665
+ }
2666
+ },
2667
+ "required": [
2668
+ "target_id",
2669
+ "tab_id",
2670
+ "session",
2671
+ "action"
2672
+ ],
2673
+ "type": "object"
2674
+ },
2675
+ "annotations": {
2676
+ "destructiveHint": false,
2677
+ "idempotentHint": false,
2678
+ "openWorldHint": true,
2679
+ "readOnlyHint": false
2680
+ },
2681
+ "_meta": {
2682
+ "farming.dev/upstream": "cua-driver",
2683
+ "farming.dev/capabilities": [
2684
+ "browser.input.pointer"
2685
+ ],
2686
+ "farming.dev/risk": {
2687
+ "class": "r2",
2688
+ "enforcement": "metadata_only",
2689
+ "operation_sensitive": false,
2690
+ "version": "1"
2691
+ }
2692
+ }
2693
+ },
2694
+ {
2695
+ "name": "computer_start_recording",
2696
+ "upstreamName": "start_recording",
2697
+ "description": "Start trajectory recording. Every subsequent action-tool invocation (click, right_click, scroll, type_text, press_key, hotkey, set_value) writes a turn folder under `output_dir`:\n\n- `before_state.json` / `after_state.json` — application AX/UIA/AT-SPI state immediately before and after the action.\n- `before.png` / `after.png` — target-window screenshots immediately before and after the action.\n- `evidence.json` — capture status and a stable classification when an expected artifact could not be captured.\n- `app_state.json` — post-action AX/UIA snapshot for the target pid.\n- `screenshot.png` — compatibility alias of `after.png`.\n- `action.json` — tool name, full input arguments, result summary, pid, click point (when applicable), ISO-8601 timestamp.\n- `click.png` — for click-family actions only, `before.png` with a red marker at the click point.\n\nTurn folders are named `turn-00001/`, `turn-00002/`, etc. Turn numbering restarts at 1 each time recording is (re-)started.\n\n**Video is off by default.** Pass `record_video: true` to also capture the main display to `<output_dir>/recording.mp4` (H.264 / 30 fps) for the lifetime of the session. The recording is torn down automatically when the MCP client disconnects.\n\n**macOS uses native ScreenCaptureKit** (daemon-owned SCStream + SCRecordingOutput) so video inherits the daemon's Screen Recording grant — no extra TCC prompt, no ffmpeg subprocess. Requires macOS 15.0+.\n\n**Windows + Linux use an ffmpeg subprocess** (`gdigrab` / `x11grab` + libx264). Requires ffmpeg on PATH (winget install Gyan.FFmpeg / apt install ffmpeg); when ffmpeg is missing or fails on startup the per-turn capture (screenshots + action.json) still runs and the session's `last_error` field carries the diagnostic.\n\nState persists for the life of the daemon; a restart resets to disabled with no on-disk state. Call `stop_recording` to disable + finalize the mp4.",
2698
+ "inputSchema": {
2699
+ "additionalProperties": false,
2700
+ "properties": {
2701
+ "output_dir": {
2702
+ "description": "Absolute or ~-rooted directory where turn folders and (when enabled) the video file are written.",
2703
+ "type": "string"
2704
+ },
2705
+ "record_video": {
2706
+ "description": "Capture the main display to <output_dir>/recording.mp4. Default: false. Set to true to also capture the main display to recording.mp4 (otherwise only the per-turn screenshots + JSON are recorded). On macOS this uses native ScreenCaptureKit (no extra TCC prompt, macOS 15.0+); on Windows + Linux it requires ffmpeg on PATH.",
2707
+ "type": "boolean"
2708
+ }
2709
+ },
2710
+ "required": [
2711
+ "output_dir"
2712
+ ],
2713
+ "type": "object"
2714
+ },
2715
+ "annotations": {
2716
+ "destructiveHint": false,
2717
+ "idempotentHint": true,
2718
+ "openWorldHint": false,
2719
+ "readOnlyHint": false
2720
+ },
2721
+ "_meta": {
2722
+ "farming.dev/upstream": "cua-driver",
2723
+ "farming.dev/capabilities": [
2724
+ "recording.start"
2725
+ ],
2726
+ "farming.dev/risk": {
2727
+ "class": "r2",
2728
+ "enforcement": "metadata_only",
2729
+ "operation_sensitive": false,
2730
+ "version": "1"
2731
+ }
2732
+ }
2733
+ },
2734
+ {
2735
+ "name": "computer_stop_recording",
2736
+ "upstreamName": "stop_recording",
2737
+ "description": "Stop trajectory recording. Disables further per-turn capture and, when video was enabled, gracefully terminates the ffmpeg subprocess so the mp4's moov atom is finalized (the file is playable). Calling stop on an already-stopped session is a no-op. The response carries `last_video_path` pointing at the finalized mp4 (when video was on).\n\nA manual `stop_recording` is **unconditional** — it stops whatever recording is active regardless of which session started it. Ownership-scoped teardown (so one MCP client disconnecting can't stop a recording a later client started) is handled by the daemon's `session_end` lifecycle signal, not by this tool.",
2738
+ "inputSchema": {
2739
+ "additionalProperties": false,
2740
+ "properties": {},
2741
+ "type": "object"
2742
+ },
2743
+ "annotations": {
2744
+ "destructiveHint": false,
2745
+ "idempotentHint": true,
2746
+ "openWorldHint": false,
2747
+ "readOnlyHint": false
2748
+ },
2749
+ "_meta": {
2750
+ "farming.dev/upstream": "cua-driver",
2751
+ "farming.dev/capabilities": [
2752
+ "recording.stop"
2753
+ ],
2754
+ "farming.dev/risk": {
2755
+ "class": "r1",
2756
+ "enforcement": "metadata_only",
2757
+ "operation_sensitive": false,
2758
+ "version": "1"
2759
+ }
2760
+ }
2761
+ },
2762
+ {
2763
+ "name": "computer_get_recording_state",
2764
+ "upstreamName": "get_recording_state",
2765
+ "description": "Report the current trajectory recorder state: whether recording is enabled, the output directory (when enabled), and the 1-based counter for the next turn folder that will be written. Counter increments on every recorded action tool call and resets to 1 each time recording is (re-)enabled.\n\nPure read-only.",
2766
+ "inputSchema": {
2767
+ "additionalProperties": false,
2768
+ "properties": {},
2769
+ "type": "object"
2770
+ },
2771
+ "annotations": {
2772
+ "destructiveHint": false,
2773
+ "idempotentHint": true,
2774
+ "openWorldHint": false,
2775
+ "readOnlyHint": true
2776
+ },
2777
+ "_meta": {
2778
+ "farming.dev/upstream": "cua-driver",
2779
+ "farming.dev/capabilities": [
2780
+ "recording.state"
2781
+ ],
2782
+ "farming.dev/risk": {
2783
+ "class": "r0",
2784
+ "enforcement": "metadata_only",
2785
+ "operation_sensitive": false,
2786
+ "version": "1"
2787
+ }
2788
+ }
2789
+ },
2790
+ {
2791
+ "name": "computer_replay_trajectory",
2792
+ "upstreamName": "replay_trajectory",
2793
+ "description": "Replay a recorded trajectory by re-invoking every turn's tool call in lexical order. `dir` must point at a directory previously written by `start_recording`. Each `turn-NNNNN/` is parsed for `action.json`, and the recorded tool is called with its recorded `arguments` via the same dispatch path an MCP / CLI call uses.\n\nCaveats:\n- Element-indexed actions (`click({pid, element_index})` etc.) will fail because element indices are per-snapshot and don't survive across sessions. Pixel clicks (`click({pid, x, y})`) and all keyboard tools replay cleanly. Failures are reported but don't stop replay unless `stop_on_error` is true.\n- `get_window_state` and other read-only tools are NOT currently recorded, so replays do not re-populate the per-(pid, window_id) element cache.\n- If recording is ENABLED while replay runs, the replay itself is recorded into the currently configured output directory. That's deliberate: recording a replay against a new build and diffing the two trajectories is the regression-test workflow.",
2794
+ "inputSchema": {
2795
+ "additionalProperties": false,
2796
+ "properties": {
2797
+ "delay_ms": {
2798
+ "description": "Milliseconds to sleep between turns, for human-observable pacing. Default 500.",
2799
+ "maximum": 10000,
2800
+ "minimum": 0,
2801
+ "type": "integer"
2802
+ },
2803
+ "dir": {
2804
+ "description": "Trajectory directory previously written by `start_recording`. Absolute or ~-rooted.",
2805
+ "type": "string"
2806
+ },
2807
+ "stop_on_error": {
2808
+ "description": "Stop replay on the first tool-call error. Default true — set false to best-effort through the full trajectory.",
2809
+ "type": "boolean"
2810
+ }
2811
+ },
2812
+ "required": [
2813
+ "dir"
2814
+ ],
2815
+ "type": "object"
2816
+ },
2817
+ "annotations": {
2818
+ "destructiveHint": true,
2819
+ "idempotentHint": false,
2820
+ "openWorldHint": false,
2821
+ "readOnlyHint": false
2822
+ },
2823
+ "_meta": {
2824
+ "farming.dev/upstream": "cua-driver",
2825
+ "farming.dev/capabilities": [
2826
+ "recording.replay"
2827
+ ],
2828
+ "farming.dev/risk": {
2829
+ "class": "r1",
2830
+ "enforcement": "metadata_only",
2831
+ "operation_sensitive": false,
2832
+ "version": "1"
2833
+ }
2834
+ }
2835
+ },
2836
+ {
2837
+ "name": "computer_install_ffmpeg",
2838
+ "upstreamName": "install_ffmpeg",
2839
+ "description": "Install the ffmpeg binary used by start_recording's video capture (Linux/Windows; macOS records natively and needs no ffmpeg). Two-step and confirmed: called without `confirm` it only REPORTS the exact install command for this platform's package manager; pass `confirm: true` to actually run it. No-op if ffmpeg is already on PATH. ffmpeg is run as a separate process, never linked into the driver.",
2840
+ "inputSchema": {
2841
+ "additionalProperties": false,
2842
+ "properties": {
2843
+ "confirm": {
2844
+ "description": "Run the install command. Without it, only the planned command is reported.",
2845
+ "type": "boolean"
2846
+ }
2847
+ },
2848
+ "type": "object"
2849
+ },
2850
+ "annotations": {
2851
+ "destructiveHint": true,
2852
+ "idempotentHint": false,
2853
+ "openWorldHint": true,
2854
+ "readOnlyHint": false
2855
+ },
2856
+ "_meta": {
2857
+ "farming.dev/upstream": "cua-driver",
2858
+ "farming.dev/capabilities": [
2859
+ "recording.install_dependency"
2860
+ ],
2861
+ "farming.dev/risk": {
2862
+ "class": "r3",
2863
+ "enforcement": "metadata_only",
2864
+ "operation_sensitive": false,
2865
+ "version": "1"
2866
+ }
2867
+ }
2868
+ },
2869
+ {
2870
+ "name": "computer_start_session",
2871
+ "upstreamName": "start_session",
2872
+ "description": "Declare a session — a named, color-coded identity for THIS agent run. Pass a stable `session` id and choose capture_scope=auto|window|desktop; the agent cursor, capture policy, per-session config, and recording all key on it, and it follows the run across any apps/windows. The cursor's color is derived from the id, so distinct runs are visually distinct. A cursor is shown only for a declared session — call this (or pass `session` on your first action) to opt in. Idempotent: re-calling with the same id just refreshes its idle-TTL. End it with `end_session` (or let the idle-TTL reclaim it). Concurrent runs/subagents each pass their own `session` to get their own cursor.",
2873
+ "inputSchema": {
2874
+ "additionalProperties": true,
2875
+ "properties": {
2876
+ "capture_scope": {
2877
+ "default": "auto",
2878
+ "description": "Per-session perception/action modality. auto starts window-only and requires explicit escalation before desktop tools; window and desktop are strict. Immutable for the live session.",
2879
+ "enum": [
2880
+ "auto",
2881
+ "window",
2882
+ "desktop"
2883
+ ],
2884
+ "type": "string"
2885
+ },
2886
+ "session": {
2887
+ "description": "Stable session id for this run (e.g. \"research-run-1\").",
2888
+ "type": "string"
2889
+ }
2890
+ },
2891
+ "required": [
2892
+ "session"
2893
+ ],
2894
+ "type": "object"
2895
+ },
2896
+ "annotations": {
2897
+ "destructiveHint": false,
2898
+ "idempotentHint": true,
2899
+ "openWorldHint": false,
2900
+ "readOnlyHint": false
2901
+ },
2902
+ "_meta": {
2903
+ "farming.dev/upstream": "cua-driver",
2904
+ "farming.dev/capabilities": [
2905
+ "session.lifecycle.start",
2906
+ "session.capture_scope"
2907
+ ],
2908
+ "farming.dev/risk": {
2909
+ "class": "r1",
2910
+ "enforcement": "metadata_only",
2911
+ "operation_sensitive": false,
2912
+ "version": "1"
2913
+ }
2914
+ }
2915
+ },
2916
+ {
2917
+ "name": "computer_escalate_session",
2918
+ "upstreamName": "escalate_session",
2919
+ "description": "Unlock the desktop phase of an auto capture-scope session after the window action ladder has been exhausted and verified. This is a one-way transition for the live session and records a bounded reason.",
2920
+ "inputSchema": {
2921
+ "additionalProperties": true,
2922
+ "properties": {
2923
+ "detail": {
2924
+ "description": "Optional bounded diagnostic detail. Never use secrets or page content.",
2925
+ "maxLength": 200,
2926
+ "type": "string"
2927
+ },
2928
+ "reason": {
2929
+ "enum": [
2930
+ "ax_tree_pixel_mismatch",
2931
+ "background_delivery_failed",
2932
+ "foreground_ineffective",
2933
+ "no_window_target",
2934
+ "other"
2935
+ ],
2936
+ "type": "string"
2937
+ },
2938
+ "session": {
2939
+ "type": "string"
2940
+ }
2941
+ },
2942
+ "required": [
2943
+ "session",
2944
+ "reason"
2945
+ ],
2946
+ "type": "object"
2947
+ },
2948
+ "annotations": {
2949
+ "destructiveHint": false,
2950
+ "idempotentHint": false,
2951
+ "openWorldHint": false,
2952
+ "readOnlyHint": false
2953
+ },
2954
+ "_meta": {
2955
+ "farming.dev/upstream": "cua-driver",
2956
+ "farming.dev/capabilities": [
2957
+ "session.capture_scope.escalate"
2958
+ ],
2959
+ "farming.dev/risk": {
2960
+ "class": "r2",
2961
+ "enforcement": "metadata_only",
2962
+ "operation_sensitive": false,
2963
+ "version": "1"
2964
+ }
2965
+ }
2966
+ },
2967
+ {
2968
+ "name": "computer_get_session_state",
2969
+ "upstreamName": "get_session_state",
2970
+ "description": "Read the live session's capture policy and effective scope.",
2971
+ "inputSchema": {
2972
+ "additionalProperties": true,
2973
+ "properties": {
2974
+ "session": {
2975
+ "type": "string"
2976
+ }
2977
+ },
2978
+ "required": [
2979
+ "session"
2980
+ ],
2981
+ "type": "object"
2982
+ },
2983
+ "annotations": {
2984
+ "destructiveHint": false,
2985
+ "idempotentHint": true,
2986
+ "openWorldHint": false,
2987
+ "readOnlyHint": true
2988
+ },
2989
+ "_meta": {
2990
+ "farming.dev/upstream": "cua-driver",
2991
+ "farming.dev/capabilities": [
2992
+ "session.capture_scope.read"
2993
+ ],
2994
+ "farming.dev/risk": {
2995
+ "class": "r0",
2996
+ "enforcement": "metadata_only",
2997
+ "operation_sensitive": false,
2998
+ "version": "1"
2999
+ }
3000
+ }
3001
+ },
3002
+ {
3003
+ "name": "computer_end_session",
3004
+ "upstreamName": "end_session",
3005
+ "description": "End a session declared with `start_session`: removes its agent cursor, stops any recording it owns, and clears its per-session config. Call this when a run finishes so its cursor doesn't linger (otherwise the idle-TTL reclaims it after a period of inactivity). Idempotent.",
3006
+ "inputSchema": {
3007
+ "additionalProperties": true,
3008
+ "properties": {
3009
+ "session": {
3010
+ "description": "The session id to end.",
3011
+ "type": "string"
3012
+ }
3013
+ },
3014
+ "required": [
3015
+ "session"
3016
+ ],
3017
+ "type": "object"
3018
+ },
3019
+ "annotations": {
3020
+ "destructiveHint": true,
3021
+ "idempotentHint": true,
3022
+ "openWorldHint": false,
3023
+ "readOnlyHint": false
3024
+ },
3025
+ "_meta": {
3026
+ "farming.dev/upstream": "cua-driver",
3027
+ "farming.dev/capabilities": [
3028
+ "session.lifecycle.end"
3029
+ ],
3030
+ "farming.dev/risk": {
3031
+ "class": "r1",
3032
+ "enforcement": "metadata_only",
3033
+ "operation_sensitive": false,
3034
+ "version": "1"
3035
+ }
3036
+ }
3037
+ },
3038
+ {
3039
+ "name": "computer_check_for_update",
3040
+ "upstreamName": "check_for_update",
3041
+ "description": "Check whether a newer cua-driver-rs release is available on GitHub. Returns the current and latest versions, an `update_available` boolean, the install one-liner, and the release notes URL. Read-only — never installs. Mirror of `cua-driver check-update --json`.",
3042
+ "inputSchema": {
3043
+ "additionalProperties": false,
3044
+ "properties": {},
3045
+ "type": "object"
3046
+ },
3047
+ "annotations": {
3048
+ "destructiveHint": false,
3049
+ "idempotentHint": true,
3050
+ "openWorldHint": true,
3051
+ "readOnlyHint": true
3052
+ },
3053
+ "_meta": {
3054
+ "farming.dev/upstream": "cua-driver",
3055
+ "farming.dev/capabilities": [
3056
+ "driver.update_check"
3057
+ ],
3058
+ "farming.dev/risk": {
3059
+ "class": "r0",
3060
+ "enforcement": "metadata_only",
3061
+ "operation_sensitive": false,
3062
+ "version": "1"
3063
+ }
3064
+ }
3065
+ }
3066
+ ]
3067
+ }