openclaw-multi-auto 1.0.9 → 1.1.1

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 (490) hide show
  1. package/dist/{accounts-C_lW3Ag9.js → accounts-BOzyfwW4.js} +2 -2
  2. package/dist/{accounts-BVgYdU9W.js → accounts-BtEMxtPK.js} +1 -1
  3. package/dist/{accounts-BU-CeDai.js → accounts-CUYZBSKh.js} +1 -1
  4. package/dist/{accounts-C9HcPI9h.js → accounts-L9ByEpnP.js} +2 -2
  5. package/dist/{accounts-DJaYqD2E.js → accounts-khXX75l1.js} +7 -7
  6. package/dist/{accounts-Tgelvk0C.js → accounts-yfBeCZtS.js} +17 -17
  7. package/dist/{acp-cli-oWFHnS7i.js → acp-cli-CA2oCCEA.js} +8 -8
  8. package/dist/{active-listener-BEdprTkn.js → active-listener-D1yqT1cw.js} +2 -2
  9. package/dist/{agent-scope-BRElciAf.js → agent-scope-NQ9CtXYN.js} +17 -17
  10. package/dist/{agents-CujsWz9d.js → agents-BWVlofyv.js} +14 -14
  11. package/dist/{agents.config-C42STger.js → agents.config-QVfqc4C-.js} +2 -2
  12. package/dist/{api-key-rotation-BJpKWXy0.js → api-key-rotation-DtsNS2Nb.js} +2 -2
  13. package/dist/{api-key-rotation-BbuLHl0_.js → api-key-rotation-Vix80AUw.js} +1 -1
  14. package/dist/{audio-preflight-Yg1vzPE1.js → audio-preflight-DUtdCXjJ.js} +34 -34
  15. package/dist/{audio-preflight-C58LeYZM.js → audio-preflight-DpxQCpsA.js} +32 -32
  16. package/dist/{audio-transcription-runner-B8jbozH5.js → audio-transcription-runner-28fcRNNi.js} +12 -12
  17. package/dist/{audio-transcription-runner-D1cvrZ6s.js → audio-transcription-runner-DYKvqK54.js} +23 -23
  18. package/dist/{audit-membership-runtime-Dntemq07.js → audit-membership-runtime-DWyHWAHM.js} +4 -4
  19. package/dist/{audit-DtlAv66L.js → audit-oC--RZy0.js} +29 -29
  20. package/dist/{auth-Mj21c_GN.js → auth-YB6m93-M.js} +1 -1
  21. package/dist/{auth-choice-CEycltU4.js → auth-choice-CsSQLEkP.js} +13 -13
  22. package/dist/{auth-choice-CGHVedXa.js → auth-choice-gp-h1aBd.js} +11 -11
  23. package/dist/{auth-choice.apply-helpers-D4YQXYfc.js → auth-choice.apply-helpers-CPpuynsT.js} +1 -1
  24. package/dist/{auth-profiles-CdLTlJLc.js → auth-profiles-15pq9j9V.js} +16 -16
  25. package/dist/{auth-token-7kzDLVhb.js → auth-token-Bwn8N6KA.js} +1 -1
  26. package/dist/{banner-CpzKVd4-.js → banner-hcZ0XNXv.js} +2 -2
  27. package/dist/{bonjour-discovery-BuS9wF_p.js → bonjour-discovery-2btw06uD.js} +1 -1
  28. package/dist/{browser-cli-BVtbvQ3Z.js → browser-cli-C4PdLYHy.js} +12 -12
  29. package/dist/build-info.json +3 -3
  30. package/dist/bundled/boot-md/handler.js +51 -51
  31. package/dist/bundled/bootstrap-extra-files/handler.js +6 -6
  32. package/dist/bundled/command-logger/handler.js +2 -2
  33. package/dist/bundled/session-memory/handler.js +51 -51
  34. package/dist/{call-Dp9SDkqK.js → call-CZgRbVYm.js} +10 -10
  35. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  36. package/dist/{channel-account-context-ESLVGdUf.js → channel-account-context-BYiOuxnf.js} +5 -5
  37. package/dist/{channel-activity-LfmEkdDN.js → channel-activity-D9K6yeu8.js} +1 -1
  38. package/dist/{channel-activity-BDnjYF7B.js → channel-activity-xHOMiarp.js} +3 -3
  39. package/dist/{channel-options-CsYaFB_4.js → channel-options-DJkf_8wi.js} +3 -3
  40. package/dist/{channel-selection-DFJsYFPo.js → channel-selection-BpIsCVV5.js} +1 -1
  41. package/dist/{channel-web-DzRsJEE4.js → channel-web-wb1My1Yi.js} +17 -17
  42. package/dist/{channels-cli-CpfeOXtJ.js → channels-cli-DlQONtY9.js} +93 -93
  43. package/dist/{channels-status-issues-6V9ktlZD.js → channels-status-issues-Hj-GOSVm.js} +1 -1
  44. package/dist/{chrome-CRBG2YP_.js → chrome-DwizpzOC.js} +26 -26
  45. package/dist/{chrome-CyM61Cn2.js → chrome-L_icBVLq.js} +4 -4
  46. package/dist/{clawbot-cli-COtnakIJ.js → clawbot-cli-CyTZUVIJ.js} +11 -11
  47. package/dist/cli/daemon-cli.js +1 -1
  48. package/dist/{cli-jnT1hYPO.js → cli-CNTrB-ni.js} +73 -73
  49. package/dist/{client-C-wA75vx.js → client-g0366Z73.js} +2 -2
  50. package/dist/{command-registry-g5tDqdAU.js → command-registry-VOmumlmD.js} +11 -11
  51. package/dist/{command-secret-targets-u3eWn-W3.js → command-secret-targets-CIMuIdbL.js} +4 -4
  52. package/dist/{commands-C8pWcFs_.js → commands-DU7At3rY.js} +1 -1
  53. package/dist/{commands-registry-J6nVL3BQ.js → commands-registry-B_WUa9KB.js} +3 -3
  54. package/dist/{commands-registry-D5qXbFJn.js → commands-registry-V1zZ5pPC.js} +4 -4
  55. package/dist/{completion-cli-DQsyli3B.js → completion-cli-pqdmKVTo.js} +13 -13
  56. package/dist/{config-cli-DUycVHoC.js → config-cli-BqznmzlM.js} +7 -7
  57. package/dist/{config-guard--Obk2MGi.js → config-guard-D8jiLjr7.js} +3 -3
  58. package/dist/{config-validation-iOxszdEd.js → config-validation-BngLiGoq.js} +3 -3
  59. package/dist/{configure-Al_pz_5z.js → configure-B--Umf_O.js} +17 -17
  60. package/dist/{control-ui-assets-DpjfNcTC.js → control-ui-assets-C9ewbI8z.js} +1 -1
  61. package/dist/{cron-cli-CQ5EZw_b.js → cron-cli-DCRPpI1m.js} +11 -11
  62. package/dist/{daemon-cli-Bb80Mzv5.js → daemon-cli-DtBzKM_d.js} +15 -15
  63. package/dist/{daemon-install-B09ifLcJ.js → daemon-install-ckPBUAjJ.js} +4 -4
  64. package/dist/{daemon-install-helpers-CYpECiEx.js → daemon-install-helpers-BWf-PrgA.js} +11 -11
  65. package/dist/{deliver-ChbFOwjw.js → deliver-D4o6VIur.js} +21 -21
  66. package/dist/{deliver-CxF9h9PE.js → deliver-b93aBgie.js} +7 -7
  67. package/dist/deliver-runtime-CdWd-JQI.js +61 -0
  68. package/dist/deliver-runtime-P-G3bPjW.js +36 -0
  69. package/dist/deps-send-discord.runtime-BltWu9GW.js +36 -0
  70. package/dist/deps-send-discord.runtime-DnbhTFX9.js +26 -0
  71. package/dist/deps-send-imessage.runtime-BOiQ6mDx.js +25 -0
  72. package/dist/deps-send-imessage.runtime-CdCif3t7.js +35 -0
  73. package/dist/deps-send-signal.runtime-CTcl388M.js +24 -0
  74. package/dist/deps-send-signal.runtime-fHqkSmMW.js +34 -0
  75. package/dist/deps-send-slack.runtime-CCqBz4Kg.js +22 -0
  76. package/dist/deps-send-slack.runtime-CkyZO7ln.js +32 -0
  77. package/dist/{deps-send-telegram.runtime-B6wp3kx8.js → deps-send-telegram.runtime-C--B69CN.js} +16 -16
  78. package/dist/deps-send-telegram.runtime-DGSKTCpH.js +27 -0
  79. package/dist/deps-send-whatsapp.runtime-BkoMLlCM.js +119 -0
  80. package/dist/deps-send-whatsapp.runtime-CJkTHkah.js +60 -0
  81. package/dist/{devices-cli-C0dUbeL4.js → devices-cli-D6V059Dh.js} +8 -8
  82. package/dist/{diagnostic-Co6Kghr-.js → diagnostic-Bn4PZjMZ.js} +2 -2
  83. package/dist/{diagnostic-BfiudAAN.js → diagnostic-BpP9UBCE.js} +1 -1
  84. package/dist/{diagnostics-DCWM_8Ur.js → diagnostics---0c2_jo.js} +5 -5
  85. package/dist/{directory-cli-Dlws13Di.js → directory-cli-RYC34-EU.js} +7 -7
  86. package/dist/{dns-cli-But7QdAw.js → dns-cli-CElNoV5S.js} +5 -5
  87. package/dist/{dock-BbUkruOF.js → dock-nA2DVPCV.js} +4 -4
  88. package/dist/{docs-cli-Ck2IKAtw.js → docs-cli-Bv7ltPvi.js} +4 -4
  89. package/dist/{doctor-completion-Nat1HXE1.js → doctor-completion-CQIiN7rY.js} +2 -2
  90. package/dist/{doctor-config-flow-WCCoUXeB.js → doctor-config-flow-BOAryh5P.js} +15 -15
  91. package/dist/{enable-C3H8BtN4.js → enable-688HYBNS.js} +1 -1
  92. package/dist/entry.js +2 -2
  93. package/dist/{errors-xt401nuk.js → errors-CCLeFWAg.js} +1 -1
  94. package/dist/{exec-approvals-allowlist-ySf2Yo5n.js → exec-approvals-allowlist-C0Eya3rT.js} +1 -1
  95. package/dist/{exec-approvals-cli-DhLLOys6.js → exec-approvals-cli-BYYerKp8.js} +16 -16
  96. package/dist/{exec-safe-bin-runtime-policy-DnXViOlF.js → exec-safe-bin-runtime-policy-BmJmfDRo.js} +2 -2
  97. package/dist/{fetch-D-SiVqBm.js → fetch-BhAHVdwx.js} +3 -3
  98. package/dist/{fetch-DuraYswo.js → fetch-BlJWzEP6.js} +5 -5
  99. package/dist/{fetch-guard-CKYBfJ66.js → fetch-guard-BbBdhWz_.js} +1 -1
  100. package/dist/{fetch-guard-DWr0d00H.js → fetch-guard-ChYBwfiy.js} +2 -2
  101. package/dist/{frontmatter-BkTfEZ93.js → frontmatter-CvaMP376.js} +3 -3
  102. package/dist/{fs-safe-CTYUrIgQ.js → fs-safe-0jAo_Whb.js} +4 -4
  103. package/dist/{fs-safe-jMDpsYew.js → fs-safe-CFLs-j60.js} +24 -24
  104. package/dist/{gateway-cli--atF6LYo.js → gateway-cli-DOYWSRqa.js} +153 -153
  105. package/dist/{gateway-rpc-DYyQQ1z9.js → gateway-rpc-w6t8Eq_1.js} +1 -1
  106. package/dist/{github-copilot-token-BDioPmd6.js → github-copilot-token-D13V9YBz.js} +7 -7
  107. package/dist/{health-BDJ72U4Z.js → health-C1EstYHd.js} +11 -11
  108. package/dist/{hooks-cli-r0UX8B9a.js → hooks-cli-BFMve5sG.js} +81 -81
  109. package/dist/{hooks-status-CxBdpBry.js → hooks-status-DBnEWOEP.js} +1 -1
  110. package/dist/{image-C7RmnYxa.js → image-Bbn53mzj.js} +6 -6
  111. package/dist/{image-CyHTO86Q.js → image-Bw71y73Q.js} +5 -5
  112. package/dist/{image-ops-pjs5W0CZ.js → image-ops-AJL9tN3_.js} +10 -10
  113. package/dist/{image-ops-BuUnEOE0.js → image-ops-CehkHxmW.js} +2 -2
  114. package/dist/image-runtime-6jhrqcle.js +55 -0
  115. package/dist/image-runtime-CVv2ra9J.js +29 -0
  116. package/dist/{inspect-BeU4yMp2.js → inspect-CUxeDA8c.js} +4 -4
  117. package/dist/{install-safe-path-BiL8OJvK.js → install-safe-path-BX58wFBl.js} +25 -25
  118. package/dist/{installs-BwKmG0Uy.js → installs-B-xr0Fzq.js} +9 -9
  119. package/dist/{ipv4-BoGwfnEw.js → ipv4-C4Yt-xid.js} +1 -1
  120. package/dist/{ir-B83looB-.js → ir-DAP-B-Xw.js} +8 -8
  121. package/dist/{ir-Da7Ahsqc.js → ir-otKVkb4a.js} +8 -8
  122. package/dist/{issue-format-CJ89_-9v.js → issue-format-DSksfKiV.js} +1 -1
  123. package/dist/{json-files-CuJjdF_0.js → json-files-rR19q30D.js} +8 -8
  124. package/dist/{legacy-names-DOC03BkU.js → legacy-names-TyzbVqa_.js} +1 -1
  125. package/dist/{lifecycle-core-BzuWBBm8.js → lifecycle-core-DVwen0ks.js} +5 -5
  126. package/dist/llm-slug-generator.js +51 -51
  127. package/dist/{logger-BfjWMCSD.js → logger-DMZQQtxK.js} +7 -7
  128. package/dist/{login-VkQ9MW3d.js → login-BcRaGQb6.js} +3 -3
  129. package/dist/{login-CrIwcrVI.js → login-DiCctRo1.js} +5 -5
  130. package/dist/{login-qr-BVMQ-xQz.js → login-qr-C9D47WEZ.js} +6 -6
  131. package/dist/{login-qr-BpPDZdl_.js → login-qr-MUbXgjtd.js} +10 -10
  132. package/dist/{logs-cli-DWHhSnWs.js → logs-cli-B3TG2lp8.js} +9 -9
  133. package/dist/{manager-1bvuGrNR.js → manager-BW_NSIMl.js} +13 -13
  134. package/dist/{manager-BUBwl6M6.js → manager-iwcRf3Xc.js} +14 -14
  135. package/dist/manager-runtime-BN6VevdC.js +18 -0
  136. package/dist/{manager-runtime-H9iQnw64.js → manager-runtime-D3KqpRT7.js} +9 -9
  137. package/dist/{manifest-registry-DVviqWVY.js → manifest-registry-CJb8odRF.js} +1 -1
  138. package/dist/{memory-cli-DarWCbU6.js → memory-cli-DGsJx7YM.js} +12 -12
  139. package/dist/{model-BLV8y_N-.js → model-B792l3Cn.js} +2 -2
  140. package/dist/{model-catalog-DTcBkUlX.js → model-catalog-DZ6kl2Ko.js} +3 -3
  141. package/dist/{model-picker-D-fTOOzb.js → model-picker-6fHys0wK.js} +4 -4
  142. package/dist/{model-selection-Dna0Gz1k.js → model-selection-idoqPmw0.js} +43 -43
  143. package/dist/{models-CmjutMmh.js → models-DerrMmwF.js} +17 -17
  144. package/dist/{models-cli-BZFQX22p.js → models-cli-BkTZg_4v.js} +78 -78
  145. package/dist/{models-config-DNcDbV_G.js → models-config-Dabs9Kdv.js} +6 -6
  146. package/dist/{net-D5fSREu4.js → net-BAIqYNz0.js} +2 -2
  147. package/dist/{node-cli-Cnq-PJTp.js → node-cli-DoEq4zeG.js} +33 -33
  148. package/dist/{node-command-policy-B5BMBBJP.js → node-command-policy-DRhSc90G.js} +1 -1
  149. package/dist/{node-service-BpYZAvpl.js → node-service-CcgtNIeT.js} +1 -1
  150. package/dist/{nodes-cli-CkrDOWpv.js → nodes-cli--d9RiCnK.js} +16 -16
  151. package/dist/{nodes-screen-DfsQohWd.js → nodes-screen-BTND5VDq.js} +7 -7
  152. package/dist/{npm-pack-install-E-mkrZ55.js → npm-pack-install-CGUDOSKz.js} +18 -18
  153. package/dist/{npm-resolution-BUUmg5ON.js → npm-resolution-CAoULCWM.js} +4 -4
  154. package/dist/{onboard-DINGSS9R.js → onboard-CMZRkPVc.js} +6 -6
  155. package/dist/{onboard-channels-Di4MjWDY.js → onboard-channels-SlJu6XWJ.js} +21 -21
  156. package/dist/{onboard-custom-DITBQuWQ.js → onboard-custom-EzfL89yz.js} +4 -4
  157. package/dist/{onboard-helpers-DO7u2ZOy.js → onboard-helpers-lGpaVp03.js} +10 -10
  158. package/dist/{onboard-hooks-K02_ZWDq.js → onboard-hooks-B7TMiJoY.js} +4 -4
  159. package/dist/{onboard-remote-5-ugiSN2.js → onboard-remote-nvWS7on7.js} +4 -4
  160. package/dist/{onboard-skills-CSzbC2KZ.js → onboard-skills-hz91W03u.js} +4 -4
  161. package/dist/{onboarding-BM4dvUK6.js → onboarding-CTPuMVQI.js} +14 -14
  162. package/dist/{onboarding.finalize-p_RDh7ET.js → onboarding.finalize-DLzl5ZOg.js} +87 -87
  163. package/dist/{onboarding.gateway-config-DldlRfms.js → onboarding.gateway-config-C4MoTr60.js} +18 -18
  164. package/dist/{onboarding.secret-input-BIRIJiCU.js → onboarding.secret-input-BFD0OW4X.js} +1 -1
  165. package/dist/{openai-model-default-CY2Nk4cn.js → openai-model-default-h4LbSR7f.js} +2 -2
  166. package/dist/{openclaw-root-BFfBQ6FD.js → openclaw-root-BU3lu8pM.js} +8 -8
  167. package/dist/{outbound-ChDjtuD6.js → outbound-C2kanETZ.js} +6 -6
  168. package/dist/{outbound-attachment-DfWsfe2N.js → outbound-attachment-CAJBGcna.js} +2 -2
  169. package/dist/{outbound-attachment-DqHlD21U.js → outbound-attachment-DBrYWX8h.js} +2 -2
  170. package/dist/{outbound-DPdJe7e1.js → outbound-kbHYt1JW.js} +3 -3
  171. package/dist/{pairing-cli-D2VZxWg3.js → pairing-cli-CXbmkz7Z.js} +8 -8
  172. package/dist/{pairing-labels-D4rnJ5pJ.js → pairing-labels-CaPLIhlh.js} +1 -1
  173. package/dist/{pairing-store-BXArq4hn.js → pairing-store-Brs9aNn_.js} +3 -3
  174. package/dist/{path-alias-guards-DbNvNQar.js → path-alias-guards-DhIwq92y.js} +3 -3
  175. package/dist/{path-alias-guards-BzvdLvTI.js → path-alias-guards-DqXRZmsL.js} +1 -1
  176. package/dist/{path-safety-ClQO4BB6.js → path-safety-BjIM4N4t.js} +1 -1
  177. package/dist/{paths-Cvc9EM8Y.js → paths-C6TxBCvO.js} +5 -5
  178. package/dist/{paths-Bkr-BCxW.js → paths-CCxysrzL.js} +4 -4
  179. package/dist/{paths-BB_1ZWOj.js → paths-Cv63xST_.js} +9 -9
  180. package/dist/{pi-embedded-BC_GWGuw.js → pi-embedded-BaGj07T0.js} +167 -167
  181. package/dist/{pi-embedded-helpers-oXDyXTD8.js → pi-embedded-helpers-DC2OtKrl.js} +6 -6
  182. package/dist/{pi-embedded-helpers-CbIShbOM.js → pi-embedded-helpers-wy0DZvx1.js} +52 -52
  183. package/dist/{pi-model-discovery-Dymwdjt0.js → pi-model-discovery-BGgOlX8N.js} +7 -7
  184. package/dist/{pi-model-discovery-CECkJMCt.js → pi-model-discovery-DOb5RTev.js} +1 -1
  185. package/dist/pi-model-discovery-runtime-Bwmi4Ev8.js +11 -0
  186. package/dist/{pi-model-discovery-runtime-g7UP-SFR.js → pi-model-discovery-runtime-DShjmiiF.js} +5 -5
  187. package/dist/{pi-tools.before-tool-call.runtime-Df7B-ggW.js → pi-tools.before-tool-call.runtime-B079pVah.js} +5 -5
  188. package/dist/{pi-tools.before-tool-call.runtime-Cwab_5W1.js → pi-tools.before-tool-call.runtime-BuLxSyx9.js} +9 -9
  189. package/dist/{pi-tools.policy-CydUEzFi.js → pi-tools.policy-DZ-X86Va.js} +5 -5
  190. package/dist/{plugin-auto-enable-BE4ZVjAL.js → plugin-auto-enable-BCMqEDjQ.js} +3 -3
  191. package/dist/{plugin-registry-DXW3eyib.js → plugin-registry-BPlCWMur.js} +3 -3
  192. package/dist/plugin-sdk/discord.js +6 -6
  193. package/dist/{plugins-4Rj4OjLY.js → plugins-CWkRQYDj.js} +11 -11
  194. package/dist/{plugins-VAZrrfgw.js → plugins-DCxT-37x.js} +2 -2
  195. package/dist/{plugins-cli-BQJOOVMx.js → plugins-cli-D9ILEfyb.js} +83 -83
  196. package/dist/{ports-DMkRSlnH.js → ports-BlCLhwbc.js} +1 -1
  197. package/dist/{ports-DogAV7pa.js → ports-CER5YPnN.js} +2 -2
  198. package/dist/{program-BA11qFx1.js → program-CV56xn7w.js} +81 -81
  199. package/dist/{prompt-select-styled-B0GS28ia.js → prompt-select-styled-BOa5I_PU.js} +40 -40
  200. package/dist/{provider-auth-helpers-CrGL-jik.js → provider-auth-helpers-c6mNCUXO.js} +5 -5
  201. package/dist/{proxy-env-wKO3g8Yv.js → proxy-env-BMrSVckF.js} +1 -1
  202. package/dist/{proxy-env-DlmzDx8x.js → proxy-env-Cq5gdrbj.js} +1 -1
  203. package/dist/{proxy-fetch-B2pEfjbR.js → proxy-fetch-CCjEYbFm.js} +1 -1
  204. package/dist/{push-apns-BEwBjZ0a.js → push-apns-FOkPD05E.js} +5 -5
  205. package/dist/{pw-ai-D2wlMJtN.js → pw-ai-Cl1Lc7RC.js} +14 -14
  206. package/dist/{pw-ai-CnbxziFP.js → pw-ai-CxBU3aK5.js} +18 -18
  207. package/dist/{qmd-manager-BtIKUaO9.js → qmd-manager-BsYsO9Ii.js} +10 -10
  208. package/dist/{qmd-manager-Dp6PJ8zQ.js → qmd-manager-DEJMqoGd.js} +20 -20
  209. package/dist/{qr-cli-CFz9kS5X.js → qr-cli-BD2jK4fg.js} +2 -2
  210. package/dist/{query-expansion-BrSWVbaE.js → query-expansion-1UTIWjP6.js} +12 -12
  211. package/dist/{query-expansion-CX-1fS52.js → query-expansion-DtLc3wjL.js} +6 -6
  212. package/dist/{redact-COik8ET1.js → redact-ClbcYG1J.js} +1 -1
  213. package/dist/{redact-snapshot-Bs4goggz.js → redact-snapshot-D_qQD4A-.js} +1 -1
  214. package/dist/{register.agent-D641ju8B.js → register.agent-tbPA5YAy.js} +94 -94
  215. package/dist/register.configure-DuwRrXc2.js +165 -0
  216. package/dist/{register.maintenance-BFkk8MEH.js → register.maintenance-DrqDlV5b.js} +95 -95
  217. package/dist/{register.message-D5uE_Hop.js → register.message-CoKXNaU0.js} +74 -74
  218. package/dist/{register.onboard-zHFvSwFr.js → register.onboard-CSWOSL9O.js} +18 -18
  219. package/dist/{register.setup-uTbv3_P1.js → register.setup-DBx5JX6h.js} +21 -21
  220. package/dist/{register.status-health-sessions-CB7t-JQx.js → register.status-health-sessions-D1bPtfep.js} +88 -88
  221. package/dist/{register.subclis-MEiNmuy5.js → register.subclis-QGJNmjss.js} +31 -31
  222. package/dist/{rpc-DVfuVmy9.js → rpc-DkMrTUww.js} +1 -1
  223. package/dist/{run-main-mrvunzuy.js → run-main-CPftxqTe.js} +92 -92
  224. package/dist/{run-with-concurrency-BgYfgkXT.js → run-with-concurrency-D_ZpbgEG.js} +4 -4
  225. package/dist/{runtime-C87FQrrv.js → runtime-MAH2Oph4.js} +3 -3
  226. package/dist/{runtime-config-collectors-BQaC477D.js → runtime-config-collectors-BJMV6Mt1.js} +1 -1
  227. package/dist/{runtime-whatsapp-login.runtime-DjdgScUI.js → runtime-whatsapp-login.runtime-CGYWl9eB.js} +7 -7
  228. package/dist/runtime-whatsapp-login.runtime-IeylZEl4.js +13 -0
  229. package/dist/runtime-whatsapp-outbound.runtime-ClBRuLsq.js +22 -0
  230. package/dist/{runtime-whatsapp-outbound.runtime-B74K7opl.js → runtime-whatsapp-outbound.runtime-hZEfYaRM.js} +15 -15
  231. package/dist/{sandbox-Ct-_lzi1.js → sandbox-0TbzPJaS.js} +18 -18
  232. package/dist/{sandbox-cli-C3RoXFRE.js → sandbox-cli-NLaxffXl.js} +25 -25
  233. package/dist/{secrets-cli-B3hqCxvs.js → secrets-cli-KLGbYet6.js} +11 -11
  234. package/dist/{security-cli-DcHIyXr7.js → security-cli-EIEkcYVb.js} +42 -42
  235. package/dist/{send-dfu6_rgf.js → send-BQERFNyo.js} +5 -5
  236. package/dist/{send-CnRP4P-G.js → send-BW-ZtYG3.js} +5 -5
  237. package/dist/{send-L7gRiwyd.js → send-Bj776ESJ.js} +7 -7
  238. package/dist/{send-2zKwf9NW.js → send-BtZAqquW.js} +11 -11
  239. package/dist/{send-DAQAKa9Z.js → send-CxgWxXZc.js} +6 -6
  240. package/dist/{send-5o2p_xjn.js → send-DAMtu9kK.js} +4 -4
  241. package/dist/{send-PE6cwoTe.js → send-DcxmcFi_.js} +8 -8
  242. package/dist/{send-6lz6rNVP.js → send-Dx2RkUOZ.js} +6 -6
  243. package/dist/{send-u1Bo4CSn.js → send-sC6ka831.js} +8 -8
  244. package/dist/{send-BHTiZcH3.js → send-vmONuVgL.js} +26 -26
  245. package/dist/{server-context-8pDe2iyd.js → server-context-HJVwPQYn.js} +12 -12
  246. package/dist/{server-Ci4xtuR9.js → server-kUElNhlY.js} +20 -20
  247. package/dist/{server-lifecycle-k5daSrde.js → server-lifecycle-BE32unpZ.js} +2 -2
  248. package/dist/{server-middleware-DMiFT9xU.js → server-middleware-AS2VOYkK.js} +1 -1
  249. package/dist/{server-node-events-BmnPjNXE.js → server-node-events-DkbZzI6P.js} +74 -74
  250. package/dist/{service-BhOFtHSw.js → service-CyStNr3d.js} +15 -15
  251. package/dist/{session-D8ImowSs.js → session-A4QhBRvH.js} +8 -8
  252. package/dist/{session-DkOjpX3_.js → session-CaCx4rPH.js} +1 -1
  253. package/dist/{session-utils-DKRmXD2l.js → session-utils-CGqb1oeq.js} +6 -6
  254. package/dist/{sessions-svLGrv0Z.js → sessions-BV6HNW4h.js} +4 -4
  255. package/dist/{sessions-BOWPuhe5.js → sessions-BmVDW-7q.js} +15 -15
  256. package/dist/{shared-CjuadLFV.js → shared-DUQavBtY.js} +3 -3
  257. package/dist/{shared-CbAkLNrg.js → shared-JW74idb0.js} +1 -1
  258. package/dist/{skill-commands-DNqJ-kwn.js → skill-commands-CMzBZKG2.js} +9 -9
  259. package/dist/{skill-commands-TpUsdjev.js → skill-commands-WtIJG0CI.js} +5 -5
  260. package/dist/{skill-scanner-BZvvItef.js → skill-scanner-DIFsGcqE.js} +6 -6
  261. package/dist/{skills-DR-vacol.js → skills-7T9PwwL6.js} +3 -3
  262. package/dist/{skills-7ODkHQYp.js → skills-CE_iqvM5.js} +22 -22
  263. package/dist/{skills-cli-oay0tY8Z.js → skills-cli-DPavvthL.js} +5 -5
  264. package/dist/{skills-install-Vmi7xYfa.js → skills-install-BoLfaoWv.js} +6 -6
  265. package/dist/{skills-status-BmN697ff.js → skills-status-CK5Gnf6i.js} +1 -1
  266. package/dist/{slash-commands.runtime-BfaheruW.js → slash-commands.runtime-CMGx2xHy.js} +11 -11
  267. package/dist/slash-commands.runtime-Cpn2tYW4.js +16 -0
  268. package/dist/slash-dispatch.runtime-BAeJXa56.js +114 -0
  269. package/dist/slash-dispatch.runtime-DoBAQBU5.js +56 -0
  270. package/dist/{slash-skill-commands.runtime-D34BKAN-.js → slash-skill-commands.runtime-ChU2tck2.js} +15 -15
  271. package/dist/slash-skill-commands.runtime-DKMvvdDW.js +20 -0
  272. package/dist/{status-BcQchPaC.js → status-Bp-K1BEf.js} +27 -27
  273. package/dist/{status.update-B20UBTDq.js → status.update-ZYUSggzS.js} +2 -2
  274. package/dist/{store-D89wDcz9.js → store--eR1R_UX.js} +2 -2
  275. package/dist/{store-DDkqo1sO.js → store-DeASfYEV.js} +5 -5
  276. package/dist/{subagent-registry-CPxHbyN5.js → subagent-registry-8qHIVhRq.js} +149 -149
  277. package/dist/subagent-registry-runtime-DVomlbm6.js +114 -0
  278. package/dist/subagent-registry-runtime-ppWS3tVu.js +56 -0
  279. package/dist/{subsystem-B45WV3qB.js → subsystem-Di1z8l0Z.js} +14 -14
  280. package/dist/{system-cli-D2yIJoKU.js → system-cli-C2xNfuQM.js} +9 -9
  281. package/dist/{system-run-command-BmhbnLTE.js → system-run-command-BPWZk7KI.js} +1 -1
  282. package/dist/{systemd-DjWVSbAG.js → systemd-Cf-0XKYu.js} +9 -9
  283. package/dist/{systemd-hints-Do-aQ9jw.js → systemd-hints-CYllYKO0.js} +6 -6
  284. package/dist/{systemd-linger-DpmnYgKU.js → systemd-linger-zllO90bD.js} +1 -1
  285. package/dist/{tables-BxyIF0w4.js → tables-CV7Afb0h.js} +1 -1
  286. package/dist/{tables-mE4cJBN2.js → tables-d739Y1xW.js} +1 -1
  287. package/dist/{tailnet-0_FsdHP-.js → tailnet-DJFUq7_R.js} +1 -1
  288. package/dist/{target-errors-KOHiT_JA.js → target-errors-CBI2Ga0y.js} +2 -2
  289. package/dist/{target-errors-mnlwhAjP.js → target-errors-iVxliVqA.js} +4 -4
  290. package/dist/{thinking-BeGmb5k6.js → thinking-DXYisHiZ.js} +7 -7
  291. package/dist/{tokens-q32vI39c.js → tokens-DxnY9ui_.js} +1 -1
  292. package/dist/{tool-images-RZdHiZcG.js → tool-images-2cBx1W8h.js} +2 -2
  293. package/dist/{tool-images-CNPfeCmU.js → tool-images-Bn6dB14u.js} +1 -1
  294. package/dist/{tui-DL6NZZEa.js → tui-DTVy-YhN.js} +6 -6
  295. package/dist/{tui-cli-BNAYhvpu.js → tui-cli-CexRLJ3a.js} +32 -32
  296. package/dist/{update-DlS-d52F.js → update-DijPxK0g.js} +3 -3
  297. package/dist/{update-cli-D8-DqIs2.js → update-cli-9NslG4yR.js} +104 -104
  298. package/dist/{update-runner-CzTQ7BJT.js → update-runner-B6_UqreW.js} +16 -16
  299. package/dist/{web-igmw_EhT.js → web-CzWRVmFt.js} +55 -55
  300. package/dist/web-DGoa03ue.js +118 -0
  301. package/dist/{webhooks-cli-QdaQhvbT.js → webhooks-cli-B4ZcXTtw.js} +6 -6
  302. package/dist/{whatsapp-actions-Bp8F0cOF.js → whatsapp-actions-Jm4VW1Ve.js} +17 -17
  303. package/dist/{whatsapp-actions-BHbJJyqw.js → whatsapp-actions-iEArE_Ez.js} +21 -21
  304. package/dist/{with-timeout-BMMWHlH3.js → with-timeout-C8-tY12i.js} +3 -3
  305. package/dist/{workspace-v76gFdZu.js → workspace-CIGzK2_w.js} +1 -1
  306. package/dist/{workspace-U-DyR64O.js → workspace-CUVC6GX1.js} +20 -20
  307. package/dist/{workspace-dirs-Cz_Zgtg2.js → workspace-dirs-D4SMysgC.js} +1 -1
  308. package/dist/{wsl-CvQfS6aU.js → wsl-CsGe5QCP.js} +2 -2
  309. package/package.json +7 -9
  310. package/scripts/auth-monitor.sh +89 -0
  311. package/scripts/bench-cli-startup.ts +200 -0
  312. package/scripts/bench-model.ts +146 -0
  313. package/scripts/build-and-run-mac.sh +18 -0
  314. package/scripts/build-docs-list.mjs +14 -0
  315. package/scripts/build_icon.sh +59 -0
  316. package/scripts/bundle-a2ui.sh +95 -0
  317. package/scripts/canvas-a2ui-copy.ts +40 -0
  318. package/scripts/changelog-to-html.sh +91 -0
  319. package/scripts/check-channel-agnostic-boundaries.mjs +343 -0
  320. package/scripts/check-composite-action-input-interpolation.py +81 -0
  321. package/scripts/check-ingress-agent-owner-context.mjs +45 -0
  322. package/scripts/check-no-monolithic-plugin-sdk-entry-imports.ts +103 -0
  323. package/scripts/check-no-pairing-store-group-auth.mjs +180 -0
  324. package/scripts/check-no-random-messaging-tmp.mjs +89 -0
  325. package/scripts/check-no-raw-channel-fetch.mjs +107 -0
  326. package/scripts/check-no-raw-window-open.mjs +86 -0
  327. package/scripts/check-no-register-http-handler.mjs +38 -0
  328. package/scripts/check-pairing-account-scope.mjs +100 -0
  329. package/scripts/check-plugin-sdk-exports.mjs +157 -0
  330. package/scripts/check-ts-max-loc.ts +80 -0
  331. package/scripts/check-webhook-auth-body-order.mjs +55 -0
  332. package/scripts/ci-changed-scope.d.mts +9 -0
  333. package/scripts/ci-changed-scope.mjs +141 -0
  334. package/scripts/claude-auth-status.sh +280 -0
  335. package/scripts/clawlog.sh +321 -0
  336. package/scripts/clawtributors-map.json +40 -0
  337. package/scripts/codesign-mac-app.sh +289 -0
  338. package/scripts/codespell-dictionary.txt +3 -0
  339. package/scripts/codespell-ignore.txt +9 -0
  340. package/scripts/committer +117 -0
  341. package/scripts/copy-export-html-templates.ts +59 -0
  342. package/scripts/copy-hook-metadata.ts +55 -0
  343. package/scripts/copy-plugin-sdk-root-alias.mjs +10 -0
  344. package/scripts/create-dmg.sh +176 -0
  345. package/scripts/create-instance.sh +4 -1
  346. package/scripts/cron_usage_report.ts +273 -0
  347. package/scripts/debug-claude-usage.ts +391 -0
  348. package/scripts/dev/discord-acp-plain-language-smoke.ts +868 -0
  349. package/scripts/dev/gateway-smoke.ts +75 -0
  350. package/scripts/dev/gateway-ws-client.ts +132 -0
  351. package/scripts/dev/ios-node-e2e.ts +283 -0
  352. package/scripts/dev/ios-pull-gateway-log.sh +17 -0
  353. package/scripts/dev/test-device-pair-telegram.ts +62 -0
  354. package/scripts/docker/cleanup-smoke/Dockerfile +19 -0
  355. package/scripts/docker/cleanup-smoke/run.sh +35 -0
  356. package/scripts/docker/install-sh-common/cli-verify.sh +47 -0
  357. package/scripts/docker/install-sh-e2e/Dockerfile +17 -0
  358. package/scripts/docker/install-sh-e2e/run.sh +535 -0
  359. package/scripts/docker/install-sh-nonroot/Dockerfile +33 -0
  360. package/scripts/docker/install-sh-nonroot/run.sh +36 -0
  361. package/scripts/docker/install-sh-smoke/Dockerfile +25 -0
  362. package/scripts/docker/install-sh-smoke/run.sh +63 -0
  363. package/scripts/docs-i18n/doc_mode.go +272 -0
  364. package/scripts/docs-i18n/glossary.go +29 -0
  365. package/scripts/docs-i18n/go.mod +10 -0
  366. package/scripts/docs-i18n/go.sum +10 -0
  367. package/scripts/docs-i18n/html_translate.go +160 -0
  368. package/scripts/docs-i18n/main.go +273 -0
  369. package/scripts/docs-i18n/markdown_segments.go +131 -0
  370. package/scripts/docs-i18n/masking.go +89 -0
  371. package/scripts/docs-i18n/order.go +37 -0
  372. package/scripts/docs-i18n/placeholders.go +30 -0
  373. package/scripts/docs-i18n/process.go +202 -0
  374. package/scripts/docs-i18n/prompt.go +146 -0
  375. package/scripts/docs-i18n/segment.go +11 -0
  376. package/scripts/docs-i18n/tm.go +132 -0
  377. package/scripts/docs-i18n/translator.go +247 -0
  378. package/scripts/docs-i18n/util.go +81 -0
  379. package/scripts/docs-link-audit.mjs +233 -0
  380. package/scripts/docs-list.js +173 -0
  381. package/scripts/docs-spellcheck.sh +44 -0
  382. package/scripts/e2e/Dockerfile +30 -0
  383. package/scripts/e2e/Dockerfile.qr-import +13 -0
  384. package/scripts/e2e/doctor-install-switch-docker.sh +160 -0
  385. package/scripts/e2e/gateway-network-docker.sh +145 -0
  386. package/scripts/e2e/onboard-docker.sh +570 -0
  387. package/scripts/e2e/plugins-docker.sh +224 -0
  388. package/scripts/e2e/qr-import-docker.sh +11 -0
  389. package/scripts/firecrawl-compare.ts +139 -0
  390. package/scripts/generate-host-env-security-policy-swift.mjs +74 -0
  391. package/scripts/generate-secretref-credential-matrix.ts +14 -0
  392. package/scripts/ghsa-patch.mjs +168 -0
  393. package/scripts/install-maca.sh +173 -0
  394. package/scripts/install.ps1 +329 -0
  395. package/scripts/ios-configure-signing.sh +100 -0
  396. package/scripts/ios-team-id.sh +207 -0
  397. package/scripts/label-open-issues.ts +893 -0
  398. package/scripts/lib/callsite-guard.mjs +45 -0
  399. package/scripts/lib/pairing-guard-context.mjs +13 -0
  400. package/scripts/lib/ts-guard-utils.mjs +157 -0
  401. package/scripts/make_appcast.sh +70 -0
  402. package/scripts/mobile-reauth.sh +84 -0
  403. package/scripts/notarize-mac-artifact.sh +65 -0
  404. package/scripts/npm_publish.sh +48 -0
  405. package/scripts/package-mac-app.sh +280 -0
  406. package/scripts/package-mac-dist.sh +93 -0
  407. package/scripts/podman/openclaw.container.in +28 -0
  408. package/scripts/pr +1708 -0
  409. package/scripts/pr-merge +44 -0
  410. package/scripts/pr-prepare +40 -0
  411. package/scripts/pr-review +13 -0
  412. package/scripts/pre-commit/filter-staged-files.mjs +39 -0
  413. package/scripts/pre-commit/run-node-tool.sh +31 -0
  414. package/scripts/protocol-gen-swift.ts +247 -0
  415. package/scripts/protocol-gen.ts +51 -0
  416. package/scripts/readability-basic-compare.ts +66 -0
  417. package/scripts/recover-orphaned-processes.sh +191 -0
  418. package/scripts/release-check.ts +362 -0
  419. package/scripts/repro/tsx-name-repro.ts +3 -0
  420. package/scripts/restart-mac.sh +269 -0
  421. package/scripts/run-node.d.mts +22 -0
  422. package/scripts/run-node.mjs +263 -0
  423. package/scripts/run-openclaw-podman.sh +213 -0
  424. package/scripts/sandbox-browser-entrypoint.sh +127 -0
  425. package/scripts/sandbox-browser-setup.sh +7 -0
  426. package/scripts/sandbox-common-setup.sh +40 -0
  427. package/scripts/sandbox-setup.sh +7 -0
  428. package/scripts/setup-auth-system.sh +119 -0
  429. package/scripts/shell-helpers/README.md +226 -0
  430. package/scripts/shell-helpers/clawdock-helpers.sh +417 -0
  431. package/scripts/sparkle-build.ts +76 -0
  432. package/scripts/sqlite-vec-smoke.mjs +38 -0
  433. package/scripts/sync-dist.sh +171 -0
  434. package/scripts/sync-labels.ts +100 -0
  435. package/scripts/sync-moonshot-docs.ts +125 -0
  436. package/scripts/sync-plugin-versions.ts +108 -0
  437. package/scripts/systemd/openclaw-auth-monitor.service +14 -0
  438. package/scripts/systemd/openclaw-auth-monitor.timer +10 -0
  439. package/scripts/termux-auth-widget.sh +81 -0
  440. package/scripts/termux-quick-auth.sh +30 -0
  441. package/scripts/termux-sync-widget.sh +25 -0
  442. package/scripts/test-cleanup-docker.sh +14 -0
  443. package/scripts/test-force.ts +59 -0
  444. package/scripts/test-hotspots.mjs +83 -0
  445. package/scripts/test-install-sh-docker.sh +72 -0
  446. package/scripts/test-install-sh-e2e-docker.sh +29 -0
  447. package/scripts/test-live-gateway-models-docker.sh +33 -0
  448. package/scripts/test-live-models-docker.sh +34 -0
  449. package/scripts/test-parallel.mjs +468 -0
  450. package/scripts/test-perf-budget.mjs +127 -0
  451. package/scripts/test-shell-completion.ts +223 -0
  452. package/scripts/ui.js +203 -0
  453. package/scripts/update-clawtributors.ts +573 -0
  454. package/scripts/update-clawtributors.types.ts +36 -0
  455. package/scripts/update-package-with-mirror.sh +67 -0
  456. package/scripts/watch-node.d.mts +14 -0
  457. package/scripts/watch-node.mjs +92 -0
  458. package/scripts/write-build-info.ts +47 -0
  459. package/scripts/write-cli-compat.ts +74 -0
  460. package/scripts/write-cli-startup-metadata.ts +93 -0
  461. package/scripts/write-plugin-sdk-entry-dts.ts +60 -0
  462. package/scripts/zai-fallback-repro.ts +168 -0
  463. package/dist/deliver-runtime-B80mXYrL.js +0 -36
  464. package/dist/deliver-runtime-DixuU_uB.js +0 -61
  465. package/dist/deps-send-discord.runtime-CDcLcDSt.js +0 -36
  466. package/dist/deps-send-discord.runtime-DZUccI6Z.js +0 -26
  467. package/dist/deps-send-imessage.runtime-BGPUVMIE.js +0 -35
  468. package/dist/deps-send-imessage.runtime-CF3OpoqY.js +0 -25
  469. package/dist/deps-send-signal.runtime-Cw4-ozeO.js +0 -24
  470. package/dist/deps-send-signal.runtime-DQDD44_O.js +0 -34
  471. package/dist/deps-send-slack.runtime-BDsDhS1P.js +0 -22
  472. package/dist/deps-send-slack.runtime-Cpy77gBG.js +0 -32
  473. package/dist/deps-send-telegram.runtime-D_4xVasO.js +0 -27
  474. package/dist/deps-send-whatsapp.runtime-D2sVAclS.js +0 -119
  475. package/dist/deps-send-whatsapp.runtime-UBgpoWg9.js +0 -60
  476. package/dist/image-runtime-B2qh5seQ.js +0 -55
  477. package/dist/image-runtime-DtMbm7AR.js +0 -29
  478. package/dist/manager-runtime-FO1Sx3W8.js +0 -18
  479. package/dist/pi-model-discovery-runtime-BeY4EUPp.js +0 -11
  480. package/dist/register.configure-BrDOSLIq.js +0 -165
  481. package/dist/runtime-whatsapp-login.runtime-DUb55byQ.js +0 -13
  482. package/dist/runtime-whatsapp-outbound.runtime-Bii_xSfI.js +0 -22
  483. package/dist/slash-commands.runtime-CVw6566g.js +0 -16
  484. package/dist/slash-dispatch.runtime-CMK_EPYG.js +0 -56
  485. package/dist/slash-dispatch.runtime-D0xInkf3.js +0 -114
  486. package/dist/slash-skill-commands.runtime-DxZ4z5h6.js +0 -20
  487. package/dist/subagent-registry-runtime-DdGrQBnQ.js +0 -56
  488. package/dist/subagent-registry-runtime-SkB2tTaE.js +0 -114
  489. package/dist/web-DWiOofzq.js +0 -118
  490. package/install.sh +0 -293
@@ -0,0 +1,468 @@
1
+ import { spawn } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+
5
+ // On Windows, `.cmd` launchers can fail with `spawn EINVAL` when invoked without a shell
6
+ // (especially under GitHub Actions + Git Bash). Use `shell: true` and let the shell resolve pnpm.
7
+ const pnpm = "pnpm";
8
+
9
+ const unitIsolatedFilesRaw = [
10
+ "src/plugins/loader.test.ts",
11
+ "src/plugins/tools.optional.test.ts",
12
+ "src/agents/session-tool-result-guard.tool-result-persist-hook.test.ts",
13
+ "src/security/fix.test.ts",
14
+ // Runtime source guard scans are sensitive to filesystem contention.
15
+ "src/security/temp-path-guard.test.ts",
16
+ "src/security/audit.test.ts",
17
+ "src/utils.test.ts",
18
+ "src/auto-reply/tool-meta.test.ts",
19
+ "src/auto-reply/envelope.test.ts",
20
+ "src/commands/auth-choice.test.ts",
21
+ // Process supervision + docker setup suites are stable but setup-heavy.
22
+ "src/process/supervisor/supervisor.test.ts",
23
+ "src/docker-setup.test.ts",
24
+ // Filesystem-heavy skills sync suite.
25
+ "src/agents/skills.build-workspace-skills-prompt.syncs-merged-skills-into-target-workspace.test.ts",
26
+ // Real git hook integration test; keep signal, move off unit-fast critical path.
27
+ "test/git-hooks-pre-commit.test.ts",
28
+ // Setup-heavy doctor command suites; keep them off the unit-fast critical path.
29
+ "src/commands/doctor.warns-state-directory-is-missing.test.ts",
30
+ "src/commands/doctor.warns-per-agent-sandbox-docker-browser-prune.test.ts",
31
+ "src/commands/doctor.runs-legacy-state-migrations-yes-mode-without.test.ts",
32
+ // Setup-heavy CLI update flow suite; move off unit-fast critical path.
33
+ "src/cli/update-cli.test.ts",
34
+ // Expensive schema build/bootstrap checks; keep coverage but run in isolated lane.
35
+ "src/config/schema.test.ts",
36
+ "src/config/schema.tags.test.ts",
37
+ // CLI smoke/agent flows are stable but setup-heavy.
38
+ "src/cli/program.smoke.test.ts",
39
+ "src/commands/agent.test.ts",
40
+ "src/media/store.test.ts",
41
+ "src/media/store.header-ext.test.ts",
42
+ "src/web/media.test.ts",
43
+ "src/web/auto-reply.web-auto-reply.falls-back-text-media-send-fails.test.ts",
44
+ "src/browser/server.covers-additional-endpoint-branches.test.ts",
45
+ "src/browser/server.post-tabs-open-profile-unknown-returns-404.test.ts",
46
+ "src/browser/server.agent-contract-snapshot-endpoints.test.ts",
47
+ "src/browser/server.agent-contract-form-layout-act-commands.test.ts",
48
+ "src/browser/server.skips-default-maxchars-explicitly-set-zero.test.ts",
49
+ "src/browser/server.auth-token-gates-http.test.ts",
50
+ // Keep this high-variance heavy file off the unit-fast critical path.
51
+ "src/auto-reply/reply.block-streaming.test.ts",
52
+ // Archive extraction/fixture-heavy suite; keep off unit-fast critical path.
53
+ "src/hooks/install.test.ts",
54
+ // Download/extraction safety cases can spike under unit-fast contention.
55
+ "src/agents/skills-install.download.test.ts",
56
+ // Skills discovery/snapshot suites are filesystem-heavy and high-variance in vmForks lanes.
57
+ "src/agents/skills.test.ts",
58
+ "src/agents/skills.buildworkspaceskillsnapshot.test.ts",
59
+ "src/browser/extension-relay.test.ts",
60
+ "extensions/acpx/src/runtime.test.ts",
61
+ // Shell-heavy script harness can contend under vmForks startup bursts.
62
+ "test/scripts/ios-team-id.test.ts",
63
+ // Heavy runner/exec/archive suites are stable but contend on shared resources under vmForks.
64
+ "src/agents/pi-embedded-runner.test.ts",
65
+ "src/agents/bash-tools.test.ts",
66
+ "src/agents/openclaw-tools.subagents.sessions-spawn.lifecycle.test.ts",
67
+ "src/agents/bash-tools.exec.background-abort.test.ts",
68
+ "src/agents/subagent-announce.format.test.ts",
69
+ "src/infra/archive.test.ts",
70
+ "src/cli/daemon-cli.coverage.test.ts",
71
+ // Model normalization test imports config/model discovery stack; keep off unit-fast critical path.
72
+ "src/agents/models-config.normalizes-gemini-3-ids-preview-google-providers.test.ts",
73
+ // Auth profile rotation suite is retry-heavy and high-variance under vmForks contention.
74
+ "src/agents/pi-embedded-runner.run-embedded-pi-agent.auth-profile-rotation.test.ts",
75
+ // Heavy trigger command scenarios; keep off unit-fast critical path to reduce contention noise.
76
+ "src/auto-reply/reply.triggers.trigger-handling.filters-usage-summary-current-model-provider.test.ts",
77
+ "src/auto-reply/reply.triggers.trigger-handling.targets-active-session-native-stop.test.ts",
78
+ "src/auto-reply/reply.triggers.group-intro-prompts.test.ts",
79
+ "src/auto-reply/reply.triggers.trigger-handling.handles-inline-commands-strips-it-before-agent.test.ts",
80
+ "src/web/auto-reply.web-auto-reply.compresses-common-formats-jpeg-cap.test.ts",
81
+ // Setup-heavy bot bootstrap suite.
82
+ "src/telegram/bot.create-telegram-bot.test.ts",
83
+ // Medium-heavy bot behavior suite; move off unit-fast critical path.
84
+ "src/telegram/bot.test.ts",
85
+ // Slack slash registration tests are setup-heavy and can bottleneck unit-fast.
86
+ "src/slack/monitor/slash.test.ts",
87
+ // Uses process-level unhandledRejection listeners; keep it off vmForks to avoid cross-file leakage.
88
+ "src/imessage/monitor.shutdown.unhandled-rejection.test.ts",
89
+ ];
90
+ const unitIsolatedFiles = unitIsolatedFilesRaw.filter((file) => fs.existsSync(file));
91
+
92
+ const children = new Set();
93
+ const isCI = process.env.CI === "true" || process.env.GITHUB_ACTIONS === "true";
94
+ const isMacOS = process.platform === "darwin" || process.env.RUNNER_OS === "macOS";
95
+ const isWindows = process.platform === "win32" || process.env.RUNNER_OS === "Windows";
96
+ const isWindowsCi = isCI && isWindows;
97
+ const hostCpuCount = os.cpus().length;
98
+ const hostMemoryGiB = Math.floor(os.totalmem() / 1024 ** 3);
99
+ // Keep aggressive local defaults for high-memory workstations (Mac Studio class).
100
+ const highMemLocalHost = !isCI && hostMemoryGiB >= 96;
101
+ const lowMemLocalHost = !isCI && hostMemoryGiB < 64;
102
+ const nodeMajor = Number.parseInt(process.versions.node.split(".")[0] ?? "", 10);
103
+ // vmForks is a big win for transform/import heavy suites, but Node 24 had
104
+ // regressions with Vitest's vm runtime in this repo, and low-memory local hosts
105
+ // are more likely to hit per-worker V8 heap ceilings. Keep it opt-out via
106
+ // OPENCLAW_TEST_VM_FORKS=0, and let users force-enable with =1.
107
+ const supportsVmForks = Number.isFinite(nodeMajor) ? nodeMajor !== 24 : true;
108
+ const useVmForks =
109
+ process.env.OPENCLAW_TEST_VM_FORKS === "1" ||
110
+ (process.env.OPENCLAW_TEST_VM_FORKS !== "0" && !isWindows && supportsVmForks && !lowMemLocalHost);
111
+ const disableIsolation = process.env.OPENCLAW_TEST_NO_ISOLATE === "1";
112
+ const includeGatewaySuite = process.env.OPENCLAW_TEST_INCLUDE_GATEWAY === "1";
113
+ const includeExtensionsSuite = process.env.OPENCLAW_TEST_INCLUDE_EXTENSIONS === "1";
114
+ const runs = [
115
+ ...(useVmForks
116
+ ? [
117
+ {
118
+ name: "unit-fast",
119
+ args: [
120
+ "vitest",
121
+ "run",
122
+ "--config",
123
+ "vitest.unit.config.ts",
124
+ "--pool=vmForks",
125
+ ...(disableIsolation ? ["--isolate=false"] : []),
126
+ ...unitIsolatedFiles.flatMap((file) => ["--exclude", file]),
127
+ ],
128
+ },
129
+ {
130
+ name: "unit-isolated",
131
+ args: [
132
+ "vitest",
133
+ "run",
134
+ "--config",
135
+ "vitest.unit.config.ts",
136
+ "--pool=forks",
137
+ ...unitIsolatedFiles,
138
+ ],
139
+ },
140
+ ]
141
+ : [
142
+ {
143
+ name: "unit",
144
+ args: ["vitest", "run", "--config", "vitest.unit.config.ts"],
145
+ },
146
+ ]),
147
+ ...(includeExtensionsSuite
148
+ ? [
149
+ {
150
+ name: "extensions",
151
+ args: [
152
+ "vitest",
153
+ "run",
154
+ "--config",
155
+ "vitest.extensions.config.ts",
156
+ ...(useVmForks ? ["--pool=vmForks"] : []),
157
+ ],
158
+ },
159
+ ]
160
+ : []),
161
+ ...(includeGatewaySuite
162
+ ? [
163
+ {
164
+ name: "gateway",
165
+ args: [
166
+ "vitest",
167
+ "run",
168
+ "--config",
169
+ "vitest.gateway.config.ts",
170
+ // Gateway tests are sensitive to vmForks behavior (global state + env stubs).
171
+ // Keep them on process forks for determinism even when other suites use vmForks.
172
+ "--pool=forks",
173
+ ],
174
+ },
175
+ ]
176
+ : []),
177
+ ];
178
+ const shardOverride = Number.parseInt(process.env.OPENCLAW_TEST_SHARDS ?? "", 10);
179
+ const configuredShardCount =
180
+ Number.isFinite(shardOverride) && shardOverride > 1 ? shardOverride : null;
181
+ const shardCount = configuredShardCount ?? (isWindowsCi ? 2 : 1);
182
+ const shardIndexOverride = (() => {
183
+ const parsed = Number.parseInt(process.env.OPENCLAW_TEST_SHARD_INDEX ?? "", 10);
184
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : null;
185
+ })();
186
+
187
+ if (shardIndexOverride !== null && shardCount <= 1) {
188
+ console.error(
189
+ `[test-parallel] OPENCLAW_TEST_SHARD_INDEX=${String(
190
+ shardIndexOverride,
191
+ )} requires OPENCLAW_TEST_SHARDS>1.`,
192
+ );
193
+ process.exit(2);
194
+ }
195
+
196
+ if (shardIndexOverride !== null && shardIndexOverride > shardCount) {
197
+ console.error(
198
+ `[test-parallel] OPENCLAW_TEST_SHARD_INDEX=${String(
199
+ shardIndexOverride,
200
+ )} exceeds OPENCLAW_TEST_SHARDS=${String(shardCount)}.`,
201
+ );
202
+ process.exit(2);
203
+ }
204
+ const windowsCiArgs = isWindowsCi ? ["--dangerouslyIgnoreUnhandledErrors"] : [];
205
+ const silentArgs =
206
+ process.env.OPENCLAW_TEST_SHOW_PASSED_LOGS === "1" ? [] : ["--silent=passed-only"];
207
+ const rawPassthroughArgs = process.argv.slice(2);
208
+ const passthroughArgs =
209
+ rawPassthroughArgs[0] === "--" ? rawPassthroughArgs.slice(1) : rawPassthroughArgs;
210
+ const rawTestProfile = process.env.OPENCLAW_TEST_PROFILE?.trim().toLowerCase();
211
+ const testProfile =
212
+ rawTestProfile === "low" ||
213
+ rawTestProfile === "max" ||
214
+ rawTestProfile === "normal" ||
215
+ rawTestProfile === "serial"
216
+ ? rawTestProfile
217
+ : "normal";
218
+ const overrideWorkers = Number.parseInt(process.env.OPENCLAW_TEST_WORKERS ?? "", 10);
219
+ const resolvedOverride =
220
+ Number.isFinite(overrideWorkers) && overrideWorkers > 0 ? overrideWorkers : null;
221
+ const parallelGatewayEnabled =
222
+ process.env.OPENCLAW_TEST_PARALLEL_GATEWAY === "1" || (!isCI && highMemLocalHost);
223
+ // Keep gateway serial by default except when explicitly requested or on high-memory local hosts.
224
+ const keepGatewaySerial =
225
+ isWindowsCi ||
226
+ process.env.OPENCLAW_TEST_SERIAL_GATEWAY === "1" ||
227
+ testProfile === "serial" ||
228
+ !parallelGatewayEnabled;
229
+ const parallelRuns = keepGatewaySerial ? runs.filter((entry) => entry.name !== "gateway") : runs;
230
+ const serialRuns = keepGatewaySerial ? runs.filter((entry) => entry.name === "gateway") : [];
231
+ const baseLocalWorkers = Math.max(4, Math.min(16, hostCpuCount));
232
+ const loadAwareDisabledRaw = process.env.OPENCLAW_TEST_LOAD_AWARE?.trim().toLowerCase();
233
+ const loadAwareDisabled = loadAwareDisabledRaw === "0" || loadAwareDisabledRaw === "false";
234
+ const loadRatio =
235
+ !isCI && !loadAwareDisabled && process.platform !== "win32" && hostCpuCount > 0
236
+ ? os.loadavg()[0] / hostCpuCount
237
+ : 0;
238
+ // Keep the fast-path unchanged on normal load; only throttle under extreme host pressure.
239
+ const extremeLoadScale = loadRatio >= 1.1 ? 0.75 : loadRatio >= 1 ? 0.85 : 1;
240
+ const localWorkers = Math.max(4, Math.min(16, Math.floor(baseLocalWorkers * extremeLoadScale)));
241
+ const defaultWorkerBudget =
242
+ testProfile === "low"
243
+ ? {
244
+ unit: 2,
245
+ unitIsolated: 1,
246
+ extensions: 4,
247
+ gateway: 1,
248
+ }
249
+ : testProfile === "serial"
250
+ ? {
251
+ unit: 1,
252
+ unitIsolated: 1,
253
+ extensions: 1,
254
+ gateway: 1,
255
+ }
256
+ : testProfile === "max"
257
+ ? {
258
+ unit: localWorkers,
259
+ unitIsolated: Math.min(4, localWorkers),
260
+ extensions: Math.max(1, Math.min(6, Math.floor(localWorkers / 2))),
261
+ gateway: Math.max(1, Math.min(2, Math.floor(localWorkers / 4))),
262
+ }
263
+ : highMemLocalHost
264
+ ? {
265
+ // High-memory local hosts can prioritize wall-clock speed.
266
+ unit: Math.max(4, Math.min(14, Math.floor((localWorkers * 7) / 8))),
267
+ unitIsolated: Math.max(1, Math.min(2, Math.floor(localWorkers / 6) || 1)),
268
+ extensions: Math.max(1, Math.min(4, Math.floor(localWorkers / 4))),
269
+ gateway: Math.max(2, Math.min(6, Math.floor(localWorkers / 2))),
270
+ }
271
+ : lowMemLocalHost
272
+ ? {
273
+ // Sub-64 GiB local hosts are prone to OOM with large vmFork runs.
274
+ unit: 2,
275
+ unitIsolated: 1,
276
+ extensions: 4,
277
+ gateway: 1,
278
+ }
279
+ : {
280
+ // 64-95 GiB local hosts: conservative split with some parallel headroom.
281
+ unit: Math.max(2, Math.min(8, Math.floor(localWorkers / 2))),
282
+ unitIsolated: 1,
283
+ extensions: Math.max(1, Math.min(4, Math.floor(localWorkers / 4))),
284
+ gateway: 1,
285
+ };
286
+
287
+ // Keep worker counts predictable for local runs; trim macOS CI workers to avoid worker crashes/OOM.
288
+ // In CI on linux/windows, prefer Vitest defaults to avoid cross-test interference from lower worker counts.
289
+ const maxWorkersForRun = (name) => {
290
+ if (resolvedOverride) {
291
+ return resolvedOverride;
292
+ }
293
+ if (isCI && !isMacOS) {
294
+ return null;
295
+ }
296
+ if (isCI && isMacOS) {
297
+ return 1;
298
+ }
299
+ if (name === "unit-isolated") {
300
+ return defaultWorkerBudget.unitIsolated;
301
+ }
302
+ if (name === "extensions") {
303
+ return defaultWorkerBudget.extensions;
304
+ }
305
+ if (name === "gateway") {
306
+ return defaultWorkerBudget.gateway;
307
+ }
308
+ return defaultWorkerBudget.unit;
309
+ };
310
+
311
+ const WARNING_SUPPRESSION_FLAGS = [
312
+ "--disable-warning=ExperimentalWarning",
313
+ "--disable-warning=DEP0040",
314
+ "--disable-warning=DEP0060",
315
+ "--disable-warning=MaxListenersExceededWarning",
316
+ ];
317
+
318
+ const DEFAULT_CI_MAX_OLD_SPACE_SIZE_MB = 4096;
319
+ const maxOldSpaceSizeMb = (() => {
320
+ // CI can hit Node heap limits (especially on large suites). Allow override, default to 4GB.
321
+ const raw = process.env.OPENCLAW_TEST_MAX_OLD_SPACE_SIZE_MB ?? "";
322
+ const parsed = Number.parseInt(raw, 10);
323
+ if (Number.isFinite(parsed) && parsed > 0) {
324
+ return parsed;
325
+ }
326
+ if (isCI && !isWindows) {
327
+ return DEFAULT_CI_MAX_OLD_SPACE_SIZE_MB;
328
+ }
329
+ return null;
330
+ })();
331
+
332
+ const runOnce = (entry, extraArgs = []) =>
333
+ new Promise((resolve) => {
334
+ const maxWorkers = maxWorkersForRun(entry.name);
335
+ // vmForks with a single worker has shown cross-file leakage in extension suites.
336
+ // Fall back to process forks when we intentionally clamp that lane to one worker.
337
+ const entryArgs =
338
+ entry.name === "extensions" && maxWorkers === 1 && entry.args.includes("--pool=vmForks")
339
+ ? entry.args.map((arg) => (arg === "--pool=vmForks" ? "--pool=forks" : arg))
340
+ : entry.args;
341
+ const args = maxWorkers
342
+ ? [
343
+ ...entryArgs,
344
+ "--maxWorkers",
345
+ String(maxWorkers),
346
+ ...silentArgs,
347
+ ...windowsCiArgs,
348
+ ...extraArgs,
349
+ ]
350
+ : [...entryArgs, ...silentArgs, ...windowsCiArgs, ...extraArgs];
351
+ const nodeOptions = process.env.NODE_OPTIONS ?? "";
352
+ const nextNodeOptions = WARNING_SUPPRESSION_FLAGS.reduce(
353
+ (acc, flag) => (acc.includes(flag) ? acc : `${acc} ${flag}`.trim()),
354
+ nodeOptions,
355
+ );
356
+ const heapFlag =
357
+ maxOldSpaceSizeMb && !nextNodeOptions.includes("--max-old-space-size=")
358
+ ? `--max-old-space-size=${maxOldSpaceSizeMb}`
359
+ : null;
360
+ const resolvedNodeOptions = heapFlag
361
+ ? `${nextNodeOptions} ${heapFlag}`.trim()
362
+ : nextNodeOptions;
363
+ let child;
364
+ try {
365
+ child = spawn(pnpm, args, {
366
+ stdio: "inherit",
367
+ env: { ...process.env, VITEST_GROUP: entry.name, NODE_OPTIONS: resolvedNodeOptions },
368
+ shell: isWindows,
369
+ });
370
+ } catch (err) {
371
+ console.error(`[test-parallel] spawn failed: ${String(err)}`);
372
+ resolve(1);
373
+ return;
374
+ }
375
+ children.add(child);
376
+ child.on("error", (err) => {
377
+ console.error(`[test-parallel] child error: ${String(err)}`);
378
+ });
379
+ child.on("exit", (code, signal) => {
380
+ children.delete(child);
381
+ resolve(code ?? (signal ? 1 : 0));
382
+ });
383
+ });
384
+
385
+ const run = async (entry) => {
386
+ if (shardCount <= 1) {
387
+ return runOnce(entry);
388
+ }
389
+ if (shardIndexOverride !== null) {
390
+ return runOnce(entry, ["--shard", `${shardIndexOverride}/${shardCount}`]);
391
+ }
392
+ for (let shardIndex = 1; shardIndex <= shardCount; shardIndex += 1) {
393
+ // eslint-disable-next-line no-await-in-loop
394
+ const code = await runOnce(entry, ["--shard", `${shardIndex}/${shardCount}`]);
395
+ if (code !== 0) {
396
+ return code;
397
+ }
398
+ }
399
+ return 0;
400
+ };
401
+
402
+ const shutdown = (signal) => {
403
+ for (const child of children) {
404
+ child.kill(signal);
405
+ }
406
+ };
407
+
408
+ process.on("SIGINT", () => shutdown("SIGINT"));
409
+ process.on("SIGTERM", () => shutdown("SIGTERM"));
410
+
411
+ if (passthroughArgs.length > 0) {
412
+ const maxWorkers = maxWorkersForRun("unit");
413
+ const args = maxWorkers
414
+ ? [
415
+ "vitest",
416
+ "run",
417
+ "--maxWorkers",
418
+ String(maxWorkers),
419
+ ...silentArgs,
420
+ ...windowsCiArgs,
421
+ ...passthroughArgs,
422
+ ]
423
+ : ["vitest", "run", ...silentArgs, ...windowsCiArgs, ...passthroughArgs];
424
+ const nodeOptions = process.env.NODE_OPTIONS ?? "";
425
+ const nextNodeOptions = WARNING_SUPPRESSION_FLAGS.reduce(
426
+ (acc, flag) => (acc.includes(flag) ? acc : `${acc} ${flag}`.trim()),
427
+ nodeOptions,
428
+ );
429
+ const code = await new Promise((resolve) => {
430
+ let child;
431
+ try {
432
+ child = spawn(pnpm, args, {
433
+ stdio: "inherit",
434
+ env: { ...process.env, NODE_OPTIONS: nextNodeOptions },
435
+ shell: isWindows,
436
+ });
437
+ } catch (err) {
438
+ console.error(`[test-parallel] spawn failed: ${String(err)}`);
439
+ resolve(1);
440
+ return;
441
+ }
442
+ children.add(child);
443
+ child.on("error", (err) => {
444
+ console.error(`[test-parallel] child error: ${String(err)}`);
445
+ });
446
+ child.on("exit", (exitCode, signal) => {
447
+ children.delete(child);
448
+ resolve(exitCode ?? (signal ? 1 : 0));
449
+ });
450
+ });
451
+ process.exit(Number(code) || 0);
452
+ }
453
+
454
+ const parallelCodes = await Promise.all(parallelRuns.map(run));
455
+ const failedParallel = parallelCodes.find((code) => code !== 0);
456
+ if (failedParallel !== undefined) {
457
+ process.exit(failedParallel);
458
+ }
459
+
460
+ for (const entry of serialRuns) {
461
+ // eslint-disable-next-line no-await-in-loop
462
+ const code = await run(entry);
463
+ if (code !== 0) {
464
+ process.exit(code);
465
+ }
466
+ }
467
+
468
+ process.exit(0);
@@ -0,0 +1,127 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+
6
+ function readEnvNumber(name) {
7
+ const raw = process.env[name]?.trim();
8
+ if (!raw) {
9
+ return null;
10
+ }
11
+ const parsed = Number.parseFloat(raw);
12
+ return Number.isFinite(parsed) ? parsed : null;
13
+ }
14
+
15
+ function parseArgs(argv) {
16
+ const args = {
17
+ config: "vitest.unit.config.ts",
18
+ maxWallMs: readEnvNumber("OPENCLAW_TEST_PERF_MAX_WALL_MS"),
19
+ baselineWallMs: readEnvNumber("OPENCLAW_TEST_PERF_BASELINE_WALL_MS"),
20
+ maxRegressionPct: readEnvNumber("OPENCLAW_TEST_PERF_MAX_REGRESSION_PCT") ?? 10,
21
+ };
22
+ for (let i = 0; i < argv.length; i += 1) {
23
+ const arg = argv[i];
24
+ if (arg === "--config") {
25
+ args.config = argv[i + 1] ?? args.config;
26
+ i += 1;
27
+ continue;
28
+ }
29
+ if (arg === "--max-wall-ms") {
30
+ const parsed = Number.parseFloat(argv[i + 1] ?? "");
31
+ if (Number.isFinite(parsed)) {
32
+ args.maxWallMs = parsed;
33
+ }
34
+ i += 1;
35
+ continue;
36
+ }
37
+ if (arg === "--baseline-wall-ms") {
38
+ const parsed = Number.parseFloat(argv[i + 1] ?? "");
39
+ if (Number.isFinite(parsed)) {
40
+ args.baselineWallMs = parsed;
41
+ }
42
+ i += 1;
43
+ continue;
44
+ }
45
+ if (arg === "--max-regression-pct") {
46
+ const parsed = Number.parseFloat(argv[i + 1] ?? "");
47
+ if (Number.isFinite(parsed)) {
48
+ args.maxRegressionPct = parsed;
49
+ }
50
+ i += 1;
51
+ continue;
52
+ }
53
+ }
54
+ return args;
55
+ }
56
+
57
+ function formatMs(ms) {
58
+ return `${ms.toFixed(1)}ms`;
59
+ }
60
+
61
+ const opts = parseArgs(process.argv.slice(2));
62
+ const reportPath = path.join(os.tmpdir(), `openclaw-vitest-perf-${Date.now()}.json`);
63
+ const cmd = [
64
+ "vitest",
65
+ "run",
66
+ "--config",
67
+ opts.config,
68
+ "--reporter=json",
69
+ "--outputFile",
70
+ reportPath,
71
+ ];
72
+
73
+ const startedAt = process.hrtime.bigint();
74
+ const run = spawnSync("pnpm", cmd, {
75
+ stdio: "inherit",
76
+ env: process.env,
77
+ });
78
+ const elapsedMs = Number(process.hrtime.bigint() - startedAt) / 1_000_000;
79
+
80
+ if (run.status !== 0) {
81
+ process.exit(run.status ?? 1);
82
+ }
83
+
84
+ let totalFileDurationMs = 0;
85
+ let fileCount = 0;
86
+ try {
87
+ const report = JSON.parse(fs.readFileSync(reportPath, "utf8"));
88
+ for (const result of report.testResults ?? []) {
89
+ if (typeof result.startTime === "number" && typeof result.endTime === "number") {
90
+ totalFileDurationMs += Math.max(0, result.endTime - result.startTime);
91
+ fileCount += 1;
92
+ }
93
+ }
94
+ } catch {
95
+ // Keep budget checks based on wall time when JSON parsing fails.
96
+ }
97
+
98
+ const allowedByBaseline =
99
+ opts.baselineWallMs !== null
100
+ ? opts.baselineWallMs * (1 + (opts.maxRegressionPct ?? 0) / 100)
101
+ : null;
102
+
103
+ let failed = false;
104
+ if (opts.maxWallMs !== null && elapsedMs > opts.maxWallMs) {
105
+ console.error(
106
+ `[test-perf-budget] wall time ${formatMs(elapsedMs)} exceeded max ${formatMs(opts.maxWallMs)}.`,
107
+ );
108
+ failed = true;
109
+ }
110
+ if (allowedByBaseline !== null && elapsedMs > allowedByBaseline) {
111
+ console.error(
112
+ `[test-perf-budget] wall time ${formatMs(elapsedMs)} exceeded baseline budget ${formatMs(
113
+ allowedByBaseline,
114
+ )} (baseline ${formatMs(opts.baselineWallMs ?? 0)}, +${String(opts.maxRegressionPct)}%).`,
115
+ );
116
+ failed = true;
117
+ }
118
+
119
+ console.log(
120
+ `[test-perf-budget] config=${opts.config} wall=${formatMs(elapsedMs)} file-sum=${formatMs(
121
+ totalFileDurationMs,
122
+ )} files=${String(fileCount)}`,
123
+ );
124
+
125
+ if (failed) {
126
+ process.exit(1);
127
+ }