farming-code 2.2.30 → 2.2.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (377) hide show
  1. package/THIRD_PARTY_NOTICES.md +7 -0
  2. package/backend/acp/{client-services.js → client-services.cjs} +132 -134
  3. package/backend/acp/packaged-claude-acp.cjs +37 -0
  4. package/backend/acp/packaged-codex-acp.cjs +37 -0
  5. package/backend/acp/patch-decisions.cjs +182 -0
  6. package/backend/acp/permission-security.cjs +131 -0
  7. package/backend/{acp-checkpoint-store.js → acp-checkpoint-store.cjs} +90 -59
  8. package/backend/{acp-runtime.js → acp-runtime.cjs} +1220 -1112
  9. package/backend/acp-session-state.cjs +622 -0
  10. package/backend/acp-transcript.cjs +525 -0
  11. package/backend/agent-env.cjs +257 -0
  12. package/backend/agent-extension-discovery.cjs +452 -0
  13. package/backend/agent-extension-inventory.cjs +116 -0
  14. package/backend/agent-json-stream.cjs +283 -0
  15. package/backend/agent-lifecycle-journal.cjs +185 -0
  16. package/backend/{agent-manager.js → agent-manager.cjs} +3116 -4275
  17. package/backend/agent-order-transaction.cjs +85 -0
  18. package/backend/agent-order.cjs +159 -0
  19. package/backend/agent-provider-session.cjs +98 -0
  20. package/backend/agent-runtime-binding.cjs +179 -0
  21. package/backend/agent-session-history.cjs +1022 -0
  22. package/backend/agent-session-inventory.cjs +291 -0
  23. package/backend/async-cache.cjs +104 -0
  24. package/backend/atomic-json-store.cjs +67 -0
  25. package/backend/auth.cjs +261 -0
  26. package/backend/authoritative-inventory-cache.cjs +383 -0
  27. package/backend/business-health.cjs +68 -0
  28. package/backend/chat-runtime.cjs +50 -0
  29. package/backend/claude-settings.cjs +132 -0
  30. package/backend/cli-agents.cjs +435 -0
  31. package/backend/codex-context-window.cjs +196 -0
  32. package/backend/codex-models.cjs +228 -0
  33. package/backend/codex-session-archive.cjs +82 -0
  34. package/backend/codex-session-history.cjs +590 -0
  35. package/backend/{codex-terminal-profile.js → codex-terminal-profile.cjs} +149 -155
  36. package/backend/codex-transcript-sanitizer.cjs +130 -0
  37. package/backend/codex-transcript.cjs +2107 -0
  38. package/backend/command-runner-child.cjs +105 -0
  39. package/backend/config-manager.cjs +1263 -0
  40. package/backend/control-api.cjs +439 -0
  41. package/backend/data/LICENSE.cua +21 -0
  42. package/backend/executable-discovery.cjs +204 -0
  43. package/backend/farming-agent-bootstrap.cjs +81 -0
  44. package/backend/farming-agent-bootstrap.zh_cn.md +6 -2
  45. package/backend/{farming-app-cli.js → farming-app-cli.cjs} +441 -493
  46. package/backend/farming-cli.cjs +414 -0
  47. package/backend/farming-net-pass.cjs +319 -0
  48. package/backend/farming-net-registry.cjs +123 -0
  49. package/backend/farming-net-server.cjs +309 -0
  50. package/backend/farming-session-store.cjs +651 -0
  51. package/backend/git-worktree-info.cjs +181 -0
  52. package/backend/haiku-token.cjs +828 -0
  53. package/backend/index-html.cjs +96 -0
  54. package/backend/input-parts.cjs +68 -0
  55. package/backend/input-routing.cjs +40 -0
  56. package/backend/{local-session-engine.js → local-session-engine.cjs} +276 -282
  57. package/backend/main-agent-skills.cjs +309 -0
  58. package/backend/main-page-session.cjs +132 -0
  59. package/backend/native-pty-controller-generation.cjs +139 -0
  60. package/backend/{native-pty-host-client.js → native-pty-host-client.cjs} +338 -346
  61. package/backend/native-pty-host-identity.cjs +125 -0
  62. package/backend/native-pty-host-path.cjs +68 -0
  63. package/backend/{native-pty-host.js → native-pty-host.cjs} +480 -569
  64. package/backend/native-session-engine.cjs +296 -0
  65. package/backend/network.cjs +57 -0
  66. package/backend/npm-update-helper.cjs +399 -0
  67. package/backend/packaged-node-pty.cjs +120 -0
  68. package/backend/preview-session-manager.cjs +89 -0
  69. package/backend/provider-adapters.cjs +492 -0
  70. package/backend/provider-home-configuration.cjs +211 -0
  71. package/backend/provider-session-id.cjs +79 -0
  72. package/backend/provider-session-service.cjs +333 -0
  73. package/backend/qr-share-tickets.cjs +119 -0
  74. package/backend/resource-broadcast-protocol.cjs +50 -0
  75. package/backend/review-diff-router.cjs +202 -0
  76. package/backend/review-diff-service.cjs +1267 -0
  77. package/backend/review-session-router.cjs +93 -0
  78. package/backend/review-session-service.cjs +470 -0
  79. package/backend/review-session-store.cjs +161 -0
  80. package/backend/review-state-router.cjs +132 -0
  81. package/backend/review-state-store.cjs +299 -0
  82. package/backend/run-history-store.cjs +97 -0
  83. package/backend/runtime-dependency-manager.cjs +893 -0
  84. package/backend/runtime-executable-invocation.cjs +37 -0
  85. package/backend/runtime-observation.cjs +96 -0
  86. package/backend/server-process-identity.cjs +70 -0
  87. package/backend/server.cjs +3356 -0
  88. package/backend/session-engine-bridge.cjs +144 -0
  89. package/backend/session-engine-router.cjs +105 -0
  90. package/backend/session-engine.cjs +64 -0
  91. package/backend/session-stream-protocol.cjs +181 -0
  92. package/backend/shell-busy-integration.cjs +442 -0
  93. package/backend/slash-command-discovery.cjs +423 -0
  94. package/backend/storage-layout.cjs +263 -0
  95. package/backend/system-monitor.cjs +96 -0
  96. package/backend/terminal-attach-checkpoint.cjs +73 -0
  97. package/backend/terminal-exit-quiescence.cjs +57 -0
  98. package/backend/{terminal-reducer-flow-control.js → terminal-reducer-flow-control.cjs} +45 -22
  99. package/backend/terminal-runtime-cleanup.cjs +99 -0
  100. package/backend/{terminal-screen-state.js → terminal-screen-state.cjs} +100 -108
  101. package/backend/{terminal-screen-worker-pool.js → terminal-screen-worker-pool.cjs} +89 -79
  102. package/backend/{terminal-screen-worker-thread.js → terminal-screen-worker-thread.cjs} +64 -65
  103. package/backend/terminal-screen-worker.cjs +352 -0
  104. package/backend/terminal-state-serialization.cjs +147 -0
  105. package/backend/{terminal-status.js → terminal-status.cjs} +137 -187
  106. package/backend/theme-manager.cjs +185 -0
  107. package/backend/{update-service.js → update-service.cjs} +258 -248
  108. package/backend/usage-forecast.cjs +95 -0
  109. package/backend/{usage-history-client.js → usage-history-client.cjs} +144 -94
  110. package/backend/usage-history-smoke.cjs +85 -0
  111. package/backend/usage-history-worker.cjs +60 -0
  112. package/backend/{usage-monitor.js → usage-monitor.cjs} +363 -390
  113. package/backend/workspace-directory.cjs +239 -0
  114. package/backend/workspace-discovery.cjs +271 -0
  115. package/backend/{workspace-file-router.js → workspace-file-router.cjs} +213 -282
  116. package/backend/{workspace-file-service.js → workspace-file-service.cjs} +1139 -1318
  117. package/backend/workspace-root-registry.cjs +192 -0
  118. package/bin/farming +1 -1
  119. package/dist/acp/codex-acp-1.1.4.mjs +18 -1
  120. package/dist/assets/App-BCkdpWB6.css +1 -0
  121. package/dist/assets/App-CRjKpaGp.js +697 -0
  122. package/dist/assets/CodeSelect-Ci8sKZPU.js +1 -0
  123. package/dist/assets/CodeSelect-T2eNzrOc.css +1 -0
  124. package/dist/assets/{FileEditorMarkdownPreview-Cs9cLv8a.js → FileEditorMarkdownPreview-V06QHlAg.js} +55 -55
  125. package/dist/assets/FileEditorPane-BX-Wjg9U.js +2 -0
  126. package/dist/assets/IconGlyphs-YhV7tqd4.js +1 -0
  127. package/dist/assets/ProjectFilesSection-BDT2_r0o.js +12 -0
  128. package/dist/assets/ReviewPage-BqAs5sG1.js +3 -0
  129. package/dist/assets/code-dark-B7eM_9G9.css +1 -0
  130. package/dist/assets/{cssMode-Bdg5RpcJ.js → cssMode-ADdAlxTO.js} +1 -1
  131. package/dist/assets/{editor.api2-D74ufkbr.js → editor.api2-BFLAr0YF.js} +162 -162
  132. package/dist/assets/file-icons-BpeqWkIB.js +1 -0
  133. package/dist/assets/{freemarker2-DfMDJfnE.js → freemarker2-C90q5jrp.js} +1 -1
  134. package/dist/assets/{handlebars-BEdPtzMT.js → handlebars-BwUQcEDq.js} +1 -1
  135. package/dist/assets/{html-B1fPb1QD.js → html-1s3uPKfh.js} +1 -1
  136. package/dist/assets/{htmlMode-CY2ZjHxH.js → htmlMode-xtKD99de.js} +1 -1
  137. package/dist/assets/{index-D-zetSol.js → index-C8MchCem.js} +3 -3
  138. package/dist/assets/{javascript-BV2OsWA0.js → javascript-Ph7ijyny.js} +1 -1
  139. package/dist/assets/{jsonMode-zd07aeuX.js → jsonMode-D-jGAnFH.js} +1 -1
  140. package/dist/assets/linkComputer-CbGyI_qx.js +1 -0
  141. package/dist/assets/{liquid-BParI24X.js → liquid-0IamE_cI.js} +1 -1
  142. package/dist/assets/{lspLanguageFeatures-BzredkoV.js → lspLanguageFeatures-BxnQunWF.js} +1 -1
  143. package/dist/assets/main-CLKXa6hf.css +1 -0
  144. package/dist/assets/{mdx-vGzUJN98.js → mdx-DdNmfivn.js} +1 -1
  145. package/dist/assets/{monaco.contribution-BmaeBQEc.js → monaco.contribution-B43jsUs1.js} +2 -2
  146. package/dist/assets/{python-CUwdLgsI.js → python-IAt4X5TS.js} +1 -1
  147. package/dist/assets/{razor-BScebUxU.js → razor-DRkFYW0S.js} +1 -1
  148. package/dist/assets/review-C8-oPKXk.css +1 -0
  149. package/dist/assets/{tsMode-DzUAibXK.js → tsMode-_d_4U2gf.js} +1 -1
  150. package/dist/assets/{typescript-D9EOeM7N.js → typescript-C7zcMq9l.js} +1 -1
  151. package/dist/assets/{workers-DAiomYZM.js → workers-D0nOyJzf.js} +1 -1
  152. package/dist/assets/workspace-editor-model-DND_Y-Bj.js +1 -0
  153. package/dist/assets/workspace-editor-monaco-BPWhgcIB.js +4 -0
  154. package/dist/assets/workspace-editor-monaco-N641qPjX.js +1 -0
  155. package/dist/assets/workspace-view-state-k1bTlJ_Z.js +13 -0
  156. package/dist/assets/{xml-wWl1dhkQ.js → xml-BR-HvxT8.js} +1 -1
  157. package/dist/assets/{yaml-Dc2WDaOZ.js → yaml-YtFQwh4q.js} +1 -1
  158. package/dist/index.html +1 -1
  159. package/extensions/browser/backend/agent-browser-runtime.cjs +1040 -0
  160. package/extensions/browser/backend/agent-capability.cjs +85 -0
  161. package/extensions/browser/backend/browser-mcp-server.cjs +655 -0
  162. package/extensions/browser/backend/browser-resource-manager.cjs +1486 -0
  163. package/extensions/browser/backend/browser-resource-store.cjs +228 -0
  164. package/extensions/browser/backend/browser-router.cjs +203 -0
  165. package/extensions/browser/backend/executable-discovery.cjs +248 -0
  166. package/extensions/browser/backend/farming-browser-client.cjs +116 -0
  167. package/extensions/browser/backend/index.cjs +32 -0
  168. package/extensions/browser/backend/managed-chromium-installer.cjs +833 -0
  169. package/extensions/browser/bin/farming-browser +16 -7
  170. package/extensions/computer/backend/agent-capability.cjs +72 -0
  171. package/extensions/computer/backend/computer-constants.cjs +59 -0
  172. package/extensions/computer/backend/computer-mcp-server.cjs +182 -0
  173. package/extensions/computer/backend/computer-resource-manager.cjs +1219 -0
  174. package/extensions/computer/backend/computer-resource-store.cjs +190 -0
  175. package/extensions/computer/backend/computer-router.cjs +257 -0
  176. package/extensions/computer/backend/cua-tools.json +3067 -0
  177. package/extensions/computer/backend/farming-computer-client.cjs +84 -0
  178. package/extensions/computer/backend/index.cjs +35 -0
  179. package/extensions/computer/backend/isolated-browser-provider.cjs +157 -0
  180. package/extensions/computer/bin/farming-computer +131 -0
  181. package/frontend/farming-net/app.js +255 -262
  182. package/frontend/ghostty-loader.js +24 -20
  183. package/frontend/reading-anchor.js +210 -193
  184. package/frontend/runtime-paths.js +24 -26
  185. package/frontend/session-bridge.js +90 -111
  186. package/frontend/session-modal-bridge.js +184 -302
  187. package/frontend/skin-bridge.js +20 -23
  188. package/frontend/skins/crt/app.js +7686 -7901
  189. package/frontend/skins/crt/effects.js +7 -6
  190. package/frontend/skins/crt/index.html +6 -6
  191. package/frontend/skins/crt/styles/markdown.css +4 -4
  192. package/frontend/terminal-bridge.js +174 -181
  193. package/frontend/terminal-replay.js +320 -345
  194. package/frontend/theme-loader.js +55 -71
  195. package/package.json +64 -37
  196. package/shared/backend-connection-status.js +38 -69
  197. package/shared/browser-protocol.js +235 -110
  198. package/shared/websocket-liveness.js +40 -0
  199. package/backend/acp/packaged-claude-acp.js +0 -13
  200. package/backend/acp/packaged-codex-acp.js +0 -13
  201. package/backend/acp/patch-decisions.js +0 -153
  202. package/backend/acp/permission-security.js +0 -108
  203. package/backend/acp-session-state.js +0 -634
  204. package/backend/acp-transcript.js +0 -512
  205. package/backend/agent-env.js +0 -250
  206. package/backend/agent-json-stream.js +0 -268
  207. package/backend/agent-lifecycle-journal.js +0 -133
  208. package/backend/agent-order.js +0 -166
  209. package/backend/agent-provider-session.js +0 -76
  210. package/backend/agent-runtime-binding.js +0 -174
  211. package/backend/agent-session-history.js +0 -986
  212. package/backend/async-cache.js +0 -94
  213. package/backend/atomic-json-store.js +0 -37
  214. package/backend/auth.js +0 -251
  215. package/backend/chat-runtime.js +0 -28
  216. package/backend/claude-settings.js +0 -121
  217. package/backend/cli-agents.js +0 -486
  218. package/backend/codex-context-window.js +0 -189
  219. package/backend/codex-models.js +0 -226
  220. package/backend/codex-session-archive.js +0 -65
  221. package/backend/codex-session-history.js +0 -647
  222. package/backend/codex-transcript-sanitizer.js +0 -115
  223. package/backend/codex-transcript.js +0 -2362
  224. package/backend/command-runner-child.js +0 -67
  225. package/backend/config-manager.js +0 -1117
  226. package/backend/control-api.js +0 -455
  227. package/backend/executable-discovery.js +0 -216
  228. package/backend/farming-agent-bootstrap.js +0 -49
  229. package/backend/farming-cli.js +0 -403
  230. package/backend/farming-net-pass.js +0 -285
  231. package/backend/farming-net-registry.js +0 -112
  232. package/backend/farming-net-server.js +0 -298
  233. package/backend/farming-session-store.js +0 -677
  234. package/backend/git-worktree-info.js +0 -181
  235. package/backend/haiku-token.js +0 -772
  236. package/backend/index-html.js +0 -80
  237. package/backend/input-parts.js +0 -54
  238. package/backend/input-routing.js +0 -24
  239. package/backend/json-cli-runtime.js +0 -275
  240. package/backend/main-agent-skills.js +0 -288
  241. package/backend/main-page-session.js +0 -122
  242. package/backend/native-pty-controller-generation.js +0 -106
  243. package/backend/native-pty-host-identity.js +0 -86
  244. package/backend/native-pty-host-path.js +0 -42
  245. package/backend/native-session-engine.js +0 -268
  246. package/backend/network.js +0 -23
  247. package/backend/npm-update-helper.js +0 -374
  248. package/backend/packaged-node-pty.js +0 -99
  249. package/backend/preview-session-manager.js +0 -68
  250. package/backend/provider-adapters.js +0 -399
  251. package/backend/provider-session-id.js +0 -47
  252. package/backend/provider-session-service.js +0 -345
  253. package/backend/qr-share-tickets.js +0 -100
  254. package/backend/review-diff-router.js +0 -180
  255. package/backend/review-diff-service.js +0 -1270
  256. package/backend/review-session-router.js +0 -74
  257. package/backend/review-session-service.js +0 -446
  258. package/backend/review-session-store.js +0 -151
  259. package/backend/review-state-router.js +0 -116
  260. package/backend/review-state-store.js +0 -286
  261. package/backend/run-history-store.js +0 -67
  262. package/backend/runtime-dependency-manager.js +0 -759
  263. package/backend/runtime-executable-invocation.js +0 -20
  264. package/backend/runtime-observation.js +0 -81
  265. package/backend/server-process-identity.js +0 -47
  266. package/backend/server.js +0 -3225
  267. package/backend/session-engine-bridge.js +0 -129
  268. package/backend/session-engine-router.js +0 -66
  269. package/backend/session-engine.js +0 -39
  270. package/backend/session-stream-protocol.js +0 -185
  271. package/backend/shell-busy-integration.js +0 -472
  272. package/backend/slash-command-discovery.js +0 -433
  273. package/backend/storage-layout.js +0 -205
  274. package/backend/system-monitor.js +0 -77
  275. package/backend/terminal-attach-checkpoint.js +0 -74
  276. package/backend/terminal-exit-quiescence.js +0 -39
  277. package/backend/terminal-runtime-cleanup.js +0 -80
  278. package/backend/terminal-screen-worker.js +0 -337
  279. package/backend/terminal-state-serialization.js +0 -127
  280. package/backend/theme-manager.js +0 -163
  281. package/backend/usage-forecast.js +0 -86
  282. package/backend/usage-history-scanner.ts +0 -2718
  283. package/backend/usage-history-smoke.js +0 -64
  284. package/backend/usage-history-worker.js +0 -34
  285. package/backend/workspace-directory.js +0 -232
  286. package/backend/workspace-discovery.js +0 -311
  287. package/backend/workspace-root-registry.js +0 -166
  288. package/dist/assets/App-BKNUILuL.css +0 -1
  289. package/dist/assets/App-Z1N7T0eM.js +0 -695
  290. package/dist/assets/FileEditorPane-CNtuGjQ3.js +0 -2
  291. package/dist/assets/IconGlyphs-BClgag6E.js +0 -1
  292. package/dist/assets/ProjectFilesSection-K3GHuQ4U.js +0 -12
  293. package/dist/assets/ReviewPage-BRuxFaH5.js +0 -3
  294. package/dist/assets/code-dark-kLsQLvpf.css +0 -1
  295. package/dist/assets/file-icons-BOlcJ0ZF.js +0 -1
  296. package/dist/assets/main-DUTz-Rd2.css +0 -1
  297. package/dist/assets/review-BcnwQtJv.css +0 -1
  298. package/dist/assets/workspace-editor-model-CSGCl21x.js +0 -1
  299. package/dist/assets/workspace-editor-monaco-CJNwbpCy.js +0 -4
  300. package/dist/assets/workspace-editor-monaco-CO9w8YV0.js +0 -1
  301. package/dist/assets/workspace-view-state-BjKPYp0E.js +0 -7
  302. package/extensions/browser/backend/agent-browser-runtime.js +0 -1041
  303. package/extensions/browser/backend/agent-capability.js +0 -55
  304. package/extensions/browser/backend/browser-mcp-server.js +0 -621
  305. package/extensions/browser/backend/browser-resource-manager.js +0 -1331
  306. package/extensions/browser/backend/browser-resource-store.js +0 -190
  307. package/extensions/browser/backend/browser-router.js +0 -141
  308. package/extensions/browser/backend/executable-discovery.js +0 -238
  309. package/extensions/browser/backend/farming-browser-client.js +0 -83
  310. package/extensions/browser/backend/index.js +0 -7
  311. package/extensions/browser/backend/managed-chromium-installer.js +0 -593
  312. package/extensions/browser/frontend/BrowserSidebarPortals.tsx +0 -360
  313. package/extensions/browser/frontend/BrowserViewer.tsx +0 -500
  314. package/extensions/browser/frontend/browser-resource-state.ts +0 -60
  315. package/extensions/browser/frontend/browser.css +0 -567
  316. package/extensions/browser/frontend/types.ts +0 -38
  317. package/extensions/browser/frontend/useBrowserResources.ts +0 -166
  318. package/frontend/vendor/ghostty-web/index.d.ts +0 -1842
  319. package/shared/backend-connection-status.d.ts +0 -37
  320. package/shared/browser-protocol.d.ts +0 -5
  321. /package/dist/assets/{api-w2x5QfxB.js → api-ByCV9MEr.js} +0 -0
  322. /package/dist/assets/{core-vPkV8P_m.js → core-Czwdx12k.js} +0 -0
  323. /package/dist/assets/{fsharp-DNZNZyEE.js → fsharp-BjPpkoJe.js} +0 -0
  324. /package/dist/assets/{go-_kPJjNc_.js → go-BkIDmSUP.js} +0 -0
  325. /package/dist/assets/{graphql-4HCNVt5g.js → graphql-CCJTpqi1.js} +0 -0
  326. /package/dist/assets/{hcl-C87ymY0o.js → hcl-s4z8lUFg.js} +0 -0
  327. /package/dist/assets/{ini-BYrrGNTc.js → ini-CyUW1I7Z.js} +0 -0
  328. /package/dist/assets/{java-B211rJbk.js → java-CFCcGRiM.js} +0 -0
  329. /package/dist/assets/{julia-DVPsRtBm.js → julia-DQyH_EYb.js} +0 -0
  330. /package/dist/assets/{kotlin-BYyNerjp.js → kotlin-B8hA5O51.js} +0 -0
  331. /package/dist/assets/{less-EC9UblGE.js → less-DaVdaas0.js} +0 -0
  332. /package/dist/assets/{lexon-B1yuUdqW.js → lexon-DLBhPd3y.js} +0 -0
  333. /package/dist/assets/{lua-Bo6GFzxT.js → lua-gB1c_cif.js} +0 -0
  334. /package/dist/assets/{m3-C-Y9cBVI.js → m3-C2T3z3gB.js} +0 -0
  335. /package/dist/assets/{markdown-BHu-wLbe.js → markdown-CKq-Euj1.js} +0 -0
  336. /package/dist/assets/{mips-Dkds26rX.js → mips-Bcs5qIDX.js} +0 -0
  337. /package/dist/assets/{msdax-PU4g-8_g.js → msdax-CBP48FHF.js} +0 -0
  338. /package/dist/assets/{mysql-fPpuGpS7.js → mysql-c7tiPcFj.js} +0 -0
  339. /package/dist/assets/{objective-c-Wy1e5JUf.js → objective-c-D4BZkeEV.js} +0 -0
  340. /package/dist/assets/{pascal-BIXwvrqU.js → pascal-CJDZg0MN.js} +0 -0
  341. /package/dist/assets/{pascaligo-DwR0AtL_.js → pascaligo-Bygi8Ynl.js} +0 -0
  342. /package/dist/assets/{perl-CGHAl8my.js → perl-aS8bkf7E.js} +0 -0
  343. /package/dist/assets/{pgsql-B91M73E2.js → pgsql-CzNAYFYl.js} +0 -0
  344. /package/dist/assets/{php-C70ttrCx.js → php-DOtoEFTT.js} +0 -0
  345. /package/dist/assets/{pla-BNrXaRh0.js → pla-DugRnao1.js} +0 -0
  346. /package/dist/assets/{postiats-Dv2IAZR9.js → postiats-DsXwusKh.js} +0 -0
  347. /package/dist/assets/{powerquery-CkY5Wq7J.js → powerquery-DL3o72oD.js} +0 -0
  348. /package/dist/assets/{powershell-uGIYLU3C.js → powershell-C1qHekys.js} +0 -0
  349. /package/dist/assets/{protobuf-CavfmJu-.js → protobuf-DHgsc-cH.js} +0 -0
  350. /package/dist/assets/{pug-Drqnyitx.js → pug-FZXlE_Iu.js} +0 -0
  351. /package/dist/assets/{qrcode-7uGsTEmi.js → qrcode-DJDTdjL7.js} +0 -0
  352. /package/dist/assets/{qsharp-C7yF-Dti.js → qsharp-bLyhI3DT.js} +0 -0
  353. /package/dist/assets/{r-HXLGP0_-.js → r-DjFGXbAa.js} +0 -0
  354. /package/dist/assets/{redis-C4y6mf2p.js → redis-DSoZ_V6u.js} +0 -0
  355. /package/dist/assets/{redshift-DdQrFPrv.js → redshift-CzkdCsrg.js} +0 -0
  356. /package/dist/assets/{restructuredtext-CBrf2PNj.js → restructuredtext-B_XPrGCQ.js} +0 -0
  357. /package/dist/assets/{ruby-CVtMoX2B.js → ruby-Cry2RneJ.js} +0 -0
  358. /package/dist/assets/{rust-Ckq4sbMP.js → rust-CWzdbFq1.js} +0 -0
  359. /package/dist/assets/{sb-er66OpE3.js → sb-DmofU59h.js} +0 -0
  360. /package/dist/assets/{scala-BdWZz-hH.js → scala-BUC2l-vN.js} +0 -0
  361. /package/dist/assets/{scheme-kTV_s2kP.js → scheme-CNIB_72f.js} +0 -0
  362. /package/dist/assets/{scss-Bymy2VJQ.js → scss-DcL4-NbX.js} +0 -0
  363. /package/dist/assets/{shell-bwEP1LQ1.js → shell-CgAGvSSA.js} +0 -0
  364. /package/dist/assets/{solidity-DCddeBgL.js → solidity-DSkt6O_P.js} +0 -0
  365. /package/dist/assets/{sophia-BMN3AQig.js → sophia--5ytcjDN.js} +0 -0
  366. /package/dist/assets/{sparql-CSXOLjzi.js → sparql-C1Srr7cD.js} +0 -0
  367. /package/dist/assets/{sql-COg8ewmK.js → sql-2k_O5fj7.js} +0 -0
  368. /package/dist/assets/{st-CIaZtBS_.js → st-DCCCPqfz.js} +0 -0
  369. /package/dist/assets/{swift-DXiOhUHu.js → swift-Dd8mAfOt.js} +0 -0
  370. /package/dist/assets/{systemverilog-BTDE6Dr2.js → systemverilog-B0-aZYXu.js} +0 -0
  371. /package/dist/assets/{tcl-B0zy9NvV.js → tcl-CZAZwPVX.js} +0 -0
  372. /package/dist/assets/{twig-D594l4Z1.js → twig-D-Ag0tdS.js} +0 -0
  373. /package/dist/assets/{typespec-XKVjaPqo.js → typespec-B7kTFp0Z.js} +0 -0
  374. /package/dist/assets/{useWorkspaceMenuKeyboard-Bpy_s69Z.js → useWorkspaceMenuKeyboard-uYZpDxhU.js} +0 -0
  375. /package/dist/assets/{vb-B2wYoKRV.js → vb-20w1JPum.js} +0 -0
  376. /package/dist/assets/{wgsl-D0Yf2LbK.js → wgsl-CLJfqFt0.js} +0 -0
  377. /package/dist/assets/{workspace-working-copy-C3FSR3N6.js → workspace-working-copy-Cfz07cOd.js} +0 -0
@@ -1,250 +0,0 @@
1
- const os = require('os');
2
- const fs = require('fs');
3
- const path = require('path');
4
- const { spawnSync } = require('child_process');
5
-
6
- const SHELL_ENV_BEGIN = '__FARMING_AGENT_ENV_BEGIN__';
7
- const SHELL_ENV_END = '__FARMING_AGENT_ENV_END__';
8
- const DEFAULT_SHELL_ENV_TIMEOUT_MS = 2500;
9
-
10
- function isCatPager(value) {
11
- const text = String(value || '').trim();
12
- if (!text) return false;
13
- return /^(?:\/[^\s]+\/)?cat(?:\s|$)/.test(text);
14
- }
15
-
16
- function scrubNonInteractivePagerEnv(env) {
17
- const next = env || {};
18
- if (next.FARMING_PRESERVE_AGENT_CAT_PAGER === '1') {
19
- return next;
20
- }
21
-
22
- if (isCatPager(next.PAGER)) delete next.PAGER;
23
- if (isCatPager(next.GIT_PAGER)) delete next.GIT_PAGER;
24
- return next;
25
- }
26
-
27
- function shellQuote(value) {
28
- return `'${String(value).replace(/'/g, "'\\''")}'`;
29
- }
30
-
31
- function normalizeTimeoutMs(value, fallback = DEFAULT_SHELL_ENV_TIMEOUT_MS) {
32
- const parsed = Math.floor(Number(value));
33
- if (!Number.isFinite(parsed)) return fallback;
34
- return Math.max(250, Math.min(parsed, 15000));
35
- }
36
-
37
- function defaultShell(processEnv = process.env) {
38
- if (processEnv.SHELL) return processEnv.SHELL;
39
- if (process.platform === 'win32') return '';
40
- if (fsExists('/bin/bash')) return '/bin/bash';
41
- return '/bin/sh';
42
- }
43
-
44
- function fsExists(filePath) {
45
- try {
46
- return fs.existsSync(filePath);
47
- } catch {
48
- return false;
49
- }
50
- }
51
-
52
- function shellEnvArgs(shell, command) {
53
- const name = path.basename(String(shell || '')).toLowerCase();
54
- if (name === 'bash' || name === 'zsh' || name === 'fish' || name === 'ksh') {
55
- return ['-lic', command];
56
- }
57
- if (process.platform === 'win32' && (name === 'cmd.exe' || name === 'cmd')) {
58
- return ['/d', '/s', '/c', command];
59
- }
60
- return ['-lc', command];
61
- }
62
-
63
- function buildShellEnvCommand(nodePath = process.execPath) {
64
- const script = 'process.stdout.write(JSON.stringify(process.env))';
65
- return [
66
- `printf '\\n${SHELL_ENV_BEGIN}\\n'`,
67
- `${shellQuote(nodePath)} -e ${shellQuote(script)}`,
68
- `printf '\\n${SHELL_ENV_END}\\n'`,
69
- ].join('; ');
70
- }
71
-
72
- function parseShellEnvOutput(output) {
73
- const text = Buffer.isBuffer(output) ? output.toString('utf8') : String(output || '');
74
- const start = text.indexOf(SHELL_ENV_BEGIN);
75
- const end = text.lastIndexOf(SHELL_ENV_END);
76
- if (start < 0 || end <= start) return null;
77
-
78
- const jsonText = text.slice(start + SHELL_ENV_BEGIN.length, end).trim();
79
- if (!jsonText) return null;
80
-
81
- try {
82
- const parsed = JSON.parse(jsonText);
83
- if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return null;
84
- return Object.fromEntries(
85
- Object.entries(parsed)
86
- .filter(([key, value]) => typeof key === 'string' && typeof value === 'string')
87
- );
88
- } catch {
89
- return null;
90
- }
91
- }
92
-
93
- function resolveUserShellEnvSync(options = {}) {
94
- const processEnv = options.processEnv || process.env;
95
- if (String(processEnv.FARMING_AGENT_SHELL_ENV || '').toLowerCase() === '0' ||
96
- String(processEnv.FARMING_AGENT_SHELL_ENV || '').toLowerCase() === 'false') {
97
- return null;
98
- }
99
-
100
- const shell = options.shell || defaultShell(processEnv);
101
- if (!shell) return null;
102
-
103
- const command = options.command || buildShellEnvCommand(options.nodePath || process.execPath);
104
- const args = options.args || shellEnvArgs(shell, command);
105
- const timeout = normalizeTimeoutMs(options.timeoutMs ?? processEnv.FARMING_AGENT_SHELL_ENV_TIMEOUT_MS);
106
- const env = {
107
- ...processEnv,
108
- FARMING_COLLECT_AGENT_SHELL_ENV: '1',
109
- };
110
-
111
- const result = spawnSync(shell, args, {
112
- cwd: options.cwd || processEnv.HOME || os.homedir(),
113
- env,
114
- input: '',
115
- encoding: 'utf8',
116
- maxBuffer: 1024 * 1024,
117
- timeout,
118
- windowsHide: true,
119
- });
120
-
121
- if (result.error || result.signal === 'SIGTERM' || result.status === 124) {
122
- return null;
123
- }
124
-
125
- return parseShellEnvOutput(result.stdout);
126
- }
127
-
128
- const PROCESS_ENV_EXACT_KEYS = new Set([
129
- 'ANTHROPIC_API_KEY',
130
- 'ANTHROPIC_AUTH_TOKEN',
131
- 'ANTHROPIC_BASE_URL',
132
- 'ALL_PROXY',
133
- 'all_proxy',
134
- 'CLAUDE_CONFIG_DIR',
135
- 'CODEX_HOME',
136
- 'OPENCODE_CONFIG_DIR',
137
- 'QODER_CONFIG_DIR',
138
- 'CURL_CA_BUNDLE',
139
- 'DASHSCOPE_API_KEY',
140
- 'EDITOR',
141
- 'FARMING_ANONYMIZE_SHELL_PROMPT',
142
- 'FARMING_PRESERVE_AGENT_CAT_PAGER',
143
- 'FARMING_SHELL_CONTROLLED_PROMPT',
144
- 'GEMINI_API_KEY',
145
- 'GIT_ASKPASS',
146
- 'GITHUB_TOKEN',
147
- 'GITLAB_TOKEN',
148
- 'GPG_TTY',
149
- 'HTTPS_PROXY',
150
- 'https_proxy',
151
- 'HTTP_PROXY',
152
- 'http_proxy',
153
- 'LANG',
154
- 'LC_ALL',
155
- 'LC_CTYPE',
156
- 'NO_PROXY',
157
- 'no_proxy',
158
- 'NODE_EXTRA_CA_CERTS',
159
- 'OPENAI_API_KEY',
160
- 'OPENAI_BASE_URL',
161
- 'OPENAI_MODEL',
162
- 'REQUESTS_CA_BUNDLE',
163
- 'SHELL',
164
- 'SSH_AGENT_PID',
165
- 'SSH_AUTH_SOCK',
166
- 'SSL_CERT_DIR',
167
- 'SSL_CERT_FILE',
168
- 'VISUAL',
169
- ]);
170
-
171
- const PROCESS_ENV_PREFIXES = [
172
- 'ANTHROPIC_',
173
- 'AWS_',
174
- 'AZURE_OPENAI_',
175
- 'CLAUDE_CODE_',
176
- 'DASHSCOPE_',
177
- 'GEMINI_',
178
- 'GITHUB_',
179
- 'GITLAB_',
180
- 'GOOGLE_API_',
181
- 'GOOGLE_CLOUD_',
182
- 'LANGCHAIN_',
183
- 'LC_',
184
- 'NPM_CONFIG_',
185
- 'OPENAI_',
186
- 'PIP_',
187
- 'QWEN_',
188
- 'UV_',
189
- 'npm_config_',
190
- ];
191
-
192
- function shouldOverlayProcessEnv(key) {
193
- return PROCESS_ENV_EXACT_KEYS.has(key) || PROCESS_ENV_PREFIXES.some(prefix => key.startsWith(prefix));
194
- }
195
-
196
- function buildInteractiveAgentBaseEnv(options = {}) {
197
- const processEnv = options.processEnv || process.env;
198
- const shellEnv = options.shellEnv && typeof options.shellEnv === 'object' ? options.shellEnv : null;
199
- const env = shellEnv ? { ...shellEnv } : { ...processEnv };
200
-
201
- for (const [key, value] of Object.entries(processEnv)) {
202
- if (typeof value !== 'string') continue;
203
- if (!shouldOverlayProcessEnv(key)) continue;
204
- if (key in env && env[key] !== '') continue;
205
- env[key] = value;
206
- }
207
-
208
- if (!env.HOME) env.HOME = processEnv.HOME || os.homedir();
209
- if (!env.USER && processEnv.USER) env.USER = processEnv.USER;
210
- if (!env.LOGNAME && processEnv.LOGNAME) env.LOGNAME = processEnv.LOGNAME;
211
- if (!env.PATH && processEnv.PATH) env.PATH = processEnv.PATH;
212
-
213
- return env;
214
- }
215
-
216
- function normalizeInteractiveTerminalEnv(env, options = {}) {
217
- const next = env || {};
218
-
219
- if (options.stripRuntimeShims !== false) {
220
- delete next.LD_LIBRARY_PATH;
221
- }
222
- if (options.stripNodeOptions !== false) {
223
- delete next.NODE_OPTIONS;
224
- }
225
-
226
- delete next.NO_COLOR;
227
- scrubNonInteractivePagerEnv(next);
228
-
229
- if (!next.TERM || String(next.TERM).toLowerCase() === 'dumb') {
230
- next.TERM = 'xterm-256color';
231
- }
232
- next.COLORTERM = 'truecolor';
233
- next.CLICOLOR = next.CLICOLOR || '1';
234
- next.TERM_PROGRAM = 'farming';
235
- next.TERM_PROGRAM_VERSION = process.env.npm_package_version || '';
236
- return next;
237
- }
238
-
239
- module.exports = {
240
- SHELL_ENV_BEGIN,
241
- SHELL_ENV_END,
242
- buildInteractiveAgentBaseEnv,
243
- buildShellEnvCommand,
244
- isCatPager,
245
- normalizeInteractiveTerminalEnv,
246
- parseShellEnvOutput,
247
- resolveUserShellEnvSync,
248
- scrubNonInteractivePagerEnv,
249
- shellEnvArgs,
250
- };
@@ -1,268 +0,0 @@
1
- const { buildTranscriptFromEvents } = require('./codex-transcript');
2
-
3
- const DEFAULT_MAX_EVENTS = 12_000;
4
-
5
- class JsonlStreamDecoder {
6
- constructor() {
7
- this.buffer = '';
8
- }
9
-
10
- push(chunk) {
11
- this.buffer += Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk || '');
12
- const lines = this.buffer.split('\n');
13
- this.buffer = lines.pop() || '';
14
- return lines.flatMap(parseJsonLine);
15
- }
16
-
17
- flush() {
18
- const trailing = this.buffer;
19
- this.buffer = '';
20
- return parseJsonLine(trailing);
21
- }
22
- }
23
-
24
- function parseJsonLine(line) {
25
- const text = String(line || '').trim();
26
- if (!text) return [];
27
- try {
28
- return [JSON.parse(text)];
29
- } catch {
30
- // Coding-agent CLIs occasionally print update notices or diagnostics to
31
- // stdout. They should remain visible in the terminal, but must not poison
32
- // the structured chat stream.
33
- return [];
34
- }
35
- }
36
-
37
- function itemEvent(type, turnId, item) {
38
- return { type, turn_id: turnId, item };
39
- }
40
-
41
- class CodexJsonAdapter {
42
- constructor(options) {
43
- this.prompt = options.prompt;
44
- this.operationId = options.operationId;
45
- this.turnId = `codex-${this.operationId}`;
46
- this.sessionId = '';
47
- this.started = false;
48
- }
49
-
50
- adapt(raw) {
51
- if (!raw || typeof raw !== 'object') return [];
52
- if (raw.type === 'thread.started') {
53
- this.sessionId = typeof raw.thread_id === 'string' ? raw.thread_id : this.sessionId;
54
- return [];
55
- }
56
- if (raw.type === 'turn.started') {
57
- if (this.started) return [];
58
- this.started = true;
59
- return [
60
- { type: 'turn.started', turn_id: this.turnId },
61
- ...this.userMessageEvents(),
62
- ];
63
- }
64
- if (raw.type === 'item.started' || raw.type === 'item.completed') {
65
- this.ensureStarted();
66
- return [itemEvent(raw.type, this.turnId, raw.item)];
67
- }
68
- if (raw.type === 'turn.completed') {
69
- this.ensureStarted();
70
- return [{ ...raw, turn_id: this.turnId }];
71
- }
72
- if (raw.type === 'turn.failed' || raw.type === 'error') {
73
- this.ensureStarted();
74
- const message = raw.message || raw.error?.message || raw.error || 'Codex execution failed';
75
- return [
76
- itemEvent('item.completed', this.turnId, {
77
- id: `${this.turnId}-error`,
78
- type: 'error',
79
- message: typeof message === 'string' ? message : JSON.stringify(message),
80
- status: 'failed',
81
- }),
82
- { type: 'turn.completed', turn_id: this.turnId },
83
- ];
84
- }
85
- return [];
86
- }
87
-
88
- flush() {
89
- return [];
90
- }
91
-
92
- ensureStarted() {
93
- this.started = true;
94
- }
95
-
96
- userMessageEvents() {
97
- if (!this.prompt) return [];
98
- return [itemEvent('item.completed', this.turnId, {
99
- id: `${this.turnId}-user`,
100
- type: 'user_message',
101
- content: [{ type: 'text', text: this.prompt }],
102
- })];
103
- }
104
- }
105
-
106
- function openCodeToolItem(part) {
107
- const state = part.state && typeof part.state === 'object' ? part.state : {};
108
- const input = state.input && typeof state.input === 'object' ? state.input : {};
109
- const id = part.callID || part.id;
110
- if (part.tool === 'bash') {
111
- return {
112
- id,
113
- type: 'command_execution',
114
- command: input.command || state.title || '',
115
- aggregated_output: state.output || state.metadata?.output || '',
116
- exit_code: Number.isFinite(state.metadata?.exit) ? state.metadata.exit : null,
117
- status: state.status,
118
- };
119
- }
120
- return {
121
- id,
122
- type: 'mcp_tool_call',
123
- server: 'opencode',
124
- tool: part.tool || 'tool',
125
- arguments: input,
126
- result: state.output,
127
- error: state.error,
128
- status: state.status,
129
- };
130
- }
131
-
132
- class OpenCodeJsonAdapter {
133
- constructor(options) {
134
- this.prompt = options.prompt;
135
- this.operationId = options.operationId;
136
- this.turnId = `opencode-${this.operationId}`;
137
- this.sessionId = '';
138
- this.started = false;
139
- this.completed = false;
140
- this.text = '';
141
- }
142
-
143
- adapt(raw) {
144
- if (!raw || typeof raw !== 'object') return [];
145
- if (typeof raw.sessionID === 'string') this.sessionId = raw.sessionID;
146
- const events = this.startEvents(raw.timestamp);
147
- const part = raw.part && typeof raw.part === 'object' ? raw.part : {};
148
-
149
- if (raw.type === 'text' && typeof part.text === 'string') {
150
- this.text += part.text;
151
- events.push(itemEvent('item.completed', this.turnId, {
152
- id: `${this.turnId}-assistant`,
153
- type: 'agent_message',
154
- text: this.text,
155
- }));
156
- } else if (raw.type === 'tool_use' && (part.callID || part.id)) {
157
- const state = part.state && typeof part.state === 'object' ? part.state : {};
158
- const eventType = state.status === 'completed' || state.status === 'error'
159
- ? 'item.completed'
160
- : 'item.started';
161
- events.push(itemEvent(eventType, this.turnId, openCodeToolItem(part)));
162
- } else if (raw.type === 'error') {
163
- const message = raw.error?.message || raw.message || raw.error || 'OpenCode execution failed';
164
- events.push(itemEvent('item.completed', this.turnId, {
165
- id: `${this.turnId}-error`,
166
- type: 'error',
167
- message: typeof message === 'string' ? message : JSON.stringify(message),
168
- status: 'failed',
169
- }));
170
- }
171
-
172
- if (raw.type === 'step_finish' && part.reason !== 'tool-calls') {
173
- events.push(...this.completeEvents(raw.timestamp));
174
- }
175
- return events;
176
- }
177
-
178
- flush() {
179
- return this.completeEvents();
180
- }
181
-
182
- startEvents(timestamp) {
183
- if (this.started) return [];
184
- this.started = true;
185
- const events = [{
186
- type: 'turn.started',
187
- turn_id: this.turnId,
188
- ...(Number.isFinite(timestamp) ? { startedAtMs: timestamp } : {}),
189
- }];
190
- if (this.prompt) {
191
- events.push(itemEvent('item.completed', this.turnId, {
192
- id: `${this.turnId}-user`,
193
- type: 'user_message',
194
- content: [{ type: 'text', text: this.prompt }],
195
- }));
196
- }
197
- return events;
198
- }
199
-
200
- completeEvents(timestamp) {
201
- if (!this.started || this.completed) return [];
202
- this.completed = true;
203
- return [{
204
- type: 'turn.completed',
205
- turn_id: this.turnId,
206
- ...(Number.isFinite(timestamp) ? { completedAt: timestamp } : {}),
207
- }];
208
- }
209
- }
210
-
211
- function createAdapter(provider, options) {
212
- if (provider === 'codex') return new CodexJsonAdapter(options);
213
- if (provider === 'opencode') return new OpenCodeJsonAdapter(options);
214
- throw new Error(`Unsupported agent JSON provider: ${provider}`);
215
- }
216
-
217
- class AgentJsonStreamParser {
218
- constructor(options = {}) {
219
- const provider = String(options.provider || '').trim().toLowerCase();
220
- const operationId = String(options.operationId || Date.now());
221
- this.provider = provider;
222
- this.decoder = new JsonlStreamDecoder();
223
- this.adapter = createAdapter(provider, {
224
- operationId,
225
- prompt: typeof options.prompt === 'string' ? options.prompt.trim() : '',
226
- });
227
- this.events = [];
228
- this.maxEvents = Number.isFinite(options.maxEvents)
229
- ? Math.max(1, Math.floor(options.maxEvents))
230
- : DEFAULT_MAX_EVENTS;
231
- }
232
-
233
- get sessionId() {
234
- return this.adapter.sessionId;
235
- }
236
-
237
- push(chunk) {
238
- return this.appendRaw(this.decoder.push(chunk));
239
- }
240
-
241
- flush() {
242
- const events = this.appendRaw(this.decoder.flush());
243
- return [...events, ...this.appendEvents(this.adapter.flush())];
244
- }
245
-
246
- transcript(options = {}) {
247
- return buildTranscriptFromEvents(this.events, options);
248
- }
249
-
250
- appendRaw(rawEvents) {
251
- const normalized = rawEvents.flatMap(event => this.adapter.adapt(event));
252
- return this.appendEvents(normalized);
253
- }
254
-
255
- appendEvents(events) {
256
- if (!events.length) return [];
257
- this.events.push(...events);
258
- if (this.events.length > this.maxEvents) {
259
- this.events.splice(0, this.events.length - this.maxEvents);
260
- }
261
- return events;
262
- }
263
- }
264
-
265
- module.exports = {
266
- AgentJsonStreamParser,
267
- JsonlStreamDecoder,
268
- };
@@ -1,133 +0,0 @@
1
- const MAX_LIFECYCLE_OPERATIONS = 32;
2
- const TERMINAL_OPERATION_STATES = new Set(['succeeded', 'failed', 'cancelled']);
3
-
4
- function compactLifecycleEntries(entries) {
5
- const recentIds = new Set(entries.slice(-MAX_LIFECYCLE_OPERATIONS).map(operation => operation.id));
6
- return entries.filter(operation => (
7
- recentIds.has(operation.id)
8
- || operation.requestKey.startsWith('create-request:')
9
- ));
10
- }
11
-
12
- function normalizeOperation(operation) {
13
- if (!operation || typeof operation !== 'object') return null;
14
- const id = String(operation.id || '').trim();
15
- const type = String(operation.type || '').trim();
16
- const state = String(operation.state || '').trim();
17
- if (!id || !type || !state) return null;
18
- return {
19
- id,
20
- type,
21
- state,
22
- requestKey: String(operation.requestKey || ''),
23
- request: operation.request && typeof operation.request === 'object'
24
- ? JSON.parse(JSON.stringify(operation.request))
25
- : {},
26
- result: operation.result && typeof operation.result === 'object'
27
- ? JSON.parse(JSON.stringify(operation.result))
28
- : null,
29
- startedAt: Number(operation.startedAt) || 0,
30
- updatedAt: Number(operation.updatedAt) || 0,
31
- finishedAt: Number(operation.finishedAt) || null,
32
- error: String(operation.error || ''),
33
- };
34
- }
35
-
36
- function lifecycleJournal(source) {
37
- const raw = source?.lifecycleJournal;
38
- const entries = Array.isArray(raw?.entries)
39
- ? compactLifecycleEntries(raw.entries.map(normalizeOperation).filter(Boolean))
40
- : [];
41
- return {
42
- sequence: Math.max(0, Math.floor(Number(raw?.sequence) || 0)),
43
- entries,
44
- };
45
- }
46
-
47
- function activeLifecycleOperation(source) {
48
- const journal = lifecycleJournal(source);
49
- for (let index = journal.entries.length - 1; index >= 0; index -= 1) {
50
- const operation = journal.entries[index];
51
- if (!TERMINAL_OPERATION_STATES.has(operation.state)) return operation;
52
- }
53
- return null;
54
- }
55
-
56
- function latestLifecycleOperation(source) {
57
- const entries = lifecycleJournal(source).entries;
58
- return entries.length > 0 ? entries[entries.length - 1] : null;
59
- }
60
-
61
- function beginLifecycleOperation(source, type, requestKey, request = {}, now = Date.now()) {
62
- const journal = lifecycleJournal(source);
63
- const active = activeLifecycleOperation({ lifecycleJournal: journal });
64
- if (active) {
65
- if (active.type === type && active.requestKey === String(requestKey || '')) {
66
- source.lifecycleJournal = journal;
67
- return { operation: active, joined: true };
68
- }
69
- return { conflict: active };
70
- }
71
-
72
- journal.sequence += 1;
73
- const operation = {
74
- id: `aop_${journal.sequence}`,
75
- type: String(type || ''),
76
- state: 'pending',
77
- requestKey: String(requestKey || ''),
78
- request: request && typeof request === 'object' ? JSON.parse(JSON.stringify(request)) : {},
79
- result: null,
80
- startedAt: now,
81
- updatedAt: now,
82
- finishedAt: null,
83
- error: '',
84
- };
85
- journal.entries.push(operation);
86
- journal.entries = compactLifecycleEntries(journal.entries);
87
- source.lifecycleJournal = journal;
88
- return { operation, joined: false };
89
- }
90
-
91
- function transitionLifecycleOperation(source, operationId, state, error = '', now = Date.now()) {
92
- const journal = lifecycleJournal(source);
93
- const operation = journal.entries.find(candidate => candidate.id === operationId);
94
- if (!operation) return null;
95
- if (TERMINAL_OPERATION_STATES.has(operation.state)) return operation;
96
- operation.state = String(state || operation.state);
97
- operation.error = String(error || '');
98
- operation.updatedAt = now;
99
- operation.finishedAt = TERMINAL_OPERATION_STATES.has(operation.state) ? now : null;
100
- if (
101
- operation.type === 'create'
102
- && operation.finishedAt !== null
103
- && operation.request
104
- && Object.prototype.hasOwnProperty.call(operation.request, 'previousState')
105
- ) {
106
- delete operation.request.previousState;
107
- }
108
- source.lifecycleJournal = journal;
109
- return operation;
110
- }
111
-
112
- function setLifecycleOperationResult(source, operationId, result, now = Date.now()) {
113
- const journal = lifecycleJournal(source);
114
- const operation = journal.entries.find(candidate => candidate.id === operationId);
115
- if (!operation) return null;
116
- operation.result = result && typeof result === 'object'
117
- ? JSON.parse(JSON.stringify(result))
118
- : null;
119
- operation.updatedAt = now;
120
- source.lifecycleJournal = journal;
121
- return operation;
122
- }
123
-
124
- module.exports = {
125
- MAX_LIFECYCLE_OPERATIONS,
126
- TERMINAL_OPERATION_STATES,
127
- activeLifecycleOperation,
128
- beginLifecycleOperation,
129
- latestLifecycleOperation,
130
- lifecycleJournal,
131
- setLifecycleOperationResult,
132
- transitionLifecycleOperation,
133
- };