synurex 2026.2.19-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 (1944) hide show
  1. package/CHANGELOG.md +1594 -0
  2. package/LICENSE +21 -0
  3. package/README-header.png +0 -0
  4. package/README.md +547 -0
  5. package/THIRD_PARTY_LICENSES.txt +27 -0
  6. package/assets/avatar-placeholder.svg +19 -0
  7. package/assets/chrome-extension/README.md +22 -0
  8. package/assets/chrome-extension/background.js +438 -0
  9. package/assets/chrome-extension/icons/icon128.png +0 -0
  10. package/assets/chrome-extension/icons/icon16.png +0 -0
  11. package/assets/chrome-extension/icons/icon32.png +0 -0
  12. package/assets/chrome-extension/icons/icon48.png +0 -0
  13. package/assets/chrome-extension/manifest.json +25 -0
  14. package/assets/chrome-extension/options.html +196 -0
  15. package/assets/chrome-extension/options.js +59 -0
  16. package/assets/dmg-background-small.png +0 -0
  17. package/assets/dmg-background.png +0 -0
  18. package/dist/Synurex-root-CbEdPwLE.js +84 -0
  19. package/dist/Synurex-root-CwTH98Xq.js +84 -0
  20. package/dist/accounts-B6AkTILW.js +250 -0
  21. package/dist/accounts-BqN2SY0Z.js +251 -0
  22. package/dist/acp-cli-C1jHGRAm.js +926 -0
  23. package/dist/acp-cli-C3a9o7M2.js +923 -0
  24. package/dist/agent-9DtpfYJk.js +704 -0
  25. package/dist/agent-N2Qtra36.js +704 -0
  26. package/dist/agent-scope-CRRhJ7Hf.js +370 -0
  27. package/dist/agent-scope-CpSMNwey.js +611 -0
  28. package/dist/agent-scope-DNmzkYn4.js +370 -0
  29. package/dist/archive-Dy3Ezb-5.js +85 -0
  30. package/dist/archive-ccN9aDgq.js +85 -0
  31. package/dist/audit--oGM5x0J.js +1853 -0
  32. package/dist/audit-CM8pyctg.js +1853 -0
  33. package/dist/auth-3NYeRZYb.js +192 -0
  34. package/dist/auth-CVOB8Q9A.js +192 -0
  35. package/dist/auth-health-BSF-YNSl.js +149 -0
  36. package/dist/auth-health-BrChJQW-.js +149 -0
  37. package/dist/auth-profiles-xwZAMwdh.js +2981 -0
  38. package/dist/boolean-BgXe2hyu.js +30 -0
  39. package/dist/brew-CAcErcKz.js +46 -0
  40. package/dist/brew-CcZV0dSS.js +46 -0
  41. package/dist/call-BJsfB_NC.js +280 -0
  42. package/dist/call-mnjMMyVJ.js +280 -0
  43. package/dist/channel-options-BXpm2xHl.js +32 -0
  44. package/dist/channel-options-Bjh17Z08.js +62 -0
  45. package/dist/channel-selection-D2iDbzGy.js +51 -0
  46. package/dist/channel-selection-i-6yBKAk.js +51 -0
  47. package/dist/channel-summary-Cw9cmi4M.js +1216 -0
  48. package/dist/channel-summary-D7joKboS.js +1216 -0
  49. package/dist/channels-cli-8HUWD1_p.js +1415 -0
  50. package/dist/channels-cli-DFia3kGl.js +1413 -0
  51. package/dist/channels-status-issues-CT6Q1t1h.js +18 -0
  52. package/dist/channels-status-issues-CgVNTMMz.js +18 -0
  53. package/dist/chrome-CXlGlG3I.js +1953 -0
  54. package/dist/chrome-D0V3Ybil.js +1973 -0
  55. package/dist/clack-prompter-B9yLhyOm.js +92 -0
  56. package/dist/clack-prompter-C7J7X7j7.js +92 -0
  57. package/dist/cli-1b35n5Cc.js +86 -0
  58. package/dist/cli-BYL7Dz_4.js +89 -0
  59. package/dist/cli-utils-BkRQdAoC.js +43 -0
  60. package/dist/cli-utils-DzrdzskQ.js +43 -0
  61. package/dist/client-atZzP6kK.js +1814 -0
  62. package/dist/command-format-CEnDvS9q.js +56 -0
  63. package/dist/command-format-DUskR3Ej.js +42 -0
  64. package/dist/command-format-rFzrPj6c.js +56 -0
  65. package/dist/command-options-BnW-e302.js +33 -0
  66. package/dist/commands-U_88HsqX.js +230 -0
  67. package/dist/completion-cli-Bh3ds9Rv.js +773 -0
  68. package/dist/completion-cli-BhVl7J3C.js +434 -0
  69. package/dist/config-AFzxllYx.js +4924 -0
  70. package/dist/config-BBxxzNm-.js +4923 -0
  71. package/dist/config-UB10lGn3.js +5664 -0
  72. package/dist/config-guard-BCvAEaxA.js +5484 -0
  73. package/dist/configure-0W-OLHK1.js +895 -0
  74. package/dist/configure-D4ci8KU6.js +896 -0
  75. package/dist/constants-Cf-Zsiqd.js +65 -0
  76. package/dist/constants-CpnpJcmu.js +65 -0
  77. package/dist/control-service-BLzGkUMf.js +61 -0
  78. package/dist/control-service-DpyCNhOa.js +61 -0
  79. package/dist/cron-cli-2W0wnKNI.js +457 -0
  80. package/dist/cron-cli-BGc0ZmXl.js +454 -0
  81. package/dist/daemon-cli-C4IIRXZr.js +758 -0
  82. package/dist/daemon-cli-RFrEzOyc.js +757 -0
  83. package/dist/daemon-runtime-BlKOqOPH.js +517 -0
  84. package/dist/daemon-runtime-CRdmLdkD.js +517 -0
  85. package/dist/deliver-B0C5m0kU.js +2587 -0
  86. package/dist/deliver-BUV-sfaF.js +2557 -0
  87. package/dist/deliver-CQQ0e2eM.js +2587 -0
  88. package/dist/deps-D1eiWUgD.js +27 -0
  89. package/dist/deps-DgFrcXzw.js +27 -0
  90. package/dist/devices-cli-CUYqlUBU.js +207 -0
  91. package/dist/devices-cli-De1Q_0ob.js +204 -0
  92. package/dist/directory-cli-DYkFHmO6.js +244 -0
  93. package/dist/directory-cli-DoquUzqm.js +247 -0
  94. package/dist/dispatcher-BLeixzBZ.js +160 -0
  95. package/dist/dns-cli-C5dXU6Nk.js +198 -0
  96. package/dist/dns-cli-rkR0HJpi.js +201 -0
  97. package/dist/docs-cli-CqtgkhfC.js +161 -0
  98. package/dist/docs-cli-DrFTuzUe.js +159 -0
  99. package/dist/doctor-Cakg6jea.js +2577 -0
  100. package/dist/doctor-Cuk5zryG.js +2579 -0
  101. package/dist/entry.js +1336 -0
  102. package/dist/env-DgIs6BZg.js +32 -0
  103. package/dist/errors-C8t2PjW_.js +1952 -0
  104. package/dist/exec-B8JKbXKW.js +246 -0
  105. package/dist/exec-Dloa-d0d.js +246 -0
  106. package/dist/exec-EqLC5sqa.js +1103 -0
  107. package/dist/exec-approvals-B-sykLIC.js +1043 -0
  108. package/dist/exec-approvals-Ff_p0CYa.js +1043 -0
  109. package/dist/exec-approvals-cli-CfSTGR7F.js +388 -0
  110. package/dist/exec-approvals-cli-DBgnm_6P.js +385 -0
  111. package/dist/extensionAPI.js +68185 -0
  112. package/dist/format-8citvr_1.js +34 -0
  113. package/dist/format-tlvh4-cQ.js +34 -0
  114. package/dist/gateway-cli-BKJbSNiq.js +17878 -0
  115. package/dist/gateway-cli-DMbgzP3o.js +17877 -0
  116. package/dist/gateway-rpc-CFkdcw9l.js +28 -0
  117. package/dist/gateway-rpc-CJljb7MY.js +28 -0
  118. package/dist/github-copilot-auth-BGWtD7lK.js +1256 -0
  119. package/dist/github-copilot-auth-Bog6I9WM.js +1256 -0
  120. package/dist/github-copilot-token-BOoCTERW.js +103 -0
  121. package/dist/github-copilot-token-SLWintYd.js +103 -0
  122. package/dist/github-copilot-token-_jdpoYjM.js +103 -0
  123. package/dist/gmail-setup-utils-C97cHaGd.js +428 -0
  124. package/dist/gmail-setup-utils-n354D0jO.js +428 -0
  125. package/dist/health-format-CLSugjQl.js +1383 -0
  126. package/dist/health-format-KsXnqZiA.js +1382 -0
  127. package/dist/help-format-DuMTLWZ-.js +17 -0
  128. package/dist/help-format-GYRujDx9.js +17 -0
  129. package/dist/helpers-BiyEksaK.js +25 -0
  130. package/dist/helpers-DMlRCrD6.js +10 -0
  131. package/dist/helpers-azbX_hrI.js +25 -0
  132. package/dist/helpers-yjIEMzi8.js +10 -0
  133. package/dist/hooks-cli-DXs2Jiyd.js +1061 -0
  134. package/dist/hooks-cli-Dsah_Ryz.js +1058 -0
  135. package/dist/hooks-status-CpkHFMVY.js +443 -0
  136. package/dist/hooks-status-DQRtaH38.js +443 -0
  137. package/dist/image-C6SHcuJM.js +1421 -0
  138. package/dist/image-Cyv4Hr2t.js +629 -0
  139. package/dist/image-DXuHvpqC.js +629 -0
  140. package/dist/index.js +5667 -0
  141. package/dist/installs-BvY-yqDY.js +425 -0
  142. package/dist/installs-Snp4gUlG.js +425 -0
  143. package/dist/is-main-B6kCyqsv.js +25 -0
  144. package/dist/is-main-PYGa3tDA.js +25 -0
  145. package/dist/links-B79LZSNJ.js +15 -0
  146. package/dist/links-iCD68SwJ.js +15 -0
  147. package/dist/loader-ysGIXyYq.js +64701 -0
  148. package/dist/logging-BWRYHvLp.js +1 -0
  149. package/dist/logging-CzN9OPmT.js +15 -0
  150. package/dist/logging-awp_aUN6.js +15 -0
  151. package/dist/logging-pqyrk15z.js +1 -0
  152. package/dist/login-qr-BEXsF0Oj.js +475 -0
  153. package/dist/login-qr-D823w1Qv.js +478 -0
  154. package/dist/login-qr-wnUfVUoC.js +478 -0
  155. package/dist/logs-cli-D912P9Qo.js +230 -0
  156. package/dist/logs-cli-DHYl4Nfl.js +227 -0
  157. package/dist/manager-DORkoiXy.js +3216 -0
  158. package/dist/manager-MLoKmXjg.js +3218 -0
  159. package/dist/manager-e20ne1Ai.js +3216 -0
  160. package/dist/manifest-registry-D8FEq9qs.js +668 -0
  161. package/dist/manifest-registry-DjRSe72U.js +668 -0
  162. package/dist/message-channel-DJEeCAZD.js +110 -0
  163. package/dist/message-channel-DcxF0eJh.js +110 -0
  164. package/dist/model-selection-CjYymzT8.js +2983 -0
  165. package/dist/model-selection-Cz_VcpX5.js +2734 -0
  166. package/dist/models-cli-CURq5BOw.js +2542 -0
  167. package/dist/models-cli-_y06d7uQ.js +2545 -0
  168. package/dist/net-MZzhgr1g.js +1814 -0
  169. package/dist/node-cli-BkEdPem3.js +1456 -0
  170. package/dist/node-cli-PesFC8YY.js +1459 -0
  171. package/dist/node-service-CmyQuldc.js +67 -0
  172. package/dist/node-service-DB0Rp9Fr.js +67 -0
  173. package/dist/nodes-cli-BV7z71Ke.js +1207 -0
  174. package/dist/nodes-cli-D-pPXmLu.js +1210 -0
  175. package/dist/nodes-screen-B240wNB8.js +157 -0
  176. package/dist/nodes-screen-CGLXLco9.js +157 -0
  177. package/dist/note-_C44YfAQ.js +73 -0
  178. package/dist/note-rStT8AJi.js +73 -0
  179. package/dist/onboard-channels-CSGrNeHm.js +671 -0
  180. package/dist/onboard-channels-CyYMvXjh.js +671 -0
  181. package/dist/onboard-skills-BzZrWnt3.js +3452 -0
  182. package/dist/onboard-skills-Z3OoXEqp.js +3452 -0
  183. package/dist/onboarding--5CEtfSX.js +3269 -0
  184. package/dist/pairing-cli-BrPmwezL.js +114 -0
  185. package/dist/pairing-cli-CN183i69.js +117 -0
  186. package/dist/pairing-labels-CrJtLbMY.js +9 -0
  187. package/dist/pairing-labels-DXioxZ5X.js +9 -0
  188. package/dist/pairing-store-D_NP0mJs.js +391 -0
  189. package/dist/pairing-store-pdzxfI5n.js +391 -0
  190. package/dist/parse-BZz5lHzQ.js +23 -0
  191. package/dist/parse-DqAvJRIf.js +23 -0
  192. package/dist/parse-log-line-BnB7770k.js +44 -0
  193. package/dist/parse-log-line-DSvJi17i.js +44 -0
  194. package/dist/parse-timeout-DV8NQQWk.js +16 -0
  195. package/dist/parse-timeout-Du-wHHNi.js +16 -0
  196. package/dist/path-env-Bc8ZqjfY.js +77 -0
  197. package/dist/path-env-DwZUJC_M.js +77 -0
  198. package/dist/paths-8P2BYpvK.js +156 -0
  199. package/dist/paths-Cn5vXlEi.js +43 -0
  200. package/dist/paths-D4TjaAs9.js +40 -0
  201. package/dist/paths-Drx5WZ13.js +172 -0
  202. package/dist/paths-mzsdSoO2.js +43 -0
  203. package/dist/pi-embedded-helpers-Dpu3lm3V.js +1303 -0
  204. package/dist/pi-embedded-helpers-N_L31uhW.js +1303 -0
  205. package/dist/pi-embedded-helpers-dkrwwXev.js +8481 -0
  206. package/dist/pi-model-discovery-CV2V1HHz.js +20 -0
  207. package/dist/pi-model-discovery-DzEIEgHL.js +20 -0
  208. package/dist/pi-model-discovery-EhM2JAQo.js +20 -0
  209. package/dist/pi-tools.policy-m0G0As1p.js +230 -0
  210. package/dist/plugin-auto-enable-Bu3hK0U6.js +460 -0
  211. package/dist/plugin-auto-enable-Ca3Ou67i.js +460 -0
  212. package/dist/plugin-sdk/index.js +24446 -0
  213. package/dist/plugin-sdk/pi-model-discovery-Dw3A6oXH.js +37 -0
  214. package/dist/plugins-Bng3p5bC.js +496 -0
  215. package/dist/plugins-C1mc_xWv.js +495 -0
  216. package/dist/plugins-cli-B8FonfqG.js +441 -0
  217. package/dist/plugins-cli-B9q0wqUI.js +444 -0
  218. package/dist/ports-DKGBzWgI.js +96 -0
  219. package/dist/program-_5hB5I-4.js +191 -0
  220. package/dist/progress-Bcjniu7m.js +133 -0
  221. package/dist/progress-DWODVbwW.js +133 -0
  222. package/dist/prompt-style-CFsleyxV.js +9 -0
  223. package/dist/prompt-style-DZli5767.js +9 -0
  224. package/dist/prompts-CudpZgTI.js +10 -0
  225. package/dist/prompts-FbZThK8w.js +10 -0
  226. package/dist/pw-ai-BUeSOvm-.js +1649 -0
  227. package/dist/pw-ai-GjX4Az_L.js +1649 -0
  228. package/dist/pw-ai-bugVLPkL.js +1651 -0
  229. package/dist/qmd-manager-C1JB3Owf.js +677 -0
  230. package/dist/qmd-manager-TkF_5Pm-.js +676 -0
  231. package/dist/qmd-manager-t9qHekRb.js +674 -0
  232. package/dist/redact-BIMJ3ntQ.js +94 -0
  233. package/dist/redact-Bt-krp_b.js +97 -0
  234. package/dist/redact-DJCFY628.js +97 -0
  235. package/dist/register.subclis-CZG20DZj.js +348 -0
  236. package/dist/reply-8T1JOF0R.js +64704 -0
  237. package/dist/rolldown-runtime-Cbj13DAv.js +20 -0
  238. package/dist/routes-BxFcXB4m.js +2411 -0
  239. package/dist/routes-Dw3vw8Re.js +2411 -0
  240. package/dist/rpc-DgcF4XNR.js +95 -0
  241. package/dist/rpc-f-LmE9z_.js +95 -0
  242. package/dist/run-main-_bbXf2vQ.js +194 -0
  243. package/dist/sandbox-BcOPJhQv.js +2945 -0
  244. package/dist/sandbox-DfBaWfDh.js +2944 -0
  245. package/dist/sandbox-cli-BRcke02J.js +460 -0
  246. package/dist/sandbox-cli-CbUgIVf2.js +463 -0
  247. package/dist/security-cli-76hHzPsz.js +505 -0
  248. package/dist/security-cli-CQ6iSAev.js +508 -0
  249. package/dist/server-context-BuV65eg5.js +740 -0
  250. package/dist/server-context-CFielb4y.js +740 -0
  251. package/dist/server-node-events-CkLBKtGs.js +216 -0
  252. package/dist/server-node-events-D_3bg9qE.js +219 -0
  253. package/dist/service-CZFM7dlu.js +680 -0
  254. package/dist/service-audit-DBdadurs.js +537 -0
  255. package/dist/service-audit-DptlZVXP.js +537 -0
  256. package/dist/service-sZqtAG53.js +680 -0
  257. package/dist/session-cost-usage-CPvtWzot.js +692 -0
  258. package/dist/session-cost-usage-lYVH5MAy.js +692 -0
  259. package/dist/session-key-DrNCyvP1.js +182 -0
  260. package/dist/session-key-n2HVbrj0.js +182 -0
  261. package/dist/shared-Bl4lcfSF.js +74 -0
  262. package/dist/shared-C79dnas0.js +74 -0
  263. package/dist/shared-CDe5yKDd.js +152 -0
  264. package/dist/shared-Cpd7X2eE.js +152 -0
  265. package/dist/skill-scanner-BoGjHXUZ.js +255 -0
  266. package/dist/skill-scanner-COatt01v.js +255 -0
  267. package/dist/skills-CrYcs9jK.js +694 -0
  268. package/dist/skills-DxzXqcWw.js +693 -0
  269. package/dist/skills-cli-BWqUiFIC.js +287 -0
  270. package/dist/skills-cli-C2rWGqKQ.js +290 -0
  271. package/dist/skills-status-Bhe2beiQ.js +187 -0
  272. package/dist/skills-status-DQyBTrvU.js +187 -0
  273. package/dist/sqlite-BjBQdG8T.js +239 -0
  274. package/dist/sqlite-BjhYBODp.js +221 -0
  275. package/dist/sqlite-CbZh0dx1.js +239 -0
  276. package/dist/status-BF8IVV7c.js +21 -0
  277. package/dist/status-BHPh7bCk.js +27 -0
  278. package/dist/status-CWDof7Cn.js +21 -0
  279. package/dist/status-DyjCSdtm.js +27 -0
  280. package/dist/status-RJGk9wHW.js +3177 -0
  281. package/dist/subsystem-DPYBJG7C.js +838 -0
  282. package/dist/system-cli-BY3oOcLX.js +83 -0
  283. package/dist/system-cli-pg7MxYKd.js +80 -0
  284. package/dist/systemd-DerMq_3Y.js +438 -0
  285. package/dist/systemd-Gt0riLnX.js +438 -0
  286. package/dist/systemd-hints-C6JS-A6Y.js +19 -0
  287. package/dist/systemd-hints-Db4JjAxJ.js +19 -0
  288. package/dist/systemd-linger-CRL7Xf4C.js +75 -0
  289. package/dist/systemd-linger-DS0IcHsk.js +75 -0
  290. package/dist/table-BzJyfJCd.js +279 -0
  291. package/dist/table-DCcFNw6e.js +279 -0
  292. package/dist/tailnet-Byp3obcc.js +42 -0
  293. package/dist/tailnet-DLDGNuH2.js +42 -0
  294. package/dist/tailscale-9MusRvOi.js +225 -0
  295. package/dist/tailscale-CGhNcgVS.js +252 -0
  296. package/dist/tool-display-C9u4CdQu.js +795 -0
  297. package/dist/tool-display-D_HGmnfa.js +795 -0
  298. package/dist/transcript-events-Bv_eRVym.js +17 -0
  299. package/dist/transcript-events-ChU6IQwp.js +17 -0
  300. package/dist/transcript-events-JLH5W4He.js +17 -0
  301. package/dist/tui-BPqDn4Jf.js +3090 -0
  302. package/dist/tui-BniTBjBP.js +3089 -0
  303. package/dist/tui-cli-AeeP52_J.js +58 -0
  304. package/dist/tui-cli-DrWl0dkQ.js +55 -0
  305. package/dist/update-BKGU5x_o.js +317 -0
  306. package/dist/update-CZqqbW73.js +317 -0
  307. package/dist/update-cli-DTXxX27F.js +1036 -0
  308. package/dist/update-cli-j0POazuO.js +1034 -0
  309. package/dist/update-runner-BY-i_k4L.js +1458 -0
  310. package/dist/update-runner-CmdPxJg5.js +1458 -0
  311. package/dist/usage-format-BcU1flOY.js +36 -0
  312. package/dist/usage-format-DvowRSs-.js +36 -0
  313. package/dist/utils-C7NsUvD1.js +192 -0
  314. package/dist/utils-DBu98aoz.js +188 -0
  315. package/dist/webhooks-cli-BBw-pRTs.js +309 -0
  316. package/dist/webhooks-cli-BXxSGFuL.js +312 -0
  317. package/dist/widearea-dns-C2mRm6hu.js +127 -0
  318. package/dist/widearea-dns-DbdWF6kP.js +127 -0
  319. package/dist/ws-CEcdsnN9.js +13 -0
  320. package/dist/ws-D091yo4M.js +13 -0
  321. package/dist/ws-log-Bpm8rpoP.js +267 -0
  322. package/dist/ws-log-vBkmxf4_.js +267 -0
  323. package/dist/wsl-QYB9yGZN.js +160 -0
  324. package/docs/.i18n/README.md +31 -0
  325. package/docs/.i18n/glossary.zh-CN.json +210 -0
  326. package/docs/.i18n/zh-CN.tm.jsonl +1329 -0
  327. package/docs/CNAME +1 -0
  328. package/docs/assets/macos-onboarding/01-macos-warning.jpeg +0 -0
  329. package/docs/assets/macos-onboarding/02-local-networks.jpeg +0 -0
  330. package/docs/assets/macos-onboarding/03-security-notice.png +0 -0
  331. package/docs/assets/macos-onboarding/04-choose-gateway.png +0 -0
  332. package/docs/assets/macos-onboarding/05-permissions.png +0 -0
  333. package/docs/assets/openclaw-logo-text-dark.png +0 -0
  334. package/docs/assets/openclaw-logo-text.png +0 -0
  335. package/docs/assets/pixel-lobster.svg +60 -0
  336. package/docs/assets/showcase/agents-ui.jpg +0 -0
  337. package/docs/assets/showcase/bambu-cli.png +0 -0
  338. package/docs/assets/showcase/codexmonitor.png +0 -0
  339. package/docs/assets/showcase/gohome-grafana.png +0 -0
  340. package/docs/assets/showcase/ios-testflight.jpg +0 -0
  341. package/docs/assets/showcase/oura-health.png +0 -0
  342. package/docs/assets/showcase/padel-cli.svg +11 -0
  343. package/docs/assets/showcase/padel-screenshot.jpg +0 -0
  344. package/docs/assets/showcase/papla-tts.jpg +0 -0
  345. package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
  346. package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
  347. package/docs/assets/showcase/roborock-status.svg +13 -0
  348. package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
  349. package/docs/assets/showcase/snag.png +0 -0
  350. package/docs/assets/showcase/tesco-shop.jpg +0 -0
  351. package/docs/assets/showcase/wienerlinien.png +0 -0
  352. package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
  353. package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
  354. package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
  355. package/docs/automation/auth-monitoring.md +44 -0
  356. package/docs/automation/cron-jobs.md +471 -0
  357. package/docs/automation/cron-vs-heartbeat.md +282 -0
  358. package/docs/automation/gmail-pubsub.md +256 -0
  359. package/docs/automation/hooks.md +916 -0
  360. package/docs/automation/poll.md +69 -0
  361. package/docs/automation/troubleshooting.md +122 -0
  362. package/docs/automation/webhook.md +163 -0
  363. package/docs/brave-search.md +41 -0
  364. package/docs/channels/bluebubbles.md +340 -0
  365. package/docs/channels/broadcast-groups.md +442 -0
  366. package/docs/channels/channel-routing.md +114 -0
  367. package/docs/channels/discord.md +476 -0
  368. package/docs/channels/feishu.md +579 -0
  369. package/docs/channels/googlechat.md +252 -0
  370. package/docs/channels/grammy.md +31 -0
  371. package/docs/channels/group-messages.md +84 -0
  372. package/docs/channels/groups.md +374 -0
  373. package/docs/channels/imessage.md +321 -0
  374. package/docs/channels/index.md +46 -0
  375. package/docs/channels/line.md +186 -0
  376. package/docs/channels/location.md +56 -0
  377. package/docs/channels/matrix.md +259 -0
  378. package/docs/channels/mattermost.md +138 -0
  379. package/docs/channels/msteams.md +769 -0
  380. package/docs/channels/nextcloud-talk.md +138 -0
  381. package/docs/channels/nostr.md +233 -0
  382. package/docs/channels/pairing.md +86 -0
  383. package/docs/channels/signal.md +228 -0
  384. package/docs/channels/slack.md +574 -0
  385. package/docs/channels/telegram.md +770 -0
  386. package/docs/channels/tlon.md +132 -0
  387. package/docs/channels/troubleshooting.md +116 -0
  388. package/docs/channels/twitch.md +379 -0
  389. package/docs/channels/whatsapp.md +406 -0
  390. package/docs/channels/zalo.md +189 -0
  391. package/docs/channels/zalouser.md +140 -0
  392. package/docs/cli/acp.md +170 -0
  393. package/docs/cli/agent.md +24 -0
  394. package/docs/cli/agents.md +75 -0
  395. package/docs/cli/approvals.md +50 -0
  396. package/docs/cli/browser.md +107 -0
  397. package/docs/cli/channels.md +79 -0
  398. package/docs/cli/config.md +50 -0
  399. package/docs/cli/configure.md +33 -0
  400. package/docs/cli/cron.md +42 -0
  401. package/docs/cli/dashboard.md +16 -0
  402. package/docs/cli/devices.md +70 -0
  403. package/docs/cli/directory.md +63 -0
  404. package/docs/cli/dns.md +23 -0
  405. package/docs/cli/docs.md +15 -0
  406. package/docs/cli/doctor.md +41 -0
  407. package/docs/cli/gateway.md +202 -0
  408. package/docs/cli/health.md +21 -0
  409. package/docs/cli/hooks.md +304 -0
  410. package/docs/cli/index.md +1031 -0
  411. package/docs/cli/logs.md +24 -0
  412. package/docs/cli/memory.md +45 -0
  413. package/docs/cli/message.md +239 -0
  414. package/docs/cli/models.md +79 -0
  415. package/docs/cli/node.md +112 -0
  416. package/docs/cli/nodes.md +73 -0
  417. package/docs/cli/onboard.md +43 -0
  418. package/docs/cli/pairing.md +21 -0
  419. package/docs/cli/plugins.md +62 -0
  420. package/docs/cli/reset.md +17 -0
  421. package/docs/cli/sandbox.md +152 -0
  422. package/docs/cli/security.md +26 -0
  423. package/docs/cli/sessions.md +16 -0
  424. package/docs/cli/setup.md +29 -0
  425. package/docs/cli/skills.md +26 -0
  426. package/docs/cli/status.md +26 -0
  427. package/docs/cli/system.md +60 -0
  428. package/docs/cli/tui.md +23 -0
  429. package/docs/cli/uninstall.md +17 -0
  430. package/docs/cli/update.md +98 -0
  431. package/docs/cli/voicecall.md +34 -0
  432. package/docs/cli/webhooks.md +25 -0
  433. package/docs/concepts/agent-loop.md +146 -0
  434. package/docs/concepts/agent-workspace.md +233 -0
  435. package/docs/concepts/agent.md +123 -0
  436. package/docs/concepts/architecture.md +131 -0
  437. package/docs/concepts/compaction.md +61 -0
  438. package/docs/concepts/context.md +161 -0
  439. package/docs/concepts/features.md +53 -0
  440. package/docs/concepts/markdown-formatting.md +130 -0
  441. package/docs/concepts/memory.md +556 -0
  442. package/docs/concepts/messages.md +154 -0
  443. package/docs/concepts/model-failover.md +149 -0
  444. package/docs/concepts/model-providers.md +316 -0
  445. package/docs/concepts/models.md +208 -0
  446. package/docs/concepts/multi-agent.md +376 -0
  447. package/docs/concepts/oauth.md +145 -0
  448. package/docs/concepts/presence.md +102 -0
  449. package/docs/concepts/queue.md +89 -0
  450. package/docs/concepts/retry.md +69 -0
  451. package/docs/concepts/session-pruning.md +122 -0
  452. package/docs/concepts/session-tool.md +193 -0
  453. package/docs/concepts/session.md +204 -0
  454. package/docs/concepts/sessions.md +10 -0
  455. package/docs/concepts/streaming.md +135 -0
  456. package/docs/concepts/system-prompt.md +115 -0
  457. package/docs/concepts/timezone.md +91 -0
  458. package/docs/concepts/typebox.md +289 -0
  459. package/docs/concepts/typing-indicators.md +68 -0
  460. package/docs/concepts/usage-tracking.md +35 -0
  461. package/docs/date-time.md +128 -0
  462. package/docs/debug/node-issue.md +85 -0
  463. package/docs/diagnostics/flags.md +91 -0
  464. package/docs/docs.json +1802 -0
  465. package/docs/experiments/onboarding-config-protocol.md +40 -0
  466. package/docs/experiments/plans/cron-add-hardening.md +63 -0
  467. package/docs/experiments/plans/group-policy-hardening.md +40 -0
  468. package/docs/experiments/plans/openresponses-gateway.md +123 -0
  469. package/docs/experiments/proposals/model-config.md +36 -0
  470. package/docs/experiments/research/memory.md +228 -0
  471. package/docs/gateway/authentication.md +145 -0
  472. package/docs/gateway/background-process.md +93 -0
  473. package/docs/gateway/bonjour.md +170 -0
  474. package/docs/gateway/bridge-protocol.md +89 -0
  475. package/docs/gateway/cli-backends.md +225 -0
  476. package/docs/gateway/configuration-examples.md +606 -0
  477. package/docs/gateway/configuration.md +3416 -0
  478. package/docs/gateway/discovery.md +116 -0
  479. package/docs/gateway/doctor.md +282 -0
  480. package/docs/gateway/gateway-lock.md +34 -0
  481. package/docs/gateway/health.md +35 -0
  482. package/docs/gateway/heartbeat.md +364 -0
  483. package/docs/gateway/index.md +330 -0
  484. package/docs/gateway/local-models.md +150 -0
  485. package/docs/gateway/logging.md +113 -0
  486. package/docs/gateway/multiple-gateways.md +112 -0
  487. package/docs/gateway/network-model.md +17 -0
  488. package/docs/gateway/openai-http-api.md +118 -0
  489. package/docs/gateway/openresponses-http-api.md +317 -0
  490. package/docs/gateway/pairing.md +99 -0
  491. package/docs/gateway/protocol.md +221 -0
  492. package/docs/gateway/remote-gateway-readme.md +157 -0
  493. package/docs/gateway/remote.md +129 -0
  494. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +128 -0
  495. package/docs/gateway/sandboxing.md +193 -0
  496. package/docs/gateway/security/index.md +829 -0
  497. package/docs/gateway/tailscale.md +127 -0
  498. package/docs/gateway/tools-invoke-http-api.md +85 -0
  499. package/docs/gateway/troubleshooting.md +318 -0
  500. package/docs/help/debugging.md +162 -0
  501. package/docs/help/environment.md +81 -0
  502. package/docs/help/faq.md +2848 -0
  503. package/docs/help/index.md +21 -0
  504. package/docs/help/scripts.md +28 -0
  505. package/docs/help/submitting-a-pr.md +398 -0
  506. package/docs/help/submitting-an-issue.md +152 -0
  507. package/docs/help/testing.md +368 -0
  508. package/docs/help/troubleshooting.md +265 -0
  509. package/docs/hooks/soul-evil.md +69 -0
  510. package/docs/images/feishu-step2-create-app.png +0 -0
  511. package/docs/images/feishu-step3-credentials.png +0 -0
  512. package/docs/images/feishu-step4-permissions.png +0 -0
  513. package/docs/images/feishu-step5-bot-capability.png +0 -0
  514. package/docs/images/feishu-step6-event-subscription.png +0 -0
  515. package/docs/images/groups-flow.svg +52 -0
  516. package/docs/images/mobile-ui-screenshot.png +0 -0
  517. package/docs/index.md +192 -0
  518. package/docs/install/ansible.md +208 -0
  519. package/docs/install/bun.md +59 -0
  520. package/docs/install/development-channels.md +75 -0
  521. package/docs/install/docker.md +567 -0
  522. package/docs/install/exe-dev.md +126 -0
  523. package/docs/install/fly.md +486 -0
  524. package/docs/install/gcp.md +504 -0
  525. package/docs/install/hetzner.md +330 -0
  526. package/docs/install/index.md +203 -0
  527. package/docs/install/installer.md +385 -0
  528. package/docs/install/macos-vm.md +281 -0
  529. package/docs/install/migrating.md +192 -0
  530. package/docs/install/nix.md +96 -0
  531. package/docs/install/node.md +138 -0
  532. package/docs/install/northflank.mdx +53 -0
  533. package/docs/install/railway.mdx +99 -0
  534. package/docs/install/render.mdx +159 -0
  535. package/docs/install/uninstall.md +128 -0
  536. package/docs/install/updating.md +231 -0
  537. package/docs/logging.md +350 -0
  538. package/docs/network.md +54 -0
  539. package/docs/nodes/audio.md +114 -0
  540. package/docs/nodes/camera.md +156 -0
  541. package/docs/nodes/images.md +72 -0
  542. package/docs/nodes/index.md +342 -0
  543. package/docs/nodes/location-command.md +113 -0
  544. package/docs/nodes/media-understanding.md +379 -0
  545. package/docs/nodes/talk.md +90 -0
  546. package/docs/nodes/troubleshooting.md +112 -0
  547. package/docs/nodes/voicewake.md +65 -0
  548. package/docs/perplexity.md +80 -0
  549. package/docs/pi-dev.md +70 -0
  550. package/docs/pi.md +612 -0
  551. package/docs/platforms/android.md +151 -0
  552. package/docs/platforms/digitalocean.md +262 -0
  553. package/docs/platforms/index.md +53 -0
  554. package/docs/platforms/ios.md +107 -0
  555. package/docs/platforms/linux.md +94 -0
  556. package/docs/platforms/mac/bundled-gateway.md +73 -0
  557. package/docs/platforms/mac/canvas.md +125 -0
  558. package/docs/platforms/mac/child-process.md +69 -0
  559. package/docs/platforms/mac/dev-setup.md +104 -0
  560. package/docs/platforms/mac/health.md +34 -0
  561. package/docs/platforms/mac/icon.md +31 -0
  562. package/docs/platforms/mac/logging.md +57 -0
  563. package/docs/platforms/mac/menu-bar.md +81 -0
  564. package/docs/platforms/mac/peekaboo.md +65 -0
  565. package/docs/platforms/mac/permissions.md +50 -0
  566. package/docs/platforms/mac/release.md +85 -0
  567. package/docs/platforms/mac/remote.md +83 -0
  568. package/docs/platforms/mac/signing.md +47 -0
  569. package/docs/platforms/mac/skills.md +33 -0
  570. package/docs/platforms/mac/voice-overlay.md +60 -0
  571. package/docs/platforms/mac/voicewake.md +67 -0
  572. package/docs/platforms/mac/webchat.md +43 -0
  573. package/docs/platforms/mac/xpc.md +61 -0
  574. package/docs/platforms/macos.md +203 -0
  575. package/docs/platforms/oracle.md +303 -0
  576. package/docs/platforms/raspberry-pi.md +358 -0
  577. package/docs/platforms/windows.md +159 -0
  578. package/docs/plugins/agent-tools.md +99 -0
  579. package/docs/plugins/manifest.md +71 -0
  580. package/docs/plugins/voice-call.md +284 -0
  581. package/docs/plugins/zalouser.md +81 -0
  582. package/docs/prose.md +134 -0
  583. package/docs/providers/anthropic.md +152 -0
  584. package/docs/providers/bedrock.md +176 -0
  585. package/docs/providers/claude-max-api-proxy.md +148 -0
  586. package/docs/providers/cloudflare-ai-gateway.md +71 -0
  587. package/docs/providers/deepgram.md +93 -0
  588. package/docs/providers/github-copilot.md +72 -0
  589. package/docs/providers/glm.md +33 -0
  590. package/docs/providers/index.md +64 -0
  591. package/docs/providers/minimax.md +208 -0
  592. package/docs/providers/models.md +52 -0
  593. package/docs/providers/moonshot.md +142 -0
  594. package/docs/providers/ollama.md +277 -0
  595. package/docs/providers/openai.md +62 -0
  596. package/docs/providers/opencode.md +36 -0
  597. package/docs/providers/openrouter.md +37 -0
  598. package/docs/providers/qianfan.md +38 -0
  599. package/docs/providers/qwen.md +53 -0
  600. package/docs/providers/synthetic.md +99 -0
  601. package/docs/providers/venice.md +267 -0
  602. package/docs/providers/vercel-ai-gateway.md +50 -0
  603. package/docs/providers/xiaomi.md +64 -0
  604. package/docs/providers/zai.md +36 -0
  605. package/docs/refactor/clawnet.md +417 -0
  606. package/docs/refactor/exec-host.md +316 -0
  607. package/docs/refactor/outbound-session-mirroring.md +85 -0
  608. package/docs/refactor/plugin-sdk.md +214 -0
  609. package/docs/refactor/strict-config.md +93 -0
  610. package/docs/reference/AGENTS.default.md +123 -0
  611. package/docs/reference/RELEASING.md +120 -0
  612. package/docs/reference/api-usage-costs.md +138 -0
  613. package/docs/reference/credits.md +27 -0
  614. package/docs/reference/device-models.md +47 -0
  615. package/docs/reference/rpc.md +43 -0
  616. package/docs/reference/session-management-compaction.md +285 -0
  617. package/docs/reference/templates/AGENTS.dev.md +83 -0
  618. package/docs/reference/templates/AGENTS.md +218 -0
  619. package/docs/reference/templates/BOOT.md +10 -0
  620. package/docs/reference/templates/BOOTSTRAP.md +61 -0
  621. package/docs/reference/templates/HEARTBEAT.md +11 -0
  622. package/docs/reference/templates/IDENTITY.dev.md +47 -0
  623. package/docs/reference/templates/IDENTITY.md +29 -0
  624. package/docs/reference/templates/SOUL.dev.md +76 -0
  625. package/docs/reference/templates/SOUL.md +42 -0
  626. package/docs/reference/templates/TOOLS.dev.md +24 -0
  627. package/docs/reference/templates/TOOLS.md +46 -0
  628. package/docs/reference/templates/USER.dev.md +18 -0
  629. package/docs/reference/templates/USER.md +23 -0
  630. package/docs/reference/test.md +50 -0
  631. package/docs/reference/token-use.md +112 -0
  632. package/docs/reference/transcript-hygiene.md +129 -0
  633. package/docs/reference/wizard.md +269 -0
  634. package/docs/security/formal-verification.md +164 -0
  635. package/docs/start/bootstrapping.md +41 -0
  636. package/docs/start/docs-directory.md +64 -0
  637. package/docs/start/getting-started.md +120 -0
  638. package/docs/start/hubs.md +197 -0
  639. package/docs/start/lore.md +219 -0
  640. package/docs/start/onboarding.md +80 -0
  641. package/docs/start/openclaw.md +224 -0
  642. package/docs/start/quickstart.md +22 -0
  643. package/docs/start/setup.md +162 -0
  644. package/docs/start/showcase.md +416 -0
  645. package/docs/start/wizard-cli-automation.md +141 -0
  646. package/docs/start/wizard-cli-reference.md +247 -0
  647. package/docs/start/wizard.md +108 -0
  648. package/docs/style.css +3 -0
  649. package/docs/tools/agent-send.md +53 -0
  650. package/docs/tools/apply-patch.md +50 -0
  651. package/docs/tools/browser-linux-troubleshooting.md +139 -0
  652. package/docs/tools/browser-login.md +67 -0
  653. package/docs/tools/browser.md +576 -0
  654. package/docs/tools/chrome-extension.md +178 -0
  655. package/docs/tools/clawhub.md +257 -0
  656. package/docs/tools/creating-skills.md +54 -0
  657. package/docs/tools/elevated.md +57 -0
  658. package/docs/tools/exec-approvals.md +246 -0
  659. package/docs/tools/exec.md +179 -0
  660. package/docs/tools/firecrawl.md +61 -0
  661. package/docs/tools/index.md +512 -0
  662. package/docs/tools/llm-task.md +115 -0
  663. package/docs/tools/lobster.md +342 -0
  664. package/docs/tools/multi-agent-sandbox-tools.md +396 -0
  665. package/docs/tools/plugin.md +664 -0
  666. package/docs/tools/reactions.md +22 -0
  667. package/docs/tools/skills-config.md +76 -0
  668. package/docs/tools/skills.md +300 -0
  669. package/docs/tools/slash-commands.md +198 -0
  670. package/docs/tools/subagents.md +151 -0
  671. package/docs/tools/thinking.md +74 -0
  672. package/docs/tools/web.md +261 -0
  673. package/docs/tts.md +396 -0
  674. package/docs/vps.md +43 -0
  675. package/docs/web/control-ui.md +223 -0
  676. package/docs/web/dashboard.md +46 -0
  677. package/docs/web/index.md +116 -0
  678. package/docs/web/tui.md +162 -0
  679. package/docs/web/webchat.md +49 -0
  680. package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
  681. package/docs/whatsapp-openclaw.jpg +0 -0
  682. package/docs/zh-CN/AGENTS.md +59 -0
  683. package/docs/zh-CN/automation/auth-monitoring.md +47 -0
  684. package/docs/zh-CN/automation/cron-jobs.md +424 -0
  685. package/docs/zh-CN/automation/cron-vs-heartbeat.md +286 -0
  686. package/docs/zh-CN/automation/gmail-pubsub.md +249 -0
  687. package/docs/zh-CN/automation/hooks.md +919 -0
  688. package/docs/zh-CN/automation/poll.md +76 -0
  689. package/docs/zh-CN/automation/troubleshooting.md +8 -0
  690. package/docs/zh-CN/automation/webhook.md +163 -0
  691. package/docs/zh-CN/brave-search.md +48 -0
  692. package/docs/zh-CN/channels/bluebubbles.md +271 -0
  693. package/docs/zh-CN/channels/broadcast-groups.md +449 -0
  694. package/docs/zh-CN/channels/channel-routing.md +117 -0
  695. package/docs/zh-CN/channels/discord.md +468 -0
  696. package/docs/zh-CN/channels/feishu.md +629 -0
  697. package/docs/zh-CN/channels/googlechat.md +257 -0
  698. package/docs/zh-CN/channels/grammy.md +38 -0
  699. package/docs/zh-CN/channels/group-messages.md +91 -0
  700. package/docs/zh-CN/channels/groups.md +379 -0
  701. package/docs/zh-CN/channels/imessage.md +302 -0
  702. package/docs/zh-CN/channels/index.md +53 -0
  703. package/docs/zh-CN/channels/line.md +180 -0
  704. package/docs/zh-CN/channels/location.md +63 -0
  705. package/docs/zh-CN/channels/matrix.md +221 -0
  706. package/docs/zh-CN/channels/mattermost.md +144 -0
  707. package/docs/zh-CN/channels/msteams.md +775 -0
  708. package/docs/zh-CN/channels/nextcloud-talk.md +142 -0
  709. package/docs/zh-CN/channels/nostr.md +240 -0
  710. package/docs/zh-CN/channels/pairing.md +89 -0
  711. package/docs/zh-CN/channels/signal.md +209 -0
  712. package/docs/zh-CN/channels/slack.md +531 -0
  713. package/docs/zh-CN/channels/telegram.md +751 -0
  714. package/docs/zh-CN/channels/tlon.md +136 -0
  715. package/docs/zh-CN/channels/troubleshooting.md +36 -0
  716. package/docs/zh-CN/channels/twitch.md +385 -0
  717. package/docs/zh-CN/channels/whatsapp.md +411 -0
  718. package/docs/zh-CN/channels/zalo.md +196 -0
  719. package/docs/zh-CN/channels/zalouser.md +147 -0
  720. package/docs/zh-CN/cli/acp.md +173 -0
  721. package/docs/zh-CN/cli/agent.md +30 -0
  722. package/docs/zh-CN/cli/agents.md +82 -0
  723. package/docs/zh-CN/cli/approvals.md +57 -0
  724. package/docs/zh-CN/cli/browser.md +114 -0
  725. package/docs/zh-CN/cli/channels.md +86 -0
  726. package/docs/zh-CN/cli/config.md +57 -0
  727. package/docs/zh-CN/cli/configure.md +38 -0
  728. package/docs/zh-CN/cli/cron.md +43 -0
  729. package/docs/zh-CN/cli/dashboard.md +23 -0
  730. package/docs/zh-CN/cli/devices.md +74 -0
  731. package/docs/zh-CN/cli/directory.md +70 -0
  732. package/docs/zh-CN/cli/dns.md +30 -0
  733. package/docs/zh-CN/cli/docs.md +22 -0
  734. package/docs/zh-CN/cli/doctor.md +48 -0
  735. package/docs/zh-CN/cli/gateway.md +206 -0
  736. package/docs/zh-CN/cli/health.md +28 -0
  737. package/docs/zh-CN/cli/hooks.md +311 -0
  738. package/docs/zh-CN/cli/index.md +1032 -0
  739. package/docs/zh-CN/cli/logs.md +31 -0
  740. package/docs/zh-CN/cli/memory.md +52 -0
  741. package/docs/zh-CN/cli/message.md +246 -0
  742. package/docs/zh-CN/cli/models.md +85 -0
  743. package/docs/zh-CN/cli/node.md +115 -0
  744. package/docs/zh-CN/cli/nodes.md +80 -0
  745. package/docs/zh-CN/cli/onboard.md +36 -0
  746. package/docs/zh-CN/cli/pairing.md +28 -0
  747. package/docs/zh-CN/cli/plugins.md +66 -0
  748. package/docs/zh-CN/cli/reset.md +24 -0
  749. package/docs/zh-CN/cli/sandbox.md +158 -0
  750. package/docs/zh-CN/cli/security.md +33 -0
  751. package/docs/zh-CN/cli/sessions.md +23 -0
  752. package/docs/zh-CN/cli/setup.md +36 -0
  753. package/docs/zh-CN/cli/skills.md +33 -0
  754. package/docs/zh-CN/cli/status.md +33 -0
  755. package/docs/zh-CN/cli/system.md +63 -0
  756. package/docs/zh-CN/cli/tui.md +30 -0
  757. package/docs/zh-CN/cli/uninstall.md +24 -0
  758. package/docs/zh-CN/cli/update.md +101 -0
  759. package/docs/zh-CN/cli/voicecall.md +41 -0
  760. package/docs/zh-CN/cli/webhooks.md +32 -0
  761. package/docs/zh-CN/concepts/agent-loop.md +146 -0
  762. package/docs/zh-CN/concepts/agent-workspace.md +219 -0
  763. package/docs/zh-CN/concepts/agent.md +115 -0
  764. package/docs/zh-CN/concepts/architecture.md +123 -0
  765. package/docs/zh-CN/concepts/compaction.md +67 -0
  766. package/docs/zh-CN/concepts/context.md +168 -0
  767. package/docs/zh-CN/concepts/features.md +59 -0
  768. package/docs/zh-CN/concepts/markdown-formatting.md +117 -0
  769. package/docs/zh-CN/concepts/memory.md +412 -0
  770. package/docs/zh-CN/concepts/messages.md +141 -0
  771. package/docs/zh-CN/concepts/model-failover.md +145 -0
  772. package/docs/zh-CN/concepts/model-providers.md +320 -0
  773. package/docs/zh-CN/concepts/models.md +196 -0
  774. package/docs/zh-CN/concepts/multi-agent.md +372 -0
  775. package/docs/zh-CN/concepts/oauth.md +151 -0
  776. package/docs/zh-CN/concepts/presence.md +99 -0
  777. package/docs/zh-CN/concepts/queue.md +94 -0
  778. package/docs/zh-CN/concepts/retry.md +76 -0
  779. package/docs/zh-CN/concepts/session-pruning.md +129 -0
  780. package/docs/zh-CN/concepts/session-tool.md +200 -0
  781. package/docs/zh-CN/concepts/session.md +166 -0
  782. package/docs/zh-CN/concepts/sessions.md +17 -0
  783. package/docs/zh-CN/concepts/streaming.md +133 -0
  784. package/docs/zh-CN/concepts/system-prompt.md +101 -0
  785. package/docs/zh-CN/concepts/timezone.md +96 -0
  786. package/docs/zh-CN/concepts/typebox.md +284 -0
  787. package/docs/zh-CN/concepts/typing-indicators.md +74 -0
  788. package/docs/zh-CN/concepts/usage-tracking.md +42 -0
  789. package/docs/zh-CN/date-time.md +129 -0
  790. package/docs/zh-CN/debug/node-issue.md +90 -0
  791. package/docs/zh-CN/diagnostics/flags.md +98 -0
  792. package/docs/zh-CN/experiments/onboarding-config-protocol.md +47 -0
  793. package/docs/zh-CN/experiments/plans/cron-add-hardening.md +70 -0
  794. package/docs/zh-CN/experiments/plans/group-policy-hardening.md +45 -0
  795. package/docs/zh-CN/experiments/plans/openresponses-gateway.md +121 -0
  796. package/docs/zh-CN/experiments/proposals/model-config.md +42 -0
  797. package/docs/zh-CN/experiments/research/memory.md +235 -0
  798. package/docs/zh-CN/gateway/authentication.md +142 -0
  799. package/docs/zh-CN/gateway/background-process.md +100 -0
  800. package/docs/zh-CN/gateway/bonjour.md +174 -0
  801. package/docs/zh-CN/gateway/bridge-protocol.md +86 -0
  802. package/docs/zh-CN/gateway/cli-backends.md +213 -0
  803. package/docs/zh-CN/gateway/configuration-examples.md +587 -0
  804. package/docs/zh-CN/gateway/configuration.md +3332 -0
  805. package/docs/zh-CN/gateway/discovery.md +123 -0
  806. package/docs/zh-CN/gateway/doctor.md +238 -0
  807. package/docs/zh-CN/gateway/gateway-lock.md +41 -0
  808. package/docs/zh-CN/gateway/health.md +42 -0
  809. package/docs/zh-CN/gateway/heartbeat.md +274 -0
  810. package/docs/zh-CN/gateway/index.md +335 -0
  811. package/docs/zh-CN/gateway/local-models.md +157 -0
  812. package/docs/zh-CN/gateway/logging.md +114 -0
  813. package/docs/zh-CN/gateway/multiple-gateways.md +119 -0
  814. package/docs/zh-CN/gateway/network-model.md +23 -0
  815. package/docs/zh-CN/gateway/openai-http-api.md +125 -0
  816. package/docs/zh-CN/gateway/openresponses-http-api.md +317 -0
  817. package/docs/zh-CN/gateway/pairing.md +99 -0
  818. package/docs/zh-CN/gateway/protocol.md +220 -0
  819. package/docs/zh-CN/gateway/remote-gateway-readme.md +164 -0
  820. package/docs/zh-CN/gateway/remote.md +133 -0
  821. package/docs/zh-CN/gateway/sandbox-vs-tool-policy-vs-elevated.md +135 -0
  822. package/docs/zh-CN/gateway/sandboxing.md +188 -0
  823. package/docs/zh-CN/gateway/security/index.md +777 -0
  824. package/docs/zh-CN/gateway/tailscale.md +124 -0
  825. package/docs/zh-CN/gateway/tools-invoke-http-api.md +92 -0
  826. package/docs/zh-CN/gateway/troubleshooting.md +771 -0
  827. package/docs/zh-CN/help/debugging.md +160 -0
  828. package/docs/zh-CN/help/environment.md +88 -0
  829. package/docs/zh-CN/help/faq.md +2628 -0
  830. package/docs/zh-CN/help/index.md +28 -0
  831. package/docs/zh-CN/help/scripts.md +35 -0
  832. package/docs/zh-CN/help/submitting-a-pr.md +8 -0
  833. package/docs/zh-CN/help/submitting-an-issue.md +8 -0
  834. package/docs/zh-CN/help/testing.md +375 -0
  835. package/docs/zh-CN/help/troubleshooting.md +104 -0
  836. package/docs/zh-CN/hooks/soul-evil.md +72 -0
  837. package/docs/zh-CN/index.md +186 -0
  838. package/docs/zh-CN/install/ansible.md +215 -0
  839. package/docs/zh-CN/install/bun.md +65 -0
  840. package/docs/zh-CN/install/development-channels.md +81 -0
  841. package/docs/zh-CN/install/docker.md +532 -0
  842. package/docs/zh-CN/install/exe-dev.md +127 -0
  843. package/docs/zh-CN/install/fly.md +490 -0
  844. package/docs/zh-CN/install/gcp.md +510 -0
  845. package/docs/zh-CN/install/hetzner.md +337 -0
  846. package/docs/zh-CN/install/index.md +193 -0
  847. package/docs/zh-CN/install/installer.md +128 -0
  848. package/docs/zh-CN/install/macos-vm.md +288 -0
  849. package/docs/zh-CN/install/migrating.md +199 -0
  850. package/docs/zh-CN/install/nix.md +99 -0
  851. package/docs/zh-CN/install/node.md +8 -0
  852. package/docs/zh-CN/install/northflank.mdx +60 -0
  853. package/docs/zh-CN/install/railway.mdx +106 -0
  854. package/docs/zh-CN/install/render.mdx +169 -0
  855. package/docs/zh-CN/install/uninstall.md +135 -0
  856. package/docs/zh-CN/install/updating.md +233 -0
  857. package/docs/zh-CN/logging.md +329 -0
  858. package/docs/zh-CN/network.md +59 -0
  859. package/docs/zh-CN/nodes/audio.md +120 -0
  860. package/docs/zh-CN/nodes/camera.md +162 -0
  861. package/docs/zh-CN/nodes/images.md +79 -0
  862. package/docs/zh-CN/nodes/index.md +348 -0
  863. package/docs/zh-CN/nodes/location-command.md +120 -0
  864. package/docs/zh-CN/nodes/media-understanding.md +380 -0
  865. package/docs/zh-CN/nodes/talk.md +97 -0
  866. package/docs/zh-CN/nodes/troubleshooting.md +8 -0
  867. package/docs/zh-CN/nodes/voicewake.md +72 -0
  868. package/docs/zh-CN/perplexity.md +84 -0
  869. package/docs/zh-CN/pi-dev.md +77 -0
  870. package/docs/zh-CN/pi.md +619 -0
  871. package/docs/zh-CN/platforms/android.md +155 -0
  872. package/docs/zh-CN/platforms/digitalocean.md +269 -0
  873. package/docs/zh-CN/platforms/index.md +60 -0
  874. package/docs/zh-CN/platforms/ios.md +114 -0
  875. package/docs/zh-CN/platforms/linux.md +101 -0
  876. package/docs/zh-CN/platforms/mac/bundled-gateway.md +75 -0
  877. package/docs/zh-CN/platforms/mac/canvas.md +128 -0
  878. package/docs/zh-CN/platforms/mac/child-process.md +73 -0
  879. package/docs/zh-CN/platforms/mac/dev-setup.md +109 -0
  880. package/docs/zh-CN/platforms/mac/health.md +41 -0
  881. package/docs/zh-CN/platforms/mac/icon.md +38 -0
  882. package/docs/zh-CN/platforms/mac/logging.md +64 -0
  883. package/docs/zh-CN/platforms/mac/menu-bar.md +88 -0
  884. package/docs/zh-CN/platforms/mac/peekaboo.md +62 -0
  885. package/docs/zh-CN/platforms/mac/permissions.md +46 -0
  886. package/docs/zh-CN/platforms/mac/release.md +92 -0
  887. package/docs/zh-CN/platforms/mac/remote.md +90 -0
  888. package/docs/zh-CN/platforms/mac/signing.md +54 -0
  889. package/docs/zh-CN/platforms/mac/skills.md +40 -0
  890. package/docs/zh-CN/platforms/mac/voice-overlay.md +67 -0
  891. package/docs/zh-CN/platforms/mac/voicewake.md +74 -0
  892. package/docs/zh-CN/platforms/mac/webchat.md +43 -0
  893. package/docs/zh-CN/platforms/mac/xpc.md +68 -0
  894. package/docs/zh-CN/platforms/macos.md +193 -0
  895. package/docs/zh-CN/platforms/oracle.md +310 -0
  896. package/docs/zh-CN/platforms/raspberry-pi.md +365 -0
  897. package/docs/zh-CN/platforms/windows.md +156 -0
  898. package/docs/zh-CN/plugins/agent-tools.md +99 -0
  899. package/docs/zh-CN/plugins/manifest.md +68 -0
  900. package/docs/zh-CN/plugins/voice-call.md +250 -0
  901. package/docs/zh-CN/plugins/zalouser.md +88 -0
  902. package/docs/zh-CN/prose.md +141 -0
  903. package/docs/zh-CN/providers/anthropic.md +159 -0
  904. package/docs/zh-CN/providers/bedrock.md +170 -0
  905. package/docs/zh-CN/providers/claude-max-api-proxy.md +155 -0
  906. package/docs/zh-CN/providers/deepgram.md +97 -0
  907. package/docs/zh-CN/providers/github-copilot.md +67 -0
  908. package/docs/zh-CN/providers/glm.md +39 -0
  909. package/docs/zh-CN/providers/index.md +68 -0
  910. package/docs/zh-CN/providers/minimax.md +206 -0
  911. package/docs/zh-CN/providers/models.md +55 -0
  912. package/docs/zh-CN/providers/moonshot.md +145 -0
  913. package/docs/zh-CN/providers/ollama.md +230 -0
  914. package/docs/zh-CN/providers/openai.md +68 -0
  915. package/docs/zh-CN/providers/opencode.md +41 -0
  916. package/docs/zh-CN/providers/openrouter.md +43 -0
  917. package/docs/zh-CN/providers/qianfan.md +8 -0
  918. package/docs/zh-CN/providers/qwen.md +55 -0
  919. package/docs/zh-CN/providers/synthetic.md +102 -0
  920. package/docs/zh-CN/providers/venice.md +274 -0
  921. package/docs/zh-CN/providers/vercel-ai-gateway.md +57 -0
  922. package/docs/zh-CN/providers/xiaomi.md +68 -0
  923. package/docs/zh-CN/providers/zai.md +41 -0
  924. package/docs/zh-CN/refactor/clawnet.md +424 -0
  925. package/docs/zh-CN/refactor/exec-host.md +323 -0
  926. package/docs/zh-CN/refactor/outbound-session-mirroring.md +92 -0
  927. package/docs/zh-CN/refactor/plugin-sdk.md +221 -0
  928. package/docs/zh-CN/refactor/strict-config.md +100 -0
  929. package/docs/zh-CN/reference/AGENTS.default.md +131 -0
  930. package/docs/zh-CN/reference/RELEASING.md +123 -0
  931. package/docs/zh-CN/reference/api-usage-costs.md +136 -0
  932. package/docs/zh-CN/reference/credits.md +34 -0
  933. package/docs/zh-CN/reference/device-models.md +54 -0
  934. package/docs/zh-CN/reference/rpc.md +48 -0
  935. package/docs/zh-CN/reference/session-management-compaction.md +287 -0
  936. package/docs/zh-CN/reference/templates/AGENTS.dev.md +89 -0
  937. package/docs/zh-CN/reference/templates/AGENTS.md +225 -0
  938. package/docs/zh-CN/reference/templates/BOOT.md +17 -0
  939. package/docs/zh-CN/reference/templates/BOOTSTRAP.md +68 -0
  940. package/docs/zh-CN/reference/templates/HEARTBEAT.md +18 -0
  941. package/docs/zh-CN/reference/templates/IDENTITY.dev.md +54 -0
  942. package/docs/zh-CN/reference/templates/IDENTITY.md +36 -0
  943. package/docs/zh-CN/reference/templates/SOUL.dev.md +83 -0
  944. package/docs/zh-CN/reference/templates/SOUL.md +49 -0
  945. package/docs/zh-CN/reference/templates/TOOLS.dev.md +31 -0
  946. package/docs/zh-CN/reference/templates/TOOLS.md +53 -0
  947. package/docs/zh-CN/reference/templates/USER.dev.md +25 -0
  948. package/docs/zh-CN/reference/templates/USER.md +30 -0
  949. package/docs/zh-CN/reference/test.md +57 -0
  950. package/docs/zh-CN/reference/token-use.md +119 -0
  951. package/docs/zh-CN/reference/transcript-hygiene.md +109 -0
  952. package/docs/zh-CN/reference/wizard.md +9 -0
  953. package/docs/zh-CN/security/formal-verification.md +171 -0
  954. package/docs/zh-CN/start/bootstrapping.md +9 -0
  955. package/docs/zh-CN/start/docs-directory.md +70 -0
  956. package/docs/zh-CN/start/getting-started.md +206 -0
  957. package/docs/zh-CN/start/hubs.md +200 -0
  958. package/docs/zh-CN/start/lore.md +226 -0
  959. package/docs/zh-CN/start/onboarding.md +105 -0
  960. package/docs/zh-CN/start/openclaw.md +248 -0
  961. package/docs/zh-CN/start/quickstart.md +88 -0
  962. package/docs/zh-CN/start/setup.md +153 -0
  963. package/docs/zh-CN/start/showcase.md +423 -0
  964. package/docs/zh-CN/start/wizard.md +331 -0
  965. package/docs/zh-CN/tools/agent-send.md +59 -0
  966. package/docs/zh-CN/tools/apply-patch.md +57 -0
  967. package/docs/zh-CN/tools/browser-linux-troubleshooting.md +144 -0
  968. package/docs/zh-CN/tools/browser-login.md +75 -0
  969. package/docs/zh-CN/tools/browser.md +553 -0
  970. package/docs/zh-CN/tools/chrome-extension.md +183 -0
  971. package/docs/zh-CN/tools/clawhub.md +209 -0
  972. package/docs/zh-CN/tools/creating-skills.md +61 -0
  973. package/docs/zh-CN/tools/elevated.md +64 -0
  974. package/docs/zh-CN/tools/exec-approvals.md +234 -0
  975. package/docs/zh-CN/tools/exec.md +169 -0
  976. package/docs/zh-CN/tools/firecrawl.md +68 -0
  977. package/docs/zh-CN/tools/index.md +515 -0
  978. package/docs/zh-CN/tools/llm-task.md +117 -0
  979. package/docs/zh-CN/tools/lobster.md +349 -0
  980. package/docs/zh-CN/tools/multi-agent-sandbox-tools.md +401 -0
  981. package/docs/zh-CN/tools/plugin.md +639 -0
  982. package/docs/zh-CN/tools/reactions.md +29 -0
  983. package/docs/zh-CN/tools/skills-config.md +78 -0
  984. package/docs/zh-CN/tools/skills.md +279 -0
  985. package/docs/zh-CN/tools/slash-commands.md +205 -0
  986. package/docs/zh-CN/tools/subagents.md +156 -0
  987. package/docs/zh-CN/tools/thinking.md +80 -0
  988. package/docs/zh-CN/tools/web.md +257 -0
  989. package/docs/zh-CN/tts.md +375 -0
  990. package/docs/zh-CN/vps.md +47 -0
  991. package/docs/zh-CN/web/control-ui.md +191 -0
  992. package/docs/zh-CN/web/dashboard.md +53 -0
  993. package/docs/zh-CN/web/index.md +118 -0
  994. package/docs/zh-CN/web/tui.md +166 -0
  995. package/docs/zh-CN/web/webchat.md +56 -0
  996. package/extensions/bluebubbles/README.md +45 -0
  997. package/extensions/bluebubbles/index.ts +19 -0
  998. package/extensions/bluebubbles/node_modules/.bin/clawdbot +21 -0
  999. package/extensions/bluebubbles/node_modules/.bin/clawdbot.CMD +12 -0
  1000. package/extensions/bluebubbles/node_modules/.bin/clawdbot.ps1 +41 -0
  1001. package/extensions/bluebubbles/node_modules/.bin/openclaw +21 -0
  1002. package/extensions/bluebubbles/node_modules/.bin/openclaw.CMD +12 -0
  1003. package/extensions/bluebubbles/node_modules/.bin/openclaw.ps1 +41 -0
  1004. package/extensions/bluebubbles/node_modules/.bin/synurex +21 -0
  1005. package/extensions/bluebubbles/node_modules/.bin/synurex.CMD +12 -0
  1006. package/extensions/bluebubbles/node_modules/.bin/synurex.ps1 +41 -0
  1007. package/extensions/bluebubbles/package.json +36 -0
  1008. package/extensions/bluebubbles/src/accounts.ts +88 -0
  1009. package/extensions/bluebubbles/src/actions.test.ts +650 -0
  1010. package/extensions/bluebubbles/src/actions.ts +438 -0
  1011. package/extensions/bluebubbles/src/attachments.test.ts +345 -0
  1012. package/extensions/bluebubbles/src/attachments.ts +302 -0
  1013. package/extensions/bluebubbles/src/channel.ts +414 -0
  1014. package/extensions/bluebubbles/src/chat.test.ts +461 -0
  1015. package/extensions/bluebubbles/src/chat.ts +382 -0
  1016. package/extensions/bluebubbles/src/config-schema.ts +51 -0
  1017. package/extensions/bluebubbles/src/media-send.ts +174 -0
  1018. package/extensions/bluebubbles/src/monitor.test.ts +2384 -0
  1019. package/extensions/bluebubbles/src/monitor.ts +2517 -0
  1020. package/extensions/bluebubbles/src/onboarding.ts +352 -0
  1021. package/extensions/bluebubbles/src/probe.ts +144 -0
  1022. package/extensions/bluebubbles/src/reactions.test.ts +392 -0
  1023. package/extensions/bluebubbles/src/reactions.ts +188 -0
  1024. package/extensions/bluebubbles/src/runtime.ts +14 -0
  1025. package/extensions/bluebubbles/src/send.test.ts +889 -0
  1026. package/extensions/bluebubbles/src/send.ts +474 -0
  1027. package/extensions/bluebubbles/src/targets.test.ts +183 -0
  1028. package/extensions/bluebubbles/src/targets.ts +422 -0
  1029. package/extensions/bluebubbles/src/types.ts +127 -0
  1030. package/extensions/bluebubbles/synurex.plugin.json +9 -0
  1031. package/extensions/copilot-proxy/README.md +24 -0
  1032. package/extensions/copilot-proxy/index.ts +149 -0
  1033. package/extensions/copilot-proxy/node_modules/.bin/clawdbot +21 -0
  1034. package/extensions/copilot-proxy/node_modules/.bin/clawdbot.CMD +12 -0
  1035. package/extensions/copilot-proxy/node_modules/.bin/clawdbot.ps1 +41 -0
  1036. package/extensions/copilot-proxy/node_modules/.bin/openclaw +21 -0
  1037. package/extensions/copilot-proxy/node_modules/.bin/openclaw.CMD +12 -0
  1038. package/extensions/copilot-proxy/node_modules/.bin/openclaw.ps1 +41 -0
  1039. package/extensions/copilot-proxy/node_modules/.bin/synurex +21 -0
  1040. package/extensions/copilot-proxy/node_modules/.bin/synurex.CMD +12 -0
  1041. package/extensions/copilot-proxy/node_modules/.bin/synurex.ps1 +41 -0
  1042. package/extensions/copilot-proxy/package.json +14 -0
  1043. package/extensions/copilot-proxy/synurex.plugin.json +9 -0
  1044. package/extensions/diagnostics-otel/index.ts +15 -0
  1045. package/extensions/diagnostics-otel/node_modules/.bin/clawdbot +21 -0
  1046. package/extensions/diagnostics-otel/node_modules/.bin/clawdbot.CMD +12 -0
  1047. package/extensions/diagnostics-otel/node_modules/.bin/clawdbot.ps1 +41 -0
  1048. package/extensions/diagnostics-otel/node_modules/.bin/openclaw +21 -0
  1049. package/extensions/diagnostics-otel/node_modules/.bin/openclaw.CMD +12 -0
  1050. package/extensions/diagnostics-otel/node_modules/.bin/openclaw.ps1 +41 -0
  1051. package/extensions/diagnostics-otel/node_modules/.bin/synurex +21 -0
  1052. package/extensions/diagnostics-otel/node_modules/.bin/synurex.CMD +12 -0
  1053. package/extensions/diagnostics-otel/node_modules/.bin/synurex.ps1 +41 -0
  1054. package/extensions/diagnostics-otel/package.json +27 -0
  1055. package/extensions/diagnostics-otel/src/service.test.ts +226 -0
  1056. package/extensions/diagnostics-otel/src/service.ts +635 -0
  1057. package/extensions/diagnostics-otel/synurex.plugin.json +8 -0
  1058. package/extensions/discord/index.ts +17 -0
  1059. package/extensions/discord/node_modules/.bin/clawdbot +21 -0
  1060. package/extensions/discord/node_modules/.bin/clawdbot.CMD +12 -0
  1061. package/extensions/discord/node_modules/.bin/clawdbot.ps1 +41 -0
  1062. package/extensions/discord/node_modules/.bin/openclaw +21 -0
  1063. package/extensions/discord/node_modules/.bin/openclaw.CMD +12 -0
  1064. package/extensions/discord/node_modules/.bin/openclaw.ps1 +41 -0
  1065. package/extensions/discord/node_modules/.bin/synurex +21 -0
  1066. package/extensions/discord/node_modules/.bin/synurex.CMD +12 -0
  1067. package/extensions/discord/node_modules/.bin/synurex.ps1 +41 -0
  1068. package/extensions/discord/package.json +14 -0
  1069. package/extensions/discord/src/channel.ts +422 -0
  1070. package/extensions/discord/src/runtime.ts +14 -0
  1071. package/extensions/discord/synurex.plugin.json +9 -0
  1072. package/extensions/feishu/index.ts +63 -0
  1073. package/extensions/feishu/node_modules/.bin/clawdbot +21 -0
  1074. package/extensions/feishu/node_modules/.bin/clawdbot.CMD +12 -0
  1075. package/extensions/feishu/node_modules/.bin/clawdbot.ps1 +41 -0
  1076. package/extensions/feishu/node_modules/.bin/openclaw +21 -0
  1077. package/extensions/feishu/node_modules/.bin/openclaw.CMD +12 -0
  1078. package/extensions/feishu/node_modules/.bin/openclaw.ps1 +41 -0
  1079. package/extensions/feishu/node_modules/.bin/synurex +21 -0
  1080. package/extensions/feishu/node_modules/.bin/synurex.CMD +12 -0
  1081. package/extensions/feishu/node_modules/.bin/synurex.ps1 +41 -0
  1082. package/extensions/feishu/package.json +37 -0
  1083. package/extensions/feishu/skills/feishu-doc/SKILL.md +105 -0
  1084. package/extensions/feishu/skills/feishu-doc/references/block-types.md +103 -0
  1085. package/extensions/feishu/skills/feishu-drive/SKILL.md +97 -0
  1086. package/extensions/feishu/skills/feishu-perm/SKILL.md +119 -0
  1087. package/extensions/feishu/skills/feishu-wiki/SKILL.md +111 -0
  1088. package/extensions/feishu/src/accounts.ts +144 -0
  1089. package/extensions/feishu/src/bitable.ts +459 -0
  1090. package/extensions/feishu/src/bot.ts +871 -0
  1091. package/extensions/feishu/src/channel.ts +341 -0
  1092. package/extensions/feishu/src/client.ts +118 -0
  1093. package/extensions/feishu/src/config-schema.ts +172 -0
  1094. package/extensions/feishu/src/directory.ts +177 -0
  1095. package/extensions/feishu/src/doc-schema.ts +47 -0
  1096. package/extensions/feishu/src/docx.ts +521 -0
  1097. package/extensions/feishu/src/drive-schema.ts +46 -0
  1098. package/extensions/feishu/src/drive.ts +227 -0
  1099. package/extensions/feishu/src/media.ts +527 -0
  1100. package/extensions/feishu/src/mention.ts +126 -0
  1101. package/extensions/feishu/src/monitor.ts +190 -0
  1102. package/extensions/feishu/src/onboarding.ts +356 -0
  1103. package/extensions/feishu/src/outbound.ts +40 -0
  1104. package/extensions/feishu/src/perm-schema.ts +52 -0
  1105. package/extensions/feishu/src/perm.ts +173 -0
  1106. package/extensions/feishu/src/policy.ts +104 -0
  1107. package/extensions/feishu/src/probe.ts +44 -0
  1108. package/extensions/feishu/src/reactions.ts +160 -0
  1109. package/extensions/feishu/src/reply-dispatcher.ts +184 -0
  1110. package/extensions/feishu/src/runtime.ts +14 -0
  1111. package/extensions/feishu/src/send.ts +358 -0
  1112. package/extensions/feishu/src/targets.ts +78 -0
  1113. package/extensions/feishu/src/tools-config.ts +21 -0
  1114. package/extensions/feishu/src/types.ts +75 -0
  1115. package/extensions/feishu/src/typing.ts +80 -0
  1116. package/extensions/feishu/src/wiki-schema.ts +55 -0
  1117. package/extensions/feishu/src/wiki.ts +232 -0
  1118. package/extensions/feishu/synurex.plugin.json +10 -0
  1119. package/extensions/google-antigravity-auth/README.md +24 -0
  1120. package/extensions/google-antigravity-auth/index.ts +461 -0
  1121. package/extensions/google-antigravity-auth/node_modules/.bin/clawdbot +21 -0
  1122. package/extensions/google-antigravity-auth/node_modules/.bin/clawdbot.CMD +12 -0
  1123. package/extensions/google-antigravity-auth/node_modules/.bin/clawdbot.ps1 +41 -0
  1124. package/extensions/google-antigravity-auth/node_modules/.bin/openclaw +21 -0
  1125. package/extensions/google-antigravity-auth/node_modules/.bin/openclaw.CMD +12 -0
  1126. package/extensions/google-antigravity-auth/node_modules/.bin/openclaw.ps1 +41 -0
  1127. package/extensions/google-antigravity-auth/node_modules/.bin/synurex +21 -0
  1128. package/extensions/google-antigravity-auth/node_modules/.bin/synurex.CMD +12 -0
  1129. package/extensions/google-antigravity-auth/node_modules/.bin/synurex.ps1 +41 -0
  1130. package/extensions/google-antigravity-auth/package.json +14 -0
  1131. package/extensions/google-antigravity-auth/synurex.plugin.json +9 -0
  1132. package/extensions/google-gemini-cli-auth/README.md +35 -0
  1133. package/extensions/google-gemini-cli-auth/index.ts +88 -0
  1134. package/extensions/google-gemini-cli-auth/node_modules/.bin/clawdbot +21 -0
  1135. package/extensions/google-gemini-cli-auth/node_modules/.bin/clawdbot.CMD +12 -0
  1136. package/extensions/google-gemini-cli-auth/node_modules/.bin/clawdbot.ps1 +41 -0
  1137. package/extensions/google-gemini-cli-auth/node_modules/.bin/openclaw +21 -0
  1138. package/extensions/google-gemini-cli-auth/node_modules/.bin/openclaw.CMD +12 -0
  1139. package/extensions/google-gemini-cli-auth/node_modules/.bin/openclaw.ps1 +41 -0
  1140. package/extensions/google-gemini-cli-auth/node_modules/.bin/synurex +21 -0
  1141. package/extensions/google-gemini-cli-auth/node_modules/.bin/synurex.CMD +12 -0
  1142. package/extensions/google-gemini-cli-auth/node_modules/.bin/synurex.ps1 +41 -0
  1143. package/extensions/google-gemini-cli-auth/oauth.test.ts +240 -0
  1144. package/extensions/google-gemini-cli-auth/oauth.ts +662 -0
  1145. package/extensions/google-gemini-cli-auth/package.json +14 -0
  1146. package/extensions/google-gemini-cli-auth/synurex.plugin.json +9 -0
  1147. package/extensions/googlechat/index.ts +19 -0
  1148. package/extensions/googlechat/node_modules/.bin/clawdbot +21 -0
  1149. package/extensions/googlechat/node_modules/.bin/clawdbot.CMD +12 -0
  1150. package/extensions/googlechat/node_modules/.bin/clawdbot.ps1 +41 -0
  1151. package/extensions/googlechat/node_modules/.bin/openclaw +21 -0
  1152. package/extensions/googlechat/node_modules/.bin/openclaw.CMD +12 -0
  1153. package/extensions/googlechat/node_modules/.bin/openclaw.ps1 +41 -0
  1154. package/extensions/googlechat/node_modules/.bin/synurex +21 -0
  1155. package/extensions/googlechat/node_modules/.bin/synurex.CMD +12 -0
  1156. package/extensions/googlechat/node_modules/.bin/synurex.ps1 +41 -0
  1157. package/extensions/googlechat/package.json +39 -0
  1158. package/extensions/googlechat/src/accounts.ts +147 -0
  1159. package/extensions/googlechat/src/actions.ts +181 -0
  1160. package/extensions/googlechat/src/api.test.ts +61 -0
  1161. package/extensions/googlechat/src/api.ts +282 -0
  1162. package/extensions/googlechat/src/auth.ts +137 -0
  1163. package/extensions/googlechat/src/channel.ts +583 -0
  1164. package/extensions/googlechat/src/monitor.test.ts +22 -0
  1165. package/extensions/googlechat/src/monitor.ts +960 -0
  1166. package/extensions/googlechat/src/onboarding.ts +269 -0
  1167. package/extensions/googlechat/src/runtime.ts +14 -0
  1168. package/extensions/googlechat/src/targets.test.ts +32 -0
  1169. package/extensions/googlechat/src/targets.ts +65 -0
  1170. package/extensions/googlechat/src/types.config.ts +3 -0
  1171. package/extensions/googlechat/src/types.ts +73 -0
  1172. package/extensions/googlechat/synurex.plugin.json +9 -0
  1173. package/extensions/imessage/index.ts +17 -0
  1174. package/extensions/imessage/node_modules/.bin/clawdbot +21 -0
  1175. package/extensions/imessage/node_modules/.bin/clawdbot.CMD +12 -0
  1176. package/extensions/imessage/node_modules/.bin/clawdbot.ps1 +41 -0
  1177. package/extensions/imessage/node_modules/.bin/openclaw +21 -0
  1178. package/extensions/imessage/node_modules/.bin/openclaw.CMD +12 -0
  1179. package/extensions/imessage/node_modules/.bin/openclaw.ps1 +41 -0
  1180. package/extensions/imessage/node_modules/.bin/synurex +21 -0
  1181. package/extensions/imessage/node_modules/.bin/synurex.CMD +12 -0
  1182. package/extensions/imessage/node_modules/.bin/synurex.ps1 +41 -0
  1183. package/extensions/imessage/package.json +14 -0
  1184. package/extensions/imessage/src/channel.ts +294 -0
  1185. package/extensions/imessage/src/runtime.ts +14 -0
  1186. package/extensions/imessage/synurex.plugin.json +9 -0
  1187. package/extensions/line/index.ts +19 -0
  1188. package/extensions/line/node_modules/.bin/clawdbot +21 -0
  1189. package/extensions/line/node_modules/.bin/clawdbot.CMD +12 -0
  1190. package/extensions/line/node_modules/.bin/clawdbot.ps1 +41 -0
  1191. package/extensions/line/node_modules/.bin/openclaw +21 -0
  1192. package/extensions/line/node_modules/.bin/openclaw.CMD +12 -0
  1193. package/extensions/line/node_modules/.bin/openclaw.ps1 +41 -0
  1194. package/extensions/line/node_modules/.bin/synurex +21 -0
  1195. package/extensions/line/node_modules/.bin/synurex.CMD +12 -0
  1196. package/extensions/line/node_modules/.bin/synurex.ps1 +41 -0
  1197. package/extensions/line/package.json +29 -0
  1198. package/extensions/line/src/card-command.ts +344 -0
  1199. package/extensions/line/src/channel.logout.test.ts +99 -0
  1200. package/extensions/line/src/channel.sendPayload.test.ts +306 -0
  1201. package/extensions/line/src/channel.ts +780 -0
  1202. package/extensions/line/src/runtime.ts +14 -0
  1203. package/extensions/line/synurex.plugin.json +9 -0
  1204. package/extensions/llm-task/README.md +97 -0
  1205. package/extensions/llm-task/index.ts +6 -0
  1206. package/extensions/llm-task/node_modules/.bin/clawdbot +21 -0
  1207. package/extensions/llm-task/node_modules/.bin/clawdbot.CMD +12 -0
  1208. package/extensions/llm-task/node_modules/.bin/clawdbot.ps1 +41 -0
  1209. package/extensions/llm-task/node_modules/.bin/openclaw +21 -0
  1210. package/extensions/llm-task/node_modules/.bin/openclaw.CMD +12 -0
  1211. package/extensions/llm-task/node_modules/.bin/openclaw.ps1 +41 -0
  1212. package/extensions/llm-task/node_modules/.bin/synurex +21 -0
  1213. package/extensions/llm-task/node_modules/.bin/synurex.CMD +12 -0
  1214. package/extensions/llm-task/node_modules/.bin/synurex.ps1 +41 -0
  1215. package/extensions/llm-task/package.json +14 -0
  1216. package/extensions/llm-task/src/llm-task-tool.test.ts +138 -0
  1217. package/extensions/llm-task/src/llm-task-tool.ts +245 -0
  1218. package/extensions/llm-task/synurex.plugin.json +21 -0
  1219. package/extensions/lobster/README.md +75 -0
  1220. package/extensions/lobster/SKILL.md +97 -0
  1221. package/extensions/lobster/index.ts +14 -0
  1222. package/extensions/lobster/node_modules/.bin/clawdbot +21 -0
  1223. package/extensions/lobster/node_modules/.bin/clawdbot.CMD +12 -0
  1224. package/extensions/lobster/node_modules/.bin/clawdbot.ps1 +41 -0
  1225. package/extensions/lobster/node_modules/.bin/openclaw +21 -0
  1226. package/extensions/lobster/node_modules/.bin/openclaw.CMD +12 -0
  1227. package/extensions/lobster/node_modules/.bin/openclaw.ps1 +41 -0
  1228. package/extensions/lobster/node_modules/.bin/synurex +21 -0
  1229. package/extensions/lobster/node_modules/.bin/synurex.CMD +12 -0
  1230. package/extensions/lobster/node_modules/.bin/synurex.ps1 +41 -0
  1231. package/extensions/lobster/package.json +14 -0
  1232. package/extensions/lobster/src/lobster-tool.test.ts +247 -0
  1233. package/extensions/lobster/src/lobster-tool.ts +328 -0
  1234. package/extensions/lobster/synurex.plugin.json +10 -0
  1235. package/extensions/matrix/CHANGELOG.md +111 -0
  1236. package/extensions/matrix/index.ts +17 -0
  1237. package/extensions/matrix/node_modules/.bin/clawdbot +21 -0
  1238. package/extensions/matrix/node_modules/.bin/clawdbot.CMD +12 -0
  1239. package/extensions/matrix/node_modules/.bin/clawdbot.ps1 +41 -0
  1240. package/extensions/matrix/node_modules/.bin/markdown-it +21 -0
  1241. package/extensions/matrix/node_modules/.bin/markdown-it.CMD +12 -0
  1242. package/extensions/matrix/node_modules/.bin/markdown-it.ps1 +41 -0
  1243. package/extensions/matrix/node_modules/.bin/openclaw +21 -0
  1244. package/extensions/matrix/node_modules/.bin/openclaw.CMD +12 -0
  1245. package/extensions/matrix/node_modules/.bin/openclaw.ps1 +41 -0
  1246. package/extensions/matrix/node_modules/.bin/synurex +21 -0
  1247. package/extensions/matrix/node_modules/.bin/synurex.CMD +12 -0
  1248. package/extensions/matrix/node_modules/.bin/synurex.ps1 +41 -0
  1249. package/extensions/matrix/package.json +36 -0
  1250. package/extensions/matrix/src/actions.ts +195 -0
  1251. package/extensions/matrix/src/channel.directory.test.ts +64 -0
  1252. package/extensions/matrix/src/channel.ts +439 -0
  1253. package/extensions/matrix/src/config-schema.ts +63 -0
  1254. package/extensions/matrix/src/directory-live.ts +188 -0
  1255. package/extensions/matrix/src/group-mentions.ts +66 -0
  1256. package/extensions/matrix/src/matrix/accounts.test.ts +82 -0
  1257. package/extensions/matrix/src/matrix/accounts.ts +65 -0
  1258. package/extensions/matrix/src/matrix/actions/client.ts +57 -0
  1259. package/extensions/matrix/src/matrix/actions/messages.ts +128 -0
  1260. package/extensions/matrix/src/matrix/actions/pins.ts +76 -0
  1261. package/extensions/matrix/src/matrix/actions/reactions.ts +96 -0
  1262. package/extensions/matrix/src/matrix/actions/room.ts +85 -0
  1263. package/extensions/matrix/src/matrix/actions/summary.ts +75 -0
  1264. package/extensions/matrix/src/matrix/actions/types.ts +84 -0
  1265. package/extensions/matrix/src/matrix/actions.ts +15 -0
  1266. package/extensions/matrix/src/matrix/active-client.ts +11 -0
  1267. package/extensions/matrix/src/matrix/client/config.ts +160 -0
  1268. package/extensions/matrix/src/matrix/client/create-client.ts +123 -0
  1269. package/extensions/matrix/src/matrix/client/logging.ts +36 -0
  1270. package/extensions/matrix/src/matrix/client/runtime.ts +4 -0
  1271. package/extensions/matrix/src/matrix/client/shared.ts +170 -0
  1272. package/extensions/matrix/src/matrix/client/storage.ts +131 -0
  1273. package/extensions/matrix/src/matrix/client/types.ts +34 -0
  1274. package/extensions/matrix/src/matrix/client.test.ts +56 -0
  1275. package/extensions/matrix/src/matrix/client.ts +5 -0
  1276. package/extensions/matrix/src/matrix/credentials.ts +105 -0
  1277. package/extensions/matrix/src/matrix/deps.ts +60 -0
  1278. package/extensions/matrix/src/matrix/format.test.ts +33 -0
  1279. package/extensions/matrix/src/matrix/format.ts +22 -0
  1280. package/extensions/matrix/src/matrix/index.ts +11 -0
  1281. package/extensions/matrix/src/matrix/monitor/allowlist.test.ts +45 -0
  1282. package/extensions/matrix/src/matrix/monitor/allowlist.ts +103 -0
  1283. package/extensions/matrix/src/matrix/monitor/auto-join.ts +71 -0
  1284. package/extensions/matrix/src/matrix/monitor/direct.ts +104 -0
  1285. package/extensions/matrix/src/matrix/monitor/events.ts +101 -0
  1286. package/extensions/matrix/src/matrix/monitor/handler.ts +665 -0
  1287. package/extensions/matrix/src/matrix/monitor/index.ts +338 -0
  1288. package/extensions/matrix/src/matrix/monitor/location.ts +100 -0
  1289. package/extensions/matrix/src/matrix/monitor/media.test.ts +102 -0
  1290. package/extensions/matrix/src/matrix/monitor/media.ts +113 -0
  1291. package/extensions/matrix/src/matrix/monitor/mentions.ts +31 -0
  1292. package/extensions/matrix/src/matrix/monitor/replies.ts +97 -0
  1293. package/extensions/matrix/src/matrix/monitor/room-info.ts +55 -0
  1294. package/extensions/matrix/src/matrix/monitor/rooms.test.ts +39 -0
  1295. package/extensions/matrix/src/matrix/monitor/rooms.ts +47 -0
  1296. package/extensions/matrix/src/matrix/monitor/threads.ts +68 -0
  1297. package/extensions/matrix/src/matrix/monitor/types.ts +39 -0
  1298. package/extensions/matrix/src/matrix/poll-types.test.ts +21 -0
  1299. package/extensions/matrix/src/matrix/poll-types.ts +166 -0
  1300. package/extensions/matrix/src/matrix/probe.ts +70 -0
  1301. package/extensions/matrix/src/matrix/send/client.ts +66 -0
  1302. package/extensions/matrix/src/matrix/send/formatting.ts +89 -0
  1303. package/extensions/matrix/src/matrix/send/media.ts +229 -0
  1304. package/extensions/matrix/src/matrix/send/targets.test.ts +98 -0
  1305. package/extensions/matrix/src/matrix/send/targets.ts +147 -0
  1306. package/extensions/matrix/src/matrix/send/types.ts +109 -0
  1307. package/extensions/matrix/src/matrix/send.test.ts +171 -0
  1308. package/extensions/matrix/src/matrix/send.ts +260 -0
  1309. package/extensions/matrix/src/onboarding.ts +449 -0
  1310. package/extensions/matrix/src/outbound.ts +52 -0
  1311. package/extensions/matrix/src/resolve-targets.test.ts +48 -0
  1312. package/extensions/matrix/src/resolve-targets.ts +135 -0
  1313. package/extensions/matrix/src/runtime.ts +14 -0
  1314. package/extensions/matrix/src/tool-actions.ts +164 -0
  1315. package/extensions/matrix/src/types.ts +97 -0
  1316. package/extensions/matrix/synurex.plugin.json +9 -0
  1317. package/extensions/mattermost/index.ts +17 -0
  1318. package/extensions/mattermost/node_modules/.bin/clawdbot +21 -0
  1319. package/extensions/mattermost/node_modules/.bin/clawdbot.CMD +12 -0
  1320. package/extensions/mattermost/node_modules/.bin/clawdbot.ps1 +41 -0
  1321. package/extensions/mattermost/node_modules/.bin/openclaw +21 -0
  1322. package/extensions/mattermost/node_modules/.bin/openclaw.CMD +12 -0
  1323. package/extensions/mattermost/node_modules/.bin/openclaw.ps1 +41 -0
  1324. package/extensions/mattermost/node_modules/.bin/synurex +21 -0
  1325. package/extensions/mattermost/node_modules/.bin/synurex.CMD +12 -0
  1326. package/extensions/mattermost/node_modules/.bin/synurex.ps1 +41 -0
  1327. package/extensions/mattermost/package.json +28 -0
  1328. package/extensions/mattermost/src/channel.test.ts +72 -0
  1329. package/extensions/mattermost/src/channel.ts +337 -0
  1330. package/extensions/mattermost/src/config-schema.ts +56 -0
  1331. package/extensions/mattermost/src/group-mentions.ts +15 -0
  1332. package/extensions/mattermost/src/mattermost/accounts.ts +128 -0
  1333. package/extensions/mattermost/src/mattermost/client.ts +220 -0
  1334. package/extensions/mattermost/src/mattermost/index.ts +9 -0
  1335. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +166 -0
  1336. package/extensions/mattermost/src/mattermost/monitor.ts +991 -0
  1337. package/extensions/mattermost/src/mattermost/probe.ts +74 -0
  1338. package/extensions/mattermost/src/mattermost/send.ts +231 -0
  1339. package/extensions/mattermost/src/normalize.ts +46 -0
  1340. package/extensions/mattermost/src/onboarding-helpers.ts +44 -0
  1341. package/extensions/mattermost/src/onboarding.ts +186 -0
  1342. package/extensions/mattermost/src/runtime.ts +14 -0
  1343. package/extensions/mattermost/src/types.ts +52 -0
  1344. package/extensions/mattermost/synurex.plugin.json +9 -0
  1345. package/extensions/memory-core/index.ts +38 -0
  1346. package/extensions/memory-core/node_modules/.bin/clawdbot +21 -0
  1347. package/extensions/memory-core/node_modules/.bin/clawdbot.CMD +12 -0
  1348. package/extensions/memory-core/node_modules/.bin/clawdbot.ps1 +41 -0
  1349. package/extensions/memory-core/node_modules/.bin/openclaw +21 -0
  1350. package/extensions/memory-core/node_modules/.bin/openclaw.CMD +12 -0
  1351. package/extensions/memory-core/node_modules/.bin/openclaw.ps1 +41 -0
  1352. package/extensions/memory-core/node_modules/.bin/synurex +21 -0
  1353. package/extensions/memory-core/node_modules/.bin/synurex.CMD +12 -0
  1354. package/extensions/memory-core/node_modules/.bin/synurex.ps1 +41 -0
  1355. package/extensions/memory-core/package.json +17 -0
  1356. package/extensions/memory-core/synurex.plugin.json +9 -0
  1357. package/extensions/memory-lancedb/config.ts +139 -0
  1358. package/extensions/memory-lancedb/index.test.ts +253 -0
  1359. package/extensions/memory-lancedb/index.ts +622 -0
  1360. package/extensions/memory-lancedb/node_modules/.bin/clawdbot +21 -0
  1361. package/extensions/memory-lancedb/node_modules/.bin/clawdbot.CMD +12 -0
  1362. package/extensions/memory-lancedb/node_modules/.bin/clawdbot.ps1 +41 -0
  1363. package/extensions/memory-lancedb/node_modules/.bin/openai +21 -0
  1364. package/extensions/memory-lancedb/node_modules/.bin/openai.CMD +12 -0
  1365. package/extensions/memory-lancedb/node_modules/.bin/openai.ps1 +41 -0
  1366. package/extensions/memory-lancedb/node_modules/.bin/openclaw +21 -0
  1367. package/extensions/memory-lancedb/node_modules/.bin/openclaw.CMD +12 -0
  1368. package/extensions/memory-lancedb/node_modules/.bin/openclaw.ps1 +41 -0
  1369. package/extensions/memory-lancedb/node_modules/.bin/synurex +21 -0
  1370. package/extensions/memory-lancedb/node_modules/.bin/synurex.CMD +12 -0
  1371. package/extensions/memory-lancedb/node_modules/.bin/synurex.ps1 +41 -0
  1372. package/extensions/memory-lancedb/package.json +19 -0
  1373. package/extensions/memory-lancedb/synurex.plugin.json +60 -0
  1374. package/extensions/minimax-portal-auth/README.md +33 -0
  1375. package/extensions/minimax-portal-auth/index.ts +155 -0
  1376. package/extensions/minimax-portal-auth/node_modules/.bin/clawdbot +21 -0
  1377. package/extensions/minimax-portal-auth/node_modules/.bin/clawdbot.CMD +12 -0
  1378. package/extensions/minimax-portal-auth/node_modules/.bin/clawdbot.ps1 +41 -0
  1379. package/extensions/minimax-portal-auth/node_modules/.bin/openclaw +21 -0
  1380. package/extensions/minimax-portal-auth/node_modules/.bin/openclaw.CMD +12 -0
  1381. package/extensions/minimax-portal-auth/node_modules/.bin/openclaw.ps1 +41 -0
  1382. package/extensions/minimax-portal-auth/node_modules/.bin/synurex +21 -0
  1383. package/extensions/minimax-portal-auth/node_modules/.bin/synurex.CMD +12 -0
  1384. package/extensions/minimax-portal-auth/node_modules/.bin/synurex.ps1 +41 -0
  1385. package/extensions/minimax-portal-auth/oauth.ts +247 -0
  1386. package/extensions/minimax-portal-auth/package.json +14 -0
  1387. package/extensions/minimax-portal-auth/synurex.plugin.json +9 -0
  1388. package/extensions/msteams/CHANGELOG.md +107 -0
  1389. package/extensions/msteams/index.ts +17 -0
  1390. package/extensions/msteams/node_modules/.bin/clawdbot +21 -0
  1391. package/extensions/msteams/node_modules/.bin/clawdbot.CMD +12 -0
  1392. package/extensions/msteams/node_modules/.bin/clawdbot.ps1 +41 -0
  1393. package/extensions/msteams/node_modules/.bin/openclaw +21 -0
  1394. package/extensions/msteams/node_modules/.bin/openclaw.CMD +12 -0
  1395. package/extensions/msteams/node_modules/.bin/openclaw.ps1 +41 -0
  1396. package/extensions/msteams/node_modules/.bin/synurex +21 -0
  1397. package/extensions/msteams/node_modules/.bin/synurex.CMD +12 -0
  1398. package/extensions/msteams/node_modules/.bin/synurex.ps1 +41 -0
  1399. package/extensions/msteams/package.json +39 -0
  1400. package/extensions/msteams/src/attachments/download.ts +283 -0
  1401. package/extensions/msteams/src/attachments/graph.ts +353 -0
  1402. package/extensions/msteams/src/attachments/html.ts +90 -0
  1403. package/extensions/msteams/src/attachments/payload.ts +22 -0
  1404. package/extensions/msteams/src/attachments/shared.ts +291 -0
  1405. package/extensions/msteams/src/attachments/types.ts +37 -0
  1406. package/extensions/msteams/src/attachments.test.ts +459 -0
  1407. package/extensions/msteams/src/attachments.ts +18 -0
  1408. package/extensions/msteams/src/channel.directory.test.ts +48 -0
  1409. package/extensions/msteams/src/channel.ts +459 -0
  1410. package/extensions/msteams/src/conversation-store-fs.test.ts +88 -0
  1411. package/extensions/msteams/src/conversation-store-fs.ts +165 -0
  1412. package/extensions/msteams/src/conversation-store-memory.ts +47 -0
  1413. package/extensions/msteams/src/conversation-store.ts +41 -0
  1414. package/extensions/msteams/src/directory-live.ts +205 -0
  1415. package/extensions/msteams/src/errors.test.ts +45 -0
  1416. package/extensions/msteams/src/errors.ts +190 -0
  1417. package/extensions/msteams/src/file-consent-helpers.test.ts +243 -0
  1418. package/extensions/msteams/src/file-consent-helpers.ts +73 -0
  1419. package/extensions/msteams/src/file-consent.ts +126 -0
  1420. package/extensions/msteams/src/graph-chat.ts +53 -0
  1421. package/extensions/msteams/src/graph-upload.ts +453 -0
  1422. package/extensions/msteams/src/inbound.test.ts +66 -0
  1423. package/extensions/msteams/src/inbound.ts +48 -0
  1424. package/extensions/msteams/src/index.ts +4 -0
  1425. package/extensions/msteams/src/media-helpers.test.ts +189 -0
  1426. package/extensions/msteams/src/media-helpers.ts +86 -0
  1427. package/extensions/msteams/src/messenger.test.ts +248 -0
  1428. package/extensions/msteams/src/messenger.ts +495 -0
  1429. package/extensions/msteams/src/monitor-handler/inbound-media.ts +128 -0
  1430. package/extensions/msteams/src/monitor-handler/message-handler.ts +641 -0
  1431. package/extensions/msteams/src/monitor-handler.ts +162 -0
  1432. package/extensions/msteams/src/monitor-types.ts +5 -0
  1433. package/extensions/msteams/src/monitor.ts +295 -0
  1434. package/extensions/msteams/src/onboarding.ts +431 -0
  1435. package/extensions/msteams/src/outbound.ts +46 -0
  1436. package/extensions/msteams/src/pending-uploads.ts +89 -0
  1437. package/extensions/msteams/src/policy.test.ts +209 -0
  1438. package/extensions/msteams/src/policy.ts +273 -0
  1439. package/extensions/msteams/src/polls-store-memory.ts +32 -0
  1440. package/extensions/msteams/src/polls-store.test.ts +38 -0
  1441. package/extensions/msteams/src/polls.test.ts +72 -0
  1442. package/extensions/msteams/src/polls.ts +315 -0
  1443. package/extensions/msteams/src/probe.test.ts +58 -0
  1444. package/extensions/msteams/src/probe.ts +107 -0
  1445. package/extensions/msteams/src/reply-dispatcher.ts +132 -0
  1446. package/extensions/msteams/src/resolve-allowlist.ts +297 -0
  1447. package/extensions/msteams/src/runtime.ts +14 -0
  1448. package/extensions/msteams/src/sdk-types.ts +19 -0
  1449. package/extensions/msteams/src/sdk.ts +33 -0
  1450. package/extensions/msteams/src/send-context.ts +164 -0
  1451. package/extensions/msteams/src/send.ts +519 -0
  1452. package/extensions/msteams/src/sent-message-cache.test.ts +15 -0
  1453. package/extensions/msteams/src/sent-message-cache.ts +47 -0
  1454. package/extensions/msteams/src/storage.ts +25 -0
  1455. package/extensions/msteams/src/store-fs.ts +83 -0
  1456. package/extensions/msteams/src/token.ts +19 -0
  1457. package/extensions/msteams/synurex.plugin.json +9 -0
  1458. package/extensions/nextcloud-talk/index.ts +17 -0
  1459. package/extensions/nextcloud-talk/node_modules/.bin/clawdbot +21 -0
  1460. package/extensions/nextcloud-talk/node_modules/.bin/clawdbot.CMD +12 -0
  1461. package/extensions/nextcloud-talk/node_modules/.bin/clawdbot.ps1 +41 -0
  1462. package/extensions/nextcloud-talk/node_modules/.bin/openclaw +21 -0
  1463. package/extensions/nextcloud-talk/node_modules/.bin/openclaw.CMD +12 -0
  1464. package/extensions/nextcloud-talk/node_modules/.bin/openclaw.ps1 +41 -0
  1465. package/extensions/nextcloud-talk/node_modules/.bin/synurex +21 -0
  1466. package/extensions/nextcloud-talk/node_modules/.bin/synurex.CMD +12 -0
  1467. package/extensions/nextcloud-talk/node_modules/.bin/synurex.ps1 +41 -0
  1468. package/extensions/nextcloud-talk/package.json +33 -0
  1469. package/extensions/nextcloud-talk/src/accounts.ts +174 -0
  1470. package/extensions/nextcloud-talk/src/channel.ts +409 -0
  1471. package/extensions/nextcloud-talk/src/config-schema.ts +79 -0
  1472. package/extensions/nextcloud-talk/src/format.ts +79 -0
  1473. package/extensions/nextcloud-talk/src/inbound.ts +327 -0
  1474. package/extensions/nextcloud-talk/src/monitor.ts +246 -0
  1475. package/extensions/nextcloud-talk/src/normalize.ts +39 -0
  1476. package/extensions/nextcloud-talk/src/onboarding.ts +343 -0
  1477. package/extensions/nextcloud-talk/src/policy.test.ts +33 -0
  1478. package/extensions/nextcloud-talk/src/policy.ts +180 -0
  1479. package/extensions/nextcloud-talk/src/room-info.ts +125 -0
  1480. package/extensions/nextcloud-talk/src/runtime.ts +14 -0
  1481. package/extensions/nextcloud-talk/src/send.ts +215 -0
  1482. package/extensions/nextcloud-talk/src/signature.ts +72 -0
  1483. package/extensions/nextcloud-talk/src/types.ts +181 -0
  1484. package/extensions/nextcloud-talk/synurex.plugin.json +9 -0
  1485. package/extensions/nostr/CHANGELOG.md +98 -0
  1486. package/extensions/nostr/README.md +136 -0
  1487. package/extensions/nostr/index.ts +68 -0
  1488. package/extensions/nostr/node_modules/.bin/clawdbot +21 -0
  1489. package/extensions/nostr/node_modules/.bin/clawdbot.CMD +12 -0
  1490. package/extensions/nostr/node_modules/.bin/clawdbot.ps1 +41 -0
  1491. package/extensions/nostr/node_modules/.bin/openclaw +21 -0
  1492. package/extensions/nostr/node_modules/.bin/openclaw.CMD +12 -0
  1493. package/extensions/nostr/node_modules/.bin/openclaw.ps1 +41 -0
  1494. package/extensions/nostr/node_modules/.bin/synurex +21 -0
  1495. package/extensions/nostr/node_modules/.bin/synurex.CMD +12 -0
  1496. package/extensions/nostr/node_modules/.bin/synurex.ps1 +41 -0
  1497. package/extensions/nostr/package.json +34 -0
  1498. package/extensions/nostr/src/channel.test.ts +151 -0
  1499. package/extensions/nostr/src/channel.ts +353 -0
  1500. package/extensions/nostr/src/config-schema.ts +90 -0
  1501. package/extensions/nostr/src/metrics.ts +478 -0
  1502. package/extensions/nostr/src/nostr-bus.fuzz.test.ts +533 -0
  1503. package/extensions/nostr/src/nostr-bus.integration.test.ts +448 -0
  1504. package/extensions/nostr/src/nostr-bus.test.ts +199 -0
  1505. package/extensions/nostr/src/nostr-bus.ts +715 -0
  1506. package/extensions/nostr/src/nostr-profile-http.test.ts +378 -0
  1507. package/extensions/nostr/src/nostr-profile-http.ts +546 -0
  1508. package/extensions/nostr/src/nostr-profile-import.test.ts +119 -0
  1509. package/extensions/nostr/src/nostr-profile-import.ts +262 -0
  1510. package/extensions/nostr/src/nostr-profile.fuzz.test.ts +477 -0
  1511. package/extensions/nostr/src/nostr-profile.test.ts +410 -0
  1512. package/extensions/nostr/src/nostr-profile.ts +277 -0
  1513. package/extensions/nostr/src/nostr-state-store.test.ts +131 -0
  1514. package/extensions/nostr/src/nostr-state-store.ts +226 -0
  1515. package/extensions/nostr/src/runtime.ts +14 -0
  1516. package/extensions/nostr/src/seen-tracker.ts +303 -0
  1517. package/extensions/nostr/src/types.test.ts +157 -0
  1518. package/extensions/nostr/src/types.ts +101 -0
  1519. package/extensions/nostr/synurex.plugin.json +9 -0
  1520. package/extensions/nostr/test/setup.ts +5 -0
  1521. package/extensions/open-prose/README.md +25 -0
  1522. package/extensions/open-prose/index.ts +5 -0
  1523. package/extensions/open-prose/node_modules/.bin/clawdbot +21 -0
  1524. package/extensions/open-prose/node_modules/.bin/clawdbot.CMD +12 -0
  1525. package/extensions/open-prose/node_modules/.bin/clawdbot.ps1 +41 -0
  1526. package/extensions/open-prose/node_modules/.bin/openclaw +21 -0
  1527. package/extensions/open-prose/node_modules/.bin/openclaw.CMD +12 -0
  1528. package/extensions/open-prose/node_modules/.bin/openclaw.ps1 +41 -0
  1529. package/extensions/open-prose/node_modules/.bin/synurex +21 -0
  1530. package/extensions/open-prose/node_modules/.bin/synurex.CMD +12 -0
  1531. package/extensions/open-prose/node_modules/.bin/synurex.ps1 +41 -0
  1532. package/extensions/open-prose/package.json +14 -0
  1533. package/extensions/open-prose/skills/prose/LICENSE +21 -0
  1534. package/extensions/open-prose/skills/prose/SKILL.md +323 -0
  1535. package/extensions/open-prose/skills/prose/alt-borges.md +141 -0
  1536. package/extensions/open-prose/skills/prose/alts/arabian-nights.md +358 -0
  1537. package/extensions/open-prose/skills/prose/alts/borges.md +360 -0
  1538. package/extensions/open-prose/skills/prose/alts/folk.md +322 -0
  1539. package/extensions/open-prose/skills/prose/alts/homer.md +346 -0
  1540. package/extensions/open-prose/skills/prose/alts/kafka.md +373 -0
  1541. package/extensions/open-prose/skills/prose/compiler.md +2971 -0
  1542. package/extensions/open-prose/skills/prose/examples/01-hello-world.prose +4 -0
  1543. package/extensions/open-prose/skills/prose/examples/02-research-and-summarize.prose +6 -0
  1544. package/extensions/open-prose/skills/prose/examples/03-code-review.prose +17 -0
  1545. package/extensions/open-prose/skills/prose/examples/04-write-and-refine.prose +14 -0
  1546. package/extensions/open-prose/skills/prose/examples/05-debug-issue.prose +20 -0
  1547. package/extensions/open-prose/skills/prose/examples/06-explain-codebase.prose +17 -0
  1548. package/extensions/open-prose/skills/prose/examples/07-refactor.prose +20 -0
  1549. package/extensions/open-prose/skills/prose/examples/08-blog-post.prose +20 -0
  1550. package/extensions/open-prose/skills/prose/examples/09-research-with-agents.prose +25 -0
  1551. package/extensions/open-prose/skills/prose/examples/10-code-review-agents.prose +32 -0
  1552. package/extensions/open-prose/skills/prose/examples/11-skills-and-imports.prose +27 -0
  1553. package/extensions/open-prose/skills/prose/examples/12-secure-agent-permissions.prose +43 -0
  1554. package/extensions/open-prose/skills/prose/examples/13-variables-and-context.prose +51 -0
  1555. package/extensions/open-prose/skills/prose/examples/14-composition-blocks.prose +48 -0
  1556. package/extensions/open-prose/skills/prose/examples/15-inline-sequences.prose +23 -0
  1557. package/extensions/open-prose/skills/prose/examples/16-parallel-reviews.prose +19 -0
  1558. package/extensions/open-prose/skills/prose/examples/17-parallel-research.prose +19 -0
  1559. package/extensions/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose +36 -0
  1560. package/extensions/open-prose/skills/prose/examples/19-advanced-parallel.prose +71 -0
  1561. package/extensions/open-prose/skills/prose/examples/20-fixed-loops.prose +20 -0
  1562. package/extensions/open-prose/skills/prose/examples/21-pipeline-operations.prose +35 -0
  1563. package/extensions/open-prose/skills/prose/examples/22-error-handling.prose +51 -0
  1564. package/extensions/open-prose/skills/prose/examples/23-retry-with-backoff.prose +63 -0
  1565. package/extensions/open-prose/skills/prose/examples/24-choice-blocks.prose +86 -0
  1566. package/extensions/open-prose/skills/prose/examples/25-conditionals.prose +114 -0
  1567. package/extensions/open-prose/skills/prose/examples/26-parameterized-blocks.prose +100 -0
  1568. package/extensions/open-prose/skills/prose/examples/27-string-interpolation.prose +105 -0
  1569. package/extensions/open-prose/skills/prose/examples/28-automated-pr-review.prose +37 -0
  1570. package/extensions/open-prose/skills/prose/examples/28-gas-town.prose +1572 -0
  1571. package/extensions/open-prose/skills/prose/examples/29-captains-chair.prose +218 -0
  1572. package/extensions/open-prose/skills/prose/examples/30-captains-chair-simple.prose +42 -0
  1573. package/extensions/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose +145 -0
  1574. package/extensions/open-prose/skills/prose/examples/33-pr-review-autofix.prose +168 -0
  1575. package/extensions/open-prose/skills/prose/examples/34-content-pipeline.prose +204 -0
  1576. package/extensions/open-prose/skills/prose/examples/35-feature-factory.prose +296 -0
  1577. package/extensions/open-prose/skills/prose/examples/36-bug-hunter.prose +237 -0
  1578. package/extensions/open-prose/skills/prose/examples/37-the-forge.prose +1474 -0
  1579. package/extensions/open-prose/skills/prose/examples/38-skill-scan.prose +455 -0
  1580. package/extensions/open-prose/skills/prose/examples/39-architect-by-simulation.prose +277 -0
  1581. package/extensions/open-prose/skills/prose/examples/40-rlm-self-refine.prose +32 -0
  1582. package/extensions/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose +38 -0
  1583. package/extensions/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose +46 -0
  1584. package/extensions/open-prose/skills/prose/examples/43-rlm-pairwise.prose +50 -0
  1585. package/extensions/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose +261 -0
  1586. package/extensions/open-prose/skills/prose/examples/45-plugin-release.prose +159 -0
  1587. package/extensions/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose +637 -0
  1588. package/extensions/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose +148 -0
  1589. package/extensions/open-prose/skills/prose/examples/46-workflow-crystallizer.prose +225 -0
  1590. package/extensions/open-prose/skills/prose/examples/47-language-self-improvement.prose +356 -0
  1591. package/extensions/open-prose/skills/prose/examples/48-habit-miner.prose +445 -0
  1592. package/extensions/open-prose/skills/prose/examples/49-prose-run-retrospective.prose +210 -0
  1593. package/extensions/open-prose/skills/prose/examples/README.md +391 -0
  1594. package/extensions/open-prose/skills/prose/examples/roadmap/README.md +22 -0
  1595. package/extensions/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose +20 -0
  1596. package/extensions/open-prose/skills/prose/examples/roadmap/parallel-review.prose +18 -0
  1597. package/extensions/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose +17 -0
  1598. package/extensions/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose +223 -0
  1599. package/extensions/open-prose/skills/prose/guidance/antipatterns.md +951 -0
  1600. package/extensions/open-prose/skills/prose/guidance/patterns.md +700 -0
  1601. package/extensions/open-prose/skills/prose/guidance/system-prompt.md +180 -0
  1602. package/extensions/open-prose/skills/prose/help.md +144 -0
  1603. package/extensions/open-prose/skills/prose/lib/README.md +108 -0
  1604. package/extensions/open-prose/skills/prose/lib/calibrator.prose +215 -0
  1605. package/extensions/open-prose/skills/prose/lib/cost-analyzer.prose +174 -0
  1606. package/extensions/open-prose/skills/prose/lib/error-forensics.prose +250 -0
  1607. package/extensions/open-prose/skills/prose/lib/inspector.prose +196 -0
  1608. package/extensions/open-prose/skills/prose/lib/profiler.prose +460 -0
  1609. package/extensions/open-prose/skills/prose/lib/program-improver.prose +275 -0
  1610. package/extensions/open-prose/skills/prose/lib/project-memory.prose +118 -0
  1611. package/extensions/open-prose/skills/prose/lib/user-memory.prose +93 -0
  1612. package/extensions/open-prose/skills/prose/lib/vm-improver.prose +243 -0
  1613. package/extensions/open-prose/skills/prose/primitives/session.md +593 -0
  1614. package/extensions/open-prose/skills/prose/prose.md +1237 -0
  1615. package/extensions/open-prose/skills/prose/state/filesystem.md +498 -0
  1616. package/extensions/open-prose/skills/prose/state/in-context.md +384 -0
  1617. package/extensions/open-prose/skills/prose/state/postgres.md +880 -0
  1618. package/extensions/open-prose/skills/prose/state/sqlite.md +574 -0
  1619. package/extensions/open-prose/synurex.plugin.json +11 -0
  1620. package/extensions/qwen-portal-auth/README.md +24 -0
  1621. package/extensions/qwen-portal-auth/index.ts +130 -0
  1622. package/extensions/qwen-portal-auth/oauth.ts +190 -0
  1623. package/extensions/qwen-portal-auth/synurex.plugin.json +9 -0
  1624. package/extensions/signal/index.ts +17 -0
  1625. package/extensions/signal/node_modules/.bin/clawdbot +21 -0
  1626. package/extensions/signal/node_modules/.bin/clawdbot.CMD +12 -0
  1627. package/extensions/signal/node_modules/.bin/clawdbot.ps1 +41 -0
  1628. package/extensions/signal/node_modules/.bin/openclaw +21 -0
  1629. package/extensions/signal/node_modules/.bin/openclaw.CMD +12 -0
  1630. package/extensions/signal/node_modules/.bin/openclaw.ps1 +41 -0
  1631. package/extensions/signal/node_modules/.bin/synurex +21 -0
  1632. package/extensions/signal/node_modules/.bin/synurex.CMD +12 -0
  1633. package/extensions/signal/node_modules/.bin/synurex.ps1 +41 -0
  1634. package/extensions/signal/package.json +14 -0
  1635. package/extensions/signal/src/channel.ts +315 -0
  1636. package/extensions/signal/src/runtime.ts +14 -0
  1637. package/extensions/signal/synurex.plugin.json +9 -0
  1638. package/extensions/slack/index.ts +17 -0
  1639. package/extensions/slack/node_modules/.bin/clawdbot +21 -0
  1640. package/extensions/slack/node_modules/.bin/clawdbot.CMD +12 -0
  1641. package/extensions/slack/node_modules/.bin/clawdbot.ps1 +41 -0
  1642. package/extensions/slack/node_modules/.bin/openclaw +21 -0
  1643. package/extensions/slack/node_modules/.bin/openclaw.CMD +12 -0
  1644. package/extensions/slack/node_modules/.bin/openclaw.ps1 +41 -0
  1645. package/extensions/slack/node_modules/.bin/synurex +21 -0
  1646. package/extensions/slack/node_modules/.bin/synurex.CMD +12 -0
  1647. package/extensions/slack/node_modules/.bin/synurex.ps1 +41 -0
  1648. package/extensions/slack/package.json +14 -0
  1649. package/extensions/slack/src/channel.ts +604 -0
  1650. package/extensions/slack/src/runtime.ts +14 -0
  1651. package/extensions/slack/synurex.plugin.json +9 -0
  1652. package/extensions/telegram/index.ts +17 -0
  1653. package/extensions/telegram/node_modules/.bin/clawdbot +21 -0
  1654. package/extensions/telegram/node_modules/.bin/clawdbot.CMD +12 -0
  1655. package/extensions/telegram/node_modules/.bin/clawdbot.ps1 +41 -0
  1656. package/extensions/telegram/node_modules/.bin/openclaw +21 -0
  1657. package/extensions/telegram/node_modules/.bin/openclaw.CMD +12 -0
  1658. package/extensions/telegram/node_modules/.bin/openclaw.ps1 +41 -0
  1659. package/extensions/telegram/node_modules/.bin/synurex +21 -0
  1660. package/extensions/telegram/node_modules/.bin/synurex.CMD +12 -0
  1661. package/extensions/telegram/node_modules/.bin/synurex.ps1 +41 -0
  1662. package/extensions/telegram/package.json +14 -0
  1663. package/extensions/telegram/src/channel.ts +482 -0
  1664. package/extensions/telegram/src/runtime.ts +14 -0
  1665. package/extensions/telegram/synurex.plugin.json +9 -0
  1666. package/extensions/tlon/README.md +5 -0
  1667. package/extensions/tlon/index.ts +17 -0
  1668. package/extensions/tlon/node_modules/.bin/clawdbot +21 -0
  1669. package/extensions/tlon/node_modules/.bin/clawdbot.CMD +12 -0
  1670. package/extensions/tlon/node_modules/.bin/clawdbot.ps1 +41 -0
  1671. package/extensions/tlon/node_modules/.bin/openclaw +21 -0
  1672. package/extensions/tlon/node_modules/.bin/openclaw.CMD +12 -0
  1673. package/extensions/tlon/node_modules/.bin/openclaw.ps1 +41 -0
  1674. package/extensions/tlon/node_modules/.bin/synurex +21 -0
  1675. package/extensions/tlon/node_modules/.bin/synurex.CMD +12 -0
  1676. package/extensions/tlon/node_modules/.bin/synurex.ps1 +41 -0
  1677. package/extensions/tlon/package.json +33 -0
  1678. package/extensions/tlon/src/channel.ts +392 -0
  1679. package/extensions/tlon/src/config-schema.test.ts +31 -0
  1680. package/extensions/tlon/src/config-schema.ts +45 -0
  1681. package/extensions/tlon/src/monitor/discovery.ts +76 -0
  1682. package/extensions/tlon/src/monitor/history.ts +90 -0
  1683. package/extensions/tlon/src/monitor/index.ts +580 -0
  1684. package/extensions/tlon/src/monitor/processed-messages.test.ts +23 -0
  1685. package/extensions/tlon/src/monitor/processed-messages.ts +46 -0
  1686. package/extensions/tlon/src/monitor/utils.ts +106 -0
  1687. package/extensions/tlon/src/onboarding.ts +214 -0
  1688. package/extensions/tlon/src/runtime.ts +14 -0
  1689. package/extensions/tlon/src/targets.ts +89 -0
  1690. package/extensions/tlon/src/types.ts +92 -0
  1691. package/extensions/tlon/src/urbit/auth.ts +18 -0
  1692. package/extensions/tlon/src/urbit/http-api.ts +38 -0
  1693. package/extensions/tlon/src/urbit/send.test.ts +38 -0
  1694. package/extensions/tlon/src/urbit/send.ts +131 -0
  1695. package/extensions/tlon/src/urbit/sse-client.test.ts +40 -0
  1696. package/extensions/tlon/src/urbit/sse-client.ts +395 -0
  1697. package/extensions/tlon/synurex.plugin.json +9 -0
  1698. package/extensions/twitch/CHANGELOG.md +69 -0
  1699. package/extensions/twitch/README.md +89 -0
  1700. package/extensions/twitch/index.ts +20 -0
  1701. package/extensions/twitch/node_modules/.bin/clawdbot +21 -0
  1702. package/extensions/twitch/node_modules/.bin/clawdbot.CMD +12 -0
  1703. package/extensions/twitch/node_modules/.bin/clawdbot.ps1 +41 -0
  1704. package/extensions/twitch/node_modules/.bin/openclaw +21 -0
  1705. package/extensions/twitch/node_modules/.bin/openclaw.CMD +12 -0
  1706. package/extensions/twitch/node_modules/.bin/openclaw.ps1 +41 -0
  1707. package/extensions/twitch/node_modules/.bin/synurex +21 -0
  1708. package/extensions/twitch/node_modules/.bin/synurex.CMD +12 -0
  1709. package/extensions/twitch/node_modules/.bin/synurex.ps1 +41 -0
  1710. package/extensions/twitch/package.json +20 -0
  1711. package/extensions/twitch/src/access-control.test.ts +489 -0
  1712. package/extensions/twitch/src/access-control.ts +166 -0
  1713. package/extensions/twitch/src/actions.ts +173 -0
  1714. package/extensions/twitch/src/client-manager-registry.ts +115 -0
  1715. package/extensions/twitch/src/config-schema.ts +84 -0
  1716. package/extensions/twitch/src/config.test.ts +87 -0
  1717. package/extensions/twitch/src/config.ts +116 -0
  1718. package/extensions/twitch/src/monitor.ts +272 -0
  1719. package/extensions/twitch/src/onboarding.test.ts +311 -0
  1720. package/extensions/twitch/src/onboarding.ts +417 -0
  1721. package/extensions/twitch/src/outbound.test.ts +373 -0
  1722. package/extensions/twitch/src/outbound.ts +184 -0
  1723. package/extensions/twitch/src/plugin.test.ts +39 -0
  1724. package/extensions/twitch/src/plugin.ts +274 -0
  1725. package/extensions/twitch/src/probe.test.ts +195 -0
  1726. package/extensions/twitch/src/probe.ts +120 -0
  1727. package/extensions/twitch/src/resolver.ts +137 -0
  1728. package/extensions/twitch/src/runtime.ts +14 -0
  1729. package/extensions/twitch/src/send.test.ts +289 -0
  1730. package/extensions/twitch/src/send.ts +136 -0
  1731. package/extensions/twitch/src/status.test.ts +270 -0
  1732. package/extensions/twitch/src/status.ts +178 -0
  1733. package/extensions/twitch/src/token.test.ts +171 -0
  1734. package/extensions/twitch/src/token.ts +91 -0
  1735. package/extensions/twitch/src/twitch-client.test.ts +589 -0
  1736. package/extensions/twitch/src/twitch-client.ts +277 -0
  1737. package/extensions/twitch/src/types.ts +143 -0
  1738. package/extensions/twitch/src/utils/markdown.ts +98 -0
  1739. package/extensions/twitch/src/utils/twitch.ts +78 -0
  1740. package/extensions/twitch/synurex.plugin.json +9 -0
  1741. package/extensions/twitch/test/setup.ts +7 -0
  1742. package/extensions/voice-call/CHANGELOG.md +133 -0
  1743. package/extensions/voice-call/README.md +139 -0
  1744. package/extensions/voice-call/index.ts +493 -0
  1745. package/extensions/voice-call/node_modules/.bin/clawdbot +21 -0
  1746. package/extensions/voice-call/node_modules/.bin/clawdbot.CMD +12 -0
  1747. package/extensions/voice-call/node_modules/.bin/clawdbot.ps1 +41 -0
  1748. package/extensions/voice-call/node_modules/.bin/openclaw +21 -0
  1749. package/extensions/voice-call/node_modules/.bin/openclaw.CMD +12 -0
  1750. package/extensions/voice-call/node_modules/.bin/openclaw.ps1 +41 -0
  1751. package/extensions/voice-call/node_modules/.bin/synurex +21 -0
  1752. package/extensions/voice-call/node_modules/.bin/synurex.CMD +12 -0
  1753. package/extensions/voice-call/node_modules/.bin/synurex.ps1 +41 -0
  1754. package/extensions/voice-call/package.json +19 -0
  1755. package/extensions/voice-call/src/allowlist.ts +19 -0
  1756. package/extensions/voice-call/src/cli.ts +279 -0
  1757. package/extensions/voice-call/src/config.test.ts +234 -0
  1758. package/extensions/voice-call/src/config.ts +523 -0
  1759. package/extensions/voice-call/src/core-bridge.ts +159 -0
  1760. package/extensions/voice-call/src/manager/context.ts +21 -0
  1761. package/extensions/voice-call/src/manager/events.ts +188 -0
  1762. package/extensions/voice-call/src/manager/lookup.ts +35 -0
  1763. package/extensions/voice-call/src/manager/outbound.ts +275 -0
  1764. package/extensions/voice-call/src/manager/state.ts +48 -0
  1765. package/extensions/voice-call/src/manager/store.ts +91 -0
  1766. package/extensions/voice-call/src/manager/timers.ts +89 -0
  1767. package/extensions/voice-call/src/manager/twiml.ts +9 -0
  1768. package/extensions/voice-call/src/manager.test.ts +224 -0
  1769. package/extensions/voice-call/src/manager.ts +887 -0
  1770. package/extensions/voice-call/src/media-stream.test.ts +96 -0
  1771. package/extensions/voice-call/src/media-stream.ts +411 -0
  1772. package/extensions/voice-call/src/providers/base.ts +67 -0
  1773. package/extensions/voice-call/src/providers/index.ts +10 -0
  1774. package/extensions/voice-call/src/providers/mock.ts +165 -0
  1775. package/extensions/voice-call/src/providers/plivo.test.ts +27 -0
  1776. package/extensions/voice-call/src/providers/plivo.ts +515 -0
  1777. package/extensions/voice-call/src/providers/stt-openai-realtime.ts +311 -0
  1778. package/extensions/voice-call/src/providers/telnyx.ts +371 -0
  1779. package/extensions/voice-call/src/providers/tts-openai.ts +259 -0
  1780. package/extensions/voice-call/src/providers/twilio/api.ts +42 -0
  1781. package/extensions/voice-call/src/providers/twilio/webhook.ts +32 -0
  1782. package/extensions/voice-call/src/providers/twilio.test.ts +60 -0
  1783. package/extensions/voice-call/src/providers/twilio.ts +626 -0
  1784. package/extensions/voice-call/src/response-generator.ts +158 -0
  1785. package/extensions/voice-call/src/runtime.ts +212 -0
  1786. package/extensions/voice-call/src/telephony-audio.ts +90 -0
  1787. package/extensions/voice-call/src/telephony-tts.ts +104 -0
  1788. package/extensions/voice-call/src/tunnel.ts +314 -0
  1789. package/extensions/voice-call/src/types.ts +272 -0
  1790. package/extensions/voice-call/src/utils.ts +14 -0
  1791. package/extensions/voice-call/src/voice-mapping.ts +67 -0
  1792. package/extensions/voice-call/src/webhook-security.test.ts +377 -0
  1793. package/extensions/voice-call/src/webhook-security.ts +689 -0
  1794. package/extensions/voice-call/src/webhook.ts +516 -0
  1795. package/extensions/voice-call/synurex.plugin.json +559 -0
  1796. package/extensions/whatsapp/index.ts +17 -0
  1797. package/extensions/whatsapp/node_modules/.bin/clawdbot +21 -0
  1798. package/extensions/whatsapp/node_modules/.bin/clawdbot.CMD +12 -0
  1799. package/extensions/whatsapp/node_modules/.bin/clawdbot.ps1 +41 -0
  1800. package/extensions/whatsapp/node_modules/.bin/openclaw +21 -0
  1801. package/extensions/whatsapp/node_modules/.bin/openclaw.CMD +12 -0
  1802. package/extensions/whatsapp/node_modules/.bin/openclaw.ps1 +41 -0
  1803. package/extensions/whatsapp/node_modules/.bin/synurex +21 -0
  1804. package/extensions/whatsapp/node_modules/.bin/synurex.CMD +12 -0
  1805. package/extensions/whatsapp/node_modules/.bin/synurex.ps1 +41 -0
  1806. package/extensions/whatsapp/package.json +14 -0
  1807. package/extensions/whatsapp/src/channel.ts +508 -0
  1808. package/extensions/whatsapp/src/runtime.ts +14 -0
  1809. package/extensions/whatsapp/synurex.plugin.json +9 -0
  1810. package/extensions/zalo/CHANGELOG.md +113 -0
  1811. package/extensions/zalo/README.md +50 -0
  1812. package/extensions/zalo/index.ts +19 -0
  1813. package/extensions/zalo/node_modules/.bin/clawdbot +21 -0
  1814. package/extensions/zalo/node_modules/.bin/clawdbot.CMD +12 -0
  1815. package/extensions/zalo/node_modules/.bin/clawdbot.ps1 +41 -0
  1816. package/extensions/zalo/node_modules/.bin/openclaw +21 -0
  1817. package/extensions/zalo/node_modules/.bin/openclaw.CMD +12 -0
  1818. package/extensions/zalo/node_modules/.bin/openclaw.ps1 +41 -0
  1819. package/extensions/zalo/node_modules/.bin/synurex +21 -0
  1820. package/extensions/zalo/node_modules/.bin/synurex.CMD +12 -0
  1821. package/extensions/zalo/node_modules/.bin/synurex.ps1 +41 -0
  1822. package/extensions/zalo/package.json +36 -0
  1823. package/extensions/zalo/src/accounts.ts +80 -0
  1824. package/extensions/zalo/src/actions.ts +67 -0
  1825. package/extensions/zalo/src/api.ts +208 -0
  1826. package/extensions/zalo/src/channel.directory.test.ts +43 -0
  1827. package/extensions/zalo/src/channel.ts +414 -0
  1828. package/extensions/zalo/src/config-schema.ts +25 -0
  1829. package/extensions/zalo/src/monitor.ts +764 -0
  1830. package/extensions/zalo/src/monitor.webhook.test.ts +73 -0
  1831. package/extensions/zalo/src/onboarding.ts +401 -0
  1832. package/extensions/zalo/src/probe.ts +46 -0
  1833. package/extensions/zalo/src/proxy.ts +21 -0
  1834. package/extensions/zalo/src/runtime.ts +14 -0
  1835. package/extensions/zalo/src/send.ts +124 -0
  1836. package/extensions/zalo/src/status-issues.ts +53 -0
  1837. package/extensions/zalo/src/token.ts +63 -0
  1838. package/extensions/zalo/src/types.ts +44 -0
  1839. package/extensions/zalo/synurex.plugin.json +9 -0
  1840. package/extensions/zalouser/CHANGELOG.md +85 -0
  1841. package/extensions/zalouser/README.md +225 -0
  1842. package/extensions/zalouser/index.ts +31 -0
  1843. package/extensions/zalouser/node_modules/.bin/clawdbot +21 -0
  1844. package/extensions/zalouser/node_modules/.bin/clawdbot.CMD +12 -0
  1845. package/extensions/zalouser/node_modules/.bin/clawdbot.ps1 +41 -0
  1846. package/extensions/zalouser/node_modules/.bin/openclaw +21 -0
  1847. package/extensions/zalouser/node_modules/.bin/openclaw.CMD +12 -0
  1848. package/extensions/zalouser/node_modules/.bin/openclaw.ps1 +41 -0
  1849. package/extensions/zalouser/node_modules/.bin/synurex +21 -0
  1850. package/extensions/zalouser/node_modules/.bin/synurex.CMD +12 -0
  1851. package/extensions/zalouser/node_modules/.bin/synurex.ps1 +41 -0
  1852. package/extensions/zalouser/package.json +36 -0
  1853. package/extensions/zalouser/src/accounts.ts +135 -0
  1854. package/extensions/zalouser/src/channel.test.ts +18 -0
  1855. package/extensions/zalouser/src/channel.ts +686 -0
  1856. package/extensions/zalouser/src/config-schema.ts +28 -0
  1857. package/extensions/zalouser/src/monitor.ts +601 -0
  1858. package/extensions/zalouser/src/onboarding.ts +504 -0
  1859. package/extensions/zalouser/src/probe.ts +28 -0
  1860. package/extensions/zalouser/src/runtime.ts +14 -0
  1861. package/extensions/zalouser/src/send.ts +160 -0
  1862. package/extensions/zalouser/src/status-issues.test.ts +57 -0
  1863. package/extensions/zalouser/src/status-issues.ts +89 -0
  1864. package/extensions/zalouser/src/tool.ts +164 -0
  1865. package/extensions/zalouser/src/types.ts +110 -0
  1866. package/extensions/zalouser/src/zca.ts +202 -0
  1867. package/extensions/zalouser/synurex.plugin.json +9 -0
  1868. package/package.json +263 -0
  1869. package/skills/1password/SKILL.md +70 -0
  1870. package/skills/1password/references/cli-examples.md +29 -0
  1871. package/skills/1password/references/get-started.md +17 -0
  1872. package/skills/apple-notes/SKILL.md +77 -0
  1873. package/skills/apple-reminders/SKILL.md +96 -0
  1874. package/skills/bear-notes/SKILL.md +107 -0
  1875. package/skills/blogwatcher/SKILL.md +69 -0
  1876. package/skills/blucli/SKILL.md +47 -0
  1877. package/skills/bluebubbles/SKILL.md +131 -0
  1878. package/skills/camsnap/SKILL.md +45 -0
  1879. package/skills/canvas/SKILL.md +198 -0
  1880. package/skills/clawhub/SKILL.md +77 -0
  1881. package/skills/coding-agent/SKILL.md +284 -0
  1882. package/skills/discord/SKILL.md +578 -0
  1883. package/skills/eightctl/SKILL.md +50 -0
  1884. package/skills/food-order/SKILL.md +48 -0
  1885. package/skills/gemini/SKILL.md +43 -0
  1886. package/skills/gifgrep/SKILL.md +79 -0
  1887. package/skills/github/SKILL.md +77 -0
  1888. package/skills/gog/SKILL.md +116 -0
  1889. package/skills/goplaces/SKILL.md +52 -0
  1890. package/skills/healthcheck/SKILL.md +245 -0
  1891. package/skills/himalaya/SKILL.md +257 -0
  1892. package/skills/himalaya/references/configuration.md +184 -0
  1893. package/skills/himalaya/references/message-composition.md +199 -0
  1894. package/skills/imsg/SKILL.md +74 -0
  1895. package/skills/local-places/SERVER_README.md +101 -0
  1896. package/skills/local-places/SKILL.md +102 -0
  1897. package/skills/local-places/pyproject.toml +21 -0
  1898. package/skills/local-places/src/local_places/__init__.py +2 -0
  1899. package/skills/local-places/src/local_places/google_places.py +314 -0
  1900. package/skills/local-places/src/local_places/main.py +65 -0
  1901. package/skills/local-places/src/local_places/schemas.py +107 -0
  1902. package/skills/mcporter/SKILL.md +61 -0
  1903. package/skills/model-usage/SKILL.md +69 -0
  1904. package/skills/model-usage/references/codexbar-cli.md +33 -0
  1905. package/skills/model-usage/scripts/model_usage.py +310 -0
  1906. package/skills/nano-banana-pro/SKILL.md +58 -0
  1907. package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
  1908. package/skills/nano-pdf/SKILL.md +38 -0
  1909. package/skills/notion/SKILL.md +172 -0
  1910. package/skills/obsidian/SKILL.md +81 -0
  1911. package/skills/openai-image-gen/SKILL.md +89 -0
  1912. package/skills/openai-image-gen/scripts/gen.py +240 -0
  1913. package/skills/openai-whisper/SKILL.md +38 -0
  1914. package/skills/openai-whisper-api/SKILL.md +52 -0
  1915. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  1916. package/skills/openhue/SKILL.md +51 -0
  1917. package/skills/oracle/SKILL.md +125 -0
  1918. package/skills/ordercli/SKILL.md +78 -0
  1919. package/skills/peekaboo/SKILL.md +190 -0
  1920. package/skills/sag/SKILL.md +87 -0
  1921. package/skills/session-logs/SKILL.md +115 -0
  1922. package/skills/sherpa-onnx-tts/SKILL.md +103 -0
  1923. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  1924. package/skills/skill-creator/SKILL.md +370 -0
  1925. package/skills/skill-creator/license.txt +202 -0
  1926. package/skills/skill-creator/scripts/init_skill.py +378 -0
  1927. package/skills/skill-creator/scripts/package_skill.py +111 -0
  1928. package/skills/skill-creator/scripts/quick_validate.py +101 -0
  1929. package/skills/slack/SKILL.md +144 -0
  1930. package/skills/songsee/SKILL.md +49 -0
  1931. package/skills/sonoscli/SKILL.md +46 -0
  1932. package/skills/spotify-player/SKILL.md +64 -0
  1933. package/skills/summarize/SKILL.md +87 -0
  1934. package/skills/things-mac/SKILL.md +86 -0
  1935. package/skills/tmux/SKILL.md +135 -0
  1936. package/skills/tmux/scripts/find-sessions.sh +112 -0
  1937. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  1938. package/skills/trello/SKILL.md +95 -0
  1939. package/skills/video-frames/SKILL.md +46 -0
  1940. package/skills/video-frames/scripts/frame.sh +81 -0
  1941. package/skills/voice-call/SKILL.md +45 -0
  1942. package/skills/wacli/SKILL.md +72 -0
  1943. package/skills/weather/SKILL.md +54 -0
  1944. package/synurex.mjs +33 -0
@@ -0,0 +1,3177 @@
1
+ import { I as DEFAULT_GATEWAY_PORT, O as isRich, W as resolveGatewayPort, k as theme, m as restoreTerminalState, p as defaultRuntime, y as info } from "./entry.js";
2
+ import { N as resolveConfiguredModelRef, _ as ensureAuthProfileStore, bt as DEFAULT_PROVIDER, vt as DEFAULT_CONTEXT_TOKENS, yt as DEFAULT_MODEL } from "./auth-profiles-xwZAMwdh.js";
3
+ import { r as resolveCliName, t as formatCliCommand } from "./command-format-DUskR3Ej.js";
4
+ import { l as normalizeAgentId, v as parseAgentSessionKey } from "./session-key-n2HVbrj0.js";
5
+ import { m as resolveUserPath } from "./utils-DBu98aoz.js";
6
+ import { n as runExec } from "./exec-B8JKbXKW.js";
7
+ import { t as resolveSynurexPackageRoot } from "./Synurex-root-CwTH98Xq.js";
8
+ import { c as resolveDefaultAgentId, h as DEFAULT_IDENTITY_FILENAME, p as DEFAULT_BOOTSTRAP_FILENAME, r as resolveAgentDir, s as resolveAgentWorkspaceDir } from "./agent-scope-DNmzkYn4.js";
9
+ import { c as writeConfigFile, i as loadConfig, j as VERSION, o as readConfigFileSnapshot } from "./config-BBxxzNm-.js";
10
+ import { f as inspectPortUsage, m as formatPortDiagnostics } from "./errors-C8t2PjW_.js";
11
+ import { a as findTailscaleBinary, o as getTailnetHostname, s as readTailscaleStatusJson } from "./tailscale-9MusRvOi.js";
12
+ import { n as callGateway, t as buildGatewayConnectionDetails } from "./call-BJsfB_NC.js";
13
+ import { n as listChannelPlugins } from "./plugins-C1mc_xWv.js";
14
+ import { $t as listAgentsForGateway, At as sha256HexPrefix, Fn as readRestartSentinel, In as summarizeRestartSentinel, Mr as getMemorySearchManager, Xt as formatUsageReportLines, Yt as loadProviderUsageSummary, Zn as peekSystemEvents, _ as randomToken, a as applyWizardMetadata, b as summarizeExistingConfig, c as ensureWorkspaceAndSessions, d as handleReset, dn as lookupContextTokens, g as probeGatewayReachable, h as printWizardHeader, i as DEFAULT_WORKSPACE, l as formatControlUiSshHint, m as openUrl, p as normalizeGatewayTokenInput, q as getRemoteSkillEligibility, s as detectBrowserOpenSupport, v as resolveControlUiLinks, w as normalizeControlUiBasePath, x as waitForGatewayReachable } from "./loader-ysGIXyYq.js";
15
+ import { n as withProgress } from "./progress-Bcjniu7m.js";
16
+ import { t as WizardCancelledError } from "./prompts-CudpZgTI.js";
17
+ import { t as resolveChannelDefaultAccountId } from "./helpers-DMlRCrD6.js";
18
+ import { n as setupChannels } from "./onboard-channels-CSGrNeHm.js";
19
+ import { o as resolveStorePath } from "./paths-Cn5vXlEi.js";
20
+ import { I as resolveMainSessionKey, d as loadSessionStore } from "./sandbox-DfBaWfDh.js";
21
+ import { t as buildChannelSummary } from "./channel-summary-Cw9cmi4M.js";
22
+ import { t as collectChannelStatusIssues } from "./channels-status-issues-CgVNTMMz.js";
23
+ import { r as installCompletion } from "./completion-cli-BhVl7J3C.js";
24
+ import { a as gatewayInstallErrorHint, i as buildGatewayInstallPlan, n as GATEWAY_DAEMON_RUNTIME_OPTIONS, t as DEFAULT_GATEWAY_DAEMON_RUNTIME } from "./daemon-runtime-BlKOqOPH.js";
25
+ import { o as resolveGatewayLogPaths, t as resolveGatewayService } from "./service-sZqtAG53.js";
26
+ import { r as isSystemdUserServiceAvailable } from "./systemd-Gt0riLnX.js";
27
+ import { o as readLastGatewayErrorLine } from "./service-audit-DBdadurs.js";
28
+ import { t as renderTable } from "./table-BzJyfJCd.js";
29
+ import { i as probeGateway, t as runSecurityAudit } from "./audit--oGM5x0J.js";
30
+ import { d as applyAuthChoice, h as promptAuthChoiceGrouped, l as resolvePreferredProviderForAuthChoice, o as applyPrimaryModel, r as promptRemoteGatewayConfig, s as promptDefaultModel, t as setupSkills, u as warnIfModelConfigLooksOff } from "./onboard-skills-Z3OoXEqp.js";
31
+ import { l as healthCommand, n as ensureControlUiAssetsBuilt, s as formatHealthChannelLines, t as formatHealthCheckFailure, u as resolveHeartbeatSummaryForAgent } from "./health-format-KsXnqZiA.js";
32
+ import { C as resolveEffectiveUpdateChannel, S as normalizeUpdateChannel, c as formatUpdateOneLiner, d as checkShellCompletionStatus, h as compareSemverStrings, l as getUpdateCheckResult, m as checkUpdateStatus, p as ensureCompletionCacheExists, s as formatUpdateAvailableHint, u as resolveUpdateAvailability, x as formatUpdateChannelLabel } from "./update-runner-CmdPxJg5.js";
33
+ import { n as logConfigUpdated } from "./logging-CzN9OPmT.js";
34
+ import { t as buildWorkspaceHookStatus } from "./hooks-status-DQRtaH38.js";
35
+ import { t as buildWorkspaceSkillStatus } from "./skills-status-DQyBTrvU.js";
36
+ import { t as runTui } from "./tui-BniTBjBP.js";
37
+ import { t as resolveNodeService } from "./node-service-CmyQuldc.js";
38
+ import { i as redactSecrets, n as formatDuration$1, r as formatGatewayAuthUsed, t as formatAge$1 } from "./format-tlvh4-cQ.js";
39
+ import { spawnSync } from "node:child_process";
40
+ import path from "node:path";
41
+ import os from "node:os";
42
+ import fs from "node:fs";
43
+ import fs$1 from "node:fs/promises";
44
+
45
+ //#region src/commands/onboard-hooks.ts
46
+ async function setupInternalHooks(cfg, runtime, prompter) {
47
+ await prompter.note([
48
+ "Hooks let you automate actions when agent commands are issued.",
49
+ "Example: Save session context to memory when you issue /new.",
50
+ "",
51
+ "Learn more: https://docs.synurex.com/hooks"
52
+ ].join("\n"), "Hooks");
53
+ const eligibleHooks = buildWorkspaceHookStatus(resolveAgentWorkspaceDir(cfg, resolveDefaultAgentId(cfg)), { config: cfg }).hooks.filter((h) => h.eligible);
54
+ if (eligibleHooks.length === 0) {
55
+ await prompter.note("No eligible hooks found. You can configure hooks later in your config.", "No Hooks Available");
56
+ return cfg;
57
+ }
58
+ const selected = (await prompter.multiselect({
59
+ message: "Enable hooks?",
60
+ options: [{
61
+ value: "__skip__",
62
+ label: "Skip for now"
63
+ }, ...eligibleHooks.map((hook) => ({
64
+ value: hook.name,
65
+ label: `${hook.emoji ?? "🔗"} ${hook.name}`,
66
+ hint: hook.description
67
+ }))]
68
+ })).filter((name) => name !== "__skip__");
69
+ if (selected.length === 0) return cfg;
70
+ const entries = { ...cfg.hooks?.internal?.entries };
71
+ for (const name of selected) entries[name] = { enabled: true };
72
+ const next = {
73
+ ...cfg,
74
+ hooks: {
75
+ ...cfg.hooks,
76
+ internal: {
77
+ enabled: true,
78
+ entries
79
+ }
80
+ }
81
+ };
82
+ await prompter.note([
83
+ `Enabled ${selected.length} hook${selected.length > 1 ? "s" : ""}: ${selected.join(", ")}`,
84
+ "",
85
+ "You can manage hooks later with:",
86
+ ` ${formatCliCommand("synurex hooks list")}`,
87
+ ` ${formatCliCommand("synurex hooks enable <name>")}`,
88
+ ` ${formatCliCommand("synurex hooks disable <name>")}`
89
+ ].join("\n"), "Hooks Configured");
90
+ return next;
91
+ }
92
+
93
+ //#endregion
94
+ //#region src/wizard/onboarding.finalize.ts
95
+ async function finalizeOnboardingWizard(options) {
96
+ const { flow, opts, baseConfig, nextConfig, settings, prompter, runtime } = options;
97
+ const withWizardProgress = async (label, options, work) => {
98
+ const progress = prompter.progress(label);
99
+ try {
100
+ return await work(progress);
101
+ } finally {
102
+ progress.stop(options.doneMessage);
103
+ }
104
+ };
105
+ const systemdAvailable = process.platform === "linux" ? await isSystemdUserServiceAvailable() : true;
106
+ if (process.platform === "linux" && !systemdAvailable) await prompter.note("Systemd user services are unavailable. Skipping lingering checks and service install.", "Systemd");
107
+ if (process.platform === "linux" && systemdAvailable) {
108
+ const { ensureSystemdUserLingerInteractive } = await import("./systemd-linger-DS0IcHsk.js").then((n) => n.r);
109
+ await ensureSystemdUserLingerInteractive({
110
+ runtime,
111
+ prompter: {
112
+ confirm: prompter.confirm,
113
+ note: prompter.note
114
+ },
115
+ reason: "Linux installs use a systemd user service by default. Without lingering, systemd stops the user session on logout/idle and kills the Gateway.",
116
+ requireConfirm: false
117
+ });
118
+ }
119
+ const explicitInstallDaemon = typeof opts.installDaemon === "boolean" ? opts.installDaemon : void 0;
120
+ let installDaemon;
121
+ if (explicitInstallDaemon !== void 0) installDaemon = explicitInstallDaemon;
122
+ else if (process.platform === "linux" && !systemdAvailable) installDaemon = false;
123
+ else if (flow === "quickstart") installDaemon = true;
124
+ else installDaemon = await prompter.confirm({
125
+ message: "Install Gateway service (recommended)",
126
+ initialValue: true
127
+ });
128
+ if (process.platform === "linux" && !systemdAvailable && installDaemon) {
129
+ await prompter.note("Systemd user services are unavailable; skipping service install. Use your container supervisor or `docker compose up -d`.", "Gateway service");
130
+ installDaemon = false;
131
+ }
132
+ if (installDaemon) {
133
+ const daemonRuntime = flow === "quickstart" ? DEFAULT_GATEWAY_DAEMON_RUNTIME : await prompter.select({
134
+ message: "Gateway service runtime",
135
+ options: GATEWAY_DAEMON_RUNTIME_OPTIONS,
136
+ initialValue: opts.daemonRuntime ?? DEFAULT_GATEWAY_DAEMON_RUNTIME
137
+ });
138
+ if (flow === "quickstart") await prompter.note("QuickStart uses Node for the Gateway service (stable + supported).", "Gateway service runtime");
139
+ const service = resolveGatewayService();
140
+ const loaded = await service.isLoaded({ env: process.env });
141
+ if (loaded) {
142
+ const action = await prompter.select({
143
+ message: "Gateway service already installed",
144
+ options: [
145
+ {
146
+ value: "restart",
147
+ label: "Restart"
148
+ },
149
+ {
150
+ value: "reinstall",
151
+ label: "Reinstall"
152
+ },
153
+ {
154
+ value: "skip",
155
+ label: "Skip"
156
+ }
157
+ ]
158
+ });
159
+ if (action === "restart") await withWizardProgress("Gateway service", { doneMessage: "Gateway service restarted." }, async (progress) => {
160
+ progress.update("Restarting Gateway service…");
161
+ await service.restart({
162
+ env: process.env,
163
+ stdout: process.stdout
164
+ });
165
+ });
166
+ else if (action === "reinstall") await withWizardProgress("Gateway service", { doneMessage: "Gateway service uninstalled." }, async (progress) => {
167
+ progress.update("Uninstalling Gateway service…");
168
+ await service.uninstall({
169
+ env: process.env,
170
+ stdout: process.stdout
171
+ });
172
+ });
173
+ }
174
+ if (!loaded || loaded && !await service.isLoaded({ env: process.env })) {
175
+ const progress = prompter.progress("Gateway service");
176
+ let installError = null;
177
+ try {
178
+ progress.update("Preparing Gateway service…");
179
+ const { programArguments, workingDirectory, environment } = await buildGatewayInstallPlan({
180
+ env: process.env,
181
+ port: settings.port,
182
+ token: settings.gatewayToken,
183
+ runtime: daemonRuntime,
184
+ warn: (message, title) => prompter.note(message, title),
185
+ config: nextConfig
186
+ });
187
+ progress.update("Installing Gateway service…");
188
+ await service.install({
189
+ env: process.env,
190
+ stdout: process.stdout,
191
+ programArguments,
192
+ workingDirectory,
193
+ environment
194
+ });
195
+ } catch (err) {
196
+ installError = err instanceof Error ? err.message : String(err);
197
+ } finally {
198
+ progress.stop(installError ? "Gateway service install failed." : "Gateway service installed.");
199
+ }
200
+ if (installError) {
201
+ await prompter.note(`Gateway service install failed: ${installError}`, "Gateway");
202
+ await prompter.note(gatewayInstallErrorHint(), "Gateway");
203
+ }
204
+ }
205
+ }
206
+ if (!opts.skipHealth) {
207
+ await waitForGatewayReachable({
208
+ url: resolveControlUiLinks({
209
+ bind: nextConfig.gateway?.bind ?? "loopback",
210
+ port: settings.port,
211
+ customBindHost: nextConfig.gateway?.customBindHost,
212
+ basePath: void 0
213
+ }).wsUrl,
214
+ token: settings.gatewayToken,
215
+ deadlineMs: 15e3
216
+ });
217
+ try {
218
+ await healthCommand({
219
+ json: false,
220
+ timeoutMs: 1e4
221
+ }, runtime);
222
+ } catch (err) {
223
+ runtime.error(formatHealthCheckFailure(err));
224
+ await prompter.note([
225
+ "Docs:",
226
+ "https://docs.synurex.com/gateway/health",
227
+ "https://docs.synurex.com/gateway/troubleshooting"
228
+ ].join("\n"), "Health check help");
229
+ }
230
+ }
231
+ const controlUiEnabled = nextConfig.gateway?.controlUi?.enabled ?? baseConfig.gateway?.controlUi?.enabled ?? true;
232
+ if (!opts.skipUi && controlUiEnabled) {
233
+ const controlUiAssets = await ensureControlUiAssetsBuilt(runtime);
234
+ if (!controlUiAssets.ok && controlUiAssets.message) runtime.error(controlUiAssets.message);
235
+ }
236
+ await prompter.note([
237
+ "Add nodes for extra features:",
238
+ "- macOS app (system + notifications)",
239
+ "- iOS app (camera/canvas)",
240
+ "- Android app (camera/canvas)"
241
+ ].join("\n"), "Optional apps");
242
+ const controlUiBasePath = nextConfig.gateway?.controlUi?.basePath ?? baseConfig.gateway?.controlUi?.basePath;
243
+ const links = resolveControlUiLinks({
244
+ bind: settings.bind,
245
+ port: settings.port,
246
+ customBindHost: settings.customBindHost,
247
+ basePath: controlUiBasePath
248
+ });
249
+ const authedUrl = settings.authMode === "token" && settings.gatewayToken ? `${links.httpUrl}#token=${encodeURIComponent(settings.gatewayToken)}` : links.httpUrl;
250
+ const gatewayProbe = await probeGatewayReachable({
251
+ url: links.wsUrl,
252
+ token: settings.authMode === "token" ? settings.gatewayToken : void 0,
253
+ password: settings.authMode === "password" ? nextConfig.gateway?.auth?.password : ""
254
+ });
255
+ const gatewayStatusLine = gatewayProbe.ok ? "Gateway: reachable" : `Gateway: not detected${gatewayProbe.detail ? ` (${gatewayProbe.detail})` : ""}`;
256
+ const bootstrapPath = path.join(resolveUserPath(options.workspaceDir), DEFAULT_BOOTSTRAP_FILENAME);
257
+ const hasBootstrap = await fs$1.access(bootstrapPath).then(() => true).catch(() => false);
258
+ await prompter.note([
259
+ `Web UI: ${links.httpUrl}`,
260
+ settings.authMode === "token" && settings.gatewayToken ? `Web UI (with token): ${authedUrl}` : void 0,
261
+ `Gateway WS: ${links.wsUrl}`,
262
+ gatewayStatusLine,
263
+ "Docs: https://docs.synurex.com/web/control-ui"
264
+ ].filter(Boolean).join("\n"), "Control UI");
265
+ let controlUiOpened = false;
266
+ let controlUiOpenHint;
267
+ let hatchChoice = null;
268
+ let launchedTui = false;
269
+ if (!opts.skipUi && gatewayProbe.ok) {
270
+ if (hasBootstrap) await prompter.note([
271
+ "This is the defining action that makes your agent you.",
272
+ "Please take your time.",
273
+ "The more you tell it, the better the experience will be.",
274
+ "We will send: \"Wake up, my friend!\""
275
+ ].join("\n"), "Start TUI (best option!)");
276
+ await prompter.note([
277
+ "Gateway token: shared auth for the Gateway + Control UI.",
278
+ "Stored in: ~/.synurex/synurex.json (gateway.auth.token) or SYNUREX_GATEWAY_TOKEN.",
279
+ `View token: ${formatCliCommand("synurex config get gateway.auth.token")}`,
280
+ `Generate token: ${formatCliCommand("synurex doctor --generate-gateway-token")}`,
281
+ "Web UI stores a copy in this browser's localStorage (Synurex.control.settings.v1).",
282
+ `Open the dashboard anytime: ${formatCliCommand("synurex dashboard --no-open")}`,
283
+ "If prompted: paste the token into Control UI settings (or use the tokenized dashboard URL)."
284
+ ].join("\n"), "Token");
285
+ hatchChoice = await prompter.select({
286
+ message: "How do you want to hatch your bot?",
287
+ options: [
288
+ {
289
+ value: "tui",
290
+ label: "Hatch in TUI (recommended)"
291
+ },
292
+ {
293
+ value: "web",
294
+ label: "Open the Web UI"
295
+ },
296
+ {
297
+ value: "later",
298
+ label: "Do this later"
299
+ }
300
+ ],
301
+ initialValue: "tui"
302
+ });
303
+ if (hatchChoice === "tui") {
304
+ restoreTerminalState("pre-onboarding tui");
305
+ await runTui({
306
+ url: links.wsUrl,
307
+ token: settings.authMode === "token" ? settings.gatewayToken : void 0,
308
+ password: settings.authMode === "password" ? nextConfig.gateway?.auth?.password : "",
309
+ deliver: false,
310
+ message: hasBootstrap ? "Wake up, my friend!" : void 0
311
+ });
312
+ launchedTui = true;
313
+ } else if (hatchChoice === "web") {
314
+ if ((await detectBrowserOpenSupport()).ok) {
315
+ controlUiOpened = await openUrl(authedUrl);
316
+ if (!controlUiOpened) controlUiOpenHint = formatControlUiSshHint({
317
+ port: settings.port,
318
+ basePath: controlUiBasePath,
319
+ token: settings.authMode === "token" ? settings.gatewayToken : void 0
320
+ });
321
+ } else controlUiOpenHint = formatControlUiSshHint({
322
+ port: settings.port,
323
+ basePath: controlUiBasePath,
324
+ token: settings.authMode === "token" ? settings.gatewayToken : void 0
325
+ });
326
+ await prompter.note([
327
+ `Dashboard link (with token): ${authedUrl}`,
328
+ controlUiOpened ? "Opened in your browser. Keep that tab to control Synurex." : "Copy/paste this URL in a browser on this machine to control Synurex.",
329
+ controlUiOpenHint
330
+ ].filter(Boolean).join("\n"), "Dashboard ready");
331
+ } else await prompter.note(`When you're ready: ${formatCliCommand("synurex dashboard --no-open")}`, "Later");
332
+ } else if (opts.skipUi) await prompter.note("Skipping Control UI/TUI prompts.", "Control UI");
333
+ await prompter.note(["Back up your agent workspace.", "Docs: https://docs.synurex.com/concepts/agent-workspace"].join("\n"), "Workspace backup");
334
+ await prompter.note("Running agents on your computer is risky — harden your setup: https://docs.synurex.com/security", "Security");
335
+ const cliName = resolveCliName();
336
+ const completionStatus = await checkShellCompletionStatus(cliName);
337
+ if (completionStatus.usesSlowPattern) {
338
+ if (await ensureCompletionCacheExists(cliName)) await installCompletion(completionStatus.shell, true, cliName);
339
+ } else if (completionStatus.profileInstalled && !completionStatus.cacheExists) await ensureCompletionCacheExists(cliName);
340
+ else if (!completionStatus.profileInstalled) {
341
+ if (await prompter.confirm({
342
+ message: `Enable ${completionStatus.shell} shell completion for ${cliName}?`,
343
+ initialValue: true
344
+ })) if (await ensureCompletionCacheExists(cliName)) {
345
+ await installCompletion(completionStatus.shell, true, cliName);
346
+ const profileHint = completionStatus.shell === "zsh" ? "~/.zshrc" : completionStatus.shell === "bash" ? "~/.bashrc" : "~/.config/fish/config.fish";
347
+ await prompter.note(`Shell completion installed. Restart your shell or run: source ${profileHint}`, "Shell completion");
348
+ } else await prompter.note(`Failed to generate completion cache. Run \`${cliName} completion --install\` later.`, "Shell completion");
349
+ }
350
+ if (!opts.skipUi && settings.authMode === "token" && Boolean(settings.gatewayToken) && hatchChoice === null) {
351
+ if ((await detectBrowserOpenSupport()).ok) {
352
+ controlUiOpened = await openUrl(authedUrl);
353
+ if (!controlUiOpened) controlUiOpenHint = formatControlUiSshHint({
354
+ port: settings.port,
355
+ basePath: controlUiBasePath,
356
+ token: settings.gatewayToken
357
+ });
358
+ } else controlUiOpenHint = formatControlUiSshHint({
359
+ port: settings.port,
360
+ basePath: controlUiBasePath,
361
+ token: settings.gatewayToken
362
+ });
363
+ await prompter.note([
364
+ `Dashboard link (with token): ${authedUrl}`,
365
+ controlUiOpened ? "Opened in your browser. Keep that tab to control Synurex." : "Copy/paste this URL in a browser on this machine to control Synurex.",
366
+ controlUiOpenHint
367
+ ].filter(Boolean).join("\n"), "Dashboard ready");
368
+ }
369
+ const webSearchKey = (nextConfig.tools?.web?.search?.apiKey ?? "").trim();
370
+ const webSearchEnv = (process.env.BRAVE_API_KEY ?? "").trim();
371
+ const hasWebSearchKey = Boolean(webSearchKey || webSearchEnv);
372
+ await prompter.note(hasWebSearchKey ? [
373
+ "Web search is enabled, so your agent can look things up online when needed.",
374
+ "",
375
+ webSearchKey ? "API key: stored in config (tools.web.search.apiKey)." : "API key: provided via BRAVE_API_KEY env var (Gateway environment).",
376
+ "Docs: https://docs.synurex.com/tools/web"
377
+ ].join("\n") : [
378
+ "If you want your agent to be able to search the web, you’ll need an API key.",
379
+ "",
380
+ "Synurex uses Brave Search for the `web_search` tool. Without a Brave Search API key, web search won’t work.",
381
+ "",
382
+ "Set it up interactively:",
383
+ `- Run: ${formatCliCommand("synurex configure --section web")}`,
384
+ "- Enable web_search and paste your Brave Search API key",
385
+ "",
386
+ "Alternative: set BRAVE_API_KEY in the Gateway environment (no config changes).",
387
+ "Docs: https://docs.synurex.com/tools/web"
388
+ ].join("\n"), "Web search (optional)");
389
+ await prompter.note("What now: https://synurex.com/showcase (\"What People Are Building\").", "What now");
390
+ await prompter.outro(controlUiOpened ? "Onboarding complete. Dashboard opened; keep that tab to control Synurex." : "Onboarding complete. Use the dashboard link above to control Synurex.");
391
+ return { launchedTui };
392
+ }
393
+
394
+ //#endregion
395
+ //#region src/wizard/onboarding.gateway-config.ts
396
+ async function configureGatewayForOnboarding(opts) {
397
+ const { flow, localPort, quickstartGateway, prompter } = opts;
398
+ let { nextConfig } = opts;
399
+ const port = flow === "quickstart" ? quickstartGateway.port : Number.parseInt(String(await prompter.text({
400
+ message: "Gateway port",
401
+ initialValue: String(localPort),
402
+ validate: (value) => Number.isFinite(Number(value)) ? void 0 : "Invalid port"
403
+ })), 10);
404
+ let bind = flow === "quickstart" ? quickstartGateway.bind : await prompter.select({
405
+ message: "Gateway bind",
406
+ options: [
407
+ {
408
+ value: "loopback",
409
+ label: "Loopback (127.0.0.1)"
410
+ },
411
+ {
412
+ value: "lan",
413
+ label: "LAN (0.0.0.0)"
414
+ },
415
+ {
416
+ value: "tailnet",
417
+ label: "Tailnet (Tailscale IP)"
418
+ },
419
+ {
420
+ value: "auto",
421
+ label: "Auto (Loopback → LAN)"
422
+ },
423
+ {
424
+ value: "custom",
425
+ label: "Custom IP"
426
+ }
427
+ ]
428
+ });
429
+ let customBindHost = quickstartGateway.customBindHost;
430
+ if (bind === "custom") {
431
+ if (flow !== "quickstart" || !customBindHost) {
432
+ const input = await prompter.text({
433
+ message: "Custom IP address",
434
+ placeholder: "192.168.1.100",
435
+ initialValue: customBindHost ?? "",
436
+ validate: (value) => {
437
+ if (!value) return "IP address is required for custom bind mode";
438
+ const parts = value.trim().split(".");
439
+ if (parts.length !== 4) return "Invalid IPv4 address (e.g., 192.168.1.100)";
440
+ if (parts.every((part) => {
441
+ const n = parseInt(part, 10);
442
+ return !Number.isNaN(n) && n >= 0 && n <= 255 && part === String(n);
443
+ })) return;
444
+ return "Invalid IPv4 address (each octet must be 0-255)";
445
+ }
446
+ });
447
+ customBindHost = typeof input === "string" ? input.trim() : void 0;
448
+ }
449
+ }
450
+ let authMode = flow === "quickstart" ? quickstartGateway.authMode : await prompter.select({
451
+ message: "Gateway auth",
452
+ options: [{
453
+ value: "token",
454
+ label: "Token",
455
+ hint: "Recommended default (local + remote)"
456
+ }, {
457
+ value: "password",
458
+ label: "Password"
459
+ }],
460
+ initialValue: "token"
461
+ });
462
+ const tailscaleMode = flow === "quickstart" ? quickstartGateway.tailscaleMode : await prompter.select({
463
+ message: "Tailscale exposure",
464
+ options: [
465
+ {
466
+ value: "off",
467
+ label: "Off",
468
+ hint: "No Tailscale exposure"
469
+ },
470
+ {
471
+ value: "serve",
472
+ label: "Serve",
473
+ hint: "Private HTTPS for your tailnet (devices on Tailscale)"
474
+ },
475
+ {
476
+ value: "funnel",
477
+ label: "Funnel",
478
+ hint: "Public HTTPS via Tailscale Funnel (internet)"
479
+ }
480
+ ]
481
+ });
482
+ if (tailscaleMode !== "off") {
483
+ if (!await findTailscaleBinary()) await prompter.note([
484
+ "Tailscale binary not found in PATH or /Applications.",
485
+ "Ensure Tailscale is installed from:",
486
+ " https://tailscale.com/download/mac",
487
+ "",
488
+ "You can continue setup, but serve/funnel will fail at runtime."
489
+ ].join("\n"), "Tailscale Warning");
490
+ }
491
+ let tailscaleResetOnExit = flow === "quickstart" ? quickstartGateway.tailscaleResetOnExit : false;
492
+ if (tailscaleMode !== "off" && flow !== "quickstart") {
493
+ await prompter.note([
494
+ "Docs:",
495
+ "https://docs.synurex.com/gateway/tailscale",
496
+ "https://docs.synurex.com/web"
497
+ ].join("\n"), "Tailscale");
498
+ tailscaleResetOnExit = Boolean(await prompter.confirm({
499
+ message: "Reset Tailscale serve/funnel on exit?",
500
+ initialValue: false
501
+ }));
502
+ }
503
+ if (tailscaleMode !== "off" && bind !== "loopback") {
504
+ await prompter.note("Tailscale requires bind=loopback. Adjusting bind to loopback.", "Note");
505
+ bind = "loopback";
506
+ customBindHost = void 0;
507
+ }
508
+ if (tailscaleMode === "funnel" && authMode !== "password") {
509
+ await prompter.note("Tailscale funnel requires password auth.", "Note");
510
+ authMode = "password";
511
+ }
512
+ let gatewayToken;
513
+ if (authMode === "token") if (flow === "quickstart") gatewayToken = quickstartGateway.token ?? randomToken();
514
+ else gatewayToken = normalizeGatewayTokenInput(await prompter.text({
515
+ message: "Gateway token (blank to generate)",
516
+ placeholder: "Needed for multi-machine or non-loopback access",
517
+ initialValue: quickstartGateway.token ?? ""
518
+ })) || randomToken();
519
+ if (authMode === "password") {
520
+ const password = flow === "quickstart" && quickstartGateway.password ? quickstartGateway.password : await prompter.text({
521
+ message: "Gateway password",
522
+ validate: (value) => value?.trim() ? void 0 : "Required"
523
+ });
524
+ nextConfig = {
525
+ ...nextConfig,
526
+ gateway: {
527
+ ...nextConfig.gateway,
528
+ auth: {
529
+ ...nextConfig.gateway?.auth,
530
+ mode: "password",
531
+ password: String(password).trim()
532
+ }
533
+ }
534
+ };
535
+ } else if (authMode === "token") nextConfig = {
536
+ ...nextConfig,
537
+ gateway: {
538
+ ...nextConfig.gateway,
539
+ auth: {
540
+ ...nextConfig.gateway?.auth,
541
+ mode: "token",
542
+ token: gatewayToken
543
+ }
544
+ }
545
+ };
546
+ nextConfig = {
547
+ ...nextConfig,
548
+ gateway: {
549
+ ...nextConfig.gateway,
550
+ port,
551
+ bind,
552
+ ...bind === "custom" && customBindHost ? { customBindHost } : {},
553
+ tailscale: {
554
+ ...nextConfig.gateway?.tailscale,
555
+ mode: tailscaleMode,
556
+ resetOnExit: tailscaleResetOnExit
557
+ }
558
+ }
559
+ };
560
+ return {
561
+ nextConfig,
562
+ settings: {
563
+ port,
564
+ bind,
565
+ customBindHost: bind === "custom" ? customBindHost : void 0,
566
+ authMode,
567
+ gatewayToken,
568
+ tailscaleMode,
569
+ tailscaleResetOnExit
570
+ }
571
+ };
572
+ }
573
+
574
+ //#endregion
575
+ //#region src/wizard/onboarding.ts
576
+ async function requireRiskAcknowledgement(params) {
577
+ if (params.opts.acceptRisk === true) return;
578
+ await params.prompter.note([
579
+ "Security warning — please read.",
580
+ "",
581
+ "Synurex is a hobby project and still in beta. Expect sharp edges.",
582
+ "This bot can read files and run actions if tools are enabled.",
583
+ "A bad prompt can trick it into doing unsafe things.",
584
+ "",
585
+ "If you’re not comfortable with basic security and access control, don’t run Synurex.",
586
+ "Ask someone experienced to help before enabling tools or exposing it to the internet.",
587
+ "",
588
+ "Recommended baseline:",
589
+ "- Pairing/allowlists + mention gating.",
590
+ "- Sandbox + least-privilege tools.",
591
+ "- Keep secrets out of the agent’s reachable filesystem.",
592
+ "- Use the strongest available model for any bot with tools or untrusted inboxes.",
593
+ "",
594
+ "Run regularly:",
595
+ "synurex security audit --deep",
596
+ "synurex security audit --fix",
597
+ "",
598
+ "Must read: https://docs.synurex.com/gateway/security"
599
+ ].join("\n"), "Security");
600
+ if (!await params.prompter.confirm({
601
+ message: "I understand this is powerful and inherently risky. Continue?",
602
+ initialValue: false
603
+ })) throw new WizardCancelledError("risk not accepted");
604
+ }
605
+ async function runOnboardingWizard(opts, runtime = defaultRuntime, prompter) {
606
+ printWizardHeader(runtime);
607
+ await prompter.intro("Synurex onboarding");
608
+ await requireRiskAcknowledgement({
609
+ opts,
610
+ prompter
611
+ });
612
+ const snapshot = await readConfigFileSnapshot();
613
+ let baseConfig = snapshot.valid ? snapshot.config : {};
614
+ if (snapshot.exists && !snapshot.valid) {
615
+ await prompter.note(summarizeExistingConfig(baseConfig), "Invalid config");
616
+ if (snapshot.issues.length > 0) await prompter.note([
617
+ ...snapshot.issues.map((iss) => `- ${iss.path}: ${iss.message}`),
618
+ "",
619
+ "Docs: https://docs.synurex.com/gateway/configuration"
620
+ ].join("\n"), "Config issues");
621
+ await prompter.outro(`Config invalid. Run \`${formatCliCommand("synurex doctor")}\` to repair it, then re-run onboarding.`);
622
+ runtime.exit(1);
623
+ return;
624
+ }
625
+ const quickstartHint = `Configure details later via ${formatCliCommand("synurex configure")}.`;
626
+ const manualHint = "Configure port, network, Tailscale, and auth options.";
627
+ const explicitFlowRaw = opts.flow?.trim();
628
+ const normalizedExplicitFlow = explicitFlowRaw === "manual" ? "advanced" : explicitFlowRaw;
629
+ if (normalizedExplicitFlow && normalizedExplicitFlow !== "quickstart" && normalizedExplicitFlow !== "advanced") {
630
+ runtime.error("Invalid --flow (use quickstart, manual, or advanced).");
631
+ runtime.exit(1);
632
+ return;
633
+ }
634
+ let flow = (normalizedExplicitFlow === "quickstart" || normalizedExplicitFlow === "advanced" ? normalizedExplicitFlow : void 0) ?? await prompter.select({
635
+ message: "Onboarding mode",
636
+ options: [{
637
+ value: "quickstart",
638
+ label: "QuickStart",
639
+ hint: quickstartHint
640
+ }, {
641
+ value: "advanced",
642
+ label: "Manual",
643
+ hint: manualHint
644
+ }],
645
+ initialValue: "quickstart"
646
+ });
647
+ if (opts.mode === "remote" && flow === "quickstart") {
648
+ await prompter.note("QuickStart only supports local gateways. Switching to Manual mode.", "QuickStart");
649
+ flow = "advanced";
650
+ }
651
+ if (snapshot.exists) {
652
+ await prompter.note(summarizeExistingConfig(baseConfig), "Existing config detected");
653
+ if (await prompter.select({
654
+ message: "Config handling",
655
+ options: [
656
+ {
657
+ value: "keep",
658
+ label: "Use existing values"
659
+ },
660
+ {
661
+ value: "modify",
662
+ label: "Update values"
663
+ },
664
+ {
665
+ value: "reset",
666
+ label: "Reset"
667
+ }
668
+ ]
669
+ }) === "reset") {
670
+ const workspaceDefault = baseConfig.agents?.defaults?.workspace ?? DEFAULT_WORKSPACE;
671
+ await handleReset(await prompter.select({
672
+ message: "Reset scope",
673
+ options: [
674
+ {
675
+ value: "config",
676
+ label: "Config only"
677
+ },
678
+ {
679
+ value: "config+creds+sessions",
680
+ label: "Config + creds + sessions"
681
+ },
682
+ {
683
+ value: "full",
684
+ label: "Full reset (config + creds + sessions + workspace)"
685
+ }
686
+ ]
687
+ }), resolveUserPath(workspaceDefault), runtime);
688
+ baseConfig = {};
689
+ }
690
+ }
691
+ const quickstartGateway = (() => {
692
+ const hasExisting = typeof baseConfig.gateway?.port === "number" || baseConfig.gateway?.bind !== void 0 || baseConfig.gateway?.auth?.mode !== void 0 || baseConfig.gateway?.auth?.token !== void 0 || baseConfig.gateway?.auth?.password !== void 0 || baseConfig.gateway?.customBindHost !== void 0 || baseConfig.gateway?.tailscale?.mode !== void 0;
693
+ const bindRaw = baseConfig.gateway?.bind;
694
+ const bind = bindRaw === "loopback" || bindRaw === "lan" || bindRaw === "auto" || bindRaw === "custom" || bindRaw === "tailnet" ? bindRaw : "loopback";
695
+ let authMode = "token";
696
+ if (baseConfig.gateway?.auth?.mode === "token" || baseConfig.gateway?.auth?.mode === "password") authMode = baseConfig.gateway.auth.mode;
697
+ else if (baseConfig.gateway?.auth?.token) authMode = "token";
698
+ else if (baseConfig.gateway?.auth?.password) authMode = "password";
699
+ const tailscaleRaw = baseConfig.gateway?.tailscale?.mode;
700
+ const tailscaleMode = tailscaleRaw === "off" || tailscaleRaw === "serve" || tailscaleRaw === "funnel" ? tailscaleRaw : "off";
701
+ return {
702
+ hasExisting,
703
+ port: resolveGatewayPort(baseConfig),
704
+ bind,
705
+ authMode,
706
+ tailscaleMode,
707
+ token: baseConfig.gateway?.auth?.token,
708
+ password: baseConfig.gateway?.auth?.password,
709
+ customBindHost: baseConfig.gateway?.customBindHost,
710
+ tailscaleResetOnExit: baseConfig.gateway?.tailscale?.resetOnExit ?? false
711
+ };
712
+ })();
713
+ if (flow === "quickstart") {
714
+ const formatBind = (value) => {
715
+ if (value === "loopback") return "Loopback (127.0.0.1)";
716
+ if (value === "lan") return "LAN";
717
+ if (value === "custom") return "Custom IP";
718
+ if (value === "tailnet") return "Tailnet (Tailscale IP)";
719
+ return "Auto";
720
+ };
721
+ const formatAuth = (value) => {
722
+ if (value === "token") return "Token (default)";
723
+ return "Password";
724
+ };
725
+ const formatTailscale = (value) => {
726
+ if (value === "off") return "Off";
727
+ if (value === "serve") return "Serve";
728
+ return "Funnel";
729
+ };
730
+ const quickstartLines = quickstartGateway.hasExisting ? [
731
+ "Keeping your current gateway settings:",
732
+ `Gateway port: ${quickstartGateway.port}`,
733
+ `Gateway bind: ${formatBind(quickstartGateway.bind)}`,
734
+ ...quickstartGateway.bind === "custom" && quickstartGateway.customBindHost ? [`Gateway custom IP: ${quickstartGateway.customBindHost}`] : [],
735
+ `Gateway auth: ${formatAuth(quickstartGateway.authMode)}`,
736
+ `Tailscale exposure: ${formatTailscale(quickstartGateway.tailscaleMode)}`,
737
+ "Direct to chat channels."
738
+ ] : [
739
+ `Gateway port: ${DEFAULT_GATEWAY_PORT}`,
740
+ "Gateway bind: Loopback (127.0.0.1)",
741
+ "Gateway auth: Token (default)",
742
+ "Tailscale exposure: Off",
743
+ "Direct to chat channels."
744
+ ];
745
+ await prompter.note(quickstartLines.join("\n"), "QuickStart");
746
+ }
747
+ const localPort = resolveGatewayPort(baseConfig);
748
+ const localUrl = `ws://127.0.0.1:${localPort}`;
749
+ const localProbe = await probeGatewayReachable({
750
+ url: localUrl,
751
+ token: baseConfig.gateway?.auth?.token ?? process.env.SYNUREX_GATEWAY_TOKEN,
752
+ password: baseConfig.gateway?.auth?.password ?? process.env.SYNUREX_GATEWAY_PASSWORD
753
+ });
754
+ const remoteUrl = baseConfig.gateway?.remote?.url?.trim() ?? "";
755
+ const remoteProbe = remoteUrl ? await probeGatewayReachable({
756
+ url: remoteUrl,
757
+ token: baseConfig.gateway?.remote?.token
758
+ }) : null;
759
+ const mode = opts.mode ?? (flow === "quickstart" ? "local" : await prompter.select({
760
+ message: "What do you want to set up?",
761
+ options: [{
762
+ value: "local",
763
+ label: "Local gateway (this machine)",
764
+ hint: localProbe.ok ? `Gateway reachable (${localUrl})` : `No gateway detected (${localUrl})`
765
+ }, {
766
+ value: "remote",
767
+ label: "Remote gateway (info-only)",
768
+ hint: !remoteUrl ? "No remote URL configured yet" : remoteProbe?.ok ? `Gateway reachable (${remoteUrl})` : `Configured but unreachable (${remoteUrl})`
769
+ }]
770
+ }));
771
+ if (mode === "remote") {
772
+ let nextConfig = await promptRemoteGatewayConfig(baseConfig, prompter);
773
+ nextConfig = applyWizardMetadata(nextConfig, {
774
+ command: "onboard",
775
+ mode
776
+ });
777
+ await writeConfigFile(nextConfig);
778
+ logConfigUpdated(runtime);
779
+ await prompter.outro("Remote gateway configured.");
780
+ return;
781
+ }
782
+ const workspaceDir = resolveUserPath((opts.workspace ?? (flow === "quickstart" ? baseConfig.agents?.defaults?.workspace ?? DEFAULT_WORKSPACE : await prompter.text({
783
+ message: "Workspace directory",
784
+ initialValue: baseConfig.agents?.defaults?.workspace ?? DEFAULT_WORKSPACE
785
+ }))).trim() || DEFAULT_WORKSPACE);
786
+ let nextConfig = {
787
+ ...baseConfig,
788
+ agents: {
789
+ ...baseConfig.agents,
790
+ defaults: {
791
+ ...baseConfig.agents?.defaults,
792
+ workspace: workspaceDir
793
+ }
794
+ },
795
+ gateway: {
796
+ ...baseConfig.gateway,
797
+ mode: "local"
798
+ }
799
+ };
800
+ const authStore = ensureAuthProfileStore(void 0, { allowKeychainPrompt: false });
801
+ const authChoiceFromPrompt = opts.authChoice === void 0;
802
+ const authChoice = opts.authChoice ?? await promptAuthChoiceGrouped({
803
+ prompter,
804
+ store: authStore,
805
+ includeSkip: true
806
+ });
807
+ nextConfig = (await applyAuthChoice({
808
+ authChoice,
809
+ config: nextConfig,
810
+ prompter,
811
+ runtime,
812
+ setDefaultModel: true,
813
+ opts: {
814
+ tokenProvider: opts.tokenProvider,
815
+ token: opts.authChoice === "apiKey" && opts.token ? opts.token : void 0
816
+ }
817
+ })).config;
818
+ if (authChoiceFromPrompt) {
819
+ const modelSelection = await promptDefaultModel({
820
+ config: nextConfig,
821
+ prompter,
822
+ allowKeep: true,
823
+ ignoreAllowlist: true,
824
+ preferredProvider: resolvePreferredProviderForAuthChoice(authChoice)
825
+ });
826
+ if (modelSelection.model) nextConfig = applyPrimaryModel(nextConfig, modelSelection.model);
827
+ }
828
+ await warnIfModelConfigLooksOff(nextConfig, prompter);
829
+ const gateway = await configureGatewayForOnboarding({
830
+ flow,
831
+ baseConfig,
832
+ nextConfig,
833
+ localPort,
834
+ quickstartGateway,
835
+ prompter,
836
+ runtime
837
+ });
838
+ nextConfig = gateway.nextConfig;
839
+ const settings = gateway.settings;
840
+ if (opts.skipChannels ?? opts.skipProviders) await prompter.note("Skipping channel setup.", "Channels");
841
+ else {
842
+ const quickstartAllowFromChannels = flow === "quickstart" ? listChannelPlugins().filter((plugin) => plugin.meta.quickstartAllowFrom).map((plugin) => plugin.id) : [];
843
+ nextConfig = await setupChannels(nextConfig, runtime, prompter, {
844
+ allowSignalInstall: true,
845
+ forceAllowFromChannels: quickstartAllowFromChannels,
846
+ skipDmPolicyPrompt: flow === "quickstart",
847
+ skipConfirm: flow === "quickstart",
848
+ quickstartDefaults: flow === "quickstart"
849
+ });
850
+ }
851
+ await writeConfigFile(nextConfig);
852
+ logConfigUpdated(runtime);
853
+ await ensureWorkspaceAndSessions(workspaceDir, runtime, { skipBootstrap: Boolean(nextConfig.agents?.defaults?.skipBootstrap) });
854
+ if (opts.skipSkills) await prompter.note("Skipping skills setup.", "Skills");
855
+ else nextConfig = await setupSkills(nextConfig, workspaceDir, runtime, prompter);
856
+ nextConfig = await setupInternalHooks(nextConfig, runtime, prompter);
857
+ nextConfig = applyWizardMetadata(nextConfig, {
858
+ command: "onboard",
859
+ mode
860
+ });
861
+ await writeConfigFile(nextConfig);
862
+ const { launchedTui } = await finalizeOnboardingWizard({
863
+ flow,
864
+ opts,
865
+ baseConfig,
866
+ nextConfig,
867
+ workspaceDir,
868
+ settings,
869
+ prompter,
870
+ runtime
871
+ });
872
+ if (launchedTui) return;
873
+ }
874
+
875
+ //#endregion
876
+ //#region src/agents/identity-file.ts
877
+ const IDENTITY_PLACEHOLDER_VALUES = new Set([
878
+ "pick something you like",
879
+ "ai? robot? familiar? ghost in the machine? something weirder?",
880
+ "how do you come across? sharp? warm? chaotic? calm?",
881
+ "your signature - pick one that feels right",
882
+ "workspace-relative path, http(s) url, or data uri"
883
+ ]);
884
+ function normalizeIdentityValue(value) {
885
+ let normalized = value.trim();
886
+ normalized = normalized.replace(/^[*_]+|[*_]+$/g, "").trim();
887
+ if (normalized.startsWith("(") && normalized.endsWith(")")) normalized = normalized.slice(1, -1).trim();
888
+ normalized = normalized.replace(/[\u2013\u2014]/g, "-");
889
+ normalized = normalized.replace(/\s+/g, " ").toLowerCase();
890
+ return normalized;
891
+ }
892
+ function isIdentityPlaceholder(value) {
893
+ const normalized = normalizeIdentityValue(value);
894
+ return IDENTITY_PLACEHOLDER_VALUES.has(normalized);
895
+ }
896
+ function parseIdentityMarkdown(content) {
897
+ const identity = {};
898
+ const lines = content.split(/\r?\n/);
899
+ for (const line of lines) {
900
+ const cleaned = line.trim().replace(/^\s*-\s*/, "");
901
+ const colonIndex = cleaned.indexOf(":");
902
+ if (colonIndex === -1) continue;
903
+ const label = cleaned.slice(0, colonIndex).replace(/[*_]/g, "").trim().toLowerCase();
904
+ const value = cleaned.slice(colonIndex + 1).replace(/^[*_]+|[*_]+$/g, "").trim();
905
+ if (!value) continue;
906
+ if (isIdentityPlaceholder(value)) continue;
907
+ if (label === "name") identity.name = value;
908
+ if (label === "emoji") identity.emoji = value;
909
+ if (label === "creature") identity.creature = value;
910
+ if (label === "vibe") identity.vibe = value;
911
+ if (label === "theme") identity.theme = value;
912
+ if (label === "avatar") identity.avatar = value;
913
+ }
914
+ return identity;
915
+ }
916
+ function identityHasValues(identity) {
917
+ return Boolean(identity.name || identity.emoji || identity.theme || identity.creature || identity.vibe || identity.avatar);
918
+ }
919
+ function loadIdentityFromFile(identityPath) {
920
+ try {
921
+ const parsed = parseIdentityMarkdown(fs.readFileSync(identityPath, "utf-8"));
922
+ if (!identityHasValues(parsed)) return null;
923
+ return parsed;
924
+ } catch {
925
+ return null;
926
+ }
927
+ }
928
+ function loadAgentIdentityFromWorkspace(workspace) {
929
+ return loadIdentityFromFile(path.join(workspace, DEFAULT_IDENTITY_FILENAME));
930
+ }
931
+
932
+ //#endregion
933
+ //#region src/commands/agents.config.ts
934
+ function listAgentEntries(cfg) {
935
+ const list = cfg.agents?.list;
936
+ if (!Array.isArray(list)) return [];
937
+ return list.filter((entry) => Boolean(entry && typeof entry === "object"));
938
+ }
939
+ function findAgentEntryIndex(list, agentId) {
940
+ const id = normalizeAgentId(agentId);
941
+ return list.findIndex((entry) => normalizeAgentId(entry.id) === id);
942
+ }
943
+ function resolveAgentName(cfg, agentId) {
944
+ return listAgentEntries(cfg).find((agent) => normalizeAgentId(agent.id) === normalizeAgentId(agentId))?.name?.trim() || void 0;
945
+ }
946
+ function resolveAgentModel(cfg, agentId) {
947
+ const entry = listAgentEntries(cfg).find((agent) => normalizeAgentId(agent.id) === normalizeAgentId(agentId));
948
+ if (entry?.model) {
949
+ if (typeof entry.model === "string" && entry.model.trim()) return entry.model.trim();
950
+ if (typeof entry.model === "object") {
951
+ const primary = entry.model.primary?.trim();
952
+ if (primary) return primary;
953
+ }
954
+ }
955
+ const raw = cfg.agents?.defaults?.model;
956
+ if (typeof raw === "string") return raw;
957
+ return raw?.primary?.trim() || void 0;
958
+ }
959
+ function loadAgentIdentity(workspace) {
960
+ const parsed = loadAgentIdentityFromWorkspace(workspace);
961
+ if (!parsed) return null;
962
+ return identityHasValues(parsed) ? parsed : null;
963
+ }
964
+ function buildAgentSummaries(cfg) {
965
+ const defaultAgentId = normalizeAgentId(resolveDefaultAgentId(cfg));
966
+ const configuredAgents = listAgentEntries(cfg);
967
+ const orderedIds = configuredAgents.length > 0 ? configuredAgents.map((agent) => normalizeAgentId(agent.id)) : [defaultAgentId];
968
+ const bindingCounts = /* @__PURE__ */ new Map();
969
+ for (const binding of cfg.bindings ?? []) {
970
+ const agentId = normalizeAgentId(binding.agentId);
971
+ bindingCounts.set(agentId, (bindingCounts.get(agentId) ?? 0) + 1);
972
+ }
973
+ return orderedIds.filter((id, index) => orderedIds.indexOf(id) === index).map((id) => {
974
+ const workspace = resolveAgentWorkspaceDir(cfg, id);
975
+ const identity = loadAgentIdentity(workspace);
976
+ const configIdentity = configuredAgents.find((agent) => normalizeAgentId(agent.id) === id)?.identity;
977
+ const identityName = identity?.name ?? configIdentity?.name?.trim();
978
+ const identityEmoji = identity?.emoji ?? configIdentity?.emoji?.trim();
979
+ const identitySource = identity ? "identity" : configIdentity && (identityName || identityEmoji) ? "config" : void 0;
980
+ return {
981
+ id,
982
+ name: resolveAgentName(cfg, id),
983
+ identityName,
984
+ identityEmoji,
985
+ identitySource,
986
+ workspace,
987
+ agentDir: resolveAgentDir(cfg, id),
988
+ model: resolveAgentModel(cfg, id),
989
+ bindings: bindingCounts.get(id) ?? 0,
990
+ isDefault: id === defaultAgentId
991
+ };
992
+ });
993
+ }
994
+ function applyAgentConfig(cfg, params) {
995
+ const agentId = normalizeAgentId(params.agentId);
996
+ const name = params.name?.trim();
997
+ const list = listAgentEntries(cfg);
998
+ const index = findAgentEntryIndex(list, agentId);
999
+ const nextEntry = {
1000
+ ...index >= 0 ? list[index] : { id: agentId },
1001
+ ...name ? { name } : {},
1002
+ ...params.workspace ? { workspace: params.workspace } : {},
1003
+ ...params.agentDir ? { agentDir: params.agentDir } : {},
1004
+ ...params.model ? { model: params.model } : {}
1005
+ };
1006
+ const nextList = [...list];
1007
+ if (index >= 0) nextList[index] = nextEntry;
1008
+ else {
1009
+ if (nextList.length === 0 && agentId !== normalizeAgentId(resolveDefaultAgentId(cfg))) nextList.push({ id: resolveDefaultAgentId(cfg) });
1010
+ nextList.push(nextEntry);
1011
+ }
1012
+ return {
1013
+ ...cfg,
1014
+ agents: {
1015
+ ...cfg.agents,
1016
+ list: nextList
1017
+ }
1018
+ };
1019
+ }
1020
+ function pruneAgentConfig(cfg, agentId) {
1021
+ const id = normalizeAgentId(agentId);
1022
+ const nextAgentsList = listAgentEntries(cfg).filter((entry) => normalizeAgentId(entry.id) !== id);
1023
+ const nextAgents = nextAgentsList.length > 0 ? nextAgentsList : void 0;
1024
+ const bindings = cfg.bindings ?? [];
1025
+ const filteredBindings = bindings.filter((binding) => normalizeAgentId(binding.agentId) !== id);
1026
+ const allow = cfg.tools?.agentToAgent?.allow ?? [];
1027
+ const filteredAllow = allow.filter((entry) => entry !== id);
1028
+ const nextAgentsConfig = cfg.agents ? {
1029
+ ...cfg.agents,
1030
+ list: nextAgents
1031
+ } : nextAgents ? { list: nextAgents } : void 0;
1032
+ const nextTools = cfg.tools?.agentToAgent ? {
1033
+ ...cfg.tools,
1034
+ agentToAgent: {
1035
+ ...cfg.tools.agentToAgent,
1036
+ allow: filteredAllow.length > 0 ? filteredAllow : void 0
1037
+ }
1038
+ } : cfg.tools;
1039
+ return {
1040
+ config: {
1041
+ ...cfg,
1042
+ agents: nextAgentsConfig,
1043
+ bindings: filteredBindings.length > 0 ? filteredBindings : void 0,
1044
+ tools: nextTools
1045
+ },
1046
+ removedBindings: bindings.length - filteredBindings.length,
1047
+ removedAllow: allow.length - filteredAllow.length
1048
+ };
1049
+ }
1050
+
1051
+ //#endregion
1052
+ //#region src/memory/status-format.ts
1053
+ function resolveMemoryVectorState(vector) {
1054
+ if (!vector.enabled) return {
1055
+ tone: "muted",
1056
+ state: "disabled"
1057
+ };
1058
+ if (vector.available === true) return {
1059
+ tone: "ok",
1060
+ state: "ready"
1061
+ };
1062
+ if (vector.available === false) return {
1063
+ tone: "warn",
1064
+ state: "unavailable"
1065
+ };
1066
+ return {
1067
+ tone: "muted",
1068
+ state: "unknown"
1069
+ };
1070
+ }
1071
+ function resolveMemoryFtsState(fts) {
1072
+ if (!fts.enabled) return {
1073
+ tone: "muted",
1074
+ state: "disabled"
1075
+ };
1076
+ return fts.available ? {
1077
+ tone: "ok",
1078
+ state: "ready"
1079
+ } : {
1080
+ tone: "warn",
1081
+ state: "unavailable"
1082
+ };
1083
+ }
1084
+ function resolveMemoryCacheSummary(cache) {
1085
+ if (!cache.enabled) return {
1086
+ tone: "muted",
1087
+ text: "cache off"
1088
+ };
1089
+ return {
1090
+ tone: "ok",
1091
+ text: `cache on${typeof cache.entries === "number" ? ` (${cache.entries})` : ""}`
1092
+ };
1093
+ }
1094
+
1095
+ //#endregion
1096
+ //#region src/infra/os-summary.ts
1097
+ function safeTrim(value) {
1098
+ return typeof value === "string" ? value.trim() : "";
1099
+ }
1100
+ function macosVersion() {
1101
+ return safeTrim(spawnSync("sw_vers", ["-productVersion"], { encoding: "utf-8" }).stdout) || os.release();
1102
+ }
1103
+ function resolveOsSummary() {
1104
+ const platform = os.platform();
1105
+ const release = os.release();
1106
+ const arch = os.arch();
1107
+ return {
1108
+ platform,
1109
+ arch,
1110
+ release,
1111
+ label: (() => {
1112
+ if (platform === "darwin") return `macos ${macosVersion()} (${arch})`;
1113
+ if (platform === "win32") return `windows ${release} (${arch})`;
1114
+ return `${platform} ${release} (${arch})`;
1115
+ })()
1116
+ };
1117
+ }
1118
+
1119
+ //#endregion
1120
+ //#region src/commands/status-all/agents.ts
1121
+ async function fileExists$1(p) {
1122
+ try {
1123
+ await fs$1.access(p);
1124
+ return true;
1125
+ } catch {
1126
+ return false;
1127
+ }
1128
+ }
1129
+ async function getAgentLocalStatuses$1(cfg) {
1130
+ const agentList = listAgentsForGateway(cfg);
1131
+ const now = Date.now();
1132
+ const agents = await Promise.all(agentList.agents.map(async (agent) => {
1133
+ const workspaceDir = (() => {
1134
+ try {
1135
+ return resolveAgentWorkspaceDir(cfg, agent.id);
1136
+ } catch {
1137
+ return null;
1138
+ }
1139
+ })();
1140
+ const bootstrapPending = workspaceDir != null ? await fileExists$1(path.join(workspaceDir, "BOOTSTRAP.md")) : null;
1141
+ const sessionsPath = resolveStorePath(cfg.session?.store, { agentId: agent.id });
1142
+ const store = (() => {
1143
+ try {
1144
+ return loadSessionStore(sessionsPath);
1145
+ } catch {
1146
+ return {};
1147
+ }
1148
+ })();
1149
+ const updatedAt = Object.values(store).reduce((max, entry) => Math.max(max, entry?.updatedAt ?? 0), 0);
1150
+ const lastUpdatedAt = updatedAt > 0 ? updatedAt : null;
1151
+ const lastActiveAgeMs = lastUpdatedAt ? now - lastUpdatedAt : null;
1152
+ const sessionsCount = Object.keys(store).filter((k) => k !== "global" && k !== "unknown").length;
1153
+ return {
1154
+ id: agent.id,
1155
+ name: agent.name,
1156
+ workspaceDir,
1157
+ bootstrapPending,
1158
+ sessionsPath,
1159
+ sessionsCount,
1160
+ lastUpdatedAt,
1161
+ lastActiveAgeMs
1162
+ };
1163
+ }));
1164
+ const totalSessions = agents.reduce((sum, a) => sum + a.sessionsCount, 0);
1165
+ const bootstrapPendingCount = agents.reduce((sum, a) => sum + (a.bootstrapPending ? 1 : 0), 0);
1166
+ return {
1167
+ defaultId: agentList.defaultId,
1168
+ agents,
1169
+ totalSessions,
1170
+ bootstrapPendingCount
1171
+ };
1172
+ }
1173
+
1174
+ //#endregion
1175
+ //#region src/commands/status-all/channels.ts
1176
+ const asRecord = (value) => value && typeof value === "object" ? value : {};
1177
+ function summarizeSources(sources) {
1178
+ const counts = /* @__PURE__ */ new Map();
1179
+ for (const s of sources) {
1180
+ const key = s?.trim() ? s.trim() : "unknown";
1181
+ counts.set(key, (counts.get(key) ?? 0) + 1);
1182
+ }
1183
+ const parts = [...counts.entries()].toSorted((a, b) => b[1] - a[1]).map(([key, n]) => `${key}${n > 1 ? `×${n}` : ""}`);
1184
+ return {
1185
+ label: parts.length > 0 ? parts.join("+") : "unknown",
1186
+ parts
1187
+ };
1188
+ }
1189
+ function existsSyncMaybe(p) {
1190
+ const path = p?.trim() || "";
1191
+ if (!path) return null;
1192
+ try {
1193
+ return fs.existsSync(path);
1194
+ } catch {
1195
+ return null;
1196
+ }
1197
+ }
1198
+ function formatTokenHint(token, opts) {
1199
+ const t = token.trim();
1200
+ if (!t) return "empty";
1201
+ if (!opts.showSecrets) return `sha256:${sha256HexPrefix(t, 8)} · len ${t.length}`;
1202
+ const head = t.slice(0, 4);
1203
+ const tail = t.slice(-4);
1204
+ if (t.length <= 10) return `${t} · len ${t.length}`;
1205
+ return `${head}…${tail} · len ${t.length}`;
1206
+ }
1207
+ const formatAccountLabel = (params) => {
1208
+ const base = params.accountId || "default";
1209
+ if (params.name?.trim()) return `${base} (${params.name.trim()})`;
1210
+ return base;
1211
+ };
1212
+ const resolveAccountEnabled = (plugin, account, cfg) => {
1213
+ if (plugin.config.isEnabled) return plugin.config.isEnabled(account, cfg);
1214
+ return asRecord(account).enabled !== false;
1215
+ };
1216
+ const resolveAccountConfigured = async (plugin, account, cfg) => {
1217
+ if (plugin.config.isConfigured) return await plugin.config.isConfigured(account, cfg);
1218
+ return asRecord(account).configured !== false;
1219
+ };
1220
+ const buildAccountSnapshot = (params) => {
1221
+ const described = params.plugin.config.describeAccount?.(params.account, params.cfg);
1222
+ return {
1223
+ enabled: params.enabled,
1224
+ configured: params.configured,
1225
+ ...described,
1226
+ accountId: params.accountId
1227
+ };
1228
+ };
1229
+ const formatAllowFrom = (params) => {
1230
+ if (params.plugin.config.formatAllowFrom) return params.plugin.config.formatAllowFrom({
1231
+ cfg: params.cfg,
1232
+ accountId: params.accountId,
1233
+ allowFrom: params.allowFrom
1234
+ });
1235
+ return params.allowFrom.map((entry) => String(entry).trim()).filter(Boolean);
1236
+ };
1237
+ const buildAccountNotes = (params) => {
1238
+ const { plugin, cfg, entry } = params;
1239
+ const notes = [];
1240
+ const snapshot = entry.snapshot;
1241
+ if (snapshot.enabled === false) notes.push("disabled");
1242
+ if (snapshot.dmPolicy) notes.push(`dm:${snapshot.dmPolicy}`);
1243
+ if (snapshot.tokenSource && snapshot.tokenSource !== "none") notes.push(`token:${snapshot.tokenSource}`);
1244
+ if (snapshot.botTokenSource && snapshot.botTokenSource !== "none") notes.push(`bot:${snapshot.botTokenSource}`);
1245
+ if (snapshot.appTokenSource && snapshot.appTokenSource !== "none") notes.push(`app:${snapshot.appTokenSource}`);
1246
+ if (snapshot.baseUrl) notes.push(snapshot.baseUrl);
1247
+ if (snapshot.port != null) notes.push(`port:${snapshot.port}`);
1248
+ if (snapshot.cliPath) notes.push(`cli:${snapshot.cliPath}`);
1249
+ if (snapshot.dbPath) notes.push(`db:${snapshot.dbPath}`);
1250
+ const allowFrom = plugin.config.resolveAllowFrom?.({
1251
+ cfg,
1252
+ accountId: snapshot.accountId
1253
+ }) ?? snapshot.allowFrom;
1254
+ if (allowFrom?.length) {
1255
+ const formatted = formatAllowFrom({
1256
+ plugin,
1257
+ cfg,
1258
+ accountId: snapshot.accountId,
1259
+ allowFrom
1260
+ }).slice(0, 3);
1261
+ if (formatted.length > 0) notes.push(`allow:${formatted.join(",")}`);
1262
+ }
1263
+ return notes;
1264
+ };
1265
+ function resolveLinkFields(summary) {
1266
+ const rec = asRecord(summary);
1267
+ const linked = typeof rec.linked === "boolean" ? rec.linked : null;
1268
+ const authAgeMs = typeof rec.authAgeMs === "number" ? rec.authAgeMs : null;
1269
+ const self = asRecord(rec.self);
1270
+ return {
1271
+ linked,
1272
+ authAgeMs,
1273
+ selfE164: typeof self.e164 === "string" && self.e164.trim() ? self.e164.trim() : null
1274
+ };
1275
+ }
1276
+ function collectMissingPaths(accounts) {
1277
+ const missing = [];
1278
+ for (const entry of accounts) {
1279
+ const accountRec = asRecord(entry.account);
1280
+ const snapshotRec = asRecord(entry.snapshot);
1281
+ for (const key of [
1282
+ "tokenFile",
1283
+ "botTokenFile",
1284
+ "appTokenFile",
1285
+ "cliPath",
1286
+ "dbPath",
1287
+ "authDir"
1288
+ ]) {
1289
+ const raw = accountRec[key] ?? snapshotRec[key];
1290
+ if (existsSyncMaybe(raw) === false) missing.push(String(raw));
1291
+ }
1292
+ }
1293
+ return missing;
1294
+ }
1295
+ function summarizeTokenConfig(params) {
1296
+ const enabled = params.accounts.filter((a) => a.enabled);
1297
+ if (enabled.length === 0) return {
1298
+ state: null,
1299
+ detail: null
1300
+ };
1301
+ const accountRecs = enabled.map((a) => asRecord(a.account));
1302
+ const hasBotOrAppTokenFields = accountRecs.some((r) => "botToken" in r || "appToken" in r);
1303
+ const hasTokenField = accountRecs.some((r) => "token" in r);
1304
+ if (!hasBotOrAppTokenFields && !hasTokenField) return {
1305
+ state: null,
1306
+ detail: null
1307
+ };
1308
+ if (hasBotOrAppTokenFields) {
1309
+ const ready = enabled.filter((a) => {
1310
+ const rec = asRecord(a.account);
1311
+ const bot = typeof rec.botToken === "string" ? rec.botToken.trim() : "";
1312
+ const app = typeof rec.appToken === "string" ? rec.appToken.trim() : "";
1313
+ return Boolean(bot) && Boolean(app);
1314
+ });
1315
+ const partial = enabled.filter((a) => {
1316
+ const rec = asRecord(a.account);
1317
+ const bot = typeof rec.botToken === "string" ? rec.botToken.trim() : "";
1318
+ const app = typeof rec.appToken === "string" ? rec.appToken.trim() : "";
1319
+ const hasBot = Boolean(bot);
1320
+ const hasApp = Boolean(app);
1321
+ return hasBot && !hasApp || !hasBot && hasApp;
1322
+ });
1323
+ if (partial.length > 0) return {
1324
+ state: "warn",
1325
+ detail: `partial tokens (need bot+app) · accounts ${partial.length}`
1326
+ };
1327
+ if (ready.length === 0) return {
1328
+ state: "setup",
1329
+ detail: "no tokens (need bot+app)"
1330
+ };
1331
+ const botSources = summarizeSources(ready.map((a) => a.snapshot.botTokenSource ?? "none"));
1332
+ const appSources = summarizeSources(ready.map((a) => a.snapshot.appTokenSource ?? "none"));
1333
+ const sample = ready[0]?.account ? asRecord(ready[0].account) : {};
1334
+ const botToken = typeof sample.botToken === "string" ? sample.botToken : "";
1335
+ const appToken = typeof sample.appToken === "string" ? sample.appToken : "";
1336
+ const botHint = botToken.trim() ? formatTokenHint(botToken, { showSecrets: params.showSecrets }) : "";
1337
+ const appHint = appToken.trim() ? formatTokenHint(appToken, { showSecrets: params.showSecrets }) : "";
1338
+ const hint = botHint || appHint ? ` (bot ${botHint || "?"}, app ${appHint || "?"})` : "";
1339
+ return {
1340
+ state: "ok",
1341
+ detail: `tokens ok (bot ${botSources.label}, app ${appSources.label})${hint} · accounts ${ready.length}/${enabled.length || 1}`
1342
+ };
1343
+ }
1344
+ const ready = enabled.filter((a) => {
1345
+ const rec = asRecord(a.account);
1346
+ return typeof rec.token === "string" ? Boolean(rec.token.trim()) : false;
1347
+ });
1348
+ if (ready.length === 0) return {
1349
+ state: "setup",
1350
+ detail: "no token"
1351
+ };
1352
+ const sources = summarizeSources(ready.map((a) => a.snapshot.tokenSource));
1353
+ const sample = ready[0]?.account ? asRecord(ready[0].account) : {};
1354
+ const token = typeof sample.token === "string" ? sample.token : "";
1355
+ const hint = token.trim() ? ` (${formatTokenHint(token, { showSecrets: params.showSecrets })})` : "";
1356
+ return {
1357
+ state: "ok",
1358
+ detail: `token ${sources.label}${hint} · accounts ${ready.length}/${enabled.length || 1}`
1359
+ };
1360
+ }
1361
+ async function buildChannelsTable(cfg, opts) {
1362
+ const showSecrets = opts?.showSecrets === true;
1363
+ const rows = [];
1364
+ const details = [];
1365
+ for (const plugin of listChannelPlugins()) {
1366
+ const accountIds = plugin.config.listAccountIds(cfg);
1367
+ const defaultAccountId = resolveChannelDefaultAccountId({
1368
+ plugin,
1369
+ cfg,
1370
+ accountIds
1371
+ });
1372
+ const resolvedAccountIds = accountIds.length > 0 ? accountIds : [defaultAccountId];
1373
+ const accounts = [];
1374
+ for (const accountId of resolvedAccountIds) {
1375
+ const account = plugin.config.resolveAccount(cfg, accountId);
1376
+ const enabled = resolveAccountEnabled(plugin, account, cfg);
1377
+ const configured = await resolveAccountConfigured(plugin, account, cfg);
1378
+ const snapshot = buildAccountSnapshot({
1379
+ plugin,
1380
+ cfg,
1381
+ accountId,
1382
+ account,
1383
+ enabled,
1384
+ configured
1385
+ });
1386
+ accounts.push({
1387
+ accountId,
1388
+ account,
1389
+ enabled,
1390
+ configured,
1391
+ snapshot
1392
+ });
1393
+ }
1394
+ const anyEnabled = accounts.some((a) => a.enabled);
1395
+ const enabledAccounts = accounts.filter((a) => a.enabled);
1396
+ const configuredAccounts = enabledAccounts.filter((a) => a.configured);
1397
+ const defaultEntry = accounts.find((a) => a.accountId === defaultAccountId) ?? accounts[0];
1398
+ const link = resolveLinkFields(plugin.status?.buildChannelSummary ? await plugin.status.buildChannelSummary({
1399
+ account: defaultEntry?.account ?? {},
1400
+ cfg,
1401
+ defaultAccountId,
1402
+ snapshot: defaultEntry?.snapshot ?? { accountId: defaultAccountId }
1403
+ }) : void 0);
1404
+ const missingPaths = collectMissingPaths(enabledAccounts);
1405
+ const tokenSummary = summarizeTokenConfig({
1406
+ plugin,
1407
+ cfg,
1408
+ accounts,
1409
+ showSecrets
1410
+ });
1411
+ const issues = plugin.status?.collectStatusIssues ? plugin.status.collectStatusIssues(accounts.map((a) => a.snapshot)) : [];
1412
+ const label = plugin.meta.label ?? plugin.id;
1413
+ const state = (() => {
1414
+ if (!anyEnabled) return "off";
1415
+ if (missingPaths.length > 0) return "warn";
1416
+ if (issues.length > 0) return "warn";
1417
+ if (link.linked === false) return "setup";
1418
+ if (tokenSummary.state) return tokenSummary.state;
1419
+ if (link.linked === true) return "ok";
1420
+ if (configuredAccounts.length > 0) return "ok";
1421
+ return "setup";
1422
+ })();
1423
+ const detail = (() => {
1424
+ if (!anyEnabled) {
1425
+ if (!defaultEntry) return "disabled";
1426
+ return plugin.config.disabledReason?.(defaultEntry.account, cfg) ?? "disabled";
1427
+ }
1428
+ if (missingPaths.length > 0) return `missing file (${missingPaths[0]})`;
1429
+ if (issues.length > 0) return issues[0]?.message ?? "misconfigured";
1430
+ if (link.linked !== null) {
1431
+ const base = link.linked ? "linked" : "not linked";
1432
+ const extra = [];
1433
+ if (link.linked && link.selfE164) extra.push(link.selfE164);
1434
+ if (link.linked && link.authAgeMs != null && link.authAgeMs >= 0) extra.push(`auth ${formatAge$1(link.authAgeMs)}`);
1435
+ if (accounts.length > 1 || plugin.meta.forceAccountBinding) extra.push(`accounts ${accounts.length || 1}`);
1436
+ return extra.length > 0 ? `${base} · ${extra.join(" · ")}` : base;
1437
+ }
1438
+ if (tokenSummary.detail) return tokenSummary.detail;
1439
+ if (configuredAccounts.length > 0) {
1440
+ const head = "configured";
1441
+ if (accounts.length <= 1 && !plugin.meta.forceAccountBinding) return head;
1442
+ return `${head} · accounts ${configuredAccounts.length}/${enabledAccounts.length || 1}`;
1443
+ }
1444
+ return (defaultEntry && plugin.config.unconfiguredReason ? plugin.config.unconfiguredReason(defaultEntry.account, cfg) : null) ?? "not configured";
1445
+ })();
1446
+ rows.push({
1447
+ id: plugin.id,
1448
+ label,
1449
+ enabled: anyEnabled,
1450
+ state,
1451
+ detail
1452
+ });
1453
+ if (configuredAccounts.length > 0) details.push({
1454
+ title: `${label} accounts`,
1455
+ columns: [
1456
+ "Account",
1457
+ "Status",
1458
+ "Notes"
1459
+ ],
1460
+ rows: configuredAccounts.map((entry) => {
1461
+ const notes = buildAccountNotes({
1462
+ plugin,
1463
+ cfg,
1464
+ entry
1465
+ });
1466
+ return {
1467
+ Account: formatAccountLabel({
1468
+ accountId: entry.accountId,
1469
+ name: entry.snapshot.name
1470
+ }),
1471
+ Status: entry.enabled ? "OK" : "WARN",
1472
+ Notes: notes.join(" · ")
1473
+ };
1474
+ })
1475
+ });
1476
+ }
1477
+ return {
1478
+ rows,
1479
+ details
1480
+ };
1481
+ }
1482
+
1483
+ //#endregion
1484
+ //#region src/commands/status-all/gateway.ts
1485
+ async function readFileTailLines(filePath, maxLines) {
1486
+ const raw = await fs$1.readFile(filePath, "utf8").catch(() => "");
1487
+ if (!raw.trim()) return [];
1488
+ const lines = raw.replace(/\r/g, "").split("\n");
1489
+ return lines.slice(Math.max(0, lines.length - maxLines)).map((line) => line.trimEnd()).filter((line) => line.trim().length > 0);
1490
+ }
1491
+ function countMatches(haystack, needle) {
1492
+ if (!haystack || !needle) return 0;
1493
+ return haystack.split(needle).length - 1;
1494
+ }
1495
+ function shorten(message, maxLen) {
1496
+ const cleaned = message.replace(/\s+/g, " ").trim();
1497
+ if (cleaned.length <= maxLen) return cleaned;
1498
+ return `${cleaned.slice(0, Math.max(0, maxLen - 1))}…`;
1499
+ }
1500
+ function normalizeGwsLine(line) {
1501
+ return line.replace(/\s+runId=[^\s]+/g, "").replace(/\s+conn=[^\s]+/g, "").replace(/\s+id=[^\s]+/g, "").replace(/\s+error=Error:.*$/g, "").trim();
1502
+ }
1503
+ function consumeJsonBlock(lines, startIndex) {
1504
+ const startLine = lines[startIndex] ?? "";
1505
+ const braceAt = startLine.indexOf("{");
1506
+ if (braceAt < 0) return null;
1507
+ const parts = [startLine.slice(braceAt)];
1508
+ let depth = countMatches(parts[0] ?? "", "{") - countMatches(parts[0] ?? "", "}");
1509
+ let i = startIndex;
1510
+ while (depth > 0 && i + 1 < lines.length) {
1511
+ i += 1;
1512
+ const next = lines[i] ?? "";
1513
+ parts.push(next);
1514
+ depth += countMatches(next, "{") - countMatches(next, "}");
1515
+ }
1516
+ return {
1517
+ json: parts.join("\n"),
1518
+ endIndex: i
1519
+ };
1520
+ }
1521
+ function summarizeLogTail(rawLines, opts) {
1522
+ const maxLines = Math.max(6, opts?.maxLines ?? 26);
1523
+ const out = [];
1524
+ const groups = /* @__PURE__ */ new Map();
1525
+ const addGroup = (key, base) => {
1526
+ const existing = groups.get(key);
1527
+ if (existing) {
1528
+ existing.count += 1;
1529
+ return;
1530
+ }
1531
+ groups.set(key, {
1532
+ count: 1,
1533
+ index: out.length,
1534
+ base
1535
+ });
1536
+ out.push(base);
1537
+ };
1538
+ const addLine = (line) => {
1539
+ const trimmed = line.trimEnd();
1540
+ if (!trimmed) return;
1541
+ out.push(trimmed);
1542
+ };
1543
+ const lines = rawLines.map((line) => line.trimEnd()).filter(Boolean);
1544
+ for (let i = 0; i < lines.length; i += 1) {
1545
+ const line = lines[i] ?? "";
1546
+ const trimmedStart = line.trimStart();
1547
+ if ((trimmedStart.startsWith("\"") || trimmedStart === "}" || trimmedStart === "{" || trimmedStart.startsWith("}") || trimmedStart.startsWith("{")) && !trimmedStart.startsWith("[") && !trimmedStart.startsWith("#")) continue;
1548
+ const tokenRefresh = line.match(/^\[([^\]]+)\]\s+Token refresh failed:\s*(\d+)\s*(\{)?\s*$/);
1549
+ if (tokenRefresh) {
1550
+ const tag = tokenRefresh[1] ?? "unknown";
1551
+ const status = tokenRefresh[2] ?? "unknown";
1552
+ const block = consumeJsonBlock(lines, i);
1553
+ if (block) {
1554
+ i = block.endIndex;
1555
+ const parsed = (() => {
1556
+ try {
1557
+ return JSON.parse(block.json);
1558
+ } catch {
1559
+ return null;
1560
+ }
1561
+ })();
1562
+ const code = parsed?.error?.code?.trim() || null;
1563
+ const msg = parsed?.error?.message?.trim() || null;
1564
+ const msgShort = msg ? msg.toLowerCase().includes("signing in again") ? "re-auth required" : shorten(msg, 52) : null;
1565
+ const base = `[${tag}] token refresh ${status}${code ? ` ${code}` : ""}${msgShort ? ` · ${msgShort}` : ""}`;
1566
+ addGroup(`token:${tag}:${status}:${code ?? ""}:${msgShort ?? ""}`, base);
1567
+ continue;
1568
+ }
1569
+ }
1570
+ const embedded = line.match(/^Embedded agent failed before reply:\s+OAuth token refresh failed for ([^:]+):/);
1571
+ if (embedded) {
1572
+ const provider = embedded[1]?.trim() || "unknown";
1573
+ addGroup(`embedded:${provider}`, `Embedded agent: OAuth token refresh failed (${provider})`);
1574
+ continue;
1575
+ }
1576
+ if (line.startsWith("[gws]") && line.includes("errorCode=UNAVAILABLE") && line.includes("OAuth token refresh failed")) {
1577
+ const normalized = normalizeGwsLine(line);
1578
+ addGroup(`gws:${normalized}`, normalized);
1579
+ continue;
1580
+ }
1581
+ addLine(line);
1582
+ }
1583
+ for (const g of groups.values()) {
1584
+ if (g.count <= 1) continue;
1585
+ out[g.index] = `${g.base} ×${g.count}`;
1586
+ }
1587
+ const deduped = [];
1588
+ for (const line of out) {
1589
+ if (deduped[deduped.length - 1] === line) continue;
1590
+ deduped.push(line);
1591
+ }
1592
+ if (deduped.length <= maxLines) return deduped;
1593
+ const head = Math.min(6, Math.floor(maxLines / 3));
1594
+ const tail = Math.max(1, maxLines - head - 1);
1595
+ return [
1596
+ ...deduped.slice(0, head),
1597
+ `… ${deduped.length - head - tail} lines omitted …`,
1598
+ ...deduped.slice(-tail)
1599
+ ];
1600
+ }
1601
+ function pickGatewaySelfPresence$1(presence) {
1602
+ if (!Array.isArray(presence)) return null;
1603
+ const self = presence.find((e) => e.mode === "gateway" && e.reason === "self") ?? null;
1604
+ if (!self) return null;
1605
+ return {
1606
+ host: typeof self.host === "string" ? self.host : void 0,
1607
+ ip: typeof self.ip === "string" ? self.ip : void 0,
1608
+ version: typeof self.version === "string" ? self.version : void 0,
1609
+ platform: typeof self.platform === "string" ? self.platform : void 0
1610
+ };
1611
+ }
1612
+
1613
+ //#endregion
1614
+ //#region src/commands/status-all/diagnosis.ts
1615
+ async function appendStatusAllDiagnosis(params) {
1616
+ const { lines, muted, ok, warn, fail } = params;
1617
+ const emitCheck = (label, status) => {
1618
+ const icon = status === "ok" ? ok("✓") : status === "warn" ? warn("!") : fail("✗");
1619
+ const colored = status === "ok" ? ok(label) : status === "warn" ? warn(label) : fail(label);
1620
+ lines.push(`${icon} ${colored}`);
1621
+ };
1622
+ lines.push("");
1623
+ lines.push(muted("Gateway connection details:"));
1624
+ for (const line of redactSecrets(params.connectionDetailsForReport).split("\n").map((l) => l.trimEnd())) lines.push(` ${muted(line)}`);
1625
+ lines.push("");
1626
+ if (params.snap) {
1627
+ const status = !params.snap.exists ? "fail" : params.snap.valid ? "ok" : "warn";
1628
+ emitCheck(`Config: ${params.snap.path ?? "(unknown)"}`, status);
1629
+ const issues = [...params.snap.legacyIssues ?? [], ...params.snap.issues ?? []];
1630
+ const uniqueIssues = issues.filter((issue, index) => issues.findIndex((x) => x.path === issue.path && x.message === issue.message) === index);
1631
+ for (const issue of uniqueIssues.slice(0, 12)) lines.push(` - ${issue.path}: ${issue.message}`);
1632
+ if (uniqueIssues.length > 12) lines.push(` ${muted(`… +${uniqueIssues.length - 12} more`)}`);
1633
+ } else emitCheck("Config: read failed", "warn");
1634
+ if (params.remoteUrlMissing) {
1635
+ lines.push("");
1636
+ emitCheck("Gateway remote mode misconfigured (gateway.remote.url missing)", "warn");
1637
+ lines.push(` ${muted("Fix: set gateway.remote.url, or set gateway.mode=local.")}`);
1638
+ }
1639
+ if (params.sentinel?.payload) {
1640
+ emitCheck("Restart sentinel present", "warn");
1641
+ lines.push(` ${muted(`${summarizeRestartSentinel(params.sentinel.payload)} · ${formatAge$1(Date.now() - params.sentinel.payload.ts)}`)}`);
1642
+ } else emitCheck("Restart sentinel: none", "ok");
1643
+ const lastErrClean = params.lastErr?.trim() ?? "";
1644
+ const isTrivialLastErr = lastErrClean.length < 8 || lastErrClean === "}" || lastErrClean === "{";
1645
+ if (lastErrClean && !isTrivialLastErr) {
1646
+ lines.push("");
1647
+ lines.push(muted("Gateway last log line:"));
1648
+ lines.push(` ${muted(redactSecrets(lastErrClean))}`);
1649
+ }
1650
+ if (params.portUsage) {
1651
+ const portOk = params.portUsage.listeners.length === 0;
1652
+ emitCheck(`Port ${params.port}`, portOk ? "ok" : "warn");
1653
+ if (!portOk) for (const line of formatPortDiagnostics(params.portUsage)) lines.push(` ${muted(line)}`);
1654
+ }
1655
+ {
1656
+ const backend = params.tailscale.backendState ?? "unknown";
1657
+ const okBackend = backend === "Running";
1658
+ const hasDns = Boolean(params.tailscale.dnsName);
1659
+ emitCheck(params.tailscaleMode === "off" ? `Tailscale: off · ${backend}${params.tailscale.dnsName ? ` · ${params.tailscale.dnsName}` : ""}` : `Tailscale: ${params.tailscaleMode} · ${backend}${params.tailscale.dnsName ? ` · ${params.tailscale.dnsName}` : ""}`, okBackend && (params.tailscaleMode === "off" || hasDns) ? "ok" : "warn");
1660
+ if (params.tailscale.error) lines.push(` ${muted(`error: ${params.tailscale.error}`)}`);
1661
+ if (params.tailscale.ips.length > 0) lines.push(` ${muted(`ips: ${params.tailscale.ips.slice(0, 3).join(", ")}${params.tailscale.ips.length > 3 ? "…" : ""}`)}`);
1662
+ if (params.tailscaleHttpsUrl) lines.push(` ${muted(`https: ${params.tailscaleHttpsUrl}`)}`);
1663
+ }
1664
+ if (params.skillStatus) {
1665
+ const eligible = params.skillStatus.skills.filter((s) => s.eligible).length;
1666
+ const missing = params.skillStatus.skills.filter((s) => s.eligible && Object.values(s.missing).some((arr) => arr.length)).length;
1667
+ emitCheck(`Skills: ${eligible} eligible · ${missing} missing · ${params.skillStatus.workspaceDir}`, missing === 0 ? "ok" : "warn");
1668
+ }
1669
+ params.progress.setLabel("Reading logs…");
1670
+ const logPaths = (() => {
1671
+ try {
1672
+ return resolveGatewayLogPaths(process.env);
1673
+ } catch {
1674
+ return null;
1675
+ }
1676
+ })();
1677
+ if (logPaths) {
1678
+ params.progress.setLabel("Reading logs…");
1679
+ const [stderrTail, stdoutTail] = await Promise.all([readFileTailLines(logPaths.stderrPath, 40).catch(() => []), readFileTailLines(logPaths.stdoutPath, 40).catch(() => [])]);
1680
+ if (stderrTail.length > 0 || stdoutTail.length > 0) {
1681
+ lines.push("");
1682
+ lines.push(muted(`Gateway logs (tail, summarized): ${logPaths.logDir}`));
1683
+ lines.push(` ${muted(`# stderr: ${logPaths.stderrPath}`)}`);
1684
+ for (const line of summarizeLogTail(stderrTail, { maxLines: 22 }).map(redactSecrets)) lines.push(` ${muted(line)}`);
1685
+ lines.push(` ${muted(`# stdout: ${logPaths.stdoutPath}`)}`);
1686
+ for (const line of summarizeLogTail(stdoutTail, { maxLines: 22 }).map(redactSecrets)) lines.push(` ${muted(line)}`);
1687
+ }
1688
+ }
1689
+ params.progress.tick();
1690
+ if (params.channelsStatus) {
1691
+ emitCheck(`Channel issues (${params.channelIssues.length || "none"})`, params.channelIssues.length === 0 ? "ok" : "warn");
1692
+ for (const issue of params.channelIssues.slice(0, 12)) {
1693
+ const fixText = issue.fix ? ` · fix: ${issue.fix}` : "";
1694
+ lines.push(` - ${issue.channel}[${issue.accountId}] ${issue.kind}: ${issue.message}${fixText}`);
1695
+ }
1696
+ if (params.channelIssues.length > 12) lines.push(` ${muted(`… +${params.channelIssues.length - 12} more`)}`);
1697
+ } else emitCheck(`Channel issues skipped (gateway ${params.gatewayReachable ? "query failed" : "unreachable"})`, "warn");
1698
+ const healthErr = (() => {
1699
+ if (!params.health || typeof params.health !== "object") return "";
1700
+ const record = params.health;
1701
+ if (!("error" in record)) return "";
1702
+ const value = record.error;
1703
+ if (!value) return "";
1704
+ if (typeof value === "string") return value;
1705
+ try {
1706
+ return JSON.stringify(value, null, 2);
1707
+ } catch {
1708
+ return "[unserializable error]";
1709
+ }
1710
+ })();
1711
+ if (healthErr) {
1712
+ lines.push("");
1713
+ lines.push(muted("Gateway health:"));
1714
+ lines.push(` ${muted(redactSecrets(healthErr))}`);
1715
+ }
1716
+ lines.push("");
1717
+ lines.push(muted("Pasteable debug report. Auth tokens redacted."));
1718
+ lines.push("Troubleshooting: https://docs.synurex.com/troubleshooting");
1719
+ lines.push("");
1720
+ }
1721
+
1722
+ //#endregion
1723
+ //#region src/commands/status-all/report-lines.ts
1724
+ async function buildStatusAllReportLines(params) {
1725
+ const rich = isRich();
1726
+ const heading = (text) => rich ? theme.heading(text) : text;
1727
+ const ok = (text) => rich ? theme.success(text) : text;
1728
+ const warn = (text) => rich ? theme.warn(text) : text;
1729
+ const fail = (text) => rich ? theme.error(text) : text;
1730
+ const muted = (text) => rich ? theme.muted(text) : text;
1731
+ const tableWidth = Math.max(60, (process.stdout.columns ?? 120) - 1);
1732
+ const overview = renderTable({
1733
+ width: tableWidth,
1734
+ columns: [{
1735
+ key: "Item",
1736
+ header: "Item",
1737
+ minWidth: 10
1738
+ }, {
1739
+ key: "Value",
1740
+ header: "Value",
1741
+ flex: true,
1742
+ minWidth: 24
1743
+ }],
1744
+ rows: params.overviewRows
1745
+ });
1746
+ const channelRows = params.channels.rows.map((row) => ({
1747
+ channelId: row.id,
1748
+ Channel: row.label,
1749
+ Enabled: row.enabled ? ok("ON") : muted("OFF"),
1750
+ State: row.state === "ok" ? ok("OK") : row.state === "warn" ? warn("WARN") : row.state === "off" ? muted("OFF") : theme.accentDim("SETUP"),
1751
+ Detail: row.detail
1752
+ }));
1753
+ const channelIssuesByChannel = (() => {
1754
+ const map = /* @__PURE__ */ new Map();
1755
+ for (const issue of params.channelIssues) {
1756
+ const key = issue.channel;
1757
+ const list = map.get(key);
1758
+ if (list) list.push(issue);
1759
+ else map.set(key, [issue]);
1760
+ }
1761
+ return map;
1762
+ })();
1763
+ const channelsTable = renderTable({
1764
+ width: tableWidth,
1765
+ columns: [
1766
+ {
1767
+ key: "Channel",
1768
+ header: "Channel",
1769
+ minWidth: 10
1770
+ },
1771
+ {
1772
+ key: "Enabled",
1773
+ header: "Enabled",
1774
+ minWidth: 7
1775
+ },
1776
+ {
1777
+ key: "State",
1778
+ header: "State",
1779
+ minWidth: 8
1780
+ },
1781
+ {
1782
+ key: "Detail",
1783
+ header: "Detail",
1784
+ flex: true,
1785
+ minWidth: 28
1786
+ }
1787
+ ],
1788
+ rows: channelRows.map((row) => {
1789
+ const issues = channelIssuesByChannel.get(row.channelId) ?? [];
1790
+ if (issues.length === 0) return row;
1791
+ const issue = issues[0];
1792
+ const suffix = ` · ${warn(`gateway: ${String(issue.message).slice(0, 90)}`)}`;
1793
+ return {
1794
+ ...row,
1795
+ State: warn("WARN"),
1796
+ Detail: `${row.Detail}${suffix}`
1797
+ };
1798
+ })
1799
+ });
1800
+ const agentsTable = renderTable({
1801
+ width: tableWidth,
1802
+ columns: [
1803
+ {
1804
+ key: "Agent",
1805
+ header: "Agent",
1806
+ minWidth: 12
1807
+ },
1808
+ {
1809
+ key: "Bootstrap",
1810
+ header: "Bootstrap",
1811
+ minWidth: 10
1812
+ },
1813
+ {
1814
+ key: "Sessions",
1815
+ header: "Sessions",
1816
+ align: "right",
1817
+ minWidth: 8
1818
+ },
1819
+ {
1820
+ key: "Active",
1821
+ header: "Active",
1822
+ minWidth: 10
1823
+ },
1824
+ {
1825
+ key: "Store",
1826
+ header: "Store",
1827
+ flex: true,
1828
+ minWidth: 34
1829
+ }
1830
+ ],
1831
+ rows: params.agentStatus.agents.map((a) => ({
1832
+ Agent: a.name?.trim() ? `${a.id} (${a.name.trim()})` : a.id,
1833
+ Bootstrap: a.bootstrapPending === true ? warn("PENDING") : a.bootstrapPending === false ? ok("OK") : "unknown",
1834
+ Sessions: String(a.sessionsCount),
1835
+ Active: a.lastActiveAgeMs != null ? formatAge$1(a.lastActiveAgeMs) : "unknown",
1836
+ Store: a.sessionsPath
1837
+ }))
1838
+ });
1839
+ const lines = [];
1840
+ lines.push(heading("synurex status --all"));
1841
+ lines.push("");
1842
+ lines.push(heading("Overview"));
1843
+ lines.push(overview.trimEnd());
1844
+ lines.push("");
1845
+ lines.push(heading("Channels"));
1846
+ lines.push(channelsTable.trimEnd());
1847
+ for (const detail of params.channels.details) {
1848
+ lines.push("");
1849
+ lines.push(heading(detail.title));
1850
+ lines.push(renderTable({
1851
+ width: tableWidth,
1852
+ columns: detail.columns.map((c) => ({
1853
+ key: c,
1854
+ header: c,
1855
+ flex: c === "Notes",
1856
+ minWidth: c === "Notes" ? 28 : 10
1857
+ })),
1858
+ rows: detail.rows.map((r) => ({
1859
+ ...r,
1860
+ ...r.Status === "OK" ? { Status: ok("OK") } : r.Status === "WARN" ? { Status: warn("WARN") } : {}
1861
+ }))
1862
+ }).trimEnd());
1863
+ }
1864
+ lines.push("");
1865
+ lines.push(heading("Agents"));
1866
+ lines.push(agentsTable.trimEnd());
1867
+ lines.push("");
1868
+ lines.push(heading("Diagnosis (read-only)"));
1869
+ await appendStatusAllDiagnosis({
1870
+ lines,
1871
+ progress: params.progress,
1872
+ muted,
1873
+ ok,
1874
+ warn,
1875
+ fail,
1876
+ connectionDetailsForReport: params.connectionDetailsForReport,
1877
+ ...params.diagnosis
1878
+ });
1879
+ return lines;
1880
+ }
1881
+
1882
+ //#endregion
1883
+ //#region src/commands/status-all.ts
1884
+ async function statusAllCommand(runtime, opts) {
1885
+ await withProgress({
1886
+ label: "Scanning status --all…",
1887
+ total: 11
1888
+ }, async (progress) => {
1889
+ progress.setLabel("Loading config…");
1890
+ const cfg = loadConfig();
1891
+ const osSummary = resolveOsSummary();
1892
+ const snap = await readConfigFileSnapshot().catch(() => null);
1893
+ progress.tick();
1894
+ progress.setLabel("Checking Tailscale…");
1895
+ const tailscaleMode = cfg.gateway?.tailscale?.mode ?? "off";
1896
+ const tailscale = await (async () => {
1897
+ try {
1898
+ const parsed = await readTailscaleStatusJson(runExec, { timeoutMs: 1200 });
1899
+ const backendState = typeof parsed.BackendState === "string" ? parsed.BackendState : null;
1900
+ const self = typeof parsed.Self === "object" && parsed.Self !== null ? parsed.Self : null;
1901
+ const dnsNameRaw = self && typeof self.DNSName === "string" ? self.DNSName : null;
1902
+ return {
1903
+ ok: true,
1904
+ backendState,
1905
+ dnsName: dnsNameRaw ? dnsNameRaw.replace(/\.$/, "") : null,
1906
+ ips: self && Array.isArray(self.TailscaleIPs) ? self.TailscaleIPs.filter((v) => typeof v === "string" && v.trim().length > 0).map((v) => v.trim()) : [],
1907
+ error: null
1908
+ };
1909
+ } catch (err) {
1910
+ return {
1911
+ ok: false,
1912
+ backendState: null,
1913
+ dnsName: null,
1914
+ ips: [],
1915
+ error: String(err)
1916
+ };
1917
+ }
1918
+ })();
1919
+ const tailscaleHttpsUrl = tailscaleMode !== "off" && tailscale.dnsName ? `https://${tailscale.dnsName}${normalizeControlUiBasePath(cfg.gateway?.controlUi?.basePath)}` : null;
1920
+ progress.tick();
1921
+ progress.setLabel("Checking for updates…");
1922
+ const update = await checkUpdateStatus({
1923
+ root: await resolveSynurexPackageRoot({
1924
+ moduleUrl: import.meta.url,
1925
+ argv1: process.argv[1],
1926
+ cwd: process.cwd()
1927
+ }),
1928
+ timeoutMs: 6500,
1929
+ fetchGit: true,
1930
+ includeRegistry: true
1931
+ });
1932
+ const channelInfo = resolveEffectiveUpdateChannel({
1933
+ configChannel: normalizeUpdateChannel(cfg.update?.channel),
1934
+ installKind: update.installKind,
1935
+ git: update.git ? {
1936
+ tag: update.git.tag,
1937
+ branch: update.git.branch
1938
+ } : void 0
1939
+ });
1940
+ const channelLabel = formatUpdateChannelLabel({
1941
+ channel: channelInfo.channel,
1942
+ source: channelInfo.source,
1943
+ gitTag: update.git?.tag ?? null,
1944
+ gitBranch: update.git?.branch ?? null
1945
+ });
1946
+ const gitLabel = update.installKind === "git" ? (() => {
1947
+ const shortSha = update.git?.sha ? update.git.sha.slice(0, 8) : null;
1948
+ const branch = update.git?.branch && update.git.branch !== "HEAD" ? update.git.branch : null;
1949
+ const tag = update.git?.tag ?? null;
1950
+ return [
1951
+ branch ?? (tag ? "detached" : "git"),
1952
+ tag ? `tag ${tag}` : null,
1953
+ shortSha ? `@ ${shortSha}` : null
1954
+ ].filter(Boolean).join(" · ");
1955
+ })() : null;
1956
+ progress.tick();
1957
+ progress.setLabel("Probing gateway…");
1958
+ const connection = buildGatewayConnectionDetails({ config: cfg });
1959
+ const isRemoteMode = cfg.gateway?.mode === "remote";
1960
+ const remoteUrlRaw = typeof cfg.gateway?.remote?.url === "string" ? cfg.gateway.remote.url.trim() : "";
1961
+ const remoteUrlMissing = isRemoteMode && !remoteUrlRaw;
1962
+ const gatewayMode = isRemoteMode ? "remote" : "local";
1963
+ const resolveProbeAuth = (mode) => {
1964
+ const authToken = cfg.gateway?.auth?.token;
1965
+ const authPassword = cfg.gateway?.auth?.password;
1966
+ const remote = cfg.gateway?.remote;
1967
+ return {
1968
+ token: mode === "remote" ? typeof remote?.token === "string" && remote.token.trim() ? remote.token.trim() : void 0 : process.env.SYNUREX_GATEWAY_TOKEN?.trim() || (typeof authToken === "string" && authToken.trim() ? authToken.trim() : void 0),
1969
+ password: process.env.SYNUREX_GATEWAY_PASSWORD?.trim() || (mode === "remote" ? typeof remote?.password === "string" && remote.password.trim() ? remote.password.trim() : void 0 : typeof authPassword === "string" && authPassword.trim() ? authPassword.trim() : void 0)
1970
+ };
1971
+ };
1972
+ const localFallbackAuth = resolveProbeAuth("local");
1973
+ const remoteAuth = resolveProbeAuth("remote");
1974
+ const probeAuth = isRemoteMode && !remoteUrlMissing ? remoteAuth : localFallbackAuth;
1975
+ const gatewayProbe = await probeGateway({
1976
+ url: connection.url,
1977
+ auth: probeAuth,
1978
+ timeoutMs: Math.min(5e3, opts?.timeoutMs ?? 1e4)
1979
+ }).catch(() => null);
1980
+ const gatewayReachable = gatewayProbe?.ok === true;
1981
+ const gatewaySelf = pickGatewaySelfPresence$1(gatewayProbe?.presence ?? null);
1982
+ progress.tick();
1983
+ progress.setLabel("Checking services…");
1984
+ const readServiceSummary = async (service) => {
1985
+ try {
1986
+ const [loaded, runtimeInfo, command] = await Promise.all([
1987
+ service.isLoaded({ env: process.env }).catch(() => false),
1988
+ service.readRuntime(process.env).catch(() => void 0),
1989
+ service.readCommand(process.env).catch(() => null)
1990
+ ]);
1991
+ const installed = command != null;
1992
+ return {
1993
+ label: service.label,
1994
+ installed,
1995
+ loaded,
1996
+ loadedText: loaded ? service.loadedText : service.notLoadedText,
1997
+ runtime: runtimeInfo
1998
+ };
1999
+ } catch {
2000
+ return null;
2001
+ }
2002
+ };
2003
+ const daemon = await readServiceSummary(resolveGatewayService());
2004
+ const nodeService = await readServiceSummary(resolveNodeService());
2005
+ progress.tick();
2006
+ progress.setLabel("Scanning agents…");
2007
+ const agentStatus = await getAgentLocalStatuses$1(cfg);
2008
+ progress.tick();
2009
+ progress.setLabel("Summarizing channels…");
2010
+ const channels = await buildChannelsTable(cfg, { showSecrets: false });
2011
+ progress.tick();
2012
+ const connectionDetailsForReport = (() => {
2013
+ if (!remoteUrlMissing) return connection.message;
2014
+ const bindMode = cfg.gateway?.bind ?? "loopback";
2015
+ return [
2016
+ "Gateway mode: remote",
2017
+ "Gateway target: (missing gateway.remote.url)",
2018
+ `Config: ${snap?.path?.trim() ? snap.path.trim() : "(unknown config path)"}`,
2019
+ `Bind: ${bindMode}`,
2020
+ `Local fallback (used for probes): ${connection.url}`,
2021
+ "Fix: set gateway.remote.url, or set gateway.mode=local."
2022
+ ].join("\n");
2023
+ })();
2024
+ const callOverrides = remoteUrlMissing ? {
2025
+ url: connection.url,
2026
+ token: localFallbackAuth.token,
2027
+ password: localFallbackAuth.password
2028
+ } : {};
2029
+ progress.setLabel("Querying gateway…");
2030
+ const health = gatewayReachable ? await callGateway({
2031
+ method: "health",
2032
+ timeoutMs: Math.min(8e3, opts?.timeoutMs ?? 1e4),
2033
+ ...callOverrides
2034
+ }).catch((err) => ({ error: String(err) })) : { error: gatewayProbe?.error ?? "gateway unreachable" };
2035
+ const channelsStatus = gatewayReachable ? await callGateway({
2036
+ method: "channels.status",
2037
+ params: {
2038
+ probe: false,
2039
+ timeoutMs: opts?.timeoutMs ?? 1e4
2040
+ },
2041
+ timeoutMs: Math.min(8e3, opts?.timeoutMs ?? 1e4),
2042
+ ...callOverrides
2043
+ }).catch(() => null) : null;
2044
+ const channelIssues = channelsStatus ? collectChannelStatusIssues(channelsStatus) : [];
2045
+ progress.tick();
2046
+ progress.setLabel("Checking local state…");
2047
+ const sentinel = await readRestartSentinel().catch(() => null);
2048
+ const lastErr = await readLastGatewayErrorLine(process.env).catch(() => null);
2049
+ const port = resolveGatewayPort(cfg);
2050
+ const portUsage = await inspectPortUsage(port).catch(() => null);
2051
+ progress.tick();
2052
+ const defaultWorkspace = agentStatus.agents.find((a) => a.id === agentStatus.defaultId)?.workspaceDir ?? agentStatus.agents[0]?.workspaceDir ?? null;
2053
+ const skillStatus = defaultWorkspace != null ? (() => {
2054
+ try {
2055
+ return buildWorkspaceSkillStatus(defaultWorkspace, {
2056
+ config: cfg,
2057
+ eligibility: { remote: getRemoteSkillEligibility() }
2058
+ });
2059
+ } catch {
2060
+ return null;
2061
+ }
2062
+ })() : null;
2063
+ const dashboard = cfg.gateway?.controlUi?.enabled ?? true ? resolveControlUiLinks({
2064
+ port,
2065
+ bind: cfg.gateway?.bind,
2066
+ customBindHost: cfg.gateway?.customBindHost,
2067
+ basePath: cfg.gateway?.controlUi?.basePath
2068
+ }).httpUrl : null;
2069
+ const updateLine = (() => {
2070
+ if (update.installKind === "git" && update.git) {
2071
+ const parts = [];
2072
+ parts.push(update.git.branch ? `git ${update.git.branch}` : "git");
2073
+ if (update.git.upstream) parts.push(`↔ ${update.git.upstream}`);
2074
+ if (update.git.dirty) parts.push("dirty");
2075
+ if (update.git.behind != null && update.git.ahead != null) if (update.git.behind === 0 && update.git.ahead === 0) parts.push("up to date");
2076
+ else if (update.git.behind > 0 && update.git.ahead === 0) parts.push(`behind ${update.git.behind}`);
2077
+ else if (update.git.behind === 0 && update.git.ahead > 0) parts.push(`ahead ${update.git.ahead}`);
2078
+ else parts.push(`diverged (ahead ${update.git.ahead}, behind ${update.git.behind})`);
2079
+ if (update.git.fetchOk === false) parts.push("fetch failed");
2080
+ const latest = update.registry?.latestVersion;
2081
+ if (latest) {
2082
+ const cmp = compareSemverStrings(VERSION, latest);
2083
+ if (cmp === 0) parts.push(`npm latest ${latest}`);
2084
+ else if (cmp != null && cmp < 0) parts.push(`npm update ${latest}`);
2085
+ else parts.push(`npm latest ${latest} (local newer)`);
2086
+ } else if (update.registry?.error) parts.push("npm latest unknown");
2087
+ if (update.deps?.status === "ok") parts.push("deps ok");
2088
+ if (update.deps?.status === "stale") parts.push("deps stale");
2089
+ if (update.deps?.status === "missing") parts.push("deps missing");
2090
+ return parts.join(" · ");
2091
+ }
2092
+ const parts = [];
2093
+ parts.push(update.packageManager !== "unknown" ? update.packageManager : "pkg");
2094
+ const latest = update.registry?.latestVersion;
2095
+ if (latest) {
2096
+ const cmp = compareSemverStrings(VERSION, latest);
2097
+ if (cmp === 0) parts.push(`npm latest ${latest}`);
2098
+ else if (cmp != null && cmp < 0) parts.push(`npm update ${latest}`);
2099
+ else parts.push(`npm latest ${latest} (local newer)`);
2100
+ } else if (update.registry?.error) parts.push("npm latest unknown");
2101
+ if (update.deps?.status === "ok") parts.push("deps ok");
2102
+ if (update.deps?.status === "stale") parts.push("deps stale");
2103
+ if (update.deps?.status === "missing") parts.push("deps missing");
2104
+ return parts.join(" · ");
2105
+ })();
2106
+ const gatewayTarget = remoteUrlMissing ? `fallback ${connection.url}` : connection.url;
2107
+ const gatewayStatus = gatewayReachable ? `reachable ${formatDuration$1(gatewayProbe?.connectLatencyMs)}` : gatewayProbe?.error ? `unreachable (${gatewayProbe.error})` : "unreachable";
2108
+ const gatewayAuth = gatewayReachable ? ` · auth ${formatGatewayAuthUsed(probeAuth)}` : "";
2109
+ const gatewaySelfLine = gatewaySelf?.host || gatewaySelf?.ip || gatewaySelf?.version || gatewaySelf?.platform ? [
2110
+ gatewaySelf.host ? gatewaySelf.host : null,
2111
+ gatewaySelf.ip ? `(${gatewaySelf.ip})` : null,
2112
+ gatewaySelf.version ? `app ${gatewaySelf.version}` : null,
2113
+ gatewaySelf.platform ? gatewaySelf.platform : null
2114
+ ].filter(Boolean).join(" ") : null;
2115
+ const aliveThresholdMs = 10 * 6e4;
2116
+ const aliveAgents = agentStatus.agents.filter((a) => a.lastActiveAgeMs != null && a.lastActiveAgeMs <= aliveThresholdMs).length;
2117
+ const lines = await buildStatusAllReportLines({
2118
+ progress,
2119
+ overviewRows: [
2120
+ {
2121
+ Item: "Version",
2122
+ Value: VERSION
2123
+ },
2124
+ {
2125
+ Item: "OS",
2126
+ Value: osSummary.label
2127
+ },
2128
+ {
2129
+ Item: "Node",
2130
+ Value: process.versions.node
2131
+ },
2132
+ {
2133
+ Item: "Config",
2134
+ Value: snap?.path?.trim() ? snap.path.trim() : "(unknown config path)"
2135
+ },
2136
+ dashboard ? {
2137
+ Item: "Dashboard",
2138
+ Value: dashboard
2139
+ } : {
2140
+ Item: "Dashboard",
2141
+ Value: "disabled"
2142
+ },
2143
+ {
2144
+ Item: "Tailscale",
2145
+ Value: tailscaleMode === "off" ? `off${tailscale.backendState ? ` · ${tailscale.backendState}` : ""}${tailscale.dnsName ? ` · ${tailscale.dnsName}` : ""}` : tailscale.dnsName && tailscaleHttpsUrl ? `${tailscaleMode} · ${tailscale.backendState ?? "unknown"} · ${tailscale.dnsName} · ${tailscaleHttpsUrl}` : `${tailscaleMode} · ${tailscale.backendState ?? "unknown"} · magicdns unknown`
2146
+ },
2147
+ {
2148
+ Item: "Channel",
2149
+ Value: channelLabel
2150
+ },
2151
+ ...gitLabel ? [{
2152
+ Item: "Git",
2153
+ Value: gitLabel
2154
+ }] : [],
2155
+ {
2156
+ Item: "Update",
2157
+ Value: updateLine
2158
+ },
2159
+ {
2160
+ Item: "Gateway",
2161
+ Value: `${gatewayMode}${remoteUrlMissing ? " (remote.url missing)" : ""} · ${gatewayTarget} (${connection.urlSource}) · ${gatewayStatus}${gatewayAuth}`
2162
+ },
2163
+ {
2164
+ Item: "Security",
2165
+ Value: `Run: ${formatCliCommand("synurex security audit --deep")}`
2166
+ },
2167
+ gatewaySelfLine ? {
2168
+ Item: "Gateway self",
2169
+ Value: gatewaySelfLine
2170
+ } : {
2171
+ Item: "Gateway self",
2172
+ Value: "unknown"
2173
+ },
2174
+ daemon ? {
2175
+ Item: "Gateway service",
2176
+ Value: !daemon.installed ? `${daemon.label} not installed` : `${daemon.label} ${daemon.installed ? "installed · " : ""}${daemon.loadedText}${daemon.runtime?.status ? ` · ${daemon.runtime.status}` : ""}${daemon.runtime?.pid ? ` (pid ${daemon.runtime.pid})` : ""}`
2177
+ } : {
2178
+ Item: "Gateway service",
2179
+ Value: "unknown"
2180
+ },
2181
+ nodeService ? {
2182
+ Item: "Node service",
2183
+ Value: !nodeService.installed ? `${nodeService.label} not installed` : `${nodeService.label} ${nodeService.installed ? "installed · " : ""}${nodeService.loadedText}${nodeService.runtime?.status ? ` · ${nodeService.runtime.status}` : ""}${nodeService.runtime?.pid ? ` (pid ${nodeService.runtime.pid})` : ""}`
2184
+ } : {
2185
+ Item: "Node service",
2186
+ Value: "unknown"
2187
+ },
2188
+ {
2189
+ Item: "Agents",
2190
+ Value: `${agentStatus.agents.length} total · ${agentStatus.bootstrapPendingCount} bootstrapping · ${aliveAgents} active · ${agentStatus.totalSessions} sessions`
2191
+ }
2192
+ ],
2193
+ channels,
2194
+ channelIssues: channelIssues.map((issue) => ({
2195
+ channel: issue.channel,
2196
+ message: issue.message
2197
+ })),
2198
+ agentStatus,
2199
+ connectionDetailsForReport,
2200
+ diagnosis: {
2201
+ snap,
2202
+ remoteUrlMissing,
2203
+ sentinel,
2204
+ lastErr,
2205
+ port,
2206
+ portUsage,
2207
+ tailscaleMode,
2208
+ tailscale,
2209
+ tailscaleHttpsUrl,
2210
+ skillStatus,
2211
+ channelsStatus,
2212
+ channelIssues,
2213
+ gatewayReachable,
2214
+ health
2215
+ }
2216
+ });
2217
+ progress.setLabel("Rendering…");
2218
+ runtime.log(lines.join("\n"));
2219
+ progress.tick();
2220
+ });
2221
+ }
2222
+
2223
+ //#endregion
2224
+ //#region src/commands/status.format.ts
2225
+ const formatKTokens = (value) => `${(value / 1e3).toFixed(value >= 1e4 ? 0 : 1)}k`;
2226
+ const formatAge = (ms) => {
2227
+ if (!ms || ms < 0) return "unknown";
2228
+ const minutes = Math.round(ms / 6e4);
2229
+ if (minutes < 1) return "just now";
2230
+ if (minutes < 60) return `${minutes}m ago`;
2231
+ const hours = Math.round(minutes / 60);
2232
+ if (hours < 48) return `${hours}h ago`;
2233
+ return `${Math.round(hours / 24)}d ago`;
2234
+ };
2235
+ const formatDuration = (ms) => {
2236
+ if (ms == null || !Number.isFinite(ms)) return "unknown";
2237
+ if (ms < 1e3) return `${Math.round(ms)}ms`;
2238
+ return `${(ms / 1e3).toFixed(1)}s`;
2239
+ };
2240
+ const shortenText = (value, maxLen) => {
2241
+ const chars = Array.from(value);
2242
+ if (chars.length <= maxLen) return value;
2243
+ return `${chars.slice(0, Math.max(0, maxLen - 1)).join("")}…`;
2244
+ };
2245
+ const formatTokensCompact = (sess) => {
2246
+ const used = sess.totalTokens ?? 0;
2247
+ const ctx = sess.contextTokens;
2248
+ if (!ctx) return `${formatKTokens(used)} used`;
2249
+ const pctLabel = sess.percentUsed != null ? `${sess.percentUsed}%` : "?%";
2250
+ return `${formatKTokens(used)}/${formatKTokens(ctx)} (${pctLabel})`;
2251
+ };
2252
+ const formatDaemonRuntimeShort = (runtime) => {
2253
+ if (!runtime) return null;
2254
+ const status = runtime.status ?? "unknown";
2255
+ const details = [];
2256
+ if (runtime.pid) details.push(`pid ${runtime.pid}`);
2257
+ if (runtime.state && runtime.state.toLowerCase() !== status) details.push(`state ${runtime.state}`);
2258
+ const detail = runtime.detail?.replace(/\s+/g, " ").trim() || "";
2259
+ const noisyLaunchctlDetail = runtime.missingUnit === true && detail.toLowerCase().includes("could not find service");
2260
+ if (detail && !noisyLaunchctlDetail) details.push(detail);
2261
+ return details.length > 0 ? `${status} (${details.join(", ")})` : status;
2262
+ };
2263
+
2264
+ //#endregion
2265
+ //#region src/commands/status.daemon.ts
2266
+ async function buildDaemonStatusSummary(service, fallbackLabel) {
2267
+ try {
2268
+ const [loaded, runtime, command] = await Promise.all([
2269
+ service.isLoaded({ env: process.env }).catch(() => false),
2270
+ service.readRuntime(process.env).catch(() => void 0),
2271
+ service.readCommand(process.env).catch(() => null)
2272
+ ]);
2273
+ const installed = command != null;
2274
+ const loadedText = loaded ? service.loadedText : service.notLoadedText;
2275
+ const runtimeShort = formatDaemonRuntimeShort(runtime);
2276
+ return {
2277
+ label: service.label,
2278
+ installed,
2279
+ loadedText,
2280
+ runtimeShort
2281
+ };
2282
+ } catch {
2283
+ return {
2284
+ label: fallbackLabel,
2285
+ installed: null,
2286
+ loadedText: "unknown",
2287
+ runtimeShort: null
2288
+ };
2289
+ }
2290
+ }
2291
+ async function getDaemonStatusSummary() {
2292
+ return await buildDaemonStatusSummary(resolveGatewayService(), "Daemon");
2293
+ }
2294
+ async function getNodeDaemonStatusSummary() {
2295
+ return await buildDaemonStatusSummary(resolveNodeService(), "Node");
2296
+ }
2297
+
2298
+ //#endregion
2299
+ //#region src/commands/status.gateway-probe.ts
2300
+ function resolveGatewayProbeAuth(cfg) {
2301
+ const isRemoteMode = cfg.gateway?.mode === "remote";
2302
+ const remote = isRemoteMode ? cfg.gateway?.remote : void 0;
2303
+ const authToken = cfg.gateway?.auth?.token;
2304
+ const authPassword = cfg.gateway?.auth?.password;
2305
+ return {
2306
+ token: isRemoteMode ? typeof remote?.token === "string" && remote.token.trim().length > 0 ? remote.token.trim() : void 0 : process.env.SYNUREX_GATEWAY_TOKEN?.trim() || (typeof authToken === "string" && authToken.trim().length > 0 ? authToken.trim() : void 0),
2307
+ password: process.env.SYNUREX_GATEWAY_PASSWORD?.trim() || (isRemoteMode ? typeof remote?.password === "string" && remote.password.trim().length > 0 ? remote.password.trim() : void 0 : typeof authPassword === "string" && authPassword.trim().length > 0 ? authPassword.trim() : void 0)
2308
+ };
2309
+ }
2310
+ function pickGatewaySelfPresence(presence) {
2311
+ if (!Array.isArray(presence)) return null;
2312
+ const self = presence.find((e) => e.mode === "gateway" && e.reason === "self") ?? null;
2313
+ if (!self) return null;
2314
+ return {
2315
+ host: typeof self.host === "string" ? self.host : void 0,
2316
+ ip: typeof self.ip === "string" ? self.ip : void 0,
2317
+ version: typeof self.version === "string" ? self.version : void 0,
2318
+ platform: typeof self.platform === "string" ? self.platform : void 0
2319
+ };
2320
+ }
2321
+
2322
+ //#endregion
2323
+ //#region src/commands/status.agent-local.ts
2324
+ async function fileExists(p) {
2325
+ try {
2326
+ await fs$1.access(p);
2327
+ return true;
2328
+ } catch {
2329
+ return false;
2330
+ }
2331
+ }
2332
+ async function getAgentLocalStatuses() {
2333
+ const cfg = loadConfig();
2334
+ const agentList = listAgentsForGateway(cfg);
2335
+ const now = Date.now();
2336
+ const statuses = [];
2337
+ for (const agent of agentList.agents) {
2338
+ const agentId = agent.id;
2339
+ const workspaceDir = (() => {
2340
+ try {
2341
+ return resolveAgentWorkspaceDir(cfg, agentId);
2342
+ } catch {
2343
+ return null;
2344
+ }
2345
+ })();
2346
+ const bootstrapPath = workspaceDir != null ? path.join(workspaceDir, "BOOTSTRAP.md") : null;
2347
+ const bootstrapPending = bootstrapPath != null ? await fileExists(bootstrapPath) : null;
2348
+ const sessionsPath = resolveStorePath(cfg.session?.store, { agentId });
2349
+ const store = (() => {
2350
+ try {
2351
+ return loadSessionStore(sessionsPath);
2352
+ } catch {
2353
+ return {};
2354
+ }
2355
+ })();
2356
+ const sessions = Object.entries(store).filter(([key]) => key !== "global" && key !== "unknown").map(([, entry]) => entry);
2357
+ const sessionsCount = sessions.length;
2358
+ const lastUpdatedAt = sessions.reduce((max, e) => Math.max(max, e?.updatedAt ?? 0), 0);
2359
+ const resolvedLastUpdatedAt = lastUpdatedAt > 0 ? lastUpdatedAt : null;
2360
+ const lastActiveAgeMs = resolvedLastUpdatedAt ? now - resolvedLastUpdatedAt : null;
2361
+ statuses.push({
2362
+ id: agentId,
2363
+ name: agent.name,
2364
+ workspaceDir,
2365
+ bootstrapPending,
2366
+ sessionsPath,
2367
+ sessionsCount,
2368
+ lastUpdatedAt: resolvedLastUpdatedAt,
2369
+ lastActiveAgeMs
2370
+ });
2371
+ }
2372
+ const totalSessions = statuses.reduce((sum, s) => sum + s.sessionsCount, 0);
2373
+ const bootstrapPendingCount = statuses.reduce((sum, s) => sum + (s.bootstrapPending ? 1 : 0), 0);
2374
+ return {
2375
+ defaultId: agentList.defaultId,
2376
+ agents: statuses,
2377
+ totalSessions,
2378
+ bootstrapPendingCount
2379
+ };
2380
+ }
2381
+
2382
+ //#endregion
2383
+ //#region src/commands/status.link-channel.ts
2384
+ async function resolveLinkChannelContext(cfg) {
2385
+ for (const plugin of listChannelPlugins()) {
2386
+ const defaultAccountId = resolveChannelDefaultAccountId({
2387
+ plugin,
2388
+ cfg,
2389
+ accountIds: plugin.config.listAccountIds(cfg)
2390
+ });
2391
+ const account = plugin.config.resolveAccount(cfg, defaultAccountId);
2392
+ const enabled = plugin.config.isEnabled ? plugin.config.isEnabled(account, cfg) : true;
2393
+ const configured = plugin.config.isConfigured ? await plugin.config.isConfigured(account, cfg) : true;
2394
+ const snapshot = plugin.config.describeAccount ? plugin.config.describeAccount(account, cfg) : {
2395
+ accountId: defaultAccountId,
2396
+ enabled,
2397
+ configured
2398
+ };
2399
+ const summaryRecord = plugin.status?.buildChannelSummary ? await plugin.status.buildChannelSummary({
2400
+ account,
2401
+ cfg,
2402
+ defaultAccountId,
2403
+ snapshot
2404
+ }) : void 0;
2405
+ const linked = summaryRecord && typeof summaryRecord.linked === "boolean" ? summaryRecord.linked : null;
2406
+ if (linked === null) continue;
2407
+ return {
2408
+ linked,
2409
+ authAgeMs: summaryRecord && typeof summaryRecord.authAgeMs === "number" ? summaryRecord.authAgeMs : null,
2410
+ account,
2411
+ accountId: defaultAccountId,
2412
+ plugin
2413
+ };
2414
+ }
2415
+ return null;
2416
+ }
2417
+
2418
+ //#endregion
2419
+ //#region src/commands/status.summary.ts
2420
+ const classifyKey = (key, entry) => {
2421
+ if (key === "global") return "global";
2422
+ if (key === "unknown") return "unknown";
2423
+ if (entry?.chatType === "group" || entry?.chatType === "channel") return "group";
2424
+ if (key.includes(":group:") || key.includes(":channel:")) return "group";
2425
+ return "direct";
2426
+ };
2427
+ const buildFlags = (entry) => {
2428
+ if (!entry) return [];
2429
+ const flags = [];
2430
+ const think = entry?.thinkingLevel;
2431
+ if (typeof think === "string" && think.length > 0) flags.push(`think:${think}`);
2432
+ const verbose = entry?.verboseLevel;
2433
+ if (typeof verbose === "string" && verbose.length > 0) flags.push(`verbose:${verbose}`);
2434
+ const reasoning = entry?.reasoningLevel;
2435
+ if (typeof reasoning === "string" && reasoning.length > 0) flags.push(`reasoning:${reasoning}`);
2436
+ const elevated = entry?.elevatedLevel;
2437
+ if (typeof elevated === "string" && elevated.length > 0) flags.push(`elevated:${elevated}`);
2438
+ if (entry?.systemSent) flags.push("system");
2439
+ if (entry?.abortedLastRun) flags.push("aborted");
2440
+ const sessionId = entry?.sessionId;
2441
+ if (typeof sessionId === "string" && sessionId.length > 0) flags.push(`id:${sessionId}`);
2442
+ return flags;
2443
+ };
2444
+ async function getStatusSummary() {
2445
+ const cfg = loadConfig();
2446
+ const linkContext = await resolveLinkChannelContext(cfg);
2447
+ const agentList = listAgentsForGateway(cfg);
2448
+ const heartbeatAgents = agentList.agents.map((agent) => {
2449
+ const summary = resolveHeartbeatSummaryForAgent(cfg, agent.id);
2450
+ return {
2451
+ agentId: agent.id,
2452
+ enabled: summary.enabled,
2453
+ every: summary.every,
2454
+ everyMs: summary.everyMs
2455
+ };
2456
+ });
2457
+ const channelSummary = await buildChannelSummary(cfg, {
2458
+ colorize: true,
2459
+ includeAllowFrom: true
2460
+ });
2461
+ const queuedSystemEvents = peekSystemEvents(resolveMainSessionKey(cfg));
2462
+ const configModel = resolveConfiguredModelRef({
2463
+ cfg,
2464
+ defaultProvider: DEFAULT_PROVIDER,
2465
+ defaultModel: DEFAULT_MODEL
2466
+ }).model ?? DEFAULT_MODEL;
2467
+ const configContextTokens = cfg.agents?.defaults?.contextTokens ?? lookupContextTokens(configModel) ?? DEFAULT_CONTEXT_TOKENS;
2468
+ const now = Date.now();
2469
+ const storeCache = /* @__PURE__ */ new Map();
2470
+ const loadStore = (storePath) => {
2471
+ const cached = storeCache.get(storePath);
2472
+ if (cached) return cached;
2473
+ const store = loadSessionStore(storePath);
2474
+ storeCache.set(storePath, store);
2475
+ return store;
2476
+ };
2477
+ const buildSessionRows = (store, opts = {}) => Object.entries(store).filter(([key]) => key !== "global" && key !== "unknown").map(([key, entry]) => {
2478
+ const updatedAt = entry?.updatedAt ?? null;
2479
+ const age = updatedAt ? now - updatedAt : null;
2480
+ const model = entry?.model ?? configModel ?? null;
2481
+ const contextTokens = entry?.contextTokens ?? lookupContextTokens(model) ?? configContextTokens ?? null;
2482
+ const input = entry?.inputTokens ?? 0;
2483
+ const output = entry?.outputTokens ?? 0;
2484
+ const total = entry?.totalTokens ?? input + output;
2485
+ const remaining = contextTokens != null ? Math.max(0, contextTokens - total) : null;
2486
+ const pct = contextTokens && contextTokens > 0 ? Math.min(999, Math.round(total / contextTokens * 100)) : null;
2487
+ const parsedAgentId = parseAgentSessionKey(key)?.agentId;
2488
+ return {
2489
+ agentId: opts.agentIdOverride ?? parsedAgentId,
2490
+ key,
2491
+ kind: classifyKey(key, entry),
2492
+ sessionId: entry?.sessionId,
2493
+ updatedAt,
2494
+ age,
2495
+ thinkingLevel: entry?.thinkingLevel,
2496
+ verboseLevel: entry?.verboseLevel,
2497
+ reasoningLevel: entry?.reasoningLevel,
2498
+ elevatedLevel: entry?.elevatedLevel,
2499
+ systemSent: entry?.systemSent,
2500
+ abortedLastRun: entry?.abortedLastRun,
2501
+ inputTokens: entry?.inputTokens,
2502
+ outputTokens: entry?.outputTokens,
2503
+ totalTokens: total ?? null,
2504
+ remainingTokens: remaining,
2505
+ percentUsed: pct,
2506
+ model,
2507
+ contextTokens,
2508
+ flags: buildFlags(entry)
2509
+ };
2510
+ }).sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));
2511
+ const paths = /* @__PURE__ */ new Set();
2512
+ const byAgent = agentList.agents.map((agent) => {
2513
+ const storePath = resolveStorePath(cfg.session?.store, { agentId: agent.id });
2514
+ paths.add(storePath);
2515
+ const sessions = buildSessionRows(loadStore(storePath), { agentIdOverride: agent.id });
2516
+ return {
2517
+ agentId: agent.id,
2518
+ path: storePath,
2519
+ count: sessions.length,
2520
+ recent: sessions.slice(0, 10)
2521
+ };
2522
+ });
2523
+ const allSessions = Array.from(paths).flatMap((storePath) => buildSessionRows(loadStore(storePath))).toSorted((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));
2524
+ const recent = allSessions.slice(0, 10);
2525
+ const totalSessions = allSessions.length;
2526
+ return {
2527
+ linkChannel: linkContext ? {
2528
+ id: linkContext.plugin.id,
2529
+ label: linkContext.plugin.meta.label ?? "Channel",
2530
+ linked: linkContext.linked,
2531
+ authAgeMs: linkContext.authAgeMs
2532
+ } : void 0,
2533
+ heartbeat: {
2534
+ defaultAgentId: agentList.defaultId,
2535
+ agents: heartbeatAgents
2536
+ },
2537
+ channelSummary,
2538
+ queuedSystemEvents,
2539
+ sessions: {
2540
+ paths: Array.from(paths),
2541
+ count: totalSessions,
2542
+ defaults: {
2543
+ model: configModel ?? null,
2544
+ contextTokens: configContextTokens ?? null
2545
+ },
2546
+ recent,
2547
+ byAgent
2548
+ }
2549
+ };
2550
+ }
2551
+
2552
+ //#endregion
2553
+ //#region src/commands/status.scan.ts
2554
+ function resolveMemoryPluginStatus(cfg) {
2555
+ if (!(cfg.plugins?.enabled !== false)) return {
2556
+ enabled: false,
2557
+ slot: null,
2558
+ reason: "plugins disabled"
2559
+ };
2560
+ const raw = typeof cfg.plugins?.slots?.memory === "string" ? cfg.plugins.slots.memory.trim() : "";
2561
+ if (raw && raw.toLowerCase() === "none") return {
2562
+ enabled: false,
2563
+ slot: null,
2564
+ reason: "plugins.slots.memory=\"none\""
2565
+ };
2566
+ return {
2567
+ enabled: true,
2568
+ slot: raw || "memory-core"
2569
+ };
2570
+ }
2571
+ async function scanStatus(opts, _runtime) {
2572
+ return await withProgress({
2573
+ label: "Scanning status…",
2574
+ total: 10,
2575
+ enabled: opts.json !== true
2576
+ }, async (progress) => {
2577
+ progress.setLabel("Loading config…");
2578
+ const cfg = loadConfig();
2579
+ const osSummary = resolveOsSummary();
2580
+ progress.tick();
2581
+ progress.setLabel("Checking Tailscale…");
2582
+ const tailscaleMode = cfg.gateway?.tailscale?.mode ?? "off";
2583
+ const tailscaleDns = tailscaleMode === "off" ? null : await getTailnetHostname((cmd, args) => runExec(cmd, args, {
2584
+ timeoutMs: 1200,
2585
+ maxBuffer: 2e5
2586
+ })).catch(() => null);
2587
+ const tailscaleHttpsUrl = tailscaleMode !== "off" && tailscaleDns ? `https://${tailscaleDns}${normalizeControlUiBasePath(cfg.gateway?.controlUi?.basePath)}` : null;
2588
+ progress.tick();
2589
+ progress.setLabel("Checking for updates…");
2590
+ const update = await getUpdateCheckResult({
2591
+ timeoutMs: opts.all ? 6500 : 2500,
2592
+ fetchGit: true,
2593
+ includeRegistry: true
2594
+ });
2595
+ progress.tick();
2596
+ progress.setLabel("Resolving agents…");
2597
+ const agentStatus = await getAgentLocalStatuses();
2598
+ progress.tick();
2599
+ progress.setLabel("Probing gateway…");
2600
+ const gatewayConnection = buildGatewayConnectionDetails();
2601
+ const isRemoteMode = cfg.gateway?.mode === "remote";
2602
+ const remoteUrlRaw = typeof cfg.gateway?.remote?.url === "string" ? cfg.gateway.remote.url : "";
2603
+ const remoteUrlMissing = isRemoteMode && !remoteUrlRaw.trim();
2604
+ const gatewayMode = isRemoteMode ? "remote" : "local";
2605
+ const gatewayProbe = remoteUrlMissing ? null : await probeGateway({
2606
+ url: gatewayConnection.url,
2607
+ auth: resolveGatewayProbeAuth(cfg),
2608
+ timeoutMs: Math.min(opts.all ? 5e3 : 2500, opts.timeoutMs ?? 1e4)
2609
+ }).catch(() => null);
2610
+ const gatewayReachable = gatewayProbe?.ok === true;
2611
+ const gatewaySelf = gatewayProbe?.presence ? pickGatewaySelfPresence(gatewayProbe.presence) : null;
2612
+ progress.tick();
2613
+ progress.setLabel("Querying channel status…");
2614
+ const channelsStatus = gatewayReachable ? await callGateway({
2615
+ method: "channels.status",
2616
+ params: {
2617
+ probe: false,
2618
+ timeoutMs: Math.min(8e3, opts.timeoutMs ?? 1e4)
2619
+ },
2620
+ timeoutMs: Math.min(opts.all ? 5e3 : 2500, opts.timeoutMs ?? 1e4)
2621
+ }).catch(() => null) : null;
2622
+ const channelIssues = channelsStatus ? collectChannelStatusIssues(channelsStatus) : [];
2623
+ progress.tick();
2624
+ progress.setLabel("Summarizing channels…");
2625
+ const channels = await buildChannelsTable(cfg, { showSecrets: process.env.SYNUREX_SHOW_SECRETS?.trim() !== "0" });
2626
+ progress.tick();
2627
+ progress.setLabel("Checking memory…");
2628
+ const memoryPlugin = resolveMemoryPluginStatus(cfg);
2629
+ const memory = await (async () => {
2630
+ if (!memoryPlugin.enabled) return null;
2631
+ if (memoryPlugin.slot !== "memory-core") return null;
2632
+ const agentId = agentStatus.defaultId ?? "main";
2633
+ const { manager } = await getMemorySearchManager({
2634
+ cfg,
2635
+ agentId
2636
+ });
2637
+ if (!manager) return null;
2638
+ try {
2639
+ await manager.probeVectorAvailability();
2640
+ } catch {}
2641
+ const status = manager.status();
2642
+ await manager.close?.().catch(() => {});
2643
+ return {
2644
+ agentId,
2645
+ ...status
2646
+ };
2647
+ })();
2648
+ progress.tick();
2649
+ progress.setLabel("Reading sessions…");
2650
+ const summary = await getStatusSummary();
2651
+ progress.tick();
2652
+ progress.setLabel("Rendering…");
2653
+ progress.tick();
2654
+ return {
2655
+ cfg,
2656
+ osSummary,
2657
+ tailscaleMode,
2658
+ tailscaleDns,
2659
+ tailscaleHttpsUrl,
2660
+ update,
2661
+ gatewayConnection,
2662
+ remoteUrlMissing,
2663
+ gatewayMode,
2664
+ gatewayProbe,
2665
+ gatewayReachable,
2666
+ gatewaySelf,
2667
+ channelIssues,
2668
+ agentStatus,
2669
+ channels,
2670
+ summary,
2671
+ memory,
2672
+ memoryPlugin
2673
+ };
2674
+ });
2675
+ }
2676
+
2677
+ //#endregion
2678
+ //#region src/commands/status.command.ts
2679
+ async function statusCommand(opts, runtime) {
2680
+ if (opts.all && !opts.json) {
2681
+ await statusAllCommand(runtime, { timeoutMs: opts.timeoutMs });
2682
+ return;
2683
+ }
2684
+ const { cfg, osSummary, tailscaleMode, tailscaleDns, tailscaleHttpsUrl, update, gatewayConnection, remoteUrlMissing, gatewayMode, gatewayProbe, gatewayReachable, gatewaySelf, channelIssues, agentStatus, channels, summary, memory, memoryPlugin } = await scanStatus({
2685
+ json: opts.json,
2686
+ timeoutMs: opts.timeoutMs,
2687
+ all: opts.all
2688
+ }, runtime);
2689
+ const securityAudit = await withProgress({
2690
+ label: "Running security audit…",
2691
+ indeterminate: true,
2692
+ enabled: opts.json !== true
2693
+ }, async () => await runSecurityAudit({
2694
+ config: cfg,
2695
+ deep: false,
2696
+ includeFilesystem: true,
2697
+ includeChannelSecurity: true
2698
+ }));
2699
+ const usage = opts.usage ? await withProgress({
2700
+ label: "Fetching usage snapshot…",
2701
+ indeterminate: true,
2702
+ enabled: opts.json !== true
2703
+ }, async () => await loadProviderUsageSummary({ timeoutMs: opts.timeoutMs })) : void 0;
2704
+ const health = opts.deep ? await withProgress({
2705
+ label: "Checking gateway health…",
2706
+ indeterminate: true,
2707
+ enabled: opts.json !== true
2708
+ }, async () => await callGateway({
2709
+ method: "health",
2710
+ params: { probe: true },
2711
+ timeoutMs: opts.timeoutMs
2712
+ })) : void 0;
2713
+ const lastHeartbeat = opts.deep && gatewayReachable ? await callGateway({
2714
+ method: "last-heartbeat",
2715
+ params: {},
2716
+ timeoutMs: opts.timeoutMs
2717
+ }).catch(() => null) : null;
2718
+ const channelInfo = resolveEffectiveUpdateChannel({
2719
+ configChannel: normalizeUpdateChannel(cfg.update?.channel),
2720
+ installKind: update.installKind,
2721
+ git: update.git ? {
2722
+ tag: update.git.tag,
2723
+ branch: update.git.branch
2724
+ } : void 0
2725
+ });
2726
+ if (opts.json) {
2727
+ const [daemon, nodeDaemon] = await Promise.all([getDaemonStatusSummary(), getNodeDaemonStatusSummary()]);
2728
+ runtime.log(JSON.stringify({
2729
+ ...summary,
2730
+ os: osSummary,
2731
+ update,
2732
+ updateChannel: channelInfo.channel,
2733
+ updateChannelSource: channelInfo.source,
2734
+ memory,
2735
+ memoryPlugin,
2736
+ gateway: {
2737
+ mode: gatewayMode,
2738
+ url: gatewayConnection.url,
2739
+ urlSource: gatewayConnection.urlSource,
2740
+ misconfigured: remoteUrlMissing,
2741
+ reachable: gatewayReachable,
2742
+ connectLatencyMs: gatewayProbe?.connectLatencyMs ?? null,
2743
+ self: gatewaySelf,
2744
+ error: gatewayProbe?.error ?? null
2745
+ },
2746
+ gatewayService: daemon,
2747
+ nodeService: nodeDaemon,
2748
+ agents: agentStatus,
2749
+ securityAudit,
2750
+ ...health || usage || lastHeartbeat ? {
2751
+ health,
2752
+ usage,
2753
+ lastHeartbeat
2754
+ } : {}
2755
+ }, null, 2));
2756
+ return;
2757
+ }
2758
+ const muted = (value) => theme.muted(value);
2759
+ const ok = (value) => theme.success(value);
2760
+ const warn = (value) => theme.warn(value);
2761
+ if (opts.verbose) {
2762
+ const details = buildGatewayConnectionDetails();
2763
+ runtime.log(info("Gateway connection:"));
2764
+ for (const line of details.message.split("\n")) runtime.log(` ${line}`);
2765
+ runtime.log("");
2766
+ }
2767
+ const tableWidth = Math.max(60, (process.stdout.columns ?? 120) - 1);
2768
+ const dashboard = (() => {
2769
+ if (!(cfg.gateway?.controlUi?.enabled ?? true)) return "disabled";
2770
+ return resolveControlUiLinks({
2771
+ port: resolveGatewayPort(cfg),
2772
+ bind: cfg.gateway?.bind,
2773
+ customBindHost: cfg.gateway?.customBindHost,
2774
+ basePath: cfg.gateway?.controlUi?.basePath
2775
+ }).httpUrl;
2776
+ })();
2777
+ const gatewayValue = (() => {
2778
+ const target = remoteUrlMissing ? `fallback ${gatewayConnection.url}` : `${gatewayConnection.url}${gatewayConnection.urlSource ? ` (${gatewayConnection.urlSource})` : ""}`;
2779
+ const reach = remoteUrlMissing ? warn("misconfigured (remote.url missing)") : gatewayReachable ? ok(`reachable ${formatDuration(gatewayProbe?.connectLatencyMs)}`) : warn(gatewayProbe?.error ? `unreachable (${gatewayProbe.error})` : "unreachable");
2780
+ const auth = gatewayReachable && !remoteUrlMissing ? ` · auth ${formatGatewayAuthUsed(resolveGatewayProbeAuth(cfg))}` : "";
2781
+ const self = gatewaySelf?.host || gatewaySelf?.version || gatewaySelf?.platform ? [
2782
+ gatewaySelf?.host ? gatewaySelf.host : null,
2783
+ gatewaySelf?.ip ? `(${gatewaySelf.ip})` : null,
2784
+ gatewaySelf?.version ? `app ${gatewaySelf.version}` : null,
2785
+ gatewaySelf?.platform ? gatewaySelf.platform : null
2786
+ ].filter(Boolean).join(" ") : null;
2787
+ return `${gatewayMode} · ${target} · ${reach}${auth}${self ? ` · ${self}` : ""}`;
2788
+ })();
2789
+ const agentsValue = (() => {
2790
+ const pending = agentStatus.bootstrapPendingCount > 0 ? `${agentStatus.bootstrapPendingCount} bootstrapping` : "no bootstraps";
2791
+ const def = agentStatus.agents.find((a) => a.id === agentStatus.defaultId);
2792
+ const defActive = def?.lastActiveAgeMs != null ? formatAge(def.lastActiveAgeMs) : "unknown";
2793
+ const defSuffix = def ? ` · default ${def.id} active ${defActive}` : "";
2794
+ return `${agentStatus.agents.length} · ${pending} · sessions ${agentStatus.totalSessions}${defSuffix}`;
2795
+ })();
2796
+ const [daemon, nodeDaemon] = await Promise.all([getDaemonStatusSummary(), getNodeDaemonStatusSummary()]);
2797
+ const daemonValue = (() => {
2798
+ if (daemon.installed === false) return `${daemon.label} not installed`;
2799
+ const installedPrefix = daemon.installed === true ? "installed · " : "";
2800
+ return `${daemon.label} ${installedPrefix}${daemon.loadedText}${daemon.runtimeShort ? ` · ${daemon.runtimeShort}` : ""}`;
2801
+ })();
2802
+ const nodeDaemonValue = (() => {
2803
+ if (nodeDaemon.installed === false) return `${nodeDaemon.label} not installed`;
2804
+ const installedPrefix = nodeDaemon.installed === true ? "installed · " : "";
2805
+ return `${nodeDaemon.label} ${installedPrefix}${nodeDaemon.loadedText}${nodeDaemon.runtimeShort ? ` · ${nodeDaemon.runtimeShort}` : ""}`;
2806
+ })();
2807
+ const defaults = summary.sessions.defaults;
2808
+ const defaultCtx = defaults.contextTokens ? ` (${formatKTokens(defaults.contextTokens)} ctx)` : "";
2809
+ const eventsValue = summary.queuedSystemEvents.length > 0 ? `${summary.queuedSystemEvents.length} queued` : "none";
2810
+ const probesValue = health ? ok("enabled") : muted("skipped (use --deep)");
2811
+ const heartbeatValue = (() => {
2812
+ const parts = summary.heartbeat.agents.map((agent) => {
2813
+ if (!agent.enabled || !agent.everyMs) return `disabled (${agent.agentId})`;
2814
+ return `${agent.every} (${agent.agentId})`;
2815
+ }).filter(Boolean);
2816
+ return parts.length > 0 ? parts.join(", ") : "disabled";
2817
+ })();
2818
+ const lastHeartbeatValue = (() => {
2819
+ if (!opts.deep) return null;
2820
+ if (!gatewayReachable) return warn("unavailable");
2821
+ if (!lastHeartbeat) return muted("none");
2822
+ const age = formatAge(Date.now() - lastHeartbeat.ts);
2823
+ const channel = lastHeartbeat.channel ?? "unknown";
2824
+ const accountLabel = lastHeartbeat.accountId ? `account ${lastHeartbeat.accountId}` : null;
2825
+ return [
2826
+ lastHeartbeat.status,
2827
+ `${age} ago`,
2828
+ channel,
2829
+ accountLabel
2830
+ ].filter(Boolean).join(" · ");
2831
+ })();
2832
+ const storeLabel = summary.sessions.paths.length > 1 ? `${summary.sessions.paths.length} stores` : summary.sessions.paths[0] ?? "unknown";
2833
+ const memoryValue = (() => {
2834
+ if (!memoryPlugin.enabled) return muted(`disabled${memoryPlugin.reason ? ` (${memoryPlugin.reason})` : ""}`);
2835
+ if (!memory) return muted(`enabled (${memoryPlugin.slot ? `plugin ${memoryPlugin.slot}` : "plugin"}) · unavailable`);
2836
+ const parts = [];
2837
+ const dirtySuffix = memory.dirty ? ` · ${warn("dirty")}` : "";
2838
+ parts.push(`${memory.files} files · ${memory.chunks} chunks${dirtySuffix}`);
2839
+ if (memory.sources?.length) parts.push(`sources ${memory.sources.join(", ")}`);
2840
+ if (memoryPlugin.slot) parts.push(`plugin ${memoryPlugin.slot}`);
2841
+ const colorByTone = (tone, text) => tone === "ok" ? ok(text) : tone === "warn" ? warn(text) : muted(text);
2842
+ const vector = memory.vector;
2843
+ if (vector) {
2844
+ const state = resolveMemoryVectorState(vector);
2845
+ const label = state.state === "disabled" ? "vector off" : `vector ${state.state}`;
2846
+ parts.push(colorByTone(state.tone, label));
2847
+ }
2848
+ const fts = memory.fts;
2849
+ if (fts) {
2850
+ const state = resolveMemoryFtsState(fts);
2851
+ const label = state.state === "disabled" ? "fts off" : `fts ${state.state}`;
2852
+ parts.push(colorByTone(state.tone, label));
2853
+ }
2854
+ const cache = memory.cache;
2855
+ if (cache) {
2856
+ const summary = resolveMemoryCacheSummary(cache);
2857
+ parts.push(colorByTone(summary.tone, summary.text));
2858
+ }
2859
+ return parts.join(" · ");
2860
+ })();
2861
+ const updateAvailability = resolveUpdateAvailability(update);
2862
+ const updateLine = formatUpdateOneLiner(update).replace(/^Update:\s*/i, "");
2863
+ const channelLabel = formatUpdateChannelLabel({
2864
+ channel: channelInfo.channel,
2865
+ source: channelInfo.source,
2866
+ gitTag: update.git?.tag ?? null,
2867
+ gitBranch: update.git?.branch ?? null
2868
+ });
2869
+ const gitLabel = update.installKind === "git" ? (() => {
2870
+ const shortSha = update.git?.sha ? update.git.sha.slice(0, 8) : null;
2871
+ const branch = update.git?.branch && update.git.branch !== "HEAD" ? update.git.branch : null;
2872
+ const tag = update.git?.tag ?? null;
2873
+ return [
2874
+ branch ?? (tag ? "detached" : "git"),
2875
+ tag ? `tag ${tag}` : null,
2876
+ shortSha ? `@ ${shortSha}` : null
2877
+ ].filter(Boolean).join(" · ");
2878
+ })() : null;
2879
+ const overviewRows = [
2880
+ {
2881
+ Item: "Dashboard",
2882
+ Value: dashboard
2883
+ },
2884
+ {
2885
+ Item: "OS",
2886
+ Value: `${osSummary.label} · node ${process.versions.node}`
2887
+ },
2888
+ {
2889
+ Item: "Tailscale",
2890
+ Value: tailscaleMode === "off" ? muted("off") : tailscaleDns && tailscaleHttpsUrl ? `${tailscaleMode} · ${tailscaleDns} · ${tailscaleHttpsUrl}` : warn(`${tailscaleMode} · magicdns unknown`)
2891
+ },
2892
+ {
2893
+ Item: "Channel",
2894
+ Value: channelLabel
2895
+ },
2896
+ ...gitLabel ? [{
2897
+ Item: "Git",
2898
+ Value: gitLabel
2899
+ }] : [],
2900
+ {
2901
+ Item: "Update",
2902
+ Value: updateAvailability.available ? warn(`available · ${updateLine}`) : updateLine
2903
+ },
2904
+ {
2905
+ Item: "Gateway",
2906
+ Value: gatewayValue
2907
+ },
2908
+ {
2909
+ Item: "Gateway service",
2910
+ Value: daemonValue
2911
+ },
2912
+ {
2913
+ Item: "Node service",
2914
+ Value: nodeDaemonValue
2915
+ },
2916
+ {
2917
+ Item: "Agents",
2918
+ Value: agentsValue
2919
+ },
2920
+ {
2921
+ Item: "Memory",
2922
+ Value: memoryValue
2923
+ },
2924
+ {
2925
+ Item: "Probes",
2926
+ Value: probesValue
2927
+ },
2928
+ {
2929
+ Item: "Events",
2930
+ Value: eventsValue
2931
+ },
2932
+ {
2933
+ Item: "Heartbeat",
2934
+ Value: heartbeatValue
2935
+ },
2936
+ ...lastHeartbeatValue ? [{
2937
+ Item: "Last heartbeat",
2938
+ Value: lastHeartbeatValue
2939
+ }] : [],
2940
+ {
2941
+ Item: "Sessions",
2942
+ Value: `${summary.sessions.count} active · default ${defaults.model ?? "unknown"}${defaultCtx} · ${storeLabel}`
2943
+ }
2944
+ ];
2945
+ runtime.log(theme.heading("synurex status"));
2946
+ runtime.log("");
2947
+ runtime.log(theme.heading("Overview"));
2948
+ runtime.log(renderTable({
2949
+ width: tableWidth,
2950
+ columns: [{
2951
+ key: "Item",
2952
+ header: "Item",
2953
+ minWidth: 12
2954
+ }, {
2955
+ key: "Value",
2956
+ header: "Value",
2957
+ flex: true,
2958
+ minWidth: 32
2959
+ }],
2960
+ rows: overviewRows
2961
+ }).trimEnd());
2962
+ runtime.log("");
2963
+ runtime.log(theme.heading("Security audit"));
2964
+ const fmtSummary = (value) => {
2965
+ return [
2966
+ theme.error(`${value.critical} critical`),
2967
+ theme.warn(`${value.warn} warn`),
2968
+ theme.muted(`${value.info} info`)
2969
+ ].join(" · ");
2970
+ };
2971
+ runtime.log(theme.muted(`Summary: ${fmtSummary(securityAudit.summary)}`));
2972
+ const importantFindings = securityAudit.findings.filter((f) => f.severity === "critical" || f.severity === "warn");
2973
+ if (importantFindings.length === 0) runtime.log(theme.muted("No critical or warn findings detected."));
2974
+ else {
2975
+ const severityLabel = (sev) => {
2976
+ if (sev === "critical") return theme.error("CRITICAL");
2977
+ if (sev === "warn") return theme.warn("WARN");
2978
+ return theme.muted("INFO");
2979
+ };
2980
+ const sevRank = (sev) => sev === "critical" ? 0 : sev === "warn" ? 1 : 2;
2981
+ const sorted = [...importantFindings].toSorted((a, b) => sevRank(a.severity) - sevRank(b.severity));
2982
+ const shown = sorted.slice(0, 6);
2983
+ for (const f of shown) {
2984
+ runtime.log(` ${severityLabel(f.severity)} ${f.title}`);
2985
+ runtime.log(` ${shortenText(f.detail.replaceAll("\n", " "), 160)}`);
2986
+ if (f.remediation?.trim()) runtime.log(` ${theme.muted(`Fix: ${f.remediation.trim()}`)}`);
2987
+ }
2988
+ if (sorted.length > shown.length) runtime.log(theme.muted(`… +${sorted.length - shown.length} more`));
2989
+ }
2990
+ runtime.log(theme.muted(`Full report: ${formatCliCommand("synurex security audit")}`));
2991
+ runtime.log(theme.muted(`Deep probe: ${formatCliCommand("synurex security audit --deep")}`));
2992
+ runtime.log("");
2993
+ runtime.log(theme.heading("Channels"));
2994
+ const channelIssuesByChannel = (() => {
2995
+ const map = /* @__PURE__ */ new Map();
2996
+ for (const issue of channelIssues) {
2997
+ const key = issue.channel;
2998
+ const list = map.get(key);
2999
+ if (list) list.push(issue);
3000
+ else map.set(key, [issue]);
3001
+ }
3002
+ return map;
3003
+ })();
3004
+ runtime.log(renderTable({
3005
+ width: tableWidth,
3006
+ columns: [
3007
+ {
3008
+ key: "Channel",
3009
+ header: "Channel",
3010
+ minWidth: 10
3011
+ },
3012
+ {
3013
+ key: "Enabled",
3014
+ header: "Enabled",
3015
+ minWidth: 7
3016
+ },
3017
+ {
3018
+ key: "State",
3019
+ header: "State",
3020
+ minWidth: 8
3021
+ },
3022
+ {
3023
+ key: "Detail",
3024
+ header: "Detail",
3025
+ flex: true,
3026
+ minWidth: 24
3027
+ }
3028
+ ],
3029
+ rows: channels.rows.map((row) => {
3030
+ const issues = channelIssuesByChannel.get(row.id) ?? [];
3031
+ const effectiveState = row.state === "off" ? "off" : issues.length > 0 ? "warn" : row.state;
3032
+ const issueSuffix = issues.length > 0 ? ` · ${warn(`gateway: ${shortenText(issues[0]?.message ?? "issue", 84)}`)}` : "";
3033
+ return {
3034
+ Channel: row.label,
3035
+ Enabled: row.enabled ? ok("ON") : muted("OFF"),
3036
+ State: effectiveState === "ok" ? ok("OK") : effectiveState === "warn" ? warn("WARN") : effectiveState === "off" ? muted("OFF") : theme.accentDim("SETUP"),
3037
+ Detail: `${row.detail}${issueSuffix}`
3038
+ };
3039
+ })
3040
+ }).trimEnd());
3041
+ runtime.log("");
3042
+ runtime.log(theme.heading("Sessions"));
3043
+ runtime.log(renderTable({
3044
+ width: tableWidth,
3045
+ columns: [
3046
+ {
3047
+ key: "Key",
3048
+ header: "Key",
3049
+ minWidth: 20,
3050
+ flex: true
3051
+ },
3052
+ {
3053
+ key: "Kind",
3054
+ header: "Kind",
3055
+ minWidth: 6
3056
+ },
3057
+ {
3058
+ key: "Age",
3059
+ header: "Age",
3060
+ minWidth: 9
3061
+ },
3062
+ {
3063
+ key: "Model",
3064
+ header: "Model",
3065
+ minWidth: 14
3066
+ },
3067
+ {
3068
+ key: "Tokens",
3069
+ header: "Tokens",
3070
+ minWidth: 16
3071
+ }
3072
+ ],
3073
+ rows: summary.sessions.recent.length > 0 ? summary.sessions.recent.map((sess) => ({
3074
+ Key: shortenText(sess.key, 32),
3075
+ Kind: sess.kind,
3076
+ Age: sess.updatedAt ? formatAge(sess.age) : "no activity",
3077
+ Model: sess.model ?? "unknown",
3078
+ Tokens: formatTokensCompact(sess)
3079
+ })) : [{
3080
+ Key: muted("no sessions yet"),
3081
+ Kind: "",
3082
+ Age: "",
3083
+ Model: "",
3084
+ Tokens: ""
3085
+ }]
3086
+ }).trimEnd());
3087
+ if (summary.queuedSystemEvents.length > 0) {
3088
+ runtime.log("");
3089
+ runtime.log(theme.heading("System events"));
3090
+ runtime.log(renderTable({
3091
+ width: tableWidth,
3092
+ columns: [{
3093
+ key: "Event",
3094
+ header: "Event",
3095
+ flex: true,
3096
+ minWidth: 24
3097
+ }],
3098
+ rows: summary.queuedSystemEvents.slice(0, 5).map((event) => ({ Event: event }))
3099
+ }).trimEnd());
3100
+ if (summary.queuedSystemEvents.length > 5) runtime.log(muted(`… +${summary.queuedSystemEvents.length - 5} more`));
3101
+ }
3102
+ if (health) {
3103
+ runtime.log("");
3104
+ runtime.log(theme.heading("Health"));
3105
+ const rows = [];
3106
+ rows.push({
3107
+ Item: "Gateway",
3108
+ Status: ok("reachable"),
3109
+ Detail: `${health.durationMs}ms`
3110
+ });
3111
+ for (const line of formatHealthChannelLines(health, { accountMode: "all" })) {
3112
+ const colon = line.indexOf(":");
3113
+ if (colon === -1) continue;
3114
+ const item = line.slice(0, colon).trim();
3115
+ const detail = line.slice(colon + 1).trim();
3116
+ const normalized = detail.toLowerCase();
3117
+ const status = (() => {
3118
+ if (normalized.startsWith("ok")) return ok("OK");
3119
+ if (normalized.startsWith("failed")) return warn("WARN");
3120
+ if (normalized.startsWith("not configured")) return muted("OFF");
3121
+ if (normalized.startsWith("configured")) return ok("OK");
3122
+ if (normalized.startsWith("linked")) return ok("LINKED");
3123
+ if (normalized.startsWith("not linked")) return warn("UNLINKED");
3124
+ return warn("WARN");
3125
+ })();
3126
+ rows.push({
3127
+ Item: item,
3128
+ Status: status,
3129
+ Detail: detail
3130
+ });
3131
+ }
3132
+ runtime.log(renderTable({
3133
+ width: tableWidth,
3134
+ columns: [
3135
+ {
3136
+ key: "Item",
3137
+ header: "Item",
3138
+ minWidth: 10
3139
+ },
3140
+ {
3141
+ key: "Status",
3142
+ header: "Status",
3143
+ minWidth: 8
3144
+ },
3145
+ {
3146
+ key: "Detail",
3147
+ header: "Detail",
3148
+ flex: true,
3149
+ minWidth: 28
3150
+ }
3151
+ ],
3152
+ rows
3153
+ }).trimEnd());
3154
+ }
3155
+ if (usage) {
3156
+ runtime.log("");
3157
+ runtime.log(theme.heading("Usage"));
3158
+ for (const line of formatUsageReportLines(usage)) runtime.log(line);
3159
+ }
3160
+ runtime.log("");
3161
+ runtime.log("FAQ: https://docs.synurex.com/faq");
3162
+ runtime.log("Troubleshooting: https://docs.synurex.com/troubleshooting");
3163
+ runtime.log("");
3164
+ const updateHint = formatUpdateAvailableHint(update);
3165
+ if (updateHint) {
3166
+ runtime.log(theme.warn(updateHint));
3167
+ runtime.log("");
3168
+ }
3169
+ runtime.log("Next steps:");
3170
+ runtime.log(` Need to share? ${formatCliCommand("synurex status --all")}`);
3171
+ runtime.log(` Need to debug live? ${formatCliCommand("synurex logs --follow")}`);
3172
+ if (gatewayReachable) runtime.log(` Need to test channels? ${formatCliCommand("synurex status --deep")}`);
3173
+ else runtime.log(` Fix reachability first: ${formatCliCommand("synurex gateway probe")}`);
3174
+ }
3175
+
3176
+ //#endregion
3177
+ export { findAgentEntryIndex as a, pruneAgentConfig as c, parseIdentityMarkdown as d, runOnboardingWizard as f, buildAgentSummaries as i, identityHasValues as l, getStatusSummary as n, listAgentEntries as o, applyAgentConfig as r, loadAgentIdentity as s, statusCommand as t, loadAgentIdentityFromWorkspace as u };