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,147 @@
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 terminal_state_serialization_exports = {};
21
+ __export(terminal_state_serialization_exports, {
22
+ MAX_REPLAY_EVENT_BYTES: () => MAX_REPLAY_EVENT_BYTES,
23
+ MAX_SERIALIZED_TERMINAL_STATE_BYTES: () => MAX_SERIALIZED_TERMINAL_STATE_BYTES,
24
+ TERMINAL_STATE_VERSION: () => TERMINAL_STATE_VERSION,
25
+ deserializeTerminalState: () => deserializeTerminalState,
26
+ normalizeTerminalStateEntry: () => normalizeTerminalStateEntry,
27
+ serializeTerminalState: () => serializeTerminalState,
28
+ terminalReplayText: () => terminalReplayText
29
+ });
30
+ module.exports = __toCommonJS(terminal_state_serialization_exports);
31
+ const TERMINAL_STATE_VERSION = 1;
32
+ const MAX_SERIALIZED_TERMINAL_STATE_BYTES = 32 * 1024 * 1024;
33
+ const MAX_REPLAY_EVENT_BYTES = 8 * 1024 * 1024;
34
+ function recordValue(value) {
35
+ return value && typeof value === "object" && !Array.isArray(value) ? value : {};
36
+ }
37
+ function finitePositiveInteger(value, fallback) {
38
+ const parsed = Math.floor(Number(value));
39
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
40
+ }
41
+ function normalizeReplayEvent(replayEvent) {
42
+ const source = recordValue(replayEvent);
43
+ const events = Array.isArray(source.events) ? source.events : [];
44
+ if (events.length !== 1) {
45
+ throw new Error("Serialized terminal state requires exactly one replay event");
46
+ }
47
+ const event = recordValue(events[0]);
48
+ const data = typeof event.data === "string" ? event.data : "";
49
+ if (Buffer.byteLength(data, "utf8") > MAX_REPLAY_EVENT_BYTES) {
50
+ throw new Error("Serialized terminal replay event exceeds the size limit");
51
+ }
52
+ return {
53
+ events: [{
54
+ data,
55
+ cols: finitePositiveInteger(event.cols, 80),
56
+ rows: finitePositiveInteger(event.rows, 30)
57
+ }]
58
+ };
59
+ }
60
+ function normalizeTerminalStateEntry(entry) {
61
+ if (!entry || typeof entry !== "object") {
62
+ throw new Error("Serialized terminal state entry must be an object");
63
+ }
64
+ const source = entry;
65
+ const id = typeof source.id === "string" ? source.id.trim() : "";
66
+ if (!/^[A-Za-z0-9][A-Za-z0-9_-]{0,199}$/.test(id)) {
67
+ throw new Error("Serialized terminal state has an invalid session id");
68
+ }
69
+ const metadata = recordValue(source.metadata);
70
+ const processDetails = recordValue(source.processDetails);
71
+ const processLaunchConfig = recordValue(source.processLaunchConfig);
72
+ return {
73
+ id,
74
+ metadata: {
75
+ ...metadata,
76
+ agentId: id
77
+ },
78
+ processDetails: {
79
+ cwd: typeof processDetails.cwd === "string" ? processDetails.cwd : "",
80
+ title: typeof processDetails.title === "string" ? processDetails.title : ""
81
+ },
82
+ processLaunchConfig: {
83
+ command: typeof processLaunchConfig.command === "string" ? processLaunchConfig.command : "",
84
+ args: Array.isArray(processLaunchConfig.args) ? processLaunchConfig.args.filter((arg) => typeof arg === "string") : [],
85
+ category: typeof processLaunchConfig.category === "string" ? processLaunchConfig.category : ""
86
+ },
87
+ replayEvent: normalizeReplayEvent(source.replayEvent),
88
+ timestamp: Number.isFinite(Number(source.timestamp)) ? Math.max(0, Math.floor(Number(source.timestamp))) : Date.now()
89
+ };
90
+ }
91
+ function serializeTerminalState(entries) {
92
+ const state = (Array.isArray(entries) ? entries : []).map(normalizeTerminalStateEntry);
93
+ const ids = /* @__PURE__ */ new Set();
94
+ for (const entry of state) {
95
+ if (ids.has(entry.id)) {
96
+ throw new Error(`Serialized terminal state contains duplicate session id ${entry.id}`);
97
+ }
98
+ ids.add(entry.id);
99
+ }
100
+ const serialized = JSON.stringify({
101
+ version: TERMINAL_STATE_VERSION,
102
+ state
103
+ });
104
+ if (Buffer.byteLength(serialized, "utf8") > MAX_SERIALIZED_TERMINAL_STATE_BYTES) {
105
+ throw new Error("Serialized terminal state exceeds the size limit");
106
+ }
107
+ return serialized;
108
+ }
109
+ function deserializeTerminalState(serialized) {
110
+ if (typeof serialized !== "string" || !serialized) return [];
111
+ if (Buffer.byteLength(serialized, "utf8") > MAX_SERIALIZED_TERMINAL_STATE_BYTES) {
112
+ throw new Error("Serialized terminal state exceeds the size limit");
113
+ }
114
+ let parsed;
115
+ try {
116
+ parsed = JSON.parse(serialized);
117
+ } catch {
118
+ throw new Error("Serialized terminal state is not valid JSON");
119
+ }
120
+ const envelope = recordValue(parsed);
121
+ if (envelope.version !== TERMINAL_STATE_VERSION || !Array.isArray(envelope.state)) {
122
+ throw new Error("Serialized terminal state has an unsupported format or version");
123
+ }
124
+ const state = envelope.state.map(normalizeTerminalStateEntry);
125
+ const ids = /* @__PURE__ */ new Set();
126
+ for (const entry of state) {
127
+ if (ids.has(entry.id)) {
128
+ throw new Error(`Serialized terminal state contains duplicate session id ${entry.id}`);
129
+ }
130
+ ids.add(entry.id);
131
+ }
132
+ return state;
133
+ }
134
+ function terminalReplayText(entry) {
135
+ const normalized = normalizeTerminalStateEntry(entry);
136
+ return normalized.replayEvent.events[0].data;
137
+ }
138
+ // Annotate the CommonJS export names for ESM import in node:
139
+ 0 && (module.exports = {
140
+ MAX_REPLAY_EVENT_BYTES,
141
+ MAX_SERIALIZED_TERMINAL_STATE_BYTES,
142
+ TERMINAL_STATE_VERSION,
143
+ deserializeTerminalState,
144
+ normalizeTerminalStateEntry,
145
+ serializeTerminalState,
146
+ terminalReplayText
147
+ });
@@ -1,83 +1,86 @@
1
- const SHELL_COMMANDS = new Set(['bash', 'zsh', 'sh', 'fish']);
2
- const DIRECT_PROCESS_AGENTS = new Set([
3
- 'opencode',
4
- 'qoder',
5
- 'qodercli',
6
- 'qwen',
7
- 'aider',
8
- 'github-copilot-cli',
9
- 'amazon-q',
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 terminal_status_exports = {};
21
+ __export(terminal_status_exports, {
22
+ deriveTerminalStatus: () => deriveTerminalStatus,
23
+ terminalInputReady: () => terminalInputReady,
24
+ terminalTextLooksIdleShellPrompt: () => terminalTextLooksIdleShellPrompt
25
+ });
26
+ module.exports = __toCommonJS(terminal_status_exports);
27
+ const SHELL_COMMANDS = /* @__PURE__ */ new Set(["bash", "zsh", "sh", "fish"]);
28
+ const DIRECT_PROCESS_AGENTS = /* @__PURE__ */ new Set([
29
+ "opencode",
30
+ "qoder",
31
+ "qodercli",
32
+ "qwen",
33
+ "aider",
34
+ "github-copilot-cli",
35
+ "amazon-q"
10
36
  ]);
11
-
12
37
  function executableName(command) {
13
- const executable = String(command || '')
14
- .trim()
15
- .split(/\s+/)
16
- .find(token => token && token !== 'env' && !/^[A-Za-z_][A-Za-z0-9_]*=/.test(token));
17
- return (executable || '').split(/[\\/]/).pop() || '';
38
+ const executable = String(command || "").trim().split(/\s+/).find((token) => token && token !== "env" && !/^[A-Za-z_][A-Za-z0-9_]*=/.test(token));
39
+ return (executable || "").split(/[\\/]/).pop() || "";
18
40
  }
19
-
20
41
  function normalizedText(value) {
21
- return stripTerminalControlSequences(value).replace(/\s+/g, ' ').trim().toLowerCase();
42
+ return stripTerminalControlSequences(value).replace(/\s+/g, " ").trim().toLowerCase();
22
43
  }
23
-
24
44
  function terminalLines(value) {
25
- return stripTerminalControlSequences(value)
26
- .replace(/\r/g, '')
27
- .split('\n')
28
- .map((line) => line.replace(/\s+/g, ' ').trim().toLowerCase())
29
- .filter(Boolean);
45
+ return stripTerminalControlSequences(value).replace(/\r/g, "").split("\n").map((line) => line.replace(/\s+/g, " ").trim().toLowerCase()).filter(Boolean);
30
46
  }
31
-
32
47
  function stripTerminalControlSequences(value) {
33
- return String(value || '')
34
- .replace(/\x1b\][^\x07]*(?:\x07|\x1b\\)/g, '')
35
- .replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, '');
48
+ return String(value || "").replace(/\x1b\][^\x07]*(?:\x07|\x1b\\)/g, "").replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, "");
36
49
  }
37
-
38
50
  function terminalStatusCommand(value) {
39
- return stripTerminalControlSequences(value)
40
- .replace(/[\x00-\x1f\x7f]/g, ' ')
41
- .replace(/\s+/g, ' ')
42
- .trim();
51
+ return stripTerminalControlSequences(value).replace(/[\x00-\x1f\x7f]/g, " ").replace(/\s+/g, " ").trim();
43
52
  }
44
-
45
53
  function finiteNumber(value) {
46
- return typeof value === 'number' && Number.isFinite(value) ? value : null;
54
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
47
55
  }
48
-
49
56
  function lastMatchIndex(text, pattern) {
50
57
  const matches = Array.from(text.matchAll(pattern));
51
- const lastMatch = matches.length > 0 ? matches[matches.length - 1] : undefined;
52
- return lastMatch && typeof lastMatch.index === 'number' ? lastMatch.index : -1;
58
+ const lastMatch = matches.length > 0 ? matches[matches.length - 1] : void 0;
59
+ return lastMatch && typeof lastMatch.index === "number" ? lastMatch.index : -1;
53
60
  }
54
-
55
61
  function lastIndexOfAny(text, needles) {
56
62
  return needles.reduce((last, needle) => Math.max(last, text.lastIndexOf(needle)), -1);
57
63
  }
58
-
59
64
  function lastLineIndexMatching(text, predicate) {
60
65
  let offset = 0;
61
66
  let lastIndex = -1;
62
- for (const line of text.split('\n')) {
67
+ for (const line of text.split("\n")) {
63
68
  if (predicate(line)) lastIndex = offset;
64
69
  offset += line.length + 1;
65
70
  }
66
71
  return lastIndex;
67
72
  }
68
-
69
73
  function lastCodexIdleFooterIndex(text) {
70
74
  return lastMatchIndex(text, /(?:^|\n)\s*(?:gpt|codex)[^\n]*(?:·|•)\s*(?:~|\/)[^\n]*$/gim);
71
75
  }
72
-
73
76
  function codexActiveIndex(text) {
74
77
  const activeTextIndex = lastIndexOfAny(text, [
75
- 'pursuing goal',
76
- 'reconnecting',
77
- '/stop to close',
78
- 'background terminal running',
79
- 'messages to be submitted after next tool call',
80
- 'stream disconnected before completion',
78
+ "pursuing goal",
79
+ "reconnecting",
80
+ "/stop to close",
81
+ "background terminal running",
82
+ "messages to be submitted after next tool call",
83
+ "stream disconnected before completion"
81
84
  ]);
82
85
  const workingIndex = lastMatchIndex(
83
86
  text,
@@ -85,182 +88,142 @@ function codexActiveIndex(text) {
85
88
  );
86
89
  return Math.max(activeTextIndex, workingIndex);
87
90
  }
88
-
89
91
  function codexBlockedIndex(text) {
90
92
  return lastIndexOfAny(text, [
91
- 'goal blocked',
92
- 'input exceeds the context window',
93
- 'please adjust your input and try again',
93
+ "goal blocked",
94
+ "input exceeds the context window",
95
+ "please adjust your input and try again"
94
96
  ]);
95
97
  }
96
-
97
98
  function lineShowsInterrupt(line) {
98
99
  return /\b(?:press\s+)?(?:esc|escape|ctrl\+c|ctrl-c)\s+to\s+interrupt\b/i.test(line);
99
100
  }
100
-
101
101
  function lineShowsClaudeStatusRow(line, excludeBareWorking = false) {
102
102
  const normalized = line.trim().toLowerCase();
103
103
  const match = normalized.match(
104
104
  /^([*✳✱✲✶✻✽✢])?\s*([\p{L}\p{M}][\p{L}\p{M}'’-]*)(?:\.{3}|…)?\s*\(([^)]*)\)\s*$/u
105
105
  );
106
106
  if (!match || !lineShowsInterrupt(match[3])) return false;
107
- if (excludeBareWorking && !match[1] && match[2] === 'working') return false;
108
-
107
+ if (excludeBareWorking && !match[1] && match[2] === "working") return false;
109
108
  const interruptOnly = /^(?:press\s+)?(?:esc|escape|ctrl\+c|ctrl-c)\s+to\s+interrupt$/i.test(match[3].trim());
110
109
  const hasElapsedTime = /\b\d+(?:\.\d+)?\s*(?:ms|s|m|h)\b/i.test(match[3]);
111
110
  return interruptOnly || hasElapsedTime;
112
111
  }
113
-
114
112
  function lineShowsClaudeActivity(line) {
115
113
  const normalized = line.trim().toLowerCase();
116
114
  if (/^(?:press\s+)?(?:esc|escape|ctrl\+c|ctrl-c)\s+to\s+interrupt$/.test(normalized)) return true;
117
115
  return lineShowsClaudeStatusRow(normalized);
118
116
  }
119
-
120
117
  function lineShowsClaudeKindEvidence(line) {
121
118
  const normalized = line.trim().toLowerCase();
122
119
  if (/^(?:press\s+)?(?:esc|escape|ctrl\+c|ctrl-c)\s+to\s+interrupt$/.test(normalized)) return true;
123
120
  return lineShowsClaudeStatusRow(normalized, true);
124
121
  }
125
-
126
122
  function terminalLineLooksLikeIdleShellPrompt(line) {
127
123
  return /^(?:\s*[│┃]\s*(?:[^$%#\n]+?\s+)?[$%#]|\s*(?:\([^)]+\)\s+)?(?:[\w.-]+@[\w.-]+:)?[~/][\w./~:+-]*\s*[$%#]|\s*[$%#])\s*$/u.test(line);
128
124
  }
129
-
130
125
  function latestTerminalKindFromText(title, previewText) {
131
- const text = stripTerminalControlSequences(previewText).replace(/\r/g, '').toLowerCase();
126
+ const text = stripTerminalControlSequences(previewText).replace(/\r/g, "").toLowerCase();
132
127
  const candidates = [];
133
128
  const codexIndex = Math.max(lastCodexIdleFooterIndex(text), codexActiveIndex(text));
134
- if (codexIndex >= 0) candidates.push({ kind: 'codex', index: codexIndex });
135
-
129
+ if (codexIndex >= 0) candidates.push({ kind: "codex", index: codexIndex });
136
130
  const claudeIndex = lastLineIndexMatching(text, lineShowsClaudeKindEvidence);
137
- if (claudeIndex >= 0) candidates.push({ kind: 'claude', index: claudeIndex });
138
-
131
+ if (claudeIndex >= 0) candidates.push({ kind: "claude", index: claudeIndex });
139
132
  const shellIndex = lastLineIndexMatching(text, terminalLineLooksLikeIdleShellPrompt);
140
- if (shellIndex >= 0) candidates.push({ kind: 'shell', index: shellIndex });
141
-
133
+ if (shellIndex >= 0) candidates.push({ kind: "shell", index: shellIndex });
142
134
  const latest = candidates.sort((left, right) => right.index - left.index)[0];
143
135
  if (latest) return latest.kind;
144
-
145
136
  const normalizedTitle = normalizedText(title);
146
- if (/\bclaude\s+code\b/.test(normalizedTitle)) return 'claude';
147
- if (/\bcodex\b/.test(normalizedTitle)) return 'codex';
137
+ if (/\bclaude\s+code\b/.test(normalizedTitle)) return "claude";
138
+ if (/\bcodex\b/.test(normalizedTitle)) return "codex";
148
139
  return null;
149
140
  }
150
-
151
141
  function inferKindFromText(title, previewText, command) {
152
142
  const commandName = executableName(command).toLowerCase();
153
- if (DIRECT_PROCESS_AGENTS.has(commandName)) return 'process';
154
- if (commandName && !SHELL_COMMANDS.has(commandName) && commandName !== 'codex' && commandName !== 'claude') return 'process';
143
+ if (DIRECT_PROCESS_AGENTS.has(commandName)) return "process";
144
+ if (commandName && !SHELL_COMMANDS.has(commandName) && commandName !== "codex" && commandName !== "claude") return "process";
155
145
  const terminalKind = latestTerminalKindFromText(title, previewText);
156
146
  if (terminalKind) return terminalKind;
157
- if (commandName === 'claude') return 'claude';
158
- if (commandName === 'codex') return 'codex';
159
- if (SHELL_COMMANDS.has(commandName)) return 'shell';
160
- return commandName ? 'process' : 'unknown';
147
+ if (commandName === "claude") return "claude";
148
+ if (commandName === "codex") return "codex";
149
+ if (SHELL_COMMANDS.has(commandName)) return "shell";
150
+ return commandName ? "process" : "unknown";
161
151
  }
162
-
163
152
  function terminalTextLooksIdleShellPrompt(previewText) {
164
- const lines = stripTerminalControlSequences(previewText)
165
- .replace(/\r/g, '')
166
- .split('\n')
167
- .map(line => line.trimEnd())
168
- .filter(Boolean);
153
+ const lines = stripTerminalControlSequences(previewText).replace(/\r/g, "").split("\n").map((line) => line.trimEnd()).filter(Boolean);
169
154
  if (lines.length === 0) return false;
170
-
171
155
  return terminalLineLooksLikeIdleShellPrompt(lines[lines.length - 1]);
172
156
  }
173
-
174
157
  function terminalTitleShowsCodexActivity(title) {
175
- return /^[\s]*[\u2800-\u28ff]/u.test(String(title || ''));
158
+ return /^[\s]*[\u2800-\u28ff]/u.test(String(title || ""));
176
159
  }
177
-
178
160
  function inferCodexActivity(title, previewText) {
179
- if (terminalTitleShowsCodexActivity(title)) return 'busy';
180
-
181
- const text = stripTerminalControlSequences(previewText).replace(/\r/g, '').toLowerCase();
182
- if (!text.trim()) return 'unknown';
183
-
161
+ if (terminalTitleShowsCodexActivity(title)) return "busy";
162
+ const text = stripTerminalControlSequences(previewText).replace(/\r/g, "").toLowerCase();
163
+ if (!text.trim()) return "unknown";
184
164
  const idleIndex = lastCodexIdleFooterIndex(text);
185
165
  const blockedIndex = codexBlockedIndex(text);
186
166
  const activeIndex = codexActiveIndex(text);
187
167
  const inactiveIndex = Math.max(idleIndex, blockedIndex);
188
- if (activeIndex >= 0) return inactiveIndex > activeIndex ? 'idle' : 'busy';
189
- if (inactiveIndex >= 0) return 'idle';
190
- return 'unknown';
168
+ if (activeIndex >= 0) return inactiveIndex > activeIndex ? "idle" : "busy";
169
+ if (inactiveIndex >= 0) return "idle";
170
+ return "unknown";
191
171
  }
192
-
193
172
  function inferClaudeActivity(previewText) {
194
173
  const lines = terminalLines(previewText);
195
- if (lines.length === 0) return 'unknown';
196
- return lines.some(lineShowsClaudeActivity) ? 'busy' : 'idle';
174
+ if (lines.length === 0) return "unknown";
175
+ return lines.some(lineShowsClaudeActivity) ? "busy" : "idle";
197
176
  }
198
-
199
177
  function inferOpenCodeActivity(previewText) {
200
178
  const lines = terminalLines(previewText);
201
- if (lines.length === 0) return 'unknown';
179
+ if (lines.length === 0) return "unknown";
202
180
  const tail = lines.slice(-8);
203
181
  let footerIndex = -1;
204
182
  for (let index = 0; index < tail.length; index += 1) {
205
183
  if (/(?:•|·)\s*opencode\s+\d+(?:\.\d+){1,2}\b/.test(tail[index])) footerIndex = index;
206
184
  }
207
- if (footerIndex < 0) return 'idle';
208
-
209
- const activeProgress = (line) => (
210
- /^(?:[│┃]\s*)?[■⬝⭝]{3,}/u.test(line)
211
- && /\b(?:esc|escape|ctrl\+c|ctrl-c)(?:\s+(?:again\s+)?to)?\s+interrupt\b/.test(line)
212
- );
213
- const activeFooter = activeProgress(tail[footerIndex])
214
- || (footerIndex > 0 && activeProgress(tail[footerIndex - 1]));
215
- return activeFooter ? 'busy' : 'idle';
185
+ if (footerIndex < 0) return "idle";
186
+ const activeProgress = (line) => /^(?:[│┃]\s*)?[■⬝⭝]{3,}/u.test(line) && /\b(?:esc|escape|ctrl\+c|ctrl-c)(?:\s+(?:again\s+)?to)?\s+interrupt\b/.test(line);
187
+ const activeFooter = activeProgress(tail[footerIndex]) || footerIndex > 0 && activeProgress(tail[footerIndex - 1]);
188
+ return activeFooter ? "busy" : "idle";
216
189
  }
217
-
218
190
  function inferQoderLikeActivity(title, previewText, commandName) {
219
191
  const normalizedTitle = stripTerminalControlSequences(title).trim();
220
- if (commandName === 'qoder' || commandName === 'qodercli') {
221
- if (/^✋/u.test(normalizedTitle)) return 'idle';
192
+ if (commandName === "qoder" || commandName === "qodercli") {
193
+ if (/^✋/u.test(normalizedTitle)) return "idle";
222
194
  }
223
-
224
195
  const lines = terminalLines(previewText);
225
196
  const tail = lines.slice(-8);
226
197
  const active = tail.some((line, index) => {
227
198
  if (!/^[\u2800-\u28ff]/u.test(line)) return false;
228
- const loadingWindow = tail.slice(index, index + 3).join(' ');
229
- return /\besc\b/.test(loadingWindow)
230
- && /\b\d+(?:\.\d+)?\s*(?:ms|s|m|h)\b/.test(loadingWindow);
199
+ const loadingWindow = tail.slice(index, index + 3).join(" ");
200
+ return /\besc\b/.test(loadingWindow) && /\b\d+(?:\.\d+)?\s*(?:ms|s|m|h)\b/.test(loadingWindow);
231
201
  });
232
- if (active) return 'busy';
233
-
234
- if (commandName === 'qoder' || commandName === 'qodercli') {
235
- if (/^[✦⏲]/u.test(normalizedTitle)) return 'busy';
236
- if (/^◇/u.test(normalizedTitle)) return 'idle';
202
+ if (active) return "busy";
203
+ if (commandName === "qoder" || commandName === "qodercli") {
204
+ if (/^[✦⏲]/u.test(normalizedTitle)) return "busy";
205
+ if (/^◇/u.test(normalizedTitle)) return "idle";
237
206
  }
238
- return lines.length > 0 || normalizedTitle ? 'idle' : 'unknown';
207
+ return lines.length > 0 || normalizedTitle ? "idle" : "unknown";
239
208
  }
240
-
241
209
  function inferGenericActivity(previewText, terminalBusy) {
242
- if (terminalBusy === true) return 'busy';
243
- if (terminalBusy === false) return 'idle';
244
-
245
- if (terminalTextLooksIdleShellPrompt(previewText)) return 'idle';
246
- return 'unknown';
210
+ if (terminalBusy === true) return "busy";
211
+ if (terminalBusy === false) return "idle";
212
+ if (terminalTextLooksIdleShellPrompt(previewText)) return "idle";
213
+ return "unknown";
247
214
  }
248
-
249
215
  function nestedProcessCommandFromTitle(title) {
250
216
  const normalizedTitle = stripTerminalControlSequences(title).trim();
251
- if (/^oc\s*\|/i.test(normalizedTitle)) return 'opencode';
252
- if (/^[◇✋✦⏲]/u.test(normalizedTitle)) return 'qodercli';
253
- if (/^qwen\b/i.test(normalizedTitle)) return 'qwen';
254
- return '';
217
+ if (/^oc\s*\|/i.test(normalizedTitle)) return "opencode";
218
+ if (/^[◇✋✦⏲]/u.test(normalizedTitle)) return "qodercli";
219
+ if (/^qwen\b/i.test(normalizedTitle)) return "qwen";
220
+ return "";
255
221
  }
256
-
257
222
  function deriveTerminalStatus(options = {}) {
258
- const title = typeof options.title === 'string' ? options.title : '';
259
- const previewText = typeof options.previewText === 'string' ? options.previewText : '';
260
- const terminalBusy = typeof options.terminalBusy === 'boolean' ? options.terminalBusy : null;
261
- const hasShellStatus = options.shellLastEvent === 'start'
262
- || options.shellLastEvent === 'finish'
263
- || typeof options.shellLastExitCode === 'number';
223
+ const title = typeof options.title === "string" ? options.title : "";
224
+ const previewText = typeof options.previewText === "string" ? options.previewText : "";
225
+ const terminalBusy = typeof options.terminalBusy === "boolean" ? options.terminalBusy : null;
226
+ const hasShellStatus = options.shellLastEvent === "start" || options.shellLastEvent === "finish" || typeof options.shellLastExitCode === "number";
264
227
  const commandName = executableName(options.command).toLowerCase();
265
228
  const runningCommandName = executableName(options.shellCommand).toLowerCase();
266
229
  const launchedFromShell = SHELL_COMMANDS.has(commandName);
@@ -268,59 +231,48 @@ function deriveTerminalStatus(options = {}) {
268
231
  let kind;
269
232
  if (launchedFromShell && runningCommandName) {
270
233
  activityCommandName = runningCommandName;
271
- if (runningCommandName === 'codex') kind = 'codex';
272
- else if (runningCommandName === 'claude') kind = 'claude';
273
- else if (DIRECT_PROCESS_AGENTS.has(runningCommandName)) kind = 'process';
274
- else kind = 'shell';
234
+ if (runningCommandName === "codex") kind = "codex";
235
+ else if (runningCommandName === "claude") kind = "claude";
236
+ else if (DIRECT_PROCESS_AGENTS.has(runningCommandName)) kind = "process";
237
+ else kind = "shell";
275
238
  } else {
276
- const nestedProcessCommand = launchedFromShell && !terminalTextLooksIdleShellPrompt(previewText)
277
- ? nestedProcessCommandFromTitle(title)
278
- : '';
239
+ const nestedProcessCommand = launchedFromShell && !terminalTextLooksIdleShellPrompt(previewText) ? nestedProcessCommandFromTitle(title) : "";
279
240
  if (nestedProcessCommand) {
280
241
  activityCommandName = nestedProcessCommand;
281
- kind = 'process';
242
+ kind = "process";
282
243
  } else {
283
244
  kind = inferKindFromText(title, previewText, options.command);
284
245
  }
285
246
  }
286
- const shellActivity = kind === 'shell';
287
- const hasPromptIdleFallback = options.status !== 'exited'
288
- && shellActivity
289
- && terminalBusy === true
290
- && terminalTextLooksIdleShellPrompt(previewText);
291
- let activity = 'unknown';
292
- if (options.status === 'exited') {
293
- activity = 'exited';
247
+ const shellActivity = kind === "shell";
248
+ const hasPromptIdleFallback = options.status !== "exited" && shellActivity && terminalBusy === true && terminalTextLooksIdleShellPrompt(previewText);
249
+ let activity = "unknown";
250
+ if (options.status === "exited") {
251
+ activity = "exited";
294
252
  } else if (hasPromptIdleFallback) {
295
- activity = 'idle';
253
+ activity = "idle";
254
+ } else if (kind === "codex") {
255
+ const inferredCodexActivity = inferCodexActivity(title, previewText);
256
+ activity = inferredCodexActivity === "unknown" && terminalBusy !== null ? terminalBusy ? "busy" : "idle" : inferredCodexActivity;
296
257
  } else if (!SHELL_COMMANDS.has(commandName) && terminalBusy !== null) {
297
- activity = terminalBusy ? 'busy' : 'idle';
298
- } else if (kind === 'codex') {
299
- activity = inferCodexActivity(title, previewText);
300
- } else if (kind === 'claude') {
258
+ activity = terminalBusy ? "busy" : "idle";
259
+ } else if (kind === "claude") {
301
260
  activity = inferClaudeActivity(previewText);
302
- } else if (activityCommandName === 'opencode') {
261
+ } else if (activityCommandName === "opencode") {
303
262
  activity = inferOpenCodeActivity(previewText);
304
- } else if (activityCommandName === 'qoder'
305
- || activityCommandName === 'qodercli'
306
- || activityCommandName === 'qwen') {
263
+ } else if (activityCommandName === "qoder" || activityCommandName === "qodercli" || activityCommandName === "qwen") {
307
264
  activity = inferQoderLikeActivity(title, previewText, activityCommandName);
308
265
  } else {
309
266
  activity = inferGenericActivity(previewText, terminalBusy);
310
267
  }
311
-
312
268
  const status = {
313
269
  kind,
314
270
  activity,
315
- busy: activity === 'busy',
316
- cwd: typeof options.cwd === 'string' ? options.cwd : '',
271
+ busy: activity === "busy",
272
+ cwd: typeof options.cwd === "string" ? options.cwd : "",
317
273
  title,
318
- lastExitCode: typeof options.shellLastExitCode === 'number' ? options.shellLastExitCode : null,
319
- source: hasPromptIdleFallback
320
- ? 'shell-prompt-fallback'
321
- : (shellActivity && hasShellStatus
322
- ? 'shell-status-marker'
323
- : (shellActivity && terminalBusy !== null ? 'shell-busy-marker' : 'terminal-text')),
274
+ lastExitCode: typeof options.shellLastExitCode === "number" ? options.shellLastExitCode : null,
275
+ source: hasPromptIdleFallback ? "shell-prompt-fallback" : shellActivity && hasShellStatus ? "shell-status-marker" : shellActivity && terminalBusy !== null ? "shell-busy-marker" : "terminal-text"
324
276
  };
325
277
  const runningCommand = terminalStatusCommand(options.shellCommand);
326
278
  const lastCommand = terminalStatusCommand(options.shellLastCommand);
@@ -348,28 +300,26 @@ function deriveTerminalStatus(options = {}) {
348
300
  }
349
301
  return status;
350
302
  }
351
-
352
303
  function terminalInputReady(options = {}) {
353
304
  const status = deriveTerminalStatus(options);
354
- if (status.activity !== 'idle') return false;
355
-
356
- const previewText = typeof options.previewText === 'string' ? options.previewText : '';
357
- if (status.kind === 'codex') {
358
- const text = stripTerminalControlSequences(previewText).replace(/\r/g, '').toLowerCase();
305
+ if (status.activity !== "idle") return false;
306
+ const previewText = typeof options.previewText === "string" ? options.previewText : "";
307
+ if (status.kind === "codex") {
308
+ const text = stripTerminalControlSequences(previewText).replace(/\r/g, "").toLowerCase();
359
309
  return lastCodexIdleFooterIndex(text) >= 0 || codexBlockedIndex(text) >= 0;
360
310
  }
361
- if (status.kind === 'claude') {
362
- const text = stripTerminalControlSequences(previewText).replace(/\r/g, '');
311
+ if (status.kind === "claude") {
312
+ const text = stripTerminalControlSequences(previewText).replace(/\r/g, "");
363
313
  return /(?:^|\n)\s*❯(?:\s|$)/u.test(text);
364
314
  }
365
- if (status.kind === 'shell') {
315
+ if (status.kind === "shell") {
366
316
  return options.terminalBusy === false || terminalTextLooksIdleShellPrompt(previewText);
367
317
  }
368
318
  return Boolean(stripTerminalControlSequences(previewText).trim());
369
319
  }
370
-
371
- module.exports = {
320
+ // Annotate the CommonJS export names for ESM import in node:
321
+ 0 && (module.exports = {
372
322
  deriveTerminalStatus,
373
323
  terminalInputReady,
374
- terminalTextLooksIdleShellPrompt,
375
- };
324
+ terminalTextLooksIdleShellPrompt
325
+ });