@symerian/symi 2.6.42 → 2.7.0

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 (283) hide show
  1. package/dist/{accounts-DDuIpcln.js → accounts-Cd816n6l.js} +7 -7
  2. package/dist/{accounts-bK-Yqdwx.js → accounts-CokRskCl.js} +1 -1
  3. package/dist/{accounts-DyJN4_vR.js → accounts-mN_EcgxC.js} +1 -1
  4. package/dist/{acp-cli-CrEIx-c7.js → acp-cli-COzlJi3B.js} +6 -6
  5. package/dist/{agent-scope-CgUHAtCo.js → agent-scope-BRwEc2pG.js} +18 -18
  6. package/dist/{agents-DDRDszOI.js → agents-Cu2bthAX.js} +4 -4
  7. package/dist/{agents.config-BKCY6F2A.js → agents.config-5PTwsijs.js} +1 -1
  8. package/dist/{agents.config-BEVb1Pyx.js → agents.config-Dib8Uo2P.js} +2 -2
  9. package/dist/{api-key-rotation-CzuPlV2t.js → api-key-rotation-CEr3lKih.js} +1 -1
  10. package/dist/{audio-preflight-CIiS5cfP.js → audio-preflight-mj-z_vQ6.js} +28 -28
  11. package/dist/{audit-DB9YkTVX.js → audit-Djfdh06o.js} +23 -23
  12. package/dist/{auth-choice-BbzReh6k.js → auth-choice-5gul6jy2.js} +1 -1
  13. package/dist/{auth-choice-D2xXwBeN.js → auth-choice-CmSUU3t8.js} +8 -8
  14. package/dist/{auth-token-Cay2jwzn.js → auth-token-83A2btbE.js} +1 -1
  15. package/dist/{banner-DqqRwplt.js → banner-B4vQpMIJ.js} +1 -1
  16. package/dist/{bindings-DFaVVCsf.js → bindings-ChzePa8q.js} +1 -1
  17. package/dist/{browser-cli-Ctn9do4z.js → browser-cli-BTD0NlrA.js} +9 -9
  18. package/dist/build-info.json +3 -3
  19. package/dist/bundled/boot-md/handler.js +1 -1
  20. package/dist/bundled/session-memory/handler.js +1 -1
  21. package/dist/{call-DwpGquzW.js → call-tmHtVCkn.js} +9 -9
  22. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  23. package/dist/{channel-options-DQcpDVCx.js → channel-options-DVf4CJIu.js} +1 -1
  24. package/dist/{channel-options-DcazVJQf.js → channel-options-DsWGc55A.js} +2 -2
  25. package/dist/{channel-selection-V2xDgw16.js → channel-selection-DaJDux-Q.js} +1 -1
  26. package/dist/{channel-web-u5yMYO4j.js → channel-web-vGC-WJXi.js} +17 -17
  27. package/dist/{channels-cli-Bog4Kn3X.js → channels-cli-COayA28A.js} +76 -76
  28. package/dist/{channels-cli-C3iJE8eg.js → channels-cli-CSv05N3q.js} +4 -4
  29. package/dist/{channels-status-issues-CJ0Vb_9z.js → channels-status-issues-B_PI3nEE.js} +1 -1
  30. package/dist/{chrome-DU2ZysN3.js → chrome-CSJzpT9Z.js} +2 -2
  31. package/dist/cli/daemon-cli.js +1 -1
  32. package/dist/{cli-eBtEEHLK.js → cli-B-g79xPe.js} +1 -1
  33. package/dist/{cli-QybdZdE7.js → cli-DJjOxip6.js} +63 -63
  34. package/dist/{client-jI1oE0_k.js → client-Bj_vTpri.js} +1 -1
  35. package/dist/{command-registry-BWnZSpbL.js → command-registry-BvpLfzl7.js} +9 -9
  36. package/dist/{commands-BNLCWX6e.js → commands-CtocZ4Lg.js} +1 -1
  37. package/dist/{commands-registry-BT0-zzs3.js → commands-registry-BZ0ZSQpM.js} +3 -3
  38. package/dist/{completion-cli-CUKm7Hb6.js → completion-cli-CfRZ-7QF.js} +2 -2
  39. package/dist/{completion-cli-BhJFXaVU.js → completion-cli-DtQcXg1N.js} +12 -12
  40. package/dist/{config-cli-CjnQyv45.js → config-cli-D9Z78raJ.js} +4 -4
  41. package/dist/{config-cli-B796xZBe.js → config-cli-DL2RdfLM.js} +1 -1
  42. package/dist/{config-guard-CEkSg4hl.js → config-guard-4oRmpR0a.js} +12 -12
  43. package/dist/{config-Dz95lSBW.js → config-tNauHpdq.js} +2 -2
  44. package/dist/{config-validation-HDVDlMSV.js → config-validation-BoDWiwe3.js} +1 -1
  45. package/dist/{configure-DUqT7Dyn.js → configure-Dq4f8WPa.js} +3 -3
  46. package/dist/{configure-D3wIQ0yI.js → configure-jDpF8lmx.js} +15 -15
  47. package/dist/{control-service-BYKXzY4f.js → control-service-BBnhN7aZ.js} +4 -4
  48. package/dist/control-ui/css/style.css +51 -0
  49. package/dist/control-ui/js/app.js +39 -0
  50. package/dist/control-ui/js/gateway.js +2 -0
  51. package/dist/control-ui/js/settings.js +71 -8
  52. package/dist/{control-ui-assets-B7moDVHX.js → control-ui-assets-6n-YayeS.js} +1 -1
  53. package/dist/{cron-cli-DCpsXkrw.js → cron-cli-D165ecaj.js} +10 -10
  54. package/dist/{daemon-cli-DSDcmWOi.js → daemon-cli-BccZzUb0.js} +11 -11
  55. package/dist/{daemon-runtime-mE1b-Q48.js → daemon-runtime-u01h46bE.js} +10 -10
  56. package/dist/{deliver-B4KZ6-oZ.js → deliver-BYdNAEqj.js} +7 -7
  57. package/dist/{devices-cli-x3jIP4Ih.js → devices-cli-D0N71nqX.js} +6 -6
  58. package/dist/{diagnostics-BRwihzJG.js → diagnostics-BrUo0gqs.js} +5 -5
  59. package/dist/{directory-cli-KgsAVTA0.js → directory-cli-aj7aXIBM.js} +7 -7
  60. package/dist/{dm-policy-shared-DlDAGtZL.js → dm-policy-shared-epgkayyq.js} +2 -2
  61. package/dist/{dns-cli-Cwr92Aiq.js → dns-cli-Dit09wbu.js} +3 -3
  62. package/dist/{dock-BhS32F6E.js → dock-BYiRZSgZ.js} +4 -4
  63. package/dist/{docs-cli-qE-blOLC.js → docs-cli-CyWGMA-e.js} +1 -1
  64. package/dist/{doctor-completion-D3oUNFQM.js → doctor-completion-Ccb83Wl5.js} +2 -2
  65. package/dist/{doctor-completion-DBE1IVKj.js → doctor-completion-oQemZItC.js} +1 -1
  66. package/dist/{doctor-config-flow-iIzSEQxb.js → doctor-config-flow-BXmHd2bb.js} +10 -10
  67. package/dist/entry.js +1 -1
  68. package/dist/{exec-approvals-cli-BSgxsdMt.js → exec-approvals-cli-CZ-iTtNO.js} +13 -13
  69. package/dist/extensionAPI.js +1 -1
  70. package/dist/{fs-safe-CUjO1ca2.js → fs-safe-CTDvb1DF.js} +6 -6
  71. package/dist/{gateway-cli-BguO9yV4.js → gateway-cli-C1zPKZ7B.js} +135 -120
  72. package/dist/{gateway-cli-Dc1RT_b9.js → gateway-cli-zbVm1MBQ.js} +30 -15
  73. package/dist/{gateway-rpc-5fREQe9Q.js → gateway-rpc-B1Wzoj99.js} +1 -1
  74. package/dist/{glass-ui-ws-D0UYleBF.js → glass-ui-ws-CvUFd4C6.js} +28 -9
  75. package/dist/{glass-ui-ws-DoIZyE9O.js → glass-ui-ws-D3tAmqKX.js} +104 -85
  76. package/dist/{health-cVvZdeDu.js → health-DQEqLYg1.js} +1 -1
  77. package/dist/{health-D3w4YMlC.js → health-o847FIt1.js} +13 -13
  78. package/dist/{hooks-cli-DZIbjfOA.js → hooks-cli-D_UW9fc8.js} +2 -2
  79. package/dist/{hooks-cli-te5hzOAB.js → hooks-cli-sYjbF4I6.js} +77 -77
  80. package/dist/{image-BWmcNF8N.js → image-lCS3o9xj.js} +3 -3
  81. package/dist/{image-ops-1OJMSAUX.js → image-ops-DYbDWaIA.js} +10 -10
  82. package/dist/index.js +73 -73
  83. package/dist/{inspect-CvbbCuoa.js → inspect-CNYyHVfH.js} +4 -4
  84. package/dist/{install-safe-path-D3Uz77u7.js → install-safe-path-D3mg1DMG.js} +11 -11
  85. package/dist/{installs-DQcRVF1U.js → installs-CYTVYWH_.js} +10 -10
  86. package/dist/{ir-DZam9q5M.js → ir-Dt4hOzxG.js} +6 -6
  87. package/dist/{lifecycle-core-C4HzGXA1.js → lifecycle-core-DxmxQdhS.js} +5 -5
  88. package/dist/llm-slug-generator.js +1 -1
  89. package/dist/{local-roots-aAFLQGkY.js → local-roots-BBeKX7PX.js} +2 -2
  90. package/dist/{login-DODfJ3Dn.js → login-CnjdNmGD.js} +3 -3
  91. package/dist/{login-qr-CBRxijIg.js → login-qr-DUf6CM0M.js} +5 -5
  92. package/dist/{logs-cli-CfGj-dOg.js → logs-cli-BVd6h2-Q.js} +7 -7
  93. package/dist/{manager-D4LJSRyZ.js → manager-C1CfGzZ2.js} +13 -13
  94. package/dist/{markdown-tables-CEbN0fEm.js → markdown-tables-ZwP14ydw.js} +1 -1
  95. package/dist/{memory-cli-DDumUksr.js → memory-cli-DhkRAIdT.js} +14 -14
  96. package/dist/{model-tWhwnFf8.js → model-CeeOcylL.js} +1 -1
  97. package/dist/{model-catalog-8Son0J4O.js → model-catalog-CvbwxWuC.js} +4 -4
  98. package/dist/{model-picker-CAm2Bftd.js → model-picker-C2MqloOs.js} +3 -3
  99. package/dist/{model-selection-CyFvYcRt.js → model-selection-X1oLh3CE.js} +9 -9
  100. package/dist/{models-BCfPhQ4m.js → models-Zol34e73.js} +2 -2
  101. package/dist/{models-cli-Cj2CwbPw.js → models-cli-BzcEA9oa.js} +3 -3
  102. package/dist/{models-cli-BFAtjNIF.js → models-cli-DnMUzr15.js} +72 -72
  103. package/dist/{models-config-CFFjJPe7.js → models-config-CEMioDUi.js} +7 -7
  104. package/dist/{node-cli-DnfDOh1d.js → node-cli-BVJid4L_.js} +28 -28
  105. package/dist/{node-service-CD47Qpf1.js → node-service-CXzMs782.js} +1 -1
  106. package/dist/{nodes-cli-Ci3oxw8k.js → nodes-cli-BN2Nslim.js} +10 -10
  107. package/dist/{nodes-screen-8Bq7DiSa.js → nodes-screen-Cd49cSPb.js} +4 -4
  108. package/dist/{npm-registry-spec-C0CPT3vr.js → npm-registry-spec-DchndI6P.js} +9 -9
  109. package/dist/{onboard-VcdBF5TB.js → onboard-CSseK0Co.js} +13 -13
  110. package/dist/{onboard-BMq8qc1m.js → onboard-CxOT_xD4.js} +2 -2
  111. package/dist/{onboard-channels-CiOun4k1.js → onboard-channels-CUlITipG.js} +5 -5
  112. package/dist/{onboard-channels-B5wgcffj.js → onboard-channels-D-lh_Vh1.js} +1 -1
  113. package/dist/{onboard-custom-XiomtQr7.js → onboard-custom-DTcLdtA9.js} +3 -3
  114. package/dist/{onboard-helpers-DFvWPFhU.js → onboard-helpers-CdPNw25E.js} +8 -8
  115. package/dist/{onboard-hooks-C3ok8kqB.js → onboard-hooks-C_2_jpWg.js} +1 -1
  116. package/dist/{onboard-remote-BURDxwoE.js → onboard-remote-v6QMnyJD.js} +1 -1
  117. package/dist/{onboard-skills-CbzgBT1W.js → onboard-skills-CQtkRP20.js} +4 -4
  118. package/dist/{onboarding-Dp7p6zKa.js → onboarding-DktESmTv.js} +3 -3
  119. package/dist/{onboarding-CGNpTyg2.js → onboarding-Dn5agNG_.js} +13 -13
  120. package/dist/{onboarding.finalize-CrsE5P43.js → onboarding.finalize-Bm-1Kdnh.js} +6 -6
  121. package/dist/{onboarding.finalize-B6DOu8vp.js → onboarding.finalize-CTIZ1zvV.js} +75 -75
  122. package/dist/{onboarding.gateway-config-DKwJ5bWd.js → onboarding.gateway-config-CwnQkyO0.js} +14 -14
  123. package/dist/{openai-model-default-WqcGxyFM.js → openai-model-default-4kBA1_78.js} +2 -2
  124. package/dist/{outbound-wnv03tb3.js → outbound-_Ir3M05f.js} +4 -4
  125. package/dist/{outbound-attachment-Bw-c5Cdp.js → outbound-attachment-Qfh5dlsg.js} +2 -2
  126. package/dist/{pairing-cli-DSM82gJG.js → pairing-cli-C8UXBJ_A.js} +8 -8
  127. package/dist/{pairing-labels-DyXoD1DS.js → pairing-labels-Dxb898X5.js} +1 -1
  128. package/dist/{pairing-store-CK726Dzq.js → pairing-store-B8ktu-6j.js} +2 -2
  129. package/dist/{pairing-token-CX3NN_qj.js → pairing-token-AV-MMfVE.js} +7 -7
  130. package/dist/{paths-BBm9fwuG.js → paths-CT6jsi4E.js} +1 -1
  131. package/dist/{pi-auth-json-zHckislA.js → pi-auth-json-FpfHyEcu.js} +5 -5
  132. package/dist/{pi-embedded-DQe8vBwU.js → pi-embedded-CYDMb5q0.js} +46 -7
  133. package/dist/{pi-embedded-helpers-BgdB5kvy.js → pi-embedded-helpers-Bs4eMaNo.js} +6 -6
  134. package/dist/{pi-tools.policy-DRWb_Cax.js → pi-tools.policy-BBxnqCay.js} +4 -4
  135. package/dist/{plugin-auto-enable-CP0nONRL.js → plugin-auto-enable-DwIrzVOA.js} +2 -2
  136. package/dist/{plugin-registry-BzIbwU3K.js → plugin-registry-CJGPW1-k.js} +1 -1
  137. package/dist/{plugin-registry-D3TUplW8.js → plugin-registry-d0oZLl6y.js} +3 -3
  138. package/dist/plugin-sdk/{channel-web-B6m8UOCl.js → channel-web-Dm-CzA1O.js} +1 -1
  139. package/dist/plugin-sdk/index.js +2 -2
  140. package/dist/plugin-sdk/{reply-CGoJQT_s.js → reply-4HEU7aDS.js} +46 -7
  141. package/dist/plugin-sdk/{web-CJjSOTnI.js → web-Cclb7FTq.js} +2 -2
  142. package/dist/{plugins-DKDeQZF0.js → plugins-BAyxWQSz.js} +2 -2
  143. package/dist/{plugins-cli-DFyRjAtJ.js → plugins-cli-BWgjIJQL.js} +72 -72
  144. package/dist/{plugins-cli-BD1Jb2Ml.js → plugins-cli-CL0tzkMo.js} +2 -2
  145. package/dist/{ports-BOmtxoTv.js → ports-OZQlocB7.js} +2 -2
  146. package/dist/{ports-DtW62rqS.js → ports-u9lWy2Jt.js} +1 -1
  147. package/dist/{program-qGm2M9PG.js → program-BHjH97Q_.js} +7 -7
  148. package/dist/{program-context-45vPEw2G.js → program-context-CXZHSZ4D.js} +39 -39
  149. package/dist/{prompt-select-styled-DRIS9jSv.js → prompt-select-styled-BUFEoSlM.js} +38 -38
  150. package/dist/{prompt-select-styled-DRraJGwA.js → prompt-select-styled-D8LXSUR7.js} +4 -4
  151. package/dist/{provider-auth-helpers-BNOWsjW5.js → provider-auth-helpers-BFHctF2f.js} +1 -1
  152. package/dist/{provider-auth-helpers-BREVjR7R.js → provider-auth-helpers-CeAbh3lv.js} +5 -5
  153. package/dist/{push-apns-CYC70eKy.js → push-apns-BylbQyP9.js} +1 -1
  154. package/dist/{push-apns-CObVeJLC.js → push-apns-DqFdzIkc.js} +4 -4
  155. package/dist/{pw-ai-DQohWnzT.js → pw-ai-CfrnAHwA.js} +7 -7
  156. package/dist/{qmd-manager-CCUK1xoc.js → qmd-manager-DUNbG4Qr.js} +18 -18
  157. package/dist/{qr-cli-CejYwqsj.js → qr-cli-BZYa2gvF.js} +3 -3
  158. package/dist/{register.agent-DzzY8jON.js → register.agent-DxAqRAt3.js} +6 -6
  159. package/dist/{register.agent-DRrHvYcz.js → register.agent-bzSGKS-l.js} +82 -82
  160. package/dist/register.configure-Boyfir72.js +148 -0
  161. package/dist/{register.configure-DlXkwkNR.js → register.configure-WS1nlSp8.js} +6 -6
  162. package/dist/{register.maintenance-CXLXouZV.js → register.maintenance-B1QcUr38.js} +85 -85
  163. package/dist/{register.maintenance-LEf8Q_5p.js → register.maintenance-D_qMTrgD.js} +8 -8
  164. package/dist/{register.message-C4ifV9vG.js → register.message-CJF8gLAN.js} +64 -64
  165. package/dist/{register.message-DsPa-xHV.js → register.message-zu3HGGff.js} +2 -2
  166. package/dist/{register.onboard-DLRPa_4B.js → register.onboard-9dwNqCe6.js} +4 -4
  167. package/dist/{register.onboard-CrY4PxLP.js → register.onboard-CswoaT7q.js} +75 -75
  168. package/dist/{register.setup-fBG_dJfi.js → register.setup-CvomtGGu.js} +78 -78
  169. package/dist/{register.setup-By37g1vN.js → register.setup-TcjUu6HC.js} +4 -4
  170. package/dist/{register.status-health-sessions-DG7KGnD0.js → register.status-health-sessions-CM1SX81r.js} +3 -3
  171. package/dist/{register.status-health-sessions-Ckw86-gn.js → register.status-health-sessions-CQMvbwr6.js} +76 -76
  172. package/dist/{register.subclis-C_xKLugM.js → register.subclis-CVQASXaL.js} +9 -9
  173. package/dist/{replies-BMqtgBhh.js → replies-Dy92jzrz.js} +1 -1
  174. package/dist/{reply-DyjXROKp.js → reply-CpNWtuU4.js} +183 -144
  175. package/dist/{reply-prefix-CE2YmmsD.js → reply-prefix-BLOOs1aW.js} +1 -1
  176. package/dist/{resolve-route-BMoTaVAH.js → resolve-route-BcnaXYvh.js} +2 -2
  177. package/dist/{routes-BAZTZNuQ.js → routes-CVwRcA9D.js} +8 -8
  178. package/dist/{rpc-Co5PQ3IJ.js → rpc-CZFfee1J.js} +1 -1
  179. package/dist/{run-main-Cg3ecTbO.js → run-main-Dq6tfDry.js} +14 -14
  180. package/dist/{runner-DRv0uCK_.js → runner-BAVs-p6Z.js} +20 -20
  181. package/dist/{sandbox-B6N8cV4d.js → sandbox-HZ_uilsn.js} +18 -18
  182. package/dist/{sandbox-cli-DwzaNjIJ.js → sandbox-cli-wZtiyo8g.js} +20 -20
  183. package/dist/{security-cli-D5BWzqEJ.js → security-cli-BESmRIrl.js} +36 -36
  184. package/dist/{send-CQVnyJyF.js → send-BVBCh27_.js} +13 -13
  185. package/dist/{send-DVm0du0_.js → send-CXFTeD_J.js} +4 -4
  186. package/dist/{send-B3RdXvjC.js → send-DT-5buW5.js} +6 -6
  187. package/dist/{send-9SapUCg7.js → send-DsSI8z3F.js} +6 -6
  188. package/dist/{send-Bm4ULEzh.js → send-JWV62VbW.js} +6 -6
  189. package/dist/{server-context-CCBZN8a0.js → server-context-VlF1_hYj.js} +5 -5
  190. package/dist/{server-methods-CWcLut3F.js → server-methods-B0pdetGJ.js} +130 -64
  191. package/dist/{server-methods-CW8eFTGD.js → server-methods-IBEaQXPX.js} +177 -111
  192. package/dist/{server-node-events-CDB0u8PP.js → server-node-events-BACmfyjo.js} +64 -64
  193. package/dist/{server-node-events-C2h9OPo7.js → server-node-events-CyDj7Txd.js} +2 -2
  194. package/dist/{service-osK70kTZ.js → service-D80PyJxB.js} +15 -15
  195. package/dist/{session-DsJGtM7g.js → session-6Qyc4cBQ.js} +2 -2
  196. package/dist/{session-dirs-Dgz7kkUM.js → session-dirs-DPzjjra2.js} +2 -2
  197. package/dist/{sessions-Cpgnq0pA.js → sessions-jTAGYjWl.js} +13 -13
  198. package/dist/{shared-DnmJ0ABB.js → shared-BV7WhIkY.js} +1 -1
  199. package/dist/{shared-73T9fyuK.js → shared-BfhtOZAz.js} +3 -3
  200. package/dist/{skill-commands-Cxw-jNxU.js → skill-commands-ZXbEITKi.js} +5 -5
  201. package/dist/{skill-scanner-hMtQbWPV.js → skill-scanner-w3DJvw1Q.js} +5 -5
  202. package/dist/{skills-6jdJQ5ZL.js → skills-DqQUtOph.js} +4 -4
  203. package/dist/{skills-cli-DXkx4vNV.js → skills-cli-D3lePXkf.js} +7 -7
  204. package/dist/{skills-install-CWVdJkLn.js → skills-install-HGYidhrv.js} +3 -3
  205. package/dist/{skills-status-C3ptXwnh.js → skills-status-Cjsh8we0.js} +1 -1
  206. package/dist/{sqlite-Dx3J_aSE.js → sqlite-BV5ILFtC.js} +12 -12
  207. package/dist/{status-DfPfMVNZ.js → status-BJtbD-cG.js} +2 -2
  208. package/dist/{status-CMx3GAax.js → status-DUeTrQSz.js} +1 -1
  209. package/dist/{status-B2Qt-5kL.js → status-DzHL-eVu.js} +3 -3
  210. package/dist/{status-ZPW5EACm.js → status-nzJEZmNT.js} +25 -25
  211. package/dist/{status.update-CG0ciGaf.js → status.update-TlYwuzTa.js} +3 -3
  212. package/dist/{store-r1DJSDq-.js → store-DvtcmOKj.js} +5 -5
  213. package/dist/{subagent-registry-DQHg3jUV.js → subagent-registry-CzS4CfnV.js} +46 -7
  214. package/dist/{symi-root-CrGJbkzf.js → symi-root-MF6_6SCS.js} +2 -2
  215. package/dist/{system-cli-DFZNGx0i.js → system-cli-C2yhGP4C.js} +7 -7
  216. package/dist/{systemd-DT6SbCim.js → systemd-CevHlgD4.js} +5 -5
  217. package/dist/{systemd-hints-xYZbFny_.js → systemd-hints-DmgRnw1L.js} +6 -6
  218. package/dist/{systemd-linger-DCskIKcx.js → systemd-linger-ScxQ1_H4.js} +1 -1
  219. package/dist/{tables-BEzT0Da4.js → tables-C38rzF6E.js} +1 -1
  220. package/dist/{target-errors-7AvoVa10.js → target-errors-CCz79CmV.js} +4 -4
  221. package/dist/{tool-images-DvUBlqjX.js → tool-images-B-pqX3nX.js} +1 -1
  222. package/dist/{tui-DjPsMdL6.js → tui-D2MOx3Kx.js} +7 -7
  223. package/dist/{tui-cli-pWD_NrUR.js → tui-cli-B2ii7u23.js} +28 -28
  224. package/dist/{unified-runner-DvOFqcrw.js → unified-runner-BtO3UQSd.js} +46 -7
  225. package/dist/{update-Ya0e-JnM.js → update-Don6XTH9.js} +3 -3
  226. package/dist/{update-check-7EzEjSzb.js → update-check-DCo5RtKp.js} +5 -5
  227. package/dist/{update-cli-DBasZeVl.js → update-cli-DRODEMSI.js} +8 -8
  228. package/dist/{update-cli-Df9rh_aN.js → update-cli-gKtjyXlD.js} +95 -95
  229. package/dist/{update-runner-BRKFzAwV.js → update-runner-AsKAxe31.js} +15 -15
  230. package/dist/{update-runner-DVa6cMqp.js → update-runner-JcdOHr71.js} +1 -1
  231. package/dist/{web-Dd05xbUr.js → web-BIzWZFiN.js} +1 -1
  232. package/dist/{web-Cw3bFAiP.js → web-DGo16lWn.js} +1 -1
  233. package/dist/{web-CGh5tw__.js → web-DKwOxo8E.js} +1 -1
  234. package/dist/web-sefqR11J.js +110 -0
  235. package/dist/{webhooks-cli-BRxe4uCg.js → webhooks-cli-DbnQ2BVE.js} +4 -4
  236. package/dist/{whatsapp-actions-ChO_shrk.js → whatsapp-actions-CqXxtCoj.js} +15 -15
  237. package/dist/{with-timeout-CtVdu_1U.js → with-timeout-Cm5EhxG_.js} +1 -1
  238. package/dist/{workspace-dirs-GpkFi6Kw.js → workspace-dirs-DKu48umx.js} +1 -1
  239. package/dist/{wsl-q8spwrME.js → wsl-xNOi_Ch8.js} +2 -2
  240. package/extensions/bluebubbles/package.json +1 -1
  241. package/extensions/copilot-proxy/package.json +1 -1
  242. package/extensions/diagnostics-otel/package.json +1 -1
  243. package/extensions/discord/package.json +1 -1
  244. package/extensions/feishu/package.json +1 -1
  245. package/extensions/google-antigravity-auth/package.json +1 -1
  246. package/extensions/google-gemini-cli-auth/package.json +1 -1
  247. package/extensions/googlechat/package.json +1 -1
  248. package/extensions/imessage/package.json +1 -1
  249. package/extensions/irc/package.json +1 -1
  250. package/extensions/learning-loop/package.json +1 -1
  251. package/extensions/line/package.json +1 -1
  252. package/extensions/llm-task/package.json +1 -1
  253. package/extensions/matrix/CHANGELOG.md +6 -0
  254. package/extensions/matrix/package.json +1 -1
  255. package/extensions/mattermost/package.json +1 -1
  256. package/extensions/memory-core/package.json +1 -1
  257. package/extensions/memory-lancedb/package.json +1 -1
  258. package/extensions/minimax-portal-auth/package.json +1 -1
  259. package/extensions/msteams/CHANGELOG.md +6 -0
  260. package/extensions/msteams/package.json +1 -1
  261. package/extensions/nextcloud-talk/package.json +1 -1
  262. package/extensions/nostr/CHANGELOG.md +6 -0
  263. package/extensions/nostr/package.json +1 -1
  264. package/extensions/open-prose/package.json +1 -1
  265. package/extensions/outlook/package.json +1 -1
  266. package/extensions/pipeline/package.json +1 -1
  267. package/extensions/signal/package.json +1 -1
  268. package/extensions/slack/package.json +1 -1
  269. package/extensions/telegram/package.json +1 -1
  270. package/extensions/tlon/package.json +1 -1
  271. package/extensions/twitch/CHANGELOG.md +6 -0
  272. package/extensions/twitch/package.json +1 -1
  273. package/extensions/voice-call/CHANGELOG.md +6 -0
  274. package/extensions/voice-call/package.json +1 -1
  275. package/extensions/whatsapp/package.json +1 -1
  276. package/extensions/zalo/CHANGELOG.md +6 -0
  277. package/extensions/zalo/package.json +1 -1
  278. package/extensions/zalouser/CHANGELOG.md +6 -0
  279. package/extensions/zalouser/package.json +1 -1
  280. package/package.json +1 -1
  281. package/skills/long-task/scripts/detach-task.sh +91 -14
  282. package/dist/register.configure-BxtTIFTa.js +0 -148
  283. package/dist/web-KiuDkd0x.js +0 -110
@@ -1,58 +1,58 @@
1
1
  import { g as resolveStateDir, t as CONFIG_PATH } from "./paths-Cqn-zk3M.js";
2
2
  import { D as isPlainObject, U as getResolvedLoggerSettings, r as clamp, y as resolveUserPath } from "./utils-B-0b9bGM.js";
3
3
  import { a as normalizeElevatedLevel, c as normalizeUsageDisplay, d as supportsXHighThinking, n as formatXHighModelHint, o as normalizeReasoningLevel, s as normalizeThinkLevel, t as formatThinkingLevels } from "./thinking-EAliFiVK.js";
4
- import { $n as OPENAI_TTS_MODELS, Bn as registerAgentRunContext, Bt as abortEmbeddedPiRun, C as ensureOutboundSessionEntry, Et as agentCommand, Ft as normalizeSendPolicy, G as normalizeCronJobPatch, Gn as resolveTtsApiKey, H as writeRestartSentinel, Hn as getTtsProvider, Ht as waitForEmbeddedPiRunEnd, It as resolveSendPolicy, Jn as resolveTtsPrefsPath, Kn as resolveTtsAutoMode, L as formatDoctorNonInteractiveHint, Mn as listSubagentRunsForRequester, Mt as resolveOutboundTarget, N as scheduleGatewaySigusr1Restart, Ot as resolveAgentDeliveryPlan, Pr as resolveAgentTimeoutMs, Qn as textToSpeech, Rt as createOutboundSendDeps, Sr as isSystemEventContextChanged, Tn as stopSubagentsForRequester, Un as isTtsEnabled, Vn as resolveUserTimezone, W as normalizeCronJobCreate, Wn as isTtsProviderConfigured, Xn as setTtsEnabled, Yn as resolveTtsProviderOrder, Zn as setTtsProvider, _ as loadCombinedSessionStoreForGateway, at as persistBrowserProxyFiles, b as resolveGatewaySessionStoreTarget, br as parseVerboseOverride, c as clearSessionQueues, er as OPENAI_TTS_VOICES, ft as loadSymiPlugins, g as listSessionsFromStore, gt as loadProviderUsageSummary, h as listAgentsForGateway, in as unbindThreadBindingsBySessionKey, it as applyBrowserProxyPaths, jn as listDescendantRunsForRequester, kt as resolveAgentOutboundTarget, mn as createReplyDispatcher, mt as normalizeGroupActivation, n as BARE_SESSION_RESET_PROMPT, p as canonicalizeSpawnedByForAgent, pn as dispatchInboundMessage, qn as resolveTtsConfig, v as loadSessionEntry, vr as applyModelOverrideToSessionEntry, w as resolveOutboundSessionRoute, wn as isAbortTrigger, x as resolveSessionModelRef, xn as formatZonedTimestamp, xr as enqueueSystemEvent, y as pruneLegacyStoreKeys, yr as applyVerboseOverride, zn as onAgentEvent } from "./reply-DyjXROKp.js";
4
+ import { $n as OPENAI_TTS_MODELS, Bn as registerAgentRunContext, Bt as abortEmbeddedPiRun, C as ensureOutboundSessionEntry, Et as agentCommand, Ft as normalizeSendPolicy, G as normalizeCronJobPatch, Gn as resolveTtsApiKey, H as writeRestartSentinel, Hn as getTtsProvider, Ht as waitForEmbeddedPiRunEnd, It as resolveSendPolicy, Jn as resolveTtsPrefsPath, Kn as resolveTtsAutoMode, L as formatDoctorNonInteractiveHint, Mn as listSubagentRunsForRequester, Mt as resolveOutboundTarget, N as scheduleGatewaySigusr1Restart, Ot as resolveAgentDeliveryPlan, Pr as resolveAgentTimeoutMs, Qn as textToSpeech, Rt as createOutboundSendDeps, Sr as isSystemEventContextChanged, Tn as stopSubagentsForRequester, Un as isTtsEnabled, Vn as resolveUserTimezone, W as normalizeCronJobCreate, Wn as isTtsProviderConfigured, Xn as setTtsEnabled, Yn as resolveTtsProviderOrder, Zn as setTtsProvider, _ as loadCombinedSessionStoreForGateway, at as persistBrowserProxyFiles, b as resolveGatewaySessionStoreTarget, br as parseVerboseOverride, c as clearSessionQueues, er as OPENAI_TTS_VOICES, ft as loadSymiPlugins, g as listSessionsFromStore, gt as loadProviderUsageSummary, h as listAgentsForGateway, in as unbindThreadBindingsBySessionKey, it as applyBrowserProxyPaths, jn as listDescendantRunsForRequester, kt as resolveAgentOutboundTarget, mn as createReplyDispatcher, mt as normalizeGroupActivation, n as BARE_SESSION_RESET_PROMPT, p as canonicalizeSpawnedByForAgent, pn as dispatchInboundMessage, qn as resolveTtsConfig, v as loadSessionEntry, vr as applyModelOverrideToSessionEntry, w as resolveOutboundSessionRoute, wn as isAbortTrigger, x as resolveSessionModelRef, xn as formatZonedTimestamp, xr as enqueueSystemEvent, y as pruneLegacyStoreKeys, yr as applyVerboseOverride, zn as onAgentEvent } from "./reply-CpNWtuU4.js";
5
5
  import { S as parseAgentSessionKey, l as resolveAgentIdFromSessionKey, m as DEFAULT_ACCOUNT_ID, o as classifySessionKeyShape, s as normalizeAgentId, t as DEFAULT_AGENT_ID, x as isSubagentSessionKey } from "./session-key-DCt45XZa.js";
6
- import { t as resolveSymiPackageRoot } from "./symi-root-CrGJbkzf.js";
6
+ import { t as resolveSymiPackageRoot } from "./symi-root-MF6_6SCS.js";
7
7
  import { C as createInternalHookEvent, T as triggerInternalHook, d as getActivePluginRegistry, r as DEFAULT_CHAT_CHANNEL, t as CHANNEL_IDS } from "./registry-Cja8eT7G.js";
8
8
  import { f as defaultRuntime, t as createSubsystemLogger } from "./subsystem-D9vIQve0.js";
9
- import { C as ensureAgentWorkspace, S as DEFAULT_USER_FILENAME, T as isWorkspaceOnboardingCompleted, _ as DEFAULT_MEMORY_ALT_FILENAME, b as DEFAULT_SYMIPULSE_FILENAME, c as resolveAgentWorkspaceDir, d as resolveSessionAgentId, g as DEFAULT_IDENTITY_FILENAME, h as DEFAULT_BOOTSTRAP_FILENAME, i as resolveAgentDir, l as resolveDefaultAgentId, n as listAgentIds, p as DEFAULT_AGENTS_FILENAME, t as listAgentEntries, v as DEFAULT_MEMORY_FILENAME, x as DEFAULT_TOOLS_FILENAME, y as DEFAULT_SYMICORE_FILENAME } from "./agent-scope-CgUHAtCo.js";
10
- import { Bt as normalizeSecretInput, _ as resolveSubagentConfiguredModelSelection, d as resolveAllowedModelRef, m as resolveDefaultModelForAgent, y as resolveThinkingDefault } from "./model-selection-CyFvYcRt.js";
9
+ import { C as ensureAgentWorkspace, S as DEFAULT_USER_FILENAME, T as isWorkspaceOnboardingCompleted, _ as DEFAULT_MEMORY_ALT_FILENAME, b as DEFAULT_SYMIPULSE_FILENAME, c as resolveAgentWorkspaceDir, d as resolveSessionAgentId, g as DEFAULT_IDENTITY_FILENAME, h as DEFAULT_BOOTSTRAP_FILENAME, i as resolveAgentDir, l as resolveDefaultAgentId, n as listAgentIds, p as DEFAULT_AGENTS_FILENAME, t as listAgentEntries, v as DEFAULT_MEMORY_FILENAME, x as DEFAULT_TOOLS_FILENAME, y as DEFAULT_SYMICORE_FILENAME } from "./agent-scope-BRwEc2pG.js";
10
+ import { Bt as normalizeSecretInput, _ as resolveSubagentConfiguredModelSelection, d as resolveAllowedModelRef, m as resolveDefaultModelForAgent, y as resolveThinkingDefault } from "./model-selection-X1oLh3CE.js";
11
11
  import { f as GATEWAY_CLIENT_CAPS, g as hasGatewayClientCap, i as isGatewayMessageChannel, l as normalizeMessageChannel, n as isDeliverableMessageChannel, t as INTERNAL_MESSAGE_CHANNEL } from "./message-channel-aT-I_DTX.js";
12
- import { H as VERSION, N as applyMergePatch, P as applyLegacyMigrations, S as sensitive, U as resolveRuntimeServiceVersion, a as parseConfigJson5, c as resolveConfigSnapshotHash, d as SymiSchema, i as loadConfig, l as writeConfigFile, o as readConfigFileSnapshot, s as readConfigFileSnapshotForWrite, u as validateConfigObjectWithPlugins } from "./config-Dz95lSBW.js";
12
+ import { H as VERSION, N as applyMergePatch, P as applyLegacyMigrations, S as sensitive, U as resolveRuntimeServiceVersion, a as parseConfigJson5, c as resolveConfigSnapshotHash, d as SymiSchema, i as loadConfig, l as writeConfigFile, o as readConfigFileSnapshot, s as readConfigFileSnapshotForWrite, u as validateConfigObjectWithPlugins } from "./config-tNauHpdq.js";
13
13
  import { c as pickPrimaryLanIPv4 } from "./ws-C7EXRv8z.js";
14
- import { i as loadWorkspaceSkillEntries } from "./skills-6jdJQ5ZL.js";
14
+ import { i as loadWorkspaceSkillEntries } from "./skills-DqQUtOph.js";
15
15
  import { t as movePathToTrash } from "./trash-DcMh1i4B.js";
16
- import { B as resolveAgentMainSessionKey, C as capArrayByJsonBytes, D as resolveSessionTranscriptCandidates, G as snapshotSessionOrigin, H as resolveMainSessionKey, O as stripEnvelopeFromMessages, S as archiveSessionTranscripts, T as readSessionPreviewItemsFromTranscript, U as resolveMainSessionKeyFromConfig, V as resolveExplicitAgentSessionKey, d as updateSessionStore, o as loadSessionStore, t as extractDeliveryInfo, w as readSessionMessages, x as archiveFileOnDisk, y as normalizeSessionDeliveryFields } from "./sessions-Cpgnq0pA.js";
17
- import { n as listChannelPlugins, r as normalizeChannelId, t as getChannelPlugin } from "./plugins-DKDeQZF0.js";
16
+ import { B as resolveAgentMainSessionKey, C as capArrayByJsonBytes, D as resolveSessionTranscriptCandidates, G as snapshotSessionOrigin, H as resolveMainSessionKey, O as stripEnvelopeFromMessages, S as archiveSessionTranscripts, T as readSessionPreviewItemsFromTranscript, U as resolveMainSessionKeyFromConfig, V as resolveExplicitAgentSessionKey, d as updateSessionStore, o as loadSessionStore, t as extractDeliveryInfo, w as readSessionMessages, x as archiveFileOnDisk, y as normalizeSessionDeliveryFields } from "./sessions-jTAGYjWl.js";
17
+ import { n as listChannelPlugins, r as normalizeChannelId, t as getChannelPlugin } from "./plugins-BAyxWQSz.js";
18
18
  import { n as resolveSessionFilePath, r as resolveSessionFilePathOptions, s as resolveSessionTranscriptsDirForAgent } from "./paths-CyhzMxFA.js";
19
19
  import { i as normalizeInputProvenance } from "./input-provenance-BzbXHcaD.js";
20
- import { n as createBrowserRouteDispatcher } from "./with-timeout-CtVdu_1U.js";
21
- import { C as getGlobalHookRunner, o as normalizeReplyPayloadsForDelivery, t as deliverOutboundPayloads } from "./deliver-B4KZ6-oZ.js";
22
- import { a as resolveAgentIdentity, t as createReplyPrefixOptions } from "./reply-prefix-CE2YmmsD.js";
23
- import { $ as validateNodePairRejectParams, A as validateCronStatusParams, B as validateExecApprovalsGetParams, Bt as rejectDevicePairing, C as validateConfigSetParams, Ct as validateWakeParams, D as validateCronRemoveParams, Dt as validateWizardNextParams, E as validateCronListParams, Et as validateWizardCancelParams, F as validateDevicePairRemoveParams, G as validateModelsListParams, Gt as summarizeDeviceTokens, H as validateExecApprovalsNodeSetParams, I as validateDeviceTokenRevokeParams, It as approveDevicePairing, J as validateNodeInvokeParams, K as validateNodeDescribeParams, L as validateDeviceTokenRotateParams, M as validateDevicePairApproveParams, Mt as errorShape, N as validateDevicePairListParams, O as validateCronRunParams, Ot as validateWizardStartParams, P as validateDevicePairRejectParams, Pt as parseSessionLabel, Q as validateNodePairListParams, S as validateConfigSchemaParams, St as validateUpdateRunParams, T as validateCronAddParams, Tt as validateWebLoginWaitParams, U as validateExecApprovalsSetParams, Ut as revokeDeviceToken, V as validateExecApprovalsNodeGetParams, Vt as removePairedDevice, W as validateLogsTailParams, Wt as rotateDeviceToken, X as validateNodeListParams, Y as validateNodeInvokeResultParams, Z as validateNodePairApproveParams, _ as validateChatInjectParams, _t as validateSkillsInstallParams, a as validateAgentWaitParams, b as validateConfigGetParams, bt as validateTalkConfigParams, c as validateAgentsFilesGetParams, ct as validateSessionsDeleteParams, d as validateAgentsListParams, dt as validateSessionsPreviewParams, et as validateNodePairRequestParams, f as validateAgentsUpdateParams, ft as validateSessionsResetParams, g as validateChatHistoryParams, gt as validateSkillsBinsParams, h as validateChatAbortParams, ht as validateSessionsUsageParams, i as validateAgentParams, it as validatePushTestParams, j as validateCronUpdateParams, jt as ErrorCodes, k as validateCronRunsParams, kt as validateWizardStatusParams, l as validateAgentsFilesListParams, lt as validateSessionsListParams, m as validateChannelsStatusParams, mt as validateSessionsRestoreParams, n as formatValidationErrors, nt as validateNodeRenameParams, o as validateAgentsCreateParams, ot as validateSendParams, p as validateChannelsLogoutParams, pt as validateSessionsResolveParams, q as validateNodeEventParams, r as validateAgentIdentityParams, rt as validatePollParams, s as validateAgentsDeleteParams, st as validateSessionsCompactParams, tt as validateNodePairVerifyParams, u as validateAgentsFilesSetParams, ut as validateSessionsPatchParams, v as validateChatSendParams, vt as validateSkillsStatusParams, wt as validateWebLoginStartParams, x as validateConfigPatchParams, xt as validateTalkModeParams, y as validateConfigApplyParams, yt as validateSkillsUpdateParams, zt as listDevicePairing } from "./client-jI1oE0_k.js";
24
- import { l as authorizeOperatorScopesForMethod, s as ADMIN_SCOPE$2, u as isNodeRoleMethod } from "./call-DwpGquzW.js";
25
- import { c as writeJsonAtomic, o as createAsyncLock, s as readJsonFile } from "./pairing-token-CX3NN_qj.js";
20
+ import { n as createBrowserRouteDispatcher } from "./with-timeout-Cm5EhxG_.js";
21
+ import { C as getGlobalHookRunner, o as normalizeReplyPayloadsForDelivery, t as deliverOutboundPayloads } from "./deliver-BYdNAEqj.js";
22
+ import { a as resolveAgentIdentity, t as createReplyPrefixOptions } from "./reply-prefix-BLOOs1aW.js";
23
+ import { $ as validateNodePairRejectParams, A as validateCronStatusParams, B as validateExecApprovalsGetParams, Bt as rejectDevicePairing, C as validateConfigSetParams, Ct as validateWakeParams, D as validateCronRemoveParams, Dt as validateWizardNextParams, E as validateCronListParams, Et as validateWizardCancelParams, F as validateDevicePairRemoveParams, G as validateModelsListParams, Gt as summarizeDeviceTokens, H as validateExecApprovalsNodeSetParams, I as validateDeviceTokenRevokeParams, It as approveDevicePairing, J as validateNodeInvokeParams, K as validateNodeDescribeParams, L as validateDeviceTokenRotateParams, M as validateDevicePairApproveParams, Mt as errorShape, N as validateDevicePairListParams, O as validateCronRunParams, Ot as validateWizardStartParams, P as validateDevicePairRejectParams, Pt as parseSessionLabel, Q as validateNodePairListParams, S as validateConfigSchemaParams, St as validateUpdateRunParams, T as validateCronAddParams, Tt as validateWebLoginWaitParams, U as validateExecApprovalsSetParams, Ut as revokeDeviceToken, V as validateExecApprovalsNodeGetParams, Vt as removePairedDevice, W as validateLogsTailParams, Wt as rotateDeviceToken, X as validateNodeListParams, Y as validateNodeInvokeResultParams, Z as validateNodePairApproveParams, _ as validateChatInjectParams, _t as validateSkillsInstallParams, a as validateAgentWaitParams, b as validateConfigGetParams, bt as validateTalkConfigParams, c as validateAgentsFilesGetParams, ct as validateSessionsDeleteParams, d as validateAgentsListParams, dt as validateSessionsPreviewParams, et as validateNodePairRequestParams, f as validateAgentsUpdateParams, ft as validateSessionsResetParams, g as validateChatHistoryParams, gt as validateSkillsBinsParams, h as validateChatAbortParams, ht as validateSessionsUsageParams, i as validateAgentParams, it as validatePushTestParams, j as validateCronUpdateParams, jt as ErrorCodes, k as validateCronRunsParams, kt as validateWizardStatusParams, l as validateAgentsFilesListParams, lt as validateSessionsListParams, m as validateChannelsStatusParams, mt as validateSessionsRestoreParams, n as formatValidationErrors, nt as validateNodeRenameParams, o as validateAgentsCreateParams, ot as validateSendParams, p as validateChannelsLogoutParams, pt as validateSessionsResolveParams, q as validateNodeEventParams, r as validateAgentIdentityParams, rt as validatePollParams, s as validateAgentsDeleteParams, st as validateSessionsCompactParams, tt as validateNodePairVerifyParams, u as validateAgentsFilesSetParams, ut as validateSessionsPatchParams, v as validateChatSendParams, vt as validateSkillsStatusParams, wt as validateWebLoginStartParams, x as validateConfigPatchParams, xt as validateTalkModeParams, y as validateConfigApplyParams, yt as validateSkillsUpdateParams, zt as listDevicePairing } from "./client-Bj_vTpri.js";
24
+ import { l as authorizeOperatorScopesForMethod, s as ADMIN_SCOPE$2, u as isNodeRoleMethod } from "./call-tmHtVCkn.js";
25
+ import { c as writeJsonAtomic, o as createAsyncLock, s as readJsonFile } from "./pairing-token-AV-MMfVE.js";
26
26
  import { n as normalizePollInput } from "./polls-DhH5YkzN.js";
27
27
  import { t as getChannelActivity } from "./channel-activity-BOiuJS3t.js";
28
- import { _ as requestNodePairing, g as renamePairedNode, h as rejectNodePairing, m as listNodePairing, o as getRemoteSkillEligibility, p as approveNodePairing, y as verifyNodeToken } from "./skill-commands-Cxw-jNxU.js";
29
- import { t as listAgentWorkspaceDirs } from "./workspace-dirs-GpkFi6Kw.js";
28
+ import { _ as requestNodePairing, g as renamePairedNode, h as rejectNodePairing, m as listNodePairing, o as getRemoteSkillEligibility, p as approveNodePairing, y as verifyNodeToken } from "./skill-commands-ZXbEITKi.js";
29
+ import { t as listAgentWorkspaceDirs } from "./workspace-dirs-DKu48umx.js";
30
30
  import { i as loadSessionUsageTimeSeries, n as loadCostUsageSummary, r as loadSessionCostSummary, t as discoverAllSessions } from "./session-cost-usage-BXAI7CNH.js";
31
- import { w as resolveAssistantAvatarUrl } from "./onboard-helpers-DFvWPFhU.js";
31
+ import { w as resolveAssistantAvatarUrl } from "./onboard-helpers-CdPNw25E.js";
32
32
  import { a as mergeExecApprovalsSocketDefaults, c as readExecApprovalsSnapshot, p as saveExecApprovals, r as ensureExecApprovals, s as normalizeExecApprovals } from "./exec-approvals-DXM2pQYL.js";
33
- import { n as createBrowserControlContext, r as startBrowserControlServiceFromConfig } from "./control-service-BYKXzY4f.js";
33
+ import { n as createBrowserControlContext, r as startBrowserControlServiceFromConfig } from "./control-service-BBnhN7aZ.js";
34
34
  import { i as parseAbsoluteTimeMs } from "./stagger-CvFURHzt.js";
35
35
  import { r as getLastHeartbeatEvent } from "./heartbeat-visibility-ChEo5Zvk.js";
36
36
  import { t as buildChannelUiCatalog } from "./catalog-NQ4pj9RI.js";
37
- import { t as buildWorkspaceSkillStatus } from "./skills-status-C3ptXwnh.js";
37
+ import { t as buildWorkspaceSkillStatus } from "./skills-status-Cjsh8we0.js";
38
38
  import { t as WizardCancelledError } from "./prompts-CfOu9uZi.js";
39
39
  import { t as resolveChannelDefaultAccountId } from "./helpers-DnjQ73f_.js";
40
40
  import { t as buildChannelAccountSnapshot } from "./status-klsFDD3M.js";
41
- import { o as isNodeCommandAllowed, s as resolveNodeCommandAllowlist } from "./audit-DB9YkTVX.js";
42
- import { n as getStatusSummary } from "./status-ZPW5EACm.js";
43
- import { s as setHeartbeatsEnabled } from "./health-D3w4YMlC.js";
44
- import { m as normalizeUpdateChannel } from "./update-check-7EzEjSzb.js";
45
- import { a as sendApnsAlert, c as parseMessageWithAttachments, i as resolveApnsAuthConfigFromEnv, l as formatForLog, n as normalizeApnsEnvironment, o as sendApnsBackgroundWake, s as normalizeRpcAttachmentsToChatAttachments, t as loadApnsRegistration } from "./push-apns-CObVeJLC.js";
46
- import { a as pruneAgentConfig, i as loadAgentIdentity, r as findAgentEntryIndex, t as applyAgentConfig } from "./agents.config-BEVb1Pyx.js";
41
+ import { o as isNodeCommandAllowed, s as resolveNodeCommandAllowlist } from "./audit-Djfdh06o.js";
42
+ import { n as getStatusSummary } from "./status-nzJEZmNT.js";
43
+ import { s as setHeartbeatsEnabled } from "./health-o847FIt1.js";
44
+ import { m as normalizeUpdateChannel } from "./update-check-DCo5RtKp.js";
45
+ import { a as sendApnsAlert, c as parseMessageWithAttachments, i as resolveApnsAuthConfigFromEnv, l as formatForLog, n as normalizeApnsEnvironment, o as sendApnsBackgroundWake, s as normalizeRpcAttachmentsToChatAttachments, t as loadApnsRegistration } from "./push-apns-DqFdzIkc.js";
46
+ import { a as pruneAgentConfig, i as loadAgentIdentity, r as findAgentEntryIndex, t as applyAgentConfig } from "./agents.config-Dib8Uo2P.js";
47
47
  import { t as resolveSystemRunCommand } from "./system-run-command-B_qw8CXP.js";
48
- import { t as installSkill } from "./skills-install-CWVdJkLn.js";
49
- import { t as runGatewayUpdate } from "./update-runner-BRKFzAwV.js";
50
- import * as fs$2 from "node:fs";
48
+ import { t as installSkill } from "./skills-install-HGYidhrv.js";
49
+ import { t as runGatewayUpdate } from "./update-runner-AsKAxe31.js";
50
+ import * as fs$1 from "node:fs";
51
51
  import fs from "node:fs";
52
52
  import * as os$1 from "node:os";
53
53
  import os from "node:os";
54
54
  import path from "node:path";
55
- import fs$1 from "node:fs/promises";
55
+ import fsPromises from "node:fs/promises";
56
56
  import { spawnSync } from "node:child_process";
57
57
  import crypto, { randomUUID } from "node:crypto";
58
58
  import { z } from "zod";
@@ -414,20 +414,20 @@ function resolveCronRunLogPath(params) {
414
414
  }
415
415
  const writesByPath = /* @__PURE__ */ new Map();
416
416
  async function pruneIfNeeded(filePath, opts) {
417
- const stat = await fs$1.stat(filePath).catch(() => null);
417
+ const stat = await fsPromises.stat(filePath).catch(() => null);
418
418
  if (!stat || stat.size <= opts.maxBytes) return;
419
- const lines = (await fs$1.readFile(filePath, "utf-8").catch(() => "")).split("\n").map((l) => l.trim()).filter(Boolean);
419
+ const lines = (await fsPromises.readFile(filePath, "utf-8").catch(() => "")).split("\n").map((l) => l.trim()).filter(Boolean);
420
420
  const kept = lines.slice(Math.max(0, lines.length - opts.keepLines));
421
421
  const { randomBytes } = await import("node:crypto");
422
422
  const tmp = `${filePath}.${process.pid}.${randomBytes(8).toString("hex")}.tmp`;
423
- await fs$1.writeFile(tmp, `${kept.join("\n")}\n`, "utf-8");
424
- await fs$1.rename(tmp, filePath);
423
+ await fsPromises.writeFile(tmp, `${kept.join("\n")}\n`, "utf-8");
424
+ await fsPromises.rename(tmp, filePath);
425
425
  }
426
426
  async function appendCronRunLog(filePath, entry, opts) {
427
427
  const resolved = path.resolve(filePath);
428
428
  const next = (writesByPath.get(resolved) ?? Promise.resolve()).catch(() => void 0).then(async () => {
429
- await fs$1.mkdir(path.dirname(resolved), { recursive: true });
430
- await fs$1.appendFile(resolved, `${JSON.stringify(entry)}\n`, "utf-8");
429
+ await fsPromises.mkdir(path.dirname(resolved), { recursive: true });
430
+ await fsPromises.appendFile(resolved, `${JSON.stringify(entry)}\n`, "utf-8");
431
431
  await pruneIfNeeded(resolved, {
432
432
  maxBytes: opts?.maxBytes ?? 2e6,
433
433
  keepLines: opts?.keepLines ?? 2e3
@@ -439,7 +439,7 @@ async function appendCronRunLog(filePath, entry, opts) {
439
439
  async function readCronRunLogEntries(filePath, opts) {
440
440
  const limit = Math.max(1, Math.min(5e3, Math.floor(opts?.limit ?? 200)));
441
441
  const jobId = opts?.jobId?.trim() || void 0;
442
- const raw = await fs$1.readFile(path.resolve(filePath), "utf-8").catch(() => "");
442
+ const raw = await fsPromises.readFile(path.resolve(filePath), "utf-8").catch(() => "");
443
443
  if (!raw.trim()) return [];
444
444
  const parsed = [];
445
445
  const lines = raw.split("\n");
@@ -1611,6 +1611,33 @@ async function emitSessionUnboundLifecycleEvent(params) {
1611
1611
  outcome: params.reason === "session-reset" ? "reset" : "deleted"
1612
1612
  }, { childSessionKey: params.targetSessionKey });
1613
1613
  }
1614
+ /**
1615
+ * Per-session in-flight lock for sessions.restore. Prevents two concurrent
1616
+ * restore calls for the same session from corrupting each other (e.g. one
1617
+ * archives the active transcript while the other is mid-rename).
1618
+ */
1619
+ const restoreInFlight = /* @__PURE__ */ new Set();
1620
+ /**
1621
+ * Best-effort inverse of `archiveFileOnDisk(file, "reset")` — renames
1622
+ * `<file>.reset.<timestamp>` back to `<file>`. Used by the sessions.restore
1623
+ * rollback path when a later step fails after the current transcript was
1624
+ * archived. Swallows all errors and logs; the goal is to recover as much
1625
+ * state as possible, not to guarantee success.
1626
+ */
1627
+ function renameArchivedBackToOriginal(archivedPath, reason) {
1628
+ const marker = `.${reason}.`;
1629
+ const idx = archivedPath.lastIndexOf(marker);
1630
+ if (idx <= 0) {
1631
+ console.warn(`[sessions.restore] cannot parse archived path for rollback: ${archivedPath}`);
1632
+ return;
1633
+ }
1634
+ const originalPath = archivedPath.slice(0, idx);
1635
+ try {
1636
+ fs.renameSync(archivedPath, originalPath);
1637
+ } catch (err) {
1638
+ console.warn(`[sessions.restore] rollback failed: could not rename ${archivedPath} back to ${originalPath}: ${String(err)}`);
1639
+ }
1640
+ }
1614
1641
  async function ensureSessionRuntimeCleanup(params) {
1615
1642
  const queueKeys = new Set(params.target.storeKeys);
1616
1643
  queueKeys.add(params.target.canonicalKey);
@@ -1859,69 +1886,108 @@ const sessionsHandlers = {
1859
1886
  respond(false, void 0, errorShape(ErrorCodes.INVALID_REQUEST, "Target file is not a valid session transcript."));
1860
1887
  return;
1861
1888
  }
1862
- const { entry } = loadSessionEntry(key);
1863
- const sessionId = entry?.sessionId;
1864
- const cleanupError = await ensureSessionRuntimeCleanup({
1865
- cfg,
1866
- key,
1867
- target,
1868
- sessionId
1869
- });
1870
- if (cleanupError) {
1871
- respond(false, void 0, cleanupError);
1889
+ const lockKey = target.canonicalKey ?? key;
1890
+ if (restoreInFlight.has(lockKey)) {
1891
+ respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, `Restore already in progress for session ${lockKey}; try again in a moment.`));
1872
1892
  return;
1873
1893
  }
1874
- const oldSessionId = entry?.sessionId;
1875
- const oldSessionFile = entry?.sessionFile;
1876
- archiveSessionTranscriptsForSession({
1877
- sessionId: oldSessionId,
1878
- storePath,
1879
- sessionFile: oldSessionFile,
1880
- agentId: target.agentId,
1881
- reason: "reset"
1882
- });
1883
- const restoredFileName = `${restoredSessionId}.jsonl`;
1884
- const restoredPath = path.join(sessionsDir, restoredFileName);
1885
- if (targetPath !== restoredPath) fs.renameSync(targetPath, restoredPath);
1886
- const next = await updateSessionStore(storePath, (store) => {
1887
- const { primaryKey } = migrateAndPruneSessionStoreKey({
1894
+ restoreInFlight.add(lockKey);
1895
+ const rollback = [];
1896
+ let responded = false;
1897
+ try {
1898
+ const { entry } = loadSessionEntry(key);
1899
+ const sessionId = entry?.sessionId;
1900
+ const cleanupError = await ensureSessionRuntimeCleanup({
1888
1901
  cfg,
1889
1902
  key,
1890
- store
1903
+ target,
1904
+ sessionId
1891
1905
  });
1892
- const existingEntry = store[primaryKey];
1893
- const nextEntry = {
1906
+ if (cleanupError) {
1907
+ respond(false, void 0, cleanupError);
1908
+ responded = true;
1909
+ return;
1910
+ }
1911
+ const archivedPaths = archiveSessionTranscriptsForSession({
1912
+ sessionId: entry?.sessionId,
1913
+ storePath,
1914
+ sessionFile: entry?.sessionFile,
1915
+ agentId: target.agentId,
1916
+ reason: "reset"
1917
+ });
1918
+ for (const archived of archivedPaths) rollback.push({
1919
+ desc: `un-archive ${archived}`,
1920
+ fn: () => renameArchivedBackToOriginal(archived, "reset")
1921
+ });
1922
+ const restoredFileName = `${restoredSessionId}.jsonl`;
1923
+ const restoredPath = path.join(sessionsDir, restoredFileName);
1924
+ if (targetPath !== restoredPath) {
1925
+ fs.renameSync(targetPath, restoredPath);
1926
+ rollback.push({
1927
+ desc: `re-archive ${restoredPath} to ${targetPath}`,
1928
+ fn: () => {
1929
+ try {
1930
+ fs.renameSync(restoredPath, targetPath);
1931
+ } catch (err) {
1932
+ console.warn(`[sessions.restore] rollback failed: could not rename ${restoredPath} back to ${targetPath}: ${String(err)}`);
1933
+ }
1934
+ }
1935
+ });
1936
+ }
1937
+ const next = await updateSessionStore(storePath, (store) => {
1938
+ const { primaryKey } = migrateAndPruneSessionStoreKey({
1939
+ cfg,
1940
+ key,
1941
+ store
1942
+ });
1943
+ const existingEntry = store[primaryKey];
1944
+ const nextEntry = {
1945
+ sessionId: restoredSessionId,
1946
+ sessionFile: restoredPath,
1947
+ updatedAt: Date.now(),
1948
+ systemSent: false,
1949
+ abortedLastRun: false,
1950
+ thinkingLevel: existingEntry?.thinkingLevel,
1951
+ verboseLevel: existingEntry?.verboseLevel,
1952
+ reasoningLevel: existingEntry?.reasoningLevel,
1953
+ responseUsage: existingEntry?.responseUsage,
1954
+ model: existingEntry?.model,
1955
+ contextTokens: existingEntry?.contextTokens,
1956
+ sendPolicy: existingEntry?.sendPolicy,
1957
+ label: existingEntry?.label,
1958
+ origin: snapshotSessionOrigin(existingEntry),
1959
+ lastChannel: existingEntry?.lastChannel,
1960
+ lastTo: existingEntry?.lastTo,
1961
+ skillsSnapshot: existingEntry?.skillsSnapshot,
1962
+ inputTokens: 0,
1963
+ outputTokens: 0,
1964
+ totalTokens: 0,
1965
+ totalTokensFresh: true
1966
+ };
1967
+ store[primaryKey] = nextEntry;
1968
+ return nextEntry;
1969
+ });
1970
+ rollback.length = 0;
1971
+ respond(true, {
1972
+ ok: true,
1973
+ key: target.canonicalKey,
1894
1974
  sessionId: restoredSessionId,
1895
- sessionFile: restoredPath,
1896
- updatedAt: Date.now(),
1897
- systemSent: false,
1898
- abortedLastRun: false,
1899
- thinkingLevel: existingEntry?.thinkingLevel,
1900
- verboseLevel: existingEntry?.verboseLevel,
1901
- reasoningLevel: existingEntry?.reasoningLevel,
1902
- responseUsage: existingEntry?.responseUsage,
1903
- model: existingEntry?.model,
1904
- contextTokens: existingEntry?.contextTokens,
1905
- sendPolicy: existingEntry?.sendPolicy,
1906
- label: existingEntry?.label,
1907
- origin: snapshotSessionOrigin(existingEntry),
1908
- lastChannel: existingEntry?.lastChannel,
1909
- lastTo: existingEntry?.lastTo,
1910
- skillsSnapshot: existingEntry?.skillsSnapshot,
1911
- inputTokens: 0,
1912
- outputTokens: 0,
1913
- totalTokens: 0,
1914
- totalTokensFresh: true
1915
- };
1916
- store[primaryKey] = nextEntry;
1917
- return nextEntry;
1918
- });
1919
- respond(true, {
1920
- ok: true,
1921
- key: target.canonicalKey,
1922
- sessionId: restoredSessionId,
1923
- entry: next
1924
- }, void 0);
1975
+ entry: next
1976
+ }, void 0);
1977
+ responded = true;
1978
+ } catch (err) {
1979
+ console.warn(`[sessions.restore] failed for ${lockKey}; running ${rollback.length} rollback step(s): ${String(err)}`);
1980
+ for (let i = rollback.length - 1; i >= 0; i--) {
1981
+ const step = rollback[i];
1982
+ if (step) step.fn();
1983
+ }
1984
+ if (!responded) {
1985
+ respond(false, void 0, errorShape(ErrorCodes.UNAVAILABLE, `Restore failed: ${err instanceof Error ? err.message : String(err)}`));
1986
+ responded = true;
1987
+ }
1988
+ } finally {
1989
+ restoreInFlight.delete(lockKey);
1990
+ }
1925
1991
  },
1926
1992
  "sessions.delete": async ({ params, respond, client, isWebchatConnect }) => {
1927
1993
  if (!assertValidParams(params, validateSessionsDeleteParams, "sessions.delete", respond)) return;
@@ -2514,7 +2580,7 @@ function resolveAgentWorkspaceFileOrRespondError(params, respond) {
2514
2580
  }
2515
2581
  async function statFile(filePath) {
2516
2582
  try {
2517
- const stat = await fs$1.stat(filePath);
2583
+ const stat = await fsPromises.stat(filePath);
2518
2584
  if (!stat.isFile()) return null;
2519
2585
  return {
2520
2586
  size: stat.size,
@@ -2584,7 +2650,7 @@ function resolveOptionalStringParam(value) {
2584
2650
  async function moveToTrashBestEffort(pathname) {
2585
2651
  if (!pathname) return;
2586
2652
  try {
2587
- await fs$1.access(pathname);
2653
+ await fsPromises.access(pathname);
2588
2654
  } catch {
2589
2655
  return;
2590
2656
  }
@@ -2631,7 +2697,7 @@ const agentsHandlers = {
2631
2697
  dir: workspaceDir,
2632
2698
  ensureBootstrapFiles: !Boolean(nextConfig.agents?.defaults?.skipBootstrap)
2633
2699
  });
2634
- await fs$1.mkdir(resolveSessionTranscriptsDirForAgent(agentId), { recursive: true });
2700
+ await fsPromises.mkdir(resolveSessionTranscriptsDirForAgent(agentId), { recursive: true });
2635
2701
  await writeConfigFile(nextConfig);
2636
2702
  const safeName = sanitizeIdentityLine(rawName);
2637
2703
  const emoji = resolveOptionalStringParam(params.emoji);
@@ -2644,7 +2710,7 @@ const agentsHandlers = {
2644
2710
  ...avatar ? [`- Avatar: ${sanitizeIdentityLine(avatar)}`] : [],
2645
2711
  ""
2646
2712
  ];
2647
- await fs$1.appendFile(identityPath, lines.join("\n"), "utf-8");
2713
+ await fsPromises.appendFile(identityPath, lines.join("\n"), "utf-8");
2648
2714
  respond(true, {
2649
2715
  ok: true,
2650
2716
  agentId,
@@ -2679,9 +2745,9 @@ const agentsHandlers = {
2679
2745
  });
2680
2746
  if (avatar) {
2681
2747
  const workspace = workspaceDir ?? resolveAgentWorkspaceDir(nextConfig, agentId);
2682
- await fs$1.mkdir(workspace, { recursive: true });
2748
+ await fsPromises.mkdir(workspace, { recursive: true });
2683
2749
  const identityPath = path.join(workspace, DEFAULT_IDENTITY_FILENAME);
2684
- await fs$1.appendFile(identityPath, `\n- Avatar: ${sanitizeIdentityLine(avatar)}\n`, "utf-8");
2750
+ await fsPromises.appendFile(identityPath, `\n- Avatar: ${sanitizeIdentityLine(avatar)}\n`, "utf-8");
2685
2751
  }
2686
2752
  respond(true, {
2687
2753
  ok: true,
@@ -2764,7 +2830,7 @@ const agentsHandlers = {
2764
2830
  }, void 0);
2765
2831
  return;
2766
2832
  }
2767
- const content = await fs$1.readFile(filePath, "utf-8");
2833
+ const content = await fsPromises.readFile(filePath, "utf-8");
2768
2834
  respond(true, {
2769
2835
  agentId,
2770
2836
  workspace: workspaceDir,
@@ -2786,10 +2852,10 @@ const agentsHandlers = {
2786
2852
  const resolved = resolveAgentWorkspaceFileOrRespondError(params, respond);
2787
2853
  if (!resolved) return;
2788
2854
  const { agentId, workspaceDir, name } = resolved;
2789
- await fs$1.mkdir(workspaceDir, { recursive: true });
2855
+ await fsPromises.mkdir(workspaceDir, { recursive: true });
2790
2856
  const filePath = path.join(workspaceDir, name);
2791
2857
  const content = String(params.content ?? "");
2792
- await fs$1.writeFile(filePath, content, "utf-8");
2858
+ await fsPromises.writeFile(filePath, content, "utf-8");
2793
2859
  const meta = await statFile(filePath);
2794
2860
  respond(true, {
2795
2861
  ok: true,
@@ -6090,14 +6156,14 @@ function isRollingLogFile(file) {
6090
6156
  return ROLLING_LOG_RE.test(path.basename(file));
6091
6157
  }
6092
6158
  async function resolveLogFile(file) {
6093
- if (await fs$1.stat(file).catch(() => null)) return file;
6159
+ if (await fsPromises.stat(file).catch(() => null)) return file;
6094
6160
  if (!isRollingLogFile(file)) return file;
6095
6161
  const dir = path.dirname(file);
6096
- const entries = await fs$1.readdir(dir, { withFileTypes: true }).catch(() => null);
6162
+ const entries = await fsPromises.readdir(dir, { withFileTypes: true }).catch(() => null);
6097
6163
  if (!entries) return file;
6098
6164
  return (await Promise.all(entries.filter((entry) => entry.isFile() && ROLLING_LOG_RE.test(entry.name)).map(async (entry) => {
6099
6165
  const fullPath = path.join(dir, entry.name);
6100
- const fileStat = await fs$1.stat(fullPath).catch(() => null);
6166
+ const fileStat = await fsPromises.stat(fullPath).catch(() => null);
6101
6167
  return fileStat ? {
6102
6168
  path: fullPath,
6103
6169
  mtimeMs: fileStat.mtimeMs
@@ -6105,7 +6171,7 @@ async function resolveLogFile(file) {
6105
6171
  }))).filter((entry) => Boolean(entry)).toSorted((a, b) => b.mtimeMs - a.mtimeMs)[0]?.path ?? file;
6106
6172
  }
6107
6173
  async function readLogSlice(params) {
6108
- const stat = await fs$1.stat(params.file).catch(() => null);
6174
+ const stat = await fsPromises.stat(params.file).catch(() => null);
6109
6175
  if (!stat) return {
6110
6176
  cursor: 0,
6111
6177
  size: 0,
@@ -6143,7 +6209,7 @@ async function readLogSlice(params) {
6143
6209
  truncated,
6144
6210
  reset
6145
6211
  };
6146
- const handle = await fs$1.open(params.file, "r");
6212
+ const handle = await fsPromises.open(params.file, "r");
6147
6213
  try {
6148
6214
  let prefix = "";
6149
6215
  if (start > 0) {
@@ -6944,7 +7010,7 @@ const nodeHandlers = {
6944
7010
  const p = params;
6945
7011
  const payloadJSON = typeof p.payloadJSON === "string" ? p.payloadJSON : p.payload !== void 0 ? JSON.stringify(p.payload) : null;
6946
7012
  await respondUnavailableOnThrow(respond, async () => {
6947
- const { handleNodeEvent } = await import("./server-node-events-CDB0u8PP.js");
7013
+ const { handleNodeEvent } = await import("./server-node-events-BACmfyjo.js");
6948
7014
  const nodeId = client?.connect?.device?.id ?? client?.connect?.client?.id ?? "node";
6949
7015
  await handleNodeEvent({
6950
7016
  deps: context.deps,
@@ -7463,7 +7529,7 @@ function broadcastPresenceSnapshot(params) {
7463
7529
  let _prevCpu = null;
7464
7530
  function getCpuPercent() {
7465
7531
  try {
7466
- const parts = fs$2.readFileSync("/proc/stat", "utf8").split("\n")[0].trim().split(/\s+/).slice(1).map(Number);
7532
+ const parts = fs$1.readFileSync("/proc/stat", "utf8").split("\n")[0].trim().split(/\s+/).slice(1).map(Number);
7467
7533
  const [user, nice, sys, idle, iowait] = parts;
7468
7534
  const total = parts.reduce((a, b) => a + b, 0);
7469
7535
  const active = total - idle - (iowait || 0);
@@ -7487,7 +7553,7 @@ function getCpuPercent() {
7487
7553
  }
7488
7554
  function getMemInfo() {
7489
7555
  try {
7490
- const text = fs$2.readFileSync("/proc/meminfo", "utf8");
7556
+ const text = fs$1.readFileSync("/proc/meminfo", "utf8");
7491
7557
  const get = (key) => parseInt(text.match(new RegExp(`${key}:\\s+(\\d+)`))?.[1] ?? "0", 10) * 1024;
7492
7558
  const total = get("MemTotal");
7493
7559
  const used = total - get("MemAvailable");
@@ -7506,7 +7572,7 @@ function getMemInfo() {
7506
7572
  }
7507
7573
  function getDiskInfo() {
7508
7574
  try {
7509
- const stats = fs$2.statfsSync("/");
7575
+ const stats = fs$1.statfsSync("/");
7510
7576
  const total = stats.blocks * stats.bsize;
7511
7577
  const used = total - stats.bfree * stats.bsize;
7512
7578
  return {