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,41 +1,82 @@
1
- const childProcess = require('child_process');
2
- const fs = require('fs');
3
- const http = require('http');
4
- const https = require('https');
5
- const os = require('os');
6
- const path = require('path');
7
- const { readServerProcessIdentity } = require('./server-process-identity');
8
- const storageLayout = require('./storage-layout');
9
-
10
- const CACHE_TTL_MS = 5 * 60 * 1000;
11
- const NPM_PACKAGE_NAME = 'farming-code';
12
- const DEFAULT_NPM_REGISTRY = 'https://registry.npmjs.org';
13
-
1
+ // Generated by scripts/build-backend-runtime.ts. Do not edit.
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
+ // If the importer is in node compatibility mode or this is not an ESM
23
+ // file that has been converted to a CommonJS file using a Babel-
24
+ // compatible transform (i.e. "__esModule" has not been set), then set
25
+ // "default" to the CommonJS "module.exports" for node compatibility.
26
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
+ mod
28
+ ));
29
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
+ var update_service_exports = {};
31
+ __export(update_service_exports, {
32
+ FarmingUpdateService: () => FarmingUpdateService,
33
+ compareVersions: () => compareVersions,
34
+ detectInstallMethod: () => detectInstallMethod,
35
+ normalizeVersion: () => normalizeVersion,
36
+ npmPackageMetadataUrl: () => npmPackageMetadataUrl,
37
+ npmPackageRoot: () => npmPackageRoot,
38
+ npmPrefixForPackageRoot: () => npmPrefixForPackageRoot,
39
+ npmVersionsFromMetadata: () => npmVersionsFromMetadata,
40
+ readNpmGlobalRoot: () => readNpmGlobalRoot
41
+ });
42
+ module.exports = __toCommonJS(update_service_exports);
43
+ var storageLayout = __toESM(require("./storage-layout.cjs"));
44
+ const childProcess = require("child_process");
45
+ const fs = require("fs");
46
+ const http = require("http");
47
+ const https = require("https");
48
+ const os = require("os");
49
+ const path = require("path");
50
+ const { readServerProcessIdentity } = require("./server-process-identity.cjs");
51
+ function errorMessage(error) {
52
+ if (typeof error === "object" && error !== null && "message" in error) {
53
+ const message = error.message;
54
+ if (message) return String(message);
55
+ }
56
+ return String(error);
57
+ }
58
+ const CACHE_TTL_MS = 5 * 60 * 1e3;
59
+ const NPM_PACKAGE_NAME = "farming-code";
60
+ const DEFAULT_NPM_REGISTRY = "https://registry.npmjs.org";
14
61
  function readJsonFile(filePath) {
15
62
  try {
16
- return JSON.parse(fs.readFileSync(filePath, 'utf8'));
63
+ return JSON.parse(fs.readFileSync(filePath, "utf8"));
17
64
  } catch {
18
65
  return null;
19
66
  }
20
67
  }
21
-
22
68
  function normalizeVersion(value) {
23
- const raw = String(value || '').trim();
24
- if (!raw) return '';
25
- const withoutPrefix = raw
26
- .replace(/^refs\/tags\//i, '')
27
- .replace(/^farming[-_]/i, '')
28
- .replace(/^v/i, '');
69
+ const raw = String(value || "").trim();
70
+ if (!raw) return "";
71
+ const withoutPrefix = raw.replace(/^refs\/tags\//i, "").replace(/^farming[-_]/i, "").replace(/^v/i, "");
29
72
  const match = withoutPrefix.match(/\d+(?:\.\d+)*/);
30
73
  return match ? match[0] : withoutPrefix;
31
74
  }
32
-
33
75
  function versionParts(value) {
34
76
  const normalized = normalizeVersion(value);
35
77
  if (!normalized) return [];
36
- return normalized.split('.').map(part => Number(part)).filter(part => Number.isFinite(part));
78
+ return normalized.split(".").map((part) => Number(part)).filter((part) => Number.isFinite(part));
37
79
  }
38
-
39
80
  function compareVersions(left, right) {
40
81
  const leftParts = versionParts(left);
41
82
  const rightParts = versionParts(right);
@@ -48,60 +89,53 @@ function compareVersions(left, right) {
48
89
  }
49
90
  return 0;
50
91
  }
51
-
52
92
  function detectInstallMethod(rootDir, options = {}) {
53
- if (options.packagedRuntime) return 'standalone-cli';
54
- const release = readJsonFile(path.join(rootDir, 'RELEASE.json')) || {};
55
- if (release.updateMethod === 'npm') return 'npm';
93
+ if (options.packagedRuntime) return "standalone-cli";
94
+ const release = readJsonFile(path.join(rootDir, "RELEASE.json")) || {};
95
+ if (release.updateMethod === "npm") return "npm";
56
96
  if (release.type) return String(release.type);
57
- if (fs.existsSync(path.join(rootDir, '.farming.pid')) || fs.existsSync(path.join(rootDir, '.farming-launcher.sh'))) {
58
- return 'app-bundle';
97
+ if (fs.existsSync(path.join(rootDir, ".farming.pid")) || fs.existsSync(path.join(rootDir, ".farming-launcher.sh"))) {
98
+ return "app-bundle";
59
99
  }
60
- const pkg = readJsonFile(path.join(rootDir, 'package.json')) || {};
61
- if (pkg.name === NPM_PACKAGE_NAME && !fs.existsSync(path.join(rootDir, '.git'))) return 'npm';
62
- return 'source';
100
+ const pkg = readJsonFile(path.join(rootDir, "package.json")) || {};
101
+ if (pkg.name === NPM_PACKAGE_NAME && !fs.existsSync(path.join(rootDir, ".git"))) return "npm";
102
+ return "source";
63
103
  }
64
-
65
104
  function installMethodBlockedReason(method) {
66
- if (method === 'source') return 'Source checkouts update through Git, not the in-app updater';
67
- if (method === 'source-deploy') return 'Source deployments update through their deployment workflow, not the in-app updater';
68
- if (method === 'app-bundle') return 'App bundles update by reinstalling a release package or switching to npm';
69
- if (method === 'standalone-cli') return 'Standalone CLI updates must reinstall the matching release asset';
70
- return `In-app updates require an npm installation; reinstall ${method || 'this installation'} through npm`;
105
+ if (method === "source") return "Source checkouts update through Git, not the in-app updater";
106
+ if (method === "source-deploy") return "Source deployments update through their deployment workflow, not the in-app updater";
107
+ if (method === "app-bundle") return "App bundles update by reinstalling a release package or switching to npm";
108
+ if (method === "standalone-cli") return "Standalone CLI updates must reinstall the matching release asset";
109
+ return `In-app updates require an npm installation; reinstall ${method || "this installation"} through npm`;
71
110
  }
72
-
73
111
  function hasComparableVersion(value) {
74
112
  return versionParts(value).length > 0;
75
113
  }
76
-
77
114
  function normalizePlatform(value) {
78
- const raw = String(value || '').trim().toLowerCase();
79
- if (raw === 'darwin' || raw === 'macos' || raw === 'macosx' || raw === 'osx') return 'darwin';
80
- if (raw === 'linux') return 'linux';
115
+ const raw = String(value || "").trim().toLowerCase();
116
+ if (raw === "darwin" || raw === "macos" || raw === "macosx" || raw === "osx") return "darwin";
117
+ if (raw === "linux") return "linux";
81
118
  return raw;
82
119
  }
83
-
84
120
  function normalizeArch(value) {
85
- const raw = String(value || '').trim().toLowerCase();
86
- if (raw === 'x64' || raw === 'amd64' || raw === 'x86_64') return 'x64';
87
- if (raw === 'arm64' || raw === 'aarch64') return 'arm64';
121
+ const raw = String(value || "").trim().toLowerCase();
122
+ if (raw === "x64" || raw === "amd64" || raw === "x86_64") return "x64";
123
+ if (raw === "arm64" || raw === "aarch64") return "arm64";
88
124
  return raw;
89
125
  }
90
-
91
126
  function requestWithRedirects(url, options = {}, redirectCount = 0, authOrigin = null) {
92
127
  if (redirectCount > 5) {
93
128
  return Promise.reject(new Error(`too many redirects for ${url}`));
94
129
  }
95
-
96
130
  return new Promise((resolve, reject) => {
97
131
  const parsed = new URL(url);
98
- const allowedAuthOrigin = authOrigin === false ? '' : (authOrigin || parsed.origin);
132
+ const allowedAuthOrigin = authOrigin === false ? "" : authOrigin || parsed.origin;
99
133
  const sameAuthOrigin = Boolean(allowedAuthOrigin) && parsed.origin === allowedAuthOrigin;
100
- const client = parsed.protocol === 'http:' ? http : https;
134
+ const client = parsed.protocol === "http:" ? http : https;
101
135
  const headers = {
102
- 'User-Agent': 'Farming-Update-Check',
103
- Accept: options.accept || 'application/json',
104
- ...(options.headers || {}),
136
+ "User-Agent": "Farming-Update-Check",
137
+ Accept: options.accept || "application/json",
138
+ ...options.headers || {}
105
139
  };
106
140
  if (!sameAuthOrigin) {
107
141
  delete headers.Authorization;
@@ -109,7 +143,6 @@ function requestWithRedirects(url, options = {}, redirectCount = 0, authOrigin =
109
143
  } else if (options.authToken) {
110
144
  headers.Authorization = `Bearer ${options.authToken}`;
111
145
  }
112
-
113
146
  const request = client.get(parsed, { headers }, (response) => {
114
147
  const status = response.statusCode || 0;
115
148
  const location = response.headers.location;
@@ -119,8 +152,6 @@ function requestWithRedirects(url, options = {}, redirectCount = 0, authOrigin =
119
152
  const nextParsed = new URL(nextUrl);
120
153
  const nextOptions = { ...options };
121
154
  if (nextParsed.origin !== allowedAuthOrigin) {
122
- // Update-source tokens are scoped to the configured origin. Never
123
- // forward them to a redirect target on another origin.
124
155
  delete nextOptions.authToken;
125
156
  if (nextOptions.headers) {
126
157
  nextOptions.headers = { ...nextOptions.headers };
@@ -132,7 +163,7 @@ function requestWithRedirects(url, options = {}, redirectCount = 0, authOrigin =
132
163
  nextUrl,
133
164
  nextOptions,
134
165
  redirectCount + 1,
135
- nextParsed.origin === allowedAuthOrigin ? allowedAuthOrigin : false,
166
+ nextParsed.origin === allowedAuthOrigin ? allowedAuthOrigin : false
136
167
  ).then(resolve, reject);
137
168
  return;
138
169
  }
@@ -143,37 +174,33 @@ function requestWithRedirects(url, options = {}, redirectCount = 0, authOrigin =
143
174
  }
144
175
  resolve(response);
145
176
  });
146
- request.on('error', reject);
147
- request.setTimeout(options.timeoutMs || 30_000, () => {
177
+ request.on("error", reject);
178
+ request.setTimeout(options.timeoutMs || 3e4, () => {
148
179
  request.destroy(new Error(`request timed out for ${url}`));
149
180
  });
150
181
  });
151
182
  }
152
-
153
183
  async function requestJson(url, options = {}) {
154
184
  const response = await requestWithRedirects(url, options);
155
185
  const chunks = [];
156
186
  for await (const chunk of response) {
157
187
  chunks.push(chunk);
158
188
  }
159
- return JSON.parse(Buffer.concat(chunks).toString('utf8'));
189
+ return JSON.parse(Buffer.concat(chunks).toString("utf8"));
160
190
  }
161
-
162
191
  function nodeScriptInvocation(nodePath, scriptPath, env = process.env) {
163
192
  if (env.FARMING_NODE_LD && env.FARMING_NODE_LIBRARY_PATH) {
164
193
  return {
165
194
  command: env.FARMING_NODE_LD,
166
- args: ['--library-path', env.FARMING_NODE_LIBRARY_PATH, nodePath, scriptPath],
195
+ args: ["--library-path", env.FARMING_NODE_LIBRARY_PATH, nodePath, scriptPath]
167
196
  };
168
197
  }
169
198
  return { command: nodePath, args: [scriptPath] };
170
199
  }
171
-
172
200
  function npmPackageMetadataUrl(registryUrl, packageName) {
173
- const registry = String(registryUrl || DEFAULT_NPM_REGISTRY).replace(/\/+$/, '');
174
- return `${registry}/${encodeURIComponent(packageName).replace(/^%40/, '@')}`;
201
+ const registry = String(registryUrl || DEFAULT_NPM_REGISTRY).replace(/\/+$/, "");
202
+ return `${registry}/${encodeURIComponent(String(packageName)).replace(/^%40/, "@")}`;
175
203
  }
176
-
177
204
  function normalizePathForCompare(filePath) {
178
205
  try {
179
206
  return fs.realpathSync(filePath);
@@ -181,175 +208,168 @@ function normalizePathForCompare(filePath) {
181
208
  return path.resolve(filePath);
182
209
  }
183
210
  }
184
-
185
211
  function pathIsInside(parentPath, childPath) {
186
212
  const relative = path.relative(path.resolve(parentPath), path.resolve(childPath));
187
- return relative !== '' && !relative.startsWith('..') && !path.isAbsolute(relative);
213
+ return relative !== "" && !relative.startsWith("..") && !path.isAbsolute(relative);
188
214
  }
189
-
190
215
  function npmPackageRoot(npmRoot, packageName) {
191
- return path.join(npmRoot, ...String(packageName || '').split('/').filter(Boolean));
216
+ return path.join(npmRoot, ...String(packageName || "").split("/").filter(Boolean));
192
217
  }
193
-
194
218
  function npmPrefixForPackageRoot(packageRoot, packageName) {
195
- const segments = String(packageName || '').split('/').filter(Boolean);
196
- if (!path.isAbsolute(packageRoot) || segments.length === 0) return '';
219
+ const segments = String(packageName || "").split("/").filter(Boolean);
220
+ if (!path.isAbsolute(packageRoot) || segments.length === 0) return "";
197
221
  let npmRoot = packageRoot;
198
222
  for (let index = 0; index < segments.length; index += 1) npmRoot = path.dirname(npmRoot);
199
223
  return path.dirname(path.dirname(npmRoot));
200
224
  }
201
-
202
225
  function readNpmGlobalRoot(npmCommand, npmPrefix, execFile = childProcess.execFile) {
203
- const args = ['root', '--global'];
204
- if (npmPrefix) args.push('--prefix', npmPrefix);
226
+ const args = ["root", "--global"];
227
+ if (npmPrefix) args.push("--prefix", npmPrefix);
205
228
  return new Promise((resolve, reject) => {
206
229
  execFile(npmCommand, args, (error, stdout) => {
207
230
  if (error) {
208
231
  reject(error);
209
232
  return;
210
233
  }
211
- const root = String(stdout || '').split(/\r?\n/).map(value => value.trim()).find(Boolean);
234
+ const root = String(stdout || "").split(/\r?\n/).map((value) => value.trim()).find(Boolean);
212
235
  if (!root) {
213
- reject(new Error('npm root --global returned no path'));
236
+ reject(new Error("npm root --global returned no path"));
214
237
  return;
215
238
  }
216
239
  resolve(root);
217
240
  });
218
241
  });
219
242
  }
220
-
221
243
  function npmVersionsFromMetadata(metadata, currentVersion) {
222
- const versions = metadata && metadata.versions && typeof metadata.versions === 'object'
223
- ? Object.keys(metadata.versions)
224
- : [];
225
- return versions
226
- .filter(version => hasComparableVersion(version) && !version.includes('-'))
227
- .sort((left, right) => compareVersions(right, left))
228
- .map(version => ({
229
- version,
230
- assetName: version,
231
- assetSize: Number(metadata.versions[version]?.dist?.unpackedSize || 0),
232
- blockedReason: '',
233
- installable: true,
234
- available: compareVersions(version, currentVersion) > 0,
235
- }));
244
+ const versionMetadata = metadata?.versions;
245
+ const versions = versionMetadata && typeof versionMetadata === "object" ? Object.keys(versionMetadata) : [];
246
+ return versions.filter((version) => hasComparableVersion(version) && !version.includes("-")).sort((left, right) => compareVersions(right, left)).map((version) => ({
247
+ version,
248
+ assetName: version,
249
+ assetSize: Number(versionMetadata?.[version]?.dist?.unpackedSize || 0),
250
+ blockedReason: "",
251
+ installable: true,
252
+ available: compareVersions(version, currentVersion) > 0
253
+ }));
236
254
  }
237
-
238
255
  class FarmingUpdateService {
256
+ rootDir;
257
+ installMethod;
258
+ npmPackageName;
259
+ npmRegistryUrl;
260
+ npmPackageRoot;
261
+ npmPrefix;
262
+ runtime;
263
+ configDir;
264
+ now;
265
+ fetchJson;
266
+ execFile;
267
+ getNpmGlobalRoot;
268
+ spawn;
269
+ npmCache;
270
+ installState;
271
+ installStartPromise;
272
+ updateStateFile;
273
+ updateLogFile;
274
+ updateStagingDir;
239
275
  constructor(options = {}) {
240
- this.rootDir = options.rootDir || path.join(__dirname, '..');
276
+ this.rootDir = options.rootDir || path.join(__dirname, "..");
241
277
  this.installMethod = options.installMethod || detectInstallMethod(this.rootDir, {
242
- packagedRuntime: options.packagedRuntime === true,
278
+ packagedRuntime: options.packagedRuntime === true
243
279
  });
244
280
  this.npmPackageName = options.npmPackageName || NPM_PACKAGE_NAME;
245
281
  this.npmRegistryUrl = options.npmRegistryUrl || process.env.FARMING_NPM_REGISTRY || DEFAULT_NPM_REGISTRY;
246
- this.npmPackageRoot = options.npmPackageRoot || process.env.FARMING_MANAGED_PACKAGE_ROOT || '';
247
- this.npmPrefix = options.npmPrefix || process.env.FARMING_NPM_PREFIX || '';
248
- this.runtime = options.platform || options.arch
249
- ? {
250
- platform: normalizePlatform(options.platform || process.platform),
251
- arch: normalizeArch(options.arch || process.arch),
252
- }
253
- : null;
254
- this.configDir = options.configDir || path.join(os.homedir(), '.farming');
282
+ this.npmPackageRoot = options.npmPackageRoot || process.env.FARMING_MANAGED_PACKAGE_ROOT || "";
283
+ this.npmPrefix = options.npmPrefix || process.env.FARMING_NPM_PREFIX || "";
284
+ this.runtime = options.platform || options.arch ? {
285
+ platform: normalizePlatform(options.platform || process.platform),
286
+ arch: normalizeArch(options.arch || process.arch)
287
+ } : null;
288
+ this.configDir = options.configDir || path.join(os.homedir(), ".farming");
255
289
  this.now = options.now || (() => Date.now());
256
290
  this.fetchJson = options.fetchJson || requestJson;
257
291
  this.execFile = options.execFile || childProcess.execFile;
258
- this.getNpmGlobalRoot = options.getNpmGlobalRoot
259
- || ((npmCommand, npmPrefix) => readNpmGlobalRoot(npmCommand, npmPrefix, this.execFile));
292
+ this.getNpmGlobalRoot = options.getNpmGlobalRoot || ((npmCommand, npmPrefix) => readNpmGlobalRoot(npmCommand, npmPrefix, this.execFile));
260
293
  this.spawn = options.spawn || childProcess.spawn;
261
294
  this.npmCache = null;
262
- this.installState = { phase: 'idle' };
295
+ this.installState = { phase: "idle" };
263
296
  this.installStartPromise = null;
264
297
  this.updateStateFile = options.updateStateFile || storageLayout.updateStateFile(this.configDir);
265
298
  this.updateLogFile = options.updateLogFile || storageLayout.updateLogFile(this.configDir);
266
299
  this.updateStagingDir = options.updateStagingDir || storageLayout.updateStagingDir(this.configDir);
267
300
  }
268
-
269
301
  currentVersion() {
270
- const release = readJsonFile(path.join(this.rootDir, 'RELEASE.json')) || {};
271
- const pkg = readJsonFile(path.join(this.rootDir, 'package.json')) || {};
272
- const packageVersion = String(release.packageVersion || pkg.version || '');
273
- const releaseVersion = String(release.releaseVersion || normalizeVersion(packageVersion) || '');
302
+ const release = readJsonFile(path.join(this.rootDir, "RELEASE.json")) || {};
303
+ const pkg = readJsonFile(path.join(this.rootDir, "package.json")) || {};
304
+ const packageVersion = String(release.packageVersion || pkg.version || "");
305
+ const releaseVersion = String(release.releaseVersion || normalizeVersion(packageVersion) || "");
274
306
  return {
275
307
  releaseVersion,
276
308
  packageVersion,
277
- gitSha: release.gitSha || '',
278
- compatibilityProfile: String(release.compatibilityProfile || ''),
309
+ gitSha: release.gitSha || "",
310
+ compatibilityProfile: String(release.compatibilityProfile || ""),
279
311
  bundledGlibcRuntime: release.bundledGlibcRuntime === true,
280
312
  type: this.installMethod,
281
- installDir: this.rootDir,
313
+ installDir: this.rootDir
282
314
  };
283
315
  }
284
-
285
316
  currentInstallState() {
286
317
  const persisted = readJsonFile(this.updateStateFile);
287
318
  if (persisted && persisted.method === this.installMethod) return persisted;
288
319
  const current = this.currentVersion();
289
320
  const currentVersion = normalizeVersion(current.releaseVersion || current.packageVersion);
290
- if (
291
- persisted
292
- && persisted.targetMethod === this.installMethod
293
- && normalizeVersion(persisted.version) === currentVersion
294
- ) {
321
+ if (persisted && persisted.targetMethod === this.installMethod && normalizeVersion(persisted.version) === currentVersion) {
295
322
  return persisted;
296
323
  }
297
324
  return this.installState;
298
325
  }
299
-
300
326
  persistInstallState(state) {
301
327
  this.installState = state;
302
328
  fs.mkdirSync(this.configDir, { recursive: true });
303
329
  const temporaryPath = `${this.updateStateFile}.${process.pid}.tmp`;
304
- fs.writeFileSync(temporaryPath, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 });
330
+ fs.writeFileSync(temporaryPath, `${JSON.stringify(state, null, 2)}
331
+ `, { mode: 384 });
305
332
  fs.renameSync(temporaryPath, this.updateStateFile);
306
333
  return state;
307
334
  }
308
-
309
335
  async npmMetadata(options = {}) {
310
336
  const source = npmPackageMetadataUrl(this.npmRegistryUrl, this.npmPackageName);
311
337
  if (!options.force && this.npmCache && this.npmCache.source === source && this.now() - this.npmCache.checkedAt < CACHE_TTL_MS) {
312
338
  return this.npmCache.metadata;
313
339
  }
314
- const metadata = await this.fetchJson(source, { accept: 'application/json' });
340
+ const metadata = await this.fetchJson(source, { accept: "application/json" });
315
341
  this.npmCache = { checkedAt: this.now(), source, metadata };
316
342
  return metadata;
317
343
  }
318
-
319
344
  async npmStatus(options = {}) {
320
345
  const current = this.currentVersion();
321
346
  const currentVersion = normalizeVersion(current.releaseVersion || current.packageVersion);
322
347
  const metadata = await this.npmMetadata(options);
323
348
  const target = await this.npmUpdateTarget();
324
349
  const versions = npmVersionsFromMetadata(metadata, currentVersion);
325
- const latestVersion = normalizeVersion(metadata && metadata['dist-tags'] && metadata['dist-tags'].latest)
326
- || versions[0]?.version
327
- || '';
350
+ const latestVersion = normalizeVersion(metadata && metadata["dist-tags"] && metadata["dist-tags"].latest) || versions[0]?.version || "";
328
351
  const requestedVersion = normalizeVersion(options.assetName);
329
- const selected = versions.find(version => version.version === requestedVersion)
330
- || versions.find(version => version.version === latestVersion)
331
- || versions[0]
332
- || null;
333
- const blockedReason = target.proven ? '' : target.error;
352
+ const selected = versions.find((version) => version.version === requestedVersion) || versions.find((version) => version.version === latestVersion) || versions[0] || null;
353
+ const blockedReason = target.proven ? "" : target.error;
334
354
  const available = Boolean(selected && selected.available && target.proven);
335
355
  return {
336
- method: 'npm',
356
+ method: "npm",
337
357
  current,
338
358
  latest: {
339
359
  version: latestVersion,
340
- tag: latestVersion ? `v${latestVersion}` : '',
341
- name: latestVersion ? `${this.npmPackageName}@${latestVersion}` : '',
342
- publishedAt: '',
360
+ tag: latestVersion ? `v${latestVersion}` : "",
361
+ name: latestVersion ? `${this.npmPackageName}@${latestVersion}` : "",
362
+ publishedAt: "",
343
363
  assetName: latestVersion,
344
364
  assetSize: 0,
345
365
  blockedReason,
346
- source: npmPackageMetadataUrl(this.npmRegistryUrl, this.npmPackageName),
366
+ source: npmPackageMetadataUrl(this.npmRegistryUrl, this.npmPackageName)
347
367
  },
348
368
  selected: {
349
- version: selected?.version || '',
350
- assetName: selected?.assetName || '',
369
+ version: selected?.version || "",
370
+ assetName: selected?.assetName || "",
351
371
  assetSize: selected?.assetSize || 0,
352
- blockedReason: selected?.blockedReason || blockedReason,
372
+ blockedReason: selected?.blockedReason || blockedReason
353
373
  },
354
374
  versions,
355
375
  runtime: this.runtime,
@@ -357,24 +377,23 @@ class FarmingUpdateService {
357
377
  available,
358
378
  installable: Boolean(selected && target.proven),
359
379
  checkedAt: new Date(this.now()).toISOString(),
360
- state: this.currentInstallState(),
380
+ state: this.currentInstallState()
361
381
  };
362
382
  }
363
-
364
383
  async npmUpdateTarget() {
365
- const runningPackageRoot = String(this.npmPackageRoot || '').trim();
384
+ const runningPackageRoot = String(this.npmPackageRoot || "").trim();
366
385
  if (!path.isAbsolute(runningPackageRoot)) {
367
386
  return {
368
387
  proven: false,
369
- error: 'npm update target could not be proven: the running package has no managed package-root provenance',
388
+ error: "npm update target could not be proven: the running package has no managed package-root provenance"
370
389
  };
371
390
  }
372
- const npmCommand = process.env.FARMING_NPM_COMMAND || 'npm';
391
+ const npmCommand = process.env.FARMING_NPM_COMMAND || "npm";
373
392
  const npmPrefix = this.npmPrefix || npmPrefixForPackageRoot(runningPackageRoot, this.npmPackageName);
374
393
  if (!npmPrefix) {
375
394
  return {
376
395
  proven: false,
377
- error: 'npm update target could not be proven: the running package has no npm prefix',
396
+ error: "npm update target could not be proven: the running package has no npm prefix"
378
397
  };
379
398
  }
380
399
  try {
@@ -383,22 +402,21 @@ class FarmingUpdateService {
383
402
  if (normalizePathForCompare(runningPackageRoot) !== normalizePathForCompare(targetPackageRoot)) {
384
403
  return {
385
404
  proven: false,
386
- error: `npm update would target a different installation: running ${runningPackageRoot}; npm ${targetPackageRoot}`,
405
+ error: `npm update would target a different installation: running ${runningPackageRoot}; npm ${targetPackageRoot}`
387
406
  };
388
407
  }
389
408
  return {
390
409
  proven: true,
391
410
  npmPrefix,
392
- packageRoot: targetPackageRoot,
411
+ packageRoot: targetPackageRoot
393
412
  };
394
413
  } catch (error) {
395
414
  return {
396
415
  proven: false,
397
- error: `npm update target could not be inspected: ${error.message || String(error)}`,
416
+ error: `npm update target could not be inspected: ${errorMessage(error)}`
398
417
  };
399
418
  }
400
419
  }
401
-
402
420
  unsupportedStatus() {
403
421
  const current = this.currentVersion();
404
422
  const reason = installMethodBlockedReason(this.installMethod);
@@ -406,30 +424,28 @@ class FarmingUpdateService {
406
424
  method: this.installMethod,
407
425
  current,
408
426
  latest: {
409
- version: '',
410
- tag: '',
411
- name: '',
412
- publishedAt: '',
413
- assetName: '',
427
+ version: "",
428
+ tag: "",
429
+ name: "",
430
+ publishedAt: "",
431
+ assetName: "",
414
432
  assetSize: 0,
415
433
  blockedReason: reason,
416
- source: '',
434
+ source: ""
417
435
  },
418
- selected: { version: '', assetName: '', assetSize: 0, blockedReason: reason },
436
+ selected: { version: "", assetName: "", assetSize: 0, blockedReason: reason },
419
437
  versions: [],
420
438
  runtime: this.runtime,
421
439
  available: false,
422
440
  installable: false,
423
441
  checkedAt: new Date(this.now()).toISOString(),
424
- state: this.currentInstallState(),
442
+ state: this.currentInstallState()
425
443
  };
426
444
  }
427
-
428
445
  async check(options = {}) {
429
- if (this.installMethod === 'npm') return this.npmStatus(options);
446
+ if (this.installMethod === "npm") return this.npmStatus(options);
430
447
  return this.unsupportedStatus();
431
448
  }
432
-
433
449
  async startInstall(options = {}) {
434
450
  if (this.installStartPromise) return this.installStartPromise;
435
451
  const startPromise = this.startInstallUnreserved(options);
@@ -440,82 +456,79 @@ class FarmingUpdateService {
440
456
  if (this.installStartPromise === startPromise) this.installStartPromise = null;
441
457
  }
442
458
  }
443
-
444
459
  async startInstallUnreserved(options = {}) {
445
460
  const currentState = this.currentInstallState();
446
- if (['downloading', 'extracting', 'installing', 'restarting', 'rolling-back'].includes(currentState.phase)) {
461
+ if (["downloading", "extracting", "installing", "restarting", "rolling-back"].includes(currentState.phase)) {
447
462
  return currentState;
448
463
  }
449
- if (currentState.phase === 'ready-to-restart') return currentState;
450
-
451
- if (this.installMethod === 'npm') return this.startNpmInstall(options);
464
+ if (currentState.phase === "ready-to-restart") return currentState;
465
+ if (this.installMethod === "npm") return this.startNpmInstall(options);
452
466
  throw new Error(installMethodBlockedReason(this.installMethod));
453
467
  }
454
-
455
468
  async startNpmInstall(options = {}) {
456
469
  const status = await this.npmStatus({ force: true, assetName: options.assetName });
457
470
  if (!status.available) {
458
471
  return this.persistInstallState({
459
- method: 'npm',
460
- phase: status.installable ? 'succeeded' : 'failed',
472
+ method: "npm",
473
+ phase: status.installable ? "succeeded" : "failed",
461
474
  version: status.selected.version,
462
- error: status.installable ? '' : (status.selected.blockedReason || 'No installable npm update is available'),
463
- completedAt: new Date(this.now()).toISOString(),
475
+ error: status.installable ? "" : status.selected.blockedReason || "No installable npm update is available",
476
+ completedAt: new Date(this.now()).toISOString()
464
477
  });
465
478
  }
466
-
479
+ const target = status.target;
467
480
  const startedAt = new Date(this.now()).toISOString();
468
481
  fs.mkdirSync(this.updateStagingDir, { recursive: true });
469
482
  const stagingPrefix = fs.mkdtempSync(path.join(this.updateStagingDir, `npm-${status.selected.version}.`));
470
483
  const stagingPackageRoot = npmPackageRoot(
471
- path.join(stagingPrefix, 'lib', 'node_modules'),
472
- this.npmPackageName,
484
+ path.join(stagingPrefix, "lib", "node_modules"),
485
+ this.npmPackageName
473
486
  );
474
487
  const state = this.persistInstallState({
475
- method: 'npm',
476
- phase: 'installing',
488
+ method: "npm",
489
+ phase: "installing",
477
490
  version: status.selected.version,
478
491
  previousVersion: status.current.releaseVersion || status.current.packageVersion,
479
492
  packageName: this.npmPackageName,
480
493
  stagingPrefix,
481
494
  stagingPackageRoot,
482
495
  startedAt,
483
- logPath: this.updateLogFile,
496
+ logPath: this.updateLogFile
484
497
  });
485
- const helperPath = path.join(__dirname, 'npm-update-helper.js');
498
+ const helperPath = path.join(__dirname, "npm-update-helper.cjs");
486
499
  const nodePath = process.env.FARMING_NODE_BIN || process.execPath;
487
500
  const payload = {
488
- action: 'prepare',
501
+ action: "prepare",
489
502
  packageName: this.npmPackageName,
490
503
  targetVersion: status.selected.version,
491
504
  previousVersion: status.current.releaseVersion || status.current.packageVersion,
492
505
  startedAt,
493
506
  stateFile: this.updateStateFile,
494
507
  logPath: this.updateLogFile,
495
- cliPath: path.join(this.rootDir, 'bin', 'farming'),
496
- packageRoot: status.target.packageRoot,
508
+ cliPath: path.join(this.rootDir, "bin", "farming"),
509
+ packageRoot: target.packageRoot,
497
510
  nodePath,
498
- npmCommand: process.env.FARMING_NPM_COMMAND || 'npm',
499
- npmPrefix: status.target.npmPrefix,
511
+ npmCommand: process.env.FARMING_NPM_COMMAND || "npm",
512
+ npmPrefix: target.npmPrefix,
500
513
  stagingPrefix,
501
514
  stagingPackageRoot,
502
515
  npmFallbackRegistryUrl: this.npmRegistryUrl,
503
516
  serverPid: process.pid,
504
517
  configDir: this.configDir,
505
- port: process.env.FARMING_PORT || process.env.PORT || '6694',
506
- basePath: process.env.FARMING_BASE_PATH || '/farming',
507
- serverHome: process.env.FARMING_SERVER_HOME || '',
508
- disableAuth: /^(1|true|yes|on)$/i.test(String(process.env.FARMING_DISABLE_AUTH || '')),
518
+ port: process.env.FARMING_PORT || process.env.PORT || "6694",
519
+ basePath: process.env.FARMING_BASE_PATH || "/farming",
520
+ serverHome: process.env.FARMING_SERVER_HOME || "",
521
+ disableAuth: /^(1|true|yes|on)$/i.test(String(process.env.FARMING_DISABLE_AUTH || ""))
509
522
  };
510
523
  const helperInvocation = nodeScriptInvocation(nodePath, helperPath);
511
524
  const spawnOptions = {
512
525
  cwd: this.configDir,
513
526
  detached: true,
514
- stdio: 'ignore',
527
+ stdio: "ignore",
515
528
  env: {
516
529
  ...process.env,
517
- FARMING_NPM_UPDATE_PAYLOAD: JSON.stringify(payload),
518
- },
530
+ FARMING_NPM_UPDATE_PAYLOAD: JSON.stringify(payload)
531
+ }
519
532
  };
520
533
  let child;
521
534
  try {
@@ -524,27 +537,26 @@ class FarmingUpdateService {
524
537
  fs.rmSync(stagingPrefix, { recursive: true, force: true });
525
538
  this.persistInstallState({
526
539
  ...state,
527
- phase: 'failed',
528
- error: error.message || String(error),
529
- completedAt: new Date(this.now()).toISOString(),
540
+ phase: "failed",
541
+ error: errorMessage(error),
542
+ completedAt: new Date(this.now()).toISOString()
530
543
  });
531
544
  throw error;
532
545
  }
533
- if (child && typeof child.once === 'function') {
534
- child.once('error', (error) => {
546
+ if (child && typeof child.once === "function") {
547
+ child.once("error", (error) => {
535
548
  fs.rmSync(stagingPrefix, { recursive: true, force: true });
536
549
  this.persistInstallState({
537
550
  ...state,
538
- phase: 'failed',
539
- error: error.message || String(error),
540
- completedAt: new Date(this.now()).toISOString(),
551
+ phase: "failed",
552
+ error: errorMessage(error),
553
+ completedAt: new Date(this.now()).toISOString()
541
554
  });
542
555
  });
543
556
  }
544
- if (child && typeof child.unref === 'function') child.unref();
557
+ if (child && typeof child.unref === "function") child.unref();
545
558
  return state;
546
559
  }
547
-
548
560
  async applyPreparedUpdate() {
549
561
  if (this.installStartPromise) return this.installStartPromise;
550
562
  const applyPromise = this.applyPreparedUpdateUnreserved();
@@ -555,51 +567,51 @@ class FarmingUpdateService {
555
567
  if (this.installStartPromise === applyPromise) this.installStartPromise = null;
556
568
  }
557
569
  }
558
-
559
570
  async applyPreparedUpdateUnreserved() {
560
- if (this.installMethod !== 'npm') {
571
+ if (this.installMethod !== "npm") {
561
572
  throw new Error(installMethodBlockedReason(this.installMethod));
562
573
  }
563
574
  const prepared = this.currentInstallState();
564
- if (prepared.phase !== 'ready-to-restart') {
565
- throw new Error('No prepared Farming update is ready to restart');
575
+ if (prepared.phase !== "ready-to-restart") {
576
+ throw new Error("No prepared Farming update is ready to restart");
566
577
  }
567
578
  const current = this.currentVersion();
568
579
  const currentVersion = normalizeVersion(current.releaseVersion || current.packageVersion);
569
580
  if (normalizeVersion(prepared.previousVersion) !== currentVersion) {
570
- const error = 'Prepared update no longer matches the running Farming version';
571
- this.persistInstallState({ ...prepared, phase: 'failed', error, completedAt: new Date(this.now()).toISOString() });
581
+ const error = "Prepared update no longer matches the running Farming version";
582
+ this.persistInstallState({ ...prepared, phase: "failed", error, completedAt: new Date(this.now()).toISOString() });
572
583
  throw new Error(error);
573
584
  }
574
-
575
585
  const nodePath = process.env.FARMING_NODE_BIN || process.execPath;
576
586
  const serverProcessIdentity = await readServerProcessIdentity(process.pid);
577
587
  if (!serverProcessIdentity) {
578
- throw new Error('Running Farming server process identity could not be verified');
588
+ throw new Error("Running Farming server process identity could not be verified");
579
589
  }
580
590
  const target = await this.npmUpdateTarget();
581
591
  if (!target.proven) throw new Error(target.error);
582
- if (!path.isAbsolute(String(prepared.stagingPrefix || '')) || !path.isAbsolute(String(prepared.stagingPackageRoot || ''))) {
583
- throw new Error('Prepared npm update is missing its staging identity');
592
+ if (!path.isAbsolute(String(prepared.stagingPrefix || "")) || !path.isAbsolute(String(prepared.stagingPackageRoot || ""))) {
593
+ throw new Error("Prepared npm update is missing its staging identity");
584
594
  }
585
- const stagingPrefix = normalizePathForCompare(prepared.stagingPrefix);
595
+ const preparedStagingPrefix = prepared.stagingPrefix;
596
+ const preparedStagingPackageRoot = prepared.stagingPackageRoot;
597
+ const stagingPrefix = normalizePathForCompare(preparedStagingPrefix);
586
598
  if (!pathIsInside(normalizePathForCompare(this.updateStagingDir), stagingPrefix)) {
587
- throw new Error('Prepared npm update is outside the Farming staging directory');
599
+ throw new Error("Prepared npm update is outside the Farming staging directory");
588
600
  }
589
- if (path.resolve(prepared.stagingPackageRoot) !== path.resolve(npmPackageRoot(
590
- path.join(prepared.stagingPrefix, 'lib', 'node_modules'),
591
- this.npmPackageName,
601
+ if (path.resolve(preparedStagingPackageRoot) !== path.resolve(npmPackageRoot(
602
+ path.join(preparedStagingPrefix, "lib", "node_modules"),
603
+ this.npmPackageName
592
604
  ))) {
593
- throw new Error('Prepared npm update has an invalid package root');
605
+ throw new Error("Prepared npm update has an invalid package root");
594
606
  }
595
- const stagingPackageRoot = normalizePathForCompare(prepared.stagingPackageRoot);
596
- const stagedMetadata = readJsonFile(path.join(stagingPackageRoot, 'package.json')) || {};
607
+ const stagingPackageRoot = normalizePathForCompare(preparedStagingPackageRoot);
608
+ const stagedMetadata = readJsonFile(path.join(stagingPackageRoot, "package.json")) || {};
597
609
  if (normalizeVersion(stagedMetadata.version) !== normalizeVersion(prepared.version)) {
598
- throw new Error('Prepared npm update is no longer available; prepare it again');
610
+ throw new Error("Prepared npm update is no longer available; prepare it again");
599
611
  }
600
- const helperPath = path.join(__dirname, 'npm-update-helper.js');
612
+ const helperPath = path.join(__dirname, "npm-update-helper.cjs");
601
613
  const payload = {
602
- action: 'apply',
614
+ action: "apply",
603
615
  packageName: this.npmPackageName,
604
616
  targetVersion: prepared.version,
605
617
  previousVersion: prepared.previousVersion,
@@ -607,10 +619,10 @@ class FarmingUpdateService {
607
619
  preparedAt: prepared.preparedAt,
608
620
  stateFile: this.updateStateFile,
609
621
  logPath: prepared.logPath || this.updateLogFile,
610
- cliPath: path.join(this.rootDir, 'bin', 'farming'),
622
+ cliPath: path.join(this.rootDir, "bin", "farming"),
611
623
  packageRoot: target.packageRoot,
612
624
  nodePath,
613
- npmCommand: process.env.FARMING_NPM_COMMAND || 'npm',
625
+ npmCommand: process.env.FARMING_NPM_COMMAND || "npm",
614
626
  npmPrefix: target.npmPrefix,
615
627
  npmFallbackRegistryUrl: this.npmRegistryUrl,
616
628
  stagingPrefix,
@@ -618,48 +630,46 @@ class FarmingUpdateService {
618
630
  serverPid: process.pid,
619
631
  serverProcessIdentity,
620
632
  configDir: this.configDir,
621
- port: process.env.FARMING_PORT || process.env.PORT || '6694',
622
- basePath: process.env.FARMING_BASE_PATH || '/farming',
623
- serverHome: process.env.FARMING_SERVER_HOME || '',
624
- disableAuth: /^(1|true|yes|on)$/i.test(String(process.env.FARMING_DISABLE_AUTH || '')),
633
+ port: process.env.FARMING_PORT || process.env.PORT || "6694",
634
+ basePath: process.env.FARMING_BASE_PATH || "/farming",
635
+ serverHome: process.env.FARMING_SERVER_HOME || "",
636
+ disableAuth: /^(1|true|yes|on)$/i.test(String(process.env.FARMING_DISABLE_AUTH || ""))
625
637
  };
626
638
  const env = { ...process.env, FARMING_NPM_UPDATE_PAYLOAD: JSON.stringify(payload) };
627
-
628
- const state = this.persistInstallState({ ...prepared, phase: 'restarting', error: '' });
639
+ const state = this.persistInstallState({ ...prepared, phase: "restarting", error: "" });
629
640
  const helperInvocation = nodeScriptInvocation(nodePath, helperPath);
630
641
  const spawnOptions = {
631
642
  cwd: this.configDir,
632
643
  detached: true,
633
- stdio: 'ignore',
634
- env,
644
+ stdio: "ignore",
645
+ env
635
646
  };
636
647
  const restorePreparedState = (error) => this.persistInstallState({
637
648
  ...prepared,
638
- phase: 'ready-to-restart',
639
- error: error.message || String(error),
649
+ phase: "ready-to-restart",
650
+ error: errorMessage(error)
640
651
  });
641
652
  let child;
642
653
  try {
643
654
  child = this.spawn(helperInvocation.command, helperInvocation.args, spawnOptions);
644
655
  } catch (error) {
645
- restorePreparedState(error);
656
+ restorePreparedState(error instanceof Error ? error : new Error(String(error)));
646
657
  throw error;
647
658
  }
648
- if (child && typeof child.once === 'function') child.once('error', restorePreparedState);
649
- if (child && typeof child.unref === 'function') child.unref();
659
+ if (child && typeof child.once === "function") child.once("error", restorePreparedState);
660
+ if (child && typeof child.unref === "function") child.unref();
650
661
  return state;
651
662
  }
652
-
653
663
  }
654
-
655
- module.exports = {
664
+ // Annotate the CommonJS export names for ESM import in node:
665
+ 0 && (module.exports = {
656
666
  FarmingUpdateService,
657
667
  compareVersions,
658
668
  detectInstallMethod,
659
669
  normalizeVersion,
660
670
  npmPackageMetadataUrl,
661
- npmPrefixForPackageRoot,
662
671
  npmPackageRoot,
672
+ npmPrefixForPackageRoot,
663
673
  npmVersionsFromMetadata,
664
- readNpmGlobalRoot,
665
- };
674
+ readNpmGlobalRoot
675
+ });