farming-code 2.2.29 → 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 (385) hide show
  1. package/README.md +25 -66
  2. package/README.zh_cn.md +15 -66
  3. package/THIRD_PARTY_NOTICES.md +7 -0
  4. package/backend/acp/{client-services.js → client-services.cjs} +132 -134
  5. package/backend/acp/packaged-claude-acp.cjs +37 -0
  6. package/backend/acp/packaged-codex-acp.cjs +37 -0
  7. package/backend/acp/patch-decisions.cjs +182 -0
  8. package/backend/acp/permission-security.cjs +131 -0
  9. package/backend/{acp-checkpoint-store.js → acp-checkpoint-store.cjs} +90 -59
  10. package/backend/{acp-runtime.js → acp-runtime.cjs} +1219 -1125
  11. package/backend/acp-session-state.cjs +622 -0
  12. package/backend/acp-transcript.cjs +525 -0
  13. package/backend/agent-env.cjs +257 -0
  14. package/backend/agent-extension-discovery.cjs +452 -0
  15. package/backend/agent-extension-inventory.cjs +116 -0
  16. package/backend/agent-json-stream.cjs +283 -0
  17. package/backend/agent-lifecycle-journal.cjs +185 -0
  18. package/backend/{agent-manager.js → agent-manager.cjs} +3116 -4275
  19. package/backend/agent-order-transaction.cjs +85 -0
  20. package/backend/agent-order.cjs +159 -0
  21. package/backend/agent-provider-session.cjs +98 -0
  22. package/backend/agent-runtime-binding.cjs +179 -0
  23. package/backend/agent-session-history.cjs +1022 -0
  24. package/backend/agent-session-inventory.cjs +291 -0
  25. package/backend/async-cache.cjs +104 -0
  26. package/backend/atomic-json-store.cjs +67 -0
  27. package/backend/auth.cjs +261 -0
  28. package/backend/authoritative-inventory-cache.cjs +383 -0
  29. package/backend/business-health.cjs +68 -0
  30. package/backend/chat-runtime.cjs +50 -0
  31. package/backend/claude-settings.cjs +132 -0
  32. package/backend/cli-agents.cjs +435 -0
  33. package/backend/codex-context-window.cjs +196 -0
  34. package/backend/codex-models.cjs +228 -0
  35. package/backend/codex-session-archive.cjs +82 -0
  36. package/backend/codex-session-history.cjs +590 -0
  37. package/backend/{codex-terminal-profile.js → codex-terminal-profile.cjs} +149 -155
  38. package/backend/codex-transcript-sanitizer.cjs +130 -0
  39. package/backend/codex-transcript.cjs +2107 -0
  40. package/backend/command-runner-child.cjs +105 -0
  41. package/backend/config-manager.cjs +1263 -0
  42. package/backend/control-api.cjs +439 -0
  43. package/backend/data/LICENSE.cua +21 -0
  44. package/backend/executable-discovery.cjs +204 -0
  45. package/backend/farming-agent-bootstrap.cjs +81 -0
  46. package/backend/farming-agent-bootstrap.zh_cn.md +6 -2
  47. package/backend/{farming-app-cli.js → farming-app-cli.cjs} +441 -493
  48. package/backend/farming-cli.cjs +414 -0
  49. package/backend/farming-net-pass.cjs +319 -0
  50. package/backend/farming-net-registry.cjs +123 -0
  51. package/backend/farming-net-server.cjs +309 -0
  52. package/backend/farming-session-store.cjs +651 -0
  53. package/backend/git-worktree-info.cjs +181 -0
  54. package/backend/haiku-token.cjs +828 -0
  55. package/backend/index-html.cjs +96 -0
  56. package/backend/input-parts.cjs +68 -0
  57. package/backend/input-routing.cjs +40 -0
  58. package/backend/{local-session-engine.js → local-session-engine.cjs} +276 -282
  59. package/backend/main-agent-skills.cjs +309 -0
  60. package/backend/main-page-session.cjs +132 -0
  61. package/backend/native-pty-controller-generation.cjs +139 -0
  62. package/backend/{native-pty-host-client.js → native-pty-host-client.cjs} +338 -346
  63. package/backend/native-pty-host-identity.cjs +125 -0
  64. package/backend/native-pty-host-path.cjs +68 -0
  65. package/backend/{native-pty-host.js → native-pty-host.cjs} +480 -569
  66. package/backend/native-session-engine.cjs +296 -0
  67. package/backend/network.cjs +57 -0
  68. package/backend/npm-update-helper.cjs +399 -0
  69. package/backend/packaged-node-pty.cjs +120 -0
  70. package/backend/preview-session-manager.cjs +89 -0
  71. package/backend/provider-adapters.cjs +492 -0
  72. package/backend/provider-home-configuration.cjs +211 -0
  73. package/backend/provider-session-id.cjs +79 -0
  74. package/backend/provider-session-service.cjs +333 -0
  75. package/backend/qr-share-tickets.cjs +119 -0
  76. package/backend/resource-broadcast-protocol.cjs +50 -0
  77. package/backend/review-diff-router.cjs +202 -0
  78. package/backend/review-diff-service.cjs +1267 -0
  79. package/backend/review-session-router.cjs +93 -0
  80. package/backend/review-session-service.cjs +470 -0
  81. package/backend/review-session-store.cjs +161 -0
  82. package/backend/review-state-router.cjs +132 -0
  83. package/backend/review-state-store.cjs +299 -0
  84. package/backend/run-history-store.cjs +97 -0
  85. package/backend/runtime-dependency-manager.cjs +893 -0
  86. package/backend/runtime-executable-invocation.cjs +37 -0
  87. package/backend/runtime-observation.cjs +96 -0
  88. package/backend/server-process-identity.cjs +70 -0
  89. package/backend/server.cjs +3356 -0
  90. package/backend/session-engine-bridge.cjs +144 -0
  91. package/backend/session-engine-router.cjs +105 -0
  92. package/backend/session-engine.cjs +64 -0
  93. package/backend/session-stream-protocol.cjs +181 -0
  94. package/backend/shell-busy-integration.cjs +442 -0
  95. package/backend/slash-command-discovery.cjs +423 -0
  96. package/backend/storage-layout.cjs +263 -0
  97. package/backend/system-monitor.cjs +96 -0
  98. package/backend/terminal-attach-checkpoint.cjs +73 -0
  99. package/backend/terminal-exit-quiescence.cjs +57 -0
  100. package/backend/{terminal-reducer-flow-control.js → terminal-reducer-flow-control.cjs} +45 -22
  101. package/backend/terminal-runtime-cleanup.cjs +99 -0
  102. package/backend/{terminal-screen-state.js → terminal-screen-state.cjs} +100 -108
  103. package/backend/{terminal-screen-worker-pool.js → terminal-screen-worker-pool.cjs} +89 -79
  104. package/backend/{terminal-screen-worker-thread.js → terminal-screen-worker-thread.cjs} +64 -65
  105. package/backend/terminal-screen-worker.cjs +352 -0
  106. package/backend/terminal-state-serialization.cjs +147 -0
  107. package/backend/{terminal-status.js → terminal-status.cjs} +137 -187
  108. package/backend/theme-manager.cjs +185 -0
  109. package/backend/update-service.cjs +675 -0
  110. package/backend/usage-forecast.cjs +95 -0
  111. package/backend/{usage-history-client.js → usage-history-client.cjs} +144 -94
  112. package/backend/usage-history-smoke.cjs +85 -0
  113. package/backend/usage-history-worker.cjs +60 -0
  114. package/backend/{usage-monitor.js → usage-monitor.cjs} +363 -390
  115. package/backend/workspace-directory.cjs +239 -0
  116. package/backend/workspace-discovery.cjs +271 -0
  117. package/backend/{workspace-file-router.js → workspace-file-router.cjs} +213 -282
  118. package/backend/{workspace-file-service.js → workspace-file-service.cjs} +1139 -1318
  119. package/backend/workspace-root-registry.cjs +192 -0
  120. package/bin/farming +1 -1
  121. package/config/farming.deploy.env.example +1 -1
  122. package/config/farming.install.env.example +1 -1
  123. package/dist/acp/codex-acp-1.1.4.mjs +405 -8
  124. package/dist/assets/App-BCkdpWB6.css +1 -0
  125. package/dist/assets/App-CRjKpaGp.js +697 -0
  126. package/dist/assets/CodeSelect-Ci8sKZPU.js +1 -0
  127. package/dist/assets/CodeSelect-T2eNzrOc.css +1 -0
  128. package/dist/assets/{FileEditorMarkdownPreview-Cs9cLv8a.js → FileEditorMarkdownPreview-V06QHlAg.js} +55 -55
  129. package/dist/assets/FileEditorPane-BX-Wjg9U.js +2 -0
  130. package/dist/assets/IconGlyphs-YhV7tqd4.js +1 -0
  131. package/dist/assets/ProjectFilesSection-BDT2_r0o.js +12 -0
  132. package/dist/assets/ReviewPage-BqAs5sG1.js +3 -0
  133. package/dist/assets/code-dark-B7eM_9G9.css +1 -0
  134. package/dist/assets/{cssMode-Bdg5RpcJ.js → cssMode-ADdAlxTO.js} +1 -1
  135. package/dist/assets/{editor.api2-D74ufkbr.js → editor.api2-BFLAr0YF.js} +162 -162
  136. package/dist/assets/file-icons-BpeqWkIB.js +1 -0
  137. package/dist/assets/{freemarker2-DfMDJfnE.js → freemarker2-C90q5jrp.js} +1 -1
  138. package/dist/assets/{handlebars-BEdPtzMT.js → handlebars-BwUQcEDq.js} +1 -1
  139. package/dist/assets/{html-B1fPb1QD.js → html-1s3uPKfh.js} +1 -1
  140. package/dist/assets/{htmlMode-CY2ZjHxH.js → htmlMode-xtKD99de.js} +1 -1
  141. package/dist/assets/{index-CQNaZc3l.js → index-C8MchCem.js} +3 -3
  142. package/dist/assets/{javascript-BV2OsWA0.js → javascript-Ph7ijyny.js} +1 -1
  143. package/dist/assets/{jsonMode-zd07aeuX.js → jsonMode-D-jGAnFH.js} +1 -1
  144. package/dist/assets/linkComputer-CbGyI_qx.js +1 -0
  145. package/dist/assets/{liquid-BParI24X.js → liquid-0IamE_cI.js} +1 -1
  146. package/dist/assets/{lspLanguageFeatures-BzredkoV.js → lspLanguageFeatures-BxnQunWF.js} +1 -1
  147. package/dist/assets/main-CLKXa6hf.css +1 -0
  148. package/dist/assets/{mdx-vGzUJN98.js → mdx-DdNmfivn.js} +1 -1
  149. package/dist/assets/{monaco.contribution-BmaeBQEc.js → monaco.contribution-B43jsUs1.js} +2 -2
  150. package/dist/assets/{python-CUwdLgsI.js → python-IAt4X5TS.js} +1 -1
  151. package/dist/assets/{razor-BScebUxU.js → razor-DRkFYW0S.js} +1 -1
  152. package/dist/assets/review-C8-oPKXk.css +1 -0
  153. package/dist/assets/{tsMode-DzUAibXK.js → tsMode-_d_4U2gf.js} +1 -1
  154. package/dist/assets/{typescript-D9EOeM7N.js → typescript-C7zcMq9l.js} +1 -1
  155. package/dist/assets/{workers-DAiomYZM.js → workers-D0nOyJzf.js} +1 -1
  156. package/dist/assets/workspace-editor-model-DND_Y-Bj.js +1 -0
  157. package/dist/assets/workspace-editor-monaco-BPWhgcIB.js +4 -0
  158. package/dist/assets/workspace-editor-monaco-N641qPjX.js +1 -0
  159. package/dist/assets/workspace-view-state-k1bTlJ_Z.js +13 -0
  160. package/dist/assets/{xml-wWl1dhkQ.js → xml-BR-HvxT8.js} +1 -1
  161. package/dist/assets/{yaml-Dc2WDaOZ.js → yaml-YtFQwh4q.js} +1 -1
  162. package/dist/index.html +2 -1
  163. package/extensions/browser/backend/agent-browser-runtime.cjs +1040 -0
  164. package/extensions/browser/backend/agent-capability.cjs +85 -0
  165. package/extensions/browser/backend/browser-mcp-server.cjs +655 -0
  166. package/extensions/browser/backend/browser-resource-manager.cjs +1486 -0
  167. package/extensions/browser/backend/browser-resource-store.cjs +228 -0
  168. package/extensions/browser/backend/browser-router.cjs +203 -0
  169. package/extensions/browser/backend/executable-discovery.cjs +248 -0
  170. package/extensions/browser/backend/farming-browser-client.cjs +116 -0
  171. package/extensions/browser/backend/index.cjs +32 -0
  172. package/extensions/browser/backend/managed-chromium-installer.cjs +833 -0
  173. package/extensions/browser/bin/farming-browser +16 -7
  174. package/extensions/computer/backend/agent-capability.cjs +72 -0
  175. package/extensions/computer/backend/computer-constants.cjs +59 -0
  176. package/extensions/computer/backend/computer-mcp-server.cjs +182 -0
  177. package/extensions/computer/backend/computer-resource-manager.cjs +1219 -0
  178. package/extensions/computer/backend/computer-resource-store.cjs +190 -0
  179. package/extensions/computer/backend/computer-router.cjs +257 -0
  180. package/extensions/computer/backend/cua-tools.json +3067 -0
  181. package/extensions/computer/backend/farming-computer-client.cjs +84 -0
  182. package/extensions/computer/backend/index.cjs +35 -0
  183. package/extensions/computer/backend/isolated-browser-provider.cjs +157 -0
  184. package/extensions/computer/bin/farming-computer +131 -0
  185. package/frontend/farming-net/app.js +255 -262
  186. package/frontend/ghostty-loader.js +24 -20
  187. package/frontend/reading-anchor.js +210 -193
  188. package/frontend/runtime-paths.js +24 -26
  189. package/frontend/session-bridge.js +90 -111
  190. package/frontend/session-modal-bridge.js +184 -302
  191. package/frontend/skin-bridge.js +20 -23
  192. package/frontend/skins/crt/app.js +7686 -7901
  193. package/frontend/skins/crt/effects.js +7 -6
  194. package/frontend/skins/crt/index.html +6 -6
  195. package/frontend/skins/crt/styles/markdown.css +4 -4
  196. package/frontend/terminal-bridge.js +174 -181
  197. package/frontend/terminal-replay.js +320 -345
  198. package/frontend/theme-loader.js +55 -71
  199. package/index.html +1 -0
  200. package/package.json +64 -37
  201. package/shared/backend-connection-status.js +38 -69
  202. package/shared/browser-protocol.js +235 -110
  203. package/shared/websocket-liveness.js +40 -0
  204. package/backend/acp/packaged-claude-acp.js +0 -13
  205. package/backend/acp/packaged-codex-acp.js +0 -13
  206. package/backend/acp/patch-decisions.js +0 -153
  207. package/backend/acp/permission-security.js +0 -108
  208. package/backend/acp-session-state.js +0 -644
  209. package/backend/acp-transcript.js +0 -512
  210. package/backend/agent-env.js +0 -250
  211. package/backend/agent-json-stream.js +0 -268
  212. package/backend/agent-lifecycle-journal.js +0 -133
  213. package/backend/agent-memory-report.js +0 -583
  214. package/backend/agent-order.js +0 -166
  215. package/backend/agent-provider-session.js +0 -76
  216. package/backend/agent-runtime-binding.js +0 -174
  217. package/backend/agent-session-history.js +0 -953
  218. package/backend/async-cache.js +0 -94
  219. package/backend/atomic-json-store.js +0 -37
  220. package/backend/auth.js +0 -251
  221. package/backend/bundle-update-helper.js +0 -113
  222. package/backend/chat-runtime.js +0 -28
  223. package/backend/claude-settings.js +0 -121
  224. package/backend/cli-agents.js +0 -486
  225. package/backend/codex-context-window.js +0 -189
  226. package/backend/codex-models.js +0 -226
  227. package/backend/codex-rollout-follower.js +0 -326
  228. package/backend/codex-session-archive.js +0 -65
  229. package/backend/codex-session-history.js +0 -647
  230. package/backend/codex-transcript-sanitizer.js +0 -115
  231. package/backend/codex-transcript.js +0 -2564
  232. package/backend/command-runner-child.js +0 -67
  233. package/backend/config-manager.js +0 -1133
  234. package/backend/control-api.js +0 -455
  235. package/backend/executable-discovery.js +0 -216
  236. package/backend/farming-agent-bootstrap.js +0 -49
  237. package/backend/farming-cli.js +0 -457
  238. package/backend/farming-net-pass.js +0 -285
  239. package/backend/farming-net-registry.js +0 -112
  240. package/backend/farming-net-server.js +0 -298
  241. package/backend/farming-session-store.js +0 -677
  242. package/backend/git-worktree-info.js +0 -181
  243. package/backend/haiku-token.js +0 -772
  244. package/backend/index-html.js +0 -62
  245. package/backend/input-parts.js +0 -54
  246. package/backend/input-routing.js +0 -24
  247. package/backend/json-cli-runtime.js +0 -275
  248. package/backend/main-agent-skills.js +0 -305
  249. package/backend/main-page-session.js +0 -122
  250. package/backend/native-pty-controller-generation.js +0 -106
  251. package/backend/native-pty-host-identity.js +0 -86
  252. package/backend/native-pty-host-path.js +0 -42
  253. package/backend/native-session-engine.js +0 -268
  254. package/backend/network.js +0 -23
  255. package/backend/npm-update-helper.js +0 -374
  256. package/backend/packaged-node-pty.js +0 -99
  257. package/backend/preview-session-manager.js +0 -68
  258. package/backend/provider-adapters.js +0 -399
  259. package/backend/provider-session-id.js +0 -47
  260. package/backend/provider-session-service.js +0 -345
  261. package/backend/qr-share-tickets.js +0 -100
  262. package/backend/review-diff-router.js +0 -180
  263. package/backend/review-diff-service.js +0 -1270
  264. package/backend/review-session-router.js +0 -74
  265. package/backend/review-session-service.js +0 -446
  266. package/backend/review-session-store.js +0 -151
  267. package/backend/review-state-router.js +0 -116
  268. package/backend/review-state-store.js +0 -286
  269. package/backend/run-history-store.js +0 -67
  270. package/backend/runtime-dependency-manager.js +0 -759
  271. package/backend/runtime-executable-invocation.js +0 -20
  272. package/backend/runtime-observation.js +0 -81
  273. package/backend/server-process-identity.js +0 -47
  274. package/backend/server.js +0 -3267
  275. package/backend/session-engine-bridge.js +0 -129
  276. package/backend/session-engine-router.js +0 -66
  277. package/backend/session-engine.js +0 -39
  278. package/backend/session-stream-protocol.js +0 -185
  279. package/backend/shell-busy-integration.js +0 -472
  280. package/backend/slash-command-discovery.js +0 -433
  281. package/backend/storage-layout.js +0 -190
  282. package/backend/system-monitor.js +0 -77
  283. package/backend/terminal-attach-checkpoint.js +0 -74
  284. package/backend/terminal-exit-quiescence.js +0 -39
  285. package/backend/terminal-runtime-cleanup.js +0 -80
  286. package/backend/terminal-screen-worker.js +0 -337
  287. package/backend/terminal-state-serialization.js +0 -127
  288. package/backend/theme-manager.js +0 -163
  289. package/backend/update-service.js +0 -1545
  290. package/backend/usage-forecast.js +0 -86
  291. package/backend/usage-history-scanner.ts +0 -2718
  292. package/backend/usage-history-smoke.js +0 -64
  293. package/backend/usage-history-worker.js +0 -34
  294. package/backend/workspace-directory.js +0 -232
  295. package/backend/workspace-discovery.js +0 -311
  296. package/backend/workspace-root-registry.js +0 -166
  297. package/dist/assets/App-BKNUILuL.css +0 -1
  298. package/dist/assets/App-Ex2oVVXO.js +0 -693
  299. package/dist/assets/FileEditorPane-CNtuGjQ3.js +0 -2
  300. package/dist/assets/IconGlyphs-BClgag6E.js +0 -1
  301. package/dist/assets/ProjectFilesSection-Cf2BEcAN.js +0 -12
  302. package/dist/assets/ReviewPage-BRuxFaH5.js +0 -3
  303. package/dist/assets/code-dark-BEZTQwYZ.css +0 -1
  304. package/dist/assets/file-icons-BOlcJ0ZF.js +0 -1
  305. package/dist/assets/main-DK9Sy7-c.css +0 -1
  306. package/dist/assets/review-BcnwQtJv.css +0 -1
  307. package/dist/assets/workspace-editor-model-CSGCl21x.js +0 -1
  308. package/dist/assets/workspace-editor-monaco-CJNwbpCy.js +0 -4
  309. package/dist/assets/workspace-editor-monaco-CO9w8YV0.js +0 -1
  310. package/dist/assets/workspace-view-state-BjKPYp0E.js +0 -7
  311. package/extensions/browser/backend/agent-browser-runtime.js +0 -1041
  312. package/extensions/browser/backend/agent-capability.js +0 -55
  313. package/extensions/browser/backend/browser-mcp-server.js +0 -621
  314. package/extensions/browser/backend/browser-resource-manager.js +0 -1309
  315. package/extensions/browser/backend/browser-resource-store.js +0 -190
  316. package/extensions/browser/backend/browser-router.js +0 -133
  317. package/extensions/browser/backend/executable-discovery.js +0 -224
  318. package/extensions/browser/backend/farming-browser-client.js +0 -83
  319. package/extensions/browser/backend/index.js +0 -7
  320. package/extensions/browser/frontend/BrowserSidebarPortals.tsx +0 -360
  321. package/extensions/browser/frontend/BrowserViewer.tsx +0 -500
  322. package/extensions/browser/frontend/browser-resource-state.ts +0 -60
  323. package/extensions/browser/frontend/browser.css +0 -567
  324. package/extensions/browser/frontend/types.ts +0 -31
  325. package/extensions/browser/frontend/useBrowserResources.ts +0 -158
  326. package/frontend/vendor/ghostty-web/index.d.ts +0 -1842
  327. package/shared/backend-connection-status.d.ts +0 -37
  328. package/shared/browser-protocol.d.ts +0 -5
  329. /package/dist/assets/{api-w2x5QfxB.js → api-ByCV9MEr.js} +0 -0
  330. /package/dist/assets/{core-vPkV8P_m.js → core-Czwdx12k.js} +0 -0
  331. /package/dist/assets/{fsharp-DNZNZyEE.js → fsharp-BjPpkoJe.js} +0 -0
  332. /package/dist/assets/{go-_kPJjNc_.js → go-BkIDmSUP.js} +0 -0
  333. /package/dist/assets/{graphql-4HCNVt5g.js → graphql-CCJTpqi1.js} +0 -0
  334. /package/dist/assets/{hcl-C87ymY0o.js → hcl-s4z8lUFg.js} +0 -0
  335. /package/dist/assets/{ini-BYrrGNTc.js → ini-CyUW1I7Z.js} +0 -0
  336. /package/dist/assets/{java-B211rJbk.js → java-CFCcGRiM.js} +0 -0
  337. /package/dist/assets/{julia-DVPsRtBm.js → julia-DQyH_EYb.js} +0 -0
  338. /package/dist/assets/{kotlin-BYyNerjp.js → kotlin-B8hA5O51.js} +0 -0
  339. /package/dist/assets/{less-EC9UblGE.js → less-DaVdaas0.js} +0 -0
  340. /package/dist/assets/{lexon-B1yuUdqW.js → lexon-DLBhPd3y.js} +0 -0
  341. /package/dist/assets/{lua-Bo6GFzxT.js → lua-gB1c_cif.js} +0 -0
  342. /package/dist/assets/{m3-C-Y9cBVI.js → m3-C2T3z3gB.js} +0 -0
  343. /package/dist/assets/{markdown-BHu-wLbe.js → markdown-CKq-Euj1.js} +0 -0
  344. /package/dist/assets/{mips-Dkds26rX.js → mips-Bcs5qIDX.js} +0 -0
  345. /package/dist/assets/{msdax-PU4g-8_g.js → msdax-CBP48FHF.js} +0 -0
  346. /package/dist/assets/{mysql-fPpuGpS7.js → mysql-c7tiPcFj.js} +0 -0
  347. /package/dist/assets/{objective-c-Wy1e5JUf.js → objective-c-D4BZkeEV.js} +0 -0
  348. /package/dist/assets/{pascal-BIXwvrqU.js → pascal-CJDZg0MN.js} +0 -0
  349. /package/dist/assets/{pascaligo-DwR0AtL_.js → pascaligo-Bygi8Ynl.js} +0 -0
  350. /package/dist/assets/{perl-CGHAl8my.js → perl-aS8bkf7E.js} +0 -0
  351. /package/dist/assets/{pgsql-B91M73E2.js → pgsql-CzNAYFYl.js} +0 -0
  352. /package/dist/assets/{php-C70ttrCx.js → php-DOtoEFTT.js} +0 -0
  353. /package/dist/assets/{pla-BNrXaRh0.js → pla-DugRnao1.js} +0 -0
  354. /package/dist/assets/{postiats-Dv2IAZR9.js → postiats-DsXwusKh.js} +0 -0
  355. /package/dist/assets/{powerquery-CkY5Wq7J.js → powerquery-DL3o72oD.js} +0 -0
  356. /package/dist/assets/{powershell-uGIYLU3C.js → powershell-C1qHekys.js} +0 -0
  357. /package/dist/assets/{protobuf-CavfmJu-.js → protobuf-DHgsc-cH.js} +0 -0
  358. /package/dist/assets/{pug-Drqnyitx.js → pug-FZXlE_Iu.js} +0 -0
  359. /package/dist/assets/{qrcode-7uGsTEmi.js → qrcode-DJDTdjL7.js} +0 -0
  360. /package/dist/assets/{qsharp-C7yF-Dti.js → qsharp-bLyhI3DT.js} +0 -0
  361. /package/dist/assets/{r-HXLGP0_-.js → r-DjFGXbAa.js} +0 -0
  362. /package/dist/assets/{redis-C4y6mf2p.js → redis-DSoZ_V6u.js} +0 -0
  363. /package/dist/assets/{redshift-DdQrFPrv.js → redshift-CzkdCsrg.js} +0 -0
  364. /package/dist/assets/{restructuredtext-CBrf2PNj.js → restructuredtext-B_XPrGCQ.js} +0 -0
  365. /package/dist/assets/{ruby-CVtMoX2B.js → ruby-Cry2RneJ.js} +0 -0
  366. /package/dist/assets/{rust-Ckq4sbMP.js → rust-CWzdbFq1.js} +0 -0
  367. /package/dist/assets/{sb-er66OpE3.js → sb-DmofU59h.js} +0 -0
  368. /package/dist/assets/{scala-BdWZz-hH.js → scala-BUC2l-vN.js} +0 -0
  369. /package/dist/assets/{scheme-kTV_s2kP.js → scheme-CNIB_72f.js} +0 -0
  370. /package/dist/assets/{scss-Bymy2VJQ.js → scss-DcL4-NbX.js} +0 -0
  371. /package/dist/assets/{shell-bwEP1LQ1.js → shell-CgAGvSSA.js} +0 -0
  372. /package/dist/assets/{solidity-DCddeBgL.js → solidity-DSkt6O_P.js} +0 -0
  373. /package/dist/assets/{sophia-BMN3AQig.js → sophia--5ytcjDN.js} +0 -0
  374. /package/dist/assets/{sparql-CSXOLjzi.js → sparql-C1Srr7cD.js} +0 -0
  375. /package/dist/assets/{sql-COg8ewmK.js → sql-2k_O5fj7.js} +0 -0
  376. /package/dist/assets/{st-CIaZtBS_.js → st-DCCCPqfz.js} +0 -0
  377. /package/dist/assets/{swift-DXiOhUHu.js → swift-Dd8mAfOt.js} +0 -0
  378. /package/dist/assets/{systemverilog-BTDE6Dr2.js → systemverilog-B0-aZYXu.js} +0 -0
  379. /package/dist/assets/{tcl-B0zy9NvV.js → tcl-CZAZwPVX.js} +0 -0
  380. /package/dist/assets/{twig-D594l4Z1.js → twig-D-Ag0tdS.js} +0 -0
  381. /package/dist/assets/{typespec-XKVjaPqo.js → typespec-B7kTFp0Z.js} +0 -0
  382. /package/dist/assets/{useWorkspaceMenuKeyboard-Bpy_s69Z.js → useWorkspaceMenuKeyboard-uYZpDxhU.js} +0 -0
  383. /package/dist/assets/{vb-B2wYoKRV.js → vb-20w1JPum.js} +0 -0
  384. /package/dist/assets/{wgsl-D0Yf2LbK.js → wgsl-CLJfqFt0.js} +0 -0
  385. /package/dist/assets/{workspace-working-copy-C3FSR3N6.js → workspace-working-copy-Cfz07cOd.js} +0 -0
@@ -0,0 +1,439 @@
1
+ // Generated by scripts/build-backend-runtime.ts. Do not edit.
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var control_api_exports = {};
21
+ __export(control_api_exports, {
22
+ DEFAULT_INITIAL_INPUT_TIMEOUT_MS: () => DEFAULT_INITIAL_INPUT_TIMEOUT_MS,
23
+ createControlRouter: () => createControlRouter,
24
+ ensureTrailingNewline: () => ensureTrailingNewline,
25
+ waitForTerminalInputReadiness: () => waitForTerminalInputReadiness
26
+ });
27
+ module.exports = __toCommonJS(control_api_exports);
28
+ var import_terminal_status = require("./terminal-status.cjs");
29
+ var import_agent_runtime_binding = require("./agent-runtime-binding.cjs");
30
+ const express = require("express");
31
+ const crypto = require("crypto");
32
+ const DEFAULT_INITIAL_INPUT_TIMEOUT_MS = 3e4;
33
+ const expressFactory = express;
34
+ function isRecord(value) {
35
+ return Boolean(value) && typeof value === "object";
36
+ }
37
+ function errorMessage(error, fallback) {
38
+ return isRecord(error) && typeof error.message === "string" ? error.message : fallback;
39
+ }
40
+ function errorCode(error, fallback) {
41
+ return isRecord(error) && error.code ? String(error.code) : fallback;
42
+ }
43
+ function controlError(code, message) {
44
+ return Object.assign(new Error(message), { code });
45
+ }
46
+ function isRequestedRuntimeMode(value) {
47
+ return value === "acp" || value === "chat";
48
+ }
49
+ function ensureTrailingNewline(value) {
50
+ const text = String(value || "");
51
+ return text.endsWith("\r") || text.endsWith("\n") ? text : `${text}\r`;
52
+ }
53
+ function findAgent(state, agentId) {
54
+ return state.agents.find((agent) => agent.id === agentId) || null;
55
+ }
56
+ function normalizeTail(value, fallback = 4e3) {
57
+ const tail = Number(value);
58
+ if (!Number.isFinite(tail)) return fallback;
59
+ return Math.max(0, Math.min(1e5, Math.floor(tail)));
60
+ }
61
+ function stableJsonValue(value) {
62
+ if (Array.isArray(value)) return value.map(stableJsonValue);
63
+ if (!value || typeof value !== "object") return value;
64
+ return Object.keys(value).sort().reduce((result, key) => {
65
+ result[key] = stableJsonValue(value[key]);
66
+ return result;
67
+ }, {});
68
+ }
69
+ function requestSignature(value) {
70
+ return crypto.createHash("sha256").update(JSON.stringify(stableJsonValue(value))).digest("hex");
71
+ }
72
+ function terminalReadinessOptions(agent) {
73
+ return {
74
+ command: agent.command,
75
+ cwd: agent.terminalStatus?.cwd || agent.cwd,
76
+ status: agent.status === "running" ? "running" : agent.status,
77
+ title: agent.terminalStatus?.title || agent.sessionTitle || "",
78
+ previewText: agent.previewText || "",
79
+ terminalBusy: typeof agent.terminalBusy === "boolean" ? agent.terminalBusy : null,
80
+ shellLastEvent: agent.terminalStatus?.source === "shell-status-marker" ? "finish" : "",
81
+ shellLastExitCode: agent.terminalStatus?.lastExitCode,
82
+ shellCommand: agent.terminalStatus?.runningCommand || ""
83
+ };
84
+ }
85
+ function waitForTerminalInputReadiness(agentManager, agentId, options = {}) {
86
+ const expectedStartedAt = Number(options.expectedStartedAt);
87
+ const initialRuntimeEpoch = typeof options.expectedRuntimeEpoch === "string" ? options.expectedRuntimeEpoch : "";
88
+ const timeoutMs = typeof options.timeoutMs === "number" && Number.isFinite(options.timeoutMs) ? Math.max(1, options.timeoutMs) : DEFAULT_INITIAL_INPUT_TIMEOUT_MS;
89
+ return new Promise((resolve, reject) => {
90
+ let settled = false;
91
+ let expectedRuntimeEpoch = initialRuntimeEpoch;
92
+ const removeUpdateListener = () => {
93
+ if (typeof agentManager.off === "function") agentManager.off("update", inspect);
94
+ else if (typeof agentManager.removeListener === "function") agentManager.removeListener("update", inspect);
95
+ };
96
+ const finish = (error, value) => {
97
+ if (settled) return;
98
+ settled = true;
99
+ clearTimeout(timeout);
100
+ removeUpdateListener();
101
+ if (error) reject(error);
102
+ else if (value) resolve(value);
103
+ };
104
+ const fail = (code, message) => {
105
+ finish(controlError(code, message));
106
+ };
107
+ const inspect = () => {
108
+ const agent = findAgent(agentManager.getState(), agentId);
109
+ if (!agent) {
110
+ fail("agent-removed", "Agent disappeared before its initial Terminal task was delivered");
111
+ return;
112
+ }
113
+ if (Number(agent.startedAt) !== expectedStartedAt) {
114
+ fail("runtime-replaced", "Agent runtime was replaced before its initial Terminal task was delivered");
115
+ return;
116
+ }
117
+ if (agent.terminalInputReceived === true) {
118
+ fail("terminal-already-used", "Terminal received user input before its initial task was delivered");
119
+ return;
120
+ }
121
+ if (agent.status === "dead" || agent.status === "stopped") {
122
+ fail("runtime-exited", "Agent exited before its initial Terminal task was delivered");
123
+ return;
124
+ }
125
+ const runtimeEpoch = typeof agent.runtimeEpoch === "string" ? agent.runtimeEpoch : "";
126
+ if (!runtimeEpoch) return;
127
+ if (expectedRuntimeEpoch && runtimeEpoch !== expectedRuntimeEpoch) {
128
+ fail("runtime-replaced", "Agent runtime changed before its initial Terminal task was delivered");
129
+ return;
130
+ }
131
+ expectedRuntimeEpoch = runtimeEpoch;
132
+ if (agent.status !== "running" || !(0, import_terminal_status.terminalInputReady)(terminalReadinessOptions(agent))) return;
133
+ finish(null, {
134
+ expectedStartedAt,
135
+ expectedRuntimeEpoch
136
+ });
137
+ };
138
+ const timeout = setTimeout(() => {
139
+ fail("initial-input-timeout", "Terminal did not become ready for its initial task before the timeout");
140
+ }, timeoutMs);
141
+ timeout.unref?.();
142
+ if (typeof agentManager.on === "function") agentManager.on("update", inspect);
143
+ Promise.resolve().then(inspect);
144
+ });
145
+ }
146
+ function createControlRouter(agentManager, options = {}) {
147
+ const router = expressFactory.Router();
148
+ const createRequestAdmissions = /* @__PURE__ */ new Map();
149
+ const notifyUpdate = typeof options.notifyUpdate === "function" ? options.notifyUpdate : () => {
150
+ };
151
+ const initialInputTimeoutMs = typeof options.initialInputTimeoutMs === "number" && Number.isFinite(options.initialInputTimeoutMs) ? Math.max(1, options.initialInputTimeoutMs) : DEFAULT_INITIAL_INPUT_TIMEOUT_MS;
152
+ async function runTerminalMutation(agentId, expectedRuntimeEpoch, operation) {
153
+ const current = findAgent(agentManager.getState(), agentId);
154
+ if (!current || current.runtimeEpoch !== expectedRuntimeEpoch) {
155
+ return { status: "rejected", reason: "runtime-epoch-mismatch" };
156
+ }
157
+ return operation({ expectedRuntimeEpoch });
158
+ }
159
+ router.use(expressFactory.json({ limit: "1mb" }));
160
+ router.get("/agents", (req, res) => {
161
+ const state = agentManager.getState();
162
+ const parent = typeof req.query.parent === "string" ? req.query.parent : "";
163
+ const agents = parent ? state.agents.filter((agent) => agent.parentAgentId === parent) : state.agents;
164
+ res.json({
165
+ mainAgentId: state.mainAgentId,
166
+ agents
167
+ });
168
+ });
169
+ router.post("/agents", (req, res) => {
170
+ const body = req.body || {};
171
+ const command = typeof body.command === "string" ? body.command.trim() : "";
172
+ const workspace = typeof body.workspace === "string" ? body.workspace : null;
173
+ const task = typeof body.task === "string" ? body.task.trim() : "";
174
+ const initialInput = typeof body.initialInput === "string" ? body.initialInput : task;
175
+ const createRequestId = typeof body.requestId === "string" && body.requestId.trim() ? body.requestId : req.get("Idempotency-Key") || "";
176
+ const controlRequestSignature = requestSignature(body);
177
+ if (!command) {
178
+ res.status(400).json({ error: "command is required" });
179
+ return;
180
+ }
181
+ const pendingRequest = createRequestId ? createRequestAdmissions.get(createRequestId) : null;
182
+ if (pendingRequest) {
183
+ if (pendingRequest.signature !== controlRequestSignature) {
184
+ res.status(409).json({
185
+ error: `Create request ${createRequestId} is already in progress with different parameters`
186
+ });
187
+ return;
188
+ }
189
+ void pendingRequest.promise.then((outcome) => {
190
+ res.status(outcome.status).json(outcome.body);
191
+ });
192
+ return;
193
+ }
194
+ agentManager.startAgent(command, workspace, (agentId, error, metadata = {}) => {
195
+ if (error) {
196
+ res.status(400).json({ error });
197
+ return;
198
+ }
199
+ if (!agentId) {
200
+ res.status(500).json({ error: "failed to start agent" });
201
+ return;
202
+ }
203
+ if (metadata.deduplicated === true) {
204
+ const recorded = metadata.createResult?.controlApi;
205
+ if (recorded && Number.isInteger(recorded.status) && recorded.body) {
206
+ res.status(recorded.status).json(recorded.body);
207
+ return;
208
+ }
209
+ const admitted = createRequestId ? createRequestAdmissions.get(createRequestId) : null;
210
+ if (admitted) {
211
+ void admitted.promise.then((outcome) => {
212
+ res.status(outcome.status).json(outcome.body);
213
+ });
214
+ return;
215
+ }
216
+ res.status(409).json({
217
+ error: "Create succeeded, but the initial-input outcome is unknown; input was not replayed",
218
+ code: "create-result-unknown",
219
+ agentId
220
+ });
221
+ return;
222
+ }
223
+ const deliveryPromise = (async () => {
224
+ if (!initialInput) {
225
+ notifyUpdate();
226
+ return {
227
+ status: 201,
228
+ body: { agentId, initialInputDelivered: false }
229
+ };
230
+ }
231
+ const started = findAgent(agentManager.getState(), agentId);
232
+ if (!started) throw Object.assign(new Error("Agent disappeared before initial input delivery"), {
233
+ code: "agent-removed"
234
+ });
235
+ const structuredRuntime = (0, import_agent_runtime_binding.runtimeKind)(started) !== "terminal";
236
+ if (structuredRuntime) {
237
+ await agentManager.sendComposerMessage(agentId, initialInput);
238
+ notifyUpdate();
239
+ return {
240
+ status: 201,
241
+ body: { agentId, initialInputDelivered: true, inputMode: "structured" }
242
+ };
243
+ }
244
+ const readiness = await waitForTerminalInputReadiness(agentManager, agentId, {
245
+ expectedStartedAt: started.startedAt,
246
+ expectedRuntimeEpoch: started.runtimeEpoch,
247
+ timeoutMs: initialInputTimeoutMs
248
+ });
249
+ const result = await runTerminalMutation(
250
+ agentId,
251
+ readiness.expectedRuntimeEpoch,
252
+ async ({ expectedRuntimeEpoch }) => {
253
+ const current = findAgent(agentManager.getState(), agentId);
254
+ if (!current || Number(current.startedAt) !== readiness.expectedStartedAt || current.runtimeEpoch !== readiness.expectedRuntimeEpoch || current.terminalInputReceived === true || current.status !== "running" || !(0, import_terminal_status.terminalInputReady)(terminalReadinessOptions(current))) {
255
+ return { status: "rejected", reason: "startup-state-changed" };
256
+ }
257
+ return agentManager.sendInput(agentId, ensureTrailingNewline(initialInput), {
258
+ expectedRuntimeEpoch
259
+ });
260
+ }
261
+ );
262
+ if (!result || result.status === "rejected" || result.status === "input-rejected") {
263
+ const reason = result?.reason || "initial-input-rejected";
264
+ throw Object.assign(new Error(`Initial Terminal task was not delivered: ${reason}`), { code: reason });
265
+ }
266
+ notifyUpdate();
267
+ return {
268
+ status: 201,
269
+ body: { agentId, initialInputDelivered: true, inputMode: "terminal" }
270
+ };
271
+ })().catch((deliveryError) => {
272
+ const code = errorCode(deliveryError, "initial-input-failed");
273
+ const status = code === "initial-input-timeout" ? 504 : 409;
274
+ return {
275
+ status,
276
+ body: {
277
+ error: errorMessage(deliveryError, "Initial input delivery failed"),
278
+ code,
279
+ agentId,
280
+ initialInputDelivered: false
281
+ }
282
+ };
283
+ });
284
+ const durableDeliveryPromise = deliveryPromise.then((outcome) => {
285
+ if (!createRequestId) return outcome;
286
+ let persisted;
287
+ try {
288
+ persisted = agentManager.recordCreateRequestResult(
289
+ agentId,
290
+ createRequestId,
291
+ { controlApi: outcome }
292
+ );
293
+ } catch (error2) {
294
+ persisted = { error: errorMessage(error2, "Create result persistence failed") };
295
+ }
296
+ if (persisted?.error) {
297
+ return {
298
+ status: 409,
299
+ body: {
300
+ error: `${persisted.error}; Create outcome was not persisted and initial input was not replayed`,
301
+ code: "create-result-not-durable",
302
+ agentId,
303
+ initialInputDelivered: outcome.body?.initialInputDelivered === true,
304
+ createResultDurable: false
305
+ }
306
+ };
307
+ }
308
+ return outcome;
309
+ });
310
+ if (createRequestId) {
311
+ const admission = {
312
+ signature: controlRequestSignature,
313
+ promise: durableDeliveryPromise
314
+ };
315
+ createRequestAdmissions.set(createRequestId, admission);
316
+ void durableDeliveryPromise.finally(() => {
317
+ if (createRequestAdmissions.get(createRequestId) === admission) {
318
+ createRequestAdmissions.delete(createRequestId);
319
+ }
320
+ }).catch(() => {
321
+ });
322
+ }
323
+ void durableDeliveryPromise.then((outcome) => {
324
+ res.status(outcome.status).json(outcome.body);
325
+ });
326
+ }, {
327
+ wantsMain: false,
328
+ parentAgentId: typeof body.parentAgentId === "string" ? body.parentAgentId : "",
329
+ task,
330
+ source: "control-cli",
331
+ createRequestId,
332
+ createInitialInputSignature: requestSignature(initialInput),
333
+ agentRuntimeMode: isRequestedRuntimeMode(body.agentRuntimeMode) ? body.agentRuntimeMode : "terminal",
334
+ acpHistoryMode: body.acpHistoryMode === "resume" ? "resume" : "load",
335
+ providerSessionTitle: typeof body.providerSessionTitle === "string" ? body.providerSessionTitle : "",
336
+ ...Array.isArray(body.additionalDirectories) ? { additionalDirectories: body.additionalDirectories } : {},
337
+ ...Array.isArray(body.mcpServers) ? { mcpServers: body.mcpServers } : {},
338
+ dangerouslySkipPermissions: body.dangerouslySkipPermissions === true
339
+ });
340
+ });
341
+ router.post("/agents/:agentId/input", async (req, res) => {
342
+ const agentId = req.params.agentId;
343
+ const state = agentManager.getState();
344
+ if (!findAgent(state, agentId)) {
345
+ res.status(404).json({ error: "agent not found" });
346
+ return;
347
+ }
348
+ if (agentManager.agentSupportsTerminalInput?.(agentId) === false) {
349
+ res.status(409).json({ error: "raw input is only available for Terminal Agents" });
350
+ return;
351
+ }
352
+ const currentAgent = findAgent(agentManager.getState(), agentId);
353
+ const expectedRuntimeEpoch = typeof currentAgent?.runtimeEpoch === "string" ? currentAgent.runtimeEpoch : "";
354
+ if (!expectedRuntimeEpoch) {
355
+ res.status(409).json({ error: "terminal runtime is not ready" });
356
+ return;
357
+ }
358
+ const input = typeof req.body.input === "string" ? req.body.input : "";
359
+ const result = await runTerminalMutation(agentId, expectedRuntimeEpoch, ({ expectedRuntimeEpoch: epoch }) => agentManager.sendInput(agentId, input, { expectedRuntimeEpoch: epoch }));
360
+ if (!result || result.status === "rejected" || result.status === "input-rejected") {
361
+ res.status(409).json({ error: result?.reason || "terminal input rejected" });
362
+ return;
363
+ }
364
+ res.json({ success: true });
365
+ });
366
+ router.post("/agents/:agentId/clear", async (req, res) => {
367
+ const agentId = req.params.agentId;
368
+ const state = agentManager.getState();
369
+ if (!findAgent(state, agentId)) {
370
+ res.status(404).json({ error: "agent not found" });
371
+ return;
372
+ }
373
+ if (agentManager.agentSupportsTerminalInput?.(agentId) === false) {
374
+ res.status(409).json({ error: "clear is only available for Terminal Agents" });
375
+ return;
376
+ }
377
+ const currentAgent = findAgent(agentManager.getState(), agentId);
378
+ const expectedRuntimeEpoch = typeof currentAgent?.runtimeEpoch === "string" ? currentAgent.runtimeEpoch : "";
379
+ if (!expectedRuntimeEpoch) {
380
+ res.status(409).json({ error: "terminal runtime is not ready" });
381
+ return;
382
+ }
383
+ const result = await runTerminalMutation(agentId, expectedRuntimeEpoch, ({ expectedRuntimeEpoch: epoch }) => agentManager.clearAgentSessionBuffer(agentId, { expectedRuntimeEpoch: epoch }));
384
+ if (!result || result.status === "rejected" || result.cleared === false) {
385
+ res.status(409).json({ error: result?.reason || result?.error || "terminal clear rejected" });
386
+ return;
387
+ }
388
+ notifyUpdate();
389
+ res.json({ success: Boolean(result && result.cleared), ...result });
390
+ });
391
+ router.get("/agents/:agentId/output", async (req, res) => {
392
+ const agentId = req.params.agentId;
393
+ const state = agentManager.getState();
394
+ if (!findAgent(state, agentId)) {
395
+ res.status(404).json({ error: "agent not found" });
396
+ return;
397
+ }
398
+ const output = await agentManager.getAgentSessionText(agentId);
399
+ const tail = normalizeTail(req.query.tail);
400
+ const text = tail > 0 ? String(output || "").slice(-tail) : String(output || "");
401
+ res.type("text/plain");
402
+ res.send(text);
403
+ });
404
+ router.delete("/agents/:agentId", async (req, res) => {
405
+ const agentId = req.params.agentId;
406
+ const recordHistory = req.query?.recordHistory !== "0";
407
+ let requested;
408
+ try {
409
+ requested = await agentManager.requestKillAgent(agentId, { recordHistory });
410
+ } catch (error) {
411
+ res.status(503).json({
412
+ error: errorMessage(error, "Agent lifecycle recovery is unavailable"),
413
+ retryable: true
414
+ });
415
+ return;
416
+ }
417
+ const result = requested.result;
418
+ if (result?.error) {
419
+ res.status(409).json({ error: result.error });
420
+ return;
421
+ }
422
+ if (result?.accepted) {
423
+ void requested.completion.finally(() => notifyUpdate()).catch(() => {
424
+ });
425
+ res.status(202).json(result);
426
+ return;
427
+ }
428
+ notifyUpdate();
429
+ res.json({ success: true, agentId, ...result });
430
+ });
431
+ return router;
432
+ }
433
+ // Annotate the CommonJS export names for ESM import in node:
434
+ 0 && (module.exports = {
435
+ DEFAULT_INITIAL_INPUT_TIMEOUT_MS,
436
+ createControlRouter,
437
+ ensureTrailingNewline,
438
+ waitForTerminalInputReadiness
439
+ });
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Cua AI, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,204 @@
1
+ // Generated by scripts/build-backend-runtime.ts. Do not edit.
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var executable_discovery_exports = {};
21
+ __export(executable_discovery_exports, {
22
+ clearExecutableVersionCache: () => clearExecutableVersionCache,
23
+ compareCliVersions: () => compareCliVersions,
24
+ getPathDirectories: () => getPathDirectories,
25
+ getPreferredExecutableCandidates: () => getPreferredExecutableCandidates,
26
+ isExecutable: () => isExecutable,
27
+ listAvailableAgents: () => listAvailableAgents,
28
+ parseCliVersion: () => parseCliVersion,
29
+ readExecutableCliVersion: () => readExecutableCliVersion,
30
+ resolveAgentExecutable: () => resolveAgentExecutable,
31
+ resolveCompatibleCodexExecutable: () => resolveCompatibleCodexExecutable
32
+ });
33
+ module.exports = __toCommonJS(executable_discovery_exports);
34
+ var import_cli_agents = require("./cli-agents.cjs");
35
+ const fs = require("fs");
36
+ const path = require("path");
37
+ const { execFileSync } = require("child_process");
38
+ const DEFAULT_CODEX_APP_BIN = "/Applications/Codex.app/Contents/Resources/codex";
39
+ const DEFAULT_CHATGPT_APP_CODEX_BIN = "/Applications/ChatGPT.app/Contents/Resources/codex";
40
+ const executableVersionCache = /* @__PURE__ */ new Map();
41
+ function getPathDirectories(pathEnv = process.env.PATH || "") {
42
+ return String(pathEnv).split(path.delimiter).map((entry) => entry.trim()).filter(Boolean);
43
+ }
44
+ function isExecutable(filePath) {
45
+ try {
46
+ fs.accessSync(filePath, fs.constants.X_OK);
47
+ return true;
48
+ } catch {
49
+ return false;
50
+ }
51
+ }
52
+ function parseCliVersion(value) {
53
+ const match = String(value || "").match(/(\d+\.\d+\.\d+)/);
54
+ return match ? match[1] : "";
55
+ }
56
+ function compareCliVersions(left, right) {
57
+ const leftParts = parseCliVersion(left).split(".").map((part) => Number(part));
58
+ const rightParts = parseCliVersion(right).split(".").map((part) => Number(part));
59
+ if (leftParts.length !== 3 || rightParts.length !== 3) return 0;
60
+ for (let index = 0; index < 3; index += 1) {
61
+ const delta = leftParts[index] - rightParts[index];
62
+ if (delta !== 0) return delta;
63
+ }
64
+ return 0;
65
+ }
66
+ function readExecutableCliVersion(filePath, runner = execFileSync) {
67
+ try {
68
+ return parseCliVersion(runner(filePath, ["--version"], {
69
+ encoding: "utf8",
70
+ stdio: ["ignore", "pipe", "pipe"],
71
+ timeout: 2e3
72
+ }));
73
+ } catch {
74
+ return "";
75
+ }
76
+ }
77
+ function getExecutableVersionCacheKey(filePath) {
78
+ try {
79
+ const stats = fs.statSync(filePath);
80
+ return `${filePath}:${stats.size}:${stats.mtimeMs}`;
81
+ } catch {
82
+ return `${filePath}:missing`;
83
+ }
84
+ }
85
+ function readCachedExecutableCliVersion(filePath, readVersion, options = {}) {
86
+ if (options.cacheVersions === false) {
87
+ return readVersion(filePath);
88
+ }
89
+ const cacheToken = getExecutableVersionCacheKey(filePath);
90
+ const cachedVersion = executableVersionCache.get(cacheToken);
91
+ if (cachedVersion !== void 0) return cachedVersion;
92
+ const version = readVersion(filePath);
93
+ const prefix = `${filePath}:`;
94
+ Array.from(executableVersionCache.keys()).filter((key) => key.startsWith(prefix) && key !== cacheToken).forEach((key) => executableVersionCache.delete(key));
95
+ executableVersionCache.set(cacheToken, version);
96
+ return version;
97
+ }
98
+ function clearExecutableVersionCache() {
99
+ executableVersionCache.clear();
100
+ }
101
+ function getPreferredExecutableCandidates(agentName, pathEnv = process.env.PATH || "") {
102
+ const pathCandidates = getPathDirectories(pathEnv).map((dir) => path.join(dir, agentName));
103
+ if (agentName === "claude") {
104
+ return [
105
+ process.env.FARMING_CLAUDE_BIN || "",
106
+ process.env.CLAUDE_CODE_EXECUTABLE || "",
107
+ ...pathCandidates
108
+ ].filter(Boolean);
109
+ }
110
+ if (agentName !== "codex") return pathCandidates;
111
+ return [
112
+ process.env.FARMING_CODEX_BIN || "",
113
+ DEFAULT_CODEX_APP_BIN,
114
+ DEFAULT_CHATGPT_APP_CODEX_BIN,
115
+ ...pathCandidates
116
+ ].filter(Boolean);
117
+ }
118
+ function resolveAgentExecutable(agentName, pathEnv = process.env.PATH || "") {
119
+ return getPreferredExecutableCandidates(agentName, pathEnv).find(isExecutable) || "";
120
+ }
121
+ function resolveCompatibleCodexExecutable(requiredVersion = "", pathEnv = process.env.PATH || "", options = {}) {
122
+ const normalizedRequired = parseCliVersion(requiredVersion);
123
+ const readVersion = typeof options.readVersion === "function" ? options.readVersion : readExecutableCliVersion;
124
+ const rawCandidates = Array.isArray(options.candidates) ? options.candidates : getPreferredExecutableCandidates("codex", pathEnv);
125
+ const seen = /* @__PURE__ */ new Set();
126
+ const inspected = rawCandidates.filter(Boolean).filter((candidate) => {
127
+ if (seen.has(candidate)) return false;
128
+ seen.add(candidate);
129
+ return true;
130
+ }).filter(isExecutable).map((candidate) => ({
131
+ path: candidate,
132
+ version: readCachedExecutableCliVersion(candidate, readVersion, options)
133
+ }));
134
+ if (inspected.length === 0) {
135
+ return {
136
+ path: "",
137
+ version: "",
138
+ requiredVersion: normalizedRequired,
139
+ compatible: false,
140
+ error: "Codex executable not found"
141
+ };
142
+ }
143
+ if (!normalizedRequired) {
144
+ const selected = inspected[0];
145
+ return {
146
+ path: selected.path,
147
+ version: selected.version,
148
+ requiredVersion: "",
149
+ compatible: true,
150
+ error: ""
151
+ };
152
+ }
153
+ const compatibleKnown = inspected.find((candidate) => candidate.version && compareCliVersions(candidate.version, normalizedRequired) >= 0);
154
+ if (compatibleKnown) {
155
+ return {
156
+ path: compatibleKnown.path,
157
+ version: compatibleKnown.version,
158
+ requiredVersion: normalizedRequired,
159
+ compatible: true,
160
+ error: ""
161
+ };
162
+ }
163
+ const unknownVersion = inspected.find((candidate) => !candidate.version);
164
+ if (unknownVersion) {
165
+ return {
166
+ path: unknownVersion.path,
167
+ version: "",
168
+ requiredVersion: normalizedRequired,
169
+ compatible: true,
170
+ error: ""
171
+ };
172
+ }
173
+ const newestKnown = inspected.filter((candidate) => candidate.version).sort((left, right) => compareCliVersions(right.version, left.version))[0];
174
+ const newestVersion = newestKnown ? newestKnown.version : "";
175
+ return {
176
+ path: newestKnown ? newestKnown.path : inspected[0].path,
177
+ version: newestVersion,
178
+ requiredVersion: normalizedRequired,
179
+ compatible: false,
180
+ error: newestVersion ? `Codex CLI ${newestVersion} is older than this session (${normalizedRequired}). Update Codex or set FARMING_CODEX_BIN to a newer Codex executable.` : `Codex CLI version could not be verified for session ${normalizedRequired}. Update Codex or set FARMING_CODEX_BIN to a newer Codex executable.`
181
+ };
182
+ }
183
+ function listAvailableAgents(pathEnv = process.env.PATH || "") {
184
+ return (0, import_cli_agents.getUserLaunchAgents)().map((agent) => ({
185
+ ...agent,
186
+ resolvedPath: resolveAgentExecutable(agent.command || agent.name, pathEnv)
187
+ })).filter((agent) => Boolean(agent.resolvedPath)).map((agent) => ({
188
+ ...agent,
189
+ available: true
190
+ }));
191
+ }
192
+ // Annotate the CommonJS export names for ESM import in node:
193
+ 0 && (module.exports = {
194
+ clearExecutableVersionCache,
195
+ compareCliVersions,
196
+ getPathDirectories,
197
+ getPreferredExecutableCandidates,
198
+ isExecutable,
199
+ listAvailableAgents,
200
+ parseCliVersion,
201
+ readExecutableCliVersion,
202
+ resolveAgentExecutable,
203
+ resolveCompatibleCodexExecutable
204
+ });