@captain-app/openclaw 2026.2.4

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 (1686) hide show
  1. package/CHANGELOG.md +1528 -0
  2. package/LICENSE +21 -0
  3. package/README-header.png +0 -0
  4. package/README.md +539 -0
  5. package/assets/avatar-placeholder.svg +19 -0
  6. package/assets/chrome-extension/README.md +22 -0
  7. package/assets/chrome-extension/background.js +438 -0
  8. package/assets/chrome-extension/icons/icon128.png +0 -0
  9. package/assets/chrome-extension/icons/icon16.png +0 -0
  10. package/assets/chrome-extension/icons/icon32.png +0 -0
  11. package/assets/chrome-extension/icons/icon48.png +0 -0
  12. package/assets/chrome-extension/manifest.json +25 -0
  13. package/assets/chrome-extension/options.html +196 -0
  14. package/assets/chrome-extension/options.js +59 -0
  15. package/assets/dmg-background-small.png +0 -0
  16. package/assets/dmg-background.png +0 -0
  17. package/dist/accounts-ClnuDahN.js +250 -0
  18. package/dist/accounts-DzBgAM3C.js +251 -0
  19. package/dist/acp-cli-BEDDkzXH.js +926 -0
  20. package/dist/acp-cli-CwV4mdnW.js +923 -0
  21. package/dist/agent-CArjbSeE.js +695 -0
  22. package/dist/agent-CB7x5HLT.js +695 -0
  23. package/dist/agent-scope-BbT4OG2N.js +545 -0
  24. package/dist/agent-scope-C_O6Vpl0.js +545 -0
  25. package/dist/agent-scope-Csu2B6AM.js +606 -0
  26. package/dist/archive-CWrnG1CH.js +85 -0
  27. package/dist/archive-ccN9aDgq.js +85 -0
  28. package/dist/audit-DXPkQ275.js +1686 -0
  29. package/dist/audit-eH7nwgsM.js +1686 -0
  30. package/dist/auth-health-Bj7Gjbv0.js +149 -0
  31. package/dist/auth-health-CjjJhHey.js +149 -0
  32. package/dist/auth-nnRYiqpH.js +192 -0
  33. package/dist/auth-profiles-DVLfuixr.js +2954 -0
  34. package/dist/auth-y1BLPUhX.js +192 -0
  35. package/dist/boolean-Wzu0-e0P.js +30 -0
  36. package/dist/brew-Cqi8b49_.js +46 -0
  37. package/dist/brew-DyBGNK8A.js +46 -0
  38. package/dist/build-info.json +5 -0
  39. package/dist/call-B7EveN4V.js +252 -0
  40. package/dist/call-vuUQIjOj.js +252 -0
  41. package/dist/canvas-host/a2ui/.bundle.hash +1 -0
  42. package/dist/canvas-host/a2ui/a2ui.bundle.js +17780 -0
  43. package/dist/canvas-host/a2ui/index.html +307 -0
  44. package/dist/channel-options-CJfmOkol.js +32 -0
  45. package/dist/channel-options-lFguMTz1.js +62 -0
  46. package/dist/channel-selection-BmND9mWj.js +51 -0
  47. package/dist/channel-selection-cGhL9G0c.js +51 -0
  48. package/dist/channel-summary-B4G513Eb.js +1154 -0
  49. package/dist/channel-summary-MCwBCa5y.js +1154 -0
  50. package/dist/channels-cli-C2Of1mZG.js +1411 -0
  51. package/dist/channels-cli-DFynrP1H.js +1413 -0
  52. package/dist/channels-status-issues-YohTjZ-I.js +18 -0
  53. package/dist/channels-status-issues-ZcR1U-m5.js +18 -0
  54. package/dist/chrome-B3IuUad-.js +1953 -0
  55. package/dist/chrome-BZ9K48w9.js +1973 -0
  56. package/dist/clack-prompter-B9yLhyOm.js +92 -0
  57. package/dist/clack-prompter-BybM9xdL.js +92 -0
  58. package/dist/cli/daemon-cli.js +2 -0
  59. package/dist/cli-BJZdJwug.js +89 -0
  60. package/dist/cli-BQSoKu3d.js +86 -0
  61. package/dist/cli-utils-CO4jEMn0.js +43 -0
  62. package/dist/cli-utils-gtE-0a0D.js +43 -0
  63. package/dist/client-DPqNOpK3.js +1609 -0
  64. package/dist/client-DySXIFCA.js +1609 -0
  65. package/dist/command-format-CFzL448l.js +52 -0
  66. package/dist/command-format-DELazozB.js +52 -0
  67. package/dist/command-format-ayFsmwwz.js +38 -0
  68. package/dist/command-options-CsjxK4cZ.js +33 -0
  69. package/dist/commands-BRe9VTyU.js +229 -0
  70. package/dist/completion-cli-DlkjK0iC.js +390 -0
  71. package/dist/completion-cli-E6Pt41AL.js +387 -0
  72. package/dist/config-BtSTwPcH.js +4882 -0
  73. package/dist/config-DfMIMT-f.js +4881 -0
  74. package/dist/config-_d7_WcRv.js +5623 -0
  75. package/dist/config-guard-wSnm-U8a.js +5628 -0
  76. package/dist/configure-CPHAFKlg.js +895 -0
  77. package/dist/configure-DK1XgXYx.js +894 -0
  78. package/dist/constants-CNTiY-ZN.js +65 -0
  79. package/dist/constants-hpmbslG7.js +65 -0
  80. package/dist/control-service-CqX5g_ko.js +61 -0
  81. package/dist/control-service-o6xe3hEb.js +61 -0
  82. package/dist/control-ui/apple-touch-icon.png +0 -0
  83. package/dist/control-ui/assets/index-RwcW4Xl0.css +1 -0
  84. package/dist/control-ui/assets/index-ryaCcbyp.js +4584 -0
  85. package/dist/control-ui/assets/index-ryaCcbyp.js.map +1 -0
  86. package/dist/control-ui/favicon-32.png +0 -0
  87. package/dist/control-ui/favicon.ico +0 -0
  88. package/dist/control-ui/favicon.svg +22 -0
  89. package/dist/control-ui/index.html +17 -0
  90. package/dist/cron-cli-BoSaDgvH.js +453 -0
  91. package/dist/cron-cli-qVandvsD.js +456 -0
  92. package/dist/daemon-cli-C4gGWa15.js +760 -0
  93. package/dist/daemon-cli-DV_X0Krf.js +761 -0
  94. package/dist/daemon-runtime-D5hbSrdO.js +460 -0
  95. package/dist/daemon-runtime-DXUfrXBC.js +460 -0
  96. package/dist/deliver-BxK5nI2P.js +2587 -0
  97. package/dist/deliver-Dwzg9LUd.js +2557 -0
  98. package/dist/deliver-qpYZp20m.js +2587 -0
  99. package/dist/deps-CUXtMV9d.js +27 -0
  100. package/dist/deps-WBvZpFV_.js +27 -0
  101. package/dist/devices-cli-B2s18Qrh.js +207 -0
  102. package/dist/devices-cli-D1UEtMUJ.js +204 -0
  103. package/dist/directory-cli-BXQbrkfM.js +247 -0
  104. package/dist/directory-cli-CqA7tRbq.js +244 -0
  105. package/dist/dispatcher-Dyv7T-1r.js +160 -0
  106. package/dist/dns-cli-CWxKD22D.js +198 -0
  107. package/dist/dns-cli-CzKr_Fxj.js +201 -0
  108. package/dist/docs-cli-BNyxUbWr.js +159 -0
  109. package/dist/docs-cli-DYpTbo3i.js +161 -0
  110. package/dist/doctor-C8fDYZLq.js +2583 -0
  111. package/dist/doctor-hYcqp7c0.js +2585 -0
  112. package/dist/entry.js +1326 -0
  113. package/dist/env-l7QVNj6j.js +32 -0
  114. package/dist/errors-CMCg46fK.js +1952 -0
  115. package/dist/exec-B8JKbXKW.js +246 -0
  116. package/dist/exec-BMnoMcZW.js +1099 -0
  117. package/dist/exec-HEWTMJ7j.js +246 -0
  118. package/dist/exec-approvals-DtrnHx6M.js +1026 -0
  119. package/dist/exec-approvals-Y42bE8ud.js +1026 -0
  120. package/dist/exec-approvals-cli-CIedYxP3.js +385 -0
  121. package/dist/exec-approvals-cli-xpbxnj4O.js +388 -0
  122. package/dist/extensionAPI.js +66572 -0
  123. package/dist/format-Dzy9uRLE.js +34 -0
  124. package/dist/format-sj0fELBK.js +34 -0
  125. package/dist/gateway-cli-5A-KNLEC.js +16635 -0
  126. package/dist/gateway-cli-B8kS4chb.js +16637 -0
  127. package/dist/gateway-rpc-15n38Ize.js +28 -0
  128. package/dist/gateway-rpc-TMVRgGfj.js +28 -0
  129. package/dist/github-copilot-auth-DVZj4Zgh.js +1104 -0
  130. package/dist/github-copilot-auth-DeGYyLY9.js +1104 -0
  131. package/dist/github-copilot-token-B3SA95yo.js +103 -0
  132. package/dist/github-copilot-token-C8XFYz0i.js +103 -0
  133. package/dist/github-copilot-token-CnxakiSC.js +103 -0
  134. package/dist/gmail-setup-utils-CWPC386a.js +428 -0
  135. package/dist/gmail-setup-utils-eJVB5Ewp.js +428 -0
  136. package/dist/health-format-B0tMTk3C.js +1189 -0
  137. package/dist/health-format-DaURVaUn.js +1188 -0
  138. package/dist/help-format-CEsRHU2f.js +17 -0
  139. package/dist/help-format-GuCWws6r.js +17 -0
  140. package/dist/helpers-BEJ-phFf.js +25 -0
  141. package/dist/helpers-BtbBZVKZ.js +10 -0
  142. package/dist/helpers-C12w9zxf.js +10 -0
  143. package/dist/helpers-CzjGJZmJ.js +25 -0
  144. package/dist/hooks/bundled/boot-md/HOOK.md +19 -0
  145. package/dist/hooks/bundled/command-logger/HOOK.md +122 -0
  146. package/dist/hooks/bundled/session-memory/HOOK.md +109 -0
  147. package/dist/hooks/bundled/soul-evil/HOOK.md +71 -0
  148. package/dist/hooks-cli-BZCMAnW2.js +1058 -0
  149. package/dist/hooks-cli-D0CEFg3P.js +1061 -0
  150. package/dist/hooks-status-Bn7_O8PM.js +443 -0
  151. package/dist/hooks-status-BrWVfIn0.js +443 -0
  152. package/dist/image-BS022pvv.js +1421 -0
  153. package/dist/image-BzJtY34J.js +629 -0
  154. package/dist/image-CBqmIbQQ.js +629 -0
  155. package/dist/index.js +5809 -0
  156. package/dist/installs-BP4K5L33.js +388 -0
  157. package/dist/installs-DOpTt7VZ.js +388 -0
  158. package/dist/is-main-B4o72sqg.js +25 -0
  159. package/dist/is-main-PYGa3tDA.js +25 -0
  160. package/dist/links-B4nk2iDf.js +15 -0
  161. package/dist/links-DwjRqxgR.js +15 -0
  162. package/dist/loader-Cn4EV_pf.js +63690 -0
  163. package/dist/logging-CS3tbYDj.js +15 -0
  164. package/dist/logging-CY-Q5cwf.js +1 -0
  165. package/dist/logging-DhiLkhLw.js +15 -0
  166. package/dist/logging-pqyrk15z.js +1 -0
  167. package/dist/login-qr-CD164Aw1.js +478 -0
  168. package/dist/login-qr-D7Zdgji2.js +478 -0
  169. package/dist/login-qr-YgILJ4VC.js +475 -0
  170. package/dist/logs-cli-BdS0Uv0I.js +227 -0
  171. package/dist/logs-cli-CqSN1GzB.js +230 -0
  172. package/dist/manager-CfGY5zND.js +2870 -0
  173. package/dist/manager-CjuBqFRL.js +2870 -0
  174. package/dist/manager-CoBEAQKm.js +2872 -0
  175. package/dist/manifest-registry-Bwjq9Iev.js +668 -0
  176. package/dist/manifest-registry-D2Yntqcb.js +668 -0
  177. package/dist/message-channel-Cjsiqxok.js +105 -0
  178. package/dist/message-channel-D6v_oPAg.js +105 -0
  179. package/dist/model-selection-Cv5Ox_tY.js +2956 -0
  180. package/dist/model-selection-Dr-5U5-l.js +2708 -0
  181. package/dist/models-cli-B39ckynD.js +2541 -0
  182. package/dist/models-cli-DoiYsBYw.js +2544 -0
  183. package/dist/net-CFCxaipF.js +137 -0
  184. package/dist/net-DKJPqXuW.js +137 -0
  185. package/dist/node-cli-C_FYF-RA.js +1456 -0
  186. package/dist/node-cli-DWPoNsQS.js +1459 -0
  187. package/dist/node-service-DcJREOww.js +67 -0
  188. package/dist/node-service-DuZ9Us9h.js +67 -0
  189. package/dist/nodes-cli-Elo6tlen.js +1210 -0
  190. package/dist/nodes-cli-zqryRUWB.js +1207 -0
  191. package/dist/nodes-screen-C4aCrxie.js +157 -0
  192. package/dist/nodes-screen-D4PSynkR.js +157 -0
  193. package/dist/note-CQhSvgQv.js +73 -0
  194. package/dist/note-_C44YfAQ.js +73 -0
  195. package/dist/onboard-channels-CHBDi-ZA.js +670 -0
  196. package/dist/onboard-channels-DOEKyxaL.js +670 -0
  197. package/dist/onboard-skills-BUTXREDZ.js +3327 -0
  198. package/dist/onboard-skills-CSLYZmZA.js +3327 -0
  199. package/dist/onboarding-CgKb8b39.js +3232 -0
  200. package/dist/openclaw-root-9ILYSmJ9.js +84 -0
  201. package/dist/openclaw-root-Cvotktkd.js +84 -0
  202. package/dist/pairing-cli-B4UGR2at.js +114 -0
  203. package/dist/pairing-cli-BWDDl8cf.js +117 -0
  204. package/dist/pairing-labels-ClZ-fTWT.js +9 -0
  205. package/dist/pairing-labels-Ds7BPOkj.js +9 -0
  206. package/dist/pairing-store-DDLNuzmx.js +391 -0
  207. package/dist/pairing-store-DRn08lZD.js +391 -0
  208. package/dist/parse-87ybtYW1.js +23 -0
  209. package/dist/parse-OCFfznr3.js +23 -0
  210. package/dist/parse-log-line-C9aL5PUL.js +44 -0
  211. package/dist/parse-log-line-DxRaGzQb.js +44 -0
  212. package/dist/parse-timeout-CFqNj7No.js +16 -0
  213. package/dist/parse-timeout-DV8NQQWk.js +16 -0
  214. package/dist/path-env-C7kiJUgG.js +77 -0
  215. package/dist/path-env-DEj4CiFN.js +77 -0
  216. package/dist/paths-B-q1nXdY.js +43 -0
  217. package/dist/paths-B1kfl4h5.js +164 -0
  218. package/dist/paths-B4kigINg.js +40 -0
  219. package/dist/paths-CHGbP1-A.js +43 -0
  220. package/dist/paths-scjhy7N2.js +180 -0
  221. package/dist/pi-embedded-helpers-C19wUpMB.js +8451 -0
  222. package/dist/pi-embedded-helpers-CT5VuLCb.js +1293 -0
  223. package/dist/pi-embedded-helpers-Dl8e5Rf8.js +1293 -0
  224. package/dist/pi-model-discovery-B6CsmK6Y.js +20 -0
  225. package/dist/pi-model-discovery-DsRqYJLy.js +20 -0
  226. package/dist/pi-model-discovery-EhM2JAQo.js +20 -0
  227. package/dist/pi-tools.policy-BvkSDFDN.js +229 -0
  228. package/dist/plugin-auto-enable-Bd_StZzz.js +461 -0
  229. package/dist/plugin-auto-enable-DBhXb_0x.js +461 -0
  230. package/dist/plugin-sdk/agent-scope-DdwUKIOe.js +606 -0
  231. package/dist/plugin-sdk/chrome-G8apFa5p.js +1953 -0
  232. package/dist/plugin-sdk/command-format-qUVxzqYm.js +52 -0
  233. package/dist/plugin-sdk/config-Cm1M7tgH.js +5623 -0
  234. package/dist/plugin-sdk/deliver-Cl8uowiO.js +2557 -0
  235. package/dist/plugin-sdk/exec-Cm9b2r9Q.js +1107 -0
  236. package/dist/plugin-sdk/github-copilot-token-BHNcM4_B.js +103 -0
  237. package/dist/plugin-sdk/image-7PgoS2VD.js +1421 -0
  238. package/dist/plugin-sdk/index.d.ts +8908 -0
  239. package/dist/plugin-sdk/index.js +70888 -0
  240. package/dist/plugin-sdk/login-qr-qTALvWi2.js +475 -0
  241. package/dist/plugin-sdk/manager-Cs3EQZCb.js +2870 -0
  242. package/dist/plugin-sdk/model-selection-BgC1E1a7.js +2708 -0
  243. package/dist/plugin-sdk/paths-BYpoyRv5.js +164 -0
  244. package/dist/plugin-sdk/paths-DNQE-bvr.js +40 -0
  245. package/dist/plugin-sdk/pi-embedded-helpers-5jNqW_dE.js +8755 -0
  246. package/dist/plugin-sdk/pi-model-discovery-BUGEht9A.js +20 -0
  247. package/dist/plugin-sdk/pw-ai-COTtei4a.js +1649 -0
  248. package/dist/plugin-sdk/qmd-manager-ClSwiAJl.js +615 -0
  249. package/dist/plugin-sdk/redact-2AzjOfk2.js +94 -0
  250. package/dist/plugin-sdk/rolldown-runtime-Cbj13DAv.js +20 -0
  251. package/dist/plugin-sdk/sqlite-gCW7MlLs.js +215 -0
  252. package/dist/plugin-sdk/transcript-events-DGF257vD.js +17 -0
  253. package/dist/plugins-C3Bm-HQV.js +494 -0
  254. package/dist/plugins-QJjTXliB.js +495 -0
  255. package/dist/plugins-cli-DTci0JQb.js +443 -0
  256. package/dist/plugins-cli-wJsN1HHK.js +440 -0
  257. package/dist/ports-CiW9dmMq.js +96 -0
  258. package/dist/program-BWpTHh1I.js +188 -0
  259. package/dist/progress-Bcjniu7m.js +133 -0
  260. package/dist/progress-CvaSPjS9.js +133 -0
  261. package/dist/prompt-style-CFsleyxV.js +9 -0
  262. package/dist/prompt-style-DYJdrXyV.js +9 -0
  263. package/dist/prompts-Bt9fwsg2.js +10 -0
  264. package/dist/prompts-CudpZgTI.js +10 -0
  265. package/dist/pw-ai-08F3GD-3.js +1649 -0
  266. package/dist/pw-ai-ZmHxHQnx.js +1651 -0
  267. package/dist/pw-ai-tNPuRNn3.js +1649 -0
  268. package/dist/qmd-manager-2r-4n3sP.js +617 -0
  269. package/dist/qmd-manager-CF52nuBg.js +615 -0
  270. package/dist/qmd-manager-HEm5H2mk.js +616 -0
  271. package/dist/redact-BICFkpn7.js +97 -0
  272. package/dist/redact-BIMJ3ntQ.js +94 -0
  273. package/dist/redact-KzWHRS5J.js +97 -0
  274. package/dist/register.subclis-D2K25c84.js +348 -0
  275. package/dist/register.subclis-Dd8LbOLi.js +342 -0
  276. package/dist/reply-5UNWRwMn.js +63693 -0
  277. package/dist/restart-sentinel-Cr0vUxB8.js +65 -0
  278. package/dist/restart-sentinel-DUemCjgU.js +65 -0
  279. package/dist/rolldown-runtime-Cbj13DAv.js +20 -0
  280. package/dist/routes-C6UpTPas.js +2410 -0
  281. package/dist/routes-ClNyEvlm.js +2410 -0
  282. package/dist/rpc-D0mf7DIw.js +95 -0
  283. package/dist/rpc-DYdOrgd9.js +95 -0
  284. package/dist/run-main-CojI7gWx.js +194 -0
  285. package/dist/runtime-guard-68M_evhb.js +60 -0
  286. package/dist/runtime-guard-DkjmhnBD.js +60 -0
  287. package/dist/sandbox-Ca81z3Tw.js +2924 -0
  288. package/dist/sandbox-cli-D75GApgp.js +459 -0
  289. package/dist/sandbox-cli-E4SJsC1C.js +462 -0
  290. package/dist/sandbox-knontqD9.js +2925 -0
  291. package/dist/security-cli-BLihvXO-.js +503 -0
  292. package/dist/security-cli-IGQCsK4g.js +506 -0
  293. package/dist/server-context-B9GX5GOI.js +740 -0
  294. package/dist/server-context-BFH7HB_M.js +740 -0
  295. package/dist/server-node-events-CTdHBiEA.js +218 -0
  296. package/dist/server-node-events-DAV14qPr.js +215 -0
  297. package/dist/service-BZNBq9hq.js +680 -0
  298. package/dist/service-C-BLXx9U.js +680 -0
  299. package/dist/service-audit-BfJv4NqZ.js +542 -0
  300. package/dist/service-audit-Bw3M2OEI.js +542 -0
  301. package/dist/shared-5SH-45AX.js +74 -0
  302. package/dist/shared-BxRm5uLU.js +74 -0
  303. package/dist/shared-C80Rmxsd.js +150 -0
  304. package/dist/shared-fGK6_D2v.js +150 -0
  305. package/dist/skills-Bhp0l6UK.js +693 -0
  306. package/dist/skills-Tky2kCMO.js +694 -0
  307. package/dist/skills-cli-6rCClAE4.js +287 -0
  308. package/dist/skills-cli-C4nLCrLw.js +290 -0
  309. package/dist/skills-status-CENcKr3I.js +187 -0
  310. package/dist/skills-status-DX1eUYvk.js +187 -0
  311. package/dist/sqlite-CmdZSZRx.js +197 -0
  312. package/dist/sqlite-Dnmf3LS7.js +215 -0
  313. package/dist/sqlite-QDf0yuU0.js +215 -0
  314. package/dist/status-BSfGAp2D.js +27 -0
  315. package/dist/status-Bp_2NMjt.js +27 -0
  316. package/dist/status-C0ANDr0T.js +3140 -0
  317. package/dist/status-CCHBIZnm.js +21 -0
  318. package/dist/status-Vuqbw2Bb.js +21 -0
  319. package/dist/status.update-BZW5r8Su.js +79 -0
  320. package/dist/status.update-BnD93_O8.js +79 -0
  321. package/dist/subsystem-CAq3uyo7.js +834 -0
  322. package/dist/system-cli-Bb9zmCO1.js +83 -0
  323. package/dist/system-cli-TIIQ04ls.js +80 -0
  324. package/dist/systemd-0Qa_nGqe.js +438 -0
  325. package/dist/systemd-Czb0Xsm7.js +438 -0
  326. package/dist/systemd-hints-CWoEOQRb.js +19 -0
  327. package/dist/systemd-hints-Cv3RN_mZ.js +19 -0
  328. package/dist/systemd-linger-CsdvcIoS.js +75 -0
  329. package/dist/systemd-linger-DKUFHcLn.js +75 -0
  330. package/dist/table-DNPESyNj.js +279 -0
  331. package/dist/table-DS4-gmkV.js +279 -0
  332. package/dist/tailnet-Bg_vE5qi.js +42 -0
  333. package/dist/tailnet-CrNWlQRJ.js +42 -0
  334. package/dist/tailscale-CBv58toW.js +252 -0
  335. package/dist/tailscale-DCnMs7_q.js +225 -0
  336. package/dist/tool-display-BEACy9rK.js +795 -0
  337. package/dist/tool-display-NYQnSpdo.js +795 -0
  338. package/dist/transcript-events-CsB1Saa6.js +17 -0
  339. package/dist/transcript-events-DDYvbmRV.js +17 -0
  340. package/dist/transcript-events-JLH5W4He.js +17 -0
  341. package/dist/tui--NY0rnjr.js +2542 -0
  342. package/dist/tui-DqJfGtvM.js +2543 -0
  343. package/dist/tui-cli-BuHNY6wF.js +54 -0
  344. package/dist/tui-cli-LMFV982e.js +57 -0
  345. package/dist/update-CRpHtCgz.js +317 -0
  346. package/dist/update-D3qruxhj.js +317 -0
  347. package/dist/update-cli-CFF-pslM.js +948 -0
  348. package/dist/update-cli-cn9pEMX7.js +951 -0
  349. package/dist/update-runner-CxGU142L.js +1221 -0
  350. package/dist/update-runner-DNobz_ft.js +1221 -0
  351. package/dist/utils-CKSrBNwq.js +192 -0
  352. package/dist/utils-DX85MiPR.js +188 -0
  353. package/dist/webhooks-cli-BGtt2HAR.js +312 -0
  354. package/dist/webhooks-cli-DHLZrEO_.js +309 -0
  355. package/dist/widearea-dns-BpG7ATO8.js +127 -0
  356. package/dist/widearea-dns-D4wkCJly.js +127 -0
  357. package/dist/ws-3zr8WUwL.js +13 -0
  358. package/dist/ws-log-BXcT2xQk.js +267 -0
  359. package/dist/ws-log-DbDIUsgz.js +267 -0
  360. package/dist/ws-lzrgabja.js +13 -0
  361. package/dist/wsl-D2O2qOrl.js +160 -0
  362. package/docs/.i18n/README.md +31 -0
  363. package/docs/.i18n/glossary.zh-CN.json +190 -0
  364. package/docs/.i18n/zh-CN.tm.jsonl +1329 -0
  365. package/docs/CNAME +1 -0
  366. package/docs/_config.yml +53 -0
  367. package/docs/_layouts/default.html +145 -0
  368. package/docs/assets/markdown.css +179 -0
  369. package/docs/assets/openclaw-logo-text-dark.png +0 -0
  370. package/docs/assets/openclaw-logo-text.png +0 -0
  371. package/docs/assets/pixel-lobster.svg +60 -0
  372. package/docs/assets/showcase/agents-ui.jpg +0 -0
  373. package/docs/assets/showcase/bambu-cli.png +0 -0
  374. package/docs/assets/showcase/codexmonitor.png +0 -0
  375. package/docs/assets/showcase/gohome-grafana.png +0 -0
  376. package/docs/assets/showcase/ios-testflight.jpg +0 -0
  377. package/docs/assets/showcase/oura-health.png +0 -0
  378. package/docs/assets/showcase/padel-cli.svg +11 -0
  379. package/docs/assets/showcase/padel-screenshot.jpg +0 -0
  380. package/docs/assets/showcase/papla-tts.jpg +0 -0
  381. package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
  382. package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
  383. package/docs/assets/showcase/roborock-status.svg +13 -0
  384. package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
  385. package/docs/assets/showcase/snag.png +0 -0
  386. package/docs/assets/showcase/tesco-shop.jpg +0 -0
  387. package/docs/assets/showcase/wienerlinien.png +0 -0
  388. package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
  389. package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
  390. package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
  391. package/docs/assets/terminal.css +473 -0
  392. package/docs/assets/theme.js +55 -0
  393. package/docs/automation/auth-monitoring.md +44 -0
  394. package/docs/automation/cron-jobs.md +468 -0
  395. package/docs/automation/cron-vs-heartbeat.md +282 -0
  396. package/docs/automation/gmail-pubsub.md +256 -0
  397. package/docs/automation/poll.md +69 -0
  398. package/docs/automation/webhook.md +163 -0
  399. package/docs/bedrock.md +176 -0
  400. package/docs/brave-search.md +41 -0
  401. package/docs/broadcast-groups.md +442 -0
  402. package/docs/channels/bluebubbles.md +338 -0
  403. package/docs/channels/discord.md +475 -0
  404. package/docs/channels/feishu.md +507 -0
  405. package/docs/channels/googlechat.md +250 -0
  406. package/docs/channels/grammy.md +31 -0
  407. package/docs/channels/imessage.md +299 -0
  408. package/docs/channels/index.md +46 -0
  409. package/docs/channels/line.md +186 -0
  410. package/docs/channels/location.md +56 -0
  411. package/docs/channels/matrix.md +233 -0
  412. package/docs/channels/mattermost.md +138 -0
  413. package/docs/channels/msteams.md +768 -0
  414. package/docs/channels/nextcloud-talk.md +136 -0
  415. package/docs/channels/nostr.md +233 -0
  416. package/docs/channels/signal.md +202 -0
  417. package/docs/channels/slack.md +548 -0
  418. package/docs/channels/telegram.md +750 -0
  419. package/docs/channels/tlon.md +132 -0
  420. package/docs/channels/troubleshooting.md +29 -0
  421. package/docs/channels/twitch.md +379 -0
  422. package/docs/channels/whatsapp.md +404 -0
  423. package/docs/channels/zalo.md +189 -0
  424. package/docs/channels/zalouser.md +140 -0
  425. package/docs/cli/acp.md +170 -0
  426. package/docs/cli/agent.md +24 -0
  427. package/docs/cli/agents.md +75 -0
  428. package/docs/cli/approvals.md +50 -0
  429. package/docs/cli/browser.md +107 -0
  430. package/docs/cli/channels.md +79 -0
  431. package/docs/cli/config.md +50 -0
  432. package/docs/cli/configure.md +33 -0
  433. package/docs/cli/cron.md +42 -0
  434. package/docs/cli/dashboard.md +16 -0
  435. package/docs/cli/devices.md +67 -0
  436. package/docs/cli/directory.md +63 -0
  437. package/docs/cli/dns.md +23 -0
  438. package/docs/cli/docs.md +15 -0
  439. package/docs/cli/doctor.md +41 -0
  440. package/docs/cli/gateway.md +199 -0
  441. package/docs/cli/health.md +21 -0
  442. package/docs/cli/hooks.md +304 -0
  443. package/docs/cli/index.md +1029 -0
  444. package/docs/cli/logs.md +24 -0
  445. package/docs/cli/memory.md +45 -0
  446. package/docs/cli/message.md +239 -0
  447. package/docs/cli/models.md +79 -0
  448. package/docs/cli/node.md +112 -0
  449. package/docs/cli/nodes.md +73 -0
  450. package/docs/cli/onboard.md +29 -0
  451. package/docs/cli/pairing.md +21 -0
  452. package/docs/cli/plugins.md +62 -0
  453. package/docs/cli/reset.md +17 -0
  454. package/docs/cli/sandbox.md +152 -0
  455. package/docs/cli/security.md +26 -0
  456. package/docs/cli/sessions.md +16 -0
  457. package/docs/cli/setup.md +29 -0
  458. package/docs/cli/skills.md +26 -0
  459. package/docs/cli/status.md +26 -0
  460. package/docs/cli/system.md +60 -0
  461. package/docs/cli/tui.md +23 -0
  462. package/docs/cli/uninstall.md +17 -0
  463. package/docs/cli/update.md +98 -0
  464. package/docs/cli/voicecall.md +34 -0
  465. package/docs/cli/webhooks.md +25 -0
  466. package/docs/concepts/agent-loop.md +146 -0
  467. package/docs/concepts/agent-workspace.md +233 -0
  468. package/docs/concepts/agent.md +123 -0
  469. package/docs/concepts/architecture.md +129 -0
  470. package/docs/concepts/channel-routing.md +114 -0
  471. package/docs/concepts/compaction.md +61 -0
  472. package/docs/concepts/context.md +161 -0
  473. package/docs/concepts/group-messages.md +84 -0
  474. package/docs/concepts/groups.md +373 -0
  475. package/docs/concepts/markdown-formatting.md +130 -0
  476. package/docs/concepts/memory.md +546 -0
  477. package/docs/concepts/messages.md +154 -0
  478. package/docs/concepts/model-failover.md +149 -0
  479. package/docs/concepts/model-providers.md +316 -0
  480. package/docs/concepts/models.md +208 -0
  481. package/docs/concepts/multi-agent.md +376 -0
  482. package/docs/concepts/oauth.md +145 -0
  483. package/docs/concepts/presence.md +102 -0
  484. package/docs/concepts/queue.md +89 -0
  485. package/docs/concepts/retry.md +69 -0
  486. package/docs/concepts/session-pruning.md +122 -0
  487. package/docs/concepts/session-tool.md +193 -0
  488. package/docs/concepts/session.md +188 -0
  489. package/docs/concepts/sessions.md +10 -0
  490. package/docs/concepts/streaming.md +135 -0
  491. package/docs/concepts/system-prompt.md +115 -0
  492. package/docs/concepts/timezone.md +91 -0
  493. package/docs/concepts/typebox.md +289 -0
  494. package/docs/concepts/typing-indicators.md +68 -0
  495. package/docs/concepts/usage-tracking.md +35 -0
  496. package/docs/date-time.md +128 -0
  497. package/docs/debug/node-issue.md +83 -0
  498. package/docs/debugging.md +162 -0
  499. package/docs/diagnostics/flags.md +91 -0
  500. package/docs/docs.json +1587 -0
  501. package/docs/environment.md +81 -0
  502. package/docs/experiments/onboarding-config-protocol.md +40 -0
  503. package/docs/experiments/plans/cron-add-hardening.md +63 -0
  504. package/docs/experiments/plans/group-policy-hardening.md +40 -0
  505. package/docs/experiments/plans/openresponses-gateway.md +123 -0
  506. package/docs/experiments/proposals/model-config.md +36 -0
  507. package/docs/experiments/research/memory.md +228 -0
  508. package/docs/gateway/authentication.md +145 -0
  509. package/docs/gateway/background-process.md +93 -0
  510. package/docs/gateway/bonjour.md +167 -0
  511. package/docs/gateway/bridge-protocol.md +89 -0
  512. package/docs/gateway/cli-backends.md +223 -0
  513. package/docs/gateway/configuration-examples.md +606 -0
  514. package/docs/gateway/configuration.md +3393 -0
  515. package/docs/gateway/discovery.md +116 -0
  516. package/docs/gateway/doctor.md +282 -0
  517. package/docs/gateway/gateway-lock.md +34 -0
  518. package/docs/gateway/health.md +35 -0
  519. package/docs/gateway/heartbeat.md +302 -0
  520. package/docs/gateway/index.md +328 -0
  521. package/docs/gateway/local-models.md +150 -0
  522. package/docs/gateway/logging.md +113 -0
  523. package/docs/gateway/multiple-gateways.md +112 -0
  524. package/docs/gateway/openai-http-api.md +118 -0
  525. package/docs/gateway/openresponses-http-api.md +317 -0
  526. package/docs/gateway/pairing.md +99 -0
  527. package/docs/gateway/protocol.md +221 -0
  528. package/docs/gateway/remote-gateway-readme.md +157 -0
  529. package/docs/gateway/remote.md +127 -0
  530. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +128 -0
  531. package/docs/gateway/sandboxing.md +193 -0
  532. package/docs/gateway/security/formal-verification.md +164 -0
  533. package/docs/gateway/security/index.md +825 -0
  534. package/docs/gateway/tailscale.md +127 -0
  535. package/docs/gateway/tools-invoke-http-api.md +85 -0
  536. package/docs/gateway/troubleshooting.md +767 -0
  537. package/docs/help/faq.md +2830 -0
  538. package/docs/help/index.md +21 -0
  539. package/docs/help/troubleshooting.md +98 -0
  540. package/docs/hooks/soul-evil.md +69 -0
  541. package/docs/hooks.md +913 -0
  542. package/docs/images/feishu-step2-create-app.png +0 -0
  543. package/docs/images/feishu-step3-credentials.png +0 -0
  544. package/docs/images/feishu-step4-permissions.png +0 -0
  545. package/docs/images/feishu-step5-bot-capability.png +0 -0
  546. package/docs/images/feishu-step6-event-subscription.png +0 -0
  547. package/docs/images/groups-flow.svg +52 -0
  548. package/docs/images/mobile-ui-screenshot.png +0 -0
  549. package/docs/index.md +258 -0
  550. package/docs/install/ansible.md +208 -0
  551. package/docs/install/bun.md +59 -0
  552. package/docs/install/development-channels.md +75 -0
  553. package/docs/install/docker.md +567 -0
  554. package/docs/install/index.md +185 -0
  555. package/docs/install/installer.md +123 -0
  556. package/docs/install/migrating.md +192 -0
  557. package/docs/install/nix.md +96 -0
  558. package/docs/install/node.md +78 -0
  559. package/docs/install/uninstall.md +128 -0
  560. package/docs/install/updating.md +228 -0
  561. package/docs/logging.md +350 -0
  562. package/docs/multi-agent-sandbox-tools.md +395 -0
  563. package/docs/network.md +54 -0
  564. package/docs/nodes/audio.md +114 -0
  565. package/docs/nodes/camera.md +156 -0
  566. package/docs/nodes/images.md +72 -0
  567. package/docs/nodes/index.md +341 -0
  568. package/docs/nodes/location-command.md +113 -0
  569. package/docs/nodes/media-understanding.md +379 -0
  570. package/docs/nodes/talk.md +90 -0
  571. package/docs/nodes/voicewake.md +65 -0
  572. package/docs/northflank.mdx +53 -0
  573. package/docs/perplexity.md +80 -0
  574. package/docs/pi-dev.md +70 -0
  575. package/docs/pi.md +612 -0
  576. package/docs/platforms/android.md +148 -0
  577. package/docs/platforms/digitalocean.md +262 -0
  578. package/docs/platforms/exe-dev.md +125 -0
  579. package/docs/platforms/fly.md +486 -0
  580. package/docs/platforms/gcp.md +503 -0
  581. package/docs/platforms/hetzner.md +330 -0
  582. package/docs/platforms/index.md +53 -0
  583. package/docs/platforms/ios.md +107 -0
  584. package/docs/platforms/linux.md +94 -0
  585. package/docs/platforms/mac/bundled-gateway.md +73 -0
  586. package/docs/platforms/mac/canvas.md +125 -0
  587. package/docs/platforms/mac/child-process.md +69 -0
  588. package/docs/platforms/mac/dev-setup.md +102 -0
  589. package/docs/platforms/mac/health.md +34 -0
  590. package/docs/platforms/mac/icon.md +31 -0
  591. package/docs/platforms/mac/logging.md +57 -0
  592. package/docs/platforms/mac/menu-bar.md +81 -0
  593. package/docs/platforms/mac/peekaboo.md +65 -0
  594. package/docs/platforms/mac/permissions.md +44 -0
  595. package/docs/platforms/mac/release.md +85 -0
  596. package/docs/platforms/mac/remote.md +83 -0
  597. package/docs/platforms/mac/signing.md +47 -0
  598. package/docs/platforms/mac/skills.md +33 -0
  599. package/docs/platforms/mac/voice-overlay.md +60 -0
  600. package/docs/platforms/mac/voicewake.md +67 -0
  601. package/docs/platforms/mac/webchat.md +41 -0
  602. package/docs/platforms/mac/xpc.md +61 -0
  603. package/docs/platforms/macos-vm.md +281 -0
  604. package/docs/platforms/macos.md +203 -0
  605. package/docs/platforms/oracle.md +303 -0
  606. package/docs/platforms/raspberry-pi.md +358 -0
  607. package/docs/platforms/windows.md +159 -0
  608. package/docs/plugin.md +664 -0
  609. package/docs/plugins/agent-tools.md +99 -0
  610. package/docs/plugins/manifest.md +71 -0
  611. package/docs/plugins/voice-call.md +284 -0
  612. package/docs/plugins/zalouser.md +81 -0
  613. package/docs/prose.md +134 -0
  614. package/docs/providers/anthropic.md +152 -0
  615. package/docs/providers/claude-max-api-proxy.md +148 -0
  616. package/docs/providers/cloudflare-ai-gateway.md +71 -0
  617. package/docs/providers/deepgram.md +93 -0
  618. package/docs/providers/github-copilot.md +72 -0
  619. package/docs/providers/glm.md +33 -0
  620. package/docs/providers/index.md +63 -0
  621. package/docs/providers/minimax.md +208 -0
  622. package/docs/providers/models.md +51 -0
  623. package/docs/providers/moonshot.md +142 -0
  624. package/docs/providers/ollama.md +223 -0
  625. package/docs/providers/openai.md +62 -0
  626. package/docs/providers/opencode.md +36 -0
  627. package/docs/providers/openrouter.md +37 -0
  628. package/docs/providers/qwen.md +53 -0
  629. package/docs/providers/synthetic.md +99 -0
  630. package/docs/providers/venice.md +267 -0
  631. package/docs/providers/vercel-ai-gateway.md +50 -0
  632. package/docs/providers/xiaomi.md +64 -0
  633. package/docs/providers/zai.md +36 -0
  634. package/docs/railway.mdx +99 -0
  635. package/docs/refactor/clawnet.md +417 -0
  636. package/docs/refactor/exec-host.md +316 -0
  637. package/docs/refactor/outbound-session-mirroring.md +85 -0
  638. package/docs/refactor/plugin-sdk.md +214 -0
  639. package/docs/refactor/strict-config.md +93 -0
  640. package/docs/reference/AGENTS.default.md +124 -0
  641. package/docs/reference/RELEASING.md +120 -0
  642. package/docs/reference/api-usage-costs.md +137 -0
  643. package/docs/reference/device-models.md +47 -0
  644. package/docs/reference/rpc.md +43 -0
  645. package/docs/reference/session-management-compaction.md +285 -0
  646. package/docs/reference/templates/AGENTS.dev.md +83 -0
  647. package/docs/reference/templates/AGENTS.md +218 -0
  648. package/docs/reference/templates/BOOT.md +10 -0
  649. package/docs/reference/templates/BOOTSTRAP.md +61 -0
  650. package/docs/reference/templates/HEARTBEAT.md +11 -0
  651. package/docs/reference/templates/IDENTITY.dev.md +47 -0
  652. package/docs/reference/templates/IDENTITY.md +27 -0
  653. package/docs/reference/templates/SOUL.dev.md +76 -0
  654. package/docs/reference/templates/SOUL.md +42 -0
  655. package/docs/reference/templates/TOOLS.dev.md +24 -0
  656. package/docs/reference/templates/TOOLS.md +46 -0
  657. package/docs/reference/templates/USER.dev.md +18 -0
  658. package/docs/reference/templates/USER.md +22 -0
  659. package/docs/reference/test.md +50 -0
  660. package/docs/reference/transcript-hygiene.md +129 -0
  661. package/docs/render.mdx +165 -0
  662. package/docs/scripts.md +28 -0
  663. package/docs/security/formal-verification.md +164 -0
  664. package/docs/start/getting-started.md +208 -0
  665. package/docs/start/hubs.md +185 -0
  666. package/docs/start/lore.md +219 -0
  667. package/docs/start/onboarding.md +110 -0
  668. package/docs/start/openclaw.md +241 -0
  669. package/docs/start/pairing.md +86 -0
  670. package/docs/start/setup.md +149 -0
  671. package/docs/start/showcase.md +416 -0
  672. package/docs/start/wizard.md +349 -0
  673. package/docs/testing.md +368 -0
  674. package/docs/token-use.md +112 -0
  675. package/docs/tools/agent-send.md +53 -0
  676. package/docs/tools/apply-patch.md +50 -0
  677. package/docs/tools/browser-linux-troubleshooting.md +139 -0
  678. package/docs/tools/browser-login.md +68 -0
  679. package/docs/tools/browser.md +576 -0
  680. package/docs/tools/chrome-extension.md +178 -0
  681. package/docs/tools/clawhub.md +257 -0
  682. package/docs/tools/creating-skills.md +54 -0
  683. package/docs/tools/elevated.md +57 -0
  684. package/docs/tools/exec-approvals.md +246 -0
  685. package/docs/tools/exec.md +179 -0
  686. package/docs/tools/firecrawl.md +61 -0
  687. package/docs/tools/index.md +509 -0
  688. package/docs/tools/llm-task.md +115 -0
  689. package/docs/tools/lobster.md +342 -0
  690. package/docs/tools/reactions.md +22 -0
  691. package/docs/tools/skills-config.md +76 -0
  692. package/docs/tools/skills.md +300 -0
  693. package/docs/tools/slash-commands.md +198 -0
  694. package/docs/tools/subagents.md +151 -0
  695. package/docs/tools/thinking.md +73 -0
  696. package/docs/tools/web.md +261 -0
  697. package/docs/tts.md +396 -0
  698. package/docs/tui.md +159 -0
  699. package/docs/vps.md +43 -0
  700. package/docs/web/control-ui.md +221 -0
  701. package/docs/web/dashboard.md +46 -0
  702. package/docs/web/index.md +116 -0
  703. package/docs/web/webchat.md +49 -0
  704. package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
  705. package/docs/whatsapp-openclaw.jpg +0 -0
  706. package/docs/zh-CN/AGENTS.md +59 -0
  707. package/docs/zh-CN/automation/auth-monitoring.md +47 -0
  708. package/docs/zh-CN/automation/cron-jobs.md +424 -0
  709. package/docs/zh-CN/automation/cron-vs-heartbeat.md +286 -0
  710. package/docs/zh-CN/automation/gmail-pubsub.md +249 -0
  711. package/docs/zh-CN/automation/poll.md +76 -0
  712. package/docs/zh-CN/automation/webhook.md +163 -0
  713. package/docs/zh-CN/bedrock.md +170 -0
  714. package/docs/zh-CN/brave-search.md +48 -0
  715. package/docs/zh-CN/broadcast-groups.md +449 -0
  716. package/docs/zh-CN/channels/bluebubbles.md +271 -0
  717. package/docs/zh-CN/channels/discord.md +468 -0
  718. package/docs/zh-CN/channels/feishu.md +513 -0
  719. package/docs/zh-CN/channels/googlechat.md +257 -0
  720. package/docs/zh-CN/channels/grammy.md +38 -0
  721. package/docs/zh-CN/channels/imessage.md +302 -0
  722. package/docs/zh-CN/channels/index.md +53 -0
  723. package/docs/zh-CN/channels/line.md +180 -0
  724. package/docs/zh-CN/channels/location.md +63 -0
  725. package/docs/zh-CN/channels/matrix.md +221 -0
  726. package/docs/zh-CN/channels/mattermost.md +144 -0
  727. package/docs/zh-CN/channels/msteams.md +775 -0
  728. package/docs/zh-CN/channels/nextcloud-talk.md +142 -0
  729. package/docs/zh-CN/channels/nostr.md +240 -0
  730. package/docs/zh-CN/channels/signal.md +209 -0
  731. package/docs/zh-CN/channels/slack.md +531 -0
  732. package/docs/zh-CN/channels/telegram.md +751 -0
  733. package/docs/zh-CN/channels/tlon.md +136 -0
  734. package/docs/zh-CN/channels/troubleshooting.md +36 -0
  735. package/docs/zh-CN/channels/twitch.md +385 -0
  736. package/docs/zh-CN/channels/whatsapp.md +411 -0
  737. package/docs/zh-CN/channels/zalo.md +196 -0
  738. package/docs/zh-CN/channels/zalouser.md +147 -0
  739. package/docs/zh-CN/cli/acp.md +173 -0
  740. package/docs/zh-CN/cli/agent.md +30 -0
  741. package/docs/zh-CN/cli/agents.md +82 -0
  742. package/docs/zh-CN/cli/approvals.md +57 -0
  743. package/docs/zh-CN/cli/browser.md +114 -0
  744. package/docs/zh-CN/cli/channels.md +86 -0
  745. package/docs/zh-CN/cli/config.md +57 -0
  746. package/docs/zh-CN/cli/configure.md +38 -0
  747. package/docs/zh-CN/cli/cron.md +43 -0
  748. package/docs/zh-CN/cli/dashboard.md +23 -0
  749. package/docs/zh-CN/cli/devices.md +74 -0
  750. package/docs/zh-CN/cli/directory.md +70 -0
  751. package/docs/zh-CN/cli/dns.md +30 -0
  752. package/docs/zh-CN/cli/docs.md +22 -0
  753. package/docs/zh-CN/cli/doctor.md +48 -0
  754. package/docs/zh-CN/cli/gateway.md +206 -0
  755. package/docs/zh-CN/cli/health.md +28 -0
  756. package/docs/zh-CN/cli/hooks.md +311 -0
  757. package/docs/zh-CN/cli/index.md +1032 -0
  758. package/docs/zh-CN/cli/logs.md +31 -0
  759. package/docs/zh-CN/cli/memory.md +52 -0
  760. package/docs/zh-CN/cli/message.md +246 -0
  761. package/docs/zh-CN/cli/models.md +85 -0
  762. package/docs/zh-CN/cli/node.md +115 -0
  763. package/docs/zh-CN/cli/nodes.md +80 -0
  764. package/docs/zh-CN/cli/onboard.md +36 -0
  765. package/docs/zh-CN/cli/pairing.md +28 -0
  766. package/docs/zh-CN/cli/plugins.md +66 -0
  767. package/docs/zh-CN/cli/reset.md +24 -0
  768. package/docs/zh-CN/cli/sandbox.md +158 -0
  769. package/docs/zh-CN/cli/security.md +33 -0
  770. package/docs/zh-CN/cli/sessions.md +23 -0
  771. package/docs/zh-CN/cli/setup.md +36 -0
  772. package/docs/zh-CN/cli/skills.md +33 -0
  773. package/docs/zh-CN/cli/status.md +33 -0
  774. package/docs/zh-CN/cli/system.md +63 -0
  775. package/docs/zh-CN/cli/tui.md +30 -0
  776. package/docs/zh-CN/cli/uninstall.md +24 -0
  777. package/docs/zh-CN/cli/update.md +101 -0
  778. package/docs/zh-CN/cli/voicecall.md +41 -0
  779. package/docs/zh-CN/cli/webhooks.md +32 -0
  780. package/docs/zh-CN/concepts/agent-loop.md +146 -0
  781. package/docs/zh-CN/concepts/agent-workspace.md +219 -0
  782. package/docs/zh-CN/concepts/agent.md +115 -0
  783. package/docs/zh-CN/concepts/architecture.md +123 -0
  784. package/docs/zh-CN/concepts/channel-routing.md +117 -0
  785. package/docs/zh-CN/concepts/compaction.md +67 -0
  786. package/docs/zh-CN/concepts/context.md +168 -0
  787. package/docs/zh-CN/concepts/group-messages.md +91 -0
  788. package/docs/zh-CN/concepts/groups.md +379 -0
  789. package/docs/zh-CN/concepts/markdown-formatting.md +117 -0
  790. package/docs/zh-CN/concepts/memory.md +412 -0
  791. package/docs/zh-CN/concepts/messages.md +141 -0
  792. package/docs/zh-CN/concepts/model-failover.md +145 -0
  793. package/docs/zh-CN/concepts/model-providers.md +320 -0
  794. package/docs/zh-CN/concepts/models.md +196 -0
  795. package/docs/zh-CN/concepts/multi-agent.md +372 -0
  796. package/docs/zh-CN/concepts/oauth.md +151 -0
  797. package/docs/zh-CN/concepts/presence.md +99 -0
  798. package/docs/zh-CN/concepts/queue.md +94 -0
  799. package/docs/zh-CN/concepts/retry.md +76 -0
  800. package/docs/zh-CN/concepts/session-pruning.md +129 -0
  801. package/docs/zh-CN/concepts/session-tool.md +200 -0
  802. package/docs/zh-CN/concepts/session.md +166 -0
  803. package/docs/zh-CN/concepts/sessions.md +17 -0
  804. package/docs/zh-CN/concepts/streaming.md +133 -0
  805. package/docs/zh-CN/concepts/system-prompt.md +101 -0
  806. package/docs/zh-CN/concepts/timezone.md +96 -0
  807. package/docs/zh-CN/concepts/typebox.md +284 -0
  808. package/docs/zh-CN/concepts/typing-indicators.md +74 -0
  809. package/docs/zh-CN/concepts/usage-tracking.md +42 -0
  810. package/docs/zh-CN/date-time.md +129 -0
  811. package/docs/zh-CN/debug/node-issue.md +90 -0
  812. package/docs/zh-CN/debugging.md +160 -0
  813. package/docs/zh-CN/diagnostics/flags.md +98 -0
  814. package/docs/zh-CN/environment.md +88 -0
  815. package/docs/zh-CN/experiments/onboarding-config-protocol.md +47 -0
  816. package/docs/zh-CN/experiments/plans/cron-add-hardening.md +70 -0
  817. package/docs/zh-CN/experiments/plans/group-policy-hardening.md +45 -0
  818. package/docs/zh-CN/experiments/plans/openresponses-gateway.md +121 -0
  819. package/docs/zh-CN/experiments/proposals/model-config.md +42 -0
  820. package/docs/zh-CN/experiments/research/memory.md +235 -0
  821. package/docs/zh-CN/gateway/authentication.md +142 -0
  822. package/docs/zh-CN/gateway/background-process.md +100 -0
  823. package/docs/zh-CN/gateway/bonjour.md +174 -0
  824. package/docs/zh-CN/gateway/bridge-protocol.md +86 -0
  825. package/docs/zh-CN/gateway/cli-backends.md +213 -0
  826. package/docs/zh-CN/gateway/configuration-examples.md +587 -0
  827. package/docs/zh-CN/gateway/configuration.md +3332 -0
  828. package/docs/zh-CN/gateway/discovery.md +123 -0
  829. package/docs/zh-CN/gateway/doctor.md +238 -0
  830. package/docs/zh-CN/gateway/gateway-lock.md +41 -0
  831. package/docs/zh-CN/gateway/health.md +42 -0
  832. package/docs/zh-CN/gateway/heartbeat.md +274 -0
  833. package/docs/zh-CN/gateway/index.md +335 -0
  834. package/docs/zh-CN/gateway/local-models.md +157 -0
  835. package/docs/zh-CN/gateway/logging.md +114 -0
  836. package/docs/zh-CN/gateway/multiple-gateways.md +119 -0
  837. package/docs/zh-CN/gateway/openai-http-api.md +125 -0
  838. package/docs/zh-CN/gateway/openresponses-http-api.md +317 -0
  839. package/docs/zh-CN/gateway/pairing.md +99 -0
  840. package/docs/zh-CN/gateway/protocol.md +220 -0
  841. package/docs/zh-CN/gateway/remote-gateway-readme.md +164 -0
  842. package/docs/zh-CN/gateway/remote.md +133 -0
  843. package/docs/zh-CN/gateway/sandbox-vs-tool-policy-vs-elevated.md +135 -0
  844. package/docs/zh-CN/gateway/sandboxing.md +188 -0
  845. package/docs/zh-CN/gateway/security/formal-verification.md +169 -0
  846. package/docs/zh-CN/gateway/security/index.md +777 -0
  847. package/docs/zh-CN/gateway/tailscale.md +124 -0
  848. package/docs/zh-CN/gateway/tools-invoke-http-api.md +92 -0
  849. package/docs/zh-CN/gateway/troubleshooting.md +771 -0
  850. package/docs/zh-CN/help/faq.md +2628 -0
  851. package/docs/zh-CN/help/index.md +28 -0
  852. package/docs/zh-CN/help/troubleshooting.md +104 -0
  853. package/docs/zh-CN/hooks/soul-evil.md +72 -0
  854. package/docs/zh-CN/hooks.md +919 -0
  855. package/docs/zh-CN/index.md +264 -0
  856. package/docs/zh-CN/install/ansible.md +215 -0
  857. package/docs/zh-CN/install/bun.md +65 -0
  858. package/docs/zh-CN/install/development-channels.md +81 -0
  859. package/docs/zh-CN/install/docker.md +532 -0
  860. package/docs/zh-CN/install/index.md +193 -0
  861. package/docs/zh-CN/install/installer.md +128 -0
  862. package/docs/zh-CN/install/migrating.md +199 -0
  863. package/docs/zh-CN/install/nix.md +99 -0
  864. package/docs/zh-CN/install/node.md +85 -0
  865. package/docs/zh-CN/install/uninstall.md +135 -0
  866. package/docs/zh-CN/install/updating.md +233 -0
  867. package/docs/zh-CN/logging.md +329 -0
  868. package/docs/zh-CN/multi-agent-sandbox-tools.md +401 -0
  869. package/docs/zh-CN/network.md +59 -0
  870. package/docs/zh-CN/nodes/audio.md +120 -0
  871. package/docs/zh-CN/nodes/camera.md +162 -0
  872. package/docs/zh-CN/nodes/images.md +79 -0
  873. package/docs/zh-CN/nodes/index.md +348 -0
  874. package/docs/zh-CN/nodes/location-command.md +120 -0
  875. package/docs/zh-CN/nodes/media-understanding.md +380 -0
  876. package/docs/zh-CN/nodes/talk.md +97 -0
  877. package/docs/zh-CN/nodes/voicewake.md +72 -0
  878. package/docs/zh-CN/northflank.mdx +60 -0
  879. package/docs/zh-CN/perplexity.md +84 -0
  880. package/docs/zh-CN/pi-dev.md +77 -0
  881. package/docs/zh-CN/pi.md +619 -0
  882. package/docs/zh-CN/platforms/android.md +155 -0
  883. package/docs/zh-CN/platforms/digitalocean.md +269 -0
  884. package/docs/zh-CN/platforms/exe-dev.md +127 -0
  885. package/docs/zh-CN/platforms/fly.md +490 -0
  886. package/docs/zh-CN/platforms/gcp.md +510 -0
  887. package/docs/zh-CN/platforms/hetzner.md +337 -0
  888. package/docs/zh-CN/platforms/index.md +60 -0
  889. package/docs/zh-CN/platforms/ios.md +114 -0
  890. package/docs/zh-CN/platforms/linux.md +101 -0
  891. package/docs/zh-CN/platforms/mac/bundled-gateway.md +75 -0
  892. package/docs/zh-CN/platforms/mac/canvas.md +128 -0
  893. package/docs/zh-CN/platforms/mac/child-process.md +73 -0
  894. package/docs/zh-CN/platforms/mac/dev-setup.md +109 -0
  895. package/docs/zh-CN/platforms/mac/health.md +41 -0
  896. package/docs/zh-CN/platforms/mac/icon.md +38 -0
  897. package/docs/zh-CN/platforms/mac/logging.md +64 -0
  898. package/docs/zh-CN/platforms/mac/menu-bar.md +88 -0
  899. package/docs/zh-CN/platforms/mac/peekaboo.md +62 -0
  900. package/docs/zh-CN/platforms/mac/permissions.md +46 -0
  901. package/docs/zh-CN/platforms/mac/release.md +92 -0
  902. package/docs/zh-CN/platforms/mac/remote.md +90 -0
  903. package/docs/zh-CN/platforms/mac/signing.md +54 -0
  904. package/docs/zh-CN/platforms/mac/skills.md +40 -0
  905. package/docs/zh-CN/platforms/mac/voice-overlay.md +67 -0
  906. package/docs/zh-CN/platforms/mac/voicewake.md +74 -0
  907. package/docs/zh-CN/platforms/mac/webchat.md +43 -0
  908. package/docs/zh-CN/platforms/mac/xpc.md +68 -0
  909. package/docs/zh-CN/platforms/macos-vm.md +288 -0
  910. package/docs/zh-CN/platforms/macos.md +193 -0
  911. package/docs/zh-CN/platforms/oracle.md +310 -0
  912. package/docs/zh-CN/platforms/raspberry-pi.md +365 -0
  913. package/docs/zh-CN/platforms/windows.md +156 -0
  914. package/docs/zh-CN/plugin.md +639 -0
  915. package/docs/zh-CN/plugins/agent-tools.md +99 -0
  916. package/docs/zh-CN/plugins/manifest.md +68 -0
  917. package/docs/zh-CN/plugins/voice-call.md +250 -0
  918. package/docs/zh-CN/plugins/zalouser.md +88 -0
  919. package/docs/zh-CN/prose.md +141 -0
  920. package/docs/zh-CN/providers/anthropic.md +159 -0
  921. package/docs/zh-CN/providers/claude-max-api-proxy.md +155 -0
  922. package/docs/zh-CN/providers/deepgram.md +97 -0
  923. package/docs/zh-CN/providers/github-copilot.md +67 -0
  924. package/docs/zh-CN/providers/glm.md +39 -0
  925. package/docs/zh-CN/providers/index.md +68 -0
  926. package/docs/zh-CN/providers/minimax.md +206 -0
  927. package/docs/zh-CN/providers/models.md +55 -0
  928. package/docs/zh-CN/providers/moonshot.md +145 -0
  929. package/docs/zh-CN/providers/ollama.md +230 -0
  930. package/docs/zh-CN/providers/openai.md +68 -0
  931. package/docs/zh-CN/providers/opencode.md +41 -0
  932. package/docs/zh-CN/providers/openrouter.md +43 -0
  933. package/docs/zh-CN/providers/qwen.md +55 -0
  934. package/docs/zh-CN/providers/synthetic.md +102 -0
  935. package/docs/zh-CN/providers/venice.md +274 -0
  936. package/docs/zh-CN/providers/vercel-ai-gateway.md +57 -0
  937. package/docs/zh-CN/providers/xiaomi.md +68 -0
  938. package/docs/zh-CN/providers/zai.md +41 -0
  939. package/docs/zh-CN/railway.mdx +106 -0
  940. package/docs/zh-CN/refactor/clawnet.md +424 -0
  941. package/docs/zh-CN/refactor/exec-host.md +323 -0
  942. package/docs/zh-CN/refactor/outbound-session-mirroring.md +92 -0
  943. package/docs/zh-CN/refactor/plugin-sdk.md +221 -0
  944. package/docs/zh-CN/refactor/strict-config.md +100 -0
  945. package/docs/zh-CN/reference/AGENTS.default.md +131 -0
  946. package/docs/zh-CN/reference/RELEASING.md +123 -0
  947. package/docs/zh-CN/reference/api-usage-costs.md +136 -0
  948. package/docs/zh-CN/reference/device-models.md +54 -0
  949. package/docs/zh-CN/reference/rpc.md +48 -0
  950. package/docs/zh-CN/reference/session-management-compaction.md +287 -0
  951. package/docs/zh-CN/reference/templates/AGENTS.dev.md +89 -0
  952. package/docs/zh-CN/reference/templates/AGENTS.md +225 -0
  953. package/docs/zh-CN/reference/templates/BOOT.md +17 -0
  954. package/docs/zh-CN/reference/templates/BOOTSTRAP.md +68 -0
  955. package/docs/zh-CN/reference/templates/HEARTBEAT.md +18 -0
  956. package/docs/zh-CN/reference/templates/IDENTITY.dev.md +54 -0
  957. package/docs/zh-CN/reference/templates/IDENTITY.md +35 -0
  958. package/docs/zh-CN/reference/templates/SOUL.dev.md +83 -0
  959. package/docs/zh-CN/reference/templates/SOUL.md +49 -0
  960. package/docs/zh-CN/reference/templates/TOOLS.dev.md +31 -0
  961. package/docs/zh-CN/reference/templates/TOOLS.md +53 -0
  962. package/docs/zh-CN/reference/templates/USER.dev.md +25 -0
  963. package/docs/zh-CN/reference/templates/USER.md +30 -0
  964. package/docs/zh-CN/reference/test.md +57 -0
  965. package/docs/zh-CN/reference/transcript-hygiene.md +109 -0
  966. package/docs/zh-CN/render.mdx +169 -0
  967. package/docs/zh-CN/scripts.md +35 -0
  968. package/docs/zh-CN/security/formal-verification.md +171 -0
  969. package/docs/zh-CN/start/getting-started.md +206 -0
  970. package/docs/zh-CN/start/hubs.md +191 -0
  971. package/docs/zh-CN/start/lore.md +226 -0
  972. package/docs/zh-CN/start/onboarding.md +105 -0
  973. package/docs/zh-CN/start/openclaw.md +248 -0
  974. package/docs/zh-CN/start/pairing.md +89 -0
  975. package/docs/zh-CN/start/setup.md +153 -0
  976. package/docs/zh-CN/start/showcase.md +423 -0
  977. package/docs/zh-CN/start/wizard.md +331 -0
  978. package/docs/zh-CN/testing.md +375 -0
  979. package/docs/zh-CN/token-use.md +119 -0
  980. package/docs/zh-CN/tools/agent-send.md +59 -0
  981. package/docs/zh-CN/tools/apply-patch.md +57 -0
  982. package/docs/zh-CN/tools/browser-linux-troubleshooting.md +144 -0
  983. package/docs/zh-CN/tools/browser-login.md +75 -0
  984. package/docs/zh-CN/tools/browser.md +553 -0
  985. package/docs/zh-CN/tools/chrome-extension.md +183 -0
  986. package/docs/zh-CN/tools/clawhub.md +209 -0
  987. package/docs/zh-CN/tools/creating-skills.md +61 -0
  988. package/docs/zh-CN/tools/elevated.md +64 -0
  989. package/docs/zh-CN/tools/exec-approvals.md +234 -0
  990. package/docs/zh-CN/tools/exec.md +169 -0
  991. package/docs/zh-CN/tools/firecrawl.md +68 -0
  992. package/docs/zh-CN/tools/index.md +515 -0
  993. package/docs/zh-CN/tools/llm-task.md +117 -0
  994. package/docs/zh-CN/tools/lobster.md +349 -0
  995. package/docs/zh-CN/tools/reactions.md +29 -0
  996. package/docs/zh-CN/tools/skills-config.md +78 -0
  997. package/docs/zh-CN/tools/skills.md +279 -0
  998. package/docs/zh-CN/tools/slash-commands.md +205 -0
  999. package/docs/zh-CN/tools/subagents.md +156 -0
  1000. package/docs/zh-CN/tools/thinking.md +80 -0
  1001. package/docs/zh-CN/tools/web.md +257 -0
  1002. package/docs/zh-CN/tts.md +375 -0
  1003. package/docs/zh-CN/tui.md +166 -0
  1004. package/docs/zh-CN/vps.md +47 -0
  1005. package/docs/zh-CN/web/control-ui.md +191 -0
  1006. package/docs/zh-CN/web/dashboard.md +53 -0
  1007. package/docs/zh-CN/web/index.md +118 -0
  1008. package/docs/zh-CN/web/webchat.md +56 -0
  1009. package/extensions/bluebubbles/README.md +45 -0
  1010. package/extensions/bluebubbles/index.ts +19 -0
  1011. package/extensions/bluebubbles/node_modules/.bin/openclaw +21 -0
  1012. package/extensions/bluebubbles/openclaw.plugin.json +9 -0
  1013. package/extensions/bluebubbles/package.json +36 -0
  1014. package/extensions/bluebubbles/src/accounts.ts +88 -0
  1015. package/extensions/bluebubbles/src/actions.test.ts +650 -0
  1016. package/extensions/bluebubbles/src/actions.ts +438 -0
  1017. package/extensions/bluebubbles/src/attachments.test.ts +345 -0
  1018. package/extensions/bluebubbles/src/attachments.ts +300 -0
  1019. package/extensions/bluebubbles/src/channel.ts +414 -0
  1020. package/extensions/bluebubbles/src/chat.test.ts +461 -0
  1021. package/extensions/bluebubbles/src/chat.ts +378 -0
  1022. package/extensions/bluebubbles/src/config-schema.ts +51 -0
  1023. package/extensions/bluebubbles/src/media-send.ts +174 -0
  1024. package/extensions/bluebubbles/src/monitor.test.ts +2342 -0
  1025. package/extensions/bluebubbles/src/monitor.ts +2490 -0
  1026. package/extensions/bluebubbles/src/onboarding.ts +352 -0
  1027. package/extensions/bluebubbles/src/probe.ts +135 -0
  1028. package/extensions/bluebubbles/src/reactions.test.ts +392 -0
  1029. package/extensions/bluebubbles/src/reactions.ts +188 -0
  1030. package/extensions/bluebubbles/src/runtime.ts +14 -0
  1031. package/extensions/bluebubbles/src/send.test.ts +808 -0
  1032. package/extensions/bluebubbles/src/send.ts +467 -0
  1033. package/extensions/bluebubbles/src/targets.test.ts +183 -0
  1034. package/extensions/bluebubbles/src/targets.ts +422 -0
  1035. package/extensions/bluebubbles/src/types.ts +127 -0
  1036. package/extensions/copilot-proxy/README.md +24 -0
  1037. package/extensions/copilot-proxy/index.ts +148 -0
  1038. package/extensions/copilot-proxy/node_modules/.bin/openclaw +21 -0
  1039. package/extensions/copilot-proxy/openclaw.plugin.json +9 -0
  1040. package/extensions/copilot-proxy/package.json +14 -0
  1041. package/extensions/diagnostics-otel/index.ts +15 -0
  1042. package/extensions/diagnostics-otel/node_modules/.bin/openclaw +21 -0
  1043. package/extensions/diagnostics-otel/openclaw.plugin.json +8 -0
  1044. package/extensions/diagnostics-otel/package.json +27 -0
  1045. package/extensions/diagnostics-otel/src/service.test.ts +226 -0
  1046. package/extensions/diagnostics-otel/src/service.ts +635 -0
  1047. package/extensions/discord/index.ts +17 -0
  1048. package/extensions/discord/node_modules/.bin/openclaw +21 -0
  1049. package/extensions/discord/openclaw.plugin.json +9 -0
  1050. package/extensions/discord/package.json +14 -0
  1051. package/extensions/discord/src/channel.ts +422 -0
  1052. package/extensions/discord/src/runtime.ts +14 -0
  1053. package/extensions/feishu/README.md +47 -0
  1054. package/extensions/feishu/index.ts +15 -0
  1055. package/extensions/feishu/node_modules/.bin/openclaw +21 -0
  1056. package/extensions/feishu/openclaw.plugin.json +9 -0
  1057. package/extensions/feishu/package.json +33 -0
  1058. package/extensions/feishu/src/channel.ts +276 -0
  1059. package/extensions/feishu/src/config-schema.ts +46 -0
  1060. package/extensions/feishu/src/onboarding.ts +278 -0
  1061. package/extensions/google-antigravity-auth/README.md +24 -0
  1062. package/extensions/google-antigravity-auth/index.ts +461 -0
  1063. package/extensions/google-antigravity-auth/node_modules/.bin/openclaw +21 -0
  1064. package/extensions/google-antigravity-auth/openclaw.plugin.json +9 -0
  1065. package/extensions/google-antigravity-auth/package.json +14 -0
  1066. package/extensions/google-gemini-cli-auth/README.md +35 -0
  1067. package/extensions/google-gemini-cli-auth/index.ts +88 -0
  1068. package/extensions/google-gemini-cli-auth/node_modules/.bin/openclaw +21 -0
  1069. package/extensions/google-gemini-cli-auth/oauth.test.ts +240 -0
  1070. package/extensions/google-gemini-cli-auth/oauth.ts +662 -0
  1071. package/extensions/google-gemini-cli-auth/openclaw.plugin.json +9 -0
  1072. package/extensions/google-gemini-cli-auth/package.json +14 -0
  1073. package/extensions/googlechat/index.ts +19 -0
  1074. package/extensions/googlechat/node_modules/.bin/openclaw +21 -0
  1075. package/extensions/googlechat/openclaw.plugin.json +9 -0
  1076. package/extensions/googlechat/package.json +39 -0
  1077. package/extensions/googlechat/src/accounts.ts +147 -0
  1078. package/extensions/googlechat/src/actions.ts +181 -0
  1079. package/extensions/googlechat/src/api.test.ts +61 -0
  1080. package/extensions/googlechat/src/api.ts +282 -0
  1081. package/extensions/googlechat/src/auth.ts +123 -0
  1082. package/extensions/googlechat/src/channel.ts +583 -0
  1083. package/extensions/googlechat/src/monitor.test.ts +22 -0
  1084. package/extensions/googlechat/src/monitor.ts +949 -0
  1085. package/extensions/googlechat/src/onboarding.ts +269 -0
  1086. package/extensions/googlechat/src/runtime.ts +14 -0
  1087. package/extensions/googlechat/src/targets.test.ts +32 -0
  1088. package/extensions/googlechat/src/targets.ts +65 -0
  1089. package/extensions/googlechat/src/types.config.ts +3 -0
  1090. package/extensions/googlechat/src/types.ts +73 -0
  1091. package/extensions/imessage/index.ts +17 -0
  1092. package/extensions/imessage/node_modules/.bin/openclaw +21 -0
  1093. package/extensions/imessage/openclaw.plugin.json +9 -0
  1094. package/extensions/imessage/package.json +14 -0
  1095. package/extensions/imessage/src/channel.ts +294 -0
  1096. package/extensions/imessage/src/runtime.ts +14 -0
  1097. package/extensions/line/index.ts +19 -0
  1098. package/extensions/line/node_modules/.bin/openclaw +21 -0
  1099. package/extensions/line/openclaw.plugin.json +9 -0
  1100. package/extensions/line/package.json +29 -0
  1101. package/extensions/line/src/card-command.ts +344 -0
  1102. package/extensions/line/src/channel.logout.test.ts +99 -0
  1103. package/extensions/line/src/channel.sendPayload.test.ts +306 -0
  1104. package/extensions/line/src/channel.ts +780 -0
  1105. package/extensions/line/src/runtime.ts +14 -0
  1106. package/extensions/llm-task/README.md +97 -0
  1107. package/extensions/llm-task/index.ts +6 -0
  1108. package/extensions/llm-task/node_modules/.bin/openclaw +21 -0
  1109. package/extensions/llm-task/openclaw.plugin.json +21 -0
  1110. package/extensions/llm-task/package.json +14 -0
  1111. package/extensions/llm-task/src/llm-task-tool.test.ts +138 -0
  1112. package/extensions/llm-task/src/llm-task-tool.ts +245 -0
  1113. package/extensions/lobster/README.md +75 -0
  1114. package/extensions/lobster/SKILL.md +97 -0
  1115. package/extensions/lobster/index.ts +14 -0
  1116. package/extensions/lobster/node_modules/.bin/openclaw +21 -0
  1117. package/extensions/lobster/openclaw.plugin.json +10 -0
  1118. package/extensions/lobster/package.json +14 -0
  1119. package/extensions/lobster/src/lobster-tool.test.ts +247 -0
  1120. package/extensions/lobster/src/lobster-tool.ts +328 -0
  1121. package/extensions/matrix/CHANGELOG.md +87 -0
  1122. package/extensions/matrix/index.ts +17 -0
  1123. package/extensions/matrix/node_modules/.bin/markdown-it +21 -0
  1124. package/extensions/matrix/node_modules/.bin/openclaw +21 -0
  1125. package/extensions/matrix/openclaw.plugin.json +9 -0
  1126. package/extensions/matrix/package.json +36 -0
  1127. package/extensions/matrix/src/actions.ts +195 -0
  1128. package/extensions/matrix/src/channel.directory.test.ts +64 -0
  1129. package/extensions/matrix/src/channel.ts +439 -0
  1130. package/extensions/matrix/src/config-schema.ts +62 -0
  1131. package/extensions/matrix/src/directory-live.ts +188 -0
  1132. package/extensions/matrix/src/group-mentions.ts +66 -0
  1133. package/extensions/matrix/src/matrix/accounts.test.ts +82 -0
  1134. package/extensions/matrix/src/matrix/accounts.ts +65 -0
  1135. package/extensions/matrix/src/matrix/actions/client.ts +57 -0
  1136. package/extensions/matrix/src/matrix/actions/messages.ts +128 -0
  1137. package/extensions/matrix/src/matrix/actions/pins.ts +76 -0
  1138. package/extensions/matrix/src/matrix/actions/reactions.ts +96 -0
  1139. package/extensions/matrix/src/matrix/actions/room.ts +85 -0
  1140. package/extensions/matrix/src/matrix/actions/summary.ts +75 -0
  1141. package/extensions/matrix/src/matrix/actions/types.ts +84 -0
  1142. package/extensions/matrix/src/matrix/actions.ts +15 -0
  1143. package/extensions/matrix/src/matrix/active-client.ts +11 -0
  1144. package/extensions/matrix/src/matrix/client/config.ts +160 -0
  1145. package/extensions/matrix/src/matrix/client/create-client.ts +123 -0
  1146. package/extensions/matrix/src/matrix/client/logging.ts +36 -0
  1147. package/extensions/matrix/src/matrix/client/runtime.ts +4 -0
  1148. package/extensions/matrix/src/matrix/client/shared.ts +170 -0
  1149. package/extensions/matrix/src/matrix/client/storage.ts +131 -0
  1150. package/extensions/matrix/src/matrix/client/types.ts +34 -0
  1151. package/extensions/matrix/src/matrix/client.test.ts +56 -0
  1152. package/extensions/matrix/src/matrix/client.ts +5 -0
  1153. package/extensions/matrix/src/matrix/credentials.ts +105 -0
  1154. package/extensions/matrix/src/matrix/deps.ts +60 -0
  1155. package/extensions/matrix/src/matrix/format.test.ts +33 -0
  1156. package/extensions/matrix/src/matrix/format.ts +22 -0
  1157. package/extensions/matrix/src/matrix/index.ts +11 -0
  1158. package/extensions/matrix/src/matrix/monitor/allowlist.test.ts +45 -0
  1159. package/extensions/matrix/src/matrix/monitor/allowlist.ts +103 -0
  1160. package/extensions/matrix/src/matrix/monitor/auto-join.ts +71 -0
  1161. package/extensions/matrix/src/matrix/monitor/direct.ts +104 -0
  1162. package/extensions/matrix/src/matrix/monitor/events.ts +101 -0
  1163. package/extensions/matrix/src/matrix/monitor/handler.ts +661 -0
  1164. package/extensions/matrix/src/matrix/monitor/index.ts +338 -0
  1165. package/extensions/matrix/src/matrix/monitor/location.ts +100 -0
  1166. package/extensions/matrix/src/matrix/monitor/media.test.ts +102 -0
  1167. package/extensions/matrix/src/matrix/monitor/media.ts +113 -0
  1168. package/extensions/matrix/src/matrix/monitor/mentions.ts +31 -0
  1169. package/extensions/matrix/src/matrix/monitor/replies.ts +97 -0
  1170. package/extensions/matrix/src/matrix/monitor/room-info.ts +55 -0
  1171. package/extensions/matrix/src/matrix/monitor/rooms.test.ts +39 -0
  1172. package/extensions/matrix/src/matrix/monitor/rooms.ts +47 -0
  1173. package/extensions/matrix/src/matrix/monitor/threads.ts +68 -0
  1174. package/extensions/matrix/src/matrix/monitor/types.ts +39 -0
  1175. package/extensions/matrix/src/matrix/poll-types.test.ts +21 -0
  1176. package/extensions/matrix/src/matrix/poll-types.ts +166 -0
  1177. package/extensions/matrix/src/matrix/probe.ts +70 -0
  1178. package/extensions/matrix/src/matrix/send/client.ts +66 -0
  1179. package/extensions/matrix/src/matrix/send/formatting.ts +89 -0
  1180. package/extensions/matrix/src/matrix/send/media.ts +229 -0
  1181. package/extensions/matrix/src/matrix/send/targets.test.ts +98 -0
  1182. package/extensions/matrix/src/matrix/send/targets.ts +136 -0
  1183. package/extensions/matrix/src/matrix/send/types.ts +109 -0
  1184. package/extensions/matrix/src/matrix/send.test.ts +171 -0
  1185. package/extensions/matrix/src/matrix/send.ts +260 -0
  1186. package/extensions/matrix/src/onboarding.ts +449 -0
  1187. package/extensions/matrix/src/outbound.ts +52 -0
  1188. package/extensions/matrix/src/resolve-targets.test.ts +48 -0
  1189. package/extensions/matrix/src/resolve-targets.ts +135 -0
  1190. package/extensions/matrix/src/runtime.ts +14 -0
  1191. package/extensions/matrix/src/tool-actions.ts +164 -0
  1192. package/extensions/matrix/src/types.ts +95 -0
  1193. package/extensions/mattermost/index.ts +17 -0
  1194. package/extensions/mattermost/node_modules/.bin/openclaw +21 -0
  1195. package/extensions/mattermost/openclaw.plugin.json +9 -0
  1196. package/extensions/mattermost/package.json +28 -0
  1197. package/extensions/mattermost/src/channel.test.ts +48 -0
  1198. package/extensions/mattermost/src/channel.ts +337 -0
  1199. package/extensions/mattermost/src/config-schema.ts +55 -0
  1200. package/extensions/mattermost/src/group-mentions.ts +15 -0
  1201. package/extensions/mattermost/src/mattermost/accounts.ts +128 -0
  1202. package/extensions/mattermost/src/mattermost/client.ts +220 -0
  1203. package/extensions/mattermost/src/mattermost/index.ts +9 -0
  1204. package/extensions/mattermost/src/mattermost/monitor-helpers.ts +166 -0
  1205. package/extensions/mattermost/src/mattermost/monitor.ts +987 -0
  1206. package/extensions/mattermost/src/mattermost/probe.ts +74 -0
  1207. package/extensions/mattermost/src/mattermost/send.ts +231 -0
  1208. package/extensions/mattermost/src/normalize.ts +46 -0
  1209. package/extensions/mattermost/src/onboarding-helpers.ts +44 -0
  1210. package/extensions/mattermost/src/onboarding.ts +186 -0
  1211. package/extensions/mattermost/src/runtime.ts +14 -0
  1212. package/extensions/mattermost/src/types.ts +50 -0
  1213. package/extensions/memory-core/index.ts +38 -0
  1214. package/extensions/memory-core/node_modules/.bin/openclaw +21 -0
  1215. package/extensions/memory-core/openclaw.plugin.json +9 -0
  1216. package/extensions/memory-core/package.json +17 -0
  1217. package/extensions/memory-lancedb/config.ts +139 -0
  1218. package/extensions/memory-lancedb/index.test.ts +295 -0
  1219. package/extensions/memory-lancedb/index.ts +608 -0
  1220. package/extensions/memory-lancedb/node_modules/.bin/openai +21 -0
  1221. package/extensions/memory-lancedb/node_modules/.bin/openclaw +21 -0
  1222. package/extensions/memory-lancedb/openclaw.plugin.json +60 -0
  1223. package/extensions/memory-lancedb/package.json +19 -0
  1224. package/extensions/minimax-portal-auth/README.md +33 -0
  1225. package/extensions/minimax-portal-auth/index.ts +155 -0
  1226. package/extensions/minimax-portal-auth/node_modules/.bin/openclaw +21 -0
  1227. package/extensions/minimax-portal-auth/oauth.ts +247 -0
  1228. package/extensions/minimax-portal-auth/openclaw.plugin.json +9 -0
  1229. package/extensions/minimax-portal-auth/package.json +14 -0
  1230. package/extensions/msteams/CHANGELOG.md +83 -0
  1231. package/extensions/msteams/index.ts +17 -0
  1232. package/extensions/msteams/node_modules/.bin/openclaw +21 -0
  1233. package/extensions/msteams/openclaw.plugin.json +9 -0
  1234. package/extensions/msteams/package.json +39 -0
  1235. package/extensions/msteams/src/attachments/download.ts +283 -0
  1236. package/extensions/msteams/src/attachments/graph.ts +353 -0
  1237. package/extensions/msteams/src/attachments/html.ts +90 -0
  1238. package/extensions/msteams/src/attachments/payload.ts +22 -0
  1239. package/extensions/msteams/src/attachments/shared.ts +291 -0
  1240. package/extensions/msteams/src/attachments/types.ts +37 -0
  1241. package/extensions/msteams/src/attachments.test.ts +459 -0
  1242. package/extensions/msteams/src/attachments.ts +18 -0
  1243. package/extensions/msteams/src/channel.directory.test.ts +48 -0
  1244. package/extensions/msteams/src/channel.ts +459 -0
  1245. package/extensions/msteams/src/conversation-store-fs.test.ts +88 -0
  1246. package/extensions/msteams/src/conversation-store-fs.ts +165 -0
  1247. package/extensions/msteams/src/conversation-store-memory.ts +47 -0
  1248. package/extensions/msteams/src/conversation-store.ts +41 -0
  1249. package/extensions/msteams/src/directory-live.ts +205 -0
  1250. package/extensions/msteams/src/errors.test.ts +45 -0
  1251. package/extensions/msteams/src/errors.ts +190 -0
  1252. package/extensions/msteams/src/file-consent-helpers.test.ts +243 -0
  1253. package/extensions/msteams/src/file-consent-helpers.ts +73 -0
  1254. package/extensions/msteams/src/file-consent.ts +126 -0
  1255. package/extensions/msteams/src/graph-chat.ts +53 -0
  1256. package/extensions/msteams/src/graph-upload.ts +453 -0
  1257. package/extensions/msteams/src/inbound.test.ts +66 -0
  1258. package/extensions/msteams/src/inbound.ts +48 -0
  1259. package/extensions/msteams/src/index.ts +4 -0
  1260. package/extensions/msteams/src/media-helpers.test.ts +189 -0
  1261. package/extensions/msteams/src/media-helpers.ts +86 -0
  1262. package/extensions/msteams/src/messenger.test.ts +248 -0
  1263. package/extensions/msteams/src/messenger.ts +495 -0
  1264. package/extensions/msteams/src/monitor-handler/inbound-media.ts +128 -0
  1265. package/extensions/msteams/src/monitor-handler/message-handler.ts +640 -0
  1266. package/extensions/msteams/src/monitor-handler.ts +162 -0
  1267. package/extensions/msteams/src/monitor-types.ts +5 -0
  1268. package/extensions/msteams/src/monitor.ts +295 -0
  1269. package/extensions/msteams/src/onboarding.ts +431 -0
  1270. package/extensions/msteams/src/outbound.ts +46 -0
  1271. package/extensions/msteams/src/pending-uploads.ts +89 -0
  1272. package/extensions/msteams/src/policy.test.ts +209 -0
  1273. package/extensions/msteams/src/policy.ts +273 -0
  1274. package/extensions/msteams/src/polls-store-memory.ts +32 -0
  1275. package/extensions/msteams/src/polls-store.test.ts +38 -0
  1276. package/extensions/msteams/src/polls.test.ts +72 -0
  1277. package/extensions/msteams/src/polls.ts +315 -0
  1278. package/extensions/msteams/src/probe.test.ts +58 -0
  1279. package/extensions/msteams/src/probe.ts +107 -0
  1280. package/extensions/msteams/src/reply-dispatcher.ts +130 -0
  1281. package/extensions/msteams/src/resolve-allowlist.ts +297 -0
  1282. package/extensions/msteams/src/runtime.ts +14 -0
  1283. package/extensions/msteams/src/sdk-types.ts +19 -0
  1284. package/extensions/msteams/src/sdk.ts +33 -0
  1285. package/extensions/msteams/src/send-context.ts +164 -0
  1286. package/extensions/msteams/src/send.ts +519 -0
  1287. package/extensions/msteams/src/sent-message-cache.test.ts +15 -0
  1288. package/extensions/msteams/src/sent-message-cache.ts +47 -0
  1289. package/extensions/msteams/src/storage.ts +25 -0
  1290. package/extensions/msteams/src/store-fs.ts +83 -0
  1291. package/extensions/msteams/src/token.ts +19 -0
  1292. package/extensions/nextcloud-talk/index.ts +17 -0
  1293. package/extensions/nextcloud-talk/node_modules/.bin/openclaw +21 -0
  1294. package/extensions/nextcloud-talk/openclaw.plugin.json +9 -0
  1295. package/extensions/nextcloud-talk/package.json +33 -0
  1296. package/extensions/nextcloud-talk/src/accounts.ts +174 -0
  1297. package/extensions/nextcloud-talk/src/channel.ts +409 -0
  1298. package/extensions/nextcloud-talk/src/config-schema.ts +78 -0
  1299. package/extensions/nextcloud-talk/src/format.ts +79 -0
  1300. package/extensions/nextcloud-talk/src/inbound.ts +317 -0
  1301. package/extensions/nextcloud-talk/src/monitor.ts +246 -0
  1302. package/extensions/nextcloud-talk/src/normalize.ts +39 -0
  1303. package/extensions/nextcloud-talk/src/onboarding.ts +343 -0
  1304. package/extensions/nextcloud-talk/src/policy.test.ts +33 -0
  1305. package/extensions/nextcloud-talk/src/policy.ts +180 -0
  1306. package/extensions/nextcloud-talk/src/room-info.ts +125 -0
  1307. package/extensions/nextcloud-talk/src/runtime.ts +14 -0
  1308. package/extensions/nextcloud-talk/src/send.ts +210 -0
  1309. package/extensions/nextcloud-talk/src/signature.ts +72 -0
  1310. package/extensions/nextcloud-talk/src/types.ts +179 -0
  1311. package/extensions/nostr/CHANGELOG.md +74 -0
  1312. package/extensions/nostr/README.md +136 -0
  1313. package/extensions/nostr/index.ts +68 -0
  1314. package/extensions/nostr/node_modules/.bin/openclaw +21 -0
  1315. package/extensions/nostr/openclaw.plugin.json +9 -0
  1316. package/extensions/nostr/package.json +34 -0
  1317. package/extensions/nostr/src/channel.test.ts +151 -0
  1318. package/extensions/nostr/src/channel.ts +353 -0
  1319. package/extensions/nostr/src/config-schema.ts +90 -0
  1320. package/extensions/nostr/src/metrics.ts +478 -0
  1321. package/extensions/nostr/src/nostr-bus.fuzz.test.ts +533 -0
  1322. package/extensions/nostr/src/nostr-bus.integration.test.ts +448 -0
  1323. package/extensions/nostr/src/nostr-bus.test.ts +199 -0
  1324. package/extensions/nostr/src/nostr-bus.ts +715 -0
  1325. package/extensions/nostr/src/nostr-profile-http.test.ts +378 -0
  1326. package/extensions/nostr/src/nostr-profile-http.ts +519 -0
  1327. package/extensions/nostr/src/nostr-profile-import.test.ts +119 -0
  1328. package/extensions/nostr/src/nostr-profile-import.ts +262 -0
  1329. package/extensions/nostr/src/nostr-profile.fuzz.test.ts +477 -0
  1330. package/extensions/nostr/src/nostr-profile.test.ts +410 -0
  1331. package/extensions/nostr/src/nostr-profile.ts +277 -0
  1332. package/extensions/nostr/src/nostr-state-store.test.ts +131 -0
  1333. package/extensions/nostr/src/nostr-state-store.ts +226 -0
  1334. package/extensions/nostr/src/runtime.ts +14 -0
  1335. package/extensions/nostr/src/seen-tracker.ts +303 -0
  1336. package/extensions/nostr/src/types.test.ts +157 -0
  1337. package/extensions/nostr/src/types.ts +101 -0
  1338. package/extensions/nostr/test/setup.ts +5 -0
  1339. package/extensions/open-prose/README.md +25 -0
  1340. package/extensions/open-prose/index.ts +5 -0
  1341. package/extensions/open-prose/node_modules/.bin/openclaw +21 -0
  1342. package/extensions/open-prose/openclaw.plugin.json +11 -0
  1343. package/extensions/open-prose/package.json +14 -0
  1344. package/extensions/open-prose/skills/prose/LICENSE +21 -0
  1345. package/extensions/open-prose/skills/prose/SKILL.md +323 -0
  1346. package/extensions/open-prose/skills/prose/alt-borges.md +141 -0
  1347. package/extensions/open-prose/skills/prose/alts/arabian-nights.md +358 -0
  1348. package/extensions/open-prose/skills/prose/alts/borges.md +360 -0
  1349. package/extensions/open-prose/skills/prose/alts/folk.md +322 -0
  1350. package/extensions/open-prose/skills/prose/alts/homer.md +346 -0
  1351. package/extensions/open-prose/skills/prose/alts/kafka.md +373 -0
  1352. package/extensions/open-prose/skills/prose/compiler.md +2971 -0
  1353. package/extensions/open-prose/skills/prose/examples/01-hello-world.prose +4 -0
  1354. package/extensions/open-prose/skills/prose/examples/02-research-and-summarize.prose +6 -0
  1355. package/extensions/open-prose/skills/prose/examples/03-code-review.prose +17 -0
  1356. package/extensions/open-prose/skills/prose/examples/04-write-and-refine.prose +14 -0
  1357. package/extensions/open-prose/skills/prose/examples/05-debug-issue.prose +20 -0
  1358. package/extensions/open-prose/skills/prose/examples/06-explain-codebase.prose +17 -0
  1359. package/extensions/open-prose/skills/prose/examples/07-refactor.prose +20 -0
  1360. package/extensions/open-prose/skills/prose/examples/08-blog-post.prose +20 -0
  1361. package/extensions/open-prose/skills/prose/examples/09-research-with-agents.prose +25 -0
  1362. package/extensions/open-prose/skills/prose/examples/10-code-review-agents.prose +32 -0
  1363. package/extensions/open-prose/skills/prose/examples/11-skills-and-imports.prose +27 -0
  1364. package/extensions/open-prose/skills/prose/examples/12-secure-agent-permissions.prose +43 -0
  1365. package/extensions/open-prose/skills/prose/examples/13-variables-and-context.prose +51 -0
  1366. package/extensions/open-prose/skills/prose/examples/14-composition-blocks.prose +48 -0
  1367. package/extensions/open-prose/skills/prose/examples/15-inline-sequences.prose +23 -0
  1368. package/extensions/open-prose/skills/prose/examples/16-parallel-reviews.prose +19 -0
  1369. package/extensions/open-prose/skills/prose/examples/17-parallel-research.prose +19 -0
  1370. package/extensions/open-prose/skills/prose/examples/18-mixed-parallel-sequential.prose +36 -0
  1371. package/extensions/open-prose/skills/prose/examples/19-advanced-parallel.prose +71 -0
  1372. package/extensions/open-prose/skills/prose/examples/20-fixed-loops.prose +20 -0
  1373. package/extensions/open-prose/skills/prose/examples/21-pipeline-operations.prose +35 -0
  1374. package/extensions/open-prose/skills/prose/examples/22-error-handling.prose +51 -0
  1375. package/extensions/open-prose/skills/prose/examples/23-retry-with-backoff.prose +63 -0
  1376. package/extensions/open-prose/skills/prose/examples/24-choice-blocks.prose +86 -0
  1377. package/extensions/open-prose/skills/prose/examples/25-conditionals.prose +114 -0
  1378. package/extensions/open-prose/skills/prose/examples/26-parameterized-blocks.prose +100 -0
  1379. package/extensions/open-prose/skills/prose/examples/27-string-interpolation.prose +105 -0
  1380. package/extensions/open-prose/skills/prose/examples/28-automated-pr-review.prose +37 -0
  1381. package/extensions/open-prose/skills/prose/examples/28-gas-town.prose +1572 -0
  1382. package/extensions/open-prose/skills/prose/examples/29-captains-chair.prose +218 -0
  1383. package/extensions/open-prose/skills/prose/examples/30-captains-chair-simple.prose +42 -0
  1384. package/extensions/open-prose/skills/prose/examples/31-captains-chair-with-memory.prose +145 -0
  1385. package/extensions/open-prose/skills/prose/examples/33-pr-review-autofix.prose +168 -0
  1386. package/extensions/open-prose/skills/prose/examples/34-content-pipeline.prose +204 -0
  1387. package/extensions/open-prose/skills/prose/examples/35-feature-factory.prose +296 -0
  1388. package/extensions/open-prose/skills/prose/examples/36-bug-hunter.prose +237 -0
  1389. package/extensions/open-prose/skills/prose/examples/37-the-forge.prose +1474 -0
  1390. package/extensions/open-prose/skills/prose/examples/38-skill-scan.prose +455 -0
  1391. package/extensions/open-prose/skills/prose/examples/39-architect-by-simulation.prose +277 -0
  1392. package/extensions/open-prose/skills/prose/examples/40-rlm-self-refine.prose +32 -0
  1393. package/extensions/open-prose/skills/prose/examples/41-rlm-divide-conquer.prose +38 -0
  1394. package/extensions/open-prose/skills/prose/examples/42-rlm-filter-recurse.prose +46 -0
  1395. package/extensions/open-prose/skills/prose/examples/43-rlm-pairwise.prose +50 -0
  1396. package/extensions/open-prose/skills/prose/examples/44-run-endpoint-ux-test.prose +261 -0
  1397. package/extensions/open-prose/skills/prose/examples/45-plugin-release.prose +159 -0
  1398. package/extensions/open-prose/skills/prose/examples/45-run-endpoint-ux-test-with-remediation.prose +637 -0
  1399. package/extensions/open-prose/skills/prose/examples/46-run-endpoint-ux-test-fast.prose +148 -0
  1400. package/extensions/open-prose/skills/prose/examples/46-workflow-crystallizer.prose +225 -0
  1401. package/extensions/open-prose/skills/prose/examples/47-language-self-improvement.prose +356 -0
  1402. package/extensions/open-prose/skills/prose/examples/48-habit-miner.prose +445 -0
  1403. package/extensions/open-prose/skills/prose/examples/49-prose-run-retrospective.prose +210 -0
  1404. package/extensions/open-prose/skills/prose/examples/README.md +391 -0
  1405. package/extensions/open-prose/skills/prose/examples/roadmap/README.md +22 -0
  1406. package/extensions/open-prose/skills/prose/examples/roadmap/iterative-refinement.prose +20 -0
  1407. package/extensions/open-prose/skills/prose/examples/roadmap/parallel-review.prose +18 -0
  1408. package/extensions/open-prose/skills/prose/examples/roadmap/simple-pipeline.prose +17 -0
  1409. package/extensions/open-prose/skills/prose/examples/roadmap/syntax/open-prose-syntax.prose +223 -0
  1410. package/extensions/open-prose/skills/prose/guidance/antipatterns.md +951 -0
  1411. package/extensions/open-prose/skills/prose/guidance/patterns.md +700 -0
  1412. package/extensions/open-prose/skills/prose/guidance/system-prompt.md +180 -0
  1413. package/extensions/open-prose/skills/prose/help.md +144 -0
  1414. package/extensions/open-prose/skills/prose/lib/README.md +108 -0
  1415. package/extensions/open-prose/skills/prose/lib/calibrator.prose +215 -0
  1416. package/extensions/open-prose/skills/prose/lib/cost-analyzer.prose +174 -0
  1417. package/extensions/open-prose/skills/prose/lib/error-forensics.prose +250 -0
  1418. package/extensions/open-prose/skills/prose/lib/inspector.prose +196 -0
  1419. package/extensions/open-prose/skills/prose/lib/profiler.prose +460 -0
  1420. package/extensions/open-prose/skills/prose/lib/program-improver.prose +275 -0
  1421. package/extensions/open-prose/skills/prose/lib/project-memory.prose +118 -0
  1422. package/extensions/open-prose/skills/prose/lib/user-memory.prose +93 -0
  1423. package/extensions/open-prose/skills/prose/lib/vm-improver.prose +243 -0
  1424. package/extensions/open-prose/skills/prose/primitives/session.md +593 -0
  1425. package/extensions/open-prose/skills/prose/prose.md +1237 -0
  1426. package/extensions/open-prose/skills/prose/state/filesystem.md +498 -0
  1427. package/extensions/open-prose/skills/prose/state/in-context.md +384 -0
  1428. package/extensions/open-prose/skills/prose/state/postgres.md +880 -0
  1429. package/extensions/open-prose/skills/prose/state/sqlite.md +574 -0
  1430. package/extensions/qwen-portal-auth/README.md +24 -0
  1431. package/extensions/qwen-portal-auth/index.ts +130 -0
  1432. package/extensions/qwen-portal-auth/oauth.ts +190 -0
  1433. package/extensions/qwen-portal-auth/openclaw.plugin.json +9 -0
  1434. package/extensions/signal/index.ts +17 -0
  1435. package/extensions/signal/node_modules/.bin/openclaw +21 -0
  1436. package/extensions/signal/openclaw.plugin.json +9 -0
  1437. package/extensions/signal/package.json +14 -0
  1438. package/extensions/signal/src/channel.ts +315 -0
  1439. package/extensions/signal/src/runtime.ts +14 -0
  1440. package/extensions/slack/index.ts +17 -0
  1441. package/extensions/slack/node_modules/.bin/openclaw +21 -0
  1442. package/extensions/slack/openclaw.plugin.json +9 -0
  1443. package/extensions/slack/package.json +14 -0
  1444. package/extensions/slack/src/channel.ts +604 -0
  1445. package/extensions/slack/src/runtime.ts +14 -0
  1446. package/extensions/telegram/index.ts +17 -0
  1447. package/extensions/telegram/node_modules/.bin/openclaw +21 -0
  1448. package/extensions/telegram/openclaw.plugin.json +9 -0
  1449. package/extensions/telegram/package.json +14 -0
  1450. package/extensions/telegram/src/channel.ts +482 -0
  1451. package/extensions/telegram/src/runtime.ts +14 -0
  1452. package/extensions/tlon/README.md +5 -0
  1453. package/extensions/tlon/index.ts +17 -0
  1454. package/extensions/tlon/node_modules/.bin/openclaw +21 -0
  1455. package/extensions/tlon/openclaw.plugin.json +9 -0
  1456. package/extensions/tlon/package.json +33 -0
  1457. package/extensions/tlon/src/channel.ts +392 -0
  1458. package/extensions/tlon/src/config-schema.test.ts +31 -0
  1459. package/extensions/tlon/src/config-schema.ts +43 -0
  1460. package/extensions/tlon/src/monitor/discovery.ts +76 -0
  1461. package/extensions/tlon/src/monitor/history.ts +90 -0
  1462. package/extensions/tlon/src/monitor/index.ts +553 -0
  1463. package/extensions/tlon/src/monitor/processed-messages.test.ts +23 -0
  1464. package/extensions/tlon/src/monitor/processed-messages.ts +46 -0
  1465. package/extensions/tlon/src/monitor/utils.ts +105 -0
  1466. package/extensions/tlon/src/onboarding.ts +214 -0
  1467. package/extensions/tlon/src/runtime.ts +14 -0
  1468. package/extensions/tlon/src/targets.ts +89 -0
  1469. package/extensions/tlon/src/types.ts +92 -0
  1470. package/extensions/tlon/src/urbit/auth.ts +18 -0
  1471. package/extensions/tlon/src/urbit/http-api.ts +38 -0
  1472. package/extensions/tlon/src/urbit/send.test.ts +38 -0
  1473. package/extensions/tlon/src/urbit/send.ts +131 -0
  1474. package/extensions/tlon/src/urbit/sse-client.test.ts +40 -0
  1475. package/extensions/tlon/src/urbit/sse-client.ts +395 -0
  1476. package/extensions/twitch/CHANGELOG.md +45 -0
  1477. package/extensions/twitch/README.md +89 -0
  1478. package/extensions/twitch/index.ts +20 -0
  1479. package/extensions/twitch/node_modules/.bin/openclaw +21 -0
  1480. package/extensions/twitch/openclaw.plugin.json +9 -0
  1481. package/extensions/twitch/package.json +20 -0
  1482. package/extensions/twitch/src/access-control.test.ts +489 -0
  1483. package/extensions/twitch/src/access-control.ts +166 -0
  1484. package/extensions/twitch/src/actions.ts +173 -0
  1485. package/extensions/twitch/src/client-manager-registry.ts +115 -0
  1486. package/extensions/twitch/src/config-schema.ts +82 -0
  1487. package/extensions/twitch/src/config.test.ts +87 -0
  1488. package/extensions/twitch/src/config.ts +116 -0
  1489. package/extensions/twitch/src/monitor.ts +261 -0
  1490. package/extensions/twitch/src/onboarding.test.ts +311 -0
  1491. package/extensions/twitch/src/onboarding.ts +417 -0
  1492. package/extensions/twitch/src/outbound.test.ts +373 -0
  1493. package/extensions/twitch/src/outbound.ts +184 -0
  1494. package/extensions/twitch/src/plugin.test.ts +39 -0
  1495. package/extensions/twitch/src/plugin.ts +274 -0
  1496. package/extensions/twitch/src/probe.test.ts +195 -0
  1497. package/extensions/twitch/src/probe.ts +120 -0
  1498. package/extensions/twitch/src/resolver.ts +137 -0
  1499. package/extensions/twitch/src/runtime.ts +14 -0
  1500. package/extensions/twitch/src/send.test.ts +289 -0
  1501. package/extensions/twitch/src/send.ts +136 -0
  1502. package/extensions/twitch/src/status.test.ts +270 -0
  1503. package/extensions/twitch/src/status.ts +178 -0
  1504. package/extensions/twitch/src/token.test.ts +171 -0
  1505. package/extensions/twitch/src/token.ts +91 -0
  1506. package/extensions/twitch/src/twitch-client.test.ts +589 -0
  1507. package/extensions/twitch/src/twitch-client.ts +277 -0
  1508. package/extensions/twitch/src/types.ts +141 -0
  1509. package/extensions/twitch/src/utils/markdown.ts +98 -0
  1510. package/extensions/twitch/src/utils/twitch.ts +78 -0
  1511. package/extensions/twitch/test/setup.ts +7 -0
  1512. package/extensions/voice-call/CHANGELOG.md +109 -0
  1513. package/extensions/voice-call/README.md +139 -0
  1514. package/extensions/voice-call/index.ts +493 -0
  1515. package/extensions/voice-call/node_modules/.bin/openclaw +21 -0
  1516. package/extensions/voice-call/openclaw.plugin.json +559 -0
  1517. package/extensions/voice-call/package.json +19 -0
  1518. package/extensions/voice-call/src/allowlist.ts +19 -0
  1519. package/extensions/voice-call/src/cli.ts +279 -0
  1520. package/extensions/voice-call/src/config.test.ts +234 -0
  1521. package/extensions/voice-call/src/config.ts +523 -0
  1522. package/extensions/voice-call/src/core-bridge.ts +159 -0
  1523. package/extensions/voice-call/src/manager/context.ts +21 -0
  1524. package/extensions/voice-call/src/manager/events.ts +188 -0
  1525. package/extensions/voice-call/src/manager/lookup.ts +35 -0
  1526. package/extensions/voice-call/src/manager/outbound.ts +275 -0
  1527. package/extensions/voice-call/src/manager/state.ts +48 -0
  1528. package/extensions/voice-call/src/manager/store.ts +91 -0
  1529. package/extensions/voice-call/src/manager/timers.ts +89 -0
  1530. package/extensions/voice-call/src/manager/twiml.ts +9 -0
  1531. package/extensions/voice-call/src/manager.test.ts +194 -0
  1532. package/extensions/voice-call/src/manager.ts +887 -0
  1533. package/extensions/voice-call/src/media-stream.test.ts +96 -0
  1534. package/extensions/voice-call/src/media-stream.ts +411 -0
  1535. package/extensions/voice-call/src/providers/base.ts +67 -0
  1536. package/extensions/voice-call/src/providers/index.ts +10 -0
  1537. package/extensions/voice-call/src/providers/mock.ts +165 -0
  1538. package/extensions/voice-call/src/providers/plivo.test.ts +27 -0
  1539. package/extensions/voice-call/src/providers/plivo.ts +515 -0
  1540. package/extensions/voice-call/src/providers/stt-openai-realtime.ts +311 -0
  1541. package/extensions/voice-call/src/providers/telnyx.ts +371 -0
  1542. package/extensions/voice-call/src/providers/tts-openai.ts +259 -0
  1543. package/extensions/voice-call/src/providers/twilio/api.ts +42 -0
  1544. package/extensions/voice-call/src/providers/twilio/webhook.ts +32 -0
  1545. package/extensions/voice-call/src/providers/twilio.test.ts +60 -0
  1546. package/extensions/voice-call/src/providers/twilio.ts +626 -0
  1547. package/extensions/voice-call/src/response-generator.ts +158 -0
  1548. package/extensions/voice-call/src/runtime.ts +212 -0
  1549. package/extensions/voice-call/src/telephony-audio.ts +90 -0
  1550. package/extensions/voice-call/src/telephony-tts.ts +104 -0
  1551. package/extensions/voice-call/src/tunnel.ts +314 -0
  1552. package/extensions/voice-call/src/types.ts +272 -0
  1553. package/extensions/voice-call/src/utils.ts +14 -0
  1554. package/extensions/voice-call/src/voice-mapping.ts +67 -0
  1555. package/extensions/voice-call/src/webhook-security.test.ts +377 -0
  1556. package/extensions/voice-call/src/webhook-security.ts +689 -0
  1557. package/extensions/voice-call/src/webhook.ts +491 -0
  1558. package/extensions/whatsapp/index.ts +17 -0
  1559. package/extensions/whatsapp/node_modules/.bin/openclaw +21 -0
  1560. package/extensions/whatsapp/openclaw.plugin.json +9 -0
  1561. package/extensions/whatsapp/package.json +14 -0
  1562. package/extensions/whatsapp/src/channel.ts +508 -0
  1563. package/extensions/whatsapp/src/runtime.ts +14 -0
  1564. package/extensions/zalo/CHANGELOG.md +89 -0
  1565. package/extensions/zalo/README.md +50 -0
  1566. package/extensions/zalo/index.ts +19 -0
  1567. package/extensions/zalo/node_modules/.bin/openclaw +21 -0
  1568. package/extensions/zalo/openclaw.plugin.json +9 -0
  1569. package/extensions/zalo/package.json +36 -0
  1570. package/extensions/zalo/src/accounts.ts +80 -0
  1571. package/extensions/zalo/src/actions.ts +67 -0
  1572. package/extensions/zalo/src/api.ts +208 -0
  1573. package/extensions/zalo/src/channel.directory.test.ts +43 -0
  1574. package/extensions/zalo/src/channel.ts +414 -0
  1575. package/extensions/zalo/src/config-schema.ts +24 -0
  1576. package/extensions/zalo/src/monitor.ts +753 -0
  1577. package/extensions/zalo/src/monitor.webhook.test.ts +73 -0
  1578. package/extensions/zalo/src/onboarding.ts +401 -0
  1579. package/extensions/zalo/src/probe.ts +46 -0
  1580. package/extensions/zalo/src/proxy.ts +21 -0
  1581. package/extensions/zalo/src/runtime.ts +14 -0
  1582. package/extensions/zalo/src/send.ts +124 -0
  1583. package/extensions/zalo/src/status-issues.ts +53 -0
  1584. package/extensions/zalo/src/token.ts +63 -0
  1585. package/extensions/zalo/src/types.ts +42 -0
  1586. package/extensions/zalouser/CHANGELOG.md +61 -0
  1587. package/extensions/zalouser/README.md +225 -0
  1588. package/extensions/zalouser/index.ts +31 -0
  1589. package/extensions/zalouser/node_modules/.bin/openclaw +21 -0
  1590. package/extensions/zalouser/openclaw.plugin.json +9 -0
  1591. package/extensions/zalouser/package.json +36 -0
  1592. package/extensions/zalouser/src/accounts.ts +135 -0
  1593. package/extensions/zalouser/src/channel.test.ts +18 -0
  1594. package/extensions/zalouser/src/channel.ts +686 -0
  1595. package/extensions/zalouser/src/config-schema.ts +27 -0
  1596. package/extensions/zalouser/src/monitor.ts +590 -0
  1597. package/extensions/zalouser/src/onboarding.ts +504 -0
  1598. package/extensions/zalouser/src/probe.ts +28 -0
  1599. package/extensions/zalouser/src/runtime.ts +14 -0
  1600. package/extensions/zalouser/src/send.ts +160 -0
  1601. package/extensions/zalouser/src/status-issues.test.ts +57 -0
  1602. package/extensions/zalouser/src/status-issues.ts +89 -0
  1603. package/extensions/zalouser/src/tool.ts +164 -0
  1604. package/extensions/zalouser/src/types.ts +108 -0
  1605. package/extensions/zalouser/src/zca.ts +202 -0
  1606. package/openclaw.mjs +14 -0
  1607. package/package.json +245 -0
  1608. package/skills/1password/SKILL.md +70 -0
  1609. package/skills/1password/references/cli-examples.md +29 -0
  1610. package/skills/1password/references/get-started.md +17 -0
  1611. package/skills/apple-notes/SKILL.md +77 -0
  1612. package/skills/apple-reminders/SKILL.md +96 -0
  1613. package/skills/bear-notes/SKILL.md +107 -0
  1614. package/skills/bird/SKILL.md +224 -0
  1615. package/skills/blogwatcher/SKILL.md +69 -0
  1616. package/skills/blucli/SKILL.md +47 -0
  1617. package/skills/bluebubbles/SKILL.md +131 -0
  1618. package/skills/camsnap/SKILL.md +45 -0
  1619. package/skills/canvas/SKILL.md +198 -0
  1620. package/skills/clawhub/SKILL.md +77 -0
  1621. package/skills/coding-agent/SKILL.md +284 -0
  1622. package/skills/discord/SKILL.md +578 -0
  1623. package/skills/eightctl/SKILL.md +50 -0
  1624. package/skills/food-order/SKILL.md +48 -0
  1625. package/skills/gemini/SKILL.md +43 -0
  1626. package/skills/ghostly-projects/SKILL.md +160 -0
  1627. package/skills/gifgrep/SKILL.md +79 -0
  1628. package/skills/github/SKILL.md +77 -0
  1629. package/skills/gog/SKILL.md +116 -0
  1630. package/skills/goplaces/SKILL.md +52 -0
  1631. package/skills/healthcheck/SKILL.md +245 -0
  1632. package/skills/himalaya/SKILL.md +257 -0
  1633. package/skills/himalaya/references/configuration.md +184 -0
  1634. package/skills/himalaya/references/message-composition.md +199 -0
  1635. package/skills/imsg/SKILL.md +74 -0
  1636. package/skills/linear/SKILL.md +111 -0
  1637. package/skills/linear/linear.sh +204 -0
  1638. package/skills/local-places/SERVER_README.md +101 -0
  1639. package/skills/local-places/SKILL.md +102 -0
  1640. package/skills/local-places/pyproject.toml +21 -0
  1641. package/skills/local-places/src/local_places/__init__.py +2 -0
  1642. package/skills/local-places/src/local_places/google_places.py +314 -0
  1643. package/skills/local-places/src/local_places/main.py +65 -0
  1644. package/skills/local-places/src/local_places/schemas.py +107 -0
  1645. package/skills/mcporter/SKILL.md +61 -0
  1646. package/skills/model-usage/SKILL.md +69 -0
  1647. package/skills/model-usage/references/codexbar-cli.md +33 -0
  1648. package/skills/model-usage/scripts/model_usage.py +310 -0
  1649. package/skills/nano-banana-pro/SKILL.md +58 -0
  1650. package/skills/nano-banana-pro/scripts/generate_image.py +184 -0
  1651. package/skills/nano-pdf/SKILL.md +38 -0
  1652. package/skills/notion/SKILL.md +172 -0
  1653. package/skills/obsidian/SKILL.md +81 -0
  1654. package/skills/openai-image-gen/SKILL.md +89 -0
  1655. package/skills/openai-image-gen/scripts/gen.py +240 -0
  1656. package/skills/openai-whisper/SKILL.md +38 -0
  1657. package/skills/openai-whisper-api/SKILL.md +52 -0
  1658. package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
  1659. package/skills/openhue/SKILL.md +51 -0
  1660. package/skills/oracle/SKILL.md +125 -0
  1661. package/skills/ordercli/SKILL.md +78 -0
  1662. package/skills/peekaboo/SKILL.md +190 -0
  1663. package/skills/sag/SKILL.md +87 -0
  1664. package/skills/session-logs/SKILL.md +115 -0
  1665. package/skills/sherpa-onnx-tts/SKILL.md +103 -0
  1666. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  1667. package/skills/skill-creator/SKILL.md +370 -0
  1668. package/skills/skill-creator/license.txt +202 -0
  1669. package/skills/skill-creator/scripts/init_skill.py +378 -0
  1670. package/skills/skill-creator/scripts/package_skill.py +111 -0
  1671. package/skills/skill-creator/scripts/quick_validate.py +101 -0
  1672. package/skills/slack/SKILL.md +144 -0
  1673. package/skills/songsee/SKILL.md +49 -0
  1674. package/skills/sonoscli/SKILL.md +46 -0
  1675. package/skills/spotify-player/SKILL.md +64 -0
  1676. package/skills/summarize/SKILL.md +87 -0
  1677. package/skills/things-mac/SKILL.md +86 -0
  1678. package/skills/tmux/SKILL.md +135 -0
  1679. package/skills/tmux/scripts/find-sessions.sh +112 -0
  1680. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  1681. package/skills/trello/SKILL.md +95 -0
  1682. package/skills/video-frames/SKILL.md +46 -0
  1683. package/skills/video-frames/scripts/frame.sh +81 -0
  1684. package/skills/voice-call/SKILL.md +45 -0
  1685. package/skills/wacli/SKILL.md +72 -0
  1686. package/skills/weather/SKILL.md +54 -0
@@ -0,0 +1,2557 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
+ import { F as shouldLogVerbose, N as logVerbose, Z as getActivePluginRegistry, w as resolveUserPath } from "./exec-Cm9b2r9Q.js";
3
+ import { t as loadConfig } from "./config-Cm1M7tgH.js";
4
+ import { A as normalizeAccountId$1 } from "./agent-scope-DdwUKIOe.js";
5
+ import { Ct as optimizeImageToPng, Et as extensionForMime, Ft as appendAssistantMessageToSessionTranscript, In as getChannelDock, It as resolveMirroredTranscriptText, Nt as maxBytesForKind, Pt as mediaKindFromMime, St as hasAlphaChannel, Tt as detectMime, _t as resolvePinnedHostnameWithPolicy, bn as normalizeChannelId, bt as convertHeicToJpeg, ft as saveMediaBuffer, gt as resolvePinnedHostname, ht as createPinnedDispatcher, i as isMessagingToolDuplicate, mt as closeDispatcher, sn as INTERNAL_MESSAGE_CHANNEL, vn as getChannelPlugin, vr as resolveSignalAccount, wt as resizeToJpeg } from "./pi-embedded-helpers-5jNqW_dE.js";
6
+ import path from "node:path";
7
+ import fs from "node:fs/promises";
8
+ import { fileURLToPath } from "node:url";
9
+ import { randomUUID } from "node:crypto";
10
+ import MarkdownIt from "markdown-it";
11
+
12
+ //#region src/auto-reply/tokens.ts
13
+ const HEARTBEAT_TOKEN = "HEARTBEAT_OK";
14
+ const SILENT_REPLY_TOKEN = "NO_REPLY";
15
+ function escapeRegExp(value) {
16
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
17
+ }
18
+ function isSilentReplyText(text, token = SILENT_REPLY_TOKEN) {
19
+ if (!text) return false;
20
+ const escaped = escapeRegExp(token);
21
+ if (new RegExp(`^\\s*${escaped}(?=$|\\W)`).test(text)) return true;
22
+ return new RegExp(`\\b${escaped}\\b\\W*$`).test(text);
23
+ }
24
+
25
+ //#endregion
26
+ //#region src/channels/plugins/media-limits.ts
27
+ const MB$1 = 1024 * 1024;
28
+ function resolveChannelMediaMaxBytes(params) {
29
+ const accountId = normalizeAccountId$1(params.accountId);
30
+ const channelLimit = params.resolveChannelLimitMb({
31
+ cfg: params.cfg,
32
+ accountId
33
+ });
34
+ if (channelLimit) return channelLimit * MB$1;
35
+ if (params.cfg.agents?.defaults?.mediaMaxMb) return params.cfg.agents.defaults.mediaMaxMb * MB$1;
36
+ }
37
+
38
+ //#endregion
39
+ //#region src/infra/net/fetch-guard.ts
40
+ const DEFAULT_MAX_REDIRECTS = 3;
41
+ function isRedirectStatus(status) {
42
+ return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
43
+ }
44
+ function buildAbortSignal(params) {
45
+ const { timeoutMs, signal } = params;
46
+ if (!timeoutMs && !signal) return {
47
+ signal: void 0,
48
+ cleanup: () => {}
49
+ };
50
+ if (!timeoutMs) return {
51
+ signal,
52
+ cleanup: () => {}
53
+ };
54
+ const controller = new AbortController();
55
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
56
+ const onAbort = () => controller.abort();
57
+ if (signal) if (signal.aborted) controller.abort();
58
+ else signal.addEventListener("abort", onAbort, { once: true });
59
+ const cleanup = () => {
60
+ clearTimeout(timeoutId);
61
+ if (signal) signal.removeEventListener("abort", onAbort);
62
+ };
63
+ return {
64
+ signal: controller.signal,
65
+ cleanup
66
+ };
67
+ }
68
+ async function fetchWithSsrFGuard(params) {
69
+ const fetcher = params.fetchImpl ?? globalThis.fetch;
70
+ if (!fetcher) throw new Error("fetch is not available");
71
+ const maxRedirects = typeof params.maxRedirects === "number" && Number.isFinite(params.maxRedirects) ? Math.max(0, Math.floor(params.maxRedirects)) : DEFAULT_MAX_REDIRECTS;
72
+ const { signal, cleanup } = buildAbortSignal({
73
+ timeoutMs: params.timeoutMs,
74
+ signal: params.signal
75
+ });
76
+ let released = false;
77
+ const release = async (dispatcher) => {
78
+ if (released) return;
79
+ released = true;
80
+ cleanup();
81
+ await closeDispatcher(dispatcher ?? void 0);
82
+ };
83
+ const visited = /* @__PURE__ */ new Set();
84
+ let currentUrl = params.url;
85
+ let redirectCount = 0;
86
+ while (true) {
87
+ let parsedUrl;
88
+ try {
89
+ parsedUrl = new URL(currentUrl);
90
+ } catch {
91
+ await release();
92
+ throw new Error("Invalid URL: must be http or https");
93
+ }
94
+ if (!["http:", "https:"].includes(parsedUrl.protocol)) {
95
+ await release();
96
+ throw new Error("Invalid URL: must be http or https");
97
+ }
98
+ let dispatcher = null;
99
+ try {
100
+ const pinned = Boolean(params.policy?.allowPrivateNetwork || params.policy?.allowedHostnames?.length) ? await resolvePinnedHostnameWithPolicy(parsedUrl.hostname, {
101
+ lookupFn: params.lookupFn,
102
+ policy: params.policy
103
+ }) : await resolvePinnedHostname(parsedUrl.hostname, params.lookupFn);
104
+ if (params.pinDns !== false) dispatcher = createPinnedDispatcher(pinned);
105
+ const init = {
106
+ ...params.init ? { ...params.init } : {},
107
+ redirect: "manual",
108
+ ...dispatcher ? { dispatcher } : {},
109
+ ...signal ? { signal } : {}
110
+ };
111
+ const response = await fetcher(parsedUrl.toString(), init);
112
+ if (isRedirectStatus(response.status)) {
113
+ const location = response.headers.get("location");
114
+ if (!location) {
115
+ await release(dispatcher);
116
+ throw new Error(`Redirect missing location header (${response.status})`);
117
+ }
118
+ redirectCount += 1;
119
+ if (redirectCount > maxRedirects) {
120
+ await release(dispatcher);
121
+ throw new Error(`Too many redirects (limit: ${maxRedirects})`);
122
+ }
123
+ const nextUrl = new URL(location, parsedUrl).toString();
124
+ if (visited.has(nextUrl)) {
125
+ await release(dispatcher);
126
+ throw new Error("Redirect loop detected");
127
+ }
128
+ visited.add(nextUrl);
129
+ response.body?.cancel();
130
+ await closeDispatcher(dispatcher);
131
+ currentUrl = nextUrl;
132
+ continue;
133
+ }
134
+ return {
135
+ response,
136
+ finalUrl: currentUrl,
137
+ release: async () => release(dispatcher)
138
+ };
139
+ } catch (err) {
140
+ await release(dispatcher);
141
+ throw err;
142
+ }
143
+ }
144
+ }
145
+
146
+ //#endregion
147
+ //#region src/media/fetch.ts
148
+ var MediaFetchError = class extends Error {
149
+ constructor(code, message) {
150
+ super(message);
151
+ this.code = code;
152
+ this.name = "MediaFetchError";
153
+ }
154
+ };
155
+ function stripQuotes(value) {
156
+ return value.replace(/^["']|["']$/g, "");
157
+ }
158
+ function parseContentDispositionFileName(header) {
159
+ if (!header) return;
160
+ const starMatch = /filename\*\s*=\s*([^;]+)/i.exec(header);
161
+ if (starMatch?.[1]) {
162
+ const cleaned = stripQuotes(starMatch[1].trim());
163
+ const encoded = cleaned.split("''").slice(1).join("''") || cleaned;
164
+ try {
165
+ return path.basename(decodeURIComponent(encoded));
166
+ } catch {
167
+ return path.basename(encoded);
168
+ }
169
+ }
170
+ const match = /filename\s*=\s*([^;]+)/i.exec(header);
171
+ if (match?.[1]) return path.basename(stripQuotes(match[1].trim()));
172
+ }
173
+ async function readErrorBodySnippet(res, maxChars = 200) {
174
+ try {
175
+ const text = await res.text();
176
+ if (!text) return;
177
+ const collapsed = text.replace(/\s+/g, " ").trim();
178
+ if (!collapsed) return;
179
+ if (collapsed.length <= maxChars) return collapsed;
180
+ return `${collapsed.slice(0, maxChars)}…`;
181
+ } catch {
182
+ return;
183
+ }
184
+ }
185
+ async function fetchRemoteMedia(options) {
186
+ const { url, fetchImpl, filePathHint, maxBytes, maxRedirects, ssrfPolicy, lookupFn } = options;
187
+ let res;
188
+ let finalUrl = url;
189
+ let release = null;
190
+ try {
191
+ const result = await fetchWithSsrFGuard({
192
+ url,
193
+ fetchImpl,
194
+ maxRedirects,
195
+ policy: ssrfPolicy,
196
+ lookupFn
197
+ });
198
+ res = result.response;
199
+ finalUrl = result.finalUrl;
200
+ release = result.release;
201
+ } catch (err) {
202
+ throw new MediaFetchError("fetch_failed", `Failed to fetch media from ${url}: ${String(err)}`);
203
+ }
204
+ try {
205
+ if (!res.ok) {
206
+ const statusText = res.statusText ? ` ${res.statusText}` : "";
207
+ const redirected = finalUrl !== url ? ` (redirected to ${finalUrl})` : "";
208
+ let detail = `HTTP ${res.status}${statusText}`;
209
+ if (!res.body) detail = `HTTP ${res.status}${statusText}; empty response body`;
210
+ else {
211
+ const snippet = await readErrorBodySnippet(res);
212
+ if (snippet) detail += `; body: ${snippet}`;
213
+ }
214
+ throw new MediaFetchError("http_error", `Failed to fetch media from ${url}${redirected}: ${detail}`);
215
+ }
216
+ const contentLength = res.headers.get("content-length");
217
+ if (maxBytes && contentLength) {
218
+ const length = Number(contentLength);
219
+ if (Number.isFinite(length) && length > maxBytes) throw new MediaFetchError("max_bytes", `Failed to fetch media from ${url}: content length ${length} exceeds maxBytes ${maxBytes}`);
220
+ }
221
+ const buffer = maxBytes ? await readResponseWithLimit(res, maxBytes) : Buffer.from(await res.arrayBuffer());
222
+ let fileNameFromUrl;
223
+ try {
224
+ const parsed = new URL(finalUrl);
225
+ fileNameFromUrl = path.basename(parsed.pathname) || void 0;
226
+ } catch {}
227
+ const headerFileName = parseContentDispositionFileName(res.headers.get("content-disposition"));
228
+ let fileName = headerFileName || fileNameFromUrl || (filePathHint ? path.basename(filePathHint) : void 0);
229
+ const filePathForMime = headerFileName && path.extname(headerFileName) ? headerFileName : filePathHint ?? finalUrl;
230
+ const contentType = await detectMime({
231
+ buffer,
232
+ headerMime: res.headers.get("content-type"),
233
+ filePath: filePathForMime
234
+ });
235
+ if (fileName && !path.extname(fileName) && contentType) {
236
+ const ext = extensionForMime(contentType);
237
+ if (ext) fileName = `${fileName}${ext}`;
238
+ }
239
+ return {
240
+ buffer,
241
+ contentType: contentType ?? void 0,
242
+ fileName
243
+ };
244
+ } finally {
245
+ if (release) await release();
246
+ }
247
+ }
248
+ async function readResponseWithLimit(res, maxBytes) {
249
+ const body = res.body;
250
+ if (!body || typeof body.getReader !== "function") {
251
+ const fallback = Buffer.from(await res.arrayBuffer());
252
+ if (fallback.length > maxBytes) throw new MediaFetchError("max_bytes", `Failed to fetch media from ${res.url || "response"}: payload exceeds maxBytes ${maxBytes}`);
253
+ return fallback;
254
+ }
255
+ const reader = body.getReader();
256
+ const chunks = [];
257
+ let total = 0;
258
+ try {
259
+ while (true) {
260
+ const { done, value } = await reader.read();
261
+ if (done) break;
262
+ if (value?.length) {
263
+ total += value.length;
264
+ if (total > maxBytes) {
265
+ try {
266
+ await reader.cancel();
267
+ } catch {}
268
+ throw new MediaFetchError("max_bytes", `Failed to fetch media from ${res.url || "response"}: payload exceeds maxBytes ${maxBytes}`);
269
+ }
270
+ chunks.push(value);
271
+ }
272
+ }
273
+ } finally {
274
+ try {
275
+ reader.releaseLock();
276
+ } catch {}
277
+ }
278
+ return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)), total);
279
+ }
280
+
281
+ //#endregion
282
+ //#region src/web/media.ts
283
+ const HEIC_MIME_RE = /^image\/hei[cf]$/i;
284
+ const HEIC_EXT_RE = /\.(heic|heif)$/i;
285
+ const MB = 1024 * 1024;
286
+ function formatMb(bytes, digits = 2) {
287
+ return (bytes / MB).toFixed(digits);
288
+ }
289
+ function formatCapLimit(label, cap, size) {
290
+ return `${label} exceeds ${formatMb(cap, 0)}MB limit (got ${formatMb(size)}MB)`;
291
+ }
292
+ function formatCapReduce(label, cap, size) {
293
+ return `${label} could not be reduced below ${formatMb(cap, 0)}MB (got ${formatMb(size)}MB)`;
294
+ }
295
+ function isHeicSource(opts) {
296
+ if (opts.contentType && HEIC_MIME_RE.test(opts.contentType.trim())) return true;
297
+ if (opts.fileName && HEIC_EXT_RE.test(opts.fileName.trim())) return true;
298
+ return false;
299
+ }
300
+ function toJpegFileName(fileName) {
301
+ if (!fileName) return;
302
+ const trimmed = fileName.trim();
303
+ if (!trimmed) return fileName;
304
+ const parsed = path.parse(trimmed);
305
+ if (!parsed.ext || HEIC_EXT_RE.test(parsed.ext)) return path.format({
306
+ dir: parsed.dir,
307
+ name: parsed.name || trimmed,
308
+ ext: ".jpg"
309
+ });
310
+ return path.format({
311
+ dir: parsed.dir,
312
+ name: parsed.name,
313
+ ext: ".jpg"
314
+ });
315
+ }
316
+ function logOptimizedImage(params) {
317
+ if (!shouldLogVerbose()) return;
318
+ if (params.optimized.optimizedSize >= params.originalSize) return;
319
+ if (params.optimized.format === "png") {
320
+ logVerbose(`Optimized PNG (preserving alpha) from ${formatMb(params.originalSize)}MB to ${formatMb(params.optimized.optimizedSize)}MB (side≤${params.optimized.resizeSide}px)`);
321
+ return;
322
+ }
323
+ logVerbose(`Optimized media from ${formatMb(params.originalSize)}MB to ${formatMb(params.optimized.optimizedSize)}MB (side≤${params.optimized.resizeSide}px, q=${params.optimized.quality})`);
324
+ }
325
+ async function optimizeImageWithFallback(params) {
326
+ const { buffer, cap, meta } = params;
327
+ if ((meta?.contentType === "image/png" || meta?.fileName?.toLowerCase().endsWith(".png")) && await hasAlphaChannel(buffer)) {
328
+ const optimized = await optimizeImageToPng(buffer, cap);
329
+ if (optimized.buffer.length <= cap) return {
330
+ ...optimized,
331
+ format: "png"
332
+ };
333
+ if (shouldLogVerbose()) logVerbose(`PNG with alpha still exceeds ${formatMb(cap, 0)}MB after optimization; falling back to JPEG`);
334
+ }
335
+ return {
336
+ ...await optimizeImageToJpeg(buffer, cap, meta),
337
+ format: "jpeg"
338
+ };
339
+ }
340
+ async function loadWebMediaInternal(mediaUrl, options = {}) {
341
+ const { maxBytes, optimizeImages = true, ssrfPolicy } = options;
342
+ if (mediaUrl.startsWith("file://")) try {
343
+ mediaUrl = fileURLToPath(mediaUrl);
344
+ } catch {
345
+ throw new Error(`Invalid file:// URL: ${mediaUrl}`);
346
+ }
347
+ const optimizeAndClampImage = async (buffer, cap, meta) => {
348
+ const originalSize = buffer.length;
349
+ const optimized = await optimizeImageWithFallback({
350
+ buffer,
351
+ cap,
352
+ meta
353
+ });
354
+ logOptimizedImage({
355
+ originalSize,
356
+ optimized
357
+ });
358
+ if (optimized.buffer.length > cap) throw new Error(formatCapReduce("Media", cap, optimized.buffer.length));
359
+ const contentType = optimized.format === "png" ? "image/png" : "image/jpeg";
360
+ const fileName = optimized.format === "jpeg" && meta && isHeicSource(meta) ? toJpegFileName(meta.fileName) : meta?.fileName;
361
+ return {
362
+ buffer: optimized.buffer,
363
+ contentType,
364
+ kind: "image",
365
+ fileName
366
+ };
367
+ };
368
+ const clampAndFinalize = async (params) => {
369
+ const cap = maxBytes !== void 0 ? maxBytes : maxBytesForKind(params.kind);
370
+ if (params.kind === "image") {
371
+ const isGif = params.contentType === "image/gif";
372
+ if (isGif || !optimizeImages) {
373
+ if (params.buffer.length > cap) throw new Error(formatCapLimit(isGif ? "GIF" : "Media", cap, params.buffer.length));
374
+ return {
375
+ buffer: params.buffer,
376
+ contentType: params.contentType,
377
+ kind: params.kind,
378
+ fileName: params.fileName
379
+ };
380
+ }
381
+ return { ...await optimizeAndClampImage(params.buffer, cap, {
382
+ contentType: params.contentType,
383
+ fileName: params.fileName
384
+ }) };
385
+ }
386
+ if (params.buffer.length > cap) throw new Error(formatCapLimit("Media", cap, params.buffer.length));
387
+ return {
388
+ buffer: params.buffer,
389
+ contentType: params.contentType ?? void 0,
390
+ kind: params.kind,
391
+ fileName: params.fileName
392
+ };
393
+ };
394
+ if (/^https?:\/\//i.test(mediaUrl)) {
395
+ const defaultFetchCap = maxBytesForKind("unknown");
396
+ const { buffer, contentType, fileName } = await fetchRemoteMedia({
397
+ url: mediaUrl,
398
+ maxBytes: maxBytes === void 0 ? defaultFetchCap : optimizeImages ? Math.max(maxBytes, defaultFetchCap) : maxBytes,
399
+ ssrfPolicy
400
+ });
401
+ return await clampAndFinalize({
402
+ buffer,
403
+ contentType,
404
+ kind: mediaKindFromMime(contentType),
405
+ fileName
406
+ });
407
+ }
408
+ if (mediaUrl.startsWith("~")) mediaUrl = resolveUserPath(mediaUrl);
409
+ const data = await fs.readFile(mediaUrl);
410
+ const mime = await detectMime({
411
+ buffer: data,
412
+ filePath: mediaUrl
413
+ });
414
+ const kind = mediaKindFromMime(mime);
415
+ let fileName = path.basename(mediaUrl) || void 0;
416
+ if (fileName && !path.extname(fileName) && mime) {
417
+ const ext = extensionForMime(mime);
418
+ if (ext) fileName = `${fileName}${ext}`;
419
+ }
420
+ return await clampAndFinalize({
421
+ buffer: data,
422
+ contentType: mime,
423
+ kind,
424
+ fileName
425
+ });
426
+ }
427
+ async function loadWebMedia(mediaUrl, maxBytes, options) {
428
+ return await loadWebMediaInternal(mediaUrl, {
429
+ maxBytes,
430
+ optimizeImages: true,
431
+ ssrfPolicy: options?.ssrfPolicy
432
+ });
433
+ }
434
+ async function loadWebMediaRaw(mediaUrl, maxBytes, options) {
435
+ return await loadWebMediaInternal(mediaUrl, {
436
+ maxBytes,
437
+ optimizeImages: false,
438
+ ssrfPolicy: options?.ssrfPolicy
439
+ });
440
+ }
441
+ async function optimizeImageToJpeg(buffer, maxBytes, opts = {}) {
442
+ let source = buffer;
443
+ if (isHeicSource(opts)) try {
444
+ source = await convertHeicToJpeg(buffer);
445
+ } catch (err) {
446
+ throw new Error(`HEIC image conversion failed: ${String(err)}`, { cause: err });
447
+ }
448
+ const sides = [
449
+ 2048,
450
+ 1536,
451
+ 1280,
452
+ 1024,
453
+ 800
454
+ ];
455
+ const qualities = [
456
+ 80,
457
+ 70,
458
+ 60,
459
+ 50,
460
+ 40
461
+ ];
462
+ let smallest = null;
463
+ for (const side of sides) for (const quality of qualities) try {
464
+ const out = await resizeToJpeg({
465
+ buffer: source,
466
+ maxSide: side,
467
+ quality,
468
+ withoutEnlargement: true
469
+ });
470
+ const size = out.length;
471
+ if (!smallest || size < smallest.size) smallest = {
472
+ buffer: out,
473
+ size,
474
+ resizeSide: side,
475
+ quality
476
+ };
477
+ if (size <= maxBytes) return {
478
+ buffer: out,
479
+ optimizedSize: size,
480
+ resizeSide: side,
481
+ quality
482
+ };
483
+ } catch {}
484
+ if (smallest) return {
485
+ buffer: smallest.buffer,
486
+ optimizedSize: smallest.size,
487
+ resizeSide: smallest.resizeSide,
488
+ quality: smallest.quality
489
+ };
490
+ throw new Error("Failed to optimize image");
491
+ }
492
+
493
+ //#endregion
494
+ //#region src/markdown/fences.ts
495
+ function parseFenceSpans(buffer) {
496
+ const spans = [];
497
+ let open;
498
+ let offset = 0;
499
+ while (offset <= buffer.length) {
500
+ const nextNewline = buffer.indexOf("\n", offset);
501
+ const lineEnd = nextNewline === -1 ? buffer.length : nextNewline;
502
+ const line = buffer.slice(offset, lineEnd);
503
+ const match = line.match(/^( {0,3})(`{3,}|~{3,})(.*)$/);
504
+ if (match) {
505
+ const indent = match[1];
506
+ const marker = match[2];
507
+ const markerChar = marker[0];
508
+ const markerLen = marker.length;
509
+ if (!open) open = {
510
+ start: offset,
511
+ markerChar,
512
+ markerLen,
513
+ openLine: line,
514
+ marker,
515
+ indent
516
+ };
517
+ else if (open.markerChar === markerChar && markerLen >= open.markerLen) {
518
+ const end = lineEnd;
519
+ spans.push({
520
+ start: open.start,
521
+ end,
522
+ openLine: open.openLine,
523
+ marker: open.marker,
524
+ indent: open.indent
525
+ });
526
+ open = void 0;
527
+ }
528
+ }
529
+ if (nextNewline === -1) break;
530
+ offset = nextNewline + 1;
531
+ }
532
+ if (open) spans.push({
533
+ start: open.start,
534
+ end: buffer.length,
535
+ openLine: open.openLine,
536
+ marker: open.marker,
537
+ indent: open.indent
538
+ });
539
+ return spans;
540
+ }
541
+ function findFenceSpanAt(spans, index) {
542
+ return spans.find((span) => index > span.start && index < span.end);
543
+ }
544
+ function isSafeFenceBreak(spans, index) {
545
+ return !findFenceSpanAt(spans, index);
546
+ }
547
+
548
+ //#endregion
549
+ //#region src/auto-reply/chunk.ts
550
+ const DEFAULT_CHUNK_LIMIT = 4e3;
551
+ const DEFAULT_CHUNK_MODE = "length";
552
+ function resolveChunkLimitForProvider(cfgSection, accountId) {
553
+ if (!cfgSection) return;
554
+ const normalizedAccountId = normalizeAccountId$1(accountId);
555
+ const accounts = cfgSection.accounts;
556
+ if (accounts && typeof accounts === "object") {
557
+ const direct = accounts[normalizedAccountId];
558
+ if (typeof direct?.textChunkLimit === "number") return direct.textChunkLimit;
559
+ const matchKey = Object.keys(accounts).find((key) => key.toLowerCase() === normalizedAccountId.toLowerCase());
560
+ const match = matchKey ? accounts[matchKey] : void 0;
561
+ if (typeof match?.textChunkLimit === "number") return match.textChunkLimit;
562
+ }
563
+ return cfgSection.textChunkLimit;
564
+ }
565
+ function resolveTextChunkLimit(cfg, provider, accountId, opts) {
566
+ const fallback = typeof opts?.fallbackLimit === "number" && opts.fallbackLimit > 0 ? opts.fallbackLimit : DEFAULT_CHUNK_LIMIT;
567
+ const providerOverride = (() => {
568
+ if (!provider || provider === INTERNAL_MESSAGE_CHANNEL) return;
569
+ return resolveChunkLimitForProvider((cfg?.channels)?.[provider] ?? cfg?.[provider], accountId);
570
+ })();
571
+ if (typeof providerOverride === "number" && providerOverride > 0) return providerOverride;
572
+ return fallback;
573
+ }
574
+ function resolveChunkModeForProvider(cfgSection, accountId) {
575
+ if (!cfgSection) return;
576
+ const normalizedAccountId = normalizeAccountId$1(accountId);
577
+ const accounts = cfgSection.accounts;
578
+ if (accounts && typeof accounts === "object") {
579
+ const direct = accounts[normalizedAccountId];
580
+ if (direct?.chunkMode) return direct.chunkMode;
581
+ const matchKey = Object.keys(accounts).find((key) => key.toLowerCase() === normalizedAccountId.toLowerCase());
582
+ const match = matchKey ? accounts[matchKey] : void 0;
583
+ if (match?.chunkMode) return match.chunkMode;
584
+ }
585
+ return cfgSection.chunkMode;
586
+ }
587
+ function resolveChunkMode(cfg, provider, accountId) {
588
+ if (!provider || provider === INTERNAL_MESSAGE_CHANNEL) return DEFAULT_CHUNK_MODE;
589
+ return resolveChunkModeForProvider((cfg?.channels)?.[provider] ?? cfg?.[provider], accountId) ?? DEFAULT_CHUNK_MODE;
590
+ }
591
+ /**
592
+ * Split text on newlines, trimming line whitespace.
593
+ * Blank lines are folded into the next non-empty line as leading "\n" prefixes.
594
+ * Long lines can be split by length (default) or kept intact via splitLongLines:false.
595
+ */
596
+ function chunkByNewline(text, maxLineLength, opts) {
597
+ if (!text) return [];
598
+ if (maxLineLength <= 0) return text.trim() ? [text] : [];
599
+ const splitLongLines = opts?.splitLongLines !== false;
600
+ const trimLines = opts?.trimLines !== false;
601
+ const lines = splitByNewline(text, opts?.isSafeBreak);
602
+ const chunks = [];
603
+ let pendingBlankLines = 0;
604
+ for (const line of lines) {
605
+ const trimmed = line.trim();
606
+ if (!trimmed) {
607
+ pendingBlankLines += 1;
608
+ continue;
609
+ }
610
+ const maxPrefix = Math.max(0, maxLineLength - 1);
611
+ const cappedBlankLines = pendingBlankLines > 0 ? Math.min(pendingBlankLines, maxPrefix) : 0;
612
+ const prefix = cappedBlankLines > 0 ? "\n".repeat(cappedBlankLines) : "";
613
+ pendingBlankLines = 0;
614
+ const lineValue = trimLines ? trimmed : line;
615
+ if (!splitLongLines || lineValue.length + prefix.length <= maxLineLength) {
616
+ chunks.push(prefix + lineValue);
617
+ continue;
618
+ }
619
+ const firstLimit = Math.max(1, maxLineLength - prefix.length);
620
+ const first = lineValue.slice(0, firstLimit);
621
+ chunks.push(prefix + first);
622
+ const remaining = lineValue.slice(firstLimit);
623
+ if (remaining) chunks.push(...chunkText(remaining, maxLineLength));
624
+ }
625
+ if (pendingBlankLines > 0 && chunks.length > 0) chunks[chunks.length - 1] += "\n".repeat(pendingBlankLines);
626
+ return chunks;
627
+ }
628
+ /**
629
+ * Split text into chunks on paragraph boundaries (blank lines), preserving lists and
630
+ * single-newline line wraps inside paragraphs.
631
+ *
632
+ * - Only breaks at paragraph separators ("\n\n" or more, allowing whitespace on blank lines)
633
+ * - Packs multiple paragraphs into a single chunk up to `limit`
634
+ * - Falls back to length-based splitting when a single paragraph exceeds `limit`
635
+ * (unless `splitLongParagraphs` is disabled)
636
+ */
637
+ function chunkByParagraph(text, limit, opts) {
638
+ if (!text) return [];
639
+ if (limit <= 0) return [text];
640
+ const splitLongParagraphs = opts?.splitLongParagraphs !== false;
641
+ const normalized = text.replace(/\r\n?/g, "\n");
642
+ if (!/\n[\t ]*\n+/.test(normalized)) {
643
+ if (normalized.length <= limit) return [normalized];
644
+ if (!splitLongParagraphs) return [normalized];
645
+ return chunkText(normalized, limit);
646
+ }
647
+ const spans = parseFenceSpans(normalized);
648
+ const parts = [];
649
+ const re = /\n[\t ]*\n+/g;
650
+ let lastIndex = 0;
651
+ for (const match of normalized.matchAll(re)) {
652
+ const idx = match.index ?? 0;
653
+ if (!isSafeFenceBreak(spans, idx)) continue;
654
+ parts.push(normalized.slice(lastIndex, idx));
655
+ lastIndex = idx + match[0].length;
656
+ }
657
+ parts.push(normalized.slice(lastIndex));
658
+ const chunks = [];
659
+ for (const part of parts) {
660
+ const paragraph = part.replace(/\s+$/g, "");
661
+ if (!paragraph.trim()) continue;
662
+ if (paragraph.length <= limit) chunks.push(paragraph);
663
+ else if (!splitLongParagraphs) chunks.push(paragraph);
664
+ else chunks.push(...chunkText(paragraph, limit));
665
+ }
666
+ return chunks;
667
+ }
668
+ /**
669
+ * Unified chunking function that dispatches based on mode.
670
+ */
671
+ function chunkTextWithMode(text, limit, mode) {
672
+ if (mode === "newline") return chunkByParagraph(text, limit);
673
+ return chunkText(text, limit);
674
+ }
675
+ function chunkMarkdownTextWithMode(text, limit, mode) {
676
+ if (mode === "newline") {
677
+ const paragraphChunks = chunkByParagraph(text, limit, { splitLongParagraphs: false });
678
+ const out = [];
679
+ for (const chunk of paragraphChunks) {
680
+ const nested = chunkMarkdownText(chunk, limit);
681
+ if (!nested.length && chunk) out.push(chunk);
682
+ else out.push(...nested);
683
+ }
684
+ return out;
685
+ }
686
+ return chunkMarkdownText(text, limit);
687
+ }
688
+ function splitByNewline(text, isSafeBreak = () => true) {
689
+ const lines = [];
690
+ let start = 0;
691
+ for (let i = 0; i < text.length; i++) if (text[i] === "\n" && isSafeBreak(i)) {
692
+ lines.push(text.slice(start, i));
693
+ start = i + 1;
694
+ }
695
+ lines.push(text.slice(start));
696
+ return lines;
697
+ }
698
+ function chunkText(text, limit) {
699
+ if (!text) return [];
700
+ if (limit <= 0) return [text];
701
+ if (text.length <= limit) return [text];
702
+ const chunks = [];
703
+ let remaining = text;
704
+ while (remaining.length > limit) {
705
+ const { lastNewline, lastWhitespace } = scanParenAwareBreakpoints(remaining.slice(0, limit));
706
+ let breakIdx = lastNewline > 0 ? lastNewline : lastWhitespace;
707
+ if (breakIdx <= 0) breakIdx = limit;
708
+ const chunk = remaining.slice(0, breakIdx).trimEnd();
709
+ if (chunk.length > 0) chunks.push(chunk);
710
+ const brokeOnSeparator = breakIdx < remaining.length && /\s/.test(remaining[breakIdx]);
711
+ const nextStart = Math.min(remaining.length, breakIdx + (brokeOnSeparator ? 1 : 0));
712
+ remaining = remaining.slice(nextStart).trimStart();
713
+ }
714
+ if (remaining.length) chunks.push(remaining);
715
+ return chunks;
716
+ }
717
+ function chunkMarkdownText(text, limit) {
718
+ if (!text) return [];
719
+ if (limit <= 0) return [text];
720
+ if (text.length <= limit) return [text];
721
+ const chunks = [];
722
+ let remaining = text;
723
+ while (remaining.length > limit) {
724
+ const spans = parseFenceSpans(remaining);
725
+ const softBreak = pickSafeBreakIndex(remaining.slice(0, limit), spans);
726
+ let breakIdx = softBreak > 0 ? softBreak : limit;
727
+ const initialFence = isSafeFenceBreak(spans, breakIdx) ? void 0 : findFenceSpanAt(spans, breakIdx);
728
+ let fenceToSplit = initialFence;
729
+ if (initialFence) {
730
+ const closeLine = `${initialFence.indent}${initialFence.marker}`;
731
+ const maxIdxIfNeedNewline = limit - (closeLine.length + 1);
732
+ if (maxIdxIfNeedNewline <= 0) {
733
+ fenceToSplit = void 0;
734
+ breakIdx = limit;
735
+ } else {
736
+ const minProgressIdx = Math.min(remaining.length, initialFence.start + initialFence.openLine.length + 2);
737
+ const maxIdxIfAlreadyNewline = limit - closeLine.length;
738
+ let pickedNewline = false;
739
+ let lastNewline = remaining.lastIndexOf("\n", Math.max(0, maxIdxIfAlreadyNewline - 1));
740
+ while (lastNewline !== -1) {
741
+ const candidateBreak = lastNewline + 1;
742
+ if (candidateBreak < minProgressIdx) break;
743
+ const candidateFence = findFenceSpanAt(spans, candidateBreak);
744
+ if (candidateFence && candidateFence.start === initialFence.start) {
745
+ breakIdx = Math.max(1, candidateBreak);
746
+ pickedNewline = true;
747
+ break;
748
+ }
749
+ lastNewline = remaining.lastIndexOf("\n", lastNewline - 1);
750
+ }
751
+ if (!pickedNewline) if (minProgressIdx > maxIdxIfAlreadyNewline) {
752
+ fenceToSplit = void 0;
753
+ breakIdx = limit;
754
+ } else breakIdx = Math.max(minProgressIdx, maxIdxIfNeedNewline);
755
+ }
756
+ const fenceAtBreak = findFenceSpanAt(spans, breakIdx);
757
+ fenceToSplit = fenceAtBreak && fenceAtBreak.start === initialFence.start ? fenceAtBreak : void 0;
758
+ }
759
+ let rawChunk = remaining.slice(0, breakIdx);
760
+ if (!rawChunk) break;
761
+ const brokeOnSeparator = breakIdx < remaining.length && /\s/.test(remaining[breakIdx]);
762
+ const nextStart = Math.min(remaining.length, breakIdx + (brokeOnSeparator ? 1 : 0));
763
+ let next = remaining.slice(nextStart);
764
+ if (fenceToSplit) {
765
+ const closeLine = `${fenceToSplit.indent}${fenceToSplit.marker}`;
766
+ rawChunk = rawChunk.endsWith("\n") ? `${rawChunk}${closeLine}` : `${rawChunk}\n${closeLine}`;
767
+ next = `${fenceToSplit.openLine}\n${next}`;
768
+ } else next = stripLeadingNewlines(next);
769
+ chunks.push(rawChunk);
770
+ remaining = next;
771
+ }
772
+ if (remaining.length) chunks.push(remaining);
773
+ return chunks;
774
+ }
775
+ function stripLeadingNewlines(value) {
776
+ let i = 0;
777
+ while (i < value.length && value[i] === "\n") i++;
778
+ return i > 0 ? value.slice(i) : value;
779
+ }
780
+ function pickSafeBreakIndex(window, spans) {
781
+ const { lastNewline, lastWhitespace } = scanParenAwareBreakpoints(window, (index) => isSafeFenceBreak(spans, index));
782
+ if (lastNewline > 0) return lastNewline;
783
+ if (lastWhitespace > 0) return lastWhitespace;
784
+ return -1;
785
+ }
786
+ function scanParenAwareBreakpoints(window, isAllowed = () => true) {
787
+ let lastNewline = -1;
788
+ let lastWhitespace = -1;
789
+ let depth = 0;
790
+ for (let i = 0; i < window.length; i++) {
791
+ if (!isAllowed(i)) continue;
792
+ const char = window[i];
793
+ if (char === "(") {
794
+ depth += 1;
795
+ continue;
796
+ }
797
+ if (char === ")" && depth > 0) {
798
+ depth -= 1;
799
+ continue;
800
+ }
801
+ if (depth !== 0) continue;
802
+ if (char === "\n") lastNewline = i;
803
+ else if (/\s/.test(char)) lastWhitespace = i;
804
+ }
805
+ return {
806
+ lastNewline,
807
+ lastWhitespace
808
+ };
809
+ }
810
+
811
+ //#endregion
812
+ //#region src/infra/fetch.ts
813
+ function withDuplex(init, input) {
814
+ const hasInitBody = init?.body != null;
815
+ const hasRequestBody = !hasInitBody && typeof Request !== "undefined" && input instanceof Request && input.body != null;
816
+ if (!hasInitBody && !hasRequestBody) return init;
817
+ if (init && "duplex" in init) return init;
818
+ return init ? {
819
+ ...init,
820
+ duplex: "half"
821
+ } : { duplex: "half" };
822
+ }
823
+ function wrapFetchWithAbortSignal(fetchImpl) {
824
+ const wrapped = ((input, init) => {
825
+ const patchedInit = withDuplex(init, input);
826
+ const signal = patchedInit?.signal;
827
+ if (!signal) return fetchImpl(input, patchedInit);
828
+ if (typeof AbortSignal !== "undefined" && signal instanceof AbortSignal) return fetchImpl(input, patchedInit);
829
+ if (typeof AbortController === "undefined") return fetchImpl(input, patchedInit);
830
+ if (typeof signal.addEventListener !== "function") return fetchImpl(input, patchedInit);
831
+ const controller = new AbortController();
832
+ const onAbort = () => controller.abort();
833
+ if (signal.aborted) controller.abort();
834
+ else signal.addEventListener("abort", onAbort, { once: true });
835
+ const response = fetchImpl(input, {
836
+ ...patchedInit,
837
+ signal: controller.signal
838
+ });
839
+ if (typeof signal.removeEventListener === "function") response.finally(() => {
840
+ signal.removeEventListener("abort", onAbort);
841
+ });
842
+ return response;
843
+ });
844
+ const fetchWithPreconnect = fetchImpl;
845
+ wrapped.preconnect = typeof fetchWithPreconnect.preconnect === "function" ? fetchWithPreconnect.preconnect.bind(fetchWithPreconnect) : () => {};
846
+ return Object.assign(wrapped, fetchImpl);
847
+ }
848
+ function resolveFetch(fetchImpl) {
849
+ const resolved = fetchImpl ?? globalThis.fetch;
850
+ if (!resolved) return;
851
+ return wrapFetchWithAbortSignal(resolved);
852
+ }
853
+
854
+ //#endregion
855
+ //#region src/config/markdown-tables.ts
856
+ const DEFAULT_TABLE_MODES = new Map([["signal", "bullets"], ["whatsapp", "bullets"]]);
857
+ const isMarkdownTableMode = (value) => value === "off" || value === "bullets" || value === "code";
858
+ function resolveMarkdownModeFromSection(section, accountId) {
859
+ if (!section) return;
860
+ const normalizedAccountId = normalizeAccountId$1(accountId);
861
+ const accounts = section.accounts;
862
+ if (accounts && typeof accounts === "object") {
863
+ const directMode = accounts[normalizedAccountId]?.markdown?.tables;
864
+ if (isMarkdownTableMode(directMode)) return directMode;
865
+ const matchKey = Object.keys(accounts).find((key) => key.toLowerCase() === normalizedAccountId.toLowerCase());
866
+ const matchMode = (matchKey ? accounts[matchKey] : void 0)?.markdown?.tables;
867
+ if (isMarkdownTableMode(matchMode)) return matchMode;
868
+ }
869
+ const sectionMode = section.markdown?.tables;
870
+ return isMarkdownTableMode(sectionMode) ? sectionMode : void 0;
871
+ }
872
+ function resolveMarkdownTableMode(params) {
873
+ const channel = normalizeChannelId(params.channel);
874
+ const defaultMode = channel ? DEFAULT_TABLE_MODES.get(channel) ?? "code" : "code";
875
+ if (!channel || !params.cfg) return defaultMode;
876
+ return resolveMarkdownModeFromSection(params.cfg.channels?.[channel] ?? params.cfg?.[channel], params.accountId) ?? defaultMode;
877
+ }
878
+
879
+ //#endregion
880
+ //#region src/markdown/ir.ts
881
+ function createMarkdownIt(options) {
882
+ const md = new MarkdownIt({
883
+ html: false,
884
+ linkify: options.linkify ?? true,
885
+ breaks: false,
886
+ typographer: false
887
+ });
888
+ md.enable("strikethrough");
889
+ if (options.tableMode && options.tableMode !== "off") md.enable("table");
890
+ else md.disable("table");
891
+ if (options.autolink === false) md.disable("autolink");
892
+ return md;
893
+ }
894
+ function getAttr(token, name) {
895
+ if (token.attrGet) return token.attrGet(name);
896
+ if (token.attrs) {
897
+ for (const [key, value] of token.attrs) if (key === name) return value;
898
+ }
899
+ return null;
900
+ }
901
+ function createTextToken(base, content) {
902
+ return {
903
+ ...base,
904
+ type: "text",
905
+ content,
906
+ children: void 0
907
+ };
908
+ }
909
+ function applySpoilerTokens(tokens) {
910
+ for (const token of tokens) if (token.children && token.children.length > 0) token.children = injectSpoilersIntoInline(token.children);
911
+ }
912
+ function injectSpoilersIntoInline(tokens) {
913
+ const result = [];
914
+ const state = { spoilerOpen: false };
915
+ for (const token of tokens) {
916
+ if (token.type !== "text") {
917
+ result.push(token);
918
+ continue;
919
+ }
920
+ const content = token.content ?? "";
921
+ if (!content.includes("||")) {
922
+ result.push(token);
923
+ continue;
924
+ }
925
+ let index = 0;
926
+ while (index < content.length) {
927
+ const next = content.indexOf("||", index);
928
+ if (next === -1) {
929
+ if (index < content.length) result.push(createTextToken(token, content.slice(index)));
930
+ break;
931
+ }
932
+ if (next > index) result.push(createTextToken(token, content.slice(index, next)));
933
+ state.spoilerOpen = !state.spoilerOpen;
934
+ result.push({ type: state.spoilerOpen ? "spoiler_open" : "spoiler_close" });
935
+ index = next + 2;
936
+ }
937
+ }
938
+ return result;
939
+ }
940
+ function initRenderTarget() {
941
+ return {
942
+ text: "",
943
+ styles: [],
944
+ openStyles: [],
945
+ links: [],
946
+ linkStack: []
947
+ };
948
+ }
949
+ function resolveRenderTarget(state) {
950
+ return state.table?.currentCell ?? state;
951
+ }
952
+ function appendText(state, value) {
953
+ if (!value) return;
954
+ const target = resolveRenderTarget(state);
955
+ target.text += value;
956
+ }
957
+ function openStyle(state, style) {
958
+ const target = resolveRenderTarget(state);
959
+ target.openStyles.push({
960
+ style,
961
+ start: target.text.length
962
+ });
963
+ }
964
+ function closeStyle(state, style) {
965
+ const target = resolveRenderTarget(state);
966
+ for (let i = target.openStyles.length - 1; i >= 0; i -= 1) if (target.openStyles[i]?.style === style) {
967
+ const start = target.openStyles[i].start;
968
+ target.openStyles.splice(i, 1);
969
+ const end = target.text.length;
970
+ if (end > start) target.styles.push({
971
+ start,
972
+ end,
973
+ style
974
+ });
975
+ return;
976
+ }
977
+ }
978
+ function appendParagraphSeparator(state) {
979
+ if (state.env.listStack.length > 0) return;
980
+ if (state.table) return;
981
+ state.text += "\n\n";
982
+ }
983
+ function appendListPrefix(state) {
984
+ const stack = state.env.listStack;
985
+ const top = stack[stack.length - 1];
986
+ if (!top) return;
987
+ top.index += 1;
988
+ const indent = " ".repeat(Math.max(0, stack.length - 1));
989
+ const prefix = top.type === "ordered" ? `${top.index}. ` : "• ";
990
+ state.text += `${indent}${prefix}`;
991
+ }
992
+ function renderInlineCode(state, content) {
993
+ if (!content) return;
994
+ const target = resolveRenderTarget(state);
995
+ const start = target.text.length;
996
+ target.text += content;
997
+ target.styles.push({
998
+ start,
999
+ end: start + content.length,
1000
+ style: "code"
1001
+ });
1002
+ }
1003
+ function renderCodeBlock(state, content) {
1004
+ let code = content ?? "";
1005
+ if (!code.endsWith("\n")) code = `${code}\n`;
1006
+ const target = resolveRenderTarget(state);
1007
+ const start = target.text.length;
1008
+ target.text += code;
1009
+ target.styles.push({
1010
+ start,
1011
+ end: start + code.length,
1012
+ style: "code_block"
1013
+ });
1014
+ if (state.env.listStack.length === 0) target.text += "\n";
1015
+ }
1016
+ function handleLinkClose(state) {
1017
+ const target = resolveRenderTarget(state);
1018
+ const link = target.linkStack.pop();
1019
+ if (!link?.href) return;
1020
+ const href = link.href.trim();
1021
+ if (!href) return;
1022
+ const start = link.labelStart;
1023
+ const end = target.text.length;
1024
+ if (end <= start) {
1025
+ target.links.push({
1026
+ start,
1027
+ end,
1028
+ href
1029
+ });
1030
+ return;
1031
+ }
1032
+ target.links.push({
1033
+ start,
1034
+ end,
1035
+ href
1036
+ });
1037
+ }
1038
+ function initTableState() {
1039
+ return {
1040
+ headers: [],
1041
+ rows: [],
1042
+ currentRow: [],
1043
+ currentCell: null,
1044
+ inHeader: false
1045
+ };
1046
+ }
1047
+ function finishTableCell(cell) {
1048
+ closeRemainingStyles(cell);
1049
+ return {
1050
+ text: cell.text,
1051
+ styles: cell.styles,
1052
+ links: cell.links
1053
+ };
1054
+ }
1055
+ function trimCell(cell) {
1056
+ const text = cell.text;
1057
+ let start = 0;
1058
+ let end = text.length;
1059
+ while (start < end && /\s/.test(text[start] ?? "")) start += 1;
1060
+ while (end > start && /\s/.test(text[end - 1] ?? "")) end -= 1;
1061
+ if (start === 0 && end === text.length) return cell;
1062
+ const trimmedText = text.slice(start, end);
1063
+ const trimmedLength = trimmedText.length;
1064
+ const trimmedStyles = [];
1065
+ for (const span of cell.styles) {
1066
+ const sliceStart = Math.max(0, span.start - start);
1067
+ const sliceEnd = Math.min(trimmedLength, span.end - start);
1068
+ if (sliceEnd > sliceStart) trimmedStyles.push({
1069
+ start: sliceStart,
1070
+ end: sliceEnd,
1071
+ style: span.style
1072
+ });
1073
+ }
1074
+ const trimmedLinks = [];
1075
+ for (const span of cell.links) {
1076
+ const sliceStart = Math.max(0, span.start - start);
1077
+ const sliceEnd = Math.min(trimmedLength, span.end - start);
1078
+ if (sliceEnd > sliceStart) trimmedLinks.push({
1079
+ start: sliceStart,
1080
+ end: sliceEnd,
1081
+ href: span.href
1082
+ });
1083
+ }
1084
+ return {
1085
+ text: trimmedText,
1086
+ styles: trimmedStyles,
1087
+ links: trimmedLinks
1088
+ };
1089
+ }
1090
+ function appendCell(state, cell) {
1091
+ if (!cell.text) return;
1092
+ const start = state.text.length;
1093
+ state.text += cell.text;
1094
+ for (const span of cell.styles) state.styles.push({
1095
+ start: start + span.start,
1096
+ end: start + span.end,
1097
+ style: span.style
1098
+ });
1099
+ for (const link of cell.links) state.links.push({
1100
+ start: start + link.start,
1101
+ end: start + link.end,
1102
+ href: link.href
1103
+ });
1104
+ }
1105
+ function renderTableAsBullets(state) {
1106
+ if (!state.table) return;
1107
+ const headers = state.table.headers.map(trimCell);
1108
+ const rows = state.table.rows.map((row) => row.map(trimCell));
1109
+ if (headers.length === 0 && rows.length === 0) return;
1110
+ if (headers.length > 1 && rows.length > 0) for (const row of rows) {
1111
+ if (row.length === 0) continue;
1112
+ const rowLabel = row[0];
1113
+ if (rowLabel?.text) {
1114
+ const labelStart = state.text.length;
1115
+ appendCell(state, rowLabel);
1116
+ const labelEnd = state.text.length;
1117
+ if (labelEnd > labelStart) state.styles.push({
1118
+ start: labelStart,
1119
+ end: labelEnd,
1120
+ style: "bold"
1121
+ });
1122
+ state.text += "\n";
1123
+ }
1124
+ for (let i = 1; i < row.length; i++) {
1125
+ const header = headers[i];
1126
+ const value = row[i];
1127
+ if (!value?.text) continue;
1128
+ state.text += "• ";
1129
+ if (header?.text) {
1130
+ appendCell(state, header);
1131
+ state.text += ": ";
1132
+ } else state.text += `Column ${i}: `;
1133
+ appendCell(state, value);
1134
+ state.text += "\n";
1135
+ }
1136
+ state.text += "\n";
1137
+ }
1138
+ else for (const row of rows) {
1139
+ for (let i = 0; i < row.length; i++) {
1140
+ const header = headers[i];
1141
+ const value = row[i];
1142
+ if (!value?.text) continue;
1143
+ state.text += "• ";
1144
+ if (header?.text) {
1145
+ appendCell(state, header);
1146
+ state.text += ": ";
1147
+ }
1148
+ appendCell(state, value);
1149
+ state.text += "\n";
1150
+ }
1151
+ state.text += "\n";
1152
+ }
1153
+ }
1154
+ function renderTableAsCode(state) {
1155
+ if (!state.table) return;
1156
+ const headers = state.table.headers.map(trimCell);
1157
+ const rows = state.table.rows.map((row) => row.map(trimCell));
1158
+ const columnCount = Math.max(headers.length, ...rows.map((row) => row.length));
1159
+ if (columnCount === 0) return;
1160
+ const widths = Array.from({ length: columnCount }, () => 0);
1161
+ const updateWidths = (cells) => {
1162
+ for (let i = 0; i < columnCount; i += 1) {
1163
+ const width = cells[i]?.text.length ?? 0;
1164
+ if (widths[i] < width) widths[i] = width;
1165
+ }
1166
+ };
1167
+ updateWidths(headers);
1168
+ for (const row of rows) updateWidths(row);
1169
+ const codeStart = state.text.length;
1170
+ const appendRow = (cells) => {
1171
+ state.text += "|";
1172
+ for (let i = 0; i < columnCount; i += 1) {
1173
+ state.text += " ";
1174
+ const cell = cells[i];
1175
+ if (cell) appendCell(state, cell);
1176
+ const pad = widths[i] - (cell?.text.length ?? 0);
1177
+ if (pad > 0) state.text += " ".repeat(pad);
1178
+ state.text += " |";
1179
+ }
1180
+ state.text += "\n";
1181
+ };
1182
+ const appendDivider = () => {
1183
+ state.text += "|";
1184
+ for (let i = 0; i < columnCount; i += 1) {
1185
+ const dashCount = Math.max(3, widths[i]);
1186
+ state.text += ` ${"-".repeat(dashCount)} |`;
1187
+ }
1188
+ state.text += "\n";
1189
+ };
1190
+ appendRow(headers);
1191
+ appendDivider();
1192
+ for (const row of rows) appendRow(row);
1193
+ const codeEnd = state.text.length;
1194
+ if (codeEnd > codeStart) state.styles.push({
1195
+ start: codeStart,
1196
+ end: codeEnd,
1197
+ style: "code_block"
1198
+ });
1199
+ if (state.env.listStack.length === 0) state.text += "\n";
1200
+ }
1201
+ function renderTokens(tokens, state) {
1202
+ for (const token of tokens) switch (token.type) {
1203
+ case "inline":
1204
+ if (token.children) renderTokens(token.children, state);
1205
+ break;
1206
+ case "text":
1207
+ appendText(state, token.content ?? "");
1208
+ break;
1209
+ case "em_open":
1210
+ openStyle(state, "italic");
1211
+ break;
1212
+ case "em_close":
1213
+ closeStyle(state, "italic");
1214
+ break;
1215
+ case "strong_open":
1216
+ openStyle(state, "bold");
1217
+ break;
1218
+ case "strong_close":
1219
+ closeStyle(state, "bold");
1220
+ break;
1221
+ case "s_open":
1222
+ openStyle(state, "strikethrough");
1223
+ break;
1224
+ case "s_close":
1225
+ closeStyle(state, "strikethrough");
1226
+ break;
1227
+ case "code_inline":
1228
+ renderInlineCode(state, token.content ?? "");
1229
+ break;
1230
+ case "spoiler_open":
1231
+ if (state.enableSpoilers) openStyle(state, "spoiler");
1232
+ break;
1233
+ case "spoiler_close":
1234
+ if (state.enableSpoilers) closeStyle(state, "spoiler");
1235
+ break;
1236
+ case "link_open": {
1237
+ const href = getAttr(token, "href") ?? "";
1238
+ const target = resolveRenderTarget(state);
1239
+ target.linkStack.push({
1240
+ href,
1241
+ labelStart: target.text.length
1242
+ });
1243
+ break;
1244
+ }
1245
+ case "link_close":
1246
+ handleLinkClose(state);
1247
+ break;
1248
+ case "image":
1249
+ appendText(state, token.content ?? "");
1250
+ break;
1251
+ case "softbreak":
1252
+ case "hardbreak":
1253
+ appendText(state, "\n");
1254
+ break;
1255
+ case "paragraph_close":
1256
+ appendParagraphSeparator(state);
1257
+ break;
1258
+ case "heading_open":
1259
+ if (state.headingStyle === "bold") openStyle(state, "bold");
1260
+ break;
1261
+ case "heading_close":
1262
+ if (state.headingStyle === "bold") closeStyle(state, "bold");
1263
+ appendParagraphSeparator(state);
1264
+ break;
1265
+ case "blockquote_open":
1266
+ if (state.blockquotePrefix) state.text += state.blockquotePrefix;
1267
+ break;
1268
+ case "blockquote_close":
1269
+ state.text += "\n";
1270
+ break;
1271
+ case "bullet_list_open":
1272
+ state.env.listStack.push({
1273
+ type: "bullet",
1274
+ index: 0
1275
+ });
1276
+ break;
1277
+ case "bullet_list_close":
1278
+ state.env.listStack.pop();
1279
+ break;
1280
+ case "ordered_list_open": {
1281
+ const start = Number(getAttr(token, "start") ?? "1");
1282
+ state.env.listStack.push({
1283
+ type: "ordered",
1284
+ index: start - 1
1285
+ });
1286
+ break;
1287
+ }
1288
+ case "ordered_list_close":
1289
+ state.env.listStack.pop();
1290
+ break;
1291
+ case "list_item_open":
1292
+ appendListPrefix(state);
1293
+ break;
1294
+ case "list_item_close":
1295
+ state.text += "\n";
1296
+ break;
1297
+ case "code_block":
1298
+ case "fence":
1299
+ renderCodeBlock(state, token.content ?? "");
1300
+ break;
1301
+ case "html_block":
1302
+ case "html_inline":
1303
+ appendText(state, token.content ?? "");
1304
+ break;
1305
+ case "table_open":
1306
+ if (state.tableMode !== "off") {
1307
+ state.table = initTableState();
1308
+ state.hasTables = true;
1309
+ }
1310
+ break;
1311
+ case "table_close":
1312
+ if (state.table) {
1313
+ if (state.tableMode === "bullets") renderTableAsBullets(state);
1314
+ else if (state.tableMode === "code") renderTableAsCode(state);
1315
+ }
1316
+ state.table = null;
1317
+ break;
1318
+ case "thead_open":
1319
+ if (state.table) state.table.inHeader = true;
1320
+ break;
1321
+ case "thead_close":
1322
+ if (state.table) state.table.inHeader = false;
1323
+ break;
1324
+ case "tbody_open":
1325
+ case "tbody_close": break;
1326
+ case "tr_open":
1327
+ if (state.table) state.table.currentRow = [];
1328
+ break;
1329
+ case "tr_close":
1330
+ if (state.table) {
1331
+ if (state.table.inHeader) state.table.headers = state.table.currentRow;
1332
+ else state.table.rows.push(state.table.currentRow);
1333
+ state.table.currentRow = [];
1334
+ }
1335
+ break;
1336
+ case "th_open":
1337
+ case "td_open":
1338
+ if (state.table) state.table.currentCell = initRenderTarget();
1339
+ break;
1340
+ case "th_close":
1341
+ case "td_close":
1342
+ if (state.table?.currentCell) {
1343
+ state.table.currentRow.push(finishTableCell(state.table.currentCell));
1344
+ state.table.currentCell = null;
1345
+ }
1346
+ break;
1347
+ case "hr":
1348
+ state.text += "\n";
1349
+ break;
1350
+ default:
1351
+ if (token.children) renderTokens(token.children, state);
1352
+ break;
1353
+ }
1354
+ }
1355
+ function closeRemainingStyles(target) {
1356
+ for (let i = target.openStyles.length - 1; i >= 0; i -= 1) {
1357
+ const open = target.openStyles[i];
1358
+ const end = target.text.length;
1359
+ if (end > open.start) target.styles.push({
1360
+ start: open.start,
1361
+ end,
1362
+ style: open.style
1363
+ });
1364
+ }
1365
+ target.openStyles = [];
1366
+ }
1367
+ function clampStyleSpans(spans, maxLength) {
1368
+ const clamped = [];
1369
+ for (const span of spans) {
1370
+ const start = Math.max(0, Math.min(span.start, maxLength));
1371
+ const end = Math.max(start, Math.min(span.end, maxLength));
1372
+ if (end > start) clamped.push({
1373
+ start,
1374
+ end,
1375
+ style: span.style
1376
+ });
1377
+ }
1378
+ return clamped;
1379
+ }
1380
+ function clampLinkSpans(spans, maxLength) {
1381
+ const clamped = [];
1382
+ for (const span of spans) {
1383
+ const start = Math.max(0, Math.min(span.start, maxLength));
1384
+ const end = Math.max(start, Math.min(span.end, maxLength));
1385
+ if (end > start) clamped.push({
1386
+ start,
1387
+ end,
1388
+ href: span.href
1389
+ });
1390
+ }
1391
+ return clamped;
1392
+ }
1393
+ function mergeStyleSpans(spans) {
1394
+ const sorted = [...spans].toSorted((a, b) => {
1395
+ if (a.start !== b.start) return a.start - b.start;
1396
+ if (a.end !== b.end) return a.end - b.end;
1397
+ return a.style.localeCompare(b.style);
1398
+ });
1399
+ const merged = [];
1400
+ for (const span of sorted) {
1401
+ const prev = merged[merged.length - 1];
1402
+ if (prev && prev.style === span.style && span.start <= prev.end) {
1403
+ prev.end = Math.max(prev.end, span.end);
1404
+ continue;
1405
+ }
1406
+ merged.push({ ...span });
1407
+ }
1408
+ return merged;
1409
+ }
1410
+ function sliceStyleSpans(spans, start, end) {
1411
+ if (spans.length === 0) return [];
1412
+ const sliced = [];
1413
+ for (const span of spans) {
1414
+ const sliceStart = Math.max(span.start, start);
1415
+ const sliceEnd = Math.min(span.end, end);
1416
+ if (sliceEnd > sliceStart) sliced.push({
1417
+ start: sliceStart - start,
1418
+ end: sliceEnd - start,
1419
+ style: span.style
1420
+ });
1421
+ }
1422
+ return mergeStyleSpans(sliced);
1423
+ }
1424
+ function sliceLinkSpans(spans, start, end) {
1425
+ if (spans.length === 0) return [];
1426
+ const sliced = [];
1427
+ for (const span of spans) {
1428
+ const sliceStart = Math.max(span.start, start);
1429
+ const sliceEnd = Math.min(span.end, end);
1430
+ if (sliceEnd > sliceStart) sliced.push({
1431
+ start: sliceStart - start,
1432
+ end: sliceEnd - start,
1433
+ href: span.href
1434
+ });
1435
+ }
1436
+ return sliced;
1437
+ }
1438
+ function markdownToIR(markdown, options = {}) {
1439
+ return markdownToIRWithMeta(markdown, options).ir;
1440
+ }
1441
+ function markdownToIRWithMeta(markdown, options = {}) {
1442
+ const env = { listStack: [] };
1443
+ const tokens = createMarkdownIt(options).parse(markdown ?? "", env);
1444
+ if (options.enableSpoilers) applySpoilerTokens(tokens);
1445
+ const tableMode = options.tableMode ?? "off";
1446
+ const state = {
1447
+ text: "",
1448
+ styles: [],
1449
+ openStyles: [],
1450
+ links: [],
1451
+ linkStack: [],
1452
+ env,
1453
+ headingStyle: options.headingStyle ?? "none",
1454
+ blockquotePrefix: options.blockquotePrefix ?? "",
1455
+ enableSpoilers: options.enableSpoilers ?? false,
1456
+ tableMode,
1457
+ table: null,
1458
+ hasTables: false
1459
+ };
1460
+ renderTokens(tokens, state);
1461
+ closeRemainingStyles(state);
1462
+ const trimmedLength = state.text.trimEnd().length;
1463
+ let codeBlockEnd = 0;
1464
+ for (const span of state.styles) {
1465
+ if (span.style !== "code_block") continue;
1466
+ if (span.end > codeBlockEnd) codeBlockEnd = span.end;
1467
+ }
1468
+ const finalLength = Math.max(trimmedLength, codeBlockEnd);
1469
+ return {
1470
+ ir: {
1471
+ text: finalLength === state.text.length ? state.text : state.text.slice(0, finalLength),
1472
+ styles: mergeStyleSpans(clampStyleSpans(state.styles, finalLength)),
1473
+ links: clampLinkSpans(state.links, finalLength)
1474
+ },
1475
+ hasTables: state.hasTables
1476
+ };
1477
+ }
1478
+ function chunkMarkdownIR(ir, limit) {
1479
+ if (!ir.text) return [];
1480
+ if (limit <= 0 || ir.text.length <= limit) return [ir];
1481
+ const chunks = chunkText(ir.text, limit);
1482
+ const results = [];
1483
+ let cursor = 0;
1484
+ chunks.forEach((chunk, index) => {
1485
+ if (!chunk) return;
1486
+ if (index > 0) while (cursor < ir.text.length && /\s/.test(ir.text[cursor] ?? "")) cursor += 1;
1487
+ const start = cursor;
1488
+ const end = Math.min(ir.text.length, start + chunk.length);
1489
+ results.push({
1490
+ text: chunk,
1491
+ styles: sliceStyleSpans(ir.styles, start, end),
1492
+ links: sliceLinkSpans(ir.links, start, end)
1493
+ });
1494
+ cursor = end;
1495
+ });
1496
+ return results;
1497
+ }
1498
+
1499
+ //#endregion
1500
+ //#region src/signal/client.ts
1501
+ const DEFAULT_TIMEOUT_MS = 1e4;
1502
+ function normalizeBaseUrl(url) {
1503
+ const trimmed = url.trim();
1504
+ if (!trimmed) throw new Error("Signal base URL is required");
1505
+ if (/^https?:\/\//i.test(trimmed)) return trimmed.replace(/\/+$/, "");
1506
+ return `http://${trimmed}`.replace(/\/+$/, "");
1507
+ }
1508
+ async function fetchWithTimeout(url, init, timeoutMs) {
1509
+ const fetchImpl = resolveFetch();
1510
+ if (!fetchImpl) throw new Error("fetch is not available");
1511
+ const controller = new AbortController();
1512
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
1513
+ try {
1514
+ return await fetchImpl(url, {
1515
+ ...init,
1516
+ signal: controller.signal
1517
+ });
1518
+ } finally {
1519
+ clearTimeout(timer);
1520
+ }
1521
+ }
1522
+ async function signalRpcRequest(method, params, opts) {
1523
+ const baseUrl = normalizeBaseUrl(opts.baseUrl);
1524
+ const id = randomUUID();
1525
+ const body = JSON.stringify({
1526
+ jsonrpc: "2.0",
1527
+ method,
1528
+ params,
1529
+ id
1530
+ });
1531
+ const res = await fetchWithTimeout(`${baseUrl}/api/v1/rpc`, {
1532
+ method: "POST",
1533
+ headers: { "Content-Type": "application/json" },
1534
+ body
1535
+ }, opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);
1536
+ if (res.status === 201) return;
1537
+ const text = await res.text();
1538
+ if (!text) throw new Error(`Signal RPC empty response (status ${res.status})`);
1539
+ const parsed = JSON.parse(text);
1540
+ if (parsed.error) {
1541
+ const code = parsed.error.code ?? "unknown";
1542
+ const msg = parsed.error.message ?? "Signal RPC error";
1543
+ throw new Error(`Signal RPC ${code}: ${msg}`);
1544
+ }
1545
+ return parsed.result;
1546
+ }
1547
+ async function signalCheck(baseUrl, timeoutMs = DEFAULT_TIMEOUT_MS) {
1548
+ const normalized = normalizeBaseUrl(baseUrl);
1549
+ try {
1550
+ const res = await fetchWithTimeout(`${normalized}/api/v1/check`, { method: "GET" }, timeoutMs);
1551
+ if (!res.ok) return {
1552
+ ok: false,
1553
+ status: res.status,
1554
+ error: `HTTP ${res.status}`
1555
+ };
1556
+ return {
1557
+ ok: true,
1558
+ status: res.status,
1559
+ error: null
1560
+ };
1561
+ } catch (err) {
1562
+ return {
1563
+ ok: false,
1564
+ status: null,
1565
+ error: err instanceof Error ? err.message : String(err)
1566
+ };
1567
+ }
1568
+ }
1569
+ async function streamSignalEvents(params) {
1570
+ const baseUrl = normalizeBaseUrl(params.baseUrl);
1571
+ const url = new URL(`${baseUrl}/api/v1/events`);
1572
+ if (params.account) url.searchParams.set("account", params.account);
1573
+ const fetchImpl = resolveFetch();
1574
+ if (!fetchImpl) throw new Error("fetch is not available");
1575
+ const res = await fetchImpl(url, {
1576
+ method: "GET",
1577
+ headers: { Accept: "text/event-stream" },
1578
+ signal: params.abortSignal
1579
+ });
1580
+ if (!res.ok || !res.body) throw new Error(`Signal SSE failed (${res.status} ${res.statusText || "error"})`);
1581
+ const reader = res.body.getReader();
1582
+ const decoder = new TextDecoder();
1583
+ let buffer = "";
1584
+ let currentEvent = {};
1585
+ const flushEvent = () => {
1586
+ if (!currentEvent.data && !currentEvent.event && !currentEvent.id) return;
1587
+ params.onEvent({
1588
+ event: currentEvent.event,
1589
+ data: currentEvent.data,
1590
+ id: currentEvent.id
1591
+ });
1592
+ currentEvent = {};
1593
+ };
1594
+ while (true) {
1595
+ const { value, done } = await reader.read();
1596
+ if (done) break;
1597
+ buffer += decoder.decode(value, { stream: true });
1598
+ let lineEnd = buffer.indexOf("\n");
1599
+ while (lineEnd !== -1) {
1600
+ let line = buffer.slice(0, lineEnd);
1601
+ buffer = buffer.slice(lineEnd + 1);
1602
+ if (line.endsWith("\r")) line = line.slice(0, -1);
1603
+ if (line === "") {
1604
+ flushEvent();
1605
+ lineEnd = buffer.indexOf("\n");
1606
+ continue;
1607
+ }
1608
+ if (line.startsWith(":")) {
1609
+ lineEnd = buffer.indexOf("\n");
1610
+ continue;
1611
+ }
1612
+ const [rawField, ...rest] = line.split(":");
1613
+ const field = rawField.trim();
1614
+ const rawValue = rest.join(":");
1615
+ const value = rawValue.startsWith(" ") ? rawValue.slice(1) : rawValue;
1616
+ if (field === "event") currentEvent.event = value;
1617
+ else if (field === "data") currentEvent.data = currentEvent.data ? `${currentEvent.data}\n${value}` : value;
1618
+ else if (field === "id") currentEvent.id = value;
1619
+ lineEnd = buffer.indexOf("\n");
1620
+ }
1621
+ }
1622
+ flushEvent();
1623
+ }
1624
+
1625
+ //#endregion
1626
+ //#region src/signal/format.ts
1627
+ function mapStyle(style) {
1628
+ switch (style) {
1629
+ case "bold": return "BOLD";
1630
+ case "italic": return "ITALIC";
1631
+ case "strikethrough": return "STRIKETHROUGH";
1632
+ case "code":
1633
+ case "code_block": return "MONOSPACE";
1634
+ case "spoiler": return "SPOILER";
1635
+ default: return null;
1636
+ }
1637
+ }
1638
+ function mergeStyles(styles) {
1639
+ const sorted = [...styles].toSorted((a, b) => {
1640
+ if (a.start !== b.start) return a.start - b.start;
1641
+ if (a.length !== b.length) return a.length - b.length;
1642
+ return a.style.localeCompare(b.style);
1643
+ });
1644
+ const merged = [];
1645
+ for (const style of sorted) {
1646
+ const prev = merged[merged.length - 1];
1647
+ if (prev && prev.style === style.style && style.start <= prev.start + prev.length) {
1648
+ const prevEnd = prev.start + prev.length;
1649
+ prev.length = Math.max(prevEnd, style.start + style.length) - prev.start;
1650
+ continue;
1651
+ }
1652
+ merged.push({ ...style });
1653
+ }
1654
+ return merged;
1655
+ }
1656
+ function clampStyles(styles, maxLength) {
1657
+ const clamped = [];
1658
+ for (const style of styles) {
1659
+ const start = Math.max(0, Math.min(style.start, maxLength));
1660
+ const length = Math.min(style.start + style.length, maxLength) - start;
1661
+ if (length > 0) clamped.push({
1662
+ start,
1663
+ length,
1664
+ style: style.style
1665
+ });
1666
+ }
1667
+ return clamped;
1668
+ }
1669
+ function applyInsertionsToStyles(spans, insertions) {
1670
+ if (insertions.length === 0) return spans;
1671
+ const sortedInsertions = [...insertions].toSorted((a, b) => a.pos - b.pos);
1672
+ let updated = spans;
1673
+ for (const insertion of sortedInsertions) {
1674
+ const next = [];
1675
+ for (const span of updated) {
1676
+ if (span.end <= insertion.pos) {
1677
+ next.push(span);
1678
+ continue;
1679
+ }
1680
+ if (span.start >= insertion.pos) {
1681
+ next.push({
1682
+ start: span.start + insertion.length,
1683
+ end: span.end + insertion.length,
1684
+ style: span.style
1685
+ });
1686
+ continue;
1687
+ }
1688
+ if (span.start < insertion.pos && span.end > insertion.pos) {
1689
+ if (insertion.pos > span.start) next.push({
1690
+ start: span.start,
1691
+ end: insertion.pos,
1692
+ style: span.style
1693
+ });
1694
+ const shiftedStart = insertion.pos + insertion.length;
1695
+ const shiftedEnd = span.end + insertion.length;
1696
+ if (shiftedEnd > shiftedStart) next.push({
1697
+ start: shiftedStart,
1698
+ end: shiftedEnd,
1699
+ style: span.style
1700
+ });
1701
+ }
1702
+ }
1703
+ updated = next;
1704
+ }
1705
+ return updated;
1706
+ }
1707
+ function renderSignalText(ir) {
1708
+ const text = ir.text ?? "";
1709
+ if (!text) return {
1710
+ text: "",
1711
+ styles: []
1712
+ };
1713
+ const sortedLinks = [...ir.links].toSorted((a, b) => a.start - b.start);
1714
+ let out = "";
1715
+ let cursor = 0;
1716
+ const insertions = [];
1717
+ for (const link of sortedLinks) {
1718
+ if (link.start < cursor) continue;
1719
+ out += text.slice(cursor, link.end);
1720
+ const href = link.href.trim();
1721
+ const trimmedLabel = text.slice(link.start, link.end).trim();
1722
+ const comparableHref = href.startsWith("mailto:") ? href.slice(7) : href;
1723
+ if (href) {
1724
+ if (!trimmedLabel) {
1725
+ out += href;
1726
+ insertions.push({
1727
+ pos: link.end,
1728
+ length: href.length
1729
+ });
1730
+ } else if (trimmedLabel !== href && trimmedLabel !== comparableHref) {
1731
+ const addition = ` (${href})`;
1732
+ out += addition;
1733
+ insertions.push({
1734
+ pos: link.end,
1735
+ length: addition.length
1736
+ });
1737
+ }
1738
+ }
1739
+ cursor = link.end;
1740
+ }
1741
+ out += text.slice(cursor);
1742
+ const adjusted = applyInsertionsToStyles(ir.styles.map((span) => {
1743
+ const mapped = mapStyle(span.style);
1744
+ if (!mapped) return null;
1745
+ return {
1746
+ start: span.start,
1747
+ end: span.end,
1748
+ style: mapped
1749
+ };
1750
+ }).filter((span) => span !== null), insertions);
1751
+ const trimmedText = out.trimEnd();
1752
+ const trimmedLength = trimmedText.length;
1753
+ return {
1754
+ text: trimmedText,
1755
+ styles: mergeStyles(clampStyles(adjusted.map((span) => ({
1756
+ start: span.start,
1757
+ length: span.end - span.start,
1758
+ style: span.style
1759
+ })), trimmedLength))
1760
+ };
1761
+ }
1762
+ function markdownToSignalText(markdown, options = {}) {
1763
+ return renderSignalText(markdownToIR(markdown ?? "", {
1764
+ linkify: true,
1765
+ enableSpoilers: true,
1766
+ headingStyle: "none",
1767
+ blockquotePrefix: "",
1768
+ tableMode: options.tableMode
1769
+ }));
1770
+ }
1771
+ function markdownToSignalTextChunks(markdown, limit, options = {}) {
1772
+ return chunkMarkdownIR(markdownToIR(markdown ?? "", {
1773
+ linkify: true,
1774
+ enableSpoilers: true,
1775
+ headingStyle: "none",
1776
+ blockquotePrefix: "",
1777
+ tableMode: options.tableMode
1778
+ }), limit).map((chunk) => renderSignalText(chunk));
1779
+ }
1780
+
1781
+ //#endregion
1782
+ //#region src/signal/send.ts
1783
+ function parseTarget(raw) {
1784
+ let value = raw.trim();
1785
+ if (!value) throw new Error("Signal recipient is required");
1786
+ if (value.toLowerCase().startsWith("signal:")) value = value.slice(7).trim();
1787
+ const normalized = value.toLowerCase();
1788
+ if (normalized.startsWith("group:")) return {
1789
+ type: "group",
1790
+ groupId: value.slice(6).trim()
1791
+ };
1792
+ if (normalized.startsWith("username:")) return {
1793
+ type: "username",
1794
+ username: value.slice(9).trim()
1795
+ };
1796
+ if (normalized.startsWith("u:")) return {
1797
+ type: "username",
1798
+ username: value.trim()
1799
+ };
1800
+ return {
1801
+ type: "recipient",
1802
+ recipient: value
1803
+ };
1804
+ }
1805
+ function buildTargetParams(target, allow) {
1806
+ if (target.type === "recipient") {
1807
+ if (!allow.recipient) return null;
1808
+ return { recipient: [target.recipient] };
1809
+ }
1810
+ if (target.type === "group") {
1811
+ if (!allow.group) return null;
1812
+ return { groupId: target.groupId };
1813
+ }
1814
+ if (target.type === "username") {
1815
+ if (!allow.username) return null;
1816
+ return { username: [target.username] };
1817
+ }
1818
+ return null;
1819
+ }
1820
+ function resolveSignalRpcContext(opts, accountInfo) {
1821
+ const hasBaseUrl = Boolean(opts.baseUrl?.trim());
1822
+ const hasAccount = Boolean(opts.account?.trim());
1823
+ const resolvedAccount = accountInfo || (!hasBaseUrl || !hasAccount ? resolveSignalAccount({
1824
+ cfg: loadConfig(),
1825
+ accountId: opts.accountId
1826
+ }) : void 0);
1827
+ const baseUrl = opts.baseUrl?.trim() || resolvedAccount?.baseUrl;
1828
+ if (!baseUrl) throw new Error("Signal base URL is required");
1829
+ return {
1830
+ baseUrl,
1831
+ account: opts.account?.trim() || resolvedAccount?.config.account?.trim()
1832
+ };
1833
+ }
1834
+ async function resolveAttachment(mediaUrl, maxBytes) {
1835
+ const media = await loadWebMedia(mediaUrl, maxBytes);
1836
+ const saved = await saveMediaBuffer(media.buffer, media.contentType ?? void 0, "outbound", maxBytes);
1837
+ return {
1838
+ path: saved.path,
1839
+ contentType: saved.contentType
1840
+ };
1841
+ }
1842
+ async function sendMessageSignal(to, text, opts = {}) {
1843
+ const cfg = loadConfig();
1844
+ const accountInfo = resolveSignalAccount({
1845
+ cfg,
1846
+ accountId: opts.accountId
1847
+ });
1848
+ const { baseUrl, account } = resolveSignalRpcContext(opts, accountInfo);
1849
+ const target = parseTarget(to);
1850
+ let message = text ?? "";
1851
+ let messageFromPlaceholder = false;
1852
+ let textStyles = [];
1853
+ const textMode = opts.textMode ?? "markdown";
1854
+ const maxBytes = (() => {
1855
+ if (typeof opts.maxBytes === "number") return opts.maxBytes;
1856
+ if (typeof accountInfo.config.mediaMaxMb === "number") return accountInfo.config.mediaMaxMb * 1024 * 1024;
1857
+ if (typeof cfg.agents?.defaults?.mediaMaxMb === "number") return cfg.agents.defaults.mediaMaxMb * 1024 * 1024;
1858
+ return 8 * 1024 * 1024;
1859
+ })();
1860
+ let attachments;
1861
+ if (opts.mediaUrl?.trim()) {
1862
+ const resolved = await resolveAttachment(opts.mediaUrl.trim(), maxBytes);
1863
+ attachments = [resolved.path];
1864
+ const kind = mediaKindFromMime(resolved.contentType ?? void 0);
1865
+ if (!message && kind) {
1866
+ message = kind === "image" ? "<media:image>" : `<media:${kind}>`;
1867
+ messageFromPlaceholder = true;
1868
+ }
1869
+ }
1870
+ if (message.trim() && !messageFromPlaceholder) if (textMode === "plain") textStyles = opts.textStyles ?? [];
1871
+ else {
1872
+ const tableMode = resolveMarkdownTableMode({
1873
+ cfg,
1874
+ channel: "signal",
1875
+ accountId: accountInfo.accountId
1876
+ });
1877
+ const formatted = markdownToSignalText(message, { tableMode });
1878
+ message = formatted.text;
1879
+ textStyles = formatted.styles;
1880
+ }
1881
+ if (!message.trim() && (!attachments || attachments.length === 0)) throw new Error("Signal send requires text or media");
1882
+ const params = { message };
1883
+ if (textStyles.length > 0) params["text-style"] = textStyles.map((style) => `${style.start}:${style.length}:${style.style}`);
1884
+ if (account) params.account = account;
1885
+ if (attachments && attachments.length > 0) params.attachments = attachments;
1886
+ const targetParams = buildTargetParams(target, {
1887
+ recipient: true,
1888
+ group: true,
1889
+ username: true
1890
+ });
1891
+ if (!targetParams) throw new Error("Signal recipient is required");
1892
+ Object.assign(params, targetParams);
1893
+ const timestamp = (await signalRpcRequest("send", params, {
1894
+ baseUrl,
1895
+ timeoutMs: opts.timeoutMs
1896
+ }))?.timestamp;
1897
+ return {
1898
+ messageId: timestamp ? String(timestamp) : "unknown",
1899
+ timestamp
1900
+ };
1901
+ }
1902
+ async function sendTypingSignal(to, opts = {}) {
1903
+ const { baseUrl, account } = resolveSignalRpcContext(opts);
1904
+ const targetParams = buildTargetParams(parseTarget(to), {
1905
+ recipient: true,
1906
+ group: true
1907
+ });
1908
+ if (!targetParams) return false;
1909
+ const params = { ...targetParams };
1910
+ if (account) params.account = account;
1911
+ if (opts.stop) params.stop = true;
1912
+ await signalRpcRequest("sendTyping", params, {
1913
+ baseUrl,
1914
+ timeoutMs: opts.timeoutMs
1915
+ });
1916
+ return true;
1917
+ }
1918
+ async function sendReadReceiptSignal(to, targetTimestamp, opts = {}) {
1919
+ if (!Number.isFinite(targetTimestamp) || targetTimestamp <= 0) return false;
1920
+ const { baseUrl, account } = resolveSignalRpcContext(opts);
1921
+ const targetParams = buildTargetParams(parseTarget(to), { recipient: true });
1922
+ if (!targetParams) return false;
1923
+ const params = {
1924
+ ...targetParams,
1925
+ targetTimestamp,
1926
+ type: opts.type ?? "read"
1927
+ };
1928
+ if (account) params.account = account;
1929
+ await signalRpcRequest("sendReceipt", params, {
1930
+ baseUrl,
1931
+ timeoutMs: opts.timeoutMs
1932
+ });
1933
+ return true;
1934
+ }
1935
+
1936
+ //#endregion
1937
+ //#region src/utils/directive-tags.ts
1938
+ const AUDIO_TAG_RE = /\[\[\s*audio_as_voice\s*\]\]/gi;
1939
+ const REPLY_TAG_RE = /\[\[\s*(?:reply_to_current|reply_to\s*:\s*([^\]\n]+))\s*\]\]/gi;
1940
+ function normalizeDirectiveWhitespace(text) {
1941
+ return text.replace(/[ \t]+/g, " ").replace(/[ \t]*\n[ \t]*/g, "\n").trim();
1942
+ }
1943
+ function parseInlineDirectives(text, options = {}) {
1944
+ const { currentMessageId, stripAudioTag = true, stripReplyTags = true } = options;
1945
+ if (!text) return {
1946
+ text: "",
1947
+ audioAsVoice: false,
1948
+ replyToCurrent: false,
1949
+ hasAudioTag: false,
1950
+ hasReplyTag: false
1951
+ };
1952
+ let cleaned = text;
1953
+ let audioAsVoice = false;
1954
+ let hasAudioTag = false;
1955
+ let hasReplyTag = false;
1956
+ let sawCurrent = false;
1957
+ let lastExplicitId;
1958
+ cleaned = cleaned.replace(AUDIO_TAG_RE, (match) => {
1959
+ audioAsVoice = true;
1960
+ hasAudioTag = true;
1961
+ return stripAudioTag ? " " : match;
1962
+ });
1963
+ cleaned = cleaned.replace(REPLY_TAG_RE, (match, idRaw) => {
1964
+ hasReplyTag = true;
1965
+ if (idRaw === void 0) sawCurrent = true;
1966
+ else {
1967
+ const id = idRaw.trim();
1968
+ if (id) lastExplicitId = id;
1969
+ }
1970
+ return stripReplyTags ? " " : match;
1971
+ });
1972
+ cleaned = normalizeDirectiveWhitespace(cleaned);
1973
+ const replyToId = lastExplicitId ?? (sawCurrent ? currentMessageId?.trim() || void 0 : void 0);
1974
+ return {
1975
+ text: cleaned,
1976
+ audioAsVoice,
1977
+ replyToId,
1978
+ replyToExplicitId: lastExplicitId,
1979
+ replyToCurrent: sawCurrent,
1980
+ hasAudioTag,
1981
+ hasReplyTag
1982
+ };
1983
+ }
1984
+
1985
+ //#endregion
1986
+ //#region src/media/audio-tags.ts
1987
+ /**
1988
+ * Extract audio mode tag from text.
1989
+ * Supports [[audio_as_voice]] to send audio as voice bubble instead of file.
1990
+ * Default is file (preserves backward compatibility).
1991
+ */
1992
+ function parseAudioTag(text) {
1993
+ const result = parseInlineDirectives(text, { stripReplyTags: false });
1994
+ return {
1995
+ text: result.text,
1996
+ audioAsVoice: result.audioAsVoice,
1997
+ hadTag: result.hasAudioTag
1998
+ };
1999
+ }
2000
+
2001
+ //#endregion
2002
+ //#region src/media/parse.ts
2003
+ const MEDIA_TOKEN_RE = /\bMEDIA:\s*`?([^\n]+)`?/gi;
2004
+ function normalizeMediaSource(src) {
2005
+ return src.startsWith("file://") ? src.replace("file://", "") : src;
2006
+ }
2007
+ function cleanCandidate(raw) {
2008
+ return raw.replace(/^[`"'[{(]+/, "").replace(/[`"'\\})\],]+$/, "");
2009
+ }
2010
+ function isValidMedia(candidate, opts) {
2011
+ if (!candidate) return false;
2012
+ if (candidate.length > 4096) return false;
2013
+ if (!opts?.allowSpaces && /\s/.test(candidate)) return false;
2014
+ if (/^https?:\/\//i.test(candidate)) return true;
2015
+ return candidate.startsWith("./") && !candidate.includes("..");
2016
+ }
2017
+ function unwrapQuoted(value) {
2018
+ const trimmed = value.trim();
2019
+ if (trimmed.length < 2) return;
2020
+ const first = trimmed[0];
2021
+ if (first !== trimmed[trimmed.length - 1]) return;
2022
+ if (first !== `"` && first !== "'" && first !== "`") return;
2023
+ return trimmed.slice(1, -1).trim();
2024
+ }
2025
+ function isInsideFence(fenceSpans, offset) {
2026
+ return fenceSpans.some((span) => offset >= span.start && offset < span.end);
2027
+ }
2028
+ function splitMediaFromOutput(raw) {
2029
+ const trimmedRaw = raw.trimEnd();
2030
+ if (!trimmedRaw.trim()) return { text: "" };
2031
+ const media = [];
2032
+ let foundMediaToken = false;
2033
+ const fenceSpans = parseFenceSpans(trimmedRaw);
2034
+ const lines = trimmedRaw.split("\n");
2035
+ const keptLines = [];
2036
+ let lineOffset = 0;
2037
+ for (const line of lines) {
2038
+ if (isInsideFence(fenceSpans, lineOffset)) {
2039
+ keptLines.push(line);
2040
+ lineOffset += line.length + 1;
2041
+ continue;
2042
+ }
2043
+ if (!line.trimStart().startsWith("MEDIA:")) {
2044
+ keptLines.push(line);
2045
+ lineOffset += line.length + 1;
2046
+ continue;
2047
+ }
2048
+ const matches = Array.from(line.matchAll(MEDIA_TOKEN_RE));
2049
+ if (matches.length === 0) {
2050
+ keptLines.push(line);
2051
+ lineOffset += line.length + 1;
2052
+ continue;
2053
+ }
2054
+ const pieces = [];
2055
+ let cursor = 0;
2056
+ for (const match of matches) {
2057
+ const start = match.index ?? 0;
2058
+ pieces.push(line.slice(cursor, start));
2059
+ const payload = match[1];
2060
+ const unwrapped = unwrapQuoted(payload);
2061
+ const payloadValue = unwrapped ?? payload;
2062
+ const parts = unwrapped ? [unwrapped] : payload.split(/\s+/).filter(Boolean);
2063
+ const mediaStartIndex = media.length;
2064
+ let validCount = 0;
2065
+ const invalidParts = [];
2066
+ let hasValidMedia = false;
2067
+ for (const part of parts) {
2068
+ const candidate = normalizeMediaSource(cleanCandidate(part));
2069
+ if (isValidMedia(candidate, unwrapped ? { allowSpaces: true } : void 0)) {
2070
+ media.push(candidate);
2071
+ hasValidMedia = true;
2072
+ foundMediaToken = true;
2073
+ validCount += 1;
2074
+ } else invalidParts.push(part);
2075
+ }
2076
+ const trimmedPayload = payloadValue.trim();
2077
+ const looksLikeLocalPath = trimmedPayload.startsWith("/") || trimmedPayload.startsWith("./") || trimmedPayload.startsWith("../") || trimmedPayload.startsWith("~") || trimmedPayload.startsWith("file://");
2078
+ if (!unwrapped && validCount === 1 && invalidParts.length > 0 && /\s/.test(payloadValue) && looksLikeLocalPath) {
2079
+ const fallback = normalizeMediaSource(cleanCandidate(payloadValue));
2080
+ if (isValidMedia(fallback, { allowSpaces: true })) {
2081
+ media.splice(mediaStartIndex, media.length - mediaStartIndex, fallback);
2082
+ hasValidMedia = true;
2083
+ foundMediaToken = true;
2084
+ validCount = 1;
2085
+ invalidParts.length = 0;
2086
+ }
2087
+ }
2088
+ if (!hasValidMedia) {
2089
+ const fallback = normalizeMediaSource(cleanCandidate(payloadValue));
2090
+ if (isValidMedia(fallback, { allowSpaces: true })) {
2091
+ media.push(fallback);
2092
+ hasValidMedia = true;
2093
+ foundMediaToken = true;
2094
+ invalidParts.length = 0;
2095
+ }
2096
+ }
2097
+ if (hasValidMedia) {
2098
+ if (invalidParts.length > 0) pieces.push(invalidParts.join(" "));
2099
+ } else pieces.push(match[0]);
2100
+ cursor = start + match[0].length;
2101
+ }
2102
+ pieces.push(line.slice(cursor));
2103
+ const cleanedLine = pieces.join("").replace(/[ \t]{2,}/g, " ").trim();
2104
+ if (cleanedLine) keptLines.push(cleanedLine);
2105
+ lineOffset += line.length + 1;
2106
+ }
2107
+ let cleanedText = keptLines.join("\n").replace(/[ \t]+\n/g, "\n").replace(/[ \t]{2,}/g, " ").replace(/\n{2,}/g, "\n").trim();
2108
+ const audioTagResult = parseAudioTag(cleanedText);
2109
+ const hasAudioAsVoice = audioTagResult.audioAsVoice;
2110
+ if (audioTagResult.hadTag) cleanedText = audioTagResult.text.replace(/\n{2,}/g, "\n").trim();
2111
+ if (media.length === 0) {
2112
+ const result = { text: foundMediaToken || hasAudioAsVoice ? cleanedText : trimmedRaw };
2113
+ if (hasAudioAsVoice) result.audioAsVoice = true;
2114
+ return result;
2115
+ }
2116
+ return {
2117
+ text: cleanedText,
2118
+ mediaUrls: media,
2119
+ mediaUrl: media[0],
2120
+ ...hasAudioAsVoice ? { audioAsVoice: true } : {}
2121
+ };
2122
+ }
2123
+
2124
+ //#endregion
2125
+ //#region src/auto-reply/reply/reply-directives.ts
2126
+ function parseReplyDirectives(raw, options = {}) {
2127
+ const split = splitMediaFromOutput(raw);
2128
+ let text = split.text ?? "";
2129
+ const replyParsed = parseInlineDirectives(text, {
2130
+ currentMessageId: options.currentMessageId,
2131
+ stripAudioTag: false,
2132
+ stripReplyTags: true
2133
+ });
2134
+ if (replyParsed.hasReplyTag) text = replyParsed.text;
2135
+ const silentToken = options.silentToken ?? SILENT_REPLY_TOKEN;
2136
+ const isSilent = isSilentReplyText(text, silentToken);
2137
+ if (isSilent) text = "";
2138
+ return {
2139
+ text,
2140
+ mediaUrls: split.mediaUrls,
2141
+ mediaUrl: split.mediaUrl,
2142
+ replyToId: replyParsed.replyToId,
2143
+ replyToCurrent: replyParsed.replyToCurrent,
2144
+ replyToTag: replyParsed.hasReplyTag,
2145
+ audioAsVoice: split.audioAsVoice,
2146
+ isSilent
2147
+ };
2148
+ }
2149
+
2150
+ //#endregion
2151
+ //#region src/infra/outbound/target-normalization.ts
2152
+ function normalizeChannelTargetInput(raw) {
2153
+ return raw.trim();
2154
+ }
2155
+ function normalizeTargetForProvider(provider, raw) {
2156
+ if (!raw) return;
2157
+ const providerId = normalizeChannelId(provider);
2158
+ return ((providerId ? getChannelPlugin(providerId) : void 0)?.messaging?.normalizeTarget?.(raw) ?? (raw.trim().toLowerCase() || void 0)) || void 0;
2159
+ }
2160
+ function buildTargetResolverSignature(channel) {
2161
+ const resolver = getChannelPlugin(channel)?.messaging?.targetResolver;
2162
+ const hint = resolver?.hint ?? "";
2163
+ const looksLike = resolver?.looksLikeId;
2164
+ return hashSignature(`${hint}|${looksLike ? looksLike.toString() : ""}`);
2165
+ }
2166
+ function hashSignature(value) {
2167
+ let hash = 5381;
2168
+ for (let i = 0; i < value.length; i += 1) hash = (hash << 5) + hash ^ value.charCodeAt(i);
2169
+ return (hash >>> 0).toString(36);
2170
+ }
2171
+
2172
+ //#endregion
2173
+ //#region src/channels/plugins/outbound/load.ts
2174
+ const cache = /* @__PURE__ */ new Map();
2175
+ let lastRegistry = null;
2176
+ function ensureCacheForRegistry(registry) {
2177
+ if (registry === lastRegistry) return;
2178
+ cache.clear();
2179
+ lastRegistry = registry;
2180
+ }
2181
+ async function loadChannelOutboundAdapter(id) {
2182
+ const registry = getActivePluginRegistry();
2183
+ ensureCacheForRegistry(registry);
2184
+ const cached = cache.get(id);
2185
+ if (cached) return cached;
2186
+ const outbound = (registry?.channels.find((entry) => entry.plugin.id === id))?.plugin.outbound;
2187
+ if (outbound) {
2188
+ cache.set(id, outbound);
2189
+ return outbound;
2190
+ }
2191
+ }
2192
+
2193
+ //#endregion
2194
+ //#region src/auto-reply/reply/reply-tags.ts
2195
+ function extractReplyToTag(text, currentMessageId) {
2196
+ const result = parseInlineDirectives(text, {
2197
+ currentMessageId,
2198
+ stripAudioTag: false
2199
+ });
2200
+ return {
2201
+ cleaned: result.text,
2202
+ replyToId: result.replyToId,
2203
+ replyToCurrent: result.replyToCurrent,
2204
+ hasTag: result.hasReplyTag
2205
+ };
2206
+ }
2207
+
2208
+ //#endregion
2209
+ //#region src/auto-reply/reply/reply-threading.ts
2210
+ function resolveReplyToMode(cfg, channel, accountId, chatType) {
2211
+ const provider = normalizeChannelId(channel);
2212
+ if (!provider) return "all";
2213
+ return getChannelDock(provider)?.threading?.resolveReplyToMode?.({
2214
+ cfg,
2215
+ accountId,
2216
+ chatType
2217
+ }) ?? "all";
2218
+ }
2219
+ function createReplyToModeFilter(mode, opts = {}) {
2220
+ let hasThreaded = false;
2221
+ return (payload) => {
2222
+ if (!payload.replyToId) return payload;
2223
+ if (mode === "off") {
2224
+ if (opts.allowTagsWhenOff && payload.replyToTag) return payload;
2225
+ return {
2226
+ ...payload,
2227
+ replyToId: void 0
2228
+ };
2229
+ }
2230
+ if (mode === "all") return payload;
2231
+ if (hasThreaded) return {
2232
+ ...payload,
2233
+ replyToId: void 0
2234
+ };
2235
+ hasThreaded = true;
2236
+ return payload;
2237
+ };
2238
+ }
2239
+ function createReplyToModeFilterForChannel(mode, channel) {
2240
+ const provider = normalizeChannelId(channel);
2241
+ return createReplyToModeFilter(mode, { allowTagsWhenOff: provider ? Boolean(getChannelDock(provider)?.threading?.allowTagsWhenOff) : false });
2242
+ }
2243
+
2244
+ //#endregion
2245
+ //#region src/auto-reply/reply/reply-payloads.ts
2246
+ function applyReplyTagsToPayload(payload, currentMessageId) {
2247
+ if (typeof payload.text !== "string") {
2248
+ if (!payload.replyToCurrent || payload.replyToId) return payload;
2249
+ return {
2250
+ ...payload,
2251
+ replyToId: currentMessageId?.trim() || void 0
2252
+ };
2253
+ }
2254
+ if (!payload.text.includes("[[")) {
2255
+ if (!payload.replyToCurrent || payload.replyToId) return payload;
2256
+ return {
2257
+ ...payload,
2258
+ replyToId: currentMessageId?.trim() || void 0,
2259
+ replyToTag: payload.replyToTag ?? true
2260
+ };
2261
+ }
2262
+ const { cleaned, replyToId, replyToCurrent, hasTag } = extractReplyToTag(payload.text, currentMessageId);
2263
+ return {
2264
+ ...payload,
2265
+ text: cleaned ? cleaned : void 0,
2266
+ replyToId: replyToId ?? payload.replyToId,
2267
+ replyToTag: hasTag || payload.replyToTag,
2268
+ replyToCurrent: replyToCurrent || payload.replyToCurrent
2269
+ };
2270
+ }
2271
+ function isRenderablePayload(payload) {
2272
+ return Boolean(payload.text || payload.mediaUrl || payload.mediaUrls && payload.mediaUrls.length > 0 || payload.audioAsVoice || payload.channelData);
2273
+ }
2274
+ function applyReplyThreading(params) {
2275
+ const { payloads, replyToMode, replyToChannel, currentMessageId } = params;
2276
+ const applyReplyToMode = createReplyToModeFilterForChannel(replyToMode, replyToChannel);
2277
+ return payloads.map((payload) => applyReplyTagsToPayload(payload, currentMessageId)).filter(isRenderablePayload).map(applyReplyToMode);
2278
+ }
2279
+ function filterMessagingToolDuplicates(params) {
2280
+ const { payloads, sentTexts } = params;
2281
+ if (sentTexts.length === 0) return payloads;
2282
+ return payloads.filter((payload) => !isMessagingToolDuplicate(payload.text ?? "", sentTexts));
2283
+ }
2284
+ function normalizeAccountId(value) {
2285
+ const trimmed = value?.trim();
2286
+ return trimmed ? trimmed.toLowerCase() : void 0;
2287
+ }
2288
+ function shouldSuppressMessagingToolReplies(params) {
2289
+ const provider = params.messageProvider?.trim().toLowerCase();
2290
+ if (!provider) return false;
2291
+ const originTarget = normalizeTargetForProvider(provider, params.originatingTo);
2292
+ if (!originTarget) return false;
2293
+ const originAccount = normalizeAccountId(params.accountId);
2294
+ const sentTargets = params.messagingToolSentTargets ?? [];
2295
+ if (sentTargets.length === 0) return false;
2296
+ return sentTargets.some((target) => {
2297
+ if (!target?.provider) return false;
2298
+ if (target.provider.trim().toLowerCase() !== provider) return false;
2299
+ const targetKey = normalizeTargetForProvider(provider, target.to);
2300
+ if (!targetKey) return false;
2301
+ const targetAccount = normalizeAccountId(target.accountId);
2302
+ if (originAccount && targetAccount && originAccount !== targetAccount) return false;
2303
+ return targetKey === originTarget;
2304
+ });
2305
+ }
2306
+
2307
+ //#endregion
2308
+ //#region src/infra/outbound/payloads.ts
2309
+ function mergeMediaUrls(...lists) {
2310
+ const seen = /* @__PURE__ */ new Set();
2311
+ const merged = [];
2312
+ for (const list of lists) {
2313
+ if (!list) continue;
2314
+ for (const entry of list) {
2315
+ const trimmed = entry?.trim();
2316
+ if (!trimmed) continue;
2317
+ if (seen.has(trimmed)) continue;
2318
+ seen.add(trimmed);
2319
+ merged.push(trimmed);
2320
+ }
2321
+ }
2322
+ return merged;
2323
+ }
2324
+ function normalizeReplyPayloadsForDelivery(payloads) {
2325
+ return payloads.flatMap((payload) => {
2326
+ const parsed = parseReplyDirectives(payload.text ?? "");
2327
+ const explicitMediaUrls = payload.mediaUrls ?? parsed.mediaUrls;
2328
+ const explicitMediaUrl = payload.mediaUrl ?? parsed.mediaUrl;
2329
+ const mergedMedia = mergeMediaUrls(explicitMediaUrls, explicitMediaUrl ? [explicitMediaUrl] : void 0);
2330
+ const resolvedMediaUrl = (explicitMediaUrls?.length ?? 0) > 1 ? void 0 : explicitMediaUrl;
2331
+ const next = {
2332
+ ...payload,
2333
+ text: parsed.text ?? "",
2334
+ mediaUrls: mergedMedia.length ? mergedMedia : void 0,
2335
+ mediaUrl: resolvedMediaUrl,
2336
+ replyToId: payload.replyToId ?? parsed.replyToId,
2337
+ replyToTag: payload.replyToTag || parsed.replyToTag,
2338
+ replyToCurrent: payload.replyToCurrent || parsed.replyToCurrent,
2339
+ audioAsVoice: Boolean(payload.audioAsVoice || parsed.audioAsVoice)
2340
+ };
2341
+ if (parsed.isSilent && mergedMedia.length === 0) return [];
2342
+ if (!isRenderablePayload(next)) return [];
2343
+ return [next];
2344
+ });
2345
+ }
2346
+
2347
+ //#endregion
2348
+ //#region src/infra/outbound/deliver.ts
2349
+ var deliver_exports = /* @__PURE__ */ __exportAll({ deliverOutboundPayloads: () => deliverOutboundPayloads });
2350
+ function throwIfAborted(abortSignal) {
2351
+ if (abortSignal?.aborted) throw new Error("Outbound delivery aborted");
2352
+ }
2353
+ async function createChannelHandler(params) {
2354
+ const outbound = await loadChannelOutboundAdapter(params.channel);
2355
+ if (!outbound?.sendText || !outbound?.sendMedia) throw new Error(`Outbound not configured for channel: ${params.channel}`);
2356
+ const handler = createPluginHandler({
2357
+ outbound,
2358
+ cfg: params.cfg,
2359
+ channel: params.channel,
2360
+ to: params.to,
2361
+ accountId: params.accountId,
2362
+ replyToId: params.replyToId,
2363
+ threadId: params.threadId,
2364
+ deps: params.deps,
2365
+ gifPlayback: params.gifPlayback
2366
+ });
2367
+ if (!handler) throw new Error(`Outbound not configured for channel: ${params.channel}`);
2368
+ return handler;
2369
+ }
2370
+ function createPluginHandler(params) {
2371
+ const outbound = params.outbound;
2372
+ if (!outbound?.sendText || !outbound?.sendMedia) return null;
2373
+ const sendText = outbound.sendText;
2374
+ const sendMedia = outbound.sendMedia;
2375
+ return {
2376
+ chunker: outbound.chunker ?? null,
2377
+ chunkerMode: outbound.chunkerMode,
2378
+ textChunkLimit: outbound.textChunkLimit,
2379
+ sendPayload: outbound.sendPayload ? async (payload) => outbound.sendPayload({
2380
+ cfg: params.cfg,
2381
+ to: params.to,
2382
+ text: payload.text ?? "",
2383
+ mediaUrl: payload.mediaUrl,
2384
+ accountId: params.accountId,
2385
+ replyToId: params.replyToId,
2386
+ threadId: params.threadId,
2387
+ gifPlayback: params.gifPlayback,
2388
+ deps: params.deps,
2389
+ payload
2390
+ }) : void 0,
2391
+ sendText: async (text) => sendText({
2392
+ cfg: params.cfg,
2393
+ to: params.to,
2394
+ text,
2395
+ accountId: params.accountId,
2396
+ replyToId: params.replyToId,
2397
+ threadId: params.threadId,
2398
+ gifPlayback: params.gifPlayback,
2399
+ deps: params.deps
2400
+ }),
2401
+ sendMedia: async (caption, mediaUrl) => sendMedia({
2402
+ cfg: params.cfg,
2403
+ to: params.to,
2404
+ text: caption,
2405
+ mediaUrl,
2406
+ accountId: params.accountId,
2407
+ replyToId: params.replyToId,
2408
+ threadId: params.threadId,
2409
+ gifPlayback: params.gifPlayback,
2410
+ deps: params.deps
2411
+ })
2412
+ };
2413
+ }
2414
+ async function deliverOutboundPayloads(params) {
2415
+ const { cfg, channel, to, payloads } = params;
2416
+ const accountId = params.accountId;
2417
+ const deps = params.deps;
2418
+ const abortSignal = params.abortSignal;
2419
+ const sendSignal = params.deps?.sendSignal ?? sendMessageSignal;
2420
+ const results = [];
2421
+ const handler = await createChannelHandler({
2422
+ cfg,
2423
+ channel,
2424
+ to,
2425
+ deps,
2426
+ accountId,
2427
+ replyToId: params.replyToId,
2428
+ threadId: params.threadId,
2429
+ gifPlayback: params.gifPlayback
2430
+ });
2431
+ const textLimit = handler.chunker ? resolveTextChunkLimit(cfg, channel, accountId, { fallbackLimit: handler.textChunkLimit }) : void 0;
2432
+ const chunkMode = handler.chunker ? resolveChunkMode(cfg, channel, accountId) : "length";
2433
+ const isSignalChannel = channel === "signal";
2434
+ const signalTableMode = isSignalChannel ? resolveMarkdownTableMode({
2435
+ cfg,
2436
+ channel: "signal",
2437
+ accountId
2438
+ }) : "code";
2439
+ const signalMaxBytes = isSignalChannel ? resolveChannelMediaMaxBytes({
2440
+ cfg,
2441
+ resolveChannelLimitMb: ({ cfg, accountId }) => cfg.channels?.signal?.accounts?.[accountId]?.mediaMaxMb ?? cfg.channels?.signal?.mediaMaxMb,
2442
+ accountId
2443
+ }) : void 0;
2444
+ const sendTextChunks = async (text) => {
2445
+ throwIfAborted(abortSignal);
2446
+ if (!handler.chunker || textLimit === void 0) {
2447
+ results.push(await handler.sendText(text));
2448
+ return;
2449
+ }
2450
+ if (chunkMode === "newline") {
2451
+ const blockChunks = (handler.chunkerMode ?? "text") === "markdown" ? chunkMarkdownTextWithMode(text, textLimit, "newline") : chunkByParagraph(text, textLimit);
2452
+ if (!blockChunks.length && text) blockChunks.push(text);
2453
+ for (const blockChunk of blockChunks) {
2454
+ const chunks = handler.chunker(blockChunk, textLimit);
2455
+ if (!chunks.length && blockChunk) chunks.push(blockChunk);
2456
+ for (const chunk of chunks) {
2457
+ throwIfAborted(abortSignal);
2458
+ results.push(await handler.sendText(chunk));
2459
+ }
2460
+ }
2461
+ return;
2462
+ }
2463
+ const chunks = handler.chunker(text, textLimit);
2464
+ for (const chunk of chunks) {
2465
+ throwIfAborted(abortSignal);
2466
+ results.push(await handler.sendText(chunk));
2467
+ }
2468
+ };
2469
+ const sendSignalText = async (text, styles) => {
2470
+ throwIfAborted(abortSignal);
2471
+ return {
2472
+ channel: "signal",
2473
+ ...await sendSignal(to, text, {
2474
+ maxBytes: signalMaxBytes,
2475
+ accountId: accountId ?? void 0,
2476
+ textMode: "plain",
2477
+ textStyles: styles
2478
+ })
2479
+ };
2480
+ };
2481
+ const sendSignalTextChunks = async (text) => {
2482
+ throwIfAborted(abortSignal);
2483
+ let signalChunks = textLimit === void 0 ? markdownToSignalTextChunks(text, Number.POSITIVE_INFINITY, { tableMode: signalTableMode }) : markdownToSignalTextChunks(text, textLimit, { tableMode: signalTableMode });
2484
+ if (signalChunks.length === 0 && text) signalChunks = [{
2485
+ text,
2486
+ styles: []
2487
+ }];
2488
+ for (const chunk of signalChunks) {
2489
+ throwIfAborted(abortSignal);
2490
+ results.push(await sendSignalText(chunk.text, chunk.styles));
2491
+ }
2492
+ };
2493
+ const sendSignalMedia = async (caption, mediaUrl) => {
2494
+ throwIfAborted(abortSignal);
2495
+ const formatted = markdownToSignalTextChunks(caption, Number.POSITIVE_INFINITY, { tableMode: signalTableMode })[0] ?? {
2496
+ text: caption,
2497
+ styles: []
2498
+ };
2499
+ return {
2500
+ channel: "signal",
2501
+ ...await sendSignal(to, formatted.text, {
2502
+ mediaUrl,
2503
+ maxBytes: signalMaxBytes,
2504
+ accountId: accountId ?? void 0,
2505
+ textMode: "plain",
2506
+ textStyles: formatted.styles
2507
+ })
2508
+ };
2509
+ };
2510
+ const normalizedPayloads = normalizeReplyPayloadsForDelivery(payloads);
2511
+ for (const payload of normalizedPayloads) {
2512
+ const payloadSummary = {
2513
+ text: payload.text ?? "",
2514
+ mediaUrls: payload.mediaUrls ?? (payload.mediaUrl ? [payload.mediaUrl] : []),
2515
+ channelData: payload.channelData
2516
+ };
2517
+ try {
2518
+ throwIfAborted(abortSignal);
2519
+ params.onPayload?.(payloadSummary);
2520
+ if (handler.sendPayload && payload.channelData) {
2521
+ results.push(await handler.sendPayload(payload));
2522
+ continue;
2523
+ }
2524
+ if (payloadSummary.mediaUrls.length === 0) {
2525
+ if (isSignalChannel) await sendSignalTextChunks(payloadSummary.text);
2526
+ else await sendTextChunks(payloadSummary.text);
2527
+ continue;
2528
+ }
2529
+ let first = true;
2530
+ for (const url of payloadSummary.mediaUrls) {
2531
+ throwIfAborted(abortSignal);
2532
+ const caption = first ? payloadSummary.text : "";
2533
+ first = false;
2534
+ if (isSignalChannel) results.push(await sendSignalMedia(caption, url));
2535
+ else results.push(await handler.sendMedia(caption, url));
2536
+ }
2537
+ } catch (err) {
2538
+ if (!params.bestEffort) throw err;
2539
+ params.onError?.(err, payloadSummary);
2540
+ }
2541
+ }
2542
+ if (params.mirror && results.length > 0) {
2543
+ const mirrorText = resolveMirroredTranscriptText({
2544
+ text: params.mirror.text,
2545
+ mediaUrls: params.mirror.mediaUrls
2546
+ });
2547
+ if (mirrorText) await appendAssistantMessageToSessionTranscript({
2548
+ agentId: params.mirror.agentId,
2549
+ sessionKey: params.mirror.sessionKey,
2550
+ text: mirrorText
2551
+ });
2552
+ }
2553
+ return results;
2554
+ }
2555
+
2556
+ //#endregion
2557
+ export { chunkMarkdownText as A, loadWebMediaRaw as B, chunkMarkdownIR as C, resolveFetch as D, resolveMarkdownTableMode as E, resolveTextChunkLimit as F, HEARTBEAT_TOKEN as G, fetchRemoteMedia as H, findFenceSpanAt as I, SILENT_REPLY_TOKEN as K, isSafeFenceBreak as L, chunkText as M, chunkTextWithMode as N, wrapFetchWithAbortSignal as O, resolveChunkMode as P, parseFenceSpans as R, streamSignalEvents as S, markdownToIRWithMeta as T, fetchWithSsrFGuard as U, MediaFetchError as V, resolveChannelMediaMaxBytes as W, sendMessageSignal as _, applyReplyThreading as a, signalCheck as b, shouldSuppressMessagingToolReplies as c, buildTargetResolverSignature as d, normalizeChannelTargetInput as f, parseInlineDirectives as g, splitMediaFromOutput as h, applyReplyTagsToPayload as i, chunkMarkdownTextWithMode as j, chunkByNewline as k, createReplyToModeFilterForChannel as l, parseReplyDirectives as m, deliver_exports as n, filterMessagingToolDuplicates as o, normalizeTargetForProvider as p, isSilentReplyText as q, normalizeReplyPayloadsForDelivery as r, isRenderablePayload as s, deliverOutboundPayloads as t, resolveReplyToMode as u, sendReadReceiptSignal as v, markdownToIR as w, signalRpcRequest as x, sendTypingSignal as y, loadWebMedia as z };