squidclaw 3.0.13 → 3.0.14

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 (307) hide show
  1. package/dist/{accounts-PhtBJ8mA.js → accounts-BjEXPlGc.js} +1 -1
  2. package/dist/{accounts-Xp5W2xrR.js → accounts-CyBVeR-N.js} +1 -1
  3. package/dist/{accounts-BFC1okn9.js → accounts-D095MOmG.js} +7 -7
  4. package/dist/{acp-cli-Dt95OPXW.js → acp-cli-Dd2joFFS.js} +8 -8
  5. package/dist/{agent-scope-tUxfsPYq.js → agent-scope-C1XMay0T.js} +17 -17
  6. package/dist/{agents.config-DNPisWCH.js → agents.config-CRKsD30n.js} +2 -2
  7. package/dist/{api-key-rotation-Y59kKrr0.js → api-key-rotation-BcKKu9kK.js} +1 -1
  8. package/dist/{audio-preflight-DeBM0nTy.js → audio-preflight-g9rsstMv.js} +34 -34
  9. package/dist/{audio-transcription-runner-B7oPsr3U.js → audio-transcription-runner-Bnl3Ubjo.js} +23 -23
  10. package/dist/{audit-Bq3iosCf.js → audit-B4s_5Gn1.js} +29 -29
  11. package/dist/{auth-HYiP0mxx.js → auth-DHSeaNcB.js} +1 -1
  12. package/dist/{auth-choice-Du_pIfBh.js → auth-choice-C-7c5Td_.js} +13 -13
  13. package/dist/{auth-choice-CX8TDXmp.js → auth-choice-D7LiN5Ju.js} +11 -11
  14. package/dist/{auth-choice.apply-helpers-DRfHu1d8.js → auth-choice.apply-helpers-CxO2Wbq-.js} +1 -1
  15. package/dist/{auth-token-BQRI3c6e.js → auth-token-BxYYHBlc.js} +1 -1
  16. package/dist/{bonjour-discovery-BenDpM0y.js → bonjour-discovery-mtNewKSx.js} +1 -1
  17. package/dist/{browser-cli-Et8PyJjA.js → browser-cli-I1fzIVmS.js} +12 -12
  18. package/dist/build-info.json +2 -2
  19. package/dist/{call-DbkLm3eP.js → call-DkR5OGhh.js} +10 -10
  20. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  21. package/dist/{channel-account-context-C_WQRa6U.js → channel-account-context-e4ysObLI.js} +5 -5
  22. package/dist/{channel-activity-7kixHIgY.js → channel-activity-CCjlTlcN.js} +1 -1
  23. package/dist/{channel-options-D0TjqxeO.js → channel-options-BL5mHe-R.js} +3 -3
  24. package/dist/{channel-selection-BwbXcgj2.js → channel-selection-D_20zq3H.js} +1 -1
  25. package/dist/{channel-web-lfZ3VOOl.js → channel-web-C7Iij0H0.js} +16 -16
  26. package/dist/{channels-cli-Hr4vekE6.js → channels-cli-BMiEn81Y.js} +92 -92
  27. package/dist/{channels-status-issues-DeoqSoo-.js → channels-status-issues-N9kzQrD8.js} +1 -1
  28. package/dist/{chrome-gIqO4t7T.js → chrome-BNfSmFAM.js} +4 -4
  29. package/dist/{clawbot-cli-C-jGxnTq.js → clawbot-cli-B6-68gsT.js} +11 -11
  30. package/dist/cli/daemon-cli.js +1 -1
  31. package/dist/{cli-BH62lCfL.js → cli-ByaubO_B.js} +72 -72
  32. package/dist/{client-CeaUCJtL.js → client-BURktNyH.js} +2 -2
  33. package/dist/{command-secret-targets-BF4WzaME.js → command-secret-targets-WwcPUFAf.js} +4 -4
  34. package/dist/{commands-CD6EMOiw.js → commands-CiY9HjRt.js} +1 -1
  35. package/dist/{commands-registry-DCUj1QOi.js → commands-registry-0bpX7A_Q.js} +3 -3
  36. package/dist/{completion-cli-BIY_jjYY.js → completion-cli-8PdK97J-.js} +12 -12
  37. package/dist/{config-cli-DvNViMXW.js → config-cli-ClomIMw7.js} +7 -7
  38. package/dist/{config-guard-DwgnWjmj.js → config-guard-rLrk7eSS.js} +16 -16
  39. package/dist/{config-validation-CcqZ--gE.js → config-validation-BQEaXMk7.js} +3 -3
  40. package/dist/{configure-B5Zuhebc.js → configure-CoXGul3l.js} +17 -17
  41. package/dist/{control-ui-assets-x69xyZH-.js → control-ui-assets-Bz7TCLpb.js} +1 -1
  42. package/dist/{cron-cli-Bv-X4msQ.js → cron-cli-C3iKBccc.js} +11 -11
  43. package/dist/{daemon-cli-B-8-rGND.js → daemon-cli-BVcrlw5o.js} +15 -15
  44. package/dist/{daemon-install-2y4HHhYl.js → daemon-install-CXDWHEEO.js} +4 -4
  45. package/dist/{daemon-install-helpers-Cdo6Pryw.js → daemon-install-helpers-a4pGEsbA.js} +11 -11
  46. package/dist/{deliver-CVl43oM1.js → deliver-B1sllFkh.js} +7 -7
  47. package/dist/deliver-runtime-CaV7seKv.js +61 -0
  48. package/dist/deps-send-discord.runtime-DbS5pxta.js +36 -0
  49. package/dist/deps-send-imessage.runtime-Ji753_F7.js +35 -0
  50. package/dist/deps-send-signal.runtime-DLJqvPLf.js +34 -0
  51. package/dist/deps-send-slack.runtime-DrFxeZ1I.js +32 -0
  52. package/dist/{deps-send-telegram.runtime-C9lz8bf0.js → deps-send-telegram.runtime-CF-Ylrvr.js} +16 -16
  53. package/dist/deps-send-whatsapp.runtime-BOE0Ke6v.js +118 -0
  54. package/dist/{devices-cli-BT8K0hdG.js → devices-cli-Dn_norz3.js} +8 -8
  55. package/dist/{diagnostic-5bqrhGEp.js → diagnostic-CNl71AzW.js} +1 -1
  56. package/dist/{diagnostics-C0CazfQM.js → diagnostics-DZ99A0EW.js} +5 -5
  57. package/dist/{directory-cli-BZcT9ie1.js → directory-cli-ZzwXkW89.js} +7 -7
  58. package/dist/{dns-cli-CPYaeASu.js → dns-cli-DipYQjtY.js} +5 -5
  59. package/dist/{dock-CVTqzMqE.js → dock-C7N1CmcP.js} +4 -4
  60. package/dist/{docs-cli-C50vGyDh.js → docs-cli-C-Izm9Tb.js} +4 -4
  61. package/dist/{doctor-completion-Emprau8v.js → doctor-completion-CGmYWy0n.js} +2 -2
  62. package/dist/{doctor-config-flow-DSA-JE3n.js → doctor-config-flow-DDWA3Z2D.js} +15 -15
  63. package/dist/{enable-CAYj5OhY.js → enable-RJyJVP_B.js} +1 -1
  64. package/dist/{exec-approvals-allowlist-BO4EEQUI.js → exec-approvals-allowlist-Bu_oaDJC.js} +1 -1
  65. package/dist/{exec-approvals-cli-DSOHdWJR.js → exec-approvals-cli-Csducy9L.js} +16 -16
  66. package/dist/{exec-safe-bin-runtime-policy-CSnpe1AT.js → exec-safe-bin-runtime-policy-DRQwt8kj.js} +2 -2
  67. package/dist/{fetch-guard-VcWeni3c.js → fetch-guard-DNykKlIv.js} +1 -1
  68. package/dist/{fs-safe-CjHYKGbt.js → fs-safe-CKHYu4Vz.js} +24 -24
  69. package/dist/{gateway-cli-B2fScwuY.js → gateway-cli-CUph5Eqo.js} +152 -152
  70. package/dist/{gateway-rpc-DpqZnhyz.js → gateway-rpc-DoKw40aG.js} +1 -1
  71. package/dist/{health-BZcB9SMe.js → health-Cia3g9r1.js} +11 -11
  72. package/dist/{hooks-cli-BylHgZ52.js → hooks-cli-LDbU3XMU.js} +80 -80
  73. package/dist/{hooks-status-DqGd74DG.js → hooks-status-Dd_iWcBZ.js} +1 -1
  74. package/dist/{image-CulZw1up.js → image-D2a7rcK1.js} +5 -5
  75. package/dist/{image-ops-BpsIdA2j.js → image-ops-BIWika4g.js} +10 -10
  76. package/dist/image-runtime-DTxVPe7Z.js +55 -0
  77. package/dist/index.js +82 -82
  78. package/dist/{inspect-D5T8Bbzl.js → inspect-C3PHuODr.js} +4 -4
  79. package/dist/{install-safe-path-BoN-MLvX.js → install-safe-path-iCmVuopp.js} +25 -25
  80. package/dist/{installs-CPHMcmNj.js → installs-CyjlehlR.js} +9 -9
  81. package/dist/{ipv4-Bwl9ruCP.js → ipv4-CWVOQw5T.js} +1 -1
  82. package/dist/{ir-xnftdkOo.js → ir-BPM7rQYq.js} +8 -8
  83. package/dist/{issue-format-8t_ncgFx.js → issue-format-sA05c-6t.js} +1 -1
  84. package/dist/{json-files-DIEpaxUj.js → json-files-D6M304Qd.js} +8 -8
  85. package/dist/{lifecycle-core-DKiBjZdv.js → lifecycle-core-DsfZ6965.js} +5 -5
  86. package/dist/{local-roots-BrxGyJnb.js → local-roots-CMxJ8L4w.js} +3 -3
  87. package/dist/{login-CxDYXbgx.js → login-BjtBaVVG.js} +3 -3
  88. package/dist/{login-qr-zf4B1lpU.js → login-qr-JfRlpd7I.js} +6 -6
  89. package/dist/{logs-cli-CJAe1_dv.js → logs-cli-gv2Ql7GE.js} +9 -9
  90. package/dist/{manager-DBgRFvYb.js → manager-XeZQ6ws7.js} +14 -14
  91. package/dist/{manager-runtime-Dl31cGh-.js → manager-runtime-BvGqzQIY.js} +9 -9
  92. package/dist/{manifest-registry-Cx3mB9zS.js → manifest-registry-BaUPjNKb.js} +1 -1
  93. package/dist/{memory-cli-Bhoc-n_1.js → memory-cli-BUJHSsW6.js} +12 -12
  94. package/dist/{model-DYzjrxpA.js → model-Jy6fO59G.js} +2 -2
  95. package/dist/{model-catalog-kpDOW8eY.js → model-catalog-BfoWgIDd.js} +3 -3
  96. package/dist/{model-picker-BZwK54QT.js → model-picker-CxmHVCE1.js} +4 -4
  97. package/dist/{model-selection-ZV3PuYVR.js → model-selection-QgM_TOjC.js} +16 -16
  98. package/dist/{models-cli-BIxlIOFr.js → models-cli-DlbNL6it.js} +81 -81
  99. package/dist/{models-config-BLdDYoxi.js → models-config-DOD5jluc.js} +6 -6
  100. package/dist/{node-cli-6uYJccbd.js → node-cli-uJ5lFzxj.js} +33 -33
  101. package/dist/{node-command-policy-CKTXVa3D.js → node-command-policy-CwVo8Z1X.js} +1 -1
  102. package/dist/{node-service-DGPVb5ri.js → node-service-xGYkt3vb.js} +1 -1
  103. package/dist/{nodes-cli-CXLRfAYx.js → nodes-cli-eauCMbSr.js} +16 -16
  104. package/dist/{nodes-screen-C-tuRhA1.js → nodes-screen-iR_FzGNs.js} +7 -7
  105. package/dist/{npm-pack-install-DgSn7djE.js → npm-pack-install-s-mP9K0z.js} +18 -18
  106. package/dist/{npm-resolution-gw3vFNTB.js → npm-resolution-Ck7yFIM2.js} +4 -4
  107. package/dist/{onboard-CCaYDSO2.js → onboard-aISMp4Kt.js} +6 -6
  108. package/dist/{onboard-channels-DQnP5d3Y.js → onboard-channels-CELkEQUS.js} +21 -21
  109. package/dist/{onboard-custom-CJohrPzT.js → onboard-custom-BmAzWYbD.js} +4 -4
  110. package/dist/{onboard-helpers-Bcs_1b81.js → onboard-helpers-DRk4Y5uA.js} +10 -10
  111. package/dist/{onboard-hooks-A23nqe_3.js → onboard-hooks-lk1sMnDf.js} +4 -4
  112. package/dist/{onboard-remote-Hf9sTDHl.js → onboard-remote-Bj9cR8kF.js} +4 -4
  113. package/dist/{onboard-skills-Cpc8o6sG.js → onboard-skills-eRpyQ1la.js} +4 -4
  114. package/dist/{onboarding-wx00blu5.js → onboarding-Bl4RDn6W.js} +14 -14
  115. package/dist/{onboarding.finalize-B8wqvggG.js → onboarding.finalize-Bm7_INHb.js} +85 -85
  116. package/dist/{onboarding.gateway-config-CvWq5i_X.js → onboarding.gateway-config-BPyk6gwr.js} +18 -18
  117. package/dist/{onboarding.secret-input-CIN4p8mg.js → onboarding.secret-input-DlDt-I2O.js} +1 -1
  118. package/dist/{openai-model-default-BYfJa19m.js → openai-model-default-DnYP1Em1.js} +2 -2
  119. package/dist/{outbound-B3RZI-ai.js → outbound-BQtnr_z2.js} +3 -3
  120. package/dist/{outbound-attachment-BATDqOuj.js → outbound-attachment-WnXMTJC4.js} +2 -2
  121. package/dist/{pairing-cli-FMIw0yL6.js → pairing-cli-BsU-YnVT.js} +8 -8
  122. package/dist/{pairing-labels-MH31IXn_.js → pairing-labels-BXfoinTP.js} +1 -1
  123. package/dist/{pairing-store-KII9MIZX.js → pairing-store-C1FvWpDK.js} +3 -3
  124. package/dist/{path-alias-guards-B7H6jIIw.js → path-alias-guards-CCRXJArp.js} +3 -3
  125. package/dist/{path-safety-3wUzDqI9.js → path-safety-BWiXz6D4.js} +1 -1
  126. package/dist/{paths-BguvT84s.js → paths-Bg6h1q3v.js} +9 -9
  127. package/dist/{pi-embedded-helpers-D8WkqLZt.js → pi-embedded-helpers-DctimJJI.js} +6 -6
  128. package/dist/{pi-model-discovery-Bfyzj3Lq.js → pi-model-discovery-D63dINOn.js} +1 -1
  129. package/dist/{pi-model-discovery-runtime-nh-zh_Bp.js → pi-model-discovery-runtime-CcXGQcru.js} +5 -5
  130. package/dist/{pi-tools.before-tool-call.runtime-D4V6gUzq.js → pi-tools.before-tool-call.runtime-BMb_b90y.js} +5 -5
  131. package/dist/{pi-tools.policy-DCE9mhtw.js → pi-tools.policy-CXvZtJB7.js} +5 -5
  132. package/dist/{plugin-auto-enable-BJw5Rcbx.js → plugin-auto-enable-DMABTEO-.js} +3 -3
  133. package/dist/{plugin-registry-V0H8DaZf.js → plugin-registry-BSlUIHKX.js} +3 -3
  134. package/dist/plugin-sdk/accounts-B6gye1Jd.js +46 -0
  135. package/dist/plugin-sdk/accounts-C-BT6Po7.js +288 -0
  136. package/dist/plugin-sdk/accounts-DQDXV8eB.js +35 -0
  137. package/dist/plugin-sdk/active-listener-DZCohPuZ.js +50 -0
  138. package/dist/plugin-sdk/api-key-rotation-CrX0fvDj.js +181 -0
  139. package/dist/plugin-sdk/audio-preflight-xnWAFqH-.js +69 -0
  140. package/dist/plugin-sdk/audio-transcription-runner-BDmtq7-q.js +2176 -0
  141. package/dist/plugin-sdk/audit-membership-runtime-B9b-zRwg.js +58 -0
  142. package/dist/plugin-sdk/channel-activity-JjLRpUa_.js +94 -0
  143. package/dist/plugin-sdk/channel-web-DNWsxhYh.js +2256 -0
  144. package/dist/plugin-sdk/chrome-B5PWOUbr.js +2415 -0
  145. package/dist/plugin-sdk/commands-registry-BKeyJUxK.js +1125 -0
  146. package/dist/plugin-sdk/config-FhBFLsNm.js +17911 -0
  147. package/dist/plugin-sdk/deliver-DEbTlzFy.js +1694 -0
  148. package/dist/plugin-sdk/deliver-runtime-CO2uP-r9.js +32 -0
  149. package/dist/plugin-sdk/deps-send-discord.runtime-DIPW0tR4.js +23 -0
  150. package/dist/plugin-sdk/deps-send-imessage.runtime-ByGjRa1H.js +22 -0
  151. package/dist/plugin-sdk/deps-send-signal.runtime-Ca1awu4L.js +21 -0
  152. package/dist/plugin-sdk/deps-send-slack.runtime-CRzWCVkC.js +19 -0
  153. package/dist/plugin-sdk/deps-send-telegram.runtime-BWyavKp9.js +24 -0
  154. package/dist/plugin-sdk/deps-send-whatsapp.runtime-cC_XvHV8.js +57 -0
  155. package/dist/plugin-sdk/diagnostic-Dv9S12vm.js +319 -0
  156. package/dist/plugin-sdk/errors-B8oJXuCF.js +54 -0
  157. package/dist/plugin-sdk/fetch-guard-W_A4uSz2.js +156 -0
  158. package/dist/plugin-sdk/fs-safe-Dqmpk-Fr.js +352 -0
  159. package/dist/plugin-sdk/image-BSFy8d1M.js +2310 -0
  160. package/dist/plugin-sdk/image-ops-DN17S88I.js +584 -0
  161. package/dist/plugin-sdk/image-runtime-5YO31sjU.js +25 -0
  162. package/dist/plugin-sdk/imessage.js +2 -2
  163. package/dist/plugin-sdk/index.js +50 -50
  164. package/dist/plugin-sdk/ir-JaPZ0yKH.js +1296 -0
  165. package/dist/plugin-sdk/local-roots-BTW3ifco.js +186 -0
  166. package/dist/plugin-sdk/logger-DDdrdbDu.js +1163 -0
  167. package/dist/plugin-sdk/login-BXGRny-S.js +57 -0
  168. package/dist/plugin-sdk/login-qr-DTs92ap8.js +320 -0
  169. package/dist/plugin-sdk/manager-DzFj9oHX.js +3917 -0
  170. package/dist/plugin-sdk/manager-runtime-DrpyZvO0.js +15 -0
  171. package/dist/plugin-sdk/mattermost.js +3 -3
  172. package/dist/plugin-sdk/outbound-CQ7uBBML.js +212 -0
  173. package/dist/plugin-sdk/outbound-attachment-dTE6EVdX.js +19 -0
  174. package/dist/plugin-sdk/path-alias-guards-gBhrAn14.js +43 -0
  175. package/dist/plugin-sdk/paths-C6W4VHoa.js +166 -0
  176. package/dist/plugin-sdk/pi-embedded-helpers-CfzQPXDC.js +9627 -0
  177. package/dist/plugin-sdk/pi-model-discovery-Bt6B0MAj.js +134 -0
  178. package/dist/plugin-sdk/pi-model-discovery-runtime-BcgXpTmL.js +8 -0
  179. package/dist/plugin-sdk/pi-tools.before-tool-call.runtime-DYJQxhuo.js +354 -0
  180. package/dist/plugin-sdk/plugins-6NxPd6TS.js +864 -0
  181. package/dist/plugin-sdk/proxy-fetch-ZPEvp58f.js +38 -0
  182. package/dist/plugin-sdk/pw-ai-BFK39pwE.js +1938 -0
  183. package/dist/plugin-sdk/qmd-manager-6bozlfFg.js +1448 -0
  184. package/dist/plugin-sdk/query-expansion-eeVz_aEm.js +1011 -0
  185. package/dist/plugin-sdk/redact-BoNEjbpF.js +319 -0
  186. package/dist/plugin-sdk/reply-DgcrQBKL.js +98828 -0
  187. package/dist/plugin-sdk/resolve-outbound-target-CbaJ-kc2.js +40 -0
  188. package/dist/plugin-sdk/run-with-concurrency-5DMu9szx.js +1994 -0
  189. package/dist/plugin-sdk/runtime-whatsapp-login.runtime-jkgyeVsN.js +10 -0
  190. package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-DdLJJ1YC.js +19 -0
  191. package/dist/plugin-sdk/send-BSoMbeqA.js +3135 -0
  192. package/dist/plugin-sdk/send-Byyfc20_.js +503 -0
  193. package/dist/plugin-sdk/send-CI-xWEs7.js +2587 -0
  194. package/dist/plugin-sdk/send-DzP9EJqK.js +540 -0
  195. package/dist/plugin-sdk/send-MlSZ82sA.js +414 -0
  196. package/dist/plugin-sdk/session-DFy97tfW.js +169 -0
  197. package/dist/plugin-sdk/signal.js +2 -2
  198. package/dist/plugin-sdk/skill-commands-yum46YuA.js +342 -0
  199. package/dist/plugin-sdk/skills-DUphJGKn.js +1428 -0
  200. package/dist/plugin-sdk/slash-commands.runtime-5UW5KLyR.js +13 -0
  201. package/dist/plugin-sdk/slash-dispatch.runtime-4oQ2P_qo.js +52 -0
  202. package/dist/plugin-sdk/slash-skill-commands.runtime-y_mOLyS7.js +16 -0
  203. package/dist/plugin-sdk/ssrf-B3XRWBsP.js +202 -0
  204. package/dist/plugin-sdk/store-DFvIhzWZ.js +81 -0
  205. package/dist/plugin-sdk/subagent-registry-runtime-DtKXhKtl.js +52 -0
  206. package/dist/plugin-sdk/tables-bDM_jlLP.js +55 -0
  207. package/dist/{target-errors-DlzVutaL.js → plugin-sdk/target-errors-BVBW25Y3.js} +4 -4
  208. package/dist/plugin-sdk/thinking-Bu-w5mW5.js +1206 -0
  209. package/dist/plugin-sdk/tokens-CTIYTLWu.js +52 -0
  210. package/dist/plugin-sdk/tool-images-D0G_giwP.js +274 -0
  211. package/dist/plugin-sdk/web-DSXk7XCb.js +56 -0
  212. package/dist/plugin-sdk/whatsapp-actions-BOyA0Uuj.js +80 -0
  213. package/dist/{plugins-Cl_3OCyK.js → plugins-H53_4Gxb.js} +2 -2
  214. package/dist/{plugins-cli-CN2fty5U.js → plugins-cli-CQkxWdnt.js} +82 -82
  215. package/dist/{ports-Bop51hz6.js → ports-CKXuQJST.js} +2 -2
  216. package/dist/{ports-6i8smH3e.js → ports-CXjhFS7T.js} +1 -1
  217. package/dist/{program-context-ehHvCw9L.js → program-context-tphS7xu7.js} +41 -41
  218. package/dist/{prompt-select-styled-CSMviLJY.js → prompt-select-styled-DL2p1pfi.js} +40 -40
  219. package/dist/{provider-auth-helpers-CgNWlsqs.js → provider-auth-helpers-BqWiy-r-.js} +5 -5
  220. package/dist/{proxy-env-CRD7fbqp.js → proxy-env-D1tz4Z6a.js} +1 -1
  221. package/dist/{push-apns-DoYzx3tH.js → push-apns-C-YdARdy.js} +5 -5
  222. package/dist/{pw-ai-yKJj32B4.js → pw-ai-SVeR5d2o.js} +18 -18
  223. package/dist/{qmd-manager-AYDUTXmc.js → qmd-manager-B-XXhWVw.js} +20 -20
  224. package/dist/{qr-cli-cikAHfYn.js → qr-cli-B4fjHvn1.js} +2 -2
  225. package/dist/{query-expansion-CV2Z4_mS.js → query-expansion-Bf60ekMj.js} +12 -12
  226. package/dist/{redact-snapshot-C9T1079O.js → redact-snapshot-DRqM8Vla.js} +1 -1
  227. package/dist/{register.agent-BlxoyQt0.js → register.agent-BdiM0qkl.js} +97 -97
  228. package/dist/register.configure-wANXDbzQ.js +164 -0
  229. package/dist/{register.maintenance-C-Yv2mHK.js → register.maintenance-CMAt3Nl8.js} +93 -93
  230. package/dist/{register.message-CUNXtFOj.js → register.message-CbxQ5lgi.js} +73 -73
  231. package/dist/{register.onboard-BKXm1mL7.js → register.onboard-CbiTdKQX.js} +18 -18
  232. package/dist/{register.setup-DaT9AIAz.js → register.setup-KhsHMx2v.js} +21 -21
  233. package/dist/{register.status-health-sessions-7yZmSvUL.js → register.status-health-sessions-Bw5YDa_s.js} +86 -86
  234. package/dist/{reply-CeUYZhWu.js → reply-BWXzPVSJ.js} +149 -149
  235. package/dist/{rpc-BDpuIniF.js → rpc-DlN_W_L1.js} +1 -1
  236. package/dist/{runtime-Dw7Yw4OJ.js → runtime-Ci7mtLvH.js} +3 -3
  237. package/dist/{runtime-config-collectors-jhc1wDBg.js → runtime-config-collectors-CKmGmTQ5.js} +1 -1
  238. package/dist/{runtime-whatsapp-login.runtime-f293Z_er.js → runtime-whatsapp-login.runtime-Bxqt5jiO.js} +7 -7
  239. package/dist/runtime-whatsapp-outbound.runtime-B-UsXwvb.js +32 -0
  240. package/dist/{sandbox-BgsD1lf7.js → sandbox-Cuk1IWYT.js} +18 -18
  241. package/dist/{sandbox-cli-BnvmhiN9.js → sandbox-cli-BxgFeoAD.js} +25 -25
  242. package/dist/{secrets-cli-D7-K7P82.js → secrets-cli-DODLX29x.js} +11 -11
  243. package/dist/{security-cli-BFJAgNYH.js → security-cli-Ch83VrLP.js} +42 -42
  244. package/dist/{send-BvlkshC1.js → send-BfVgGHK6.js} +6 -6
  245. package/dist/{send-tK0H9nwq.js → send-Bw8LNCit.js} +5 -5
  246. package/dist/{send-CDms2FQA.js → send-C9UJKBSM.js} +4 -4
  247. package/dist/{send-CPFNtAP8.js → send-DX_fR45p.js} +11 -11
  248. package/dist/{send-C3Aeswif.js → send-FTQaNJPj.js} +8 -8
  249. package/dist/{server-OfKJG6Bo.js → server-Q9nnn04D.js} +20 -20
  250. package/dist/{server-context-B-0KzcZE.js → server-context-CX28l04l.js} +12 -12
  251. package/dist/{server-lifecycle-D6VNKVvQ.js → server-lifecycle-yAUMTJhv.js} +2 -2
  252. package/dist/{server-middleware-7cXowO4W.js → server-middleware-DIc4WJOS.js} +1 -1
  253. package/dist/{server-node-events-DWQhNK-0.js → server-node-events-qU3NTncQ.js} +73 -73
  254. package/dist/{service-Dk-UMipf.js → service-D4y0_Q5Z.js} +15 -15
  255. package/dist/{session-Da18ilJ0.js → session-CZJ5Ux6-.js} +1 -1
  256. package/dist/{sessions-CmjcNTJ3.js → sessions-C5H_BZSr.js} +15 -15
  257. package/dist/{shared-BzY0v0tS.js → shared-CxdBWgym.js} +3 -3
  258. package/dist/{shared-BcB-feC8.js → shared-DwNtcoQg.js} +1 -1
  259. package/dist/{skill-commands-BEWkEml_.js → skill-commands-BSRPnzXp.js} +5 -5
  260. package/dist/{skill-scanner-Bb5SMbCz.js → skill-scanner-rdr9cQew.js} +6 -6
  261. package/dist/{skills-Rnr7zPen.js → skills-BnBOxX1c.js} +3 -3
  262. package/dist/{skills-cli-BowIIIzH.js → skills-cli-CUgeYV1y.js} +5 -5
  263. package/dist/{skills-install-BLNCKuex.js → skills-install-BE04CZ6e.js} +6 -6
  264. package/dist/{skills-status-BCU-5otB.js → skills-status-DQw98BkG.js} +1 -1
  265. package/dist/{slash-commands.runtime-BgVgQ-Eh.js → slash-commands.runtime-BPtL2Qev.js} +11 -11
  266. package/dist/slash-dispatch.runtime-Cf9dq1k6.js +113 -0
  267. package/dist/{slash-skill-commands.runtime-4dOiU6U0.js → slash-skill-commands.runtime-9BYoANpd.js} +15 -15
  268. package/dist/{squidclaw-root-BcB7vo9M.js → squidclaw-root-CnE19yKj.js} +8 -8
  269. package/dist/{status-COTRBaam.js → status-rb5Jz-VU.js} +26 -26
  270. package/dist/{status.update-BUql4yz-.js → status.update-BNODJGA9.js} +2 -2
  271. package/dist/{store-aa15VM42.js → store-PDMRmC5Z.js} +5 -5
  272. package/dist/subagent-registry-runtime-CTiA365B.js +113 -0
  273. package/dist/{system-cli-CgCUbH_M.js → system-cli-DJYyTO07.js} +9 -9
  274. package/dist/{system-run-command-Ny1SbbOD.js → system-run-command-BgnCyvrj.js} +1 -1
  275. package/dist/{systemd-zbKl2Q3E.js → systemd-fP8tz4aL.js} +9 -9
  276. package/dist/{systemd-hints-C9_7ouv7.js → systemd-hints-BG_t__ZD.js} +6 -6
  277. package/dist/{systemd-linger-BM6JyzAr.js → systemd-linger-DgK8uuKY.js} +1 -1
  278. package/dist/{tables-jZMI8hLl.js → tables-DUSFF9-W.js} +1 -1
  279. package/dist/{tailnet-gTCqUBfJ.js → tailnet-CLkKVwDq.js} +1 -1
  280. package/dist/target-errors-BxwxgIDk.js +195 -0
  281. package/dist/{tool-images-DTl_LHMa.js → tool-images-FhSCiY-o.js} +1 -1
  282. package/dist/{tui-kDK-MAOc.js → tui-BMOMT-ma.js} +6 -6
  283. package/dist/{tui-cli-Dxy6fKkU.js → tui-cli-kqZ_-2Mz.js} +32 -32
  284. package/dist/{update-ZUTn6Jsu.js → update-blK9j2ag.js} +3 -3
  285. package/dist/{update-cli-D_QEiKyz.js → update-cli-gLKrP8UQ.js} +102 -102
  286. package/dist/{update-runner-DOXPSA_-.js → update-runner-C2UrF4oZ.js} +16 -16
  287. package/dist/web-VmjeceHS.js +117 -0
  288. package/dist/{webhooks-cli-D1iehjkP.js → webhooks-cli-BEXPBILa.js} +6 -6
  289. package/dist/{whatsapp-actions-hN5bwjWU.js → whatsapp-actions-DhiV181U.js} +17 -17
  290. package/dist/{with-timeout-BjaANd4G.js → with-timeout-BCAfkt03.js} +3 -3
  291. package/dist/{workspace-BITWyKG4.js → workspace-B-k5DNiQ.js} +1 -1
  292. package/dist/{workspace-dirs-B7O9BAHp.js → workspace-dirs-B2dNahfe.js} +1 -1
  293. package/dist/{ws-Bx8lpC1N.js → ws-DKt5HoA5.js} +2 -2
  294. package/dist/{wsl-wYxPJ8EO.js → wsl-CgxzAzRe.js} +2 -2
  295. package/package.json +1 -1
  296. package/dist/deliver-runtime-uwleBPlq.js +0 -61
  297. package/dist/deps-send-discord.runtime-CuZGpA7H.js +0 -36
  298. package/dist/deps-send-imessage.runtime-ByVW2alP.js +0 -35
  299. package/dist/deps-send-signal.runtime-Dl4GaCbQ.js +0 -34
  300. package/dist/deps-send-slack.runtime-BEV10FHj.js +0 -32
  301. package/dist/deps-send-whatsapp.runtime-Di0SEPNK.js +0 -118
  302. package/dist/image-runtime-B5Q4J9w2.js +0 -55
  303. package/dist/register.configure-CGptmTVZ.js +0 -164
  304. package/dist/runtime-whatsapp-outbound.runtime-uDhEmWe1.js +0 -32
  305. package/dist/slash-dispatch.runtime-D83FVeU7.js +0 -113
  306. package/dist/subagent-registry-runtime-CrT5RSO9.js +0 -113
  307. package/dist/web-DtSq_aUB.js +0 -117
@@ -0,0 +1,1206 @@
1
+ import { ot as normalizeAccountId } from "./run-with-concurrency-5DMu9szx.js";
2
+ import { i as resolveWhatsAppAccount, v as resolveAccountEntry } from "./accounts-C-BT6Po7.js";
3
+ import { Dt as requireActivePluginRegistry, vt as CHAT_CHANNEL_ORDER, yt as getChatChannelMeta } from "./config-FhBFLsNm.js";
4
+ import { S as normalizeE164, _ as escapeRegExp } from "./logger-DDdrdbDu.js";
5
+ import { C as resolveTelegramAccount, H as resolveDiscordAccount, L as normalizeWhatsAppTarget, M as resolveSlackAccount, N as resolveSlackReplyToMode } from "./plugins-6NxPd6TS.js";
6
+ import { r as resolveIMessageAccount } from "./accounts-DQDXV8eB.js";
7
+ import { i as resolveSignalAccount } from "./accounts-B6gye1Jd.js";
8
+
9
+ //#region src/config/types.tools.ts
10
+ const TOOLS_BY_SENDER_KEY_TYPES = [
11
+ "id",
12
+ "e164",
13
+ "username",
14
+ "name"
15
+ ];
16
+ function parseToolsBySenderTypedKey(rawKey) {
17
+ const trimmed = rawKey.trim();
18
+ if (!trimmed) return;
19
+ const lowered = trimmed.toLowerCase();
20
+ for (const type of TOOLS_BY_SENDER_KEY_TYPES) {
21
+ const prefix = `${type}:`;
22
+ if (!lowered.startsWith(prefix)) continue;
23
+ return {
24
+ type,
25
+ value: trimmed.slice(prefix.length)
26
+ };
27
+ }
28
+ }
29
+
30
+ //#endregion
31
+ //#region src/shared/string-normalization.ts
32
+ function normalizeStringEntries(list) {
33
+ return (list ?? []).map((entry) => String(entry).trim()).filter(Boolean);
34
+ }
35
+ function normalizeStringEntriesLower(list) {
36
+ return normalizeStringEntries(list).map((entry) => entry.toLowerCase());
37
+ }
38
+ function normalizeHyphenSlug(raw) {
39
+ const trimmed = raw?.trim().toLowerCase() ?? "";
40
+ if (!trimmed) return "";
41
+ return trimmed.replace(/\s+/g, "-").replace(/[^a-z0-9#@._+-]+/g, "-").replace(/-{2,}/g, "-").replace(/^[-.]+|[-.]+$/g, "");
42
+ }
43
+ function normalizeAtHashSlug(raw) {
44
+ const trimmed = raw?.trim().toLowerCase() ?? "";
45
+ if (!trimmed) return "";
46
+ return trimmed.replace(/^[@#]+/, "").replace(/[\s_]+/g, "-").replace(/[^a-z0-9-]+/g, "-").replace(/-{2,}/g, "-").replace(/^-+|-+$/g, "");
47
+ }
48
+
49
+ //#endregion
50
+ //#region src/config/group-policy.ts
51
+ function resolveChannelGroupConfig(groups, groupId, caseInsensitive = false) {
52
+ if (!groups) return;
53
+ const direct = groups[groupId];
54
+ if (direct) return direct;
55
+ if (!caseInsensitive) return;
56
+ const target = groupId.toLowerCase();
57
+ const matchedKey = Object.keys(groups).find((key) => key !== "*" && key.toLowerCase() === target);
58
+ if (!matchedKey) return;
59
+ return groups[matchedKey];
60
+ }
61
+ const warnedLegacyToolsBySenderKeys = /* @__PURE__ */ new Set();
62
+ const compiledToolsBySenderCache = /* @__PURE__ */ new WeakMap();
63
+ function normalizeSenderKey(value, options = {}) {
64
+ const trimmed = value.trim();
65
+ if (!trimmed) return "";
66
+ return (options.stripLeadingAt && trimmed.startsWith("@") ? trimmed.slice(1) : trimmed).toLowerCase();
67
+ }
68
+ function normalizeTypedSenderKey(value, type) {
69
+ return normalizeSenderKey(value, { stripLeadingAt: type === "username" });
70
+ }
71
+ function normalizeLegacySenderKey(value) {
72
+ return normalizeSenderKey(value, { stripLeadingAt: true });
73
+ }
74
+ function warnLegacyToolsBySenderKey(rawKey) {
75
+ const trimmed = rawKey.trim();
76
+ if (!trimmed || warnedLegacyToolsBySenderKeys.has(trimmed)) return;
77
+ warnedLegacyToolsBySenderKeys.add(trimmed);
78
+ process.emitWarning(`toolsBySender key "${trimmed}" is deprecated. Use explicit prefixes (id:, e164:, username:, name:). Legacy unprefixed keys are matched as id only.`, {
79
+ type: "DeprecationWarning",
80
+ code: "SQUIDCLAW_TOOLS_BY_SENDER_UNTYPED_KEY"
81
+ });
82
+ }
83
+ function parseSenderPolicyKey(rawKey) {
84
+ const trimmed = rawKey.trim();
85
+ if (!trimmed) return;
86
+ if (trimmed === "*") return { kind: "wildcard" };
87
+ const typed = parseToolsBySenderTypedKey(trimmed);
88
+ if (typed) {
89
+ const key = normalizeTypedSenderKey(typed.value, typed.type);
90
+ if (!key) return;
91
+ return {
92
+ kind: "typed",
93
+ type: typed.type,
94
+ key
95
+ };
96
+ }
97
+ warnLegacyToolsBySenderKey(trimmed);
98
+ const key = normalizeLegacySenderKey(trimmed);
99
+ if (!key) return;
100
+ return {
101
+ kind: "typed",
102
+ type: "id",
103
+ key
104
+ };
105
+ }
106
+ function createSenderPolicyBuckets() {
107
+ return {
108
+ id: /* @__PURE__ */ new Map(),
109
+ e164: /* @__PURE__ */ new Map(),
110
+ username: /* @__PURE__ */ new Map(),
111
+ name: /* @__PURE__ */ new Map()
112
+ };
113
+ }
114
+ function compileToolsBySenderPolicy(toolsBySender) {
115
+ const entries = Object.entries(toolsBySender);
116
+ if (entries.length === 0) return;
117
+ const buckets = createSenderPolicyBuckets();
118
+ let wildcard;
119
+ for (const [rawKey, policy] of entries) {
120
+ if (!policy) continue;
121
+ const parsed = parseSenderPolicyKey(rawKey);
122
+ if (!parsed) continue;
123
+ if (parsed.kind === "wildcard") {
124
+ wildcard = policy;
125
+ continue;
126
+ }
127
+ const bucket = buckets[parsed.type];
128
+ if (!bucket.has(parsed.key)) bucket.set(parsed.key, policy);
129
+ }
130
+ return {
131
+ buckets,
132
+ wildcard
133
+ };
134
+ }
135
+ function resolveCompiledToolsBySenderPolicy(toolsBySender) {
136
+ const cached = compiledToolsBySenderCache.get(toolsBySender);
137
+ if (cached) return cached;
138
+ const compiled = compileToolsBySenderPolicy(toolsBySender);
139
+ if (!compiled) return;
140
+ compiledToolsBySenderCache.set(toolsBySender, compiled);
141
+ return compiled;
142
+ }
143
+ function normalizeCandidate(value, type) {
144
+ const trimmed = value?.trim();
145
+ if (!trimmed) return "";
146
+ return normalizeTypedSenderKey(trimmed, type);
147
+ }
148
+ function normalizeSenderIdCandidates(value) {
149
+ const trimmed = value?.trim();
150
+ if (!trimmed) return [];
151
+ const typed = normalizeTypedSenderKey(trimmed, "id");
152
+ const legacy = normalizeLegacySenderKey(trimmed);
153
+ if (!typed) return legacy ? [legacy] : [];
154
+ if (!legacy || legacy === typed) return [typed];
155
+ return [typed, legacy];
156
+ }
157
+ function matchToolsBySenderPolicy(compiled, params) {
158
+ for (const senderIdCandidate of normalizeSenderIdCandidates(params.senderId)) {
159
+ const match = compiled.buckets.id.get(senderIdCandidate);
160
+ if (match) return match;
161
+ }
162
+ const senderE164 = normalizeCandidate(params.senderE164, "e164");
163
+ if (senderE164) {
164
+ const match = compiled.buckets.e164.get(senderE164);
165
+ if (match) return match;
166
+ }
167
+ const senderUsername = normalizeCandidate(params.senderUsername, "username");
168
+ if (senderUsername) {
169
+ const match = compiled.buckets.username.get(senderUsername);
170
+ if (match) return match;
171
+ }
172
+ const senderName = normalizeCandidate(params.senderName, "name");
173
+ if (senderName) {
174
+ const match = compiled.buckets.name.get(senderName);
175
+ if (match) return match;
176
+ }
177
+ return compiled.wildcard;
178
+ }
179
+ function resolveToolsBySender(params) {
180
+ const toolsBySender = params.toolsBySender;
181
+ if (!toolsBySender) return;
182
+ const compiled = resolveCompiledToolsBySenderPolicy(toolsBySender);
183
+ if (!compiled) return;
184
+ return matchToolsBySenderPolicy(compiled, params);
185
+ }
186
+ function resolveChannelGroups(cfg, channel, accountId) {
187
+ const normalizedAccountId = normalizeAccountId(accountId);
188
+ const channelConfig = cfg.channels?.[channel];
189
+ if (!channelConfig) return;
190
+ return resolveAccountEntry(channelConfig.accounts, normalizedAccountId)?.groups ?? channelConfig.groups;
191
+ }
192
+ function resolveChannelGroupPolicyMode(cfg, channel, accountId) {
193
+ const normalizedAccountId = normalizeAccountId(accountId);
194
+ const channelConfig = cfg.channels?.[channel];
195
+ if (!channelConfig) return;
196
+ return resolveAccountEntry(channelConfig.accounts, normalizedAccountId)?.groupPolicy ?? channelConfig.groupPolicy;
197
+ }
198
+ function resolveChannelGroupPolicy(params) {
199
+ const { cfg, channel } = params;
200
+ const groups = resolveChannelGroups(cfg, channel, params.accountId);
201
+ const groupPolicy = resolveChannelGroupPolicyMode(cfg, channel, params.accountId);
202
+ const hasGroups = Boolean(groups && Object.keys(groups).length > 0);
203
+ const allowlistEnabled = groupPolicy === "allowlist" || hasGroups;
204
+ const normalizedId = params.groupId?.trim();
205
+ const groupConfig = normalizedId ? resolveChannelGroupConfig(groups, normalizedId, params.groupIdCaseInsensitive) : void 0;
206
+ const defaultConfig = groups?.["*"];
207
+ const allowAll = allowlistEnabled && Boolean(groups && Object.hasOwn(groups, "*"));
208
+ const senderFilterBypass = groupPolicy === "allowlist" && !hasGroups && Boolean(params.hasGroupAllowFrom);
209
+ return {
210
+ allowlistEnabled,
211
+ allowed: groupPolicy === "disabled" ? false : !allowlistEnabled || allowAll || Boolean(groupConfig) || senderFilterBypass,
212
+ groupConfig,
213
+ defaultConfig
214
+ };
215
+ }
216
+ function resolveChannelGroupRequireMention(params) {
217
+ const { requireMentionOverride, overrideOrder = "after-config" } = params;
218
+ const { groupConfig, defaultConfig } = resolveChannelGroupPolicy(params);
219
+ const configMention = typeof groupConfig?.requireMention === "boolean" ? groupConfig.requireMention : typeof defaultConfig?.requireMention === "boolean" ? defaultConfig.requireMention : void 0;
220
+ if (overrideOrder === "before-config" && typeof requireMentionOverride === "boolean") return requireMentionOverride;
221
+ if (typeof configMention === "boolean") return configMention;
222
+ if (overrideOrder !== "before-config" && typeof requireMentionOverride === "boolean") return requireMentionOverride;
223
+ return true;
224
+ }
225
+ function resolveChannelGroupToolsPolicy(params) {
226
+ const { groupConfig, defaultConfig } = resolveChannelGroupPolicy(params);
227
+ const groupSenderPolicy = resolveToolsBySender({
228
+ toolsBySender: groupConfig?.toolsBySender,
229
+ senderId: params.senderId,
230
+ senderName: params.senderName,
231
+ senderUsername: params.senderUsername,
232
+ senderE164: params.senderE164
233
+ });
234
+ if (groupSenderPolicy) return groupSenderPolicy;
235
+ if (groupConfig?.tools) return groupConfig.tools;
236
+ const defaultSenderPolicy = resolveToolsBySender({
237
+ toolsBySender: defaultConfig?.toolsBySender,
238
+ senderId: params.senderId,
239
+ senderName: params.senderName,
240
+ senderUsername: params.senderUsername,
241
+ senderE164: params.senderE164
242
+ });
243
+ if (defaultSenderPolicy) return defaultSenderPolicy;
244
+ if (defaultConfig?.tools) return defaultConfig.tools;
245
+ }
246
+
247
+ //#endregion
248
+ //#region src/channels/plugins/normalize/shared.ts
249
+ function trimMessagingTarget(raw) {
250
+ return raw.trim() || void 0;
251
+ }
252
+ function looksLikeHandleOrPhoneTarget(params) {
253
+ const trimmed = params.raw.trim();
254
+ if (!trimmed) return false;
255
+ if (params.prefixPattern.test(trimmed)) return true;
256
+ if (trimmed.includes("@")) return true;
257
+ return (params.phonePattern ?? /^\+?\d{3,}$/).test(trimmed);
258
+ }
259
+
260
+ //#endregion
261
+ //#region src/channels/plugins/normalize/whatsapp.ts
262
+ function normalizeWhatsAppMessagingTarget(raw) {
263
+ const trimmed = trimMessagingTarget(raw);
264
+ if (!trimmed) return;
265
+ return normalizeWhatsAppTarget(trimmed) ?? void 0;
266
+ }
267
+ function normalizeWhatsAppAllowFromEntries(allowFrom) {
268
+ return allowFrom.map((entry) => String(entry).trim()).filter((entry) => Boolean(entry)).map((entry) => entry === "*" ? entry : normalizeWhatsAppTarget(entry)).filter((entry) => Boolean(entry));
269
+ }
270
+ function looksLikeWhatsAppTargetId(raw) {
271
+ return looksLikeHandleOrPhoneTarget({
272
+ raw,
273
+ prefixPattern: /^whatsapp:/i
274
+ });
275
+ }
276
+
277
+ //#endregion
278
+ //#region src/plugin-sdk/channel-config-helpers.ts
279
+ function formatTrimmedAllowFromEntries(allowFrom) {
280
+ return allowFrom.map((entry) => String(entry).trim()).filter(Boolean);
281
+ }
282
+ function resolveWhatsAppConfigAllowFrom(params) {
283
+ return resolveWhatsAppAccount(params).allowFrom ?? [];
284
+ }
285
+ function formatWhatsAppConfigAllowFromEntries(allowFrom) {
286
+ return normalizeWhatsAppAllowFromEntries(allowFrom);
287
+ }
288
+ function resolveWhatsAppConfigDefaultTo(params) {
289
+ const root = params.cfg.channels?.whatsapp;
290
+ const normalized = normalizeAccountId(params.accountId);
291
+ return ((root?.accounts?.[normalized])?.defaultTo ?? root?.defaultTo)?.trim() || void 0;
292
+ }
293
+ function resolveIMessageConfigAllowFrom(params) {
294
+ return (resolveIMessageAccount(params).config.allowFrom ?? []).map((entry) => String(entry));
295
+ }
296
+ function resolveIMessageConfigDefaultTo(params) {
297
+ return resolveIMessageAccount(params).config.defaultTo?.trim() || void 0;
298
+ }
299
+
300
+ //#endregion
301
+ //#region src/slack/threading-tool-context.ts
302
+ function buildSlackThreadingToolContext(params) {
303
+ const configuredReplyToMode = resolveSlackReplyToMode(resolveSlackAccount({
304
+ cfg: params.cfg,
305
+ accountId: params.accountId
306
+ }), params.context.ChatType);
307
+ const effectiveReplyToMode = params.context.MessageThreadId != null ? "all" : configuredReplyToMode;
308
+ const threadId = params.context.MessageThreadId ?? params.context.ReplyToId;
309
+ return {
310
+ currentChannelId: params.context.To?.startsWith("channel:") ? params.context.To.slice(8) : void 0,
311
+ currentThreadTs: threadId != null ? String(threadId) : void 0,
312
+ replyToMode: effectiveReplyToMode,
313
+ hasRepliedRef: params.hasRepliedRef
314
+ };
315
+ }
316
+
317
+ //#endregion
318
+ //#region src/channels/plugins/group-mentions.ts
319
+ function normalizeDiscordSlug(value) {
320
+ return normalizeAtHashSlug(value);
321
+ }
322
+ function parseTelegramGroupId(value) {
323
+ const raw = value?.trim() ?? "";
324
+ if (!raw) return {
325
+ chatId: void 0,
326
+ topicId: void 0
327
+ };
328
+ const parts = raw.split(":").filter(Boolean);
329
+ if (parts.length >= 3 && parts[1] === "topic" && /^-?\d+$/.test(parts[0]) && /^\d+$/.test(parts[2])) return {
330
+ chatId: parts[0],
331
+ topicId: parts[2]
332
+ };
333
+ if (parts.length >= 2 && /^-?\d+$/.test(parts[0]) && /^\d+$/.test(parts[1])) return {
334
+ chatId: parts[0],
335
+ topicId: parts[1]
336
+ };
337
+ return {
338
+ chatId: raw,
339
+ topicId: void 0
340
+ };
341
+ }
342
+ function resolveTelegramRequireMention(params) {
343
+ const { cfg, chatId, topicId } = params;
344
+ if (!chatId) return;
345
+ const groupConfig = cfg.channels?.telegram?.groups?.[chatId];
346
+ const groupDefault = cfg.channels?.telegram?.groups?.["*"];
347
+ const topicConfig = topicId && groupConfig?.topics ? groupConfig.topics[topicId] : void 0;
348
+ const defaultTopicConfig = topicId && groupDefault?.topics ? groupDefault.topics[topicId] : void 0;
349
+ if (typeof topicConfig?.requireMention === "boolean") return topicConfig.requireMention;
350
+ if (typeof defaultTopicConfig?.requireMention === "boolean") return defaultTopicConfig.requireMention;
351
+ if (typeof groupConfig?.requireMention === "boolean") return groupConfig.requireMention;
352
+ if (typeof groupDefault?.requireMention === "boolean") return groupDefault.requireMention;
353
+ }
354
+ function resolveDiscordGuildEntry(guilds, groupSpace) {
355
+ if (!guilds || Object.keys(guilds).length === 0) return null;
356
+ const space = groupSpace?.trim() ?? "";
357
+ if (space && guilds[space]) return guilds[space];
358
+ const normalized = normalizeDiscordSlug(space);
359
+ if (normalized && guilds[normalized]) return guilds[normalized];
360
+ if (normalized) {
361
+ const match = Object.values(guilds).find((entry) => normalizeDiscordSlug(entry?.slug ?? void 0) === normalized);
362
+ if (match) return match;
363
+ }
364
+ return guilds["*"] ?? null;
365
+ }
366
+ function resolveDiscordChannelEntry(channelEntries, params) {
367
+ if (!channelEntries || Object.keys(channelEntries).length === 0) return;
368
+ const groupChannel = params.groupChannel;
369
+ const channelSlug = normalizeDiscordSlug(groupChannel);
370
+ return (params.groupId ? channelEntries[params.groupId] : void 0) ?? (channelSlug ? channelEntries[channelSlug] ?? channelEntries[`#${channelSlug}`] : void 0) ?? (groupChannel ? channelEntries[normalizeDiscordSlug(groupChannel)] : void 0);
371
+ }
372
+ function resolveSlackChannelPolicyEntry(params) {
373
+ const channels = resolveSlackAccount({
374
+ cfg: params.cfg,
375
+ accountId: params.accountId
376
+ }).channels ?? {};
377
+ if (Object.keys(channels).length === 0) return;
378
+ const channelId = params.groupId?.trim();
379
+ const channelName = params.groupChannel?.replace(/^#/, "");
380
+ const normalizedName = normalizeHyphenSlug(channelName);
381
+ const candidates = [
382
+ channelId ?? "",
383
+ channelName ? `#${channelName}` : "",
384
+ channelName ?? "",
385
+ normalizedName
386
+ ].filter(Boolean);
387
+ for (const candidate of candidates) if (candidate && channels[candidate]) return channels[candidate];
388
+ return channels["*"];
389
+ }
390
+ function resolveChannelRequireMention(params, channel, groupId = params.groupId) {
391
+ return resolveChannelGroupRequireMention({
392
+ cfg: params.cfg,
393
+ channel,
394
+ groupId,
395
+ accountId: params.accountId
396
+ });
397
+ }
398
+ function resolveChannelToolPolicyForSender(params, channel, groupId = params.groupId) {
399
+ return resolveChannelGroupToolsPolicy({
400
+ cfg: params.cfg,
401
+ channel,
402
+ groupId,
403
+ accountId: params.accountId,
404
+ senderId: params.senderId,
405
+ senderName: params.senderName,
406
+ senderUsername: params.senderUsername,
407
+ senderE164: params.senderE164
408
+ });
409
+ }
410
+ function resolveSenderToolsEntry(entry, params) {
411
+ if (!entry) return;
412
+ const senderPolicy = resolveToolsBySender({
413
+ toolsBySender: entry.toolsBySender,
414
+ senderId: params.senderId,
415
+ senderName: params.senderName,
416
+ senderUsername: params.senderUsername,
417
+ senderE164: params.senderE164
418
+ });
419
+ if (senderPolicy) return senderPolicy;
420
+ return entry.tools;
421
+ }
422
+ function resolveDiscordPolicyContext(params) {
423
+ const guildEntry = resolveDiscordGuildEntry(params.cfg.channels?.discord?.guilds, params.groupSpace);
424
+ const channelEntries = guildEntry?.channels;
425
+ return {
426
+ guildEntry,
427
+ channelEntry: channelEntries && Object.keys(channelEntries).length > 0 ? resolveDiscordChannelEntry(channelEntries, params) : void 0
428
+ };
429
+ }
430
+ function resolveTelegramGroupRequireMention(params) {
431
+ const { chatId, topicId } = parseTelegramGroupId(params.groupId);
432
+ const requireMention = resolveTelegramRequireMention({
433
+ cfg: params.cfg,
434
+ chatId,
435
+ topicId
436
+ });
437
+ if (typeof requireMention === "boolean") return requireMention;
438
+ return resolveChannelGroupRequireMention({
439
+ cfg: params.cfg,
440
+ channel: "telegram",
441
+ groupId: chatId ?? params.groupId,
442
+ accountId: params.accountId
443
+ });
444
+ }
445
+ function resolveWhatsAppGroupRequireMention(params) {
446
+ return resolveChannelRequireMention(params, "whatsapp");
447
+ }
448
+ function resolveIMessageGroupRequireMention(params) {
449
+ return resolveChannelRequireMention(params, "imessage");
450
+ }
451
+ function resolveDiscordGroupRequireMention(params) {
452
+ const context = resolveDiscordPolicyContext(params);
453
+ if (typeof context.channelEntry?.requireMention === "boolean") return context.channelEntry.requireMention;
454
+ if (typeof context.guildEntry?.requireMention === "boolean") return context.guildEntry.requireMention;
455
+ return true;
456
+ }
457
+ function resolveGoogleChatGroupRequireMention(params) {
458
+ return resolveChannelRequireMention(params, "googlechat");
459
+ }
460
+ function resolveGoogleChatGroupToolPolicy(params) {
461
+ return resolveChannelToolPolicyForSender(params, "googlechat");
462
+ }
463
+ function resolveSlackGroupRequireMention(params) {
464
+ const resolved = resolveSlackChannelPolicyEntry(params);
465
+ if (typeof resolved?.requireMention === "boolean") return resolved.requireMention;
466
+ return true;
467
+ }
468
+ function resolveBlueBubblesGroupRequireMention(params) {
469
+ return resolveChannelRequireMention(params, "bluebubbles");
470
+ }
471
+ function resolveTelegramGroupToolPolicy(params) {
472
+ const { chatId } = parseTelegramGroupId(params.groupId);
473
+ return resolveChannelToolPolicyForSender(params, "telegram", chatId ?? params.groupId);
474
+ }
475
+ function resolveWhatsAppGroupToolPolicy(params) {
476
+ return resolveChannelToolPolicyForSender(params, "whatsapp");
477
+ }
478
+ function resolveIMessageGroupToolPolicy(params) {
479
+ return resolveChannelToolPolicyForSender(params, "imessage");
480
+ }
481
+ function resolveDiscordGroupToolPolicy(params) {
482
+ const context = resolveDiscordPolicyContext(params);
483
+ const channelPolicy = resolveSenderToolsEntry(context.channelEntry, params);
484
+ if (channelPolicy) return channelPolicy;
485
+ return resolveSenderToolsEntry(context.guildEntry, params);
486
+ }
487
+ function resolveSlackGroupToolPolicy(params) {
488
+ return resolveSenderToolsEntry(resolveSlackChannelPolicyEntry(params), params);
489
+ }
490
+ function resolveBlueBubblesGroupToolPolicy(params) {
491
+ return resolveChannelToolPolicyForSender(params, "bluebubbles");
492
+ }
493
+
494
+ //#endregion
495
+ //#region src/channels/plugins/normalize/signal.ts
496
+ function normalizeSignalMessagingTarget(raw) {
497
+ const trimmed = raw.trim();
498
+ if (!trimmed) return;
499
+ let normalized = trimmed;
500
+ if (normalized.toLowerCase().startsWith("signal:")) normalized = normalized.slice(7).trim();
501
+ if (!normalized) return;
502
+ const lower = normalized.toLowerCase();
503
+ if (lower.startsWith("group:")) {
504
+ const id = normalized.slice(6).trim();
505
+ return id ? `group:${id}` : void 0;
506
+ }
507
+ if (lower.startsWith("username:")) {
508
+ const id = normalized.slice(9).trim();
509
+ return id ? `username:${id}`.toLowerCase() : void 0;
510
+ }
511
+ if (lower.startsWith("u:")) {
512
+ const id = normalized.slice(2).trim();
513
+ return id ? `username:${id}`.toLowerCase() : void 0;
514
+ }
515
+ if (lower.startsWith("uuid:")) {
516
+ const id = normalized.slice(5).trim();
517
+ return id ? id.toLowerCase() : void 0;
518
+ }
519
+ return normalized.toLowerCase();
520
+ }
521
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
522
+ const UUID_COMPACT_PATTERN = /^[0-9a-f]{32}$/i;
523
+ function looksLikeSignalTargetId(raw, normalized) {
524
+ const candidates = [raw, normalized ?? ""].map((value) => value.trim()).filter(Boolean);
525
+ for (const candidate of candidates) {
526
+ if (/^(signal:)?(group:|username:|u:)/i.test(candidate)) return true;
527
+ if (/^(signal:)?uuid:/i.test(candidate)) {
528
+ const stripped = candidate.replace(/^signal:/i, "").replace(/^uuid:/i, "").trim();
529
+ if (!stripped) continue;
530
+ if (UUID_PATTERN.test(stripped) || UUID_COMPACT_PATTERN.test(stripped)) return true;
531
+ continue;
532
+ }
533
+ const withoutSignalPrefix = candidate.replace(/^signal:/i, "").trim();
534
+ if (UUID_PATTERN.test(withoutSignalPrefix) || UUID_COMPACT_PATTERN.test(withoutSignalPrefix)) return true;
535
+ if (/^\+?\d{3,}$/.test(withoutSignalPrefix)) return true;
536
+ }
537
+ return false;
538
+ }
539
+
540
+ //#endregion
541
+ //#region src/channels/plugins/whatsapp-shared.ts
542
+ const WHATSAPP_GROUP_INTRO_HINT = "WhatsApp IDs: SenderId is the participant JID (group participant id).";
543
+ function resolveWhatsAppGroupIntroHint() {
544
+ return WHATSAPP_GROUP_INTRO_HINT;
545
+ }
546
+ function resolveWhatsAppMentionStripPatterns(ctx) {
547
+ const selfE164 = (ctx.To ?? "").replace(/^whatsapp:/, "");
548
+ if (!selfE164) return [];
549
+ const escaped = escapeRegExp(selfE164);
550
+ return [escaped, `@${escaped}`];
551
+ }
552
+
553
+ //#endregion
554
+ //#region src/channels/dock.ts
555
+ const formatLower = (allowFrom) => allowFrom.map((entry) => String(entry).trim()).filter(Boolean).map((entry) => entry.toLowerCase());
556
+ const stringifyAllowFrom = (allowFrom) => allowFrom.map((entry) => String(entry));
557
+ const trimAllowFromEntries = (allowFrom) => allowFrom.map((entry) => String(entry).trim()).filter(Boolean);
558
+ const DEFAULT_OUTBOUND_TEXT_CHUNK_LIMIT_4000 = { textChunkLimit: 4e3 };
559
+ const DEFAULT_BLOCK_STREAMING_COALESCE = { blockStreamingCoalesceDefaults: {
560
+ minChars: 1500,
561
+ idleMs: 1e3
562
+ } };
563
+ function formatAllowFromWithReplacements(allowFrom, replacements) {
564
+ return trimAllowFromEntries(allowFrom).map((entry) => {
565
+ let normalized = entry;
566
+ for (const replacement of replacements) normalized = normalized.replace(replacement, "");
567
+ return normalized.toLowerCase();
568
+ });
569
+ }
570
+ const formatDiscordAllowFrom = (allowFrom) => allowFrom.map((entry) => String(entry).trim().replace(/^<@!?/, "").replace(/>$/, "").replace(/^discord:/i, "").replace(/^user:/i, "").replace(/^pk:/i, "").trim().toLowerCase()).filter(Boolean);
571
+ function resolveDirectOrGroupChannelId(context) {
572
+ return (context.ChatType?.toLowerCase() === "direct" ? context.From ?? context.To : context.To)?.trim() || void 0;
573
+ }
574
+ function buildSignalThreadToolContext(params) {
575
+ const currentChannelIdRaw = resolveDirectOrGroupChannelId(params.context);
576
+ return {
577
+ currentChannelId: currentChannelIdRaw ? normalizeSignalMessagingTarget(currentChannelIdRaw) ?? currentChannelIdRaw.trim() : void 0,
578
+ currentThreadTs: params.context.ReplyToId,
579
+ hasRepliedRef: params.hasRepliedRef
580
+ };
581
+ }
582
+ function buildIMessageThreadToolContext(params) {
583
+ return {
584
+ currentChannelId: resolveDirectOrGroupChannelId(params.context),
585
+ currentThreadTs: params.context.ReplyToId,
586
+ hasRepliedRef: params.hasRepliedRef
587
+ };
588
+ }
589
+ function buildThreadToolContextFromMessageThreadOrReply(params) {
590
+ const threadId = params.context.MessageThreadId ?? params.context.ReplyToId;
591
+ return {
592
+ currentChannelId: params.context.To?.trim() || void 0,
593
+ currentThreadTs: threadId != null ? String(threadId) : void 0,
594
+ hasRepliedRef: params.hasRepliedRef
595
+ };
596
+ }
597
+ function resolveCaseInsensitiveAccount(accounts, accountId) {
598
+ if (!accounts) return;
599
+ const normalized = normalizeAccountId(accountId);
600
+ return accounts[normalized] ?? accounts[Object.keys(accounts).find((key) => key.toLowerCase() === normalized.toLowerCase()) ?? ""];
601
+ }
602
+ function resolveDefaultToCaseInsensitiveAccount(params) {
603
+ return (resolveCaseInsensitiveAccount(params.channel?.accounts, params.accountId)?.defaultTo ?? params.channel?.defaultTo)?.trim() || void 0;
604
+ }
605
+ function resolveChannelDefaultTo(channel, accountId) {
606
+ return resolveDefaultToCaseInsensitiveAccount({
607
+ channel,
608
+ accountId
609
+ });
610
+ }
611
+ function resolveNamedChannelDefaultTo(params) {
612
+ return resolveChannelDefaultTo(params.channels?.[params.channelId], params.accountId);
613
+ }
614
+ const DOCKS = {
615
+ telegram: {
616
+ id: "telegram",
617
+ capabilities: {
618
+ chatTypes: [
619
+ "direct",
620
+ "group",
621
+ "channel",
622
+ "thread"
623
+ ],
624
+ nativeCommands: true,
625
+ blockStreaming: true
626
+ },
627
+ outbound: DEFAULT_OUTBOUND_TEXT_CHUNK_LIMIT_4000,
628
+ config: {
629
+ resolveAllowFrom: ({ cfg, accountId }) => stringifyAllowFrom(resolveTelegramAccount({
630
+ cfg,
631
+ accountId
632
+ }).config.allowFrom ?? []),
633
+ formatAllowFrom: ({ allowFrom }) => trimAllowFromEntries(allowFrom).map((entry) => entry.replace(/^(telegram|tg):/i, "")).map((entry) => entry.toLowerCase()),
634
+ resolveDefaultTo: ({ cfg, accountId }) => {
635
+ const val = resolveTelegramAccount({
636
+ cfg,
637
+ accountId
638
+ }).config.defaultTo;
639
+ return val != null ? String(val) : void 0;
640
+ }
641
+ },
642
+ groups: {
643
+ resolveRequireMention: resolveTelegramGroupRequireMention,
644
+ resolveToolPolicy: resolveTelegramGroupToolPolicy
645
+ },
646
+ threading: {
647
+ resolveReplyToMode: ({ cfg }) => cfg.channels?.telegram?.replyToMode ?? "off",
648
+ buildToolContext: ({ context, hasRepliedRef }) => {
649
+ const threadId = context.MessageThreadId;
650
+ const rawCurrentMessageId = context.CurrentMessageId;
651
+ const currentMessageId = typeof rawCurrentMessageId === "number" ? rawCurrentMessageId : rawCurrentMessageId?.trim() || void 0;
652
+ return {
653
+ currentChannelId: context.To?.trim() || void 0,
654
+ currentThreadTs: threadId != null ? String(threadId) : void 0,
655
+ currentMessageId,
656
+ hasRepliedRef
657
+ };
658
+ }
659
+ }
660
+ },
661
+ whatsapp: {
662
+ id: "whatsapp",
663
+ capabilities: {
664
+ chatTypes: ["direct", "group"],
665
+ polls: true,
666
+ reactions: true,
667
+ media: true
668
+ },
669
+ commands: {
670
+ enforceOwnerForCommands: true,
671
+ skipWhenConfigEmpty: true
672
+ },
673
+ outbound: DEFAULT_OUTBOUND_TEXT_CHUNK_LIMIT_4000,
674
+ config: {
675
+ resolveAllowFrom: ({ cfg, accountId }) => resolveWhatsAppConfigAllowFrom({
676
+ cfg,
677
+ accountId
678
+ }),
679
+ formatAllowFrom: ({ allowFrom }) => formatWhatsAppConfigAllowFromEntries(allowFrom),
680
+ resolveDefaultTo: ({ cfg, accountId }) => resolveWhatsAppConfigDefaultTo({
681
+ cfg,
682
+ accountId
683
+ })
684
+ },
685
+ groups: {
686
+ resolveRequireMention: resolveWhatsAppGroupRequireMention,
687
+ resolveToolPolicy: resolveWhatsAppGroupToolPolicy,
688
+ resolveGroupIntroHint: resolveWhatsAppGroupIntroHint
689
+ },
690
+ mentions: { stripPatterns: ({ ctx }) => resolveWhatsAppMentionStripPatterns(ctx) },
691
+ threading: { buildToolContext: ({ context, hasRepliedRef }) => {
692
+ return {
693
+ currentChannelId: context.From?.trim() || context.To?.trim() || void 0,
694
+ currentThreadTs: context.ReplyToId,
695
+ hasRepliedRef
696
+ };
697
+ } }
698
+ },
699
+ discord: {
700
+ id: "discord",
701
+ capabilities: {
702
+ chatTypes: [
703
+ "direct",
704
+ "channel",
705
+ "thread"
706
+ ],
707
+ polls: true,
708
+ reactions: true,
709
+ media: true,
710
+ nativeCommands: true,
711
+ threads: true
712
+ },
713
+ outbound: { textChunkLimit: 2e3 },
714
+ streaming: DEFAULT_BLOCK_STREAMING_COALESCE,
715
+ elevated: { allowFromFallback: ({ cfg }) => cfg.channels?.discord?.allowFrom ?? cfg.channels?.discord?.dm?.allowFrom },
716
+ config: {
717
+ resolveAllowFrom: ({ cfg, accountId }) => {
718
+ const account = resolveDiscordAccount({
719
+ cfg,
720
+ accountId
721
+ });
722
+ return (account.config.allowFrom ?? account.config.dm?.allowFrom ?? []).map((entry) => String(entry));
723
+ },
724
+ formatAllowFrom: ({ allowFrom }) => formatDiscordAllowFrom(allowFrom),
725
+ resolveDefaultTo: ({ cfg, accountId }) => resolveDiscordAccount({
726
+ cfg,
727
+ accountId
728
+ }).config.defaultTo?.trim() || void 0
729
+ },
730
+ groups: {
731
+ resolveRequireMention: resolveDiscordGroupRequireMention,
732
+ resolveToolPolicy: resolveDiscordGroupToolPolicy
733
+ },
734
+ mentions: { stripPatterns: () => ["<@!?\\d+>"] },
735
+ threading: {
736
+ resolveReplyToMode: ({ cfg }) => cfg.channels?.discord?.replyToMode ?? "off",
737
+ buildToolContext: ({ context, hasRepliedRef }) => ({
738
+ currentChannelId: context.To?.trim() || void 0,
739
+ currentThreadTs: context.ReplyToId,
740
+ hasRepliedRef
741
+ })
742
+ }
743
+ },
744
+ irc: {
745
+ id: "irc",
746
+ capabilities: {
747
+ chatTypes: ["direct", "group"],
748
+ media: true,
749
+ blockStreaming: true
750
+ },
751
+ outbound: { textChunkLimit: 350 },
752
+ streaming: { blockStreamingCoalesceDefaults: {
753
+ minChars: 300,
754
+ idleMs: 1e3
755
+ } },
756
+ config: {
757
+ resolveAllowFrom: ({ cfg, accountId }) => {
758
+ const channel = cfg.channels?.irc;
759
+ return (resolveCaseInsensitiveAccount(channel?.accounts, accountId)?.allowFrom ?? channel?.allowFrom ?? []).map((entry) => String(entry));
760
+ },
761
+ formatAllowFrom: ({ allowFrom }) => formatAllowFromWithReplacements(allowFrom, [/^irc:/i, /^user:/i]),
762
+ resolveDefaultTo: ({ cfg, accountId }) => resolveNamedChannelDefaultTo({
763
+ channels: cfg.channels,
764
+ channelId: "irc",
765
+ accountId
766
+ })
767
+ },
768
+ groups: {
769
+ resolveRequireMention: ({ cfg, accountId, groupId }) => {
770
+ if (!groupId) return true;
771
+ return resolveChannelGroupRequireMention({
772
+ cfg,
773
+ channel: "irc",
774
+ groupId,
775
+ accountId,
776
+ groupIdCaseInsensitive: true
777
+ });
778
+ },
779
+ resolveToolPolicy: ({ cfg, accountId, groupId, senderId, senderName, senderUsername }) => {
780
+ if (!groupId) return;
781
+ return resolveChannelGroupToolsPolicy({
782
+ cfg,
783
+ channel: "irc",
784
+ groupId,
785
+ accountId,
786
+ groupIdCaseInsensitive: true,
787
+ senderId,
788
+ senderName,
789
+ senderUsername
790
+ });
791
+ }
792
+ }
793
+ },
794
+ googlechat: {
795
+ id: "googlechat",
796
+ capabilities: {
797
+ chatTypes: [
798
+ "direct",
799
+ "group",
800
+ "thread"
801
+ ],
802
+ reactions: true,
803
+ media: true,
804
+ threads: true,
805
+ blockStreaming: true
806
+ },
807
+ outbound: DEFAULT_OUTBOUND_TEXT_CHUNK_LIMIT_4000,
808
+ config: {
809
+ resolveAllowFrom: ({ cfg, accountId }) => {
810
+ const channel = cfg.channels?.googlechat;
811
+ return (resolveCaseInsensitiveAccount(channel?.accounts, accountId)?.dm?.allowFrom ?? channel?.dm?.allowFrom ?? []).map((entry) => String(entry));
812
+ },
813
+ formatAllowFrom: ({ allowFrom }) => formatAllowFromWithReplacements(allowFrom, [
814
+ /^(googlechat|google-chat|gchat):/i,
815
+ /^user:/i,
816
+ /^users\//i
817
+ ]),
818
+ resolveDefaultTo: ({ cfg, accountId }) => resolveNamedChannelDefaultTo({
819
+ channels: cfg.channels,
820
+ channelId: "googlechat",
821
+ accountId
822
+ })
823
+ },
824
+ groups: {
825
+ resolveRequireMention: resolveGoogleChatGroupRequireMention,
826
+ resolveToolPolicy: resolveGoogleChatGroupToolPolicy
827
+ },
828
+ threading: {
829
+ resolveReplyToMode: ({ cfg }) => cfg.channels?.googlechat?.replyToMode ?? "off",
830
+ buildToolContext: ({ context, hasRepliedRef }) => buildThreadToolContextFromMessageThreadOrReply({
831
+ context,
832
+ hasRepliedRef
833
+ })
834
+ }
835
+ },
836
+ slack: {
837
+ id: "slack",
838
+ capabilities: {
839
+ chatTypes: [
840
+ "direct",
841
+ "channel",
842
+ "thread"
843
+ ],
844
+ reactions: true,
845
+ media: true,
846
+ nativeCommands: true,
847
+ threads: true
848
+ },
849
+ outbound: DEFAULT_OUTBOUND_TEXT_CHUNK_LIMIT_4000,
850
+ streaming: DEFAULT_BLOCK_STREAMING_COALESCE,
851
+ config: {
852
+ resolveAllowFrom: ({ cfg, accountId }) => {
853
+ const account = resolveSlackAccount({
854
+ cfg,
855
+ accountId
856
+ });
857
+ return (account.config.allowFrom ?? account.dm?.allowFrom ?? []).map((entry) => String(entry));
858
+ },
859
+ formatAllowFrom: ({ allowFrom }) => formatLower(allowFrom),
860
+ resolveDefaultTo: ({ cfg, accountId }) => resolveSlackAccount({
861
+ cfg,
862
+ accountId
863
+ }).config.defaultTo?.trim() || void 0
864
+ },
865
+ groups: {
866
+ resolveRequireMention: resolveSlackGroupRequireMention,
867
+ resolveToolPolicy: resolveSlackGroupToolPolicy
868
+ },
869
+ mentions: { stripPatterns: () => ["<@[^>]+>"] },
870
+ threading: {
871
+ resolveReplyToMode: ({ cfg, accountId, chatType }) => resolveSlackReplyToMode(resolveSlackAccount({
872
+ cfg,
873
+ accountId
874
+ }), chatType),
875
+ allowExplicitReplyTagsWhenOff: false,
876
+ buildToolContext: (params) => buildSlackThreadingToolContext(params)
877
+ }
878
+ },
879
+ signal: {
880
+ id: "signal",
881
+ capabilities: {
882
+ chatTypes: ["direct", "group"],
883
+ reactions: true,
884
+ media: true
885
+ },
886
+ outbound: DEFAULT_OUTBOUND_TEXT_CHUNK_LIMIT_4000,
887
+ streaming: DEFAULT_BLOCK_STREAMING_COALESCE,
888
+ config: {
889
+ resolveAllowFrom: ({ cfg, accountId }) => stringifyAllowFrom(resolveSignalAccount({
890
+ cfg,
891
+ accountId
892
+ }).config.allowFrom ?? []),
893
+ formatAllowFrom: ({ allowFrom }) => trimAllowFromEntries(allowFrom).map((entry) => entry === "*" ? "*" : normalizeE164(entry.replace(/^signal:/i, ""))).filter(Boolean),
894
+ resolveDefaultTo: ({ cfg, accountId }) => resolveSignalAccount({
895
+ cfg,
896
+ accountId
897
+ }).config.defaultTo?.trim() || void 0
898
+ },
899
+ threading: { buildToolContext: ({ context, hasRepliedRef }) => buildSignalThreadToolContext({
900
+ context,
901
+ hasRepliedRef
902
+ }) }
903
+ },
904
+ imessage: {
905
+ id: "imessage",
906
+ capabilities: {
907
+ chatTypes: ["direct", "group"],
908
+ reactions: true,
909
+ media: true
910
+ },
911
+ outbound: DEFAULT_OUTBOUND_TEXT_CHUNK_LIMIT_4000,
912
+ config: {
913
+ resolveAllowFrom: ({ cfg, accountId }) => resolveIMessageConfigAllowFrom({
914
+ cfg,
915
+ accountId
916
+ }),
917
+ formatAllowFrom: ({ allowFrom }) => formatTrimmedAllowFromEntries(allowFrom),
918
+ resolveDefaultTo: ({ cfg, accountId }) => resolveIMessageConfigDefaultTo({
919
+ cfg,
920
+ accountId
921
+ })
922
+ },
923
+ groups: {
924
+ resolveRequireMention: resolveIMessageGroupRequireMention,
925
+ resolveToolPolicy: resolveIMessageGroupToolPolicy
926
+ },
927
+ threading: { buildToolContext: ({ context, hasRepliedRef }) => buildIMessageThreadToolContext({
928
+ context,
929
+ hasRepliedRef
930
+ }) }
931
+ }
932
+ };
933
+ function buildDockFromPlugin(plugin) {
934
+ return {
935
+ id: plugin.id,
936
+ capabilities: plugin.capabilities,
937
+ commands: plugin.commands,
938
+ outbound: plugin.outbound?.textChunkLimit ? { textChunkLimit: plugin.outbound.textChunkLimit } : void 0,
939
+ streaming: plugin.streaming ? { blockStreamingCoalesceDefaults: plugin.streaming.blockStreamingCoalesceDefaults } : void 0,
940
+ elevated: plugin.elevated,
941
+ config: plugin.config ? {
942
+ resolveAllowFrom: plugin.config.resolveAllowFrom,
943
+ formatAllowFrom: plugin.config.formatAllowFrom,
944
+ resolveDefaultTo: plugin.config.resolveDefaultTo
945
+ } : void 0,
946
+ groups: plugin.groups,
947
+ mentions: plugin.mentions,
948
+ threading: plugin.threading,
949
+ agentPrompt: plugin.agentPrompt
950
+ };
951
+ }
952
+ function listPluginDockEntries() {
953
+ const registry = requireActivePluginRegistry();
954
+ const entries = [];
955
+ const seen = /* @__PURE__ */ new Set();
956
+ for (const entry of registry.channels) {
957
+ const plugin = entry.plugin;
958
+ const id = String(plugin.id).trim();
959
+ if (!id || seen.has(id)) continue;
960
+ seen.add(id);
961
+ if (CHAT_CHANNEL_ORDER.includes(plugin.id)) continue;
962
+ const dock = entry.dock ?? buildDockFromPlugin(plugin);
963
+ entries.push({
964
+ id: plugin.id,
965
+ dock,
966
+ order: plugin.meta.order
967
+ });
968
+ }
969
+ return entries;
970
+ }
971
+ function listChannelDocks() {
972
+ const baseEntries = CHAT_CHANNEL_ORDER.map((id) => ({
973
+ id,
974
+ dock: DOCKS[id],
975
+ order: getChatChannelMeta(id).order
976
+ }));
977
+ const pluginEntries = listPluginDockEntries();
978
+ const combined = [...baseEntries, ...pluginEntries];
979
+ combined.sort((a, b) => {
980
+ const indexA = CHAT_CHANNEL_ORDER.indexOf(a.id);
981
+ const indexB = CHAT_CHANNEL_ORDER.indexOf(b.id);
982
+ const orderA = a.order ?? (indexA === -1 ? 999 : indexA);
983
+ const orderB = b.order ?? (indexB === -1 ? 999 : indexB);
984
+ if (orderA !== orderB) return orderA - orderB;
985
+ return String(a.id).localeCompare(String(b.id));
986
+ });
987
+ return combined.map((entry) => entry.dock);
988
+ }
989
+ function getChannelDock(id) {
990
+ const core = DOCKS[id];
991
+ if (core) return core;
992
+ const pluginEntry = requireActivePluginRegistry().channels.find((entry) => entry.plugin.id === id);
993
+ if (!pluginEntry) return;
994
+ return pluginEntry.dock ?? buildDockFromPlugin(pluginEntry.plugin);
995
+ }
996
+
997
+ //#endregion
998
+ //#region src/auto-reply/thinking.ts
999
+ function normalizeProviderId(provider) {
1000
+ if (!provider) return "";
1001
+ const normalized = provider.trim().toLowerCase();
1002
+ if (normalized === "z.ai" || normalized === "z-ai") return "zai";
1003
+ return normalized;
1004
+ }
1005
+ function isBinaryThinkingProvider(provider) {
1006
+ return normalizeProviderId(provider) === "zai";
1007
+ }
1008
+ const XHIGH_MODEL_REFS = [
1009
+ "openai/gpt-5.2",
1010
+ "openai-codex/gpt-5.3-codex",
1011
+ "openai-codex/gpt-5.3-codex-spark",
1012
+ "openai-codex/gpt-5.2-codex",
1013
+ "openai-codex/gpt-5.1-codex",
1014
+ "github-copilot/gpt-5.2-codex",
1015
+ "github-copilot/gpt-5.2"
1016
+ ];
1017
+ const XHIGH_MODEL_SET = new Set(XHIGH_MODEL_REFS.map((entry) => entry.toLowerCase()));
1018
+ const XHIGH_MODEL_IDS = new Set(XHIGH_MODEL_REFS.map((entry) => entry.split("/")[1]?.toLowerCase()).filter((entry) => Boolean(entry)));
1019
+ function normalizeThinkLevel(raw) {
1020
+ if (!raw) return;
1021
+ const key = raw.trim().toLowerCase();
1022
+ const collapsed = key.replace(/[\s_-]+/g, "");
1023
+ if (collapsed === "adaptive" || collapsed === "auto") return "adaptive";
1024
+ if (collapsed === "xhigh" || collapsed === "extrahigh") return "xhigh";
1025
+ if (["off"].includes(key)) return "off";
1026
+ if ([
1027
+ "on",
1028
+ "enable",
1029
+ "enabled"
1030
+ ].includes(key)) return "low";
1031
+ if (["min", "minimal"].includes(key)) return "minimal";
1032
+ if ([
1033
+ "low",
1034
+ "thinkhard",
1035
+ "think-hard",
1036
+ "think_hard"
1037
+ ].includes(key)) return "low";
1038
+ if ([
1039
+ "mid",
1040
+ "med",
1041
+ "medium",
1042
+ "thinkharder",
1043
+ "think-harder",
1044
+ "harder"
1045
+ ].includes(key)) return "medium";
1046
+ if ([
1047
+ "high",
1048
+ "ultra",
1049
+ "ultrathink",
1050
+ "think-hard",
1051
+ "thinkhardest",
1052
+ "highest",
1053
+ "max"
1054
+ ].includes(key)) return "high";
1055
+ if (["think"].includes(key)) return "minimal";
1056
+ }
1057
+ function supportsXHighThinking(provider, model) {
1058
+ const modelKey = model?.trim().toLowerCase();
1059
+ if (!modelKey) return false;
1060
+ const providerKey = provider?.trim().toLowerCase();
1061
+ if (providerKey) return XHIGH_MODEL_SET.has(`${providerKey}/${modelKey}`);
1062
+ return XHIGH_MODEL_IDS.has(modelKey);
1063
+ }
1064
+ function listThinkingLevels(provider, model) {
1065
+ const levels = [
1066
+ "off",
1067
+ "minimal",
1068
+ "low",
1069
+ "medium",
1070
+ "high"
1071
+ ];
1072
+ if (supportsXHighThinking(provider, model)) levels.push("xhigh");
1073
+ levels.push("adaptive");
1074
+ return levels;
1075
+ }
1076
+ function listThinkingLevelLabels(provider, model) {
1077
+ if (isBinaryThinkingProvider(provider)) return ["off", "on"];
1078
+ return listThinkingLevels(provider, model);
1079
+ }
1080
+ function formatThinkingLevels(provider, model, separator = ", ") {
1081
+ return listThinkingLevelLabels(provider, model).join(separator);
1082
+ }
1083
+ function formatXHighModelHint() {
1084
+ const refs = [...XHIGH_MODEL_REFS];
1085
+ if (refs.length === 0) return "unknown model";
1086
+ if (refs.length === 1) return refs[0];
1087
+ if (refs.length === 2) return `${refs[0]} or ${refs[1]}`;
1088
+ return `${refs.slice(0, -1).join(", ")} or ${refs[refs.length - 1]}`;
1089
+ }
1090
+ function normalizeOnOffFullLevel(raw) {
1091
+ if (!raw) return;
1092
+ const key = raw.toLowerCase();
1093
+ if ([
1094
+ "off",
1095
+ "false",
1096
+ "no",
1097
+ "0"
1098
+ ].includes(key)) return "off";
1099
+ if ([
1100
+ "full",
1101
+ "all",
1102
+ "everything"
1103
+ ].includes(key)) return "full";
1104
+ if ([
1105
+ "on",
1106
+ "minimal",
1107
+ "true",
1108
+ "yes",
1109
+ "1"
1110
+ ].includes(key)) return "on";
1111
+ }
1112
+ function normalizeVerboseLevel(raw) {
1113
+ return normalizeOnOffFullLevel(raw);
1114
+ }
1115
+ function normalizeUsageDisplay(raw) {
1116
+ if (!raw) return;
1117
+ const key = raw.toLowerCase();
1118
+ if ([
1119
+ "off",
1120
+ "false",
1121
+ "no",
1122
+ "0",
1123
+ "disable",
1124
+ "disabled"
1125
+ ].includes(key)) return "off";
1126
+ if ([
1127
+ "on",
1128
+ "true",
1129
+ "yes",
1130
+ "1",
1131
+ "enable",
1132
+ "enabled"
1133
+ ].includes(key)) return "tokens";
1134
+ if ([
1135
+ "tokens",
1136
+ "token",
1137
+ "tok",
1138
+ "minimal",
1139
+ "min"
1140
+ ].includes(key)) return "tokens";
1141
+ if (["full", "session"].includes(key)) return "full";
1142
+ }
1143
+ function resolveResponseUsageMode(raw) {
1144
+ return normalizeUsageDisplay(raw) ?? "off";
1145
+ }
1146
+ function normalizeElevatedLevel(raw) {
1147
+ if (!raw) return;
1148
+ const key = raw.toLowerCase();
1149
+ if ([
1150
+ "off",
1151
+ "false",
1152
+ "no",
1153
+ "0"
1154
+ ].includes(key)) return "off";
1155
+ if ([
1156
+ "full",
1157
+ "auto",
1158
+ "auto-approve",
1159
+ "autoapprove"
1160
+ ].includes(key)) return "full";
1161
+ if ([
1162
+ "ask",
1163
+ "prompt",
1164
+ "approval",
1165
+ "approve"
1166
+ ].includes(key)) return "ask";
1167
+ if ([
1168
+ "on",
1169
+ "true",
1170
+ "yes",
1171
+ "1"
1172
+ ].includes(key)) return "on";
1173
+ }
1174
+ function normalizeReasoningLevel(raw) {
1175
+ if (!raw) return;
1176
+ const key = raw.toLowerCase();
1177
+ if ([
1178
+ "off",
1179
+ "false",
1180
+ "no",
1181
+ "0",
1182
+ "hide",
1183
+ "hidden",
1184
+ "disable",
1185
+ "disabled"
1186
+ ].includes(key)) return "off";
1187
+ if ([
1188
+ "on",
1189
+ "true",
1190
+ "yes",
1191
+ "1",
1192
+ "show",
1193
+ "visible",
1194
+ "enable",
1195
+ "enabled"
1196
+ ].includes(key)) return "on";
1197
+ if ([
1198
+ "stream",
1199
+ "streaming",
1200
+ "draft",
1201
+ "live"
1202
+ ].includes(key)) return "stream";
1203
+ }
1204
+
1205
+ //#endregion
1206
+ export { resolveWhatsAppGroupToolPolicy as A, normalizeWhatsAppMessagingTarget as B, resolveIMessageGroupRequireMention as C, resolveTelegramGroupRequireMention as D, resolveSlackGroupToolPolicy as E, resolveIMessageConfigDefaultTo as F, resolveChannelGroupToolsPolicy as G, trimMessagingTarget as H, resolveWhatsAppConfigAllowFrom as I, normalizeHyphenSlug as J, resolveToolsBySender as K, resolveWhatsAppConfigDefaultTo as L, formatTrimmedAllowFromEntries as M, formatWhatsAppConfigAllowFromEntries as N, resolveTelegramGroupToolPolicy as O, resolveIMessageConfigAllowFrom as P, looksLikeWhatsAppTargetId as R, resolveGoogleChatGroupToolPolicy as S, resolveSlackGroupRequireMention as T, resolveChannelGroupPolicy as U, looksLikeHandleOrPhoneTarget as V, resolveChannelGroupRequireMention as W, normalizeStringEntriesLower as X, normalizeStringEntries as Y, resolveBlueBubblesGroupRequireMention as _, normalizeReasoningLevel as a, resolveDiscordGroupToolPolicy as b, normalizeVerboseLevel as c, getChannelDock as d, listChannelDocks as f, normalizeSignalMessagingTarget as g, looksLikeSignalTargetId as h, normalizeElevatedLevel as i, buildSlackThreadingToolContext as j, resolveWhatsAppGroupRequireMention as k, resolveResponseUsageMode as l, resolveWhatsAppMentionStripPatterns as m, formatXHighModelHint as n, normalizeThinkLevel as o, resolveWhatsAppGroupIntroHint as p, normalizeAtHashSlug as q, listThinkingLevels as r, normalizeUsageDisplay as s, formatThinkingLevels as t, supportsXHighThinking as u, resolveBlueBubblesGroupToolPolicy as v, resolveIMessageGroupToolPolicy as w, resolveGoogleChatGroupRequireMention as x, resolveDiscordGroupRequireMention as y, normalizeWhatsAppAllowFromEntries as z };