squidclaw 3.0.3 → 3.0.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.
- package/dist/{audio-preflight-BTYxAJjy.js → audio-preflight-BKgdc7dS.js} +4 -4
- package/dist/{audio-preflight-Dkl6Z32z.js → audio-preflight-DpCWFB4z.js} +4 -4
- package/dist/{audio-transcription-runner-Gi_h5HEE.js → audio-transcription-runner-B2BdTEps.js} +1 -1
- package/dist/{audio-transcription-runner-DBkDgluo.js → audio-transcription-runner-BnbdYMDl.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +6 -6
- package/dist/bundled/session-memory/handler.js +6 -6
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{chrome-CAd6FQEn.js → chrome-BQDCalPp.js} +8 -8
- package/dist/{chrome-pBkBuWci.js → chrome-CjxCwFA9.js} +8 -8
- package/dist/{command-registry-CvgCFxfY.js → command-registry-CxiSVXru.js} +6 -6
- package/dist/{completion-cli-BGM1V6EN.js → completion-cli-s0fxD0OE.js} +2 -2
- package/dist/{completion-cli-OrgUDc2S.js → completion-cli-slzdOlRV.js} +1 -1
- package/dist/{config-cli-DbBvjvpS.js → config-cli-C0mk9eRl.js} +1 -1
- package/dist/{config-cli-uIP4r17f.js → config-cli-DhHEA_Nc.js} +1 -1
- package/dist/{configure-BGvoAfbs.js → configure-CeLdVVyh.js} +8 -1
- package/dist/{configure-BOsTXjBw.js → configure-FRd92XZ8.js} +8 -1
- package/dist/{deliver-DBXe-ZmL.js → deliver-D-f6Wa3i.js} +1 -1
- package/dist/{deliver-BJuiq0GS.js → deliver-aL8yOYS1.js} +1 -1
- package/dist/{deliver-runtime-DHKcNQzq.js → deliver-runtime-ChVR6sR3.js} +3 -3
- package/dist/{deliver-runtime-GlnBJNCj.js → deliver-runtime-_egya0QZ.js} +3 -3
- package/dist/{deps-send-whatsapp.runtime-DdxKewuy.js → deps-send-whatsapp.runtime-CZj97m5A.js} +7 -7
- package/dist/{deps-send-whatsapp.runtime-CslTuV47.js → deps-send-whatsapp.runtime-CiG6xd2e.js} +7 -7
- package/dist/{doctor-completion-42wcUATu.js → doctor-completion-I-WDZUs1.js} +1 -1
- package/dist/{doctor-completion-D6RGDBD5.js → doctor-completion-mnJOkoQ_.js} +1 -1
- package/dist/entry.js +2 -2
- package/dist/extensionAPI.js +6 -6
- package/dist/{gateway-cli-CG3mshpO.js → gateway-cli-B5rTNvd7.js} +1 -1
- package/dist/{gateway-cli-BbPfLLT6.js → gateway-cli-BHfkbI0u.js} +1 -1
- package/dist/{image-j_UomzVG.js → image-C-C7hQ26.js} +1 -1
- package/dist/{image-sRW3RpTY.js → image-DKZCmkET.js} +1 -1
- package/dist/{image-runtime-BNh3IfMj.js → image-runtime-D7n4dID4.js} +3 -3
- package/dist/{image-runtime-SUtf9jqh.js → image-runtime-poRypm-b.js} +3 -3
- package/dist/index.js +1 -1
- package/dist/llm-slug-generator.js +6 -6
- package/dist/{onboard-ChxvwUze.js → onboard-BP2Cr_Xy.js} +1 -1
- package/dist/{onboard-1KfKwvMR.js → onboard-CCJCvPgf.js} +1 -1
- package/dist/{onboarding-D6kMb3yv.js → onboarding-D5G87dvM.js} +1 -1
- package/dist/{onboarding-DuUMPrqA.js → onboarding-D7CIbxzd.js} +1 -1
- package/dist/{onboarding.finalize-KTOhO1-l.js → onboarding.finalize-B1MmYTFV.js} +4 -4
- package/dist/{onboarding.finalize-bphDUwZy.js → onboarding.finalize-Cxzl-fYU.js} +3 -3
- package/dist/{pi-embedded-BP2UlUm_.js → pi-embedded-CHzwPt6X.js} +24 -24
- package/dist/{pi-embedded-BGz_qdCc.js → pi-embedded-MktS4l8v.js} +24 -24
- package/dist/{pi-embedded-helpers-CmLnmKlb.js → pi-embedded-helpers-Bse_QhEf.js} +3 -3
- package/dist/{pi-embedded-helpers-BruaFB5l.js → pi-embedded-helpers-DYWYzEOC.js} +3 -3
- package/dist/plugin-sdk/accounts-BNuRM3rG.js +288 -0
- package/dist/plugin-sdk/accounts-CGTYP7Rh.js +46 -0
- package/dist/plugin-sdk/accounts-CcS9IAhD.js +35 -0
- package/dist/plugin-sdk/{accounts-YTdQYQFr.js → accounts-CxUSDHsT.js} +3 -3
- package/dist/plugin-sdk/{accounts-h__dTrLK.js → accounts-PSzw-z3S.js} +2 -2
- package/dist/plugin-sdk/{accounts-DghIDNk2.js → accounts-kr-Gz1hk.js} +2 -2
- package/dist/plugin-sdk/{active-listener-_PRYjtJv.js → active-listener-BQNrTcR3.js} +2 -2
- package/dist/plugin-sdk/active-listener-CTsLn1AX.js +50 -0
- package/dist/plugin-sdk/{api-key-rotation-mVDSAkKQ.js → api-key-rotation-Bhck7wki.js} +2 -2
- package/dist/plugin-sdk/api-key-rotation-DE4gr5YM.js +181 -0
- package/dist/plugin-sdk/audio-preflight-CRGLqp-g.js +69 -0
- package/dist/plugin-sdk/{audio-preflight-BZlQM-qX.js → audio-preflight-_xgGaeho.js} +26 -26
- package/dist/plugin-sdk/{audio-transcription-runner-CrYTX8py.js → audio-transcription-runner-Dwc0Eh-B.js} +11 -11
- package/dist/plugin-sdk/audio-transcription-runner-RXsskMMk.js +2176 -0
- package/dist/plugin-sdk/audit-membership-runtime-B9b-zRwg.js +58 -0
- package/dist/plugin-sdk/{audit-membership-runtime-Xl20kCBe.js → audit-membership-runtime-DHQDvH4u.js} +2 -2
- package/dist/plugin-sdk/{channel-activity-gwxRn4wF.js → channel-activity-XajEg_DL.js} +3 -3
- package/dist/plugin-sdk/channel-activity-gPvD1D7S.js +94 -0
- package/dist/plugin-sdk/{channel-web-1WF-Nabe.js → channel-web-KtqCp4mz.js} +18 -18
- package/dist/plugin-sdk/channel-web-LGl1zPJt.js +2256 -0
- package/dist/plugin-sdk/chrome-9Y_LcUg1.js +2415 -0
- package/dist/plugin-sdk/{chrome-BXbYwXRH.js → chrome-diV5m81I.js} +6 -6
- package/dist/plugin-sdk/commands-registry-CcdEPxVg.js +1125 -0
- package/dist/plugin-sdk/{commands-registry-0w-aZenK.js → commands-registry-DwZAJuut.js} +4 -4
- package/dist/plugin-sdk/{common-DBOCt6Yv.js → common-CqnO92P8.js} +2 -2
- package/dist/plugin-sdk/config-CrQ5bCrw.js +17912 -0
- package/dist/plugin-sdk/{config-pRtEoVyZ.js → config-DYbtdrsT.js} +7 -7
- package/dist/plugin-sdk/deliver-D3xr5AkB.js +1694 -0
- package/dist/plugin-sdk/{deliver-FjlJrtZk.js → deliver-DG_7Uagn.js} +10 -10
- package/dist/plugin-sdk/deliver-runtime-B79ZQu69.js +32 -0
- package/dist/plugin-sdk/deliver-runtime-BdTC7uKE.js +32 -0
- package/dist/plugin-sdk/deps-send-discord.runtime-BOQZIqC8.js +23 -0
- package/dist/plugin-sdk/deps-send-discord.runtime-CObCNMt3.js +23 -0
- package/dist/plugin-sdk/deps-send-imessage.runtime-CuHOc9Ka.js +22 -0
- package/dist/plugin-sdk/deps-send-imessage.runtime-DlWgi2DH.js +22 -0
- package/dist/plugin-sdk/deps-send-signal.runtime-Cz7FT8J8.js +21 -0
- package/dist/plugin-sdk/deps-send-signal.runtime-iPynghkE.js +21 -0
- package/dist/plugin-sdk/deps-send-slack.runtime-D4vDoRsg.js +19 -0
- package/dist/plugin-sdk/deps-send-slack.runtime-DNTbE5jS.js +19 -0
- package/dist/plugin-sdk/deps-send-telegram.runtime-7CR-xtCF.js +24 -0
- package/dist/plugin-sdk/deps-send-telegram.runtime-DjTVED_m.js +24 -0
- package/dist/plugin-sdk/deps-send-whatsapp.runtime-CRWOIKRC.js +57 -0
- package/dist/plugin-sdk/deps-send-whatsapp.runtime-bUi8kghi.js +57 -0
- package/dist/plugin-sdk/diagnostic-BXkLYs_9.js +319 -0
- package/dist/plugin-sdk/{diagnostic-Dt2i3afe.js → diagnostic-CT7v_kM2.js} +2 -2
- package/dist/plugin-sdk/{errors-CgRPdp3o.js → errors-9oVz7reJ.js} +1 -1
- package/dist/plugin-sdk/errors-B8oJXuCF.js +54 -0
- package/dist/plugin-sdk/fetch-guard-C55uvn27.js +156 -0
- package/dist/plugin-sdk/{fetch-guard-DyPZh8r2.js → fetch-guard-Or5BCq0E.js} +2 -2
- package/dist/plugin-sdk/{fs-safe-DqCO1D4C.js → fs-safe-DFbwq9CS.js} +3 -3
- package/dist/plugin-sdk/fs-safe-Dqmpk-Fr.js +352 -0
- package/dist/plugin-sdk/image-3xW7IJdq.js +2310 -0
- package/dist/plugin-sdk/image-ops-BjK2qZZn.js +584 -0
- package/dist/plugin-sdk/{image-ops-sw0uZ0GN.js → image-ops-CMsocOob.js} +2 -2
- package/dist/plugin-sdk/image-runtime-CZZJJqcW.js +25 -0
- package/dist/plugin-sdk/image-runtime-Cjz368oj.js +25 -0
- package/dist/plugin-sdk/{image-CQ9TZ9vq.js → image-rycGCqJO.js} +6 -6
- package/dist/plugin-sdk/index.js +50 -50
- package/dist/plugin-sdk/ir-CS7uuQhN.js +1296 -0
- package/dist/plugin-sdk/{ir-BVZ5kUMb.js → ir-DihI2SIz.js} +7 -7
- package/dist/plugin-sdk/{local-roots-fO3ZgW3G.js → local-roots-1xVosTZ4.js} +4 -4
- package/dist/plugin-sdk/local-roots-DmOKwiNW.js +186 -0
- package/dist/plugin-sdk/{logger-DIb2cGHp.js → logger-Bg4vIUJn.js} +2 -2
- package/dist/plugin-sdk/logger-DDdrdbDu.js +1163 -0
- package/dist/plugin-sdk/login-BSEeU27Y.js +57 -0
- package/dist/plugin-sdk/{login-Dg5cxB_3.js → login-YhFrVUWo.js} +4 -4
- package/dist/plugin-sdk/login-qr-BwWJsDSj.js +320 -0
- package/dist/plugin-sdk/{login-qr-C3Vn30cq.js → login-qr-SpUTuwYv.js} +5 -5
- package/dist/plugin-sdk/manager-DiXPCubI.js +3917 -0
- package/dist/plugin-sdk/{manager-BR-TwWTH.js → manager-DrzOPeMD.js} +8 -8
- package/dist/plugin-sdk/manager-runtime-CF55pBNe.js +15 -0
- package/dist/plugin-sdk/manager-runtime-Ct0m9UJC.js +15 -0
- package/dist/plugin-sdk/mattermost.js +3 -3
- package/dist/plugin-sdk/{outbound-1a3Z_QJ2.js → outbound-Cc4cUn9K.js} +5 -5
- package/dist/plugin-sdk/outbound-attachment-BoFx05zw.js +19 -0
- package/dist/plugin-sdk/{outbound-attachment-BTQjD4YE.js → outbound-attachment-Dtp3hQgc.js} +2 -2
- package/dist/plugin-sdk/outbound-cpqK1GFe.js +212 -0
- package/dist/plugin-sdk/{path-alias-guards-TnxupPQC.js → path-alias-guards-DA0MhfkG.js} +1 -1
- package/dist/plugin-sdk/path-alias-guards-gBhrAn14.js +43 -0
- package/dist/plugin-sdk/paths-C6W4VHoa.js +166 -0
- package/dist/plugin-sdk/{paths-B7_75Pdr.js → paths-CP67O8eN.js} +1 -1
- package/dist/plugin-sdk/{pi-embedded-helpers-DZRNadD8.js → pi-embedded-helpers-BDJ_4Plh.js} +16 -16
- package/dist/plugin-sdk/pi-embedded-helpers-C-B9B6Sp.js +9627 -0
- package/dist/plugin-sdk/pi-model-discovery-BGEeoPzN.js +134 -0
- package/dist/plugin-sdk/{pi-model-discovery-DGh6xekX.js → pi-model-discovery-Mk0GTDJl.js} +1 -1
- package/dist/plugin-sdk/pi-model-discovery-runtime-BHZ_Htob.js +8 -0
- package/dist/plugin-sdk/pi-model-discovery-runtime-BrwtJHPU.js +8 -0
- package/dist/plugin-sdk/pi-tools.before-tool-call.runtime-ByN_xThw.js +354 -0
- package/dist/plugin-sdk/{pi-tools.before-tool-call.runtime-BZ9XgG_x.js → pi-tools.before-tool-call.runtime-DV72wTDb.js} +4 -4
- package/dist/plugin-sdk/plugins-D5cdn70e.js +864 -0
- package/dist/plugin-sdk/{plugins-B8pWVYug.js → plugins-DSs2-fnK.js} +4 -4
- package/dist/plugin-sdk/{proxy-env-BOlkiW1-.js → proxy-env-Ib4-LUh-.js} +1 -1
- package/dist/plugin-sdk/{proxy-fetch-Dt5BedH8.js → proxy-fetch-Cf3IUSDw.js} +1 -1
- package/dist/plugin-sdk/proxy-fetch-ZPEvp58f.js +38 -0
- package/dist/plugin-sdk/pw-ai-C_QOIuin.js +1938 -0
- package/dist/plugin-sdk/{pw-ai-C17A1o4w.js → pw-ai-DIx2wpkY.js} +9 -9
- package/dist/plugin-sdk/qmd-manager-6bozlfFg.js +1448 -0
- package/dist/plugin-sdk/{qmd-manager-Bei6TaFq.js → qmd-manager-Ov9ElEfG.js} +7 -7
- package/dist/plugin-sdk/{query-expansion-POz2za8a.js → query-expansion-CzjwW461.js} +4 -4
- package/dist/plugin-sdk/query-expansion-eeVz_aEm.js +1011 -0
- package/dist/plugin-sdk/{redact-9WsNyb7S.js → redact-BoNEjbpF.js} +1 -1
- package/dist/plugin-sdk/redact-DfACyt0X.js +319 -0
- package/dist/plugin-sdk/reply-CQUX_haM.js +98828 -0
- package/dist/plugin-sdk/{reply-BFbijn6_.js → reply-CWWUd_JS.js} +73 -73
- package/dist/plugin-sdk/{resolve-outbound-target-B9iFEh0y.js → resolve-outbound-target-BOkvxZtM.js} +2 -2
- package/dist/plugin-sdk/resolve-outbound-target-Dbz0O8cR.js +40 -0
- package/dist/plugin-sdk/run-with-concurrency-5DMu9szx.js +1994 -0
- package/dist/plugin-sdk/{run-with-concurrency-DmTrN5JG.js → run-with-concurrency-kVooFCVo.js} +1 -1
- package/dist/plugin-sdk/runtime-whatsapp-login.runtime-DitS0I1z.js +10 -0
- package/dist/plugin-sdk/runtime-whatsapp-login.runtime-OthrtsLL.js +10 -0
- package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-CYCr6A3v.js +19 -0
- package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-Q2HL0zL3.js +19 -0
- package/dist/plugin-sdk/send-BACEu1Un.js +414 -0
- package/dist/plugin-sdk/{send-BGZo6HW1.js → send-BP1fSEBR.js} +5 -5
- package/dist/plugin-sdk/send-BU4OoR7u.js +2587 -0
- package/dist/plugin-sdk/{send-BqkUDZed.js → send-BeLBlAsQ.js} +13 -13
- package/dist/plugin-sdk/{send-BisREGBZ.js → send-D9CSOGul.js} +6 -6
- package/dist/plugin-sdk/{send-D6_nNvi0.js → send-DLKxJJYV.js} +8 -8
- package/dist/plugin-sdk/send-DbxOJ_BC.js +3135 -0
- package/dist/plugin-sdk/{send-Dj7XEcZN.js → send-XZ6IXCtL.js} +7 -7
- package/dist/plugin-sdk/send-n932vjT5.js +540 -0
- package/dist/plugin-sdk/send-uCPS53j8.js +503 -0
- package/dist/plugin-sdk/session-DenDKR_-.js +169 -0
- package/dist/plugin-sdk/{session-D4KDs7Hq.js → session-DtLUYWvY.js} +3 -3
- package/dist/plugin-sdk/skill-commands-BK1KDKmS.js +342 -0
- package/dist/plugin-sdk/{skill-commands-D_xeseiI.js → skill-commands-Bv7EZypt.js} +4 -4
- package/dist/plugin-sdk/{skills-Bs2b3JfV.js → skills-BzXN4uev.js} +6 -6
- package/dist/plugin-sdk/skills-D4am-zkO.js +1428 -0
- package/dist/plugin-sdk/slash-commands.runtime-Bx1K1iqP.js +13 -0
- package/dist/plugin-sdk/slash-commands.runtime-DWfFqMZw.js +13 -0
- package/dist/plugin-sdk/slash-dispatch.runtime-DVn338JI.js +52 -0
- package/dist/plugin-sdk/slash-dispatch.runtime-pnWH5AjM.js +52 -0
- package/dist/plugin-sdk/slash-skill-commands.runtime-Dbi_YzPO.js +16 -0
- package/dist/plugin-sdk/slash-skill-commands.runtime-DxvNWv_E.js +16 -0
- package/dist/plugin-sdk/ssrf-2WBi1Tzx.js +202 -0
- package/dist/plugin-sdk/store-BKDMuvyn.js +81 -0
- package/dist/plugin-sdk/{store-B7ESm9_L.js → store-DnJhFFW5.js} +2 -2
- package/dist/plugin-sdk/subagent-registry-runtime-FhP0l-Rw.js +52 -0
- package/dist/plugin-sdk/subagent-registry-runtime-hH9ADku1.js +52 -0
- package/dist/plugin-sdk/{tables-1vhBJPK_.js → tables-CpmqssLF.js} +1 -1
- package/dist/plugin-sdk/tables-CrDYcv_b.js +55 -0
- package/dist/plugin-sdk/target-errors-aOwE-MIU.js +195 -0
- package/dist/plugin-sdk/{thinking-DjaClmzi.js → thinking-1UCPuD9d.js} +7 -7
- package/dist/plugin-sdk/thinking-D41FMh9T.js +1206 -0
- package/dist/plugin-sdk/{tokens-CLE20fRI.js → tokens-CTIYTLWu.js} +1 -1
- package/dist/plugin-sdk/tokens-DAL_5WHL.js +52 -0
- package/dist/plugin-sdk/{tool-images-B95xcwiR.js → tool-images-CWc54lpI.js} +2 -2
- package/dist/plugin-sdk/tool-images-RX4QTMnt.js +274 -0
- package/dist/plugin-sdk/web-AtEy-48y.js +56 -0
- package/dist/plugin-sdk/web-DjKONHqF.js +56 -0
- package/dist/plugin-sdk/{whatsapp-actions-BYpcWkTN.js → whatsapp-actions-BF6ih4Gi.js} +17 -17
- package/dist/plugin-sdk/whatsapp-actions-DEZcm_CZ.js +80 -0
- package/dist/plugin-sdk/whatsapp.js +50 -50
- package/dist/{program-xNEHPhT8.js → program-2J-jgdfk.js} +2 -2
- package/dist/{program-context-J_FyEsaS.js → program-context-SjYSWx_N.js} +8 -8
- package/dist/{prompt-select-styled-B1LjjgQ0.js → prompt-select-styled-Baiu3mAU.js} +1 -1
- package/dist/{prompt-select-styled-BRiogP_P.js → prompt-select-styled-DPnVmH8f.js} +1 -1
- package/dist/{pw-ai-7kHgUGj0.js → pw-ai-BwRP3TWc.js} +1 -1
- package/dist/{pw-ai-BmGrTicP.js → pw-ai-zFPBSxaL.js} +1 -1
- package/dist/{register.configure-DezZ4Q1p.js → register.configure-Ao1K2uze.js} +1 -1
- package/dist/{register.configure-C4p9ad2q.js → register.configure-CCkfhF-7.js} +1 -1
- package/dist/{register.maintenance-CzMKTC2a.js → register.maintenance-DMbs8w2m.js} +4 -4
- package/dist/{register.maintenance-CTvFmkAm.js → register.maintenance-pLpE2oF-.js} +5 -5
- package/dist/{register.onboard-C39xhpv1.js → register.onboard-Cb8xLIye.js} +2 -2
- package/dist/{register.onboard-DZt2kSAg.js → register.onboard-IMrHOeW_.js} +2 -2
- package/dist/{register.setup-04L_8wfA.js → register.setup-CX8IUmew.js} +2 -2
- package/dist/{register.setup-DWctFmOd.js → register.setup-DU7IDzAv.js} +2 -2
- package/dist/{register.subclis-C3TphbCF.js → register.subclis-BIbL6FBV.js} +3 -3
- package/dist/{run-main-7tknx04F.js → run-main-CpDZPsC_.js} +5 -5
- package/dist/{slash-dispatch.runtime-BL3qA1O3.js → slash-dispatch.runtime-DkcAYuyK.js} +6 -6
- package/dist/{slash-dispatch.runtime-Dh2L_3Tg.js → slash-dispatch.runtime-DuJRl-LD.js} +6 -6
- package/dist/{subagent-registry-runtime-MtjBCcgn.js → subagent-registry-runtime-BlRAnw80.js} +6 -6
- package/dist/{subagent-registry-runtime-BRNDawlJ.js → subagent-registry-runtime-COygB9b1.js} +6 -6
- package/dist/{update-cli-0UiUaT3q.js → update-cli-BwhvSo1R.js} +5 -5
- package/dist/{update-cli-C-uyQcFS.js → update-cli-TQEfxhWF.js} +4 -4
- package/dist/{web-D1ZoRVB0.js → web-DddJa7ZT.js} +6 -6
- package/dist/{web-B7kbCskR.js → web-DyCuTR9b.js} +6 -6
- package/package.json +7 -7
- package/dist/plugin-sdk/deliver-runtime-DEzvpBW1.js +0 -32
- package/dist/plugin-sdk/deps-send-discord.runtime-Bhusa_Hi.js +0 -23
- package/dist/plugin-sdk/deps-send-imessage.runtime-bmakPm5f.js +0 -22
- package/dist/plugin-sdk/deps-send-signal.runtime-n00sfFto.js +0 -21
- package/dist/plugin-sdk/deps-send-slack.runtime-BvM3Z-Mr.js +0 -19
- package/dist/plugin-sdk/deps-send-telegram.runtime-CPuMkcmo.js +0 -24
- package/dist/plugin-sdk/deps-send-whatsapp.runtime-BzO6S-KX.js +0 -57
- package/dist/plugin-sdk/image-runtime-17_mTqsy.js +0 -25
- package/dist/plugin-sdk/manager-runtime-CvI9wF8N.js +0 -15
- package/dist/plugin-sdk/pi-model-discovery-runtime-DjjBdPYt.js +0 -8
- package/dist/plugin-sdk/runtime-whatsapp-login.runtime-DzhkSmLi.js +0 -10
- package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-DyILWezU.js +0 -19
- package/dist/plugin-sdk/slash-commands.runtime-CUb5sqqf.js +0 -13
- package/dist/plugin-sdk/slash-dispatch.runtime-DCB6bGjB.js +0 -52
- package/dist/plugin-sdk/slash-skill-commands.runtime-BqEweE4K.js +0 -16
- package/dist/plugin-sdk/subagent-registry-runtime-CCUW4SbM.js +0 -52
- package/dist/plugin-sdk/web-DeRmHQ4_.js +0 -56
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { n as loadConfig } from "./config-
|
|
2
|
-
import { h as normalizeE164, y as resolveUserPath } from "./logger-
|
|
3
|
-
import { t as resolveIMessageAccount } from "./accounts-
|
|
4
|
-
import { m as kindFromMime } from "./image-ops-
|
|
5
|
-
import { s as resolveMarkdownTableMode } from "./ir-
|
|
6
|
-
import { t as resolveOutboundAttachmentFromUrl } from "./outbound-attachment-
|
|
7
|
-
import { t as convertMarkdownTables } from "./tables-
|
|
1
|
+
import { n as loadConfig } from "./config-DYbtdrsT.js";
|
|
2
|
+
import { h as normalizeE164, y as resolveUserPath } from "./logger-Bg4vIUJn.js";
|
|
3
|
+
import { t as resolveIMessageAccount } from "./accounts-PSzw-z3S.js";
|
|
4
|
+
import { m as kindFromMime } from "./image-ops-CMsocOob.js";
|
|
5
|
+
import { s as resolveMarkdownTableMode } from "./ir-DihI2SIz.js";
|
|
6
|
+
import { t as resolveOutboundAttachmentFromUrl } from "./outbound-attachment-Dtp3hQgc.js";
|
|
7
|
+
import { t as convertMarkdownTables } from "./tables-CpmqssLF.js";
|
|
8
8
|
import { spawn } from "node:child_process";
|
|
9
9
|
import { createInterface } from "node:readline";
|
|
10
10
|
|
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
import { n as loadConfig } from "./config-CrQ5bCrw.js";
|
|
2
|
+
import { m as kindFromMime } from "./image-ops-BjK2qZZn.js";
|
|
3
|
+
import { i as resolveSignalAccount } from "./accounts-CGTYP7Rh.js";
|
|
4
|
+
import { n as fetchWithTimeout } from "./fetch-timeout-D455O27U.js";
|
|
5
|
+
import { t as resolveFetch } from "./fetch-B_RcOnt9.js";
|
|
6
|
+
import { i as resolveMarkdownTableMode, n as markdownToIR, t as chunkMarkdownIR } from "./ir-CS7uuQhN.js";
|
|
7
|
+
import { n as generateSecureUuid } from "./secure-random-IkuYAMEf.js";
|
|
8
|
+
import { t as resolveOutboundAttachmentFromUrl } from "./outbound-attachment-BoFx05zw.js";
|
|
9
|
+
|
|
10
|
+
//#region src/signal/format.ts
|
|
11
|
+
function normalizeUrlForComparison(url) {
|
|
12
|
+
let normalized = url.toLowerCase();
|
|
13
|
+
normalized = normalized.replace(/^https?:\/\//, "");
|
|
14
|
+
normalized = normalized.replace(/^www\./, "");
|
|
15
|
+
normalized = normalized.replace(/\/+$/, "");
|
|
16
|
+
return normalized;
|
|
17
|
+
}
|
|
18
|
+
function mapStyle(style) {
|
|
19
|
+
switch (style) {
|
|
20
|
+
case "bold": return "BOLD";
|
|
21
|
+
case "italic": return "ITALIC";
|
|
22
|
+
case "strikethrough": return "STRIKETHROUGH";
|
|
23
|
+
case "code":
|
|
24
|
+
case "code_block": return "MONOSPACE";
|
|
25
|
+
case "spoiler": return "SPOILER";
|
|
26
|
+
default: return null;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function mergeStyles(styles) {
|
|
30
|
+
const sorted = [...styles].toSorted((a, b) => {
|
|
31
|
+
if (a.start !== b.start) return a.start - b.start;
|
|
32
|
+
if (a.length !== b.length) return a.length - b.length;
|
|
33
|
+
return a.style.localeCompare(b.style);
|
|
34
|
+
});
|
|
35
|
+
const merged = [];
|
|
36
|
+
for (const style of sorted) {
|
|
37
|
+
const prev = merged[merged.length - 1];
|
|
38
|
+
if (prev && prev.style === style.style && style.start <= prev.start + prev.length) {
|
|
39
|
+
const prevEnd = prev.start + prev.length;
|
|
40
|
+
prev.length = Math.max(prevEnd, style.start + style.length) - prev.start;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
merged.push({ ...style });
|
|
44
|
+
}
|
|
45
|
+
return merged;
|
|
46
|
+
}
|
|
47
|
+
function clampStyles(styles, maxLength) {
|
|
48
|
+
const clamped = [];
|
|
49
|
+
for (const style of styles) {
|
|
50
|
+
const start = Math.max(0, Math.min(style.start, maxLength));
|
|
51
|
+
const length = Math.min(style.start + style.length, maxLength) - start;
|
|
52
|
+
if (length > 0) clamped.push({
|
|
53
|
+
start,
|
|
54
|
+
length,
|
|
55
|
+
style: style.style
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return clamped;
|
|
59
|
+
}
|
|
60
|
+
function applyInsertionsToStyles(spans, insertions) {
|
|
61
|
+
if (insertions.length === 0) return spans;
|
|
62
|
+
const sortedInsertions = [...insertions].toSorted((a, b) => a.pos - b.pos);
|
|
63
|
+
let updated = spans;
|
|
64
|
+
let cumulativeShift = 0;
|
|
65
|
+
for (const insertion of sortedInsertions) {
|
|
66
|
+
const insertionPos = insertion.pos + cumulativeShift;
|
|
67
|
+
const next = [];
|
|
68
|
+
for (const span of updated) {
|
|
69
|
+
if (span.end <= insertionPos) {
|
|
70
|
+
next.push(span);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (span.start >= insertionPos) {
|
|
74
|
+
next.push({
|
|
75
|
+
start: span.start + insertion.length,
|
|
76
|
+
end: span.end + insertion.length,
|
|
77
|
+
style: span.style
|
|
78
|
+
});
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (span.start < insertionPos && span.end > insertionPos) {
|
|
82
|
+
if (insertionPos > span.start) next.push({
|
|
83
|
+
start: span.start,
|
|
84
|
+
end: insertionPos,
|
|
85
|
+
style: span.style
|
|
86
|
+
});
|
|
87
|
+
const shiftedStart = insertionPos + insertion.length;
|
|
88
|
+
const shiftedEnd = span.end + insertion.length;
|
|
89
|
+
if (shiftedEnd > shiftedStart) next.push({
|
|
90
|
+
start: shiftedStart,
|
|
91
|
+
end: shiftedEnd,
|
|
92
|
+
style: span.style
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
updated = next;
|
|
97
|
+
cumulativeShift += insertion.length;
|
|
98
|
+
}
|
|
99
|
+
return updated;
|
|
100
|
+
}
|
|
101
|
+
function renderSignalText(ir) {
|
|
102
|
+
const text = ir.text ?? "";
|
|
103
|
+
if (!text) return {
|
|
104
|
+
text: "",
|
|
105
|
+
styles: []
|
|
106
|
+
};
|
|
107
|
+
const sortedLinks = [...ir.links].toSorted((a, b) => a.start - b.start);
|
|
108
|
+
let out = "";
|
|
109
|
+
let cursor = 0;
|
|
110
|
+
const insertions = [];
|
|
111
|
+
for (const link of sortedLinks) {
|
|
112
|
+
if (link.start < cursor) continue;
|
|
113
|
+
out += text.slice(cursor, link.end);
|
|
114
|
+
const href = link.href.trim();
|
|
115
|
+
const trimmedLabel = text.slice(link.start, link.end).trim();
|
|
116
|
+
if (href) if (!trimmedLabel) {
|
|
117
|
+
out += href;
|
|
118
|
+
insertions.push({
|
|
119
|
+
pos: link.end,
|
|
120
|
+
length: href.length
|
|
121
|
+
});
|
|
122
|
+
} else {
|
|
123
|
+
const normalizedLabel = normalizeUrlForComparison(trimmedLabel);
|
|
124
|
+
let comparableHref = href;
|
|
125
|
+
if (href.startsWith("mailto:")) comparableHref = href.slice(7);
|
|
126
|
+
if (normalizedLabel !== normalizeUrlForComparison(comparableHref)) {
|
|
127
|
+
const addition = ` (${href})`;
|
|
128
|
+
out += addition;
|
|
129
|
+
insertions.push({
|
|
130
|
+
pos: link.end,
|
|
131
|
+
length: addition.length
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
cursor = link.end;
|
|
136
|
+
}
|
|
137
|
+
out += text.slice(cursor);
|
|
138
|
+
const adjusted = applyInsertionsToStyles(ir.styles.map((span) => {
|
|
139
|
+
const mapped = mapStyle(span.style);
|
|
140
|
+
if (!mapped) return null;
|
|
141
|
+
return {
|
|
142
|
+
start: span.start,
|
|
143
|
+
end: span.end,
|
|
144
|
+
style: mapped
|
|
145
|
+
};
|
|
146
|
+
}).filter((span) => span !== null), insertions);
|
|
147
|
+
const trimmedText = out.trimEnd();
|
|
148
|
+
const trimmedLength = trimmedText.length;
|
|
149
|
+
return {
|
|
150
|
+
text: trimmedText,
|
|
151
|
+
styles: mergeStyles(clampStyles(adjusted.map((span) => ({
|
|
152
|
+
start: span.start,
|
|
153
|
+
length: span.end - span.start,
|
|
154
|
+
style: span.style
|
|
155
|
+
})), trimmedLength))
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function markdownToSignalText(markdown, options = {}) {
|
|
159
|
+
return renderSignalText(markdownToIR(markdown ?? "", {
|
|
160
|
+
linkify: true,
|
|
161
|
+
enableSpoilers: true,
|
|
162
|
+
headingStyle: "bold",
|
|
163
|
+
blockquotePrefix: "> ",
|
|
164
|
+
tableMode: options.tableMode
|
|
165
|
+
}));
|
|
166
|
+
}
|
|
167
|
+
function sliceSignalStyles(styles, start, end) {
|
|
168
|
+
const sliced = [];
|
|
169
|
+
for (const style of styles) {
|
|
170
|
+
const styleEnd = style.start + style.length;
|
|
171
|
+
const sliceStart = Math.max(style.start, start);
|
|
172
|
+
const sliceEnd = Math.min(styleEnd, end);
|
|
173
|
+
if (sliceEnd > sliceStart) sliced.push({
|
|
174
|
+
start: sliceStart - start,
|
|
175
|
+
length: sliceEnd - sliceStart,
|
|
176
|
+
style: style.style
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return sliced;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Split Signal formatted text into chunks under the limit while preserving styles.
|
|
183
|
+
*
|
|
184
|
+
* This implementation deterministically tracks cursor position without using indexOf,
|
|
185
|
+
* which is fragile when chunks are trimmed or when duplicate substrings exist.
|
|
186
|
+
* Styles spanning chunk boundaries are split into separate ranges for each chunk.
|
|
187
|
+
*/
|
|
188
|
+
function splitSignalFormattedText(formatted, limit) {
|
|
189
|
+
const { text, styles } = formatted;
|
|
190
|
+
if (text.length <= limit) return [formatted];
|
|
191
|
+
const results = [];
|
|
192
|
+
let remaining = text;
|
|
193
|
+
let offset = 0;
|
|
194
|
+
while (remaining.length > 0) {
|
|
195
|
+
if (remaining.length <= limit) {
|
|
196
|
+
const trimmed = remaining.trimEnd();
|
|
197
|
+
if (trimmed.length > 0) results.push({
|
|
198
|
+
text: trimmed,
|
|
199
|
+
styles: mergeStyles(sliceSignalStyles(styles, offset, offset + trimmed.length))
|
|
200
|
+
});
|
|
201
|
+
break;
|
|
202
|
+
}
|
|
203
|
+
let breakIdx = findBreakIndex(remaining.slice(0, limit));
|
|
204
|
+
if (breakIdx <= 0) breakIdx = limit;
|
|
205
|
+
const chunk = remaining.slice(0, breakIdx).trimEnd();
|
|
206
|
+
if (chunk.length > 0) results.push({
|
|
207
|
+
text: chunk,
|
|
208
|
+
styles: mergeStyles(sliceSignalStyles(styles, offset, offset + chunk.length))
|
|
209
|
+
});
|
|
210
|
+
const brokeOnWhitespace = breakIdx < remaining.length && /\s/.test(remaining[breakIdx]);
|
|
211
|
+
const nextStart = Math.min(remaining.length, breakIdx + (brokeOnWhitespace ? 1 : 0));
|
|
212
|
+
remaining = remaining.slice(nextStart).trimStart();
|
|
213
|
+
offset = text.length - remaining.length;
|
|
214
|
+
}
|
|
215
|
+
return results;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Find the best break index within a text window.
|
|
219
|
+
* Prefers newlines over whitespace, avoids breaking inside parentheses.
|
|
220
|
+
*/
|
|
221
|
+
function findBreakIndex(window) {
|
|
222
|
+
let lastNewline = -1;
|
|
223
|
+
let lastWhitespace = -1;
|
|
224
|
+
let parenDepth = 0;
|
|
225
|
+
for (let i = 0; i < window.length; i++) {
|
|
226
|
+
const char = window[i];
|
|
227
|
+
if (char === "(") {
|
|
228
|
+
parenDepth++;
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
if (char === ")" && parenDepth > 0) {
|
|
232
|
+
parenDepth--;
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
if (parenDepth === 0) {
|
|
236
|
+
if (char === "\n") lastNewline = i;
|
|
237
|
+
else if (/\s/.test(char)) lastWhitespace = i;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return lastNewline > 0 ? lastNewline : lastWhitespace;
|
|
241
|
+
}
|
|
242
|
+
function markdownToSignalTextChunks(markdown, limit, options = {}) {
|
|
243
|
+
const chunks = chunkMarkdownIR(markdownToIR(markdown ?? "", {
|
|
244
|
+
linkify: true,
|
|
245
|
+
enableSpoilers: true,
|
|
246
|
+
headingStyle: "bold",
|
|
247
|
+
blockquotePrefix: "> ",
|
|
248
|
+
tableMode: options.tableMode
|
|
249
|
+
}), limit);
|
|
250
|
+
const results = [];
|
|
251
|
+
for (const chunk of chunks) {
|
|
252
|
+
const rendered = renderSignalText(chunk);
|
|
253
|
+
if (rendered.text.length > limit) results.push(...splitSignalFormattedText(rendered, limit));
|
|
254
|
+
else results.push(rendered);
|
|
255
|
+
}
|
|
256
|
+
return results;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
//#endregion
|
|
260
|
+
//#region src/signal/client.ts
|
|
261
|
+
const DEFAULT_TIMEOUT_MS = 1e4;
|
|
262
|
+
function normalizeBaseUrl(url) {
|
|
263
|
+
const trimmed = url.trim();
|
|
264
|
+
if (!trimmed) throw new Error("Signal base URL is required");
|
|
265
|
+
if (/^https?:\/\//i.test(trimmed)) return trimmed.replace(/\/+$/, "");
|
|
266
|
+
return `http://${trimmed}`.replace(/\/+$/, "");
|
|
267
|
+
}
|
|
268
|
+
function getRequiredFetch() {
|
|
269
|
+
const fetchImpl = resolveFetch();
|
|
270
|
+
if (!fetchImpl) throw new Error("fetch is not available");
|
|
271
|
+
return fetchImpl;
|
|
272
|
+
}
|
|
273
|
+
function parseSignalRpcResponse(text, status) {
|
|
274
|
+
let parsed;
|
|
275
|
+
try {
|
|
276
|
+
parsed = JSON.parse(text);
|
|
277
|
+
} catch (err) {
|
|
278
|
+
throw new Error(`Signal RPC returned malformed JSON (status ${status})`, { cause: err });
|
|
279
|
+
}
|
|
280
|
+
if (!parsed || typeof parsed !== "object") throw new Error(`Signal RPC returned invalid response envelope (status ${status})`);
|
|
281
|
+
const rpc = parsed;
|
|
282
|
+
const hasResult = Object.hasOwn(rpc, "result");
|
|
283
|
+
if (!rpc.error && !hasResult) throw new Error(`Signal RPC returned invalid response envelope (status ${status})`);
|
|
284
|
+
return rpc;
|
|
285
|
+
}
|
|
286
|
+
async function signalRpcRequest(method, params, opts) {
|
|
287
|
+
const baseUrl = normalizeBaseUrl(opts.baseUrl);
|
|
288
|
+
const id = generateSecureUuid();
|
|
289
|
+
const body = JSON.stringify({
|
|
290
|
+
jsonrpc: "2.0",
|
|
291
|
+
method,
|
|
292
|
+
params,
|
|
293
|
+
id
|
|
294
|
+
});
|
|
295
|
+
const res = await fetchWithTimeout(`${baseUrl}/api/v1/rpc`, {
|
|
296
|
+
method: "POST",
|
|
297
|
+
headers: { "Content-Type": "application/json" },
|
|
298
|
+
body
|
|
299
|
+
}, opts.timeoutMs ?? DEFAULT_TIMEOUT_MS, getRequiredFetch());
|
|
300
|
+
if (res.status === 201) return;
|
|
301
|
+
const text = await res.text();
|
|
302
|
+
if (!text) throw new Error(`Signal RPC empty response (status ${res.status})`);
|
|
303
|
+
const parsed = parseSignalRpcResponse(text, res.status);
|
|
304
|
+
if (parsed.error) {
|
|
305
|
+
const code = parsed.error.code ?? "unknown";
|
|
306
|
+
const msg = parsed.error.message ?? "Signal RPC error";
|
|
307
|
+
throw new Error(`Signal RPC ${code}: ${msg}`);
|
|
308
|
+
}
|
|
309
|
+
return parsed.result;
|
|
310
|
+
}
|
|
311
|
+
async function signalCheck(baseUrl, timeoutMs = DEFAULT_TIMEOUT_MS) {
|
|
312
|
+
const normalized = normalizeBaseUrl(baseUrl);
|
|
313
|
+
try {
|
|
314
|
+
const res = await fetchWithTimeout(`${normalized}/api/v1/check`, { method: "GET" }, timeoutMs, getRequiredFetch());
|
|
315
|
+
if (!res.ok) return {
|
|
316
|
+
ok: false,
|
|
317
|
+
status: res.status,
|
|
318
|
+
error: `HTTP ${res.status}`
|
|
319
|
+
};
|
|
320
|
+
return {
|
|
321
|
+
ok: true,
|
|
322
|
+
status: res.status,
|
|
323
|
+
error: null
|
|
324
|
+
};
|
|
325
|
+
} catch (err) {
|
|
326
|
+
return {
|
|
327
|
+
ok: false,
|
|
328
|
+
status: null,
|
|
329
|
+
error: err instanceof Error ? err.message : String(err)
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async function streamSignalEvents(params) {
|
|
334
|
+
const baseUrl = normalizeBaseUrl(params.baseUrl);
|
|
335
|
+
const url = new URL(`${baseUrl}/api/v1/events`);
|
|
336
|
+
if (params.account) url.searchParams.set("account", params.account);
|
|
337
|
+
const fetchImpl = resolveFetch();
|
|
338
|
+
if (!fetchImpl) throw new Error("fetch is not available");
|
|
339
|
+
const res = await fetchImpl(url, {
|
|
340
|
+
method: "GET",
|
|
341
|
+
headers: { Accept: "text/event-stream" },
|
|
342
|
+
signal: params.abortSignal
|
|
343
|
+
});
|
|
344
|
+
if (!res.ok || !res.body) throw new Error(`Signal SSE failed (${res.status} ${res.statusText || "error"})`);
|
|
345
|
+
const reader = res.body.getReader();
|
|
346
|
+
const decoder = new TextDecoder();
|
|
347
|
+
let buffer = "";
|
|
348
|
+
let currentEvent = {};
|
|
349
|
+
const flushEvent = () => {
|
|
350
|
+
if (!currentEvent.data && !currentEvent.event && !currentEvent.id) return;
|
|
351
|
+
params.onEvent({
|
|
352
|
+
event: currentEvent.event,
|
|
353
|
+
data: currentEvent.data,
|
|
354
|
+
id: currentEvent.id
|
|
355
|
+
});
|
|
356
|
+
currentEvent = {};
|
|
357
|
+
};
|
|
358
|
+
while (true) {
|
|
359
|
+
const { value, done } = await reader.read();
|
|
360
|
+
if (done) break;
|
|
361
|
+
buffer += decoder.decode(value, { stream: true });
|
|
362
|
+
let lineEnd = buffer.indexOf("\n");
|
|
363
|
+
while (lineEnd !== -1) {
|
|
364
|
+
let line = buffer.slice(0, lineEnd);
|
|
365
|
+
buffer = buffer.slice(lineEnd + 1);
|
|
366
|
+
if (line.endsWith("\r")) line = line.slice(0, -1);
|
|
367
|
+
if (line === "") {
|
|
368
|
+
flushEvent();
|
|
369
|
+
lineEnd = buffer.indexOf("\n");
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
if (line.startsWith(":")) {
|
|
373
|
+
lineEnd = buffer.indexOf("\n");
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
const [rawField, ...rest] = line.split(":");
|
|
377
|
+
const field = rawField.trim();
|
|
378
|
+
const rawValue = rest.join(":");
|
|
379
|
+
const value = rawValue.startsWith(" ") ? rawValue.slice(1) : rawValue;
|
|
380
|
+
if (field === "event") currentEvent.event = value;
|
|
381
|
+
else if (field === "data") currentEvent.data = currentEvent.data ? `${currentEvent.data}\n${value}` : value;
|
|
382
|
+
else if (field === "id") currentEvent.id = value;
|
|
383
|
+
lineEnd = buffer.indexOf("\n");
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
flushEvent();
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
//#endregion
|
|
390
|
+
//#region src/signal/rpc-context.ts
|
|
391
|
+
function resolveSignalRpcContext(opts, accountInfo) {
|
|
392
|
+
const hasBaseUrl = Boolean(opts.baseUrl?.trim());
|
|
393
|
+
const hasAccount = Boolean(opts.account?.trim());
|
|
394
|
+
const resolvedAccount = accountInfo || (!hasBaseUrl || !hasAccount ? resolveSignalAccount({
|
|
395
|
+
cfg: loadConfig(),
|
|
396
|
+
accountId: opts.accountId
|
|
397
|
+
}) : void 0);
|
|
398
|
+
const baseUrl = opts.baseUrl?.trim() || resolvedAccount?.baseUrl;
|
|
399
|
+
if (!baseUrl) throw new Error("Signal base URL is required");
|
|
400
|
+
return {
|
|
401
|
+
baseUrl,
|
|
402
|
+
account: opts.account?.trim() || resolvedAccount?.config.account?.trim()
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
//#endregion
|
|
407
|
+
//#region src/signal/send.ts
|
|
408
|
+
function parseTarget(raw) {
|
|
409
|
+
let value = raw.trim();
|
|
410
|
+
if (!value) throw new Error("Signal recipient is required");
|
|
411
|
+
if (value.toLowerCase().startsWith("signal:")) value = value.slice(7).trim();
|
|
412
|
+
const normalized = value.toLowerCase();
|
|
413
|
+
if (normalized.startsWith("group:")) return {
|
|
414
|
+
type: "group",
|
|
415
|
+
groupId: value.slice(6).trim()
|
|
416
|
+
};
|
|
417
|
+
if (normalized.startsWith("username:")) return {
|
|
418
|
+
type: "username",
|
|
419
|
+
username: value.slice(9).trim()
|
|
420
|
+
};
|
|
421
|
+
if (normalized.startsWith("u:")) return {
|
|
422
|
+
type: "username",
|
|
423
|
+
username: value.trim()
|
|
424
|
+
};
|
|
425
|
+
return {
|
|
426
|
+
type: "recipient",
|
|
427
|
+
recipient: value
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
function buildTargetParams(target, allow) {
|
|
431
|
+
if (target.type === "recipient") {
|
|
432
|
+
if (!allow.recipient) return null;
|
|
433
|
+
return { recipient: [target.recipient] };
|
|
434
|
+
}
|
|
435
|
+
if (target.type === "group") {
|
|
436
|
+
if (!allow.group) return null;
|
|
437
|
+
return { groupId: target.groupId };
|
|
438
|
+
}
|
|
439
|
+
if (target.type === "username") {
|
|
440
|
+
if (!allow.username) return null;
|
|
441
|
+
return { username: [target.username] };
|
|
442
|
+
}
|
|
443
|
+
return null;
|
|
444
|
+
}
|
|
445
|
+
async function sendMessageSignal(to, text, opts = {}) {
|
|
446
|
+
const cfg = opts.cfg ?? loadConfig();
|
|
447
|
+
const accountInfo = resolveSignalAccount({
|
|
448
|
+
cfg,
|
|
449
|
+
accountId: opts.accountId
|
|
450
|
+
});
|
|
451
|
+
const { baseUrl, account } = resolveSignalRpcContext(opts, accountInfo);
|
|
452
|
+
const target = parseTarget(to);
|
|
453
|
+
let message = text ?? "";
|
|
454
|
+
let messageFromPlaceholder = false;
|
|
455
|
+
let textStyles = [];
|
|
456
|
+
const textMode = opts.textMode ?? "markdown";
|
|
457
|
+
const maxBytes = (() => {
|
|
458
|
+
if (typeof opts.maxBytes === "number") return opts.maxBytes;
|
|
459
|
+
if (typeof accountInfo.config.mediaMaxMb === "number") return accountInfo.config.mediaMaxMb * 1024 * 1024;
|
|
460
|
+
if (typeof cfg.agents?.defaults?.mediaMaxMb === "number") return cfg.agents.defaults.mediaMaxMb * 1024 * 1024;
|
|
461
|
+
return 8 * 1024 * 1024;
|
|
462
|
+
})();
|
|
463
|
+
let attachments;
|
|
464
|
+
if (opts.mediaUrl?.trim()) {
|
|
465
|
+
const resolved = await resolveOutboundAttachmentFromUrl(opts.mediaUrl.trim(), maxBytes, { localRoots: opts.mediaLocalRoots });
|
|
466
|
+
attachments = [resolved.path];
|
|
467
|
+
const kind = kindFromMime(resolved.contentType ?? void 0);
|
|
468
|
+
if (!message && kind) {
|
|
469
|
+
message = kind === "image" ? "<media:image>" : `<media:${kind}>`;
|
|
470
|
+
messageFromPlaceholder = true;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
if (message.trim() && !messageFromPlaceholder) if (textMode === "plain") textStyles = opts.textStyles ?? [];
|
|
474
|
+
else {
|
|
475
|
+
const tableMode = resolveMarkdownTableMode({
|
|
476
|
+
cfg,
|
|
477
|
+
channel: "signal",
|
|
478
|
+
accountId: accountInfo.accountId
|
|
479
|
+
});
|
|
480
|
+
const formatted = markdownToSignalText(message, { tableMode });
|
|
481
|
+
message = formatted.text;
|
|
482
|
+
textStyles = formatted.styles;
|
|
483
|
+
}
|
|
484
|
+
if (!message.trim() && (!attachments || attachments.length === 0)) throw new Error("Signal send requires text or media");
|
|
485
|
+
const params = { message };
|
|
486
|
+
if (textStyles.length > 0) params["text-style"] = textStyles.map((style) => `${style.start}:${style.length}:${style.style}`);
|
|
487
|
+
if (account) params.account = account;
|
|
488
|
+
if (attachments && attachments.length > 0) params.attachments = attachments;
|
|
489
|
+
const targetParams = buildTargetParams(target, {
|
|
490
|
+
recipient: true,
|
|
491
|
+
group: true,
|
|
492
|
+
username: true
|
|
493
|
+
});
|
|
494
|
+
if (!targetParams) throw new Error("Signal recipient is required");
|
|
495
|
+
Object.assign(params, targetParams);
|
|
496
|
+
const timestamp = (await signalRpcRequest("send", params, {
|
|
497
|
+
baseUrl,
|
|
498
|
+
timeoutMs: opts.timeoutMs
|
|
499
|
+
}))?.timestamp;
|
|
500
|
+
return {
|
|
501
|
+
messageId: timestamp ? String(timestamp) : "unknown",
|
|
502
|
+
timestamp
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
async function sendTypingSignal(to, opts = {}) {
|
|
506
|
+
const { baseUrl, account } = resolveSignalRpcContext(opts);
|
|
507
|
+
const targetParams = buildTargetParams(parseTarget(to), {
|
|
508
|
+
recipient: true,
|
|
509
|
+
group: true
|
|
510
|
+
});
|
|
511
|
+
if (!targetParams) return false;
|
|
512
|
+
const params = { ...targetParams };
|
|
513
|
+
if (account) params.account = account;
|
|
514
|
+
if (opts.stop) params.stop = true;
|
|
515
|
+
await signalRpcRequest("sendTyping", params, {
|
|
516
|
+
baseUrl,
|
|
517
|
+
timeoutMs: opts.timeoutMs
|
|
518
|
+
});
|
|
519
|
+
return true;
|
|
520
|
+
}
|
|
521
|
+
async function sendReadReceiptSignal(to, targetTimestamp, opts = {}) {
|
|
522
|
+
if (!Number.isFinite(targetTimestamp) || targetTimestamp <= 0) return false;
|
|
523
|
+
const { baseUrl, account } = resolveSignalRpcContext(opts);
|
|
524
|
+
const targetParams = buildTargetParams(parseTarget(to), { recipient: true });
|
|
525
|
+
if (!targetParams) return false;
|
|
526
|
+
const params = {
|
|
527
|
+
...targetParams,
|
|
528
|
+
targetTimestamp,
|
|
529
|
+
type: opts.type ?? "read"
|
|
530
|
+
};
|
|
531
|
+
if (account) params.account = account;
|
|
532
|
+
await signalRpcRequest("sendReceipt", params, {
|
|
533
|
+
baseUrl,
|
|
534
|
+
timeoutMs: opts.timeoutMs
|
|
535
|
+
});
|
|
536
|
+
return true;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
//#endregion
|
|
540
|
+
export { signalCheck as a, markdownToSignalTextChunks as c, resolveSignalRpcContext as i, sendReadReceiptSignal as n, signalRpcRequest as o, sendTypingSignal as r, streamSignalEvents as s, sendMessageSignal as t };
|