squidclaw 3.0.19 → 3.0.21

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 (407) hide show
  1. package/dist/{accounts-s5e9zidf.js → accounts-C7pGQPcS.js} +2 -2
  2. package/dist/{accounts-Bkb-J8V6.js → accounts-DjhBQg_8.js} +2 -2
  3. package/dist/{accounts-B6F_XCgS.js → accounts-DwGoZKGm.js} +17 -17
  4. package/dist/{active-listener-6-Svu8Dx.js → active-listener-DPc_PGsA.js} +2 -2
  5. package/dist/{agents-DL8uYsUq.js → agents-DXKtU4Il.js} +4 -4
  6. package/dist/{agents.config-B4KAAVvR.js → agents.config-BM-2SLCh.js} +1 -1
  7. package/dist/{agents.config-D93fF1eJ.js → agents.config-eMSUW-iw.js} +1 -1
  8. package/dist/{plugin-sdk/api-key-rotation-DyjMI2n3.js → api-key-rotation-DVyYtQxC.js} +2 -2
  9. package/dist/{audio-preflight-DZ1LNMJp.js → audio-preflight-BUCBED7N.js} +32 -32
  10. package/dist/{audio-preflight-Bzo_zN4j.js → audio-preflight-lT9iRnYi.js} +4 -4
  11. package/dist/{audio-transcription-runner-B3u2x_ja.js → audio-transcription-runner-Cv0Q47cM.js} +12 -12
  12. package/dist/{audio-transcription-runner-Cp_lkLCv.js → audio-transcription-runner-YiR1ym3a.js} +1 -1
  13. package/dist/{audit-membership-runtime-w23FnNAN.js → audit-membership-runtime-DyLj-uhz.js} +4 -4
  14. package/dist/{auth-choice-Ba4AEm_k.js → auth-choice-CXepQc7c.js} +1 -1
  15. package/dist/{auth-choice-ziFj5bXd.js → auth-choice-D2JrMJn-.js} +1 -1
  16. package/dist/{banner-DDih2slD.js → banner-DMfuBV69.js} +1 -1
  17. package/dist/build-info.json +3 -3
  18. package/dist/bundled/boot-md/handler.js +51 -51
  19. package/dist/bundled/bootstrap-extra-files/handler.js +6 -6
  20. package/dist/bundled/command-logger/handler.js +2 -2
  21. package/dist/bundled/session-memory/handler.js +687 -51
  22. package/dist/canvas-host/a2ui/a2ui.bundle.js +1 -17815
  23. package/dist/{channel-activity-CxJbx4sD.js → channel-activity-CPpt4XaL.js} +3 -3
  24. package/dist/{channel-options-DTDfU0R6.js → channel-options-CQ-gER0J.js} +1 -1
  25. package/dist/{channel-options-BBSsevyl.js → channel-options-SijIkAlT.js} +1 -1
  26. package/dist/{channel-web-BXl9jCKV.js → channel-web-7t1a2N13.js} +1 -1
  27. package/dist/{channel-web-SF18oYqo.js → channel-web-LLzBxZrT.js} +1 -1
  28. package/dist/{channels-cli-BiuWJpJu.js → channels-cli-D4xUEYYC.js} +6 -6
  29. package/dist/{channels-cli-BDLabpWH.js → channels-cli-DYaFNMme.js} +6 -6
  30. package/dist/{chrome-CZQnp4VH.js → chrome-CuBHInKC.js} +8 -8
  31. package/dist/{chrome-Dxm25ptH.js → chrome-OgCChbC_.js} +26 -26
  32. package/dist/{cli-CfgDCCuC.js → cli-CAID9zkL.js} +1 -1
  33. package/dist/{cli-DAZ1MKrJ.js → cli-Dlc9IFWZ.js} +1 -1
  34. package/dist/{command-registry-DkjNuW8w.js → command-registry-AHS8_9da.js} +9 -9
  35. package/dist/{commands-registry-B44COZFz.js → commands-registry-BJjv8_oR.js} +4 -4
  36. package/dist/{completion-cli-DbNma3J9.js → completion-cli-B8xjpHDs.js} +1 -1
  37. package/dist/{completion-cli-Du8H92bM.js → completion-cli-BR1r9_h4.js} +2 -2
  38. package/dist/{config-cli-CQhQ8Bcc.js → config-cli-D0A8Awoo.js} +1 -1
  39. package/dist/{config-cli-D16tlTWa.js → config-cli-D4Rxoozg.js} +1 -1
  40. package/dist/{configure-B9b3cQTC.js → configure-DOiI8_8c.js} +3 -3
  41. package/dist/{configure-B4TiK50K.js → configure-XmOqwwy9.js} +3 -3
  42. package/dist/control-ui/assets/{index-cM5P_3w7.js → index-BqxuPQOl.js} +2 -2
  43. package/dist/control-ui/assets/{index-cM5P_3w7.js.map → index-BqxuPQOl.js.map} +1 -1
  44. package/dist/control-ui/index.html +1 -1
  45. package/dist/{deliver-B4WWPQvt.js → deliver-6zfT7daI.js} +1 -1
  46. package/dist/{deliver-BcnsjbAB.js → deliver-DMTUTpTM.js} +21 -21
  47. package/dist/deliver-runtime-B80olQwJ.js +36 -0
  48. package/dist/{deliver-runtime-CeE1X9si.js → deliver-runtime-MBexxUuG.js} +3 -3
  49. package/dist/deps-send-discord.runtime-GIuvX7Xw.js +26 -0
  50. package/dist/deps-send-imessage.runtime-B3TC7G80.js +25 -0
  51. package/dist/deps-send-signal.runtime-CuVJyw7n.js +24 -0
  52. package/dist/deps-send-slack.runtime-cbfFoLZ4.js +22 -0
  53. package/dist/deps-send-telegram.runtime-CRyP-xDQ.js +27 -0
  54. package/dist/deps-send-whatsapp.runtime-4aOUBP2J.js +60 -0
  55. package/dist/{deps-send-whatsapp.runtime-B9uivfkM.js → deps-send-whatsapp.runtime-CETLGt-t.js} +3 -3
  56. package/dist/{deps-send-whatsapp.runtime-miTfQkK9.js → deps-send-whatsapp.runtime-CrxkfP31.js} +7 -7
  57. package/dist/{deps-send-whatsapp.runtime-CFnZsKW0.js → deps-send-whatsapp.runtime-__ogpmJj.js} +3 -3
  58. package/dist/{diagnostic-C2lklhkn.js → diagnostic-CnVwZNbm.js} +2 -2
  59. package/dist/{doctor-completion-ujZ_JdIz.js → doctor-completion-CZoEdMS-.js} +1 -1
  60. package/dist/{doctor-completion-CEiVFPte.js → doctor-completion-DhLEFUhN.js} +1 -1
  61. package/dist/entry.js +2 -2
  62. package/dist/{plugin-sdk/errors-B8oJXuCF.js → errors-kkRuS2Cs.js} +1 -1
  63. package/dist/extensionAPI.js +6 -6
  64. package/dist/{fetch-b8tSR7_e.js → fetch-DP-JjB6Z.js} +5 -5
  65. package/dist/{fetch-guard-D16tjNsZ.js → fetch-guard-BDy975wP.js} +2 -2
  66. package/dist/{frontmatter-CjKtFduT.js → frontmatter-Cq1TcIQ2.js} +3 -3
  67. package/dist/{fs-safe-CwHbZdFH.js → fs-safe-BoB4X3GD.js} +4 -4
  68. package/dist/{gateway-cli-NXeo-J8r.js → gateway-cli-BJHBChfI.js} +8 -8
  69. package/dist/{gateway-cli-2jaWM_Ci.js → gateway-cli-BpHskeDd.js} +8 -8
  70. package/dist/{github-copilot-token-Cw3tAXM9.js → github-copilot-token-B5cPlwaz.js} +7 -7
  71. package/dist/{health-BPZALM__.js → health-TmpUGSqu.js} +1 -1
  72. package/dist/{health-DFZKMrW2.js → health-XFKFZ7ZJ.js} +1 -1
  73. package/dist/{hooks-cli-B3rkhWcT.js → hooks-cli-CXsZK8H9.js} +2 -2
  74. package/dist/{hooks-cli-BO_gZJVD.js → hooks-cli-DsDV-Pxz.js} +2 -2
  75. package/dist/{image-DKkuLtZ4.js → image-VgwN31FZ.js} +1 -1
  76. package/dist/{image-C-8Kd2Mh.js → image-kKMG59st.js} +6 -6
  77. package/dist/{image-ops-BoN1E_WZ.js → image-ops-Dg8iraUV.js} +2 -2
  78. package/dist/image-runtime-BqIv7p_K.js +29 -0
  79. package/dist/{image-runtime-BMavqm9n.js → image-runtime-CwMuTYvd.js} +3 -3
  80. package/dist/index.js +6 -6
  81. package/dist/{ir-Dut0zXyS.js → ir-CKK03mBV.js} +8 -8
  82. package/dist/{legacy-names-B0wgIP0Q.js → legacy-names-aGJJuzM_.js} +1 -1
  83. package/dist/llm-slug-generator.js +51 -51
  84. package/dist/{logger-oGKcCLZ5.js → logger-CnTSBL7T.js} +7 -7
  85. package/dist/{login-DJ357UQV.js → login-CeKDrz6_.js} +5 -5
  86. package/dist/{login-qr-C0fDBnpM.js → login-qr-KbOpR0GQ.js} +10 -10
  87. package/dist/{manager-BPGhs30n.js → manager-DINhLnMi.js} +13 -13
  88. package/dist/manager-runtime-D6ckUNSs.js +18 -0
  89. package/dist/{model-selection-CHnojCCK.js → model-selection-DuNLFQPR.js} +43 -43
  90. package/dist/{models-Bb-GYqHr.js → models-5VXwJBU2.js} +2 -2
  91. package/dist/{models-cli-DffAz0ji.js → models-cli-Br56IHfy.js} +3 -3
  92. package/dist/{models-cli-CAIJM1Wh.js → models-cli-CrR1RN3j.js} +2 -2
  93. package/dist/{npm-resolution-D2_zGJM-.js → npm-resolution-CKtyq4FH.js} +1 -1
  94. package/dist/{npm-resolution-D5pBCkUw.js → npm-resolution-CPk7dS7F.js} +1 -1
  95. package/dist/{onboard-DcVsL9Jx.js → onboard-DUnBamC0.js} +2 -2
  96. package/dist/{onboard-channels-mNXKTvFs.js → onboard-channels-D45grihx.js} +1 -1
  97. package/dist/{onboard-channels-C-cQFUBH.js → onboard-channels-_kVo3Apf.js} +1 -1
  98. package/dist/{onboard-dhG2YBez.js → onboard-lFwpCpC3.js} +2 -2
  99. package/dist/{onboarding-B3-IwkNi.js → onboarding-CyCSQ__q.js} +3 -3
  100. package/dist/{onboarding-Cl6kW_iq.js → onboarding-EEd_g8Zg.js} +3 -3
  101. package/dist/{onboarding.finalize-CCU-ykTR.js → onboarding.finalize-CbMq7C4K.js} +5 -5
  102. package/dist/{onboarding.finalize-BZqsNG2H.js → onboarding.finalize-Cs1ukjFN.js} +6 -6
  103. package/dist/{outbound-qTioiTJg.js → outbound-C9svt6RH.js} +6 -6
  104. package/dist/{outbound-attachment-rlW7G5df.js → outbound-attachment-DwupUxYF.js} +2 -2
  105. package/dist/{path-alias-guards-Cpsiv2KL.js → path-alias-guards-DORgbZ1w.js} +1 -1
  106. package/dist/{paths-CSdAWKDO.js → paths-DA5srn0U.js} +5 -5
  107. package/dist/{paths-CXClY8zC.js → paths-DSd911Oe.js} +4 -4
  108. package/dist/{pi-embedded-B79nZERv.js → pi-embedded-BN8fghaF.js} +123 -26
  109. package/dist/{pi-embedded-C5U8Qxn6.js → pi-embedded-BiC4tIJ8.js} +266 -169
  110. package/dist/{pi-embedded-helpers-CEHpGDRs.js → pi-embedded-helpers-A9VYPVCH.js} +3 -3
  111. package/dist/{pi-embedded-helpers-DQ7IaeOi.js → pi-embedded-helpers-Di58J7Eh.js} +52 -52
  112. package/dist/{pi-model-discovery-o-WX5w2t.js → pi-model-discovery-V-InbjOM.js} +7 -7
  113. package/dist/pi-model-discovery-runtime--t6tAlar.js +11 -0
  114. package/dist/{pi-tools.before-tool-call.runtime-B_LUttg1.js → pi-tools.before-tool-call.runtime-Bpk4qTgV.js} +9 -9
  115. package/dist/{plugin-registry-CB47SSz1.js → plugin-registry-CXm125Uz.js} +1 -1
  116. package/dist/{plugin-registry-Gy_VByyf.js → plugin-registry-D3PnPE1D.js} +1 -1
  117. package/dist/plugin-sdk/{accounts-0kF5cxkn.js → accounts-C5PAuCTj.js} +2 -2
  118. package/dist/plugin-sdk/{accounts-u0-JAHzj.js → accounts-DC5cbH9r.js} +2 -2
  119. package/dist/plugin-sdk/{accounts-xZOA23tQ.js → accounts-DncG0Hx9.js} +3 -3
  120. package/dist/plugin-sdk/{active-listener-BO7eBEG_.js → active-listener-Bd3HH2km.js} +2 -2
  121. package/dist/plugin-sdk/agents/agent-tier.d.ts +22 -2
  122. package/dist/plugin-sdk/{api-key-rotation-C4C_mDsg.js → api-key-rotation-BAZ0GD26.js} +2 -2
  123. package/dist/plugin-sdk/{audio-preflight-C0q7lu6y.js → audio-preflight-tpVm-t9O.js} +26 -26
  124. package/dist/plugin-sdk/{audio-transcription-runner-Ced47O1H.js → audio-transcription-runner-DSScb434.js} +11 -11
  125. package/dist/plugin-sdk/{audit-membership-runtime-Xl20kCBe.js → audit-membership-runtime-DHQDvH4u.js} +2 -2
  126. package/dist/plugin-sdk/{channel-activity-CNffKOEQ.js → channel-activity-cYEaofTH.js} +3 -3
  127. package/dist/plugin-sdk/{channel-web-vB3Dcd8-.js → channel-web-CbeCrQ4C.js} +18 -18
  128. package/dist/plugin-sdk/{channel-web-BrhP6FQO.js → channel-web-CqiSEc52.js} +1 -1
  129. package/dist/plugin-sdk/{chrome-DJQWo149.js → chrome-DB2h0uN0.js} +6 -6
  130. package/dist/plugin-sdk/{commands-registry-_kBPE22q.js → commands-registry-DGZ1oFXJ.js} +4 -4
  131. package/dist/plugin-sdk/{common-J8vIST9Q.js → common-D5lLWoCW.js} +2 -2
  132. package/dist/plugin-sdk/compat.js +50 -50
  133. package/dist/plugin-sdk/{config-CnZ1TlEw.js → config-Bt-c7PWF.js} +7 -7
  134. package/dist/plugin-sdk/{deliver-Xh6voz9H.js → deliver-MvrkIeKJ.js} +10 -10
  135. package/dist/plugin-sdk/deliver-runtime-i50kjcNM.js +32 -0
  136. package/dist/plugin-sdk/deps-send-discord.runtime-hOYq9ov0.js +23 -0
  137. package/dist/plugin-sdk/deps-send-imessage.runtime-D5n9DXyL.js +22 -0
  138. package/dist/plugin-sdk/deps-send-signal.runtime-CwEaRyJU.js +21 -0
  139. package/dist/plugin-sdk/deps-send-slack.runtime-DOZeLIaC.js +19 -0
  140. package/dist/plugin-sdk/deps-send-telegram.runtime-BW1hSPKh.js +24 -0
  141. package/dist/plugin-sdk/{deps-send-whatsapp.runtime-Ce4Gzz-J.js → deps-send-whatsapp.runtime-DvxhnHR_.js} +3 -3
  142. package/dist/plugin-sdk/deps-send-whatsapp.runtime-JKmTtCFM.js +57 -0
  143. package/dist/plugin-sdk/{diagnostic-DKsyROPi.js → diagnostic-B6F3BtCX.js} +2 -2
  144. package/dist/plugin-sdk/{errors-CgRPdp3o.js → errors-9oVz7reJ.js} +1 -1
  145. package/dist/plugin-sdk/{fetch-guard-BBAT8G-1.js → fetch-guard-cfPCfkrw.js} +2 -2
  146. package/dist/plugin-sdk/{fs-safe-DqCO1D4C.js → fs-safe-DFbwq9CS.js} +3 -3
  147. package/dist/plugin-sdk/{image-4ay2cw7G.js → image-FK5xhY5u.js} +6 -6
  148. package/dist/plugin-sdk/{image-ops-G8KoEfY8.js → image-ops-BSYgrL7E.js} +2 -2
  149. package/dist/plugin-sdk/image-runtime-B95EPFpg.js +25 -0
  150. package/dist/plugin-sdk/index.js +2 -2
  151. package/dist/plugin-sdk/{ir-DXj1KGnL.js → ir-CWmryq5f.js} +7 -7
  152. package/dist/plugin-sdk/{local-roots-ovKHgVSP.js → local-roots-U25IdeDH.js} +4 -4
  153. package/dist/plugin-sdk/{logger-DIb2cGHp.js → logger-Bg4vIUJn.js} +2 -2
  154. package/dist/plugin-sdk/{login-Cgtm70by.js → login-8qzl2H7G.js} +4 -4
  155. package/dist/plugin-sdk/{login-qr-BrixqhMx.js → login-qr-kalCTJEw.js} +5 -5
  156. package/dist/plugin-sdk/{manager-PEQ_cPYF.js → manager-ijYHktIt.js} +8 -8
  157. package/dist/plugin-sdk/manager-runtime--JrLQE03.js +15 -0
  158. package/dist/plugin-sdk/{outbound-BK75h9CQ.js → outbound-BIVf0aPq.js} +5 -5
  159. package/dist/plugin-sdk/{outbound-attachment-BI1QngTS.js → outbound-attachment-F5tzeNUD.js} +2 -2
  160. package/dist/plugin-sdk/{path-alias-guards-TnxupPQC.js → path-alias-guards-DA0MhfkG.js} +1 -1
  161. package/dist/plugin-sdk/{paths-B7_75Pdr.js → paths-CP67O8eN.js} +1 -1
  162. package/dist/plugin-sdk/{pi-embedded-helpers-BioULNev.js → pi-embedded-helpers-CxMnPQ37.js} +16 -16
  163. package/dist/plugin-sdk/{pi-model-discovery-BMmAbnil.js → pi-model-discovery-8OL77kCh.js} +1 -1
  164. package/dist/plugin-sdk/pi-model-discovery-runtime-DGRFpUfd.js +8 -0
  165. package/dist/plugin-sdk/{pi-tools.before-tool-call.runtime-rdRqZ9lk.js → pi-tools.before-tool-call.runtime-B7FW36KX.js} +4 -4
  166. package/dist/plugin-sdk/{plugins-BqKpJkqt.js → plugins-D3mrhffi.js} +4 -4
  167. package/dist/plugin-sdk/{proxy-env-C4s12rr8.js → proxy-env-CUUXO6rv.js} +1 -1
  168. package/dist/plugin-sdk/{proxy-fetch-ZPEvp58f.js → proxy-fetch-Cf3IUSDw.js} +1 -1
  169. package/dist/plugin-sdk/{pw-ai-Cb0ZDSq4.js → pw-ai-dPmKdw_w.js} +9 -9
  170. package/dist/plugin-sdk/{qmd-manager-Bei6TaFq.js → qmd-manager-Ov9ElEfG.js} +7 -7
  171. package/dist/plugin-sdk/{query-expansion-POz2za8a.js → query-expansion-CzjwW461.js} +4 -4
  172. package/dist/plugin-sdk/{redact-9WsNyb7S.js → redact-DfACyt0X.js} +1 -1
  173. package/dist/plugin-sdk/{reply-DxvpiQBp.js → reply-BczXGzC_.js} +137 -40
  174. package/dist/plugin-sdk/{reply-sFKB3ofA.js → reply-Dfjh1YtV.js} +206 -109
  175. package/dist/plugin-sdk/{resolve-outbound-target-DL1adXpk.js → resolve-outbound-target-BeIB_jm0.js} +2 -2
  176. package/dist/plugin-sdk/{run-with-concurrency-DmTrN5JG.js → run-with-concurrency-kVooFCVo.js} +1 -1
  177. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-B6EcC22F.js +10 -0
  178. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-DH8J0Ie7.js +19 -0
  179. package/dist/plugin-sdk/{send-BCVXt-3e.js → send-CgkNzAhS.js} +8 -8
  180. package/dist/plugin-sdk/{send-CAG0Or0G.js → send-CuENGOhq.js} +7 -7
  181. package/dist/plugin-sdk/{send-X6QuS7x0.js → send-D6Uh2D1D.js} +5 -5
  182. package/dist/plugin-sdk/{send-BNePC8CO.js → send-DV5kR0Hg.js} +6 -6
  183. package/dist/plugin-sdk/{send-DhGDAZnT.js → send-DtA6ngBJ.js} +13 -13
  184. package/dist/plugin-sdk/{session-CAqYQVhe.js → session-CnlZn-bR.js} +3 -3
  185. package/dist/plugin-sdk/{skill-commands-Bk-IFyNw.js → skill-commands-Ckfii7h8.js} +4 -4
  186. package/dist/plugin-sdk/{skills-C5bT9-q4.js → skills-v0WQqKTa.js} +6 -6
  187. package/dist/plugin-sdk/slash-commands.runtime-BYoxsxkX.js +13 -0
  188. package/dist/plugin-sdk/{slash-dispatch.runtime-Dyb_EkUt.js → slash-dispatch.runtime-DOo1IzuY.js} +1 -1
  189. package/dist/plugin-sdk/slash-dispatch.runtime-JfFr7bNy.js +52 -0
  190. package/dist/plugin-sdk/slash-skill-commands.runtime-D0399tia.js +16 -0
  191. package/dist/plugin-sdk/{store-D3lgWnS2.js → store-C_UrNuM3.js} +2 -2
  192. package/dist/plugin-sdk/{subagent-registry-runtime-hdnabonI.js → subagent-registry-runtime-DLvup9ph.js} +1 -1
  193. package/dist/plugin-sdk/subagent-registry-runtime-DVl5xKOW.js +52 -0
  194. package/dist/plugin-sdk/{tables-Dmlu4_q_.js → tables-CJP05iMa.js} +1 -1
  195. package/dist/plugin-sdk/{thinking-DRNOh5Xx.js → thinking-BhP3vn1l.js} +7 -7
  196. package/dist/plugin-sdk/{tokens-CTIYTLWu.js → tokens-DAL_5WHL.js} +1 -1
  197. package/dist/plugin-sdk/{tool-images-GSlvf6RP.js → tool-images-ZE5G5UM0.js} +2 -2
  198. package/dist/plugin-sdk/{web-D9LAdsuU.js → web-C2Sj2WW0.js} +2 -2
  199. package/dist/plugin-sdk/web-CNY_ky8h.js +56 -0
  200. package/dist/plugin-sdk/{whatsapp-actions-BCJYmWCB.js → whatsapp-actions-DJmx6ihj.js} +17 -17
  201. package/dist/plugin-sdk/whatsapp.js +50 -50
  202. package/dist/{plugins-AqsVZZk3.js → plugins-DvejjZnJ.js} +11 -11
  203. package/dist/{plugins-cli-BYnoJwF1.js → plugins-cli-BA_2daJe.js} +2 -2
  204. package/dist/{plugins-cli-gtgkmDcv.js → plugins-cli-C0WKWrZo.js} +2 -2
  205. package/dist/{program-BGlgDpHI.js → program-D_xdLzmM.js} +7 -7
  206. package/dist/{program-context-M4FTWqqg.js → program-context-DfmCIQ91.js} +17 -17
  207. package/dist/{prompt-select-styled-AL5Tm3yO.js → prompt-select-styled-ApPSadr5.js} +4 -4
  208. package/dist/{prompt-select-styled-BVC2byQV.js → prompt-select-styled-BsheNEnh.js} +4 -4
  209. package/dist/{provider-auth-helpers-DDgrFku5.js → provider-auth-helpers-B5kD4Lt6.js} +1 -1
  210. package/dist/{provider-auth-helpers-Q7aIhDgv.js → provider-auth-helpers-DpOFkV28.js} +1 -1
  211. package/dist/{proxy-env-DXXfs2WL.js → proxy-env-D-fike7s.js} +1 -1
  212. package/dist/{plugin-sdk/proxy-fetch-Dt5BedH8.js → proxy-fetch-lH6RsRTE.js} +1 -1
  213. package/dist/{push-apns-Ga8xvhkh.js → push-apns-BbenjEX4.js} +1 -1
  214. package/dist/{push-apns-FyGbUyh2.js → push-apns-Ci2sdIKf.js} +1 -1
  215. package/dist/{pw-ai-GOBxzChI.js → pw-ai-B8ymIYub.js} +14 -14
  216. package/dist/{pw-ai-Du22SYoO.js → pw-ai-CM87tQwG.js} +1 -1
  217. package/dist/{qmd-manager-CO-shcLU.js → qmd-manager-BN0siR2Z.js} +10 -10
  218. package/dist/{query-expansion-DlQOkf-g.js → query-expansion-Dzxt6kXo.js} +6 -6
  219. package/dist/{redact-NmPEVjIo.js → redact-DvzicBMu.js} +1 -1
  220. package/dist/{register.agent-koAXw1ay.js → register.agent-CY6R-7fn.js} +6 -6
  221. package/dist/{register.agent-zP8a-sNB.js → register.agent-Dk_5V5oA.js} +7 -7
  222. package/dist/{register.configure-CUuP5J8W.js → register.configure-C8OFfGln.js} +7 -7
  223. package/dist/{register.configure-CYrmyjlf.js → register.configure-DT1RLeTR.js} +7 -7
  224. package/dist/{register.maintenance-BZuEljPU.js → register.maintenance-CluQOq8b.js} +8 -8
  225. package/dist/{register.maintenance-ByEQ2CVH.js → register.maintenance-YHXmOQzf.js} +7 -7
  226. package/dist/{register.message-BkSXhv9I.js → register.message-BCTXT5yK.js} +2 -2
  227. package/dist/{register.message-CgHfmDHm.js → register.message-BuoFjRqA.js} +2 -2
  228. package/dist/{register.onboard-HcQwPAEK.js → register.onboard-BJaRMtxU.js} +2 -2
  229. package/dist/{register.onboard-4ke40MNP.js → register.onboard-C64oXnvq.js} +2 -2
  230. package/dist/{register.setup-B41xZb1r.js → register.setup-Dl3nk2Ui.js} +2 -2
  231. package/dist/{register.setup-xAb7Cvzy.js → register.setup-Drc55K_w.js} +2 -2
  232. package/dist/{register.status-health-sessions-CcOVL0x8.js → register.status-health-sessions-BHtbPeCO.js} +3 -3
  233. package/dist/{register.status-health-sessions-BbHAAKwv.js → register.status-health-sessions-xgC_gtEM.js} +3 -3
  234. package/dist/{register.subclis-_uSASnfC.js → register.subclis-CDMFyaKR.js} +9 -9
  235. package/dist/{reply-BFTOdZcK.js → reply-DwjHsBuj.js} +137 -40
  236. package/dist/{run-main-C1eZrW-5.js → run-main-BcA22Ipv.js} +14 -14
  237. package/dist/{run-with-concurrency-FczpX8ng.js → run-with-concurrency-BFR3ReeF.js} +4 -4
  238. package/dist/runtime-whatsapp-login.runtime-DxV9iv6l.js +13 -0
  239. package/dist/runtime-whatsapp-outbound.runtime-DQqIlwhS.js +22 -0
  240. package/dist/{send-Bx9CqcZr.js → send-4nRsZJXH.js} +7 -7
  241. package/dist/{send-D5D0ZGht.js → send-BGlcHjUD.js} +26 -26
  242. package/dist/{send-DtHQ7_6Z.js → send-BTUU1jWM.js} +8 -8
  243. package/dist/{send-B9H0BkfO.js → send-DdBbRpTP.js} +6 -6
  244. package/dist/{send-B5QEmMJ4.js → send-dTQd-IyJ.js} +5 -5
  245. package/dist/{server-node-events-pYrJmi9w.js → server-node-events-Q0cT2ifj.js} +2 -2
  246. package/dist/{server-node-events-DbS1jJ5j.js → server-node-events-YN5eJeHa.js} +2 -2
  247. package/dist/{session-DLTCuoUD.js → session-CnCwDJke.js} +8 -8
  248. package/dist/{skill-commands-BwTLQRR8.js → skill-commands-Cz45_nme.js} +9 -9
  249. package/dist/{skills-B9N2bqKU.js → skills-CdCS1HeL.js} +22 -22
  250. package/dist/slash-commands.runtime-CZz6v6b3.js +16 -0
  251. package/dist/{slash-dispatch.runtime-PX9_08Hm.js → slash-dispatch.runtime-BOMEVFk0.js} +1 -1
  252. package/dist/{slash-dispatch.runtime-DmFVOi3w.js → slash-dispatch.runtime-DB1QsBRc.js} +1 -1
  253. package/dist/slash-dispatch.runtime-SO7HOe8q.js +56 -0
  254. package/dist/{slash-dispatch.runtime-BGXbtMX6.js → slash-dispatch.runtime-sXaUYn4v.js} +6 -6
  255. package/dist/slash-skill-commands.runtime-Bawt7j0r.js +20 -0
  256. package/dist/{status-DtiapFqq.js → status-Bh5x6DsW.js} +2 -2
  257. package/dist/{status-B4eVRJcO.js → status-cU9cJReo.js} +2 -2
  258. package/dist/{store-CvQ41zCV.js → store-D9z0dn7D.js} +2 -2
  259. package/dist/{subagent-registry-Ctrhw4X-.js → subagent-registry-CIgFD2oi.js} +103 -6
  260. package/dist/{subagent-registry-runtime-CezPaX9P.js → subagent-registry-runtime-232sNNT6.js} +6 -6
  261. package/dist/subagent-registry-runtime-D2rUxU5J.js +56 -0
  262. package/dist/{subagent-registry-runtime-Cy7dsGqF.js → subagent-registry-runtime-D7ubAnDZ.js} +1 -1
  263. package/dist/{subagent-registry-runtime-CTjx4TK5.js → subagent-registry-runtime-DGTjU9Lb.js} +1 -1
  264. package/dist/{subsystem-BaLYRf7D.js → subsystem-6v7sWnAD.js} +14 -14
  265. package/dist/{tables-BRYYxYs7.js → tables-BTFiZyRU.js} +1 -1
  266. package/dist/{target-errors-D0ZJUbbf.js → target-errors-DgNRx3Nr.js} +2 -2
  267. package/dist/{thinking-B-A99X3F.js → thinking-B75CXkTT.js} +7 -7
  268. package/dist/{tokens-D2XhLqIz.js → tokens-DfbMVF9y.js} +1 -1
  269. package/dist/{tool-images-Zn6jVmkX.js → tool-images-Dp5OiXeA.js} +2 -2
  270. package/dist/{update-cli-_FsTRdQZ.js → update-cli-CktBOXZF.js} +7 -7
  271. package/dist/{update-cli-DLOWRdjv.js → update-cli-DM_dUip_.js} +8 -8
  272. package/dist/{update-runner-BY3l7ytB.js → update-runner-BBJZmfZ4.js} +1 -1
  273. package/dist/{update-runner-BKWHnVYI.js → update-runner-BYGPkHXG.js} +1 -1
  274. package/dist/{web-BdZ3mX3p.js → web-CZhZC1EA.js} +2 -2
  275. package/dist/{web-B46aOGK0.js → web-Chw1dtKA.js} +6 -6
  276. package/dist/{web-BNfDYvlW.js → web-DWRZAXj9.js} +2 -2
  277. package/dist/{web-1D0d1RHD.js → web-QsxgXbNK.js} +55 -55
  278. package/dist/{whatsapp-actions-Cuy0qeQK.js → whatsapp-actions-CzqsuSGx.js} +21 -21
  279. package/dist/{workspace-TqfVSQuO.js → workspace-kVMIaBrV.js} +20 -20
  280. package/extensions/acpx/node_modules/.bin/acpx +2 -2
  281. package/extensions/diagnostics-otel/node_modules/.bin/acorn +2 -2
  282. package/extensions/diffs/node_modules/.bin/playwright-core +2 -2
  283. package/extensions/googlechat/node_modules/.bin/squidclaw +2 -2
  284. package/extensions/matrix/node_modules/.bin/markdown-it +2 -2
  285. package/extensions/memory-core/node_modules/.bin/squidclaw +2 -2
  286. package/extensions/memory-lancedb/node_modules/.bin/arrow2csv +2 -2
  287. package/extensions/memory-lancedb/node_modules/.bin/openai +2 -2
  288. package/extensions/nostr/node_modules/.bin/tsc +2 -2
  289. package/extensions/nostr/node_modules/.bin/tsserver +2 -2
  290. package/extensions/tlon/node_modules/.bin/tlon +2 -2
  291. package/package.json +1 -1
  292. package/dist/api-key-rotation-TRwuCWbu.js +0 -181
  293. package/dist/canvas-host/a2ui/.bundle.hash +0 -1
  294. package/dist/deliver-runtime-_mBfV_4S.js +0 -36
  295. package/dist/deps-send-discord.runtime-CUTAK2hy.js +0 -26
  296. package/dist/deps-send-imessage.runtime-CQOiEIuA.js +0 -25
  297. package/dist/deps-send-signal.runtime-wN7MkzLw.js +0 -24
  298. package/dist/deps-send-slack.runtime-HEEwW4uU.js +0 -22
  299. package/dist/deps-send-telegram.runtime-DHlcnjQO.js +0 -27
  300. package/dist/deps-send-whatsapp.runtime-Cw7U9orE.js +0 -60
  301. package/dist/errors-DfgAh2Ml.js +0 -54
  302. package/dist/export-html/vendor/highlight.min.js +0 -1213
  303. package/dist/export-html/vendor/marked.min.js +0 -6
  304. package/dist/image-runtime-D11wBIC8.js +0 -29
  305. package/dist/manager-runtime-BB9lcoFR.js +0 -18
  306. package/dist/pi-model-discovery-runtime-DBkQoIJw.js +0 -11
  307. package/dist/plugin-sdk/accounts-CUEuUR3C.js +0 -46
  308. package/dist/plugin-sdk/accounts-D0W2pELU.js +0 -288
  309. package/dist/plugin-sdk/accounts-ucj0odJq.js +0 -35
  310. package/dist/plugin-sdk/active-listener-C5xPUSTb.js +0 -50
  311. package/dist/plugin-sdk/audio-preflight-Cqdo0JKm.js +0 -69
  312. package/dist/plugin-sdk/audio-transcription-runner-DnEooIyE.js +0 -2176
  313. package/dist/plugin-sdk/audit-membership-runtime-B9b-zRwg.js +0 -58
  314. package/dist/plugin-sdk/channel-activity-BMWLw4o2.js +0 -94
  315. package/dist/plugin-sdk/channel-web-D9WdAFlv.js +0 -2256
  316. package/dist/plugin-sdk/chrome-CV-q0Lmc.js +0 -2415
  317. package/dist/plugin-sdk/commands-registry-e7YoqrbP.js +0 -1125
  318. package/dist/plugin-sdk/config-B2B64aX0.js +0 -17911
  319. package/dist/plugin-sdk/deliver-BkyBtcLR.js +0 -1694
  320. package/dist/plugin-sdk/deliver-runtime-5UVcSskg.js +0 -32
  321. package/dist/plugin-sdk/deliver-runtime-O4lwAWMw.js +0 -32
  322. package/dist/plugin-sdk/deps-send-discord.runtime-BAeeBldY.js +0 -23
  323. package/dist/plugin-sdk/deps-send-discord.runtime-DTspXSCt.js +0 -23
  324. package/dist/plugin-sdk/deps-send-imessage.runtime-EL-CfikZ.js +0 -22
  325. package/dist/plugin-sdk/deps-send-imessage.runtime-qThAwDEe.js +0 -22
  326. package/dist/plugin-sdk/deps-send-signal.runtime-BeemHeUu.js +0 -21
  327. package/dist/plugin-sdk/deps-send-signal.runtime-DnjnVzZF.js +0 -21
  328. package/dist/plugin-sdk/deps-send-slack.runtime-CbKevLnv.js +0 -19
  329. package/dist/plugin-sdk/deps-send-slack.runtime-DTttkC0N.js +0 -19
  330. package/dist/plugin-sdk/deps-send-telegram.runtime-C6y29O9E.js +0 -24
  331. package/dist/plugin-sdk/deps-send-telegram.runtime-Dsf9Cnka.js +0 -24
  332. package/dist/plugin-sdk/deps-send-whatsapp.runtime-CCS71r77.js +0 -57
  333. package/dist/plugin-sdk/deps-send-whatsapp.runtime-CuxKhIE0.js +0 -57
  334. package/dist/plugin-sdk/diagnostic-DPRVoKTk.js +0 -319
  335. package/dist/plugin-sdk/fetch-guard-F0Fnqisy.js +0 -156
  336. package/dist/plugin-sdk/fs-safe-Dqmpk-Fr.js +0 -352
  337. package/dist/plugin-sdk/image-cBW8L8pp.js +0 -2310
  338. package/dist/plugin-sdk/image-ops-BP8ix1GC.js +0 -584
  339. package/dist/plugin-sdk/image-runtime-9xkgSlNz.js +0 -25
  340. package/dist/plugin-sdk/image-runtime-CpfepTDc.js +0 -25
  341. package/dist/plugin-sdk/ir-DWEc6zOp.js +0 -1296
  342. package/dist/plugin-sdk/local-roots-BIPT8uAO.js +0 -186
  343. package/dist/plugin-sdk/logger-DDdrdbDu.js +0 -1163
  344. package/dist/plugin-sdk/login-BMTiGutN.js +0 -57
  345. package/dist/plugin-sdk/login-qr-BFxqYUkc.js +0 -320
  346. package/dist/plugin-sdk/manager-BD-aYaZ8.js +0 -3917
  347. package/dist/plugin-sdk/manager-runtime-BmgTeb5G.js +0 -15
  348. package/dist/plugin-sdk/manager-runtime-C5bRwUlz.js +0 -15
  349. package/dist/plugin-sdk/outbound-Bm07xvO6.js +0 -212
  350. package/dist/plugin-sdk/outbound-attachment-DLsaxDsc.js +0 -19
  351. package/dist/plugin-sdk/path-alias-guards-gBhrAn14.js +0 -43
  352. package/dist/plugin-sdk/paths-C6W4VHoa.js +0 -166
  353. package/dist/plugin-sdk/pi-embedded-helpers-BExwPvTh.js +0 -9627
  354. package/dist/plugin-sdk/pi-model-discovery-DdctvBeX.js +0 -134
  355. package/dist/plugin-sdk/pi-model-discovery-runtime-COnuGwZt.js +0 -8
  356. package/dist/plugin-sdk/pi-model-discovery-runtime-DrtpLJjk.js +0 -8
  357. package/dist/plugin-sdk/pi-tools.before-tool-call.runtime-rgTz3FBl.js +0 -354
  358. package/dist/plugin-sdk/plugins-BN64HHZA.js +0 -864
  359. package/dist/plugin-sdk/pw-ai-DBm3RdBK.js +0 -1938
  360. package/dist/plugin-sdk/qmd-manager-6bozlfFg.js +0 -1448
  361. package/dist/plugin-sdk/query-expansion-eeVz_aEm.js +0 -1011
  362. package/dist/plugin-sdk/redact-BoNEjbpF.js +0 -319
  363. package/dist/plugin-sdk/reply-CqXMy3Yd.js +0 -98731
  364. package/dist/plugin-sdk/resolve-outbound-target-DXfjGlZQ.js +0 -40
  365. package/dist/plugin-sdk/run-with-concurrency-5DMu9szx.js +0 -1994
  366. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-99sCh8RG.js +0 -10
  367. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-D2hkJBa-.js +0 -10
  368. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-C06I4adi.js +0 -19
  369. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-dTkDaXHl.js +0 -19
  370. package/dist/plugin-sdk/send-B9xnwtQ-.js +0 -540
  371. package/dist/plugin-sdk/send-BxySs-Cu.js +0 -2587
  372. package/dist/plugin-sdk/send-D9THKp_J.js +0 -414
  373. package/dist/plugin-sdk/send-DCuaaP2w.js +0 -503
  374. package/dist/plugin-sdk/send-Dm_-_xje.js +0 -3135
  375. package/dist/plugin-sdk/session-DDzIZHxt.js +0 -169
  376. package/dist/plugin-sdk/skill-commands-DRvqtuFC.js +0 -342
  377. package/dist/plugin-sdk/skills-BWwlfbVj.js +0 -1428
  378. package/dist/plugin-sdk/slash-commands.runtime-BzYsaTST.js +0 -13
  379. package/dist/plugin-sdk/slash-commands.runtime-EAZKpRKq.js +0 -13
  380. package/dist/plugin-sdk/slash-dispatch.runtime-BC3IAF-I.js +0 -52
  381. package/dist/plugin-sdk/slash-dispatch.runtime-C7u7mlny.js +0 -52
  382. package/dist/plugin-sdk/slash-skill-commands.runtime-DGd_JSWX.js +0 -16
  383. package/dist/plugin-sdk/slash-skill-commands.runtime-sg98L8BK.js +0 -16
  384. package/dist/plugin-sdk/ssrf-DOBwjFow.js +0 -202
  385. package/dist/plugin-sdk/store-BKDR_-Qk.js +0 -81
  386. package/dist/plugin-sdk/subagent-registry-runtime-B6l6PxqP.js +0 -52
  387. package/dist/plugin-sdk/subagent-registry-runtime-Ceu7AzWi.js +0 -52
  388. package/dist/plugin-sdk/tables-GIj79us5.js +0 -55
  389. package/dist/plugin-sdk/target-errors-jlLHihbX.js +0 -195
  390. package/dist/plugin-sdk/thinking-BgdUnMZ2.js +0 -1206
  391. package/dist/plugin-sdk/tokens-CLE20fRI.js +0 -52
  392. package/dist/plugin-sdk/tool-images-BY1gsRyE.js +0 -274
  393. package/dist/plugin-sdk/web-BK2-uaOo.js +0 -56
  394. package/dist/plugin-sdk/web-Bnn82S4u.js +0 -56
  395. package/dist/plugin-sdk/whatsapp-actions-DQpK_5Ds.js +0 -80
  396. package/dist/proxy-fetch-C2v-Utgg.js +0 -38
  397. package/dist/runtime-whatsapp-login.runtime-DumUjKRz.js +0 -13
  398. package/dist/runtime-whatsapp-outbound.runtime-Cgu2MfqR.js +0 -22
  399. package/dist/slash-commands.runtime-CjBXruwG.js +0 -16
  400. package/dist/slash-dispatch.runtime-DqZVfX4H.js +0 -56
  401. package/dist/slash-skill-commands.runtime-DYK20Lxf.js +0 -20
  402. package/dist/subagent-registry-runtime-BIKGAzgI.js +0 -56
  403. package/docs/reference/templates/IDENTITY.md +0 -29
  404. package/docs/reference/templates/USER.md +0 -23
  405. package/docs/zh-CN/reference/templates/IDENTITY.md +0 -36
  406. package/docs/zh-CN/reference/templates/USER.md +0 -30
  407. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +0 -178
@@ -1,1296 +0,0 @@
1
- import { ot as normalizeAccountId } from "./run-with-concurrency-5DMu9szx.js";
2
- import { v as resolveAccountEntry } from "./accounts-D0W2pELU.js";
3
- import { E as resolveUserPath, L as logVerbose, z as shouldLogVerbose } from "./logger-DDdrdbDu.js";
4
- import { _ as maxBytesForKind, a as hasAlphaChannel, c as detectMime, l as extensionForMime, m as kindFromMime, o as optimizeImageToPng, r as convertHeicToJpeg, s as resizeToJpeg, y as INTERNAL_MESSAGE_CHANNEL } from "./image-ops-BP8ix1GC.js";
5
- import { r as normalizeChannelId } from "./plugins-BN64HHZA.js";
6
- import { s as readLocalFileSafely, t as SafeOpenError } from "./fs-safe-Dqmpk-Fr.js";
7
- import { i as fetchRemoteMedia, n as getDefaultMediaLocalRoots } from "./local-roots-BIPT8uAO.js";
8
- import path from "node:path";
9
- import fs from "node:fs/promises";
10
- import { fileURLToPath } from "node:url";
11
- import MarkdownIt from "markdown-it";
12
-
13
- //#region src/web/media.ts
14
- function resolveWebMediaOptions(params) {
15
- if (typeof params.maxBytesOrOptions === "number" || params.maxBytesOrOptions === void 0) return {
16
- maxBytes: params.maxBytesOrOptions,
17
- optimizeImages: params.optimizeImages,
18
- ssrfPolicy: params.options?.ssrfPolicy,
19
- localRoots: params.options?.localRoots
20
- };
21
- return {
22
- ...params.maxBytesOrOptions,
23
- optimizeImages: params.optimizeImages ? params.maxBytesOrOptions.optimizeImages ?? true : false
24
- };
25
- }
26
- var LocalMediaAccessError = class extends Error {
27
- constructor(code, message, options) {
28
- super(message, options);
29
- this.code = code;
30
- this.name = "LocalMediaAccessError";
31
- }
32
- };
33
- function getDefaultLocalRoots() {
34
- return getDefaultMediaLocalRoots();
35
- }
36
- async function assertLocalMediaAllowed(mediaPath, localRoots) {
37
- if (localRoots === "any") return;
38
- const roots = localRoots ?? getDefaultLocalRoots();
39
- let resolved;
40
- try {
41
- resolved = await fs.realpath(mediaPath);
42
- } catch {
43
- resolved = path.resolve(mediaPath);
44
- }
45
- if (localRoots === void 0) {
46
- const workspaceRoot = roots.find((root) => path.basename(root) === "workspace");
47
- if (workspaceRoot) {
48
- const stateDir = path.dirname(workspaceRoot);
49
- const rel = path.relative(stateDir, resolved);
50
- if (rel && !rel.startsWith("..") && !path.isAbsolute(rel)) {
51
- if ((rel.split(path.sep)[0] ?? "").startsWith("workspace-")) throw new LocalMediaAccessError("path-not-allowed", `Local media path is not under an allowed directory: ${mediaPath}`);
52
- }
53
- }
54
- }
55
- for (const root of roots) {
56
- let resolvedRoot;
57
- try {
58
- resolvedRoot = await fs.realpath(root);
59
- } catch {
60
- resolvedRoot = path.resolve(root);
61
- }
62
- if (resolvedRoot === path.parse(resolvedRoot).root) throw new LocalMediaAccessError("invalid-root", `Invalid localRoots entry (refuses filesystem root): ${root}. Pass a narrower directory.`);
63
- if (resolved === resolvedRoot || resolved.startsWith(resolvedRoot + path.sep)) return;
64
- }
65
- throw new LocalMediaAccessError("path-not-allowed", `Local media path is not under an allowed directory: ${mediaPath}`);
66
- }
67
- const HEIC_MIME_RE = /^image\/hei[cf]$/i;
68
- const HEIC_EXT_RE = /\.(heic|heif)$/i;
69
- const MB = 1024 * 1024;
70
- function formatMb(bytes, digits = 2) {
71
- return (bytes / MB).toFixed(digits);
72
- }
73
- function formatCapLimit(label, cap, size) {
74
- return `${label} exceeds ${formatMb(cap, 0)}MB limit (got ${formatMb(size)}MB)`;
75
- }
76
- function formatCapReduce(label, cap, size) {
77
- return `${label} could not be reduced below ${formatMb(cap, 0)}MB (got ${formatMb(size)}MB)`;
78
- }
79
- function isHeicSource(opts) {
80
- if (opts.contentType && HEIC_MIME_RE.test(opts.contentType.trim())) return true;
81
- if (opts.fileName && HEIC_EXT_RE.test(opts.fileName.trim())) return true;
82
- return false;
83
- }
84
- function toJpegFileName(fileName) {
85
- if (!fileName) return;
86
- const trimmed = fileName.trim();
87
- if (!trimmed) return fileName;
88
- const parsed = path.parse(trimmed);
89
- if (!parsed.ext || HEIC_EXT_RE.test(parsed.ext)) return path.format({
90
- dir: parsed.dir,
91
- name: parsed.name || trimmed,
92
- ext: ".jpg"
93
- });
94
- return path.format({
95
- dir: parsed.dir,
96
- name: parsed.name,
97
- ext: ".jpg"
98
- });
99
- }
100
- function logOptimizedImage(params) {
101
- if (!shouldLogVerbose()) return;
102
- if (params.optimized.optimizedSize >= params.originalSize) return;
103
- if (params.optimized.format === "png") {
104
- logVerbose(`Optimized PNG (preserving alpha) from ${formatMb(params.originalSize)}MB to ${formatMb(params.optimized.optimizedSize)}MB (side≤${params.optimized.resizeSide}px)`);
105
- return;
106
- }
107
- logVerbose(`Optimized media from ${formatMb(params.originalSize)}MB to ${formatMb(params.optimized.optimizedSize)}MB (side≤${params.optimized.resizeSide}px, q=${params.optimized.quality})`);
108
- }
109
- async function optimizeImageWithFallback(params) {
110
- const { buffer, cap, meta } = params;
111
- if ((meta?.contentType === "image/png" || meta?.fileName?.toLowerCase().endsWith(".png")) && await hasAlphaChannel(buffer)) {
112
- const optimized = await optimizeImageToPng(buffer, cap);
113
- if (optimized.buffer.length <= cap) return {
114
- ...optimized,
115
- format: "png"
116
- };
117
- if (shouldLogVerbose()) logVerbose(`PNG with alpha still exceeds ${formatMb(cap, 0)}MB after optimization; falling back to JPEG`);
118
- }
119
- return {
120
- ...await optimizeImageToJpeg(buffer, cap, meta),
121
- format: "jpeg"
122
- };
123
- }
124
- async function loadWebMediaInternal(mediaUrl, options = {}) {
125
- const { maxBytes, optimizeImages = true, ssrfPolicy, localRoots, sandboxValidated = false, readFile: readFileOverride } = options;
126
- mediaUrl = mediaUrl.replace(/^\s*MEDIA\s*:\s*/i, "");
127
- if (mediaUrl.startsWith("file://")) try {
128
- mediaUrl = fileURLToPath(mediaUrl);
129
- } catch {
130
- throw new LocalMediaAccessError("invalid-file-url", `Invalid file:// URL: ${mediaUrl}`);
131
- }
132
- const optimizeAndClampImage = async (buffer, cap, meta) => {
133
- const originalSize = buffer.length;
134
- const optimized = await optimizeImageWithFallback({
135
- buffer,
136
- cap,
137
- meta
138
- });
139
- logOptimizedImage({
140
- originalSize,
141
- optimized
142
- });
143
- if (optimized.buffer.length > cap) throw new Error(formatCapReduce("Media", cap, optimized.buffer.length));
144
- const contentType = optimized.format === "png" ? "image/png" : "image/jpeg";
145
- const fileName = optimized.format === "jpeg" && meta && isHeicSource(meta) ? toJpegFileName(meta.fileName) : meta?.fileName;
146
- return {
147
- buffer: optimized.buffer,
148
- contentType,
149
- kind: "image",
150
- fileName
151
- };
152
- };
153
- const clampAndFinalize = async (params) => {
154
- const cap = maxBytes !== void 0 ? maxBytes : maxBytesForKind(params.kind);
155
- if (params.kind === "image") {
156
- const isGif = params.contentType === "image/gif";
157
- if (isGif || !optimizeImages) {
158
- if (params.buffer.length > cap) throw new Error(formatCapLimit(isGif ? "GIF" : "Media", cap, params.buffer.length));
159
- return {
160
- buffer: params.buffer,
161
- contentType: params.contentType,
162
- kind: params.kind,
163
- fileName: params.fileName
164
- };
165
- }
166
- return { ...await optimizeAndClampImage(params.buffer, cap, {
167
- contentType: params.contentType,
168
- fileName: params.fileName
169
- }) };
170
- }
171
- if (params.buffer.length > cap) throw new Error(formatCapLimit("Media", cap, params.buffer.length));
172
- return {
173
- buffer: params.buffer,
174
- contentType: params.contentType ?? void 0,
175
- kind: params.kind,
176
- fileName: params.fileName
177
- };
178
- };
179
- if (/^https?:\/\//i.test(mediaUrl)) {
180
- const defaultFetchCap = maxBytesForKind("unknown");
181
- const { buffer, contentType, fileName } = await fetchRemoteMedia({
182
- url: mediaUrl,
183
- maxBytes: maxBytes === void 0 ? defaultFetchCap : optimizeImages ? Math.max(maxBytes, defaultFetchCap) : maxBytes,
184
- ssrfPolicy
185
- });
186
- return await clampAndFinalize({
187
- buffer,
188
- contentType,
189
- kind: kindFromMime(contentType),
190
- fileName
191
- });
192
- }
193
- if (mediaUrl.startsWith("~")) mediaUrl = resolveUserPath(mediaUrl);
194
- if ((sandboxValidated || localRoots === "any") && !readFileOverride) throw new LocalMediaAccessError("unsafe-bypass", "Refusing localRoots bypass without readFile override. Use sandboxValidated with readFile, or pass explicit localRoots.");
195
- if (!(sandboxValidated || localRoots === "any")) await assertLocalMediaAllowed(mediaUrl, localRoots);
196
- let data;
197
- if (readFileOverride) data = await readFileOverride(mediaUrl);
198
- else try {
199
- data = (await readLocalFileSafely({ filePath: mediaUrl })).buffer;
200
- } catch (err) {
201
- if (err instanceof SafeOpenError) {
202
- if (err.code === "not-found") throw new LocalMediaAccessError("not-found", `Local media file not found: ${mediaUrl}`, { cause: err });
203
- if (err.code === "not-file") throw new LocalMediaAccessError("not-file", `Local media path is not a file: ${mediaUrl}`, { cause: err });
204
- throw new LocalMediaAccessError("invalid-path", `Local media path is not safe to read: ${mediaUrl}`, { cause: err });
205
- }
206
- throw err;
207
- }
208
- const mime = await detectMime({
209
- buffer: data,
210
- filePath: mediaUrl
211
- });
212
- const kind = kindFromMime(mime);
213
- let fileName = path.basename(mediaUrl) || void 0;
214
- if (fileName && !path.extname(fileName) && mime) {
215
- const ext = extensionForMime(mime);
216
- if (ext) fileName = `${fileName}${ext}`;
217
- }
218
- return await clampAndFinalize({
219
- buffer: data,
220
- contentType: mime,
221
- kind,
222
- fileName
223
- });
224
- }
225
- async function loadWebMedia(mediaUrl, maxBytesOrOptions, options) {
226
- return await loadWebMediaInternal(mediaUrl, resolveWebMediaOptions({
227
- maxBytesOrOptions,
228
- options,
229
- optimizeImages: true
230
- }));
231
- }
232
- async function loadWebMediaRaw(mediaUrl, maxBytesOrOptions, options) {
233
- return await loadWebMediaInternal(mediaUrl, resolveWebMediaOptions({
234
- maxBytesOrOptions,
235
- options,
236
- optimizeImages: false
237
- }));
238
- }
239
- async function optimizeImageToJpeg(buffer, maxBytes, opts = {}) {
240
- let source = buffer;
241
- if (isHeicSource(opts)) try {
242
- source = await convertHeicToJpeg(buffer);
243
- } catch (err) {
244
- throw new Error(`HEIC image conversion failed: ${String(err)}`, { cause: err });
245
- }
246
- const sides = [
247
- 2048,
248
- 1536,
249
- 1280,
250
- 1024,
251
- 800
252
- ];
253
- const qualities = [
254
- 80,
255
- 70,
256
- 60,
257
- 50,
258
- 40
259
- ];
260
- let smallest = null;
261
- for (const side of sides) for (const quality of qualities) try {
262
- const out = await resizeToJpeg({
263
- buffer: source,
264
- maxSide: side,
265
- quality,
266
- withoutEnlargement: true
267
- });
268
- const size = out.length;
269
- if (!smallest || size < smallest.size) smallest = {
270
- buffer: out,
271
- size,
272
- resizeSide: side,
273
- quality
274
- };
275
- if (size <= maxBytes) return {
276
- buffer: out,
277
- optimizedSize: size,
278
- resizeSide: side,
279
- quality
280
- };
281
- } catch {}
282
- if (smallest) return {
283
- buffer: smallest.buffer,
284
- optimizedSize: smallest.size,
285
- resizeSide: smallest.resizeSide,
286
- quality: smallest.quality
287
- };
288
- throw new Error("Failed to optimize image");
289
- }
290
-
291
- //#endregion
292
- //#region src/markdown/fences.ts
293
- function parseFenceSpans(buffer) {
294
- const spans = [];
295
- let open;
296
- let offset = 0;
297
- while (offset <= buffer.length) {
298
- const nextNewline = buffer.indexOf("\n", offset);
299
- const lineEnd = nextNewline === -1 ? buffer.length : nextNewline;
300
- const line = buffer.slice(offset, lineEnd);
301
- const match = line.match(/^( {0,3})(`{3,}|~{3,})(.*)$/);
302
- if (match) {
303
- const indent = match[1];
304
- const marker = match[2];
305
- const markerChar = marker[0];
306
- const markerLen = marker.length;
307
- if (!open) open = {
308
- start: offset,
309
- markerChar,
310
- markerLen,
311
- openLine: line,
312
- marker,
313
- indent
314
- };
315
- else if (open.markerChar === markerChar && markerLen >= open.markerLen) {
316
- const end = lineEnd;
317
- spans.push({
318
- start: open.start,
319
- end,
320
- openLine: open.openLine,
321
- marker: open.marker,
322
- indent: open.indent
323
- });
324
- open = void 0;
325
- }
326
- }
327
- if (nextNewline === -1) break;
328
- offset = nextNewline + 1;
329
- }
330
- if (open) spans.push({
331
- start: open.start,
332
- end: buffer.length,
333
- openLine: open.openLine,
334
- marker: open.marker,
335
- indent: open.indent
336
- });
337
- return spans;
338
- }
339
- function findFenceSpanAt(spans, index) {
340
- return spans.find((span) => index > span.start && index < span.end);
341
- }
342
- function isSafeFenceBreak(spans, index) {
343
- return !findFenceSpanAt(spans, index);
344
- }
345
-
346
- //#endregion
347
- //#region src/shared/text-chunking.ts
348
- function chunkTextByBreakResolver(text, limit, resolveBreakIndex) {
349
- if (!text) return [];
350
- if (limit <= 0 || text.length <= limit) return [text];
351
- const chunks = [];
352
- let remaining = text;
353
- while (remaining.length > limit) {
354
- const candidateBreak = resolveBreakIndex(remaining.slice(0, limit));
355
- const breakIdx = Number.isFinite(candidateBreak) && candidateBreak > 0 && candidateBreak <= limit ? candidateBreak : limit;
356
- const chunk = remaining.slice(0, breakIdx).trimEnd();
357
- if (chunk.length > 0) chunks.push(chunk);
358
- const brokeOnSeparator = breakIdx < remaining.length && /\s/.test(remaining[breakIdx]);
359
- const nextStart = Math.min(remaining.length, breakIdx + (brokeOnSeparator ? 1 : 0));
360
- remaining = remaining.slice(nextStart).trimStart();
361
- }
362
- if (remaining.length) chunks.push(remaining);
363
- return chunks;
364
- }
365
-
366
- //#endregion
367
- //#region src/auto-reply/chunk.ts
368
- const DEFAULT_CHUNK_LIMIT = 4e3;
369
- const DEFAULT_CHUNK_MODE = "length";
370
- function resolveChunkLimitForProvider(cfgSection, accountId) {
371
- if (!cfgSection) return;
372
- const normalizedAccountId = normalizeAccountId(accountId);
373
- const accounts = cfgSection.accounts;
374
- if (accounts && typeof accounts === "object") {
375
- const direct = resolveAccountEntry(accounts, normalizedAccountId);
376
- if (typeof direct?.textChunkLimit === "number") return direct.textChunkLimit;
377
- }
378
- return cfgSection.textChunkLimit;
379
- }
380
- function resolveTextChunkLimit(cfg, provider, accountId, opts) {
381
- const fallback = typeof opts?.fallbackLimit === "number" && opts.fallbackLimit > 0 ? opts.fallbackLimit : DEFAULT_CHUNK_LIMIT;
382
- const providerOverride = (() => {
383
- if (!provider || provider === INTERNAL_MESSAGE_CHANNEL) return;
384
- return resolveChunkLimitForProvider((cfg?.channels)?.[provider] ?? cfg?.[provider], accountId);
385
- })();
386
- if (typeof providerOverride === "number" && providerOverride > 0) return providerOverride;
387
- return fallback;
388
- }
389
- function resolveChunkModeForProvider(cfgSection, accountId) {
390
- if (!cfgSection) return;
391
- const normalizedAccountId = normalizeAccountId(accountId);
392
- const accounts = cfgSection.accounts;
393
- if (accounts && typeof accounts === "object") {
394
- const direct = resolveAccountEntry(accounts, normalizedAccountId);
395
- if (direct?.chunkMode) return direct.chunkMode;
396
- }
397
- return cfgSection.chunkMode;
398
- }
399
- function resolveChunkMode(cfg, provider, accountId) {
400
- if (!provider || provider === INTERNAL_MESSAGE_CHANNEL) return DEFAULT_CHUNK_MODE;
401
- return resolveChunkModeForProvider((cfg?.channels)?.[provider] ?? cfg?.[provider], accountId) ?? DEFAULT_CHUNK_MODE;
402
- }
403
- /**
404
- * Split text on newlines, trimming line whitespace.
405
- * Blank lines are folded into the next non-empty line as leading "\n" prefixes.
406
- * Long lines can be split by length (default) or kept intact via splitLongLines:false.
407
- */
408
- function chunkByNewline(text, maxLineLength, opts) {
409
- if (!text) return [];
410
- if (maxLineLength <= 0) return text.trim() ? [text] : [];
411
- const splitLongLines = opts?.splitLongLines !== false;
412
- const trimLines = opts?.trimLines !== false;
413
- const lines = splitByNewline(text, opts?.isSafeBreak);
414
- const chunks = [];
415
- let pendingBlankLines = 0;
416
- for (const line of lines) {
417
- const trimmed = line.trim();
418
- if (!trimmed) {
419
- pendingBlankLines += 1;
420
- continue;
421
- }
422
- const maxPrefix = Math.max(0, maxLineLength - 1);
423
- const cappedBlankLines = pendingBlankLines > 0 ? Math.min(pendingBlankLines, maxPrefix) : 0;
424
- const prefix = cappedBlankLines > 0 ? "\n".repeat(cappedBlankLines) : "";
425
- pendingBlankLines = 0;
426
- const lineValue = trimLines ? trimmed : line;
427
- if (!splitLongLines || lineValue.length + prefix.length <= maxLineLength) {
428
- chunks.push(prefix + lineValue);
429
- continue;
430
- }
431
- const firstLimit = Math.max(1, maxLineLength - prefix.length);
432
- const first = lineValue.slice(0, firstLimit);
433
- chunks.push(prefix + first);
434
- const remaining = lineValue.slice(firstLimit);
435
- if (remaining) chunks.push(...chunkText(remaining, maxLineLength));
436
- }
437
- if (pendingBlankLines > 0 && chunks.length > 0) chunks[chunks.length - 1] += "\n".repeat(pendingBlankLines);
438
- return chunks;
439
- }
440
- /**
441
- * Split text into chunks on paragraph boundaries (blank lines), preserving lists and
442
- * single-newline line wraps inside paragraphs.
443
- *
444
- * - Only breaks at paragraph separators ("\n\n" or more, allowing whitespace on blank lines)
445
- * - Packs multiple paragraphs into a single chunk up to `limit`
446
- * - Falls back to length-based splitting when a single paragraph exceeds `limit`
447
- * (unless `splitLongParagraphs` is disabled)
448
- */
449
- function chunkByParagraph(text, limit, opts) {
450
- if (!text) return [];
451
- if (limit <= 0) return [text];
452
- const splitLongParagraphs = opts?.splitLongParagraphs !== false;
453
- const normalized = text.replace(/\r\n?/g, "\n");
454
- if (!/\n[\t ]*\n+/.test(normalized)) {
455
- if (normalized.length <= limit) return [normalized];
456
- if (!splitLongParagraphs) return [normalized];
457
- return chunkText(normalized, limit);
458
- }
459
- const spans = parseFenceSpans(normalized);
460
- const parts = [];
461
- const re = /\n[\t ]*\n+/g;
462
- let lastIndex = 0;
463
- for (const match of normalized.matchAll(re)) {
464
- const idx = match.index ?? 0;
465
- if (!isSafeFenceBreak(spans, idx)) continue;
466
- parts.push(normalized.slice(lastIndex, idx));
467
- lastIndex = idx + match[0].length;
468
- }
469
- parts.push(normalized.slice(lastIndex));
470
- const chunks = [];
471
- for (const part of parts) {
472
- const paragraph = part.replace(/\s+$/g, "");
473
- if (!paragraph.trim()) continue;
474
- if (paragraph.length <= limit) chunks.push(paragraph);
475
- else if (!splitLongParagraphs) chunks.push(paragraph);
476
- else chunks.push(...chunkText(paragraph, limit));
477
- }
478
- return chunks;
479
- }
480
- /**
481
- * Unified chunking function that dispatches based on mode.
482
- */
483
- function chunkTextWithMode(text, limit, mode) {
484
- if (mode === "newline") return chunkByParagraph(text, limit);
485
- return chunkText(text, limit);
486
- }
487
- function chunkMarkdownTextWithMode(text, limit, mode) {
488
- if (mode === "newline") {
489
- const paragraphChunks = chunkByParagraph(text, limit, { splitLongParagraphs: false });
490
- const out = [];
491
- for (const chunk of paragraphChunks) {
492
- const nested = chunkMarkdownText(chunk, limit);
493
- if (!nested.length && chunk) out.push(chunk);
494
- else out.push(...nested);
495
- }
496
- return out;
497
- }
498
- return chunkMarkdownText(text, limit);
499
- }
500
- function splitByNewline(text, isSafeBreak = () => true) {
501
- const lines = [];
502
- let start = 0;
503
- for (let i = 0; i < text.length; i++) if (text[i] === "\n" && isSafeBreak(i)) {
504
- lines.push(text.slice(start, i));
505
- start = i + 1;
506
- }
507
- lines.push(text.slice(start));
508
- return lines;
509
- }
510
- function resolveChunkEarlyReturn(text, limit) {
511
- if (!text) return [];
512
- if (limit <= 0) return [text];
513
- if (text.length <= limit) return [text];
514
- }
515
- function chunkText(text, limit) {
516
- const early = resolveChunkEarlyReturn(text, limit);
517
- if (early) return early;
518
- return chunkTextByBreakResolver(text, limit, (window) => {
519
- const { lastNewline, lastWhitespace } = scanParenAwareBreakpoints(window);
520
- return lastNewline > 0 ? lastNewline : lastWhitespace;
521
- });
522
- }
523
- function chunkMarkdownText(text, limit) {
524
- const early = resolveChunkEarlyReturn(text, limit);
525
- if (early) return early;
526
- const chunks = [];
527
- let remaining = text;
528
- while (remaining.length > limit) {
529
- const spans = parseFenceSpans(remaining);
530
- const softBreak = pickSafeBreakIndex(remaining.slice(0, limit), spans);
531
- let breakIdx = softBreak > 0 ? softBreak : limit;
532
- const initialFence = isSafeFenceBreak(spans, breakIdx) ? void 0 : findFenceSpanAt(spans, breakIdx);
533
- let fenceToSplit = initialFence;
534
- if (initialFence) {
535
- const closeLine = `${initialFence.indent}${initialFence.marker}`;
536
- const maxIdxIfNeedNewline = limit - (closeLine.length + 1);
537
- if (maxIdxIfNeedNewline <= 0) {
538
- fenceToSplit = void 0;
539
- breakIdx = limit;
540
- } else {
541
- const minProgressIdx = Math.min(remaining.length, initialFence.start + initialFence.openLine.length + 2);
542
- const maxIdxIfAlreadyNewline = limit - closeLine.length;
543
- let pickedNewline = false;
544
- let lastNewline = remaining.lastIndexOf("\n", Math.max(0, maxIdxIfAlreadyNewline - 1));
545
- while (lastNewline !== -1) {
546
- const candidateBreak = lastNewline + 1;
547
- if (candidateBreak < minProgressIdx) break;
548
- const candidateFence = findFenceSpanAt(spans, candidateBreak);
549
- if (candidateFence && candidateFence.start === initialFence.start) {
550
- breakIdx = Math.max(1, candidateBreak);
551
- pickedNewline = true;
552
- break;
553
- }
554
- lastNewline = remaining.lastIndexOf("\n", lastNewline - 1);
555
- }
556
- if (!pickedNewline) if (minProgressIdx > maxIdxIfAlreadyNewline) {
557
- fenceToSplit = void 0;
558
- breakIdx = limit;
559
- } else breakIdx = Math.max(minProgressIdx, maxIdxIfNeedNewline);
560
- }
561
- const fenceAtBreak = findFenceSpanAt(spans, breakIdx);
562
- fenceToSplit = fenceAtBreak && fenceAtBreak.start === initialFence.start ? fenceAtBreak : void 0;
563
- }
564
- let rawChunk = remaining.slice(0, breakIdx);
565
- if (!rawChunk) break;
566
- const brokeOnSeparator = breakIdx < remaining.length && /\s/.test(remaining[breakIdx]);
567
- const nextStart = Math.min(remaining.length, breakIdx + (brokeOnSeparator ? 1 : 0));
568
- let next = remaining.slice(nextStart);
569
- if (fenceToSplit) {
570
- const closeLine = `${fenceToSplit.indent}${fenceToSplit.marker}`;
571
- rawChunk = rawChunk.endsWith("\n") ? `${rawChunk}${closeLine}` : `${rawChunk}\n${closeLine}`;
572
- next = `${fenceToSplit.openLine}\n${next}`;
573
- } else next = stripLeadingNewlines(next);
574
- chunks.push(rawChunk);
575
- remaining = next;
576
- }
577
- if (remaining.length) chunks.push(remaining);
578
- return chunks;
579
- }
580
- function stripLeadingNewlines(value) {
581
- let i = 0;
582
- while (i < value.length && value[i] === "\n") i++;
583
- return i > 0 ? value.slice(i) : value;
584
- }
585
- function pickSafeBreakIndex(window, spans) {
586
- const { lastNewline, lastWhitespace } = scanParenAwareBreakpoints(window, (index) => isSafeFenceBreak(spans, index));
587
- if (lastNewline > 0) return lastNewline;
588
- if (lastWhitespace > 0) return lastWhitespace;
589
- return -1;
590
- }
591
- function scanParenAwareBreakpoints(window, isAllowed = () => true) {
592
- let lastNewline = -1;
593
- let lastWhitespace = -1;
594
- let depth = 0;
595
- for (let i = 0; i < window.length; i++) {
596
- if (!isAllowed(i)) continue;
597
- const char = window[i];
598
- if (char === "(") {
599
- depth += 1;
600
- continue;
601
- }
602
- if (char === ")" && depth > 0) {
603
- depth -= 1;
604
- continue;
605
- }
606
- if (depth !== 0) continue;
607
- if (char === "\n") lastNewline = i;
608
- else if (/\s/.test(char)) lastWhitespace = i;
609
- }
610
- return {
611
- lastNewline,
612
- lastWhitespace
613
- };
614
- }
615
-
616
- //#endregion
617
- //#region src/config/markdown-tables.ts
618
- const DEFAULT_TABLE_MODES = new Map([["signal", "bullets"], ["whatsapp", "bullets"]]);
619
- const isMarkdownTableMode = (value) => value === "off" || value === "bullets" || value === "code";
620
- function resolveMarkdownModeFromSection(section, accountId) {
621
- if (!section) return;
622
- const normalizedAccountId = normalizeAccountId(accountId);
623
- const accounts = section.accounts;
624
- if (accounts && typeof accounts === "object") {
625
- const matchMode = resolveAccountEntry(accounts, normalizedAccountId)?.markdown?.tables;
626
- if (isMarkdownTableMode(matchMode)) return matchMode;
627
- }
628
- const sectionMode = section.markdown?.tables;
629
- return isMarkdownTableMode(sectionMode) ? sectionMode : void 0;
630
- }
631
- function resolveMarkdownTableMode(params) {
632
- const channel = normalizeChannelId(params.channel);
633
- const defaultMode = channel ? DEFAULT_TABLE_MODES.get(channel) ?? "code" : "code";
634
- if (!channel || !params.cfg) return defaultMode;
635
- return resolveMarkdownModeFromSection(params.cfg.channels?.[channel] ?? params.cfg?.[channel], params.accountId) ?? defaultMode;
636
- }
637
-
638
- //#endregion
639
- //#region src/markdown/ir.ts
640
- function createMarkdownIt(options) {
641
- const md = new MarkdownIt({
642
- html: false,
643
- linkify: options.linkify ?? true,
644
- breaks: false,
645
- typographer: false
646
- });
647
- md.enable("strikethrough");
648
- if (options.tableMode && options.tableMode !== "off") md.enable("table");
649
- else md.disable("table");
650
- if (options.autolink === false) md.disable("autolink");
651
- return md;
652
- }
653
- function getAttr(token, name) {
654
- if (token.attrGet) return token.attrGet(name);
655
- if (token.attrs) {
656
- for (const [key, value] of token.attrs) if (key === name) return value;
657
- }
658
- return null;
659
- }
660
- function createTextToken(base, content) {
661
- return {
662
- ...base,
663
- type: "text",
664
- content,
665
- children: void 0
666
- };
667
- }
668
- function applySpoilerTokens(tokens) {
669
- for (const token of tokens) if (token.children && token.children.length > 0) token.children = injectSpoilersIntoInline(token.children);
670
- }
671
- function injectSpoilersIntoInline(tokens) {
672
- let totalDelims = 0;
673
- for (const token of tokens) {
674
- if (token.type !== "text") continue;
675
- const content = token.content ?? "";
676
- let i = 0;
677
- while (i < content.length) {
678
- const next = content.indexOf("||", i);
679
- if (next === -1) break;
680
- totalDelims += 1;
681
- i = next + 2;
682
- }
683
- }
684
- if (totalDelims < 2) return tokens;
685
- const usableDelims = totalDelims - totalDelims % 2;
686
- const result = [];
687
- const state = { spoilerOpen: false };
688
- let consumedDelims = 0;
689
- for (const token of tokens) {
690
- if (token.type !== "text") {
691
- result.push(token);
692
- continue;
693
- }
694
- const content = token.content ?? "";
695
- if (!content.includes("||")) {
696
- result.push(token);
697
- continue;
698
- }
699
- let index = 0;
700
- while (index < content.length) {
701
- const next = content.indexOf("||", index);
702
- if (next === -1) {
703
- if (index < content.length) result.push(createTextToken(token, content.slice(index)));
704
- break;
705
- }
706
- if (consumedDelims >= usableDelims) {
707
- result.push(createTextToken(token, content.slice(index)));
708
- break;
709
- }
710
- if (next > index) result.push(createTextToken(token, content.slice(index, next)));
711
- consumedDelims += 1;
712
- state.spoilerOpen = !state.spoilerOpen;
713
- result.push({ type: state.spoilerOpen ? "spoiler_open" : "spoiler_close" });
714
- index = next + 2;
715
- }
716
- }
717
- return result;
718
- }
719
- function initRenderTarget() {
720
- return {
721
- text: "",
722
- styles: [],
723
- openStyles: [],
724
- links: [],
725
- linkStack: []
726
- };
727
- }
728
- function resolveRenderTarget(state) {
729
- return state.table?.currentCell ?? state;
730
- }
731
- function appendText(state, value) {
732
- if (!value) return;
733
- const target = resolveRenderTarget(state);
734
- target.text += value;
735
- }
736
- function openStyle(state, style) {
737
- const target = resolveRenderTarget(state);
738
- target.openStyles.push({
739
- style,
740
- start: target.text.length
741
- });
742
- }
743
- function closeStyle(state, style) {
744
- const target = resolveRenderTarget(state);
745
- for (let i = target.openStyles.length - 1; i >= 0; i -= 1) if (target.openStyles[i]?.style === style) {
746
- const start = target.openStyles[i].start;
747
- target.openStyles.splice(i, 1);
748
- const end = target.text.length;
749
- if (end > start) target.styles.push({
750
- start,
751
- end,
752
- style
753
- });
754
- return;
755
- }
756
- }
757
- function appendParagraphSeparator(state) {
758
- if (state.env.listStack.length > 0) return;
759
- if (state.table) return;
760
- state.text += "\n\n";
761
- }
762
- function appendListPrefix(state) {
763
- const stack = state.env.listStack;
764
- const top = stack[stack.length - 1];
765
- if (!top) return;
766
- top.index += 1;
767
- const indent = " ".repeat(Math.max(0, stack.length - 1));
768
- const prefix = top.type === "ordered" ? `${top.index}. ` : "• ";
769
- state.text += `${indent}${prefix}`;
770
- }
771
- function renderInlineCode(state, content) {
772
- if (!content) return;
773
- const target = resolveRenderTarget(state);
774
- const start = target.text.length;
775
- target.text += content;
776
- target.styles.push({
777
- start,
778
- end: start + content.length,
779
- style: "code"
780
- });
781
- }
782
- function renderCodeBlock(state, content) {
783
- let code = content ?? "";
784
- if (!code.endsWith("\n")) code = `${code}\n`;
785
- const target = resolveRenderTarget(state);
786
- const start = target.text.length;
787
- target.text += code;
788
- target.styles.push({
789
- start,
790
- end: start + code.length,
791
- style: "code_block"
792
- });
793
- if (state.env.listStack.length === 0) target.text += "\n";
794
- }
795
- function handleLinkClose(state) {
796
- const target = resolveRenderTarget(state);
797
- const link = target.linkStack.pop();
798
- if (!link?.href) return;
799
- const href = link.href.trim();
800
- if (!href) return;
801
- const start = link.labelStart;
802
- const end = target.text.length;
803
- if (end <= start) {
804
- target.links.push({
805
- start,
806
- end,
807
- href
808
- });
809
- return;
810
- }
811
- target.links.push({
812
- start,
813
- end,
814
- href
815
- });
816
- }
817
- function initTableState() {
818
- return {
819
- headers: [],
820
- rows: [],
821
- currentRow: [],
822
- currentCell: null,
823
- inHeader: false
824
- };
825
- }
826
- function finishTableCell(cell) {
827
- closeRemainingStyles(cell);
828
- return {
829
- text: cell.text,
830
- styles: cell.styles,
831
- links: cell.links
832
- };
833
- }
834
- function trimCell(cell) {
835
- const text = cell.text;
836
- let start = 0;
837
- let end = text.length;
838
- while (start < end && /\s/.test(text[start] ?? "")) start += 1;
839
- while (end > start && /\s/.test(text[end - 1] ?? "")) end -= 1;
840
- if (start === 0 && end === text.length) return cell;
841
- const trimmedText = text.slice(start, end);
842
- const trimmedLength = trimmedText.length;
843
- const trimmedStyles = [];
844
- for (const span of cell.styles) {
845
- const sliceStart = Math.max(0, span.start - start);
846
- const sliceEnd = Math.min(trimmedLength, span.end - start);
847
- if (sliceEnd > sliceStart) trimmedStyles.push({
848
- start: sliceStart,
849
- end: sliceEnd,
850
- style: span.style
851
- });
852
- }
853
- const trimmedLinks = [];
854
- for (const span of cell.links) {
855
- const sliceStart = Math.max(0, span.start - start);
856
- const sliceEnd = Math.min(trimmedLength, span.end - start);
857
- if (sliceEnd > sliceStart) trimmedLinks.push({
858
- start: sliceStart,
859
- end: sliceEnd,
860
- href: span.href
861
- });
862
- }
863
- return {
864
- text: trimmedText,
865
- styles: trimmedStyles,
866
- links: trimmedLinks
867
- };
868
- }
869
- function appendCell(state, cell) {
870
- if (!cell.text) return;
871
- const start = state.text.length;
872
- state.text += cell.text;
873
- for (const span of cell.styles) state.styles.push({
874
- start: start + span.start,
875
- end: start + span.end,
876
- style: span.style
877
- });
878
- for (const link of cell.links) state.links.push({
879
- start: start + link.start,
880
- end: start + link.end,
881
- href: link.href
882
- });
883
- }
884
- function appendCellTextOnly(state, cell) {
885
- if (!cell.text) return;
886
- state.text += cell.text;
887
- }
888
- function appendTableBulletValue(state, params) {
889
- const { header, value, columnIndex, includeColumnFallback } = params;
890
- if (!value?.text) return;
891
- state.text += "• ";
892
- if (header?.text) {
893
- appendCell(state, header);
894
- state.text += ": ";
895
- } else if (includeColumnFallback) state.text += `Column ${columnIndex}: `;
896
- appendCell(state, value);
897
- state.text += "\n";
898
- }
899
- function renderTableAsBullets(state) {
900
- if (!state.table) return;
901
- const headers = state.table.headers.map(trimCell);
902
- const rows = state.table.rows.map((row) => row.map(trimCell));
903
- if (headers.length === 0 && rows.length === 0) return;
904
- if (headers.length > 1 && rows.length > 0) for (const row of rows) {
905
- if (row.length === 0) continue;
906
- const rowLabel = row[0];
907
- if (rowLabel?.text) {
908
- const labelStart = state.text.length;
909
- appendCell(state, rowLabel);
910
- const labelEnd = state.text.length;
911
- if (labelEnd > labelStart) state.styles.push({
912
- start: labelStart,
913
- end: labelEnd,
914
- style: "bold"
915
- });
916
- state.text += "\n";
917
- }
918
- for (let i = 1; i < row.length; i++) appendTableBulletValue(state, {
919
- header: headers[i],
920
- value: row[i],
921
- columnIndex: i,
922
- includeColumnFallback: true
923
- });
924
- state.text += "\n";
925
- }
926
- else for (const row of rows) {
927
- for (let i = 0; i < row.length; i++) appendTableBulletValue(state, {
928
- header: headers[i],
929
- value: row[i],
930
- columnIndex: i,
931
- includeColumnFallback: false
932
- });
933
- state.text += "\n";
934
- }
935
- }
936
- function renderTableAsCode(state) {
937
- if (!state.table) return;
938
- const headers = state.table.headers.map(trimCell);
939
- const rows = state.table.rows.map((row) => row.map(trimCell));
940
- const columnCount = Math.max(headers.length, ...rows.map((row) => row.length));
941
- if (columnCount === 0) return;
942
- const widths = Array.from({ length: columnCount }, () => 0);
943
- const updateWidths = (cells) => {
944
- for (let i = 0; i < columnCount; i += 1) {
945
- const width = cells[i]?.text.length ?? 0;
946
- if (widths[i] < width) widths[i] = width;
947
- }
948
- };
949
- updateWidths(headers);
950
- for (const row of rows) updateWidths(row);
951
- const codeStart = state.text.length;
952
- const appendRow = (cells) => {
953
- state.text += "|";
954
- for (let i = 0; i < columnCount; i += 1) {
955
- state.text += " ";
956
- const cell = cells[i];
957
- if (cell) appendCellTextOnly(state, cell);
958
- const pad = widths[i] - (cell?.text.length ?? 0);
959
- if (pad > 0) state.text += " ".repeat(pad);
960
- state.text += " |";
961
- }
962
- state.text += "\n";
963
- };
964
- const appendDivider = () => {
965
- state.text += "|";
966
- for (let i = 0; i < columnCount; i += 1) {
967
- const dashCount = Math.max(3, widths[i]);
968
- state.text += ` ${"-".repeat(dashCount)} |`;
969
- }
970
- state.text += "\n";
971
- };
972
- appendRow(headers);
973
- appendDivider();
974
- for (const row of rows) appendRow(row);
975
- const codeEnd = state.text.length;
976
- if (codeEnd > codeStart) state.styles.push({
977
- start: codeStart,
978
- end: codeEnd,
979
- style: "code_block"
980
- });
981
- if (state.env.listStack.length === 0) state.text += "\n";
982
- }
983
- function renderTokens(tokens, state) {
984
- for (const token of tokens) switch (token.type) {
985
- case "inline":
986
- if (token.children) renderTokens(token.children, state);
987
- break;
988
- case "text":
989
- appendText(state, token.content ?? "");
990
- break;
991
- case "em_open":
992
- openStyle(state, "italic");
993
- break;
994
- case "em_close":
995
- closeStyle(state, "italic");
996
- break;
997
- case "strong_open":
998
- openStyle(state, "bold");
999
- break;
1000
- case "strong_close":
1001
- closeStyle(state, "bold");
1002
- break;
1003
- case "s_open":
1004
- openStyle(state, "strikethrough");
1005
- break;
1006
- case "s_close":
1007
- closeStyle(state, "strikethrough");
1008
- break;
1009
- case "code_inline":
1010
- renderInlineCode(state, token.content ?? "");
1011
- break;
1012
- case "spoiler_open":
1013
- if (state.enableSpoilers) openStyle(state, "spoiler");
1014
- break;
1015
- case "spoiler_close":
1016
- if (state.enableSpoilers) closeStyle(state, "spoiler");
1017
- break;
1018
- case "link_open": {
1019
- const href = getAttr(token, "href") ?? "";
1020
- const target = resolveRenderTarget(state);
1021
- target.linkStack.push({
1022
- href,
1023
- labelStart: target.text.length
1024
- });
1025
- break;
1026
- }
1027
- case "link_close":
1028
- handleLinkClose(state);
1029
- break;
1030
- case "image":
1031
- appendText(state, token.content ?? "");
1032
- break;
1033
- case "softbreak":
1034
- case "hardbreak":
1035
- appendText(state, "\n");
1036
- break;
1037
- case "paragraph_close":
1038
- appendParagraphSeparator(state);
1039
- break;
1040
- case "heading_open":
1041
- if (state.headingStyle === "bold") openStyle(state, "bold");
1042
- break;
1043
- case "heading_close":
1044
- if (state.headingStyle === "bold") closeStyle(state, "bold");
1045
- appendParagraphSeparator(state);
1046
- break;
1047
- case "blockquote_open":
1048
- if (state.blockquotePrefix) state.text += state.blockquotePrefix;
1049
- openStyle(state, "blockquote");
1050
- break;
1051
- case "blockquote_close":
1052
- closeStyle(state, "blockquote");
1053
- break;
1054
- case "bullet_list_open":
1055
- if (state.env.listStack.length > 0) state.text += "\n";
1056
- state.env.listStack.push({
1057
- type: "bullet",
1058
- index: 0
1059
- });
1060
- break;
1061
- case "bullet_list_close":
1062
- state.env.listStack.pop();
1063
- if (state.env.listStack.length === 0) state.text += "\n";
1064
- break;
1065
- case "ordered_list_open": {
1066
- if (state.env.listStack.length > 0) state.text += "\n";
1067
- const start = Number(getAttr(token, "start") ?? "1");
1068
- state.env.listStack.push({
1069
- type: "ordered",
1070
- index: start - 1
1071
- });
1072
- break;
1073
- }
1074
- case "ordered_list_close":
1075
- state.env.listStack.pop();
1076
- if (state.env.listStack.length === 0) state.text += "\n";
1077
- break;
1078
- case "list_item_open":
1079
- appendListPrefix(state);
1080
- break;
1081
- case "list_item_close":
1082
- if (!state.text.endsWith("\n")) state.text += "\n";
1083
- break;
1084
- case "code_block":
1085
- case "fence":
1086
- renderCodeBlock(state, token.content ?? "");
1087
- break;
1088
- case "html_block":
1089
- case "html_inline":
1090
- appendText(state, token.content ?? "");
1091
- break;
1092
- case "table_open":
1093
- if (state.tableMode !== "off") {
1094
- state.table = initTableState();
1095
- state.hasTables = true;
1096
- }
1097
- break;
1098
- case "table_close":
1099
- if (state.table) {
1100
- if (state.tableMode === "bullets") renderTableAsBullets(state);
1101
- else if (state.tableMode === "code") renderTableAsCode(state);
1102
- }
1103
- state.table = null;
1104
- break;
1105
- case "thead_open":
1106
- if (state.table) state.table.inHeader = true;
1107
- break;
1108
- case "thead_close":
1109
- if (state.table) state.table.inHeader = false;
1110
- break;
1111
- case "tbody_open":
1112
- case "tbody_close": break;
1113
- case "tr_open":
1114
- if (state.table) state.table.currentRow = [];
1115
- break;
1116
- case "tr_close":
1117
- if (state.table) {
1118
- if (state.table.inHeader) state.table.headers = state.table.currentRow;
1119
- else state.table.rows.push(state.table.currentRow);
1120
- state.table.currentRow = [];
1121
- }
1122
- break;
1123
- case "th_open":
1124
- case "td_open":
1125
- if (state.table) state.table.currentCell = initRenderTarget();
1126
- break;
1127
- case "th_close":
1128
- case "td_close":
1129
- if (state.table?.currentCell) {
1130
- state.table.currentRow.push(finishTableCell(state.table.currentCell));
1131
- state.table.currentCell = null;
1132
- }
1133
- break;
1134
- case "hr":
1135
- state.text += "───\n\n";
1136
- break;
1137
- default:
1138
- if (token.children) renderTokens(token.children, state);
1139
- break;
1140
- }
1141
- }
1142
- function closeRemainingStyles(target) {
1143
- for (let i = target.openStyles.length - 1; i >= 0; i -= 1) {
1144
- const open = target.openStyles[i];
1145
- const end = target.text.length;
1146
- if (end > open.start) target.styles.push({
1147
- start: open.start,
1148
- end,
1149
- style: open.style
1150
- });
1151
- }
1152
- target.openStyles = [];
1153
- }
1154
- function clampStyleSpans(spans, maxLength) {
1155
- const clamped = [];
1156
- for (const span of spans) {
1157
- const start = Math.max(0, Math.min(span.start, maxLength));
1158
- const end = Math.max(start, Math.min(span.end, maxLength));
1159
- if (end > start) clamped.push({
1160
- start,
1161
- end,
1162
- style: span.style
1163
- });
1164
- }
1165
- return clamped;
1166
- }
1167
- function clampLinkSpans(spans, maxLength) {
1168
- const clamped = [];
1169
- for (const span of spans) {
1170
- const start = Math.max(0, Math.min(span.start, maxLength));
1171
- const end = Math.max(start, Math.min(span.end, maxLength));
1172
- if (end > start) clamped.push({
1173
- start,
1174
- end,
1175
- href: span.href
1176
- });
1177
- }
1178
- return clamped;
1179
- }
1180
- function mergeStyleSpans(spans) {
1181
- const sorted = [...spans].toSorted((a, b) => {
1182
- if (a.start !== b.start) return a.start - b.start;
1183
- if (a.end !== b.end) return a.end - b.end;
1184
- return a.style.localeCompare(b.style);
1185
- });
1186
- const merged = [];
1187
- for (const span of sorted) {
1188
- const prev = merged[merged.length - 1];
1189
- if (prev && prev.style === span.style && (span.start < prev.end || span.start === prev.end && span.style !== "blockquote")) {
1190
- prev.end = Math.max(prev.end, span.end);
1191
- continue;
1192
- }
1193
- merged.push({ ...span });
1194
- }
1195
- return merged;
1196
- }
1197
- function resolveSliceBounds(span, start, end) {
1198
- const sliceStart = Math.max(span.start, start);
1199
- const sliceEnd = Math.min(span.end, end);
1200
- if (sliceEnd <= sliceStart) return null;
1201
- return {
1202
- start: sliceStart,
1203
- end: sliceEnd
1204
- };
1205
- }
1206
- function sliceStyleSpans(spans, start, end) {
1207
- if (spans.length === 0) return [];
1208
- const sliced = [];
1209
- for (const span of spans) {
1210
- const bounds = resolveSliceBounds(span, start, end);
1211
- if (!bounds) continue;
1212
- sliced.push({
1213
- start: bounds.start - start,
1214
- end: bounds.end - start,
1215
- style: span.style
1216
- });
1217
- }
1218
- return mergeStyleSpans(sliced);
1219
- }
1220
- function sliceLinkSpans(spans, start, end) {
1221
- if (spans.length === 0) return [];
1222
- const sliced = [];
1223
- for (const span of spans) {
1224
- const bounds = resolveSliceBounds(span, start, end);
1225
- if (!bounds) continue;
1226
- sliced.push({
1227
- start: bounds.start - start,
1228
- end: bounds.end - start,
1229
- href: span.href
1230
- });
1231
- }
1232
- return sliced;
1233
- }
1234
- function markdownToIR(markdown, options = {}) {
1235
- return markdownToIRWithMeta(markdown, options).ir;
1236
- }
1237
- function markdownToIRWithMeta(markdown, options = {}) {
1238
- const env = { listStack: [] };
1239
- const tokens = createMarkdownIt(options).parse(markdown ?? "", env);
1240
- if (options.enableSpoilers) applySpoilerTokens(tokens);
1241
- const tableMode = options.tableMode ?? "off";
1242
- const state = {
1243
- text: "",
1244
- styles: [],
1245
- openStyles: [],
1246
- links: [],
1247
- linkStack: [],
1248
- env,
1249
- headingStyle: options.headingStyle ?? "none",
1250
- blockquotePrefix: options.blockquotePrefix ?? "",
1251
- enableSpoilers: options.enableSpoilers ?? false,
1252
- tableMode,
1253
- table: null,
1254
- hasTables: false
1255
- };
1256
- renderTokens(tokens, state);
1257
- closeRemainingStyles(state);
1258
- const trimmedLength = state.text.trimEnd().length;
1259
- let codeBlockEnd = 0;
1260
- for (const span of state.styles) {
1261
- if (span.style !== "code_block") continue;
1262
- if (span.end > codeBlockEnd) codeBlockEnd = span.end;
1263
- }
1264
- const finalLength = Math.max(trimmedLength, codeBlockEnd);
1265
- return {
1266
- ir: {
1267
- text: finalLength === state.text.length ? state.text : state.text.slice(0, finalLength),
1268
- styles: mergeStyleSpans(clampStyleSpans(state.styles, finalLength)),
1269
- links: clampLinkSpans(state.links, finalLength)
1270
- },
1271
- hasTables: state.hasTables
1272
- };
1273
- }
1274
- function chunkMarkdownIR(ir, limit) {
1275
- if (!ir.text) return [];
1276
- if (limit <= 0 || ir.text.length <= limit) return [ir];
1277
- const chunks = chunkText(ir.text, limit);
1278
- const results = [];
1279
- let cursor = 0;
1280
- chunks.forEach((chunk, index) => {
1281
- if (!chunk) return;
1282
- if (index > 0) while (cursor < ir.text.length && /\s/.test(ir.text[cursor] ?? "")) cursor += 1;
1283
- const start = cursor;
1284
- const end = Math.min(ir.text.length, start + chunk.length);
1285
- results.push({
1286
- text: chunk,
1287
- styles: sliceStyleSpans(ir.styles, start, end),
1288
- links: sliceLinkSpans(ir.links, start, end)
1289
- });
1290
- cursor = end;
1291
- });
1292
- return results;
1293
- }
1294
-
1295
- //#endregion
1296
- export { getDefaultLocalRoots as _, chunkByNewline as a, chunkMarkdownTextWithMode as c, resolveChunkMode as d, resolveTextChunkLimit as f, parseFenceSpans as g, isSafeFenceBreak as h, resolveMarkdownTableMode as i, chunkText as l, findFenceSpanAt as m, markdownToIR as n, chunkByParagraph as o, chunkTextByBreakResolver as p, markdownToIRWithMeta as r, chunkMarkdownText as s, chunkMarkdownIR as t, chunkTextWithMode as u, loadWebMedia as v, loadWebMediaRaw as y };