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
@@ -23366,6 +23366,9 @@ function createAgentTextThoughtChunk(text, messageId, meta3) {
23366
23366
  var LEGACY_SET_SESSION_MODEL_METHOD = "session/set_model";
23367
23367
  var GOAL_CONTROL_METHOD = "_codex/session/goal_control";
23368
23368
  var STEER_METHOD = "_codex/session/steer";
23369
+ var SUBAGENT_STATE_VERSION = 1;
23370
+ var MAX_SUBAGENT_THREADS = 128;
23371
+ var SUBAGENT_READ_CONCURRENCY = 8;
23369
23372
  function isExtMethodRequest(request) {
23370
23373
  return request.method === "authentication/status" || request.method === "authentication/logout" || request.method === LEGACY_SET_SESSION_MODEL_METHOD || request.method === GOAL_CONTROL_METHOD || request.method === STEER_METHOD;
23371
23374
  }
@@ -26124,6 +26127,54 @@ var CodexAcpClient = class {
26124
26127
  const response = await this.codexClient.threadGoalGet({ threadId: sessionId });
26125
26128
  return response?.goal ?? null;
26126
26129
  }
26130
+ onClientTransportEvent(callback) {
26131
+ this.codexClient.onClientTransportEvent(callback);
26132
+ }
26133
+ async listSubagentThreads(rootThreadId) {
26134
+ const threads = [];
26135
+ let cursor = null;
26136
+ do {
26137
+ const response = await this.codexClient.threadList({
26138
+ cursor,
26139
+ limit: Math.min(100, MAX_SUBAGENT_THREADS - threads.length),
26140
+ sortKey: "created_at",
26141
+ sortDirection: "asc",
26142
+ useStateDbOnly: true,
26143
+ ancestorThreadId: rootThreadId
26144
+ });
26145
+ threads.push(...response.data.slice(0, MAX_SUBAGENT_THREADS - threads.length));
26146
+ cursor = threads.length < MAX_SUBAGENT_THREADS ? response.nextCursor ?? null : null;
26147
+ } while (cursor);
26148
+ let nextIndex = 0;
26149
+ const resolved = new Array(threads.length);
26150
+ const worker = async () => {
26151
+ while (nextIndex < threads.length) {
26152
+ const index = nextIndex++;
26153
+ const thread = threads[index];
26154
+ const runtimeStatus = thread?.status?.type;
26155
+ if (runtimeStatus === "active" || runtimeStatus === "systemError") {
26156
+ resolved[index] = thread;
26157
+ continue;
26158
+ }
26159
+ try {
26160
+ const response = await this.codexClient.threadRead({
26161
+ threadId: thread.id,
26162
+ includeTurns: true
26163
+ });
26164
+ resolved[index] = response.thread;
26165
+ } catch {
26166
+ resolved[index] = thread;
26167
+ }
26168
+ }
26169
+ };
26170
+ await Promise.all(
26171
+ Array.from(
26172
+ { length: Math.min(SUBAGENT_READ_CONCURRENCY, threads.length) },
26173
+ () => worker()
26174
+ )
26175
+ );
26176
+ return resolved.filter(Boolean);
26177
+ }
26127
26178
  async setGoal(sessionId, objective, onTurnStarted) {
26128
26179
  return await this.codexClient.runGoalSet({
26129
26180
  threadId: sessionId,
@@ -27372,6 +27423,53 @@ function imageBlocks(images) {
27372
27423
  return path6 ? [{ type: "text", text: `[@image](${path6})` }] : [];
27373
27424
  });
27374
27425
  }
27426
+ var MAX_HISTORY_IMAGE_BYTES = 5 * 1024 * 1024;
27427
+ var HISTORY_IMAGE_MIME_BY_EXT = /* @__PURE__ */ new Map([
27428
+ [".gif", "image/gif"],
27429
+ [".jpeg", "image/jpeg"],
27430
+ [".jpg", "image/jpeg"],
27431
+ [".png", "image/png"],
27432
+ [".svg", "image/svg+xml"],
27433
+ [".webp", "image/webp"]
27434
+ ]);
27435
+ function historyImageBlockFromDataUrl(value) {
27436
+ const match = String(value ?? "").match(/^data:(image\/(?:gif|jpe?g|png|svg\+xml|webp));base64,([a-z0-9+/=]+)$/i);
27437
+ if (!match || Math.ceil(match[2].length * 3 / 4) > MAX_HISTORY_IMAGE_BYTES) {
27438
+ return null;
27439
+ }
27440
+ return {
27441
+ type: "image",
27442
+ mimeType: match[1].toLowerCase(),
27443
+ data: match[2]
27444
+ };
27445
+ }
27446
+ async function historyImageBlockFromLocalPath(value) {
27447
+ let filePath = String(value ?? "");
27448
+ if (filePath.startsWith("file://")) {
27449
+ try {
27450
+ filePath = fileURLToPath(filePath);
27451
+ } catch {
27452
+ return null;
27453
+ }
27454
+ }
27455
+ const mimeType = HISTORY_IMAGE_MIME_BY_EXT.get(path5.extname(filePath).toLowerCase());
27456
+ if (!mimeType) {
27457
+ return null;
27458
+ }
27459
+ try {
27460
+ const data = await readFile2(filePath);
27461
+ if (data.length === 0 || data.length > MAX_HISTORY_IMAGE_BYTES) {
27462
+ return null;
27463
+ }
27464
+ return {
27465
+ type: "image",
27466
+ mimeType,
27467
+ data: Buffer2.from(data).toString("base64")
27468
+ };
27469
+ } catch {
27470
+ return null;
27471
+ }
27472
+ }
27375
27473
  function contentBlocksFromResponseContent(content) {
27376
27474
  if (!Array.isArray(content)) {
27377
27475
  return [];
@@ -28171,6 +28269,13 @@ var CodexAcpServer = class _CodexAcpServer {
28171
28269
  closingSessions;
28172
28270
  sessionGenerations;
28173
28271
  sessionOpenGenerations;
28272
+ subagentSnapshots;
28273
+ subagentRootByThreadId;
28274
+ subagentRefreshTokens;
28275
+ subagentPublishQueues;
28276
+ subagentPublishDirty;
28277
+ subagentRecoveryTimers;
28278
+ subagentRecoveryAttempts;
28174
28279
  constructor(connection, codexAcpClient, defaultAuthRequest, getExitCode, getRecentStderr) {
28175
28280
  this.sessions = /* @__PURE__ */ new Map();
28176
28281
  this.pendingMcpStartupSessions = /* @__PURE__ */ new Map();
@@ -28179,6 +28284,13 @@ var CodexAcpServer = class _CodexAcpServer {
28179
28284
  this.closingSessions = /* @__PURE__ */ new Map();
28180
28285
  this.sessionGenerations = /* @__PURE__ */ new Map();
28181
28286
  this.sessionOpenGenerations = /* @__PURE__ */ new Map();
28287
+ this.subagentSnapshots = /* @__PURE__ */ new Map();
28288
+ this.subagentRootByThreadId = /* @__PURE__ */ new Map();
28289
+ this.subagentRefreshTokens = /* @__PURE__ */ new Map();
28290
+ this.subagentPublishQueues = /* @__PURE__ */ new Map();
28291
+ this.subagentPublishDirty = /* @__PURE__ */ new Set();
28292
+ this.subagentRecoveryTimers = /* @__PURE__ */ new Map();
28293
+ this.subagentRecoveryAttempts = /* @__PURE__ */ new Map();
28182
28294
  this.connection = connection;
28183
28295
  this.codexAcpClient = codexAcpClient;
28184
28296
  this.defaultAuthRequest = defaultAuthRequest ?? null;
@@ -28194,6 +28306,9 @@ var CodexAcpServer = class _CodexAcpServer {
28194
28306
  (operation) => this.runWithProcessCheck(operation),
28195
28307
  () => this.refreshSessionsAuthState(null)
28196
28308
  );
28309
+ this.codexAcpClient.onClientTransportEvent((event) => {
28310
+ this.handleSubagentTransportEvent(event);
28311
+ });
28197
28312
  }
28198
28313
  async initialize(_params) {
28199
28314
  logger.log("Initialize request received");
@@ -28234,7 +28349,8 @@ var CodexAcpServer = class _CodexAcpServer {
28234
28349
  },
28235
28350
  _meta: {
28236
28351
  codex: {
28237
- steer: { method: STEER_METHOD, version: 1 }
28352
+ steer: { method: STEER_METHOD, version: 1 },
28353
+ subagents: { version: SUBAGENT_STATE_VERSION }
28238
28354
  }
28239
28355
  }
28240
28356
  },
@@ -28513,6 +28629,7 @@ You have been logged out. Please try again.`);
28513
28629
  thread
28514
28630
  } = await this.getOrCreateSessionWithHistory(params);
28515
28631
  await this.streamThreadHistory(sessionId, thread);
28632
+ this.refreshSubagentSnapshotAsync(sessionId);
28516
28633
  logger.log("Session loaded", {
28517
28634
  sessionId,
28518
28635
  modelId: modelState.currentModelId,
@@ -28548,6 +28665,7 @@ You have been logged out. Please try again.`);
28548
28665
  modelId: modelState.currentModelId,
28549
28666
  availableModelCount: modelState.availableModels.length
28550
28667
  });
28668
+ this.refreshSubagentSnapshotAsync(sessionId);
28551
28669
  return {
28552
28670
  models: modelState,
28553
28671
  modes: modeState,
@@ -28589,6 +28707,7 @@ You have been logged out. Please try again.`);
28589
28707
  await activePrompt.completion;
28590
28708
  }
28591
28709
  await this.runWithProcessCheck(() => this.codexAcpClient.closeSession(params.sessionId));
28710
+ this.clearSubagentSnapshot(params.sessionId);
28592
28711
  logger.log("Session closed", { sessionId: params.sessionId });
28593
28712
  } finally {
28594
28713
  if (this.getSessionGeneration(params.sessionId) === closeGeneration) {
@@ -28601,6 +28720,256 @@ You have been logged out. Please try again.`);
28601
28720
  }
28602
28721
  return {};
28603
28722
  }
28723
+ clearSubagentSnapshot(rootThreadId) {
28724
+ const snapshot = this.subagentSnapshots.get(rootThreadId);
28725
+ for (const threadId of snapshot?.agents.keys() ?? []) {
28726
+ if (this.subagentRootByThreadId.get(threadId) === rootThreadId) {
28727
+ this.subagentRootByThreadId.delete(threadId);
28728
+ }
28729
+ }
28730
+ this.subagentSnapshots.delete(rootThreadId);
28731
+ this.subagentRefreshTokens.delete(rootThreadId);
28732
+ this.subagentPublishQueues.delete(rootThreadId);
28733
+ this.subagentPublishDirty.delete(rootThreadId);
28734
+ const recoveryTimer = this.subagentRecoveryTimers.get(rootThreadId);
28735
+ if (recoveryTimer) clearTimeout(recoveryTimer);
28736
+ this.subagentRecoveryTimers.delete(rootThreadId);
28737
+ this.subagentRecoveryAttempts.delete(rootThreadId);
28738
+ }
28739
+ rootThreadIdForSubagent(threadId) {
28740
+ if (this.sessions.has(threadId)) return threadId;
28741
+ return this.subagentRootByThreadId.get(threadId) ?? null;
28742
+ }
28743
+ subagentStatusFromThread(thread) {
28744
+ const runtimeStatus = thread?.status?.type;
28745
+ if (runtimeStatus === "active") return "running";
28746
+ if (runtimeStatus === "systemError") return "errored";
28747
+ const lastTurn = Array.isArray(thread?.turns) ? thread.turns.at(-1) : null;
28748
+ switch (lastTurn?.status) {
28749
+ case "completed":
28750
+ return "completed";
28751
+ case "interrupted":
28752
+ return "interrupted";
28753
+ case "failed":
28754
+ return "errored";
28755
+ case "inProgress":
28756
+ return "running";
28757
+ default:
28758
+ return "pendingInit";
28759
+ }
28760
+ }
28761
+ subagentSnapshotEntry(thread) {
28762
+ return {
28763
+ threadId: String(thread.id),
28764
+ parentThreadId: typeof thread.parentThreadId === "string" ? thread.parentThreadId : null,
28765
+ name: typeof thread.agentNickname === "string" && thread.agentNickname.trim()
28766
+ ? thread.agentNickname.trim()
28767
+ : typeof thread.agentRole === "string" && thread.agentRole.trim()
28768
+ ? thread.agentRole.trim()
28769
+ : "",
28770
+ status: this.subagentStatusFromThread(thread)
28771
+ };
28772
+ }
28773
+ refreshSubagentSnapshotAsync(rootThreadId) {
28774
+ const refreshToken = this.subagentRefreshTokens.get(rootThreadId) ?? 0;
28775
+ void this.runWithProcessCheck(() => this.codexAcpClient.listSubagentThreads(rootThreadId)).then((threads) => {
28776
+ if (!this.sessions.has(rootThreadId)) return;
28777
+ if ((this.subagentRefreshTokens.get(rootThreadId) ?? 0) !== refreshToken) {
28778
+ this.refreshSubagentSnapshotAsync(rootThreadId);
28779
+ return;
28780
+ }
28781
+ const previous = this.subagentSnapshots.get(rootThreadId);
28782
+ const agents = new Map(
28783
+ threads.map((thread) => {
28784
+ const entry = this.subagentSnapshotEntry(thread);
28785
+ return [entry.threadId, entry];
28786
+ })
28787
+ );
28788
+ for (const threadId of previous?.agents.keys() ?? []) {
28789
+ if (!agents.has(threadId) && this.subagentRootByThreadId.get(threadId) === rootThreadId) {
28790
+ this.subagentRootByThreadId.delete(threadId);
28791
+ }
28792
+ }
28793
+ for (const threadId of agents.keys()) {
28794
+ this.subagentRootByThreadId.set(threadId, rootThreadId);
28795
+ }
28796
+ const snapshot = {
28797
+ revision: (previous?.revision ?? 0) + 1,
28798
+ agents
28799
+ };
28800
+ this.subagentSnapshots.set(rootThreadId, snapshot);
28801
+ this.publishSubagentUpdate(rootThreadId, "snapshot", [...agents.values()], snapshot.revision);
28802
+ }).catch((error51) => {
28803
+ logger.error(`Failed to reconcile Codex subagents for session ${rootThreadId}`, error51);
28804
+ });
28805
+ }
28806
+ publishSubagentUpdate(rootThreadId, kind, agents, revision) {
28807
+ if (!this.sessions.has(rootThreadId)) return;
28808
+ const run = async () => {
28809
+ const dirty = this.subagentPublishDirty.has(rootThreadId);
28810
+ const current = this.subagentSnapshots.get(rootThreadId);
28811
+ const updateKind = dirty ? "snapshot" : kind;
28812
+ const updateAgents = dirty && current ? [...current.agents.values()] : agents;
28813
+ const updateRevision = dirty && current ? current.revision : revision;
28814
+ const session = new ACPSessionConnection(this.connection, rootThreadId);
28815
+ await session.update({
28816
+ sessionUpdate: "session_info_update",
28817
+ _meta: {
28818
+ codex: {
28819
+ subagents: {
28820
+ version: SUBAGENT_STATE_VERSION,
28821
+ rootThreadId,
28822
+ revision: updateRevision,
28823
+ kind: updateKind,
28824
+ agents: updateAgents
28825
+ }
28826
+ }
28827
+ }
28828
+ });
28829
+ this.subagentPublishDirty.delete(rootThreadId);
28830
+ this.subagentRecoveryAttempts.delete(rootThreadId);
28831
+ const recoveryTimer = this.subagentRecoveryTimers.get(rootThreadId);
28832
+ if (recoveryTimer) clearTimeout(recoveryTimer);
28833
+ this.subagentRecoveryTimers.delete(rootThreadId);
28834
+ };
28835
+ const previous = this.subagentPublishQueues.get(rootThreadId);
28836
+ const next = (previous ? previous.then(run, run) : run()).catch((error51) => {
28837
+ logger.error(`Failed to publish Codex subagent state for session ${rootThreadId}`, error51);
28838
+ this.subagentPublishDirty.add(rootThreadId);
28839
+ this.scheduleSubagentRecovery(rootThreadId);
28840
+ });
28841
+ this.subagentPublishQueues.set(rootThreadId, next);
28842
+ void next.finally(() => {
28843
+ if (this.subagentPublishQueues.get(rootThreadId) === next) {
28844
+ this.subagentPublishQueues.delete(rootThreadId);
28845
+ }
28846
+ });
28847
+ }
28848
+ scheduleSubagentRecovery(rootThreadId) {
28849
+ if (!this.sessions.has(rootThreadId) || this.subagentRecoveryTimers.has(rootThreadId)) return;
28850
+ const attempt = this.subagentRecoveryAttempts.get(rootThreadId) ?? 0;
28851
+ if (attempt >= 3) return;
28852
+ const delays = [100, 500, 1e3];
28853
+ const timer = setTimeout(() => {
28854
+ this.subagentRecoveryTimers.delete(rootThreadId);
28855
+ if (!this.sessions.has(rootThreadId)) {
28856
+ this.subagentPublishDirty.delete(rootThreadId);
28857
+ this.subagentRecoveryAttempts.delete(rootThreadId);
28858
+ return;
28859
+ }
28860
+ if (!this.subagentPublishDirty.has(rootThreadId)) return;
28861
+ this.subagentRecoveryAttempts.set(rootThreadId, attempt + 1);
28862
+ const current = this.subagentSnapshots.get(rootThreadId);
28863
+ if (!current) return;
28864
+ this.publishSubagentUpdate(
28865
+ rootThreadId,
28866
+ "snapshot",
28867
+ [...current.agents.values()],
28868
+ current.revision
28869
+ );
28870
+ }, delays[attempt]);
28871
+ this.subagentRecoveryTimers.set(rootThreadId, timer);
28872
+ }
28873
+ updateSubagent(rootThreadId, entry) {
28874
+ if (!rootThreadId || !entry?.threadId || !this.sessions.has(rootThreadId)) return;
28875
+ const previous = this.subagentSnapshots.get(rootThreadId) ?? {
28876
+ revision: 0,
28877
+ agents: /* @__PURE__ */ new Map()
28878
+ };
28879
+ const existing = previous.agents.get(entry.threadId);
28880
+ const nextEntry = {
28881
+ threadId: entry.threadId,
28882
+ parentThreadId: entry.parentThreadId ?? existing?.parentThreadId ?? null,
28883
+ name: entry.name ?? existing?.name ?? "",
28884
+ status: entry.status ?? existing?.status ?? "pendingInit"
28885
+ };
28886
+ if (
28887
+ existing
28888
+ && existing.parentThreadId === nextEntry.parentThreadId
28889
+ && existing.name === nextEntry.name
28890
+ && existing.status === nextEntry.status
28891
+ ) {
28892
+ return;
28893
+ }
28894
+ const next = {
28895
+ revision: previous.revision + 1,
28896
+ agents: new Map(previous.agents)
28897
+ };
28898
+ next.agents.set(nextEntry.threadId, nextEntry);
28899
+ this.subagentSnapshots.set(rootThreadId, next);
28900
+ this.subagentRootByThreadId.set(nextEntry.threadId, rootThreadId);
28901
+ this.subagentRefreshTokens.set(
28902
+ rootThreadId,
28903
+ (this.subagentRefreshTokens.get(rootThreadId) ?? 0) + 1
28904
+ );
28905
+ this.publishSubagentUpdate(rootThreadId, "delta", [nextEntry], next.revision);
28906
+ }
28907
+ handleSubagentTransportEvent(event) {
28908
+ if (event?.eventType !== "notification") return;
28909
+ const params = event.params ?? {};
28910
+ const method = event.method;
28911
+ if (method === "thread/started") {
28912
+ const thread = params.thread;
28913
+ const parentThreadId = thread?.parentThreadId;
28914
+ const rootThreadId = typeof parentThreadId === "string"
28915
+ ? this.rootThreadIdForSubagent(parentThreadId)
28916
+ : null;
28917
+ if (rootThreadId && thread?.id) {
28918
+ this.updateSubagent(rootThreadId, this.subagentSnapshotEntry(thread));
28919
+ }
28920
+ return;
28921
+ }
28922
+ if (
28923
+ (method === "item/started" || method === "item/completed")
28924
+ && params.item?.type === "subAgentActivity"
28925
+ ) {
28926
+ const parentThreadId = typeof params.threadId === "string" ? params.threadId : "";
28927
+ const rootThreadId = this.rootThreadIdForSubagent(parentThreadId);
28928
+ const childThreadId = params.item.threadId;
28929
+ if (rootThreadId && typeof childThreadId === "string") {
28930
+ this.updateSubagent(rootThreadId, {
28931
+ threadId: childThreadId,
28932
+ parentThreadId,
28933
+ status: "pendingInit"
28934
+ });
28935
+ }
28936
+ return;
28937
+ }
28938
+ const threadId = typeof params.threadId === "string" ? params.threadId : "";
28939
+ const rootThreadId = this.rootThreadIdForSubagent(threadId);
28940
+ if (!rootThreadId || rootThreadId === threadId) return;
28941
+ if (method === "turn/started") {
28942
+ this.updateSubagent(rootThreadId, { threadId, status: "running" });
28943
+ return;
28944
+ }
28945
+ if (method === "turn/completed") {
28946
+ const status = params.turn?.status;
28947
+ this.updateSubagent(rootThreadId, {
28948
+ threadId,
28949
+ status: status === "completed"
28950
+ ? "completed"
28951
+ : status === "interrupted"
28952
+ ? "interrupted"
28953
+ : status === "failed"
28954
+ ? "errored"
28955
+ : "running"
28956
+ });
28957
+ return;
28958
+ }
28959
+ if (method === "thread/status/changed") {
28960
+ const status = params.status?.type;
28961
+ if (status === "active" || status === "systemError") {
28962
+ this.updateSubagent(rootThreadId, {
28963
+ threadId,
28964
+ status: status === "active" ? "running" : "errored"
28965
+ });
28966
+ }
28967
+ return;
28968
+ }
28969
+ if (method === "thread/closed") {
28970
+ this.updateSubagent(rootThreadId, { threadId, status: "shutdown" });
28971
+ }
28972
+ }
28604
28973
  async deleteSession(params) {
28605
28974
  logger.log("Deleting session...", { sessionId: params.sessionId });
28606
28975
  const sessionId = params.sessionId;
@@ -29004,8 +29373,25 @@ You have been logged out. Please try again.`);
29004
29373
  );
29005
29374
  const threadUpdates = [];
29006
29375
  for (const turn of thread.turns) {
29376
+ let seenUserMessage = false;
29007
29377
  for (const item of turn.items) {
29008
- const updates2 = await this.createHistoryUpdates(item, sessionState);
29378
+ let updates2 = await this.createHistoryUpdates(item, sessionState);
29379
+ if (item.type === "userMessage") {
29380
+ if (seenUserMessage) {
29381
+ updates2 = updates2.map((update) => ({
29382
+ ...update,
29383
+ _meta: {
29384
+ ...update._meta,
29385
+ codex: {
29386
+ ...update._meta?.codex,
29387
+ steer: true,
29388
+ turnId: turn.id
29389
+ }
29390
+ }
29391
+ }));
29392
+ }
29393
+ seenUserMessage = true;
29394
+ }
29009
29395
  threadUpdates.push(...updates2);
29010
29396
  }
29011
29397
  }
@@ -29107,11 +29493,11 @@ You have been logged out. Please try again.`);
29107
29493
  return [this.createPlanUpdate(item)];
29108
29494
  }
29109
29495
  }
29110
- createUserMessageUpdates(item) {
29496
+ async createUserMessageUpdates(item) {
29111
29497
  const updates = [];
29112
29498
  const messageId = item.id;
29113
29499
  for (const input of item.content) {
29114
- const blocks = this.userInputToContentBlocks(input);
29500
+ const blocks = await this.userInputToContentBlocks(input);
29115
29501
  for (const block of blocks) {
29116
29502
  updates.push(createUserMessageChunk(block, messageId));
29117
29503
  }
@@ -29155,15 +29541,26 @@ ${item.text}`
29155
29541
  }
29156
29542
  };
29157
29543
  }
29158
- userInputToContentBlocks(input) {
29544
+ async userInputToContentBlocks(input) {
29159
29545
  switch (input.type) {
29160
29546
  case "text":
29161
29547
  return input.text.length > 0 ? [{ type: "text", text: input.text }] : [];
29162
- case "image":
29163
- return [{ type: "text", text: this.formatUriAsLink("image", input.url) }];
29548
+ case "image": {
29549
+ const image = historyImageBlockFromDataUrl(input.url);
29550
+ return image ? [image] : [{
29551
+ type: "resource_link",
29552
+ uri: input.url,
29553
+ name: "image"
29554
+ }];
29555
+ }
29164
29556
  case "localImage": {
29165
29557
  const uri = input.path.startsWith("file://") ? input.path : `file://${input.path}`;
29166
- return [{ type: "text", text: this.formatUriAsLink(null, uri) }];
29558
+ const image = await historyImageBlockFromLocalPath(input.path);
29559
+ return image ? [image] : [{
29560
+ type: "resource_link",
29561
+ uri,
29562
+ name: path5.basename(input.path) || "image"
29563
+ }];
29167
29564
  }
29168
29565
  case "skill":
29169
29566
  return [{ type: "text", text: `skill:${input.name} (${input.path})` }];
@@ -0,0 +1 @@
1
+ .xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}.farming-browser-section{color:#343a34;min-width:0;margin-top:2px;margin-left:14px}.code-agent-resource-action-slot{display:contents}.code-agent-row:has(.code-agent-resource-action-slot:not(:empty)) .code-agent-row-actions{width:93px}.code-agent-resource-slot:empty{display:none}.code-agent-resource-slot .farming-browser-section{margin-top:0;margin-left:14px}.code-settings-browser-row .code-settings-row-copy small{text-overflow:clip;white-space:normal;overflow:visible}.code-settings-browser-unavailable{color:#747b72;white-space:nowrap;font-size:12px;line-height:18px}.farming-browser-section>header{min-height:var(--code-files-header-height,25px);color:#5f675e;letter-spacing:0;text-transform:uppercase;background:#f6f7f3;align-items:center;gap:8px;padding:2px 6px 1px 0;font-size:13px;font-weight:500;display:flex}.farming-browser-section-toggle{min-width:0;min-height:22px;color:inherit;cursor:pointer;font:inherit;letter-spacing:inherit;text-align:left;text-transform:inherit;background:0 0;border:0;border-radius:4px;flex:0 auto;align-items:center;gap:5px;padding:0 4px 0 2px;display:inline-flex}.farming-browser-section-toggle:hover,.farming-browser-section-toggle:focus-visible{color:#30372f;outline:0}.farming-browser-section-chevron{color:#6b7368;flex:0 0 14px;justify-content:center;align-items:center;width:14px;height:14px;display:inline-flex}.farming-browser-section-chevron svg,.farming-browser-new svg,.farming-browser-row-actions svg{fill:currentColor;width:14px;height:14px;display:block}.farming-browser-section-toggle small{color:#8a9188;font-size:11px;font-weight:450}.farming-browser-new,.farming-browser-row-actions button{color:#6b7368;cursor:pointer;background:0 0;border:0;border-radius:4px;flex:0 0 22px;justify-content:center;align-items:center;width:22px;height:22px;padding:0;display:inline-flex}.farming-browser-new:hover,.farming-browser-new:focus-visible,.farming-browser-row-actions button:hover,.farming-browser-row-actions button:focus-visible{color:#30372f;background:#1f23280d;outline:0}.farming-browser-new:disabled,.farming-browser-row-actions button:disabled{cursor:default;opacity:.38}.farming-browser-list{min-width:0}.farming-browser-row{--farming-browser-row-action-surface:#f6f7f3;color:#535a52;cursor:default;border-radius:5px;grid-template-columns:16px minmax(0,1fr);align-items:center;gap:7px;min-width:0;min-height:32px;margin:0 4px 0 0;padding:3px 4px 3px 5px;font-size:13px;line-height:16px;display:grid;position:relative}.farming-browser-row:hover,.farming-browser-row.active{--farming-browser-row-action-surface:#e8e9e6;color:#30372f;background:#1f23280e}.farming-browser-row:focus-visible{outline-offset:-2px;outline:2px solid #52638747}.farming-browser-resource-icon{color:#7a8178;place-items:center;width:16px;height:16px;display:inline-grid}.farming-browser-resource-icon svg{width:16px;height:16px}.farming-browser-resource-icon.running{color:#1f9d55}.farming-browser-resource-icon.failed{color:#c53d3d}.farming-browser-resource-icon.starting,.farming-browser-resource-icon.stopping{color:#ba7d12}.farming-browser-row-copy{gap:0;min-width:0;display:grid}.farming-browser-row-name,.farming-browser-row-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.farming-browser-row-name{color:inherit;font-size:13px;font-weight:450}.farming-browser-row-detail{color:#81887f;font-size:11px;line-height:14px}.farming-browser-row-copy input{box-sizing:border-box;color:#343a34;width:100%;min-width:0;height:22px;font:inherit;background:#fff;border:1px solid #5263874d;border-radius:4px;outline:0;padding:0 5px}.farming-browser-row-actions{z-index:1;box-sizing:border-box;background:linear-gradient(90deg, transparent 0, var(--farming-browser-row-action-surface) 21px, var(--farming-browser-row-action-surface) 100%);opacity:0;pointer-events:none;justify-content:flex-end;align-items:center;width:87px;height:28px;padding-left:21px;transition:opacity .12s;display:inline-flex;position:absolute;top:50%;right:4px;transform:translateY(-50%)}.farming-browser-row:hover .farming-browser-row-actions,.farming-browser-row:focus-within .farming-browser-row-actions{opacity:1;pointer-events:auto}.farming-browser-empty{color:#7a8178;cursor:pointer;min-height:28px;font:inherit;text-align:left;background:0 0;border:0;border-radius:5px;align-items:center;gap:6px;margin:0 4px 2px 0;padding:3px 7px;font-size:12px;display:inline-flex}.farming-browser-empty svg{fill:currentColor;width:13px;height:13px}.farming-browser-empty:hover,.farming-browser-empty:focus-visible{color:#4e564d;background:#1f23280d;outline:0}.farming-browser-viewer{color:#343a34;background:#fff;grid-template-rows:auto minmax(0,1fr) auto;width:100%;height:100%;min-height:0;font-family:-apple-system,BlinkMacSystemFont,SF Pro Text,Segoe UI,sans-serif;display:grid}.farming-browser-toolbar{background:#fff;border-bottom:1px solid #24292f14;align-items:center;gap:2px;min-height:38px;padding:4px 6px;display:flex}.farming-browser-toolbar button,.farming-browser-placeholder button{color:#5f675e;cursor:pointer;min-height:28px;font:inherit;background:0 0;border:0;border-radius:5px;justify-content:center;align-items:center;gap:5px;padding:0 8px;font-size:12px;font-weight:500;display:inline-flex}.farming-browser-toolbar button:hover:not(:disabled),.farming-browser-toolbar button:focus-visible,.farming-browser-placeholder button:hover,.farming-browser-placeholder button:focus-visible{color:#30372f;background:#1f23280f;outline:0}.farming-browser-toolbar button:disabled{cursor:default;opacity:.38}.farming-browser-toolbar button svg,.farming-browser-placeholder button svg{fill:currentColor;width:14px;height:14px}.farming-browser-toolbar-icon{flex:0 0 28px;width:28px;padding:0!important}.farming-browser-toolbar .farming-browser-agent-return{color:#454d44}.farming-browser-toolbar-separator{background:#24292f1a;flex:0 0 1px;width:1px;height:18px;margin:0 4px 0 2px}.farming-browser-toolbar form{flex:auto;min-width:90px;margin-left:3px;display:flex;position:relative}.farming-browser-toolbar input{box-sizing:border-box;color:#343a34;width:100%;min-width:0;height:28px;font:inherit;background:#f1f3ef;border:1px solid #0000;border-radius:7px;outline:0;padding:0 25px 0 10px;font-size:12px}.farming-browser-toolbar input:focus{background:#fff;border-color:#5263875c}.farming-browser-connection{background:#9aa198;border-radius:999px;flex:0 0 7px;width:7px;height:7px;margin-top:-3.5px;position:absolute;top:50%;right:9px}.farming-browser-connection.connected{background:#2da44e}.farming-browser-connection.navigating{background:#d29922}.farming-browser-viewport{background:#fff;justify-content:center;align-items:center;min-height:0;display:flex;position:relative;overflow:hidden}.farming-browser-viewport canvas{cursor:default;background:#fff;outline:none;max-width:100%;max-height:100%;display:block}.farming-browser-more-wrap{flex:none;position:relative}.farming-browser-more-menu{z-index:30;background:#fff;border:1px solid #d8dbd2;border-radius:8px;width:168px;padding:5px;position:absolute;top:calc(100% + 5px);right:0;box-shadow:0 14px 36px #1f232829}.farming-browser-more-menu button{justify-content:flex-start;width:100%;min-height:30px;padding:0 9px}.farming-browser-text-input-proxy{opacity:.01;pointer-events:none;resize:none;border:0;width:1px;height:1px;padding:0;font-size:16px;position:absolute;bottom:0;left:50%}.farming-browser-placeholder{color:#747b72;text-align:center;justify-items:center;gap:7px;max-width:420px;padding:24px;display:grid}.farming-browser-placeholder strong{color:#4e564d;font-size:14px;font-weight:600}.farming-browser-placeholder p{margin:0;font-size:13px;line-height:19px}.farming-browser-placeholder button{background:#f6f7f3;border:1px solid #5263872e;margin-top:3px}.farming-browser-viewer-error{color:#b4232d;background:#cf222e14;padding:6px 10px;font-size:12px;line-height:16px}.farming-browser-activity-preview{z-index:18;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#fffffff5;border:1px solid #d8dcd4;border-radius:10px;width:240px;position:absolute;top:54px;right:22px;overflow:hidden;box-shadow:0 6px 20px #1f231e24}.farming-browser-activity-preview>header{color:#424941;align-items:center;gap:7px;height:30px;padding:0 7px 0 9px;display:flex}.farming-browser-activity-preview>header strong{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:12px;font-weight:500;line-height:1;overflow:hidden}.farming-browser-activity-preview>header button{color:#737a72;cursor:pointer;background:0 0;border:0;border-radius:5px;width:22px;height:22px;padding:0;font:400 18px/20px system-ui,sans-serif}.farming-browser-activity-preview>header button:hover,.farming-browser-activity-preview>header button:focus-visible{color:#252a25;background:#eef0eb;outline:none}.farming-browser-activity-dot{background:#2da44e;border-radius:50%;flex:none;width:7px;height:7px;box-shadow:0 0 0 2px #2da44e1f}.farming-browser-activity-frame{aspect-ratio:16/9;color:#737a72;cursor:pointer;background:#f1f3ef;border:0;border-top:1px solid #e2e5df;place-items:center;width:100%;padding:0;display:grid;overflow:hidden}.farming-browser-activity-frame img{object-fit:contain;background:#fff;width:100%;height:100%;display:block}.farming-browser-activity-frame span{padding:12px;font-size:11px}body.code-mode[data-appearance=dark] .farming-browser-section,body.code-mode[data-appearance=dark] .farming-browser-row{color:#c9d1d9}body.code-mode[data-appearance=dark] .farming-browser-row{--farming-browser-row-action-surface:#0d1117}body.code-mode[data-appearance=dark] .farming-browser-section>header{color:#9da7b1;background:#0d1117}body.code-mode[data-appearance=dark] .farming-browser-section-toggle:hover,body.code-mode[data-appearance=dark] .farming-browser-section-toggle:focus-visible,body.code-mode[data-appearance=dark] .farming-browser-new:hover,body.code-mode[data-appearance=dark] .farming-browser-new:focus-visible,body.code-mode[data-appearance=dark] .farming-browser-row-actions button:hover,body.code-mode[data-appearance=dark] .farming-browser-row-actions button:focus-visible{color:#f0f6fc}body.code-mode[data-appearance=dark] .farming-browser-row:hover,body.code-mode[data-appearance=dark] .farming-browser-row.active{--farming-browser-row-action-surface:#1d2227}body.code-mode[data-appearance=dark] .farming-browser-row:hover,body.code-mode[data-appearance=dark] .farming-browser-row.active,body.code-mode[data-appearance=dark] .farming-browser-empty:hover,body.code-mode[data-appearance=dark] .farming-browser-empty:focus-visible{background:#b1bac41a}body.code-mode[data-appearance=dark] .farming-browser-row-detail,body.code-mode[data-appearance=dark] .farming-browser-empty,body.code-mode[data-appearance=dark] .farming-browser-resource-icon{color:#8b949e}body.code-mode[data-appearance=dark] .farming-browser-resource-icon.running{color:#3fb950}body.code-mode[data-appearance=dark] .farming-browser-resource-icon.failed{color:#ff7b72}body.code-mode[data-appearance=dark] .farming-browser-resource-icon.starting,body.code-mode[data-appearance=dark] .farming-browser-resource-icon.stopping{color:#d29922}body.code-mode[data-appearance=dark] .farming-browser-row-copy input,body.code-mode[data-appearance=dark] .farming-browser-toolbar input{color:#e6edf3;background:#161b22;border-color:#30363d}body.code-mode[data-appearance=dark] .farming-browser-viewer{color:#c9d1d9;background:#0d1117}body.code-mode[data-appearance=dark] .farming-browser-toolbar{background:#0d1117;border-color:#21262d}body.code-mode[data-appearance=dark] .farming-browser-toolbar-separator{background:#30363d}body.code-mode[data-appearance=dark] .farming-browser-toolbar button,body.code-mode[data-appearance=dark] .farming-browser-placeholder button{color:#9da7b1}body.code-mode[data-appearance=dark] .farming-browser-toolbar button:hover:not(:disabled),body.code-mode[data-appearance=dark] .farming-browser-toolbar button:focus-visible,body.code-mode[data-appearance=dark] .farming-browser-placeholder button:hover,body.code-mode[data-appearance=dark] .farming-browser-placeholder button:focus-visible{color:#f0f6fc;background:#21262d}body.code-mode[data-appearance=dark] .farming-browser-viewport{background:#010409}body.code-mode[data-appearance=dark] .farming-browser-more-menu{background:#161b22;border-color:#30363d}body.code-mode[data-appearance=dark] .farming-browser-placeholder{color:#8b949e}body.code-mode[data-appearance=dark] .farming-browser-placeholder strong{color:#c9d1d9}body.code-mode[data-appearance=dark] .farming-browser-placeholder button{background:#161b22;border-color:#30363d}.code-mode[data-appearance=dark] .farming-browser-activity-preview{background:#1f211ff5;border-color:#3a3f3a;box-shadow:0 8px 24px #00000059}.code-mode[data-appearance=dark] .farming-browser-activity-preview>header{color:#d7dcd5}.code-mode[data-appearance=dark] .farming-browser-activity-preview>header button{color:#9da59c}.code-mode[data-appearance=dark] .farming-browser-activity-preview>header button:hover,.code-mode[data-appearance=dark] .farming-browser-activity-preview>header button:focus-visible{color:#f0f2ef;background:#343834}.code-mode[data-appearance=dark] .farming-browser-activity-frame{color:#9da59c;background:#242724;border-top-color:#3a3f3a}@media (width<=700px){.farming-browser-activity-preview{display:none}.farming-browser-toolbar{padding-inline:5px}.farming-browser-toolbar form{margin-left:1px}}.farming-computer-section{min-width:0;margin:4px 8px 4px 14px}.farming-computer-section>header{align-items:center;min-width:0;display:flex}.farming-computer-section>header button{color:var(--code-text-muted);background:0 0;border:0;height:28px}.farming-computer-section-toggle{text-align:left;flex:1;align-items:center;gap:5px;min-width:0;display:flex}.farming-computer-section-toggle svg,.farming-computer-section>header button:last-child svg{fill:currentColor;width:14px;height:14px}.farming-computer-section-toggle small{margin-left:auto;font-size:11px;font-weight:400}.farming-computer-row{--farming-computer-row-action-surface:var(--code-bg,#f6f7f3);min-width:0;height:42px;color:var(--code-text);border-radius:8px;align-items:center;gap:7px;padding:4px 5px 4px 8px;display:flex;position:relative}.farming-computer-row:hover,.farming-computer-row.active{--farming-computer-row-action-surface:color-mix(in srgb, var(--code-bg,#f6f7f3) 94%, var(--code-text,#343a34) 6%);background:var(--code-hover)}.farming-computer-resource-icon{width:16px;height:16px;color:var(--code-text-muted);flex:0 0 16px;place-items:center;display:inline-grid}.farming-computer-resource-icon svg{width:16px;height:16px}.farming-computer-resource-icon.running{color:#1f9d55}.farming-computer-resource-icon.failed{color:#c53d3d}.farming-computer-resource-icon.starting,.farming-computer-resource-icon.stopping{color:#ba7d12}.farming-computer-copy{flex-direction:column;flex:1;min-width:0;display:flex}.farming-computer-name,.farming-computer-detail{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.farming-computer-name{font-size:13px}.farming-computer-detail{color:var(--code-text-muted);font-size:11px}.farming-computer-detail.error{color:#c53d3d}.farming-computer-copy input{width:100%;min-width:0}.farming-computer-actions{z-index:1;box-sizing:border-box;background:linear-gradient(90deg, transparent 0, var(--farming-computer-row-action-surface) 21px, var(--farming-computer-row-action-surface) 100%);opacity:0;pointer-events:none;justify-content:flex-end;align-items:center;width:61px;height:28px;padding-left:21px;transition:opacity .12s;display:inline-flex;position:absolute;top:50%;right:5px;transform:translateY(-50%)}.farming-computer-row:hover .farming-computer-actions,.farming-computer-row:focus-within .farming-computer-actions{opacity:1;pointer-events:auto}.farming-computer-actions button,.farming-computer-empty{color:var(--code-text-muted);background:0 0;border:0}.farming-computer-actions button{width:24px;height:24px}.farming-computer-more-wrap{display:inline-flex;position:relative}.farming-computer-more-menu{z-index:3;border:1px solid var(--code-border);background:var(--code-bg);border-radius:6px;gap:2px;width:max-content;min-width:116px;padding:4px;display:grid;position:absolute;top:calc(100% + 4px);right:0;box-shadow:0 8px 18px #1f232829}.farming-computer-more-menu button{width:auto;min-width:0;color:var(--code-text);font:inherit;text-align:left;padding:0 8px;font-size:12px}.farming-computer-more-menu button:hover,.farming-computer-more-menu button:focus-visible{background:var(--code-hover)}.farming-computer-more-menu button.danger{color:#c53d3d}.farming-computer-actions svg,.farming-computer-empty svg{fill:currentColor;width:13px;height:13px}body.code-mode[data-appearance=dark] .farming-computer-row{--farming-computer-row-action-surface:var(--code-dark-bg-soft)}body.code-mode[data-appearance=dark] .farming-computer-row:hover,body.code-mode[data-appearance=dark] .farming-computer-row.active{--farming-computer-row-action-surface:var(--code-dark-bg-hover)}body.code-mode[data-appearance=dark] .farming-computer-resource-icon{color:#8b949e}body.code-mode[data-appearance=dark] .farming-computer-resource-icon.running{color:#3fb950}body.code-mode[data-appearance=dark] .farming-computer-resource-icon.failed{color:#ff7b72}body.code-mode[data-appearance=dark] .farming-computer-resource-icon.starting,body.code-mode[data-appearance=dark] .farming-computer-resource-icon.stopping{color:#d29922}body.code-mode[data-appearance=dark] .farming-computer-detail.error,body.code-mode[data-appearance=dark] .farming-computer-more-menu button.danger{color:#ff7b72}.farming-computer-empty{text-align:left;align-items:center;gap:7px;width:100%;height:32px;padding:0 8px;display:flex}.farming-computer-viewer{background:var(--code-bg);flex-direction:column;width:100%;min-width:0;height:100%;min-height:0;display:flex}.farming-computer-toolbar{border-bottom:1px solid var(--code-border);align-items:center;gap:8px;min-height:42px;padding:0 10px;display:flex}.farming-computer-toolbar button{color:var(--code-text-muted);background:0 0;border:0;border-radius:6px;min-height:28px}.farming-computer-toolbar button:hover{background:var(--code-hover);color:var(--code-text)}.farming-computer-toolbar svg{fill:currentColor;width:16px;height:16px}.farming-computer-toolbar-title{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.farming-computer-control-status{min-width:0;color:var(--code-text-muted);text-overflow:ellipsis;white-space:nowrap;margin-left:auto;font-size:12px;overflow:hidden}.farming-computer-control-button{padding:0 10px}.farming-computer-viewport{flex:1;min-height:0;position:relative}.farming-computer-viewport iframe{background:#111;border:0;width:100%;height:100%}.farming-computer-empty-state{height:100%;color:var(--code-text-muted);text-align:center;place-content:center;gap:12px;display:grid}.farming-computer-empty-state button{justify-self:center}.farming-computer-error{background:color-mix(in srgb, var(--code-bg) 92%, #c34747);color:var(--code-text);border:1px solid #c34747;border-radius:8px;padding:8px 10px;position:absolute;inset:auto 12px 12px}