@spacebar_ai/moldclaw-core 2026.3.14 → 2026.3.16

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 (1074) hide show
  1. package/README.md +108 -3
  2. package/dist/account-id-plS5L20e.d.ts +1 -0
  3. package/dist/accounts-BAYVGC2k.js +109 -0
  4. package/dist/accounts-DrjRgReV.d.ts +103 -0
  5. package/dist/acp-cli-at_UYEOS.js +2088 -0
  6. package/dist/acpx-Chy1GQ_k.d.ts +5 -0
  7. package/dist/actions.runtime-C0F7dMfO.js +114 -0
  8. package/dist/actions.runtime-caI2LG9o.js +128 -0
  9. package/dist/agent-media-payload-CkpAqaOh.d.ts +16 -0
  10. package/dist/agents-B98yPGc5.js +853 -0
  11. package/dist/agents-BrLr08L3.js +217 -0
  12. package/dist/allow-from-BIwT4dl7.d.ts +42 -0
  13. package/dist/allow-list-CHt7yvAf.js +81 -0
  14. package/dist/allowlist-CxQo2wQc.js +142 -0
  15. package/dist/allowlist-resolution-B7ib7gye.d.ts +17 -0
  16. package/dist/api-Co7TNHbL.js +6953 -0
  17. package/dist/api-cEQ_ql_8.js +112 -0
  18. package/dist/audit-AnKnnlaZ.js +787 -0
  19. package/dist/audit-channel.collect.runtime-CAk1DFQ3.js +600 -0
  20. package/dist/audit-channel.runtime-5phdZp_m.js +116 -0
  21. package/dist/audit-extra.async-B8ZXFxic.js +813 -0
  22. package/dist/audit-hdKa3D-u.js +54 -0
  23. package/dist/audit-membership-runtime-CJV5XvGU.js +157 -0
  24. package/dist/audit.deep.runtime-DNMcRQrp.js +24 -0
  25. package/dist/audit.nondeep.runtime-DhNDL6yM.js +831 -0
  26. package/dist/audit.runtime-Bx7uWEh8.js +113 -0
  27. package/dist/auth-choice-C37W9MA7.js +268 -0
  28. package/dist/auth-choice-CNppOY_V.js +117 -0
  29. package/dist/auth-choice-XYFnp6fI.js +502 -0
  30. package/dist/auth-choice-options-D6oZY4Xo.js +123 -0
  31. package/dist/auth-choice-prompt-BhRqchJx.js +110 -0
  32. package/dist/auth-choice-prompt-C1xv0N08.js +36 -0
  33. package/dist/auth-choice.plugin-providers.runtime-DhLEtbmR.js +114 -0
  34. package/dist/auth-profiles-9zZdaXJK.js +127756 -0
  35. package/dist/auth-profiles.runtime-HONFDgiu.js +111 -0
  36. package/dist/bluebubbles-BY8JhO4y.js +64 -0
  37. package/dist/bluebubbles-CQjEnzK_.d.ts +6 -0
  38. package/dist/bluebubbles-RmcKgkBa.d.ts +45 -0
  39. package/dist/boolean-param-F1sMwnPu.d.ts +5 -0
  40. package/dist/bot-BGh-ATV7.d.ts +478 -0
  41. package/dist/brave-CljenznH.js +24 -0
  42. package/dist/browser-cli-CX8i0wf0.js +1492 -0
  43. package/dist/build-info.json +3 -3
  44. package/dist/bundled/boot-md/handler.d.ts +6 -0
  45. package/dist/bundled/boot-md/handler.js +26 -26
  46. package/dist/bundled/bootstrap-extra-files/handler.d.ts +6 -0
  47. package/dist/bundled/command-logger/handler.d.ts +9 -0
  48. package/dist/bundled/session-memory/handler.d.ts +9 -0
  49. package/dist/bundled/session-memory/handler.js +27 -27
  50. package/dist/call-Bc257L16.js +37 -0
  51. package/dist/call-DYFR7oGy.js +639 -0
  52. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  53. package/dist/channel-Bd-igGEW.js +803 -0
  54. package/dist/channel-BgRMb6bZ.js +575 -0
  55. package/dist/channel-BtcLrU6J.js +1598 -0
  56. package/dist/channel-Bwf6m_hD.js +538 -0
  57. package/dist/channel-C7-kgDBd.js +562 -0
  58. package/dist/channel-CEXOAxIc.js +949 -0
  59. package/dist/channel-CpZ3p9MJ.js +226 -0
  60. package/dist/channel-CqBlN6A2.js +619 -0
  61. package/dist/channel-DKhfHW4U.js +352 -0
  62. package/dist/channel-DS3t_KdJ2.js +316 -0
  63. package/dist/channel-DY24FA1v.js +4681 -0
  64. package/dist/channel-DYFGmImJ.js +542 -0
  65. package/dist/channel-DcyIqX5p.js +207 -0
  66. package/dist/channel-J-2XcAli.js +214 -0
  67. package/dist/channel-N616f4gZ.js +306 -0
  68. package/dist/channel-NY7aU2Gj.js +397 -0
  69. package/dist/channel-PNI8BOmm.js +1321 -0
  70. package/dist/channel-UcXepDJs.js +943 -0
  71. package/dist/channel-account-context-CL3hEq1j.js +103 -0
  72. package/dist/channel-config-schema-Q2nzcCCR.d.ts +1 -0
  73. package/dist/channel-jA_jodJo.js +920 -0
  74. package/dist/channel-options-CtgU5qkG.js +50 -0
  75. package/dist/channel-policy-7wXDp6d3.d.ts +1 -0
  76. package/dist/channel-rGI8uig4.js +497 -0
  77. package/dist/channel-summary-DGJZXo0r.js +106 -0
  78. package/dist/channel.runtime--WZvlNJM.js +413 -0
  79. package/dist/channel.runtime-B0ct42DL.js +122 -0
  80. package/dist/channel.runtime-BEZUZrYB.js +177 -0
  81. package/dist/channel.runtime-BMuWmsIC.js +166 -0
  82. package/dist/channel.runtime-BtvHP0po.js +4006 -0
  83. package/dist/channel.runtime-Cwf993pX.js +194 -0
  84. package/dist/channel.runtime-Cy4lEpTX.js +174 -0
  85. package/dist/channel.runtime-DAz6axda.js +865 -0
  86. package/dist/channel.runtime-DdQ2mOVh.js +236 -0
  87. package/dist/channel.runtime-Dy3HPgOU.js +399 -0
  88. package/dist/channel.runtime-iqfC25k7.js +213 -0
  89. package/dist/channel.setup-B4VYMZlQ.js +9 -0
  90. package/dist/channel.setup-BohGbCbI.js +57 -0
  91. package/dist/channel.setup-Bq2AQqqc.js +6 -0
  92. package/dist/channel.setup-BxiSfLp1.js +8 -0
  93. package/dist/channel.setup-DOUS6fjO.js +8 -0
  94. package/dist/channel.setup-DXhdYU3g.js +9 -0
  95. package/dist/channel.setup-N51CgfNy.js +11 -0
  96. package/dist/channels/plugins/actions/discord.d.ts +3 -0
  97. package/dist/channels/plugins/actions/discord.js +26 -26
  98. package/dist/channels/plugins/actions/signal.d.ts +2 -0
  99. package/dist/channels/plugins/actions/signal.js +26 -26
  100. package/dist/channels/plugins/actions/telegram.d.ts +3 -0
  101. package/dist/channels/plugins/actions/telegram.js +26 -26
  102. package/dist/channels/plugins/agent-tools/whatsapp-login.d.ts +4 -0
  103. package/dist/channels/plugins/agent-tools/whatsapp-login.js +26 -26
  104. package/dist/channels-CueeFf0q.js +404 -0
  105. package/dist/channels-PheAd73E.js +1113 -0
  106. package/dist/channels-cli-CXzVF84v.js +286 -0
  107. package/dist/channels-status-issues-BjWBQHhU.js +16 -0
  108. package/dist/chat-type-BlSN0vo4.d.ts +5 -0
  109. package/dist/clawbot-cli-BBehDXW1.js +113 -0
  110. package/dist/cli/daemon-cli.d.ts +58 -0
  111. package/dist/cli/daemon-cli.js +1 -1
  112. package/dist/cli-CIm7d5Id.js +149 -0
  113. package/dist/command-format-pq3tS8t2.d.ts +4 -0
  114. package/dist/command-registry-CDkp__KH.js +13 -0
  115. package/dist/command-registry-DSEkUBW1.js +212 -0
  116. package/dist/command-secret-gateway-CqP_o0n8.js +106 -0
  117. package/dist/compact.runtime-Qm_csEtG.js +111 -0
  118. package/dist/completion-cli-Ch1sgSLQ.js +445 -0
  119. package/dist/completion-cli-vF067Tso.js +16 -0
  120. package/dist/config-B2W1zTP1.js +44 -0
  121. package/dist/config-CMhKplgO.js +938 -0
  122. package/dist/config-DchtRsvs.js +30 -0
  123. package/dist/config-cli-C41d88_c.js +428 -0
  124. package/dist/config-guard-B_vjkXCQ.js +117 -0
  125. package/dist/config-schema-pPBCF4hz.js +31 -0
  126. package/dist/config-validation-6om9cBUx.js +262 -0
  127. package/dist/config-value-Dl3XEpA6.js +132 -0
  128. package/dist/configure-BxzvDSzu.js +1100 -0
  129. package/dist/configure-CLMLoWAn.js +238 -0
  130. package/dist/control-ui-shared-E8Nz6uKZ.js +29 -0
  131. package/dist/core-Cd3fMFKq.d.ts +87 -0
  132. package/dist/credentials-yYt6VWCq.js +268 -0
  133. package/dist/cron-cli-CA3lV3kh.js +634 -0
  134. package/dist/daemon-cli-BtQuIXEk.js +339 -0
  135. package/dist/daemon-install-BWKGzgMm.js +175 -0
  136. package/dist/deliver-CgMNmfTy.js +106 -0
  137. package/dist/deliver-runtime-Bn1KWoiQ.js +106 -0
  138. package/dist/devices-cli-D601npiL.js +340 -0
  139. package/dist/diagnostic-CkiYEGqt.js +310 -0
  140. package/dist/diffs-B5tZ8Coj.d.ts +1 -0
  141. package/dist/directory-cli-skEV8MT7.js +306 -0
  142. package/dist/directory-config-helpers-B-tiBKIv.d.ts +38 -0
  143. package/dist/directory-runtime-BEJ2fCIR.d.ts +1 -0
  144. package/dist/directory.static-CnyzoWbV.js +44 -0
  145. package/dist/discord-B_gbzPti.js +109 -0
  146. package/dist/discovery-CqI-e_Mv.js +48 -0
  147. package/dist/dm-policy-shared-nybkS1uP.d.ts +95 -0
  148. package/dist/dns-cli-Cjes3Ruw.js +216 -0
  149. package/dist/docs-cli-C3g3Gi_d.js +173 -0
  150. package/dist/doctor-completion-TvgV4SZH.js +90 -0
  151. package/dist/doctor-config-flow-0w9Ux7V8.js +107 -0
  152. package/dist/doctor-config-flow-DLzr8W7Y.js +2437 -0
  153. package/dist/enable-VYzv8b2z.js +24 -0
  154. package/dist/entry.d.ts +7 -0
  155. package/dist/entry.js +1 -1
  156. package/dist/env-overrides-DYVIkuvN.js +434 -0
  157. package/dist/env-overrides.runtime-6kijpIuu.js +17 -0
  158. package/dist/exec-approvals-cli-D_lkTG-l.js +419 -0
  159. package/dist/exec-sVmouhA9.d.ts +39 -0
  160. package/dist/extensions/acpx/index.d.ts +11 -0
  161. package/dist/extensions/acpx/index.js +1 -1
  162. package/dist/extensions/amazon-bedrock/index.d.ts +11 -0
  163. package/dist/extensions/anthropic/index.d.ts +11 -0
  164. package/dist/extensions/anthropic/index.js +26 -26
  165. package/dist/extensions/bluebubbles/index.d.ts +11 -0
  166. package/dist/extensions/bluebubbles/index.js +30 -30
  167. package/dist/extensions/bluebubbles/setup-entry.d.ts +59 -0
  168. package/dist/extensions/bluebubbles/setup-entry.js +30 -30
  169. package/dist/extensions/brave/index.d.ts +11 -0
  170. package/dist/extensions/brave/index.js +2 -2
  171. package/dist/extensions/byteplus/index.d.ts +11 -0
  172. package/dist/extensions/byteplus/index.js +26 -26
  173. package/dist/extensions/cloudflare-ai-gateway/index.d.ts +11 -0
  174. package/dist/extensions/cloudflare-ai-gateway/index.js +27 -27
  175. package/dist/extensions/copilot-proxy/index.d.ts +11 -0
  176. package/dist/extensions/device-pair/index.d.ts +12 -0
  177. package/dist/extensions/diagnostics-otel/index.d.ts +11 -0
  178. package/dist/extensions/diffs/index.d.ts +11 -0
  179. package/dist/extensions/discord/index.d.ts +11 -0
  180. package/dist/extensions/discord/index.js +31 -31
  181. package/dist/extensions/discord/setup-entry.d.ts +7 -0
  182. package/dist/extensions/discord/setup-entry.js +29 -29
  183. package/dist/extensions/elevenlabs/index.d.ts +11 -0
  184. package/dist/extensions/elevenlabs/index.js +26 -26
  185. package/dist/extensions/feishu/index.d.ts +229 -0
  186. package/dist/extensions/feishu/index.js +31 -31
  187. package/dist/extensions/feishu/setup-entry.d.ts +9 -0
  188. package/dist/extensions/feishu/setup-entry.js +28 -28
  189. package/dist/extensions/firecrawl/index.d.ts +11 -0
  190. package/dist/extensions/firecrawl/index.js +26 -26
  191. package/dist/extensions/github-copilot/index.d.ts +11 -0
  192. package/dist/extensions/github-copilot/index.js +27 -27
  193. package/dist/extensions/google/index.d.ts +11 -0
  194. package/dist/extensions/google/index.js +26 -26
  195. package/dist/extensions/googlechat/index.d.ts +11 -0
  196. package/dist/extensions/googlechat/index.js +30 -30
  197. package/dist/extensions/googlechat/setup-entry.d.ts +19 -0
  198. package/dist/extensions/googlechat/setup-entry.js +30 -30
  199. package/dist/extensions/huggingface/index.d.ts +11 -0
  200. package/dist/extensions/huggingface/index.js +26 -26
  201. package/dist/extensions/imessage/index.d.ts +11 -0
  202. package/dist/extensions/imessage/index.js +30 -30
  203. package/dist/extensions/imessage/setup-entry.d.ts +7 -0
  204. package/dist/extensions/imessage/setup-entry.js +30 -30
  205. package/dist/extensions/irc/index.d.ts +11 -0
  206. package/dist/extensions/irc/index.js +29 -29
  207. package/dist/extensions/irc/setup-entry.d.ts +8 -0
  208. package/dist/extensions/irc/setup-entry.js +29 -29
  209. package/dist/extensions/kakao-talkchannel/index.d.ts +19 -0
  210. package/dist/extensions/kakao-talkchannel/index.js +1762 -0
  211. package/dist/extensions/kakao-talkchannel/moldclaw.plugin.json +111 -0
  212. package/dist/extensions/kakao-talkchannel/package.json +12 -0
  213. package/dist/extensions/kilocode/index.d.ts +11 -0
  214. package/dist/extensions/kilocode/index.js +26 -26
  215. package/dist/extensions/kimi-coding/index.d.ts +11 -0
  216. package/dist/extensions/kimi-coding/index.js +26 -26
  217. package/dist/extensions/line/index.d.ts +11 -0
  218. package/dist/extensions/line/index.js +28 -28
  219. package/dist/extensions/line/setup-entry.d.ts +7 -0
  220. package/dist/extensions/line/setup-entry.js +28 -28
  221. package/dist/extensions/llm-task/index.d.ts +11 -0
  222. package/dist/extensions/llm-task/index.js +28 -28
  223. package/dist/extensions/lobster/index.d.ts +11 -0
  224. package/dist/extensions/matrix/index.d.ts +11 -0
  225. package/dist/extensions/matrix/index.js +31 -31
  226. package/dist/extensions/matrix/setup-entry.d.ts +20 -0
  227. package/dist/extensions/matrix/setup-entry.js +31 -31
  228. package/dist/extensions/mattermost/index.d.ts +11 -0
  229. package/dist/extensions/mattermost/index.js +28 -28
  230. package/dist/extensions/mattermost/setup-entry.d.ts +88 -0
  231. package/dist/extensions/mattermost/setup-entry.js +28 -28
  232. package/dist/extensions/memory-core/index.d.ts +11 -0
  233. package/dist/extensions/memory-lancedb/index.d.ts +25 -0
  234. package/dist/extensions/microsoft/index.d.ts +11 -0
  235. package/dist/extensions/microsoft/index.js +26 -26
  236. package/dist/extensions/minimax/index.d.ts +11 -0
  237. package/dist/extensions/minimax/index.js +26 -26
  238. package/dist/extensions/mistral/index.d.ts +11 -0
  239. package/dist/extensions/mistral/index.js +26 -26
  240. package/dist/extensions/modelstudio/index.d.ts +11 -0
  241. package/dist/extensions/modelstudio/index.js +26 -26
  242. package/dist/extensions/moonshot/index.d.ts +11 -0
  243. package/dist/extensions/moonshot/index.js +26 -26
  244. package/dist/extensions/msteams/index.d.ts +11 -0
  245. package/dist/extensions/msteams/index.js +31 -31
  246. package/dist/extensions/msteams/setup-entry.d.ts +11 -0
  247. package/dist/extensions/msteams/setup-entry.js +31 -31
  248. package/dist/extensions/nextcloud-talk/index.d.ts +11 -0
  249. package/dist/extensions/nextcloud-talk/index.js +28 -28
  250. package/dist/extensions/nextcloud-talk/setup-entry.d.ts +60 -0
  251. package/dist/extensions/nextcloud-talk/setup-entry.js +28 -28
  252. package/dist/extensions/nostr/index.d.ts +11 -0
  253. package/dist/extensions/nostr/index.js +28 -28
  254. package/dist/extensions/nostr/setup-entry.d.ts +49 -0
  255. package/dist/extensions/nostr/setup-entry.js +28 -28
  256. package/dist/extensions/nvidia/index.d.ts +11 -0
  257. package/dist/extensions/ollama/index.d.ts +11 -0
  258. package/dist/extensions/open-prose/index.d.ts +11 -0
  259. package/dist/extensions/openai/index.d.ts +11 -0
  260. package/dist/extensions/openai/index.js +26 -26
  261. package/dist/extensions/opencode/index.d.ts +11 -0
  262. package/dist/extensions/opencode/index.js +26 -26
  263. package/dist/extensions/opencode-go/index.d.ts +11 -0
  264. package/dist/extensions/opencode-go/index.js +26 -26
  265. package/dist/extensions/openrouter/index.d.ts +11 -0
  266. package/dist/extensions/openrouter/index.js +26 -26
  267. package/dist/extensions/openshell/index.d.ts +11 -0
  268. package/dist/extensions/openshell/index.js +26 -26
  269. package/dist/extensions/perplexity/index.d.ts +11 -0
  270. package/dist/extensions/perplexity/index.js +2 -2
  271. package/dist/extensions/phone-control/index.d.ts +12 -0
  272. package/dist/extensions/qianfan/index.d.ts +11 -0
  273. package/dist/extensions/qianfan/index.js +26 -26
  274. package/dist/extensions/qwen-portal-auth/index.d.ts +12 -0
  275. package/dist/extensions/qwen-portal-auth/index.js +26 -26
  276. package/dist/extensions/sglang/index.d.ts +11 -0
  277. package/dist/extensions/sglang/index.js +26 -26
  278. package/dist/extensions/signal/index.d.ts +11 -0
  279. package/dist/extensions/signal/index.js +29 -29
  280. package/dist/extensions/signal/setup-entry.d.ts +7 -0
  281. package/dist/extensions/signal/setup-entry.js +29 -29
  282. package/dist/extensions/slack/index.d.ts +11 -0
  283. package/dist/extensions/slack/index.js +30 -30
  284. package/dist/extensions/slack/setup-entry.d.ts +7 -0
  285. package/dist/extensions/slack/setup-entry.js +29 -29
  286. package/dist/extensions/synology-chat/index.d.ts +11 -0
  287. package/dist/extensions/synology-chat/index.js +28 -28
  288. package/dist/extensions/synology-chat/setup-entry.d.ts +138 -0
  289. package/dist/extensions/synology-chat/setup-entry.js +28 -28
  290. package/dist/extensions/synthetic/index.d.ts +11 -0
  291. package/dist/extensions/synthetic/index.js +26 -26
  292. package/dist/extensions/talk-voice/index.d.ts +12 -0
  293. package/dist/extensions/talk-voice/index.js +26 -26
  294. package/dist/extensions/telegram/index.d.ts +11 -0
  295. package/dist/extensions/telegram/index.js +29 -29
  296. package/dist/extensions/telegram/setup-entry.d.ts +7 -0
  297. package/dist/extensions/telegram/setup-entry.js +28 -28
  298. package/dist/extensions/thread-ownership/index.d.ts +12 -0
  299. package/dist/extensions/tlon/index.d.ts +11 -0
  300. package/dist/extensions/tlon/index.js +28 -28
  301. package/dist/extensions/tlon/setup-entry.d.ts +7 -0
  302. package/dist/extensions/tlon/setup-entry.js +28 -28
  303. package/dist/extensions/together/index.d.ts +11 -0
  304. package/dist/extensions/together/index.js +26 -26
  305. package/dist/extensions/twitch/index.d.ts +39 -0
  306. package/dist/extensions/twitch/index.js +28 -28
  307. package/dist/extensions/venice/index.d.ts +11 -0
  308. package/dist/extensions/venice/index.js +26 -26
  309. package/dist/extensions/vercel-ai-gateway/index.d.ts +11 -0
  310. package/dist/extensions/vercel-ai-gateway/index.js +26 -26
  311. package/dist/extensions/vllm/index.d.ts +11 -0
  312. package/dist/extensions/vllm/index.js +26 -26
  313. package/dist/extensions/voice-call/index.d.ts +11 -0
  314. package/dist/extensions/voice-call/index.js +26 -26
  315. package/dist/extensions/volcengine/index.d.ts +11 -0
  316. package/dist/extensions/volcengine/index.js +26 -26
  317. package/dist/extensions/whatsapp/index.d.ts +11 -0
  318. package/dist/extensions/whatsapp/index.js +29 -29
  319. package/dist/extensions/whatsapp/setup-entry.d.ts +7 -0
  320. package/dist/extensions/whatsapp/setup-entry.js +29 -29
  321. package/dist/extensions/xai/index.d.ts +11 -0
  322. package/dist/extensions/xai/index.js +26 -26
  323. package/dist/extensions/xiaomi/index.d.ts +11 -0
  324. package/dist/extensions/xiaomi/index.js +26 -26
  325. package/dist/extensions/zai/index.d.ts +11 -0
  326. package/dist/extensions/zai/index.js +26 -26
  327. package/dist/extensions/zalo/index.d.ts +11 -0
  328. package/dist/extensions/zalo/index.js +30 -30
  329. package/dist/extensions/zalo/setup-entry.d.ts +34 -0
  330. package/dist/extensions/zalo/setup-entry.js +30 -30
  331. package/dist/extensions/zalouser/index.d.ts +11 -0
  332. package/dist/extensions/zalouser/index.js +31 -31
  333. package/dist/extensions/zalouser/setup-entry.d.ts +42 -0
  334. package/dist/extensions/zalouser/setup-entry.js +31 -31
  335. package/dist/feishu-DCKEC3ao.d.ts +36 -0
  336. package/dist/gateway-cli-DN1Ii6J-.js +26432 -0
  337. package/dist/gateway-install-token-CJYFJBaC.js +163 -0
  338. package/dist/gateway-rpc-CroQg9MB.js +26 -0
  339. package/dist/gateway-runtime-D9FRZqKP.js +69 -0
  340. package/dist/googlechat-CBCkerAy.js +307 -0
  341. package/dist/googlechat-CSUNieHX.d.ts +12 -0
  342. package/dist/group-access-rSvkIglb.d.ts +61 -0
  343. package/dist/health-B6WwLJp4.js +570 -0
  344. package/dist/health-CAlJydXv.js +108 -0
  345. package/dist/history-BwNxb0sJ.d.ts +75 -0
  346. package/dist/hooks-BYlfU3Nf.d.ts +6 -0
  347. package/dist/hooks-cli-DuKmdo_H.js +995 -0
  348. package/dist/http-registry-DX_LVtuK.d.ts +20 -0
  349. package/dist/image-generation-DKkdRpve.d.ts +9 -0
  350. package/dist/imessage-7abjbe2Q.js +31 -0
  351. package/dist/imessage-DOH1yaDE.js +110 -0
  352. package/dist/inbound-envelope-CmvweL6U.d.ts +78 -0
  353. package/dist/inbound-reply-dispatch-BvnKTOec.js +71 -0
  354. package/dist/inbound-reply-dispatch-C7LjHRZN.d.ts +72 -0
  355. package/dist/index-DTQqfqj9.d.ts +1 -0
  356. package/dist/index.d.ts +27 -0
  357. package/dist/index.js +2 -2
  358. package/dist/infra/warning-filter.d.ts +10 -0
  359. package/dist/install-target-tXRD7VkM.js +574 -0
  360. package/dist/installs-C8fz8sm3.js +532 -0
  361. package/dist/io-C6XifaT4.js +9737 -0
  362. package/dist/io-C8awRnSW.js +28 -0
  363. package/dist/ipv4-d88_Jn2p.js +82 -0
  364. package/dist/irc-DpR6FXjN.js +672 -0
  365. package/dist/json-store-Sr_kk-II.d.ts +14 -0
  366. package/dist/keyed-async-queue-BA3BKukE.d.ts +19 -0
  367. package/dist/library-DOwowAGN.js +107 -0
  368. package/dist/lifecycle-core-BHHBoRTY.js +382 -0
  369. package/dist/line/accounts.d.ts +3 -0
  370. package/dist/line/send.d.ts +2 -0
  371. package/dist/line/send.js +4 -4
  372. package/dist/line/template-messages.d.ts +2 -0
  373. package/dist/line-8rsNbJCP.js +530 -0
  374. package/dist/line-D_cvIf6B.d.ts +75 -0
  375. package/dist/links-BOnvOj1z.d.ts +7 -0
  376. package/dist/llm-slug-generator-D9HjWtJT.js +67 -0
  377. package/dist/llm-slug-generator.d.ts +12 -0
  378. package/dist/llm-slug-generator.js +27 -27
  379. package/dist/logging-BhqLWxTD.js +13 -0
  380. package/dist/logging-DfaiL4OX.js +29 -0
  381. package/dist/login-qr-COBYR52w.js +233 -0
  382. package/dist/login-qr-xK4QIpPc.js +107 -0
  383. package/dist/logs-cli-RSSTw8L_.js +254 -0
  384. package/dist/manager-runtime-DL6JoSj9.js +106 -0
  385. package/dist/manager.runtime-Cbyhg1vB.js +710 -0
  386. package/dist/markdown-to-line-BTlEkOls.d.ts +91 -0
  387. package/dist/matrix-DX-jaB88.js +1490 -0
  388. package/dist/matrix-H6Yyj1QZ.d.ts +68 -0
  389. package/dist/matrix-J8s45tRw.js +1269 -0
  390. package/dist/mattermost-D75n6bRI.d.ts +6 -0
  391. package/dist/mcp-cli-CLc3_yCO.js +86 -0
  392. package/dist/media-understanding.runtime-BI0Lljbl.js +111 -0
  393. package/dist/memory-cli-CTp2cYrf.js +106 -0
  394. package/dist/method-scopes-Du8ODGFW.js +2586 -0
  395. package/dist/model-auth-markers-DEDakSUW.d.ts +20 -0
  396. package/dist/model-picker-CDBs7LJF.js +390 -0
  397. package/dist/model-picker-CRix4Wwv.js +107 -0
  398. package/dist/model-picker.runtime-CITyy3Rn.js +120 -0
  399. package/dist/model-suppression.runtime-Ce7D6QUT.js +111 -0
  400. package/dist/models-BK1eanuP.js +113 -0
  401. package/dist/models-X4Czy3uE.js +2514 -0
  402. package/dist/models-cli-C79Ulviy.js +304 -0
  403. package/dist/models-config-DALlu3S9.js +106 -0
  404. package/dist/models-config.providers.discovery-CSJ1STM1.d.ts +18 -0
  405. package/dist/monitor-B45a_RpX.js +3468 -0
  406. package/dist/monitor-C8KbJ-i0.js +767 -0
  407. package/dist/monitor-CIhrvegZ.js +3076 -0
  408. package/dist/monitor-CQut7klP.js +6823 -0
  409. package/dist/monitor-DZb5IJle.js +777 -0
  410. package/dist/monitor-DaFkdD27.js +108 -0
  411. package/dist/monitor-Do9Tp2Ii.js +110 -0
  412. package/dist/monitor-shared-CMK9cDOb.js +444 -0
  413. package/dist/msteams-A6H_wv5F.js +852 -0
  414. package/dist/net-DpMJgN-o.d.ts +19 -0
  415. package/dist/nextcloud-talk-f1pZ5Bge.d.ts +1 -0
  416. package/dist/node-cli-BXnmsjzL.js +2498 -0
  417. package/dist/node-resolve-CupmrA0Y.js +835 -0
  418. package/dist/nodes-cli-DZVrah_8.js +1375 -0
  419. package/dist/nostr-DMV534Ks.d.ts +7 -0
  420. package/dist/nostr-SAk3tjtR.js +8744 -0
  421. package/dist/npm-resolution-Dr9wssCY.js +60 -0
  422. package/dist/oauth-utils-DnyXdWU9.d.ts +10 -0
  423. package/dist/onboard-BE5pmb1g.js +589 -0
  424. package/dist/onboard-channels-3hNVY0E7.js +1241 -0
  425. package/dist/onboard-channels-vaO3nWLL.js +200 -0
  426. package/dist/onboard-custom-CI5uFyWH.js +571 -0
  427. package/dist/onboard-custom-eIvRswgv.js +109 -0
  428. package/dist/onboard-helpers-ChMWfUnl.js +335 -0
  429. package/dist/onboard-helpers-DRFi9oaD.js +108 -0
  430. package/dist/onboard-remote-BTspTgA4.js +112 -0
  431. package/dist/onboard-remote-so38yXlX.js +181 -0
  432. package/dist/onboard-search-DS0tZS24.js +297 -0
  433. package/dist/onboard-skills-B9DxCCiU.js +133 -0
  434. package/dist/onboard-skills-so0a_BJV.js +112 -0
  435. package/dist/outbound-media-BiJscGlR.js +11 -0
  436. package/dist/outbound-media-DJF-TuJu.d.ts +11 -0
  437. package/dist/pairing-access-CuiJP9xN.d.ts +21 -0
  438. package/dist/pairing-cli-DN0u1Cez.js +212 -0
  439. package/dist/parse-finite-number-B3FJTjyQ.d.ts +5 -0
  440. package/dist/perplexity-Bw1u3CAF.js +24 -0
  441. package/dist/persistent-dedupe-DR5Ka6BX.d.ts +26 -0
  442. package/dist/pi-model-discovery-runtime-iwKNCaYu.js +106 -0
  443. package/dist/pi-tools.before-tool-call.runtime-BM_N-JZe.js +380 -0
  444. package/dist/plugin-install--KVul05Z.js +184 -0
  445. package/dist/plugin-install-DVpPsLkS.js +112 -0
  446. package/dist/plugin-install-plan-Dwc6-coz.js +49 -0
  447. package/dist/plugin-registry-XRswugE9.js +108 -0
  448. package/dist/plugin-registry-jozQafRo.js +49 -0
  449. package/dist/plugin-sdk/account-resolution.js +26 -26
  450. package/dist/plugin-sdk/acp-runtime.js +26 -26
  451. package/dist/plugin-sdk/acpx.js +1 -1
  452. package/dist/plugin-sdk/agent-runtime.js +26 -26
  453. package/dist/plugin-sdk/bluebubbles.js +29 -29
  454. package/dist/plugin-sdk/channel-config-helpers.js +26 -26
  455. package/dist/plugin-sdk/channel-config-schema.js +2 -2
  456. package/dist/plugin-sdk/channel-policy.js +26 -26
  457. package/dist/plugin-sdk/channel-runtime.js +26 -26
  458. package/dist/plugin-sdk/compat.js +27 -27
  459. package/dist/plugin-sdk/config-runtime.js +28 -28
  460. package/dist/plugin-sdk/conversation-runtime.js +26 -26
  461. package/dist/plugin-sdk/discord.js +26 -26
  462. package/dist/plugin-sdk/feishu.js +27 -27
  463. package/dist/plugin-sdk/gateway-runtime.js +8 -8
  464. package/dist/plugin-sdk/googlechat.js +29 -29
  465. package/dist/plugin-sdk/image-generation-runtime.js +26 -26
  466. package/dist/plugin-sdk/image-generation.js +26 -26
  467. package/dist/plugin-sdk/imessage.js +27 -27
  468. package/dist/plugin-sdk/index.js +26 -26
  469. package/dist/plugin-sdk/infra-runtime.js +26 -26
  470. package/dist/plugin-sdk/irc.js +29 -29
  471. package/dist/plugin-sdk/line.js +27 -27
  472. package/dist/plugin-sdk/llm-task.js +26 -26
  473. package/dist/plugin-sdk/matrix.js +29 -29
  474. package/dist/plugin-sdk/mattermost.js +28 -28
  475. package/dist/plugin-sdk/media-runtime.js +26 -26
  476. package/dist/plugin-sdk/media-understanding-runtime.js +26 -26
  477. package/dist/plugin-sdk/media-understanding.js +26 -26
  478. package/dist/plugin-sdk/msteams.js +30 -30
  479. package/dist/plugin-sdk/nextcloud-talk.js +28 -28
  480. package/dist/plugin-sdk/nostr.js +27 -27
  481. package/dist/plugin-sdk/plugin-runtime.js +26 -26
  482. package/dist/plugin-sdk/provider-auth.js +28 -28
  483. package/dist/plugin-sdk/provider-setup.js +27 -27
  484. package/dist/plugin-sdk/provider-web-search.js +1 -1
  485. package/dist/plugin-sdk/qwen-portal-auth.js +26 -26
  486. package/dist/plugin-sdk/reply-history.js +26 -26
  487. package/dist/plugin-sdk/reply-runtime.js +26 -26
  488. package/dist/plugin-sdk/sandbox.js +26 -26
  489. package/dist/plugin-sdk/security-runtime.js +26 -26
  490. package/dist/plugin-sdk/self-hosted-provider-setup.js +27 -27
  491. package/dist/plugin-sdk/setup.js +27 -27
  492. package/dist/plugin-sdk/signal.js +26 -26
  493. package/dist/plugin-sdk/slack.js +26 -26
  494. package/dist/plugin-sdk/speech-runtime.js +26 -26
  495. package/dist/plugin-sdk/speech.js +26 -26
  496. package/dist/plugin-sdk/src/channels/plugins/setup-wizard-helpers.d.ts +3 -0
  497. package/dist/plugin-sdk/src/config/config-lock.d.ts +38 -0
  498. package/dist/plugin-sdk/src/config/config.d.ts +1 -1
  499. package/dist/plugin-sdk/src/config/io.d.ts +39 -0
  500. package/dist/plugin-sdk/src/config/types.gateway.d.ts +12 -0
  501. package/dist/plugin-sdk/src/config/types.secrets.d.ts +10 -0
  502. package/dist/plugin-sdk/src/config/zod-schema.d.ts +2 -0
  503. package/dist/plugin-sdk/src/gateway/credential-planner.d.ts +3 -1
  504. package/dist/plugin-sdk/src/secrets/provider-env-vars.d.ts +61 -0
  505. package/dist/plugin-sdk/src/secrets/sec1-placeholder.d.ts +181 -0
  506. package/dist/plugin-sdk/src/secrets/sec1-utils.d.ts +57 -0
  507. package/dist/plugin-sdk/synology-chat.js +27 -27
  508. package/dist/plugin-sdk/telegram.js +26 -26
  509. package/dist/plugin-sdk/text-runtime.js +4 -4
  510. package/dist/plugin-sdk/tlon.js +27 -27
  511. package/dist/plugin-sdk/twitch.js +26 -26
  512. package/dist/plugin-sdk/voice-call.js +26 -26
  513. package/dist/plugin-sdk/whatsapp.js +26 -26
  514. package/dist/plugin-sdk/zalo.js +30 -30
  515. package/dist/plugin-sdk/zalouser.js +29 -29
  516. package/dist/plugins/runtime/index.d.ts +22 -0
  517. package/dist/plugins/runtime/index.js +26 -26
  518. package/dist/plugins-C4PiDdjc.js +106 -0
  519. package/dist/plugins-cli-zhmliYNU.js +912 -0
  520. package/dist/policy-CcSolumc.js +143 -0
  521. package/dist/preflight-audio.runtime-BAbfqqzW.js +111 -0
  522. package/dist/probe-Bgt5c-cr.js +129 -0
  523. package/dist/probe-CPk5iGcg.js +47 -0
  524. package/dist/probe-DR4KRKXz.js +19 -0
  525. package/dist/probe-DnoCyJ_m.js +1793 -0
  526. package/dist/probe-VsLtK3vQ.js +6328 -0
  527. package/dist/probe-auth-BnsKrQt7.js +38 -0
  528. package/dist/probe-auth-DYdUG8l1.js +48 -0
  529. package/dist/program-8enYYBsc.js +247 -0
  530. package/dist/prompt-select-styled-DxBcUasv.js +2673 -0
  531. package/dist/provider-api-key-auth.runtime-DsLZyt6h.js +116 -0
  532. package/dist/provider-auth-choice-30EvRxqc.js +126 -0
  533. package/dist/provider-auth-choice-preference-DMr1WmRg.js +189 -0
  534. package/dist/provider-auth-choice.runtime-CI98BgQF.js +118 -0
  535. package/dist/provider-auth-guidance-WKDIi_wk.js +34 -0
  536. package/dist/provider-auth-result-Cs8wguSI.d.ts +18 -0
  537. package/dist/provider-models-EOys_Nvi.d.ts +867 -0
  538. package/dist/provider-ollama-setup-D89zlm9C.d.ts +32 -0
  539. package/dist/provider-onboard-BzOpgCLu.d.ts +40 -0
  540. package/dist/provider-runtime.runtime-Cm4as2KG.js +106 -0
  541. package/dist/provider-self-hosted-setup-Bmv_AQmw.d.ts +61 -0
  542. package/dist/provider-self-hosted-setup-CJwFVVB4.js +182 -0
  543. package/dist/provider-usage-CVNyLLDb.js +106 -0
  544. package/dist/provider-usage.types-CdTymHNu.d.ts +16 -0
  545. package/dist/provider-web-search-BJhXD5dH.js +2392 -0
  546. package/dist/provider-wizard-DMMYXjlW.js +152 -0
  547. package/dist/push-apns-BnWTdTEk.js +1038 -0
  548. package/dist/pw-ai-CtK_7Cy2.js +1866 -0
  549. package/dist/qr-cli-CA-BF0--.js +108 -0
  550. package/dist/qr-cli-D18HiUkh.js +369 -0
  551. package/dist/reactions-Df7XG8Uh.js +281 -0
  552. package/dist/read-only-account-inspect.discord.runtime-B-FP0mwb.js +111 -0
  553. package/dist/read-only-account-inspect.slack.runtime-DkWZ2ccW.js +111 -0
  554. package/dist/read-only-account-inspect.telegram.runtime-BnlTkn_e.js +111 -0
  555. package/dist/redact-snapshot-DVdstBvO.js +2661 -0
  556. package/dist/ref-contract-RPkB754Q.js +53 -0
  557. package/dist/register.agent-DVAxXQKW.js +434 -0
  558. package/dist/register.backup-CUuL5KUZ.js +624 -0
  559. package/dist/register.configure-bC0UEwfU.js +247 -0
  560. package/dist/register.maintenance-iIqvl_eT.js +569 -0
  561. package/dist/register.message-CEDd4z07.js +704 -0
  562. package/dist/register.onboard-Cejfnysy.js +187 -0
  563. package/dist/register.setup-DU7uHdYt.js +207 -0
  564. package/dist/register.status-health-sessions-BWphMXNR.js +493 -0
  565. package/dist/register.subclis-DnIweTEG.js +315 -0
  566. package/dist/register.subclis-gJX_Pbub.js +12 -0
  567. package/dist/registry-Dgwc-7eS.js +1183 -0
  568. package/dist/replies-D9PEZ8yn.js +110 -0
  569. package/dist/reply-history-lHgoC4l3.d.ts +1 -0
  570. package/dist/reply-payload-Bd2HuR4g.d.ts +46 -0
  571. package/dist/request-url-BcSJaiiu.d.ts +5 -0
  572. package/dist/resolve-BbsCHGLY.js +660 -0
  573. package/dist/resolve-channels-BtrGC95o.js +262 -0
  574. package/dist/resolve-channels-C1SthO1N.js +226 -0
  575. package/dist/resolve-users-CgSxHrU0.js +143 -0
  576. package/dist/routes-BZtqNrBf.js +7097 -0
  577. package/dist/rpc-D3KMxG4J.js +67 -0
  578. package/dist/run-command-C8b3dCZV.d.ts +16 -0
  579. package/dist/run-main-BlWJVotF.js +423 -0
  580. package/dist/runtime-RWGbO5Qy.d.ts +26 -0
  581. package/dist/runtime-discord-ops.runtime-DUXIYvQr.js +9073 -0
  582. package/dist/runtime-slack-ops.runtime-n1yFfyp1.js +4551 -0
  583. package/dist/runtime-telegram-ops.runtime-PZUWchjT.js +128 -0
  584. package/dist/runtime-whatsapp-login.runtime-xsuNyvGz.js +109 -0
  585. package/dist/runtime-whatsapp-outbound.runtime-5EfEyCsO.js +112 -0
  586. package/dist/sandbox-cli-Dw1nWNmQ.js +530 -0
  587. package/dist/search-manager-BJoRxOaf.js +15 -0
  588. package/dist/search-manager-DxkQvUrW.js +386 -0
  589. package/dist/secret-input-schema-Cp_La9qv.d.ts +19 -0
  590. package/dist/secrets-cli-BPyV2gSq.js +2065 -0
  591. package/dist/security-cli-EK4sSRfG.js +570 -0
  592. package/dist/send-B01Gvh9m.js +629 -0
  593. package/dist/send-B4L4wRJO.js +100 -0
  594. package/dist/send-BDcGrXt0.js +1025 -0
  595. package/dist/send-BRRtHxyR.js +283 -0
  596. package/dist/send-DU6dmMXW.js +631 -0
  597. package/dist/server-CWw5GFEg.js +106 -0
  598. package/dist/server-node-events-92cDVswC.js +501 -0
  599. package/dist/session-key-DbkfhOjM.d.ts +46 -0
  600. package/dist/sessions-B052uHA3.js +218 -0
  601. package/dist/sessions-Cef4dZNP.js +107 -0
  602. package/dist/setup-BlQPyDPy.js +387 -0
  603. package/dist/setup-DcSZ_pTn.d.ts +37 -0
  604. package/dist/setup-core-B9mdZYnU.js +166 -0
  605. package/dist/setup-core-Cj0sLkpP.js +47 -0
  606. package/dist/setup-core-CkZbebOv.js +143 -0
  607. package/dist/setup-core-MRNjnrJl.js +205 -0
  608. package/dist/setup-surface-3ZY0JtWE.js +490 -0
  609. package/dist/setup-wizard-helpers-Dwzb9Dcz.d.ts +203 -0
  610. package/dist/setup.finalize-B5ETm3Ui.js +517 -0
  611. package/dist/setup.gateway-config-C8hdtlbw.js +338 -0
  612. package/dist/setup.secret-input-BZSIeiqy.js +25 -0
  613. package/dist/shared--9_eQ_lc.js +75 -0
  614. package/dist/shared-CxkH3H0U.js +102 -0
  615. package/dist/shared-DTNL0hA9.js +298 -0
  616. package/dist/shared-HSP1OV-Q.js +96 -0
  617. package/dist/shared-UIjWb_3B.js +182 -0
  618. package/dist/signal-CTI6bSmB.js +109 -0
  619. package/dist/skills-4-r1mfJM.js +853 -0
  620. package/dist/skills-RNm54CBO.js +19 -0
  621. package/dist/skills-cli-te7dSs5p.js +291 -0
  622. package/dist/skills-install-Del-Ogv8.js +763 -0
  623. package/dist/skills-status-BZpoMXrR.js +169 -0
  624. package/dist/skills-status-Dq61Sz8U.js +20 -0
  625. package/dist/slack-oc-viUtl.js +109 -0
  626. package/dist/slash-commands.runtime-NdkD2LZV.js +123 -0
  627. package/dist/slash-dispatch.runtime-DQgeaF3J.js +136 -0
  628. package/dist/slash-skill-commands.runtime-DmOl2DnL.js +111 -0
  629. package/dist/src-0wtt7seR.js +1696 -0
  630. package/dist/status-5oR_gqv_.js +121 -0
  631. package/dist/status-BO8LY0hC.js +1599 -0
  632. package/dist/status-D_oHA9yO.js +126 -0
  633. package/dist/status-IrMacJRj.js +606 -0
  634. package/dist/status-Prdeg53E.js +43 -0
  635. package/dist/status-json-Da0hR-1Z.js +286 -0
  636. package/dist/status.link-channel-BgUJEZAz.js +138 -0
  637. package/dist/status.scan.deps.runtime-D9vHTxOW.js +121 -0
  638. package/dist/status.scan.runtime-D-EdD5CW.js +114 -0
  639. package/dist/status.summary--i6xduWH.js +592 -0
  640. package/dist/status.summary.runtime-BqMXjaBc.js +113 -0
  641. package/dist/subagent-orphan-recovery-DiRJcFQc.js +302 -0
  642. package/dist/subagent-registry-runtime-B66EYEYm.js +106 -0
  643. package/dist/synology-chat-BemXqdzG.js +297 -0
  644. package/dist/system-cli-CSuiia4-.js +92 -0
  645. package/dist/telegram/audit.d.ts +2 -0
  646. package/dist/telegram/audit.js +1 -1
  647. package/dist/telegram/token.d.ts +2 -0
  648. package/dist/telegram/token.js +26 -26
  649. package/dist/telegram-DLFcRv5a.js +109 -0
  650. package/dist/testing-DZrulv-n.d.ts +1755 -0
  651. package/dist/text-chunking-BaYBIUoR.d.ts +79 -0
  652. package/dist/text-chunking-C8kmbNfa.js +84 -0
  653. package/dist/thinking-D8aqmr3o.d.ts +13 -0
  654. package/dist/tlon-Bpr4f3yF.js +433 -0
  655. package/dist/tool-send-BHKm5ztm.d.ts +9 -0
  656. package/dist/tui-BY3QRgC1.js +3834 -0
  657. package/dist/tui-cli-CCfZOlV0.js +132 -0
  658. package/dist/types-CKx5nDZB.d.ts +45 -0
  659. package/dist/types-DBhDdMQd.d.ts +22670 -0
  660. package/dist/types.base-B_TkkSS8.d.ts +188 -0
  661. package/dist/types.secrets-Bojc4omL.js +92 -0
  662. package/dist/ui-1UpZZyI3.js +31 -0
  663. package/dist/update-BR4JvFpV.js +1036 -0
  664. package/dist/update-cli-BZv44lFq.js +1498 -0
  665. package/dist/update-offset-store-DGdBotIW.js +107 -0
  666. package/dist/update-runner-D34sooPe.js +1496 -0
  667. package/dist/vllm-defaults-BCGSJ7K0.d.ts +13 -0
  668. package/dist/wait-BU9vJv22.d.ts +4 -0
  669. package/dist/web-CXpU2D41.js +107 -0
  670. package/dist/web-shared-B4sL45ah.d.ts +45 -0
  671. package/dist/webhook-memory-guards-B7oLVseG.d.ts +43 -0
  672. package/dist/webhook-request-guards-CqIH7equ.d.ts +76 -0
  673. package/dist/webhook-targets-CAAGATtk.js +181 -0
  674. package/dist/webhook-targets-oQ0jd4r0.d.ts +106 -0
  675. package/dist/webhooks-cli-B46t2VT5.js +349 -0
  676. package/dist/whatsapp-Dniwd4Rv.js +109 -0
  677. package/dist/whatsapp-actions-fL46PsNs.js +162 -0
  678. package/dist/windows-spawn-DGeE98SH.d.ts +43 -0
  679. package/dist/workspace-dirs-d3Ms_ryk.js +2002 -0
  680. package/dist/zalo-Csulx0XK.d.ts +9 -0
  681. package/dist/zalo-gh0yAWmS.js +415 -0
  682. package/dist/zalouser-CuxRvztM.js +30911 -0
  683. package/dist/zod-schema.agent-runtime-B4MkB-_3.d.ts +10 -0
  684. package/dist/zod-schema.core-D5reNip6.js +541 -0
  685. package/dist/zod-schema.core-DN3RhEUG.d.ts +173 -0
  686. package/docs/SEC1.md +523 -0
  687. package/docs/SEC1_IMPLEMENTATION/CHANNELS_REPORT.md +173 -0
  688. package/docs/SEC1_IMPLEMENTATION/CORE_UTIL_REPORT.md +139 -0
  689. package/docs/SEC1_IMPLEMENTATION/DOCS_REPORT.md +134 -0
  690. package/docs/SEC1_IMPLEMENTATION/ENV_MAP_DRAFT.md +148 -0
  691. package/docs/SEC1_IMPLEMENTATION/INTEGRATION_REPORT.md +170 -0
  692. package/docs/SEC1_IMPLEMENTATION/PROVIDERS_REPORT.md +291 -0
  693. package/docs/SEC1_IMPLEMENTATION/QA_REPORT.md +249 -0
  694. package/docs/SEC1_IMPLEMENTATION/RECURSIVE_QA/wave1-channels.md +317 -0
  695. package/docs/SEC1_IMPLEMENTATION/RECURSIVE_QA/wave1-docs.md +212 -0
  696. package/docs/SEC1_IMPLEMENTATION/RECURSIVE_QA/wave1-security.md +368 -0
  697. package/docs/SEC1_IMPLEMENTATION/RECURSIVE_QA/wave2-critic-consolidated.md +195 -0
  698. package/docs/SEC1_IMPLEMENTATION/RECURSIVE_QA/wave3-fix-report.md +105 -0
  699. package/docs/SEC1_IMPLEMENTATION/STRATEGY.md +451 -0
  700. package/docs/SEC1_IMPLEMENTATION/TEST_REPORT.md +156 -0
  701. package/docs/pipeline-sdk/CLI_SPEC.md +609 -0
  702. package/docs/pipeline-sdk/PIPELINE_SDK_DESIGN.md +1372 -0
  703. package/extensions/kakao-talkchannel/MIGRATION_ARCH_ANALYSIS.md +455 -0
  704. package/extensions/kakao-talkchannel/MIGRATION_CODE_ANALYSIS.md +383 -0
  705. package/extensions/kakao-talkchannel/MIGRATION_STRATEGY.md +115 -0
  706. package/extensions/kakao-talkchannel/README.md +50 -0
  707. package/extensions/kakao-talkchannel/index.ts +20 -0
  708. package/extensions/kakao-talkchannel/moldclaw.plugin.json +98 -0
  709. package/extensions/kakao-talkchannel/package.json +12 -0
  710. package/extensions/kakao-talkchannel/src/adapters/config.ts +132 -0
  711. package/extensions/kakao-talkchannel/src/adapters/gateway.ts +974 -0
  712. package/extensions/kakao-talkchannel/src/adapters/outbound.ts +52 -0
  713. package/extensions/kakao-talkchannel/src/adapters/pairing.ts +35 -0
  714. package/extensions/kakao-talkchannel/src/adapters/security.ts +57 -0
  715. package/extensions/kakao-talkchannel/src/adapters/setup.ts +105 -0
  716. package/extensions/kakao-talkchannel/src/adapters/status.ts +117 -0
  717. package/extensions/kakao-talkchannel/src/channel.ts +58 -0
  718. package/extensions/kakao-talkchannel/src/commands/card.ts +413 -0
  719. package/extensions/kakao-talkchannel/src/config/schema.ts +129 -0
  720. package/extensions/kakao-talkchannel/src/kakao/callback.ts +133 -0
  721. package/extensions/kakao-talkchannel/src/kakao/limits.ts +129 -0
  722. package/extensions/kakao-talkchannel/src/kakao/payload.ts +138 -0
  723. package/extensions/kakao-talkchannel/src/kakao/response.ts +373 -0
  724. package/extensions/kakao-talkchannel/src/relay/client.ts +146 -0
  725. package/extensions/kakao-talkchannel/src/relay/session.ts +137 -0
  726. package/extensions/kakao-talkchannel/src/relay/sse.ts +258 -0
  727. package/extensions/kakao-talkchannel/src/relay/stream.ts +149 -0
  728. package/extensions/kakao-talkchannel/src/runtime.ts +21 -0
  729. package/extensions/kakao-talkchannel/src/types.ts +447 -0
  730. package/extensions/kakao-talkchannel/src/version.ts +3 -0
  731. package/extensions/kakao-talkchannel/tsconfig.json +19 -0
  732. package/package.json +23 -8
  733. package/skills/meshy/SKILL.md +69 -0
  734. package/skills/meshy/scripts/__pycache__/check_status.cpython-312.pyc +0 -0
  735. package/skills/meshy/scripts/__pycache__/image_to_3d.cpython-312.pyc +0 -0
  736. package/skills/meshy/scripts/__pycache__/text_to_3d.cpython-312.pyc +0 -0
  737. package/skills/meshy/scripts/check_status.py +147 -0
  738. package/skills/meshy/scripts/image_to_3d.py +229 -0
  739. package/skills/meshy/scripts/text_to_3d.py +214 -0
  740. package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
  741. package/skills/openai-whisper-api/scripts/transcribe.sh +0 -0
  742. package/skills/tavily-search/SKILL.md +61 -0
  743. package/skills/tavily-search/scripts/__pycache__/search.cpython-312.pyc +0 -0
  744. package/skills/tavily-search/scripts/search.py +238 -0
  745. package/skills/video-frames/scripts/frame.sh +0 -0
  746. package/LICENSE +0 -21
  747. package/dist/accounts-UcSvD34O.js +0 -109
  748. package/dist/acp-cli-BPb8PgHP.js +0 -2088
  749. package/dist/actions.runtime-BL5QRooG.js +0 -114
  750. package/dist/actions.runtime-DSdfSo40.js +0 -128
  751. package/dist/agents-CHeX_5-H.js +0 -217
  752. package/dist/agents-DQRL9XKP.js +0 -853
  753. package/dist/allow-list-Boi79v-U.js +0 -81
  754. package/dist/allowlist-B2eBBeMF.js +0 -142
  755. package/dist/api-CFAtRSYL.js +0 -6953
  756. package/dist/api-D5JNJj8n.js +0 -112
  757. package/dist/audit-BM0GsdzV.js +0 -787
  758. package/dist/audit-BqRK9OSj.js +0 -54
  759. package/dist/audit-channel.collect.runtime-BPvDB8aq.js +0 -600
  760. package/dist/audit-channel.runtime-D3fzHiAo.js +0 -116
  761. package/dist/audit-extra.async-NveNIzX0.js +0 -813
  762. package/dist/audit-membership-runtime-mu470WFO.js +0 -157
  763. package/dist/audit.deep.runtime-RdxvW8Tj.js +0 -24
  764. package/dist/audit.nondeep.runtime-DDu8vA9Z.js +0 -831
  765. package/dist/audit.runtime-Y8C9W7s9.js +0 -113
  766. package/dist/auth-choice-C1CIxRsi.js +0 -268
  767. package/dist/auth-choice-CTvqWiDI.js +0 -117
  768. package/dist/auth-choice-Ddzko1B8.js +0 -502
  769. package/dist/auth-choice-options-BIAmAiCe.js +0 -123
  770. package/dist/auth-choice-prompt-B815kArz.js +0 -110
  771. package/dist/auth-choice-prompt-CGhTNCJx.js +0 -36
  772. package/dist/auth-choice.plugin-providers.runtime-AvAZ6S5W.js +0 -114
  773. package/dist/auth-profiles-BJcHzwPy.js +0 -127650
  774. package/dist/auth-profiles.runtime-CieFilK5.js +0 -111
  775. package/dist/bluebubbles-F8FGE9cH.js +0 -64
  776. package/dist/brave-BG5Yopn8.js +0 -24
  777. package/dist/browser-cli-Co7PJGZF.js +0 -1492
  778. package/dist/call-CoaQYq7c.js +0 -639
  779. package/dist/call-D3eu5Jjh.js +0 -37
  780. package/dist/channel-BftWD6yu.js +0 -1321
  781. package/dist/channel-Bub9U5Xg.js +0 -214
  782. package/dist/channel-C0oDs7TO.js +0 -4681
  783. package/dist/channel-C8CnEdkZ.js +0 -352
  784. package/dist/channel-CI-RC-xf.js +0 -497
  785. package/dist/channel-CY-hZCOJ.js +0 -397
  786. package/dist/channel-CbtGJB2x.js +0 -943
  787. package/dist/channel-CcfK3wP8.js +0 -803
  788. package/dist/channel-DBoDIeVj.js +0 -619
  789. package/dist/channel-DEq6Ecs-.js +0 -920
  790. package/dist/channel-DH4dhW1n.js +0 -226
  791. package/dist/channel-DQ_wdKg_.js +0 -575
  792. package/dist/channel-DT6qD1Ic.js +0 -207
  793. package/dist/channel-DZNAyxwr.js +0 -542
  794. package/dist/channel-DtakwAEe.js +0 -538
  795. package/dist/channel-DuYgH6p1.js +0 -562
  796. package/dist/channel-Hn-AN-d52.js +0 -316
  797. package/dist/channel-_R4hbD5h.js +0 -1598
  798. package/dist/channel-account-context-DXq8dlvI.js +0 -103
  799. package/dist/channel-kQmEVn3I.js +0 -306
  800. package/dist/channel-options-DHfxaklg.js +0 -50
  801. package/dist/channel-summary-DUpnoYhI.js +0 -106
  802. package/dist/channel-t-JxCWk6.js +0 -949
  803. package/dist/channel.runtime--GYriaXU.js +0 -213
  804. package/dist/channel.runtime-BJtn3GOH.js +0 -174
  805. package/dist/channel.runtime-BV7t_oNz.js +0 -166
  806. package/dist/channel.runtime-Bi8a3n9S.js +0 -865
  807. package/dist/channel.runtime-BjsYF0NN.js +0 -122
  808. package/dist/channel.runtime-BnI6YtmI.js +0 -413
  809. package/dist/channel.runtime-CQOftcCd.js +0 -194
  810. package/dist/channel.runtime-CuIAcPjZ.js +0 -4006
  811. package/dist/channel.runtime-DH1Q1G4k.js +0 -399
  812. package/dist/channel.runtime-DYYUPKxr.js +0 -236
  813. package/dist/channel.runtime-U5Gszsr5.js +0 -177
  814. package/dist/channel.setup-BQFHmgki.js +0 -9
  815. package/dist/channel.setup-BVoDwklu.js +0 -8
  816. package/dist/channel.setup-Bf73HsXr.js +0 -57
  817. package/dist/channel.setup-CblD4flM.js +0 -11
  818. package/dist/channel.setup-DgxlrPgz.js +0 -6
  819. package/dist/channel.setup-GLIAEVKL.js +0 -8
  820. package/dist/channel.setup-YTy5R1sz.js +0 -9
  821. package/dist/channels-CTL8iR9J.js +0 -404
  822. package/dist/channels-DBGvnjHY.js +0 -1113
  823. package/dist/channels-cli-BmVO5-sq.js +0 -286
  824. package/dist/channels-status-issues-kDtsWzA-.js +0 -16
  825. package/dist/clawbot-cli-DtcMJHqX.js +0 -113
  826. package/dist/cli-BNGECGVY.js +0 -149
  827. package/dist/command-registry-1SDrWgER.js +0 -13
  828. package/dist/command-registry-DNorYU4w.js +0 -212
  829. package/dist/command-secret-gateway-DqDZparO.js +0 -106
  830. package/dist/compact.runtime-C1ZN8UGb.js +0 -111
  831. package/dist/completion-cli-Q_Jt5Foc.js +0 -16
  832. package/dist/completion-cli-QkTXhuJh.js +0 -445
  833. package/dist/config-BbxrRaLf.js +0 -938
  834. package/dist/config-CkD8DJ7L.js +0 -44
  835. package/dist/config-cli-BoPrlYTp.js +0 -428
  836. package/dist/config-guard-CEhCvr_u.js +0 -117
  837. package/dist/config-schema-GQ6uWjXe.js +0 -31
  838. package/dist/config-validation-woE2_LpC.js +0 -262
  839. package/dist/config-value-Dh8m-CFf.js +0 -132
  840. package/dist/config-y4i5g7s4.js +0 -30
  841. package/dist/configure-DGRzwdFN.js +0 -1100
  842. package/dist/configure-S4AHE3k_.js +0 -238
  843. package/dist/control-ui-shared-kLBp4YlS.js +0 -29
  844. package/dist/credentials-D5uBf_C5.js +0 -265
  845. package/dist/cron-cli-lGupeVCW.js +0 -634
  846. package/dist/daemon-cli-Cs_edi0I.js +0 -339
  847. package/dist/daemon-install-DIFpP_qv.js +0 -175
  848. package/dist/deliver-DYa_DFZU.js +0 -106
  849. package/dist/deliver-runtime-DCW_o2Ot.js +0 -106
  850. package/dist/devices-cli-YsGOW2-w.js +0 -340
  851. package/dist/diagnostic-vMghIesG.js +0 -310
  852. package/dist/directory-cli-DtjMQjU5.js +0 -306
  853. package/dist/directory.static-DBZGvsdF.js +0 -44
  854. package/dist/discord-DYCu19HT.js +0 -109
  855. package/dist/discovery-DZYAoDF_.js +0 -48
  856. package/dist/dns-cli-DqW4pNgW.js +0 -216
  857. package/dist/docs-cli-Bu9TBlDU.js +0 -173
  858. package/dist/doctor-completion-B5hcQD5c.js +0 -90
  859. package/dist/doctor-config-flow-BBB2ZKfT.js +0 -107
  860. package/dist/doctor-config-flow-DDBYUS9f.js +0 -2437
  861. package/dist/enable-Tmsp8QuB.js +0 -24
  862. package/dist/env-overrides-BHxqjYZG.js +0 -434
  863. package/dist/env-overrides.runtime-Cz98bf-l.js +0 -17
  864. package/dist/exec-approvals-cli-wO5cYfMa.js +0 -419
  865. package/dist/gateway-cli-CFvDGhB9.js +0 -26429
  866. package/dist/gateway-install-token-CskJfo_N.js +0 -163
  867. package/dist/gateway-rpc-srYfBID9.js +0 -26
  868. package/dist/gateway-runtime-C76hUmUV.js +0 -69
  869. package/dist/googlechat-Cha5utST.js +0 -307
  870. package/dist/health-DDQYYsJy.js +0 -108
  871. package/dist/health-DXZykGaX.js +0 -570
  872. package/dist/hooks-cli-DfkurPYP.js +0 -995
  873. package/dist/imessage-B26k39pl.js +0 -110
  874. package/dist/imessage-Bp1_6cws.js +0 -31
  875. package/dist/inbound-reply-dispatch-DoIJLztA.js +0 -71
  876. package/dist/install-target-BjOuS4I8.js +0 -574
  877. package/dist/installs-Cz4k0W1Y.js +0 -532
  878. package/dist/io-B0OKifLZ.js +0 -28
  879. package/dist/io-DcoxdH6t.js +0 -9570
  880. package/dist/ipv4-CTQQ4_IW.js +0 -82
  881. package/dist/irc-B8vBDigm.js +0 -672
  882. package/dist/library-VCM_cQY4.js +0 -107
  883. package/dist/lifecycle-core-Ctz36PdQ.js +0 -382
  884. package/dist/line-B_uTLrdI.js +0 -530
  885. package/dist/llm-slug-generator-YWg0g2pj.js +0 -67
  886. package/dist/logging-S-5LPdfQ.js +0 -13
  887. package/dist/logging-ueBMCGMR.js +0 -29
  888. package/dist/login-qr-pcACm2Ng.js +0 -107
  889. package/dist/login-qr-pv-kxMfF.js +0 -233
  890. package/dist/logs-cli-RgADgSMO.js +0 -254
  891. package/dist/manager-runtime-BhTkoKmb.js +0 -106
  892. package/dist/manager.runtime-BjHzikoK.js +0 -710
  893. package/dist/matrix-C4EEu2Qp.js +0 -1490
  894. package/dist/matrix-Dfzcc5nV.js +0 -1269
  895. package/dist/mcp-cli-CJmOm9Oj.js +0 -86
  896. package/dist/media-understanding.runtime-DCETFCw_.js +0 -111
  897. package/dist/memory-cli-DFqd6tYx.js +0 -106
  898. package/dist/method-scopes-D-Q9dvbj.js +0 -2586
  899. package/dist/model-picker-Z-CUcuMr.js +0 -390
  900. package/dist/model-picker-v5mUsZ4J.js +0 -107
  901. package/dist/model-picker.runtime-A_z0dHfS.js +0 -120
  902. package/dist/model-suppression.runtime-QVWVJRr-.js +0 -111
  903. package/dist/models-Bbj0xV4F.js +0 -2514
  904. package/dist/models-D-OIjZqU.js +0 -113
  905. package/dist/models-cli-Bpn-5i4h.js +0 -304
  906. package/dist/models-config-Cwa5cJbC.js +0 -106
  907. package/dist/monitor-BchfCAaU.js +0 -6823
  908. package/dist/monitor-BydV44SP.js +0 -3076
  909. package/dist/monitor-CT8axwfm.js +0 -767
  910. package/dist/monitor-CZGWNOvn.js +0 -777
  911. package/dist/monitor-DN62r69g.js +0 -3468
  912. package/dist/monitor-DZ0fzJku.js +0 -110
  913. package/dist/monitor-DvNjzWFu.js +0 -108
  914. package/dist/monitor-shared-B-DBSlkQ.js +0 -444
  915. package/dist/msteams-Bf-wk2Rp.js +0 -852
  916. package/dist/node-cli-kH16TQI7.js +0 -2498
  917. package/dist/node-resolve-DfOpQmxm.js +0 -835
  918. package/dist/nodes-cli-CkAMXW5u.js +0 -1375
  919. package/dist/nostr-B8UGHclZ.js +0 -8744
  920. package/dist/npm-resolution-DmjlifII.js +0 -60
  921. package/dist/onboard-C883nfyw.js +0 -589
  922. package/dist/onboard-channels-Dc-BxN7p.js +0 -200
  923. package/dist/onboard-channels-j5EENtum.js +0 -1241
  924. package/dist/onboard-custom-0atne0C5.js +0 -571
  925. package/dist/onboard-custom-CWMqwjJx.js +0 -109
  926. package/dist/onboard-helpers-D3wWfH8F.js +0 -335
  927. package/dist/onboard-helpers-DZmRCe8l.js +0 -108
  928. package/dist/onboard-remote-Cn6kW-p0.js +0 -112
  929. package/dist/onboard-remote-Cx4w5VAk.js +0 -181
  930. package/dist/onboard-search-Ck9HRh2M.js +0 -297
  931. package/dist/onboard-skills-BtqrGioT.js +0 -133
  932. package/dist/onboard-skills-Dnw19Os8.js +0 -112
  933. package/dist/outbound-media-C5Nv4o18.js +0 -11
  934. package/dist/pairing-cli-Cwy9QZ_4.js +0 -212
  935. package/dist/perplexity-Brhpb45X.js +0 -24
  936. package/dist/pi-model-discovery-runtime-DIOdo6D8.js +0 -106
  937. package/dist/pi-tools.before-tool-call.runtime-CFM4gsDF.js +0 -380
  938. package/dist/plugin-install-BOV00hia.js +0 -112
  939. package/dist/plugin-install-Bak8fUBv.js +0 -184
  940. package/dist/plugin-install-plan-bKkEefRf.js +0 -49
  941. package/dist/plugin-registry-DxAXQUlZ.js +0 -108
  942. package/dist/plugin-registry-n0p3phem.js +0 -49
  943. package/dist/plugins-Ca3RK8Fi.js +0 -106
  944. package/dist/plugins-cli-BnC51H2R.js +0 -912
  945. package/dist/policy-BJv97w9e.js +0 -143
  946. package/dist/preflight-audio.runtime-BrFcf-6_.js +0 -111
  947. package/dist/probe-063xvvZc.js +0 -19
  948. package/dist/probe-BJEb2wGv.js +0 -1793
  949. package/dist/probe-CJQlxgsl.js +0 -47
  950. package/dist/probe-Caa2HznF.js +0 -6328
  951. package/dist/probe-CfL4tnJ6.js +0 -129
  952. package/dist/probe-auth-DN2Ec83-.js +0 -38
  953. package/dist/probe-auth-D_UKzu4m.js +0 -48
  954. package/dist/program-BOMdC7MC.js +0 -247
  955. package/dist/prompt-select-styled-DDnCfM3j.js +0 -2673
  956. package/dist/provider-api-key-auth.runtime-DUns3fwX.js +0 -116
  957. package/dist/provider-auth-choice-B_j1ctT2.js +0 -126
  958. package/dist/provider-auth-choice-preference-BaOBZ_Xn.js +0 -189
  959. package/dist/provider-auth-choice.runtime-DOako_zV.js +0 -118
  960. package/dist/provider-auth-guidance-CrjxnoNZ.js +0 -34
  961. package/dist/provider-runtime.runtime-BkOkgmTw.js +0 -106
  962. package/dist/provider-self-hosted-setup-BFDU6dRa.js +0 -182
  963. package/dist/provider-usage-CaDE0mqq.js +0 -106
  964. package/dist/provider-web-search-BR7etTjJ.js +0 -2392
  965. package/dist/provider-wizard-DCPdKUvb.js +0 -152
  966. package/dist/push-apns-B_OZjm4v.js +0 -1038
  967. package/dist/pw-ai-dG60P0hQ.js +0 -1866
  968. package/dist/qr-cli-DWfiw79I.js +0 -369
  969. package/dist/qr-cli-DwuKtyZQ.js +0 -108
  970. package/dist/reactions-CIGAPBn8.js +0 -281
  971. package/dist/read-only-account-inspect.discord.runtime-D54mnq8l.js +0 -111
  972. package/dist/read-only-account-inspect.slack.runtime-Bxs9ObMC.js +0 -111
  973. package/dist/read-only-account-inspect.telegram.runtime-UoVuf_Yo.js +0 -111
  974. package/dist/redact-snapshot-DZ3Vq-SC.js +0 -2657
  975. package/dist/ref-contract-D96lSYLs.js +0 -53
  976. package/dist/register.agent-2KmeahEL.js +0 -434
  977. package/dist/register.backup-ECBnWVR7.js +0 -624
  978. package/dist/register.configure-Doz1daCp.js +0 -247
  979. package/dist/register.maintenance-C33cV-WM.js +0 -569
  980. package/dist/register.message-CnL0NiF6.js +0 -704
  981. package/dist/register.onboard-BrYGZeQA.js +0 -187
  982. package/dist/register.setup-Bx6gEg6X.js +0 -207
  983. package/dist/register.status-health-sessions-FLb0CUOO.js +0 -493
  984. package/dist/register.subclis-BuqgaeIf.js +0 -12
  985. package/dist/register.subclis-DwdgfdnT.js +0 -315
  986. package/dist/registry-xhgvU89y.js +0 -1107
  987. package/dist/replies-hB2aipLu.js +0 -110
  988. package/dist/resolve-3ErMOltL.js +0 -660
  989. package/dist/resolve-channels-BV8GXuPe.js +0 -226
  990. package/dist/resolve-channels-CTY_XRIP.js +0 -262
  991. package/dist/resolve-users-DQ4Ne4Zc.js +0 -143
  992. package/dist/routes-BNDsNO_e.js +0 -7097
  993. package/dist/rpc-BLGTBWXq.js +0 -67
  994. package/dist/run-main-COAE4GlI.js +0 -423
  995. package/dist/runtime-discord-ops.runtime-Dxg-nlgd.js +0 -9073
  996. package/dist/runtime-slack-ops.runtime-Di474LJr.js +0 -4551
  997. package/dist/runtime-telegram-ops.runtime-Da8vgf3O.js +0 -128
  998. package/dist/runtime-whatsapp-login.runtime-DcouP4iF.js +0 -109
  999. package/dist/runtime-whatsapp-outbound.runtime-CYamaEJX.js +0 -112
  1000. package/dist/sandbox-cli-U5ZTxhxL.js +0 -530
  1001. package/dist/search-manager-CfizyEMk.js +0 -386
  1002. package/dist/search-manager-DaF2QP4s.js +0 -15
  1003. package/dist/secrets-cli-C0gytFip.js +0 -2065
  1004. package/dist/security-cli-C74EuLUO.js +0 -570
  1005. package/dist/send-BTLVBf_E.js +0 -631
  1006. package/dist/send-BlWWCEZE.js +0 -1025
  1007. package/dist/send-CfypD1B_.js +0 -100
  1008. package/dist/send-Cm9v3uhF.js +0 -283
  1009. package/dist/send-g2odQuYI.js +0 -629
  1010. package/dist/server-C8b5QJ2s.js +0 -106
  1011. package/dist/server-node-events-xqQe5xiu.js +0 -501
  1012. package/dist/sessions-CSSzvgPQ.js +0 -107
  1013. package/dist/sessions-z0GIvdKa.js +0 -218
  1014. package/dist/setup-D9XTmlF8.js +0 -387
  1015. package/dist/setup-core-BDrLOwYO.js +0 -143
  1016. package/dist/setup-core-CM7cY7_i.js +0 -166
  1017. package/dist/setup-core-CnmgANY-.js +0 -205
  1018. package/dist/setup-core-DgcjCKmG.js +0 -47
  1019. package/dist/setup-surface-DzRrVKYj.js +0 -490
  1020. package/dist/setup.finalize-UaPu_adv.js +0 -517
  1021. package/dist/setup.gateway-config-Djc1ceEh.js +0 -338
  1022. package/dist/setup.secret-input-BkczghbR.js +0 -25
  1023. package/dist/shared-BHizGoNk.js +0 -298
  1024. package/dist/shared-CUfYhQkP.js +0 -96
  1025. package/dist/shared-DYYqr9EC.js +0 -75
  1026. package/dist/shared-DthOxMRQ.js +0 -182
  1027. package/dist/shared-On_A5_hW.js +0 -102
  1028. package/dist/signal-D6px9PGZ.js +0 -109
  1029. package/dist/skills-B4h1k-SP.js +0 -853
  1030. package/dist/skills-Bto10BGB.js +0 -19
  1031. package/dist/skills-cli-CXGR3Y5j.js +0 -291
  1032. package/dist/skills-install-B1AlkK8C.js +0 -763
  1033. package/dist/skills-status-BsmJ_iSg.js +0 -20
  1034. package/dist/skills-status-DGdxY3OI.js +0 -169
  1035. package/dist/slack-B7vWFmxP.js +0 -109
  1036. package/dist/slash-commands.runtime-DXdAT84n.js +0 -123
  1037. package/dist/slash-dispatch.runtime-CNf2-9Aj.js +0 -136
  1038. package/dist/slash-skill-commands.runtime-CBjffHRX.js +0 -111
  1039. package/dist/src-Cp7P7T08.js +0 -1696
  1040. package/dist/status-158fWh4A.js +0 -43
  1041. package/dist/status-BJIVLJnb.js +0 -1599
  1042. package/dist/status-BQiBI6N9.js +0 -126
  1043. package/dist/status-CZipXGUu.js +0 -121
  1044. package/dist/status-ZZIVFLI-.js +0 -606
  1045. package/dist/status-json-BNUy5Mem.js +0 -286
  1046. package/dist/status.link-channel-B694y1Xu.js +0 -138
  1047. package/dist/status.scan.deps.runtime-BcoKEzQD.js +0 -121
  1048. package/dist/status.scan.runtime-CqScDt-p.js +0 -114
  1049. package/dist/status.summary-AMek7qvI.js +0 -592
  1050. package/dist/status.summary.runtime-XgkcQ_kr.js +0 -113
  1051. package/dist/subagent-orphan-recovery-CrCYTmFC.js +0 -302
  1052. package/dist/subagent-registry-runtime-Cg-YvLx3.js +0 -106
  1053. package/dist/synology-chat-0G85jIqQ.js +0 -297
  1054. package/dist/system-cli-kZtSxKNm.js +0 -92
  1055. package/dist/telegram-DV0Wy89w.js +0 -109
  1056. package/dist/text-chunking-C2J2Oeul.js +0 -84
  1057. package/dist/tlon-DmK1NUVP.js +0 -433
  1058. package/dist/tui-D3bNPLG7.js +0 -3834
  1059. package/dist/tui-cli-DtMp9k_s.js +0 -132
  1060. package/dist/types.secrets-DuSPmmWB.js +0 -80
  1061. package/dist/ui-CeGztSEL.js +0 -31
  1062. package/dist/update-De7VudzP.js +0 -1036
  1063. package/dist/update-cli-BH8Pb-So.js +0 -1498
  1064. package/dist/update-offset-store-syELkdEW.js +0 -107
  1065. package/dist/update-runner-Cq-Q40T9.js +0 -1496
  1066. package/dist/web-CjMtvfSq.js +0 -107
  1067. package/dist/webhook-targets-_jTR0Bb_.js +0 -181
  1068. package/dist/webhooks-cli-DQ6u2Qau.js +0 -349
  1069. package/dist/whatsapp-CyLk16SZ.js +0 -109
  1070. package/dist/whatsapp-actions-Dzr2Wzqw.js +0 -162
  1071. package/dist/workspace-dirs-L1_QQ9mB.js +0 -2002
  1072. package/dist/zalo-CrehfXvK.js +0 -415
  1073. package/dist/zalouser-D1QD-O-I.js +0 -30911
  1074. package/dist/zod-schema.core-CWxzqcUs.js +0 -541
@@ -1,1598 +0,0 @@
1
- import { t as formatDocsLink } from "./links-C5I443Xb.js";
2
- import { Ag as setTopLevelChannelDmPolicyWithAllowFrom, Ah as createScopedPairingAccess, BT as collectOpenGroupPolicyRouteAllowlistWarnings, Cg as resolveSetupAccountId, Dh as createPersistentDedupe, GC as buildBaseChannelStatusSummary, HC as createAccountListHelpers, HT as clearAccountEntryFields, IT as collectAllowlistProviderGroupPolicyWarnings, JC as buildRuntimeAccountStatusSnapshot, Kw as buildChannelKeyCandidates, Md as resolveDmGroupAccessWithCommandGate, Og as setSetupChannelEnabled, Oh as issuePairingChallenge, Rx as resolveAccountWithDefaultFallback, Tw as applyAccountNameToChannelSection, UT as deleteAccountFromConfigSection, Ug as logInboundDrop, WT as setAccountEnabledInConfigSection, Yw as resolveChannelEntryMatchWithFallback, Zw as resolveNestedAllowlistDecision, bS as readRequestBodyWithLimit, bs as resolveMentionGatingWithBypass, gT as mapAllowFromEntries, ig as buildSecretInputSchema, jw as patchScopedAccountConfig, kT as buildAccountScopedDmSecurityPolicy, kd as readStoreAllowFromForDmPolicy, qw as normalizeChannelSlug, ug as mergeAllowFromEntries, vS as isRequestBodyLimitError, xS as requestBodyErrorToText } from "./auth-profiles-BJcHzwPy.js";
3
- import { n as normalizeAccountId, t as DEFAULT_ACCOUNT_ID } from "./account-id-O4Og6DrK.js";
4
- import { K as ToolPolicySchema } from "./io-DcoxdH6t.js";
5
- import { a as hasConfiguredSecretInput, c as normalizeResolvedSecretInputString } from "./types.secrets-DuSPmmWB.js";
6
- import { F as requireOpenAllowFrom, a as DmPolicySchema, c as GroupPolicySchema, m as MarkdownConfigSchema, y as ReplyRuntimeConfigSchemaShape } from "./zod-schema.core-CWxzqcUs.js";
7
- import { J as fetchWithSsrFGuard } from "./provider-web-search-BR7etTjJ.js";
8
- import { c as resolveAllowlistProviderRuntimeGroupPolicy, f as warnMissingProviderGroupPolicyFallbackOnce, l as resolveDefaultGroupPolicy, n as evaluateMatchedGroupAccessForPolicy, o as GROUP_POLICY_BLOCKED_LABEL } from "./group-access-BWGTPTwF.js";
9
- import { r as buildChannelConfigSchema } from "./config-schema-GQ6uWjXe.js";
10
- import { i as tryReadSecretFileSync } from "./secret-file-Bjh19aoH.js";
11
- import { t as formatAllowFromLowercase } from "./allow-from-CRBQe4aU.js";
12
- import { t as createPluginRuntimeStore } from "./runtime-store-BIrp4FYB.js";
13
- import { t as createAccountStatusSink } from "./channel-lifecycle-x1smD1P7.js";
14
- import { i as resolveOutboundMediaUrls, n as formatTextWithAttachmentLinks } from "./reply-payload-CKw7gJdJ.js";
15
- import { t as dispatchInboundReplyWithBase } from "./inbound-reply-dispatch-DoIJLztA.js";
16
- import { n as runStoppablePassiveMonitor, t as resolveLoggerBackedRuntime } from "./runtime-RjUgCLoX.js";
17
- import { t as requireChannelOpenAllowFrom } from "./config-schema-helpers-DfKKAT5A.js";
18
- import { readFileSync } from "node:fs";
19
- import path from "node:path";
20
- import os from "node:os";
21
- import { createHmac, randomBytes } from "node:crypto";
22
- import { z } from "zod";
23
- import { createServer } from "node:http";
24
- //#region extensions/nextcloud-talk/src/accounts.ts
25
- function isTruthyEnvValue(value) {
26
- const normalized = (value ?? "").trim().toLowerCase();
27
- return normalized === "true" || normalized === "1" || normalized === "yes" || normalized === "on";
28
- }
29
- const debugAccounts = (...args) => {
30
- if (isTruthyEnvValue(process.env.MOLDCLAW_DEBUG_NEXTCLOUD_TALK_ACCOUNTS)) console.warn("[nextcloud-talk:accounts]", ...args);
31
- };
32
- const { listAccountIds: listNextcloudTalkAccountIdsInternal, resolveDefaultAccountId: resolveDefaultNextcloudTalkAccountId } = createAccountListHelpers("nextcloud-talk", { normalizeAccountId });
33
- function listNextcloudTalkAccountIds(cfg) {
34
- const ids = listNextcloudTalkAccountIdsInternal(cfg);
35
- debugAccounts("listNextcloudTalkAccountIds", ids);
36
- return ids;
37
- }
38
- function resolveAccountConfig(cfg, accountId) {
39
- const accounts = cfg.channels?.["nextcloud-talk"]?.accounts;
40
- if (!accounts || typeof accounts !== "object") return;
41
- const direct = accounts[accountId];
42
- if (direct) return direct;
43
- const normalized = normalizeAccountId(accountId);
44
- const matchKey = Object.keys(accounts).find((key) => normalizeAccountId(key) === normalized);
45
- return matchKey ? accounts[matchKey] : void 0;
46
- }
47
- function mergeNextcloudTalkAccountConfig(cfg, accountId) {
48
- const { accounts: _ignored, defaultAccount: _ignoredDefaultAccount, ...base } = cfg.channels?.["nextcloud-talk"] ?? {};
49
- const account = resolveAccountConfig(cfg, accountId) ?? {};
50
- return {
51
- ...base,
52
- ...account
53
- };
54
- }
55
- function resolveNextcloudTalkSecret(cfg, opts) {
56
- const merged = mergeNextcloudTalkAccountConfig(cfg, opts.accountId ?? "default");
57
- const envSecret = process.env.NEXTCLOUD_TALK_BOT_SECRET?.trim();
58
- if (envSecret && (!opts.accountId || opts.accountId === "default")) return {
59
- secret: envSecret,
60
- source: "env"
61
- };
62
- if (merged.botSecretFile) {
63
- const fileSecret = tryReadSecretFileSync(merged.botSecretFile, "Nextcloud Talk bot secret file", { rejectSymlink: true });
64
- if (fileSecret) return {
65
- secret: fileSecret,
66
- source: "secretFile"
67
- };
68
- }
69
- const inlineSecret = normalizeResolvedSecretInputString({
70
- value: merged.botSecret,
71
- path: `channels.nextcloud-talk.accounts.${opts.accountId ?? "default"}.botSecret`
72
- });
73
- if (inlineSecret) return {
74
- secret: inlineSecret,
75
- source: "config"
76
- };
77
- return {
78
- secret: "",
79
- source: "none"
80
- };
81
- }
82
- function resolveNextcloudTalkAccount(params) {
83
- const baseEnabled = params.cfg.channels?.["nextcloud-talk"]?.enabled !== false;
84
- const resolve = (accountId) => {
85
- const merged = mergeNextcloudTalkAccountConfig(params.cfg, accountId);
86
- const accountEnabled = merged.enabled !== false;
87
- const enabled = baseEnabled && accountEnabled;
88
- const secretResolution = resolveNextcloudTalkSecret(params.cfg, { accountId });
89
- const baseUrl = merged.baseUrl?.trim()?.replace(/\/$/, "") ?? "";
90
- debugAccounts("resolve", {
91
- accountId,
92
- enabled,
93
- secretSource: secretResolution.source,
94
- baseUrl: baseUrl ? "[set]" : "[missing]"
95
- });
96
- return {
97
- accountId,
98
- enabled,
99
- name: merged.name?.trim() || void 0,
100
- baseUrl,
101
- secret: secretResolution.secret,
102
- secretSource: secretResolution.source,
103
- config: merged
104
- };
105
- };
106
- return resolveAccountWithDefaultFallback({
107
- accountId: params.accountId,
108
- normalizeAccountId,
109
- resolvePrimary: resolve,
110
- hasCredential: (account) => account.secretSource !== "none",
111
- resolveDefaultAccountId: () => resolveDefaultNextcloudTalkAccountId(params.cfg)
112
- });
113
- }
114
- //#endregion
115
- //#region extensions/nextcloud-talk/src/config-schema.ts
116
- const NextcloudTalkRoomSchema = z.object({
117
- requireMention: z.boolean().optional(),
118
- tools: ToolPolicySchema,
119
- skills: z.array(z.string()).optional(),
120
- enabled: z.boolean().optional(),
121
- allowFrom: z.array(z.string()).optional(),
122
- systemPrompt: z.string().optional()
123
- }).strict();
124
- const NextcloudTalkAccountSchemaBase = z.object({
125
- name: z.string().optional(),
126
- enabled: z.boolean().optional(),
127
- markdown: MarkdownConfigSchema,
128
- baseUrl: z.string().optional(),
129
- botSecret: buildSecretInputSchema().optional(),
130
- botSecretFile: z.string().optional(),
131
- apiUser: z.string().optional(),
132
- apiPassword: buildSecretInputSchema().optional(),
133
- apiPasswordFile: z.string().optional(),
134
- dmPolicy: DmPolicySchema.optional().default("pairing"),
135
- webhookPort: z.number().int().positive().optional(),
136
- webhookHost: z.string().optional(),
137
- webhookPath: z.string().optional(),
138
- webhookPublicUrl: z.string().optional(),
139
- allowFrom: z.array(z.string()).optional(),
140
- groupAllowFrom: z.array(z.string()).optional(),
141
- groupPolicy: GroupPolicySchema.optional().default("allowlist"),
142
- rooms: z.record(z.string(), NextcloudTalkRoomSchema.optional()).optional(),
143
- ...ReplyRuntimeConfigSchemaShape
144
- }).strict();
145
- const NextcloudTalkAccountSchema = NextcloudTalkAccountSchemaBase.superRefine((value, ctx) => {
146
- requireChannelOpenAllowFrom({
147
- channel: "nextcloud-talk",
148
- policy: value.dmPolicy,
149
- allowFrom: value.allowFrom,
150
- ctx,
151
- requireOpenAllowFrom
152
- });
153
- });
154
- const NextcloudTalkConfigSchema = NextcloudTalkAccountSchemaBase.extend({
155
- accounts: z.record(z.string(), NextcloudTalkAccountSchema.optional()).optional(),
156
- defaultAccount: z.string().optional()
157
- }).superRefine((value, ctx) => {
158
- requireChannelOpenAllowFrom({
159
- channel: "nextcloud-talk",
160
- policy: value.dmPolicy,
161
- allowFrom: value.allowFrom,
162
- ctx,
163
- requireOpenAllowFrom
164
- });
165
- });
166
- //#endregion
167
- //#region extensions/nextcloud-talk/src/policy.ts
168
- function normalizeAllowEntry(raw) {
169
- return raw.trim().toLowerCase().replace(/^(nextcloud-talk|nc-talk|nc):/i, "");
170
- }
171
- function normalizeNextcloudTalkAllowlist(values) {
172
- return (values ?? []).map((value) => normalizeAllowEntry(String(value))).filter(Boolean);
173
- }
174
- function resolveNextcloudTalkAllowlistMatch(params) {
175
- const allowFrom = normalizeNextcloudTalkAllowlist(params.allowFrom);
176
- if (allowFrom.length === 0) return { allowed: false };
177
- if (allowFrom.includes("*")) return {
178
- allowed: true,
179
- matchKey: "*",
180
- matchSource: "wildcard"
181
- };
182
- const senderId = normalizeAllowEntry(params.senderId);
183
- if (allowFrom.includes(senderId)) return {
184
- allowed: true,
185
- matchKey: senderId,
186
- matchSource: "id"
187
- };
188
- return { allowed: false };
189
- }
190
- function resolveNextcloudTalkRoomMatch(params) {
191
- const rooms = params.rooms ?? {};
192
- const allowlistConfigured = Object.keys(rooms).length > 0;
193
- const match = resolveChannelEntryMatchWithFallback({
194
- entries: rooms,
195
- keys: buildChannelKeyCandidates(params.roomToken),
196
- wildcardKey: "*",
197
- normalizeKey: normalizeChannelSlug
198
- });
199
- const roomConfig = match.entry;
200
- const allowed = resolveNestedAllowlistDecision({
201
- outerConfigured: allowlistConfigured,
202
- outerMatched: Boolean(roomConfig),
203
- innerConfigured: false,
204
- innerMatched: false
205
- });
206
- return {
207
- roomConfig,
208
- wildcardConfig: match.wildcardEntry,
209
- roomKey: match.matchKey ?? match.key,
210
- matchSource: match.matchSource,
211
- allowed,
212
- allowlistConfigured
213
- };
214
- }
215
- function resolveNextcloudTalkGroupToolPolicy(params) {
216
- const cfg = params.cfg;
217
- const roomToken = params.groupId?.trim();
218
- if (!roomToken) return;
219
- const match = resolveNextcloudTalkRoomMatch({
220
- rooms: cfg.channels?.["nextcloud-talk"]?.rooms,
221
- roomToken
222
- });
223
- return match.roomConfig?.tools ?? match.wildcardConfig?.tools;
224
- }
225
- function resolveNextcloudTalkRequireMention(params) {
226
- if (typeof params.roomConfig?.requireMention === "boolean") return params.roomConfig.requireMention;
227
- if (typeof params.wildcardConfig?.requireMention === "boolean") return params.wildcardConfig.requireMention;
228
- return true;
229
- }
230
- function resolveNextcloudTalkGroupAllow(params) {
231
- const outerAllow = normalizeNextcloudTalkAllowlist(params.outerAllowFrom);
232
- const innerAllow = normalizeNextcloudTalkAllowlist(params.innerAllowFrom);
233
- const outerMatch = resolveNextcloudTalkAllowlistMatch({
234
- allowFrom: params.outerAllowFrom,
235
- senderId: params.senderId
236
- });
237
- const innerMatch = resolveNextcloudTalkAllowlistMatch({
238
- allowFrom: params.innerAllowFrom,
239
- senderId: params.senderId
240
- });
241
- return {
242
- allowed: evaluateMatchedGroupAccessForPolicy({
243
- groupPolicy: params.groupPolicy,
244
- allowlistConfigured: outerAllow.length > 0 || innerAllow.length > 0,
245
- allowlistMatched: resolveNestedAllowlistDecision({
246
- outerConfigured: outerAllow.length > 0 || innerAllow.length > 0,
247
- outerMatched: outerAllow.length > 0 ? outerMatch.allowed : true,
248
- innerConfigured: innerAllow.length > 0,
249
- innerMatched: innerMatch.allowed
250
- })
251
- }).allowed,
252
- outerMatch: params.groupPolicy === "open" ? { allowed: true } : params.groupPolicy === "disabled" ? { allowed: false } : outerMatch,
253
- innerMatch: params.groupPolicy === "open" ? { allowed: true } : params.groupPolicy === "disabled" ? { allowed: false } : innerMatch
254
- };
255
- }
256
- function resolveNextcloudTalkMentionGate(params) {
257
- const result = resolveMentionGatingWithBypass({
258
- isGroup: params.isGroup,
259
- requireMention: params.requireMention,
260
- canDetectMention: true,
261
- wasMentioned: params.wasMentioned,
262
- allowTextCommands: params.allowTextCommands,
263
- hasControlCommand: params.hasControlCommand,
264
- commandAuthorized: params.commandAuthorized
265
- });
266
- return {
267
- shouldSkip: result.shouldSkip,
268
- shouldBypassMention: result.shouldBypassMention
269
- };
270
- }
271
- //#endregion
272
- //#region extensions/nextcloud-talk/src/room-info.ts
273
- const ROOM_CACHE_TTL_MS = 300 * 1e3;
274
- const ROOM_CACHE_ERROR_TTL_MS = 30 * 1e3;
275
- const roomCache = /* @__PURE__ */ new Map();
276
- function resolveRoomCacheKey(params) {
277
- return `${params.accountId}:${params.roomToken}`;
278
- }
279
- function readApiPassword(params) {
280
- const inlinePassword = normalizeResolvedSecretInputString({
281
- value: params.apiPassword,
282
- path: "channels.nextcloud-talk.apiPassword"
283
- });
284
- if (inlinePassword) return inlinePassword;
285
- if (!params.apiPasswordFile) return;
286
- try {
287
- return readFileSync(params.apiPasswordFile, "utf-8").trim() || void 0;
288
- } catch {
289
- return;
290
- }
291
- }
292
- function coerceRoomType(value) {
293
- if (typeof value === "number" && Number.isFinite(value)) return value;
294
- if (typeof value === "string" && value.trim()) {
295
- const parsed = Number.parseInt(value, 10);
296
- return Number.isFinite(parsed) ? parsed : void 0;
297
- }
298
- }
299
- function resolveRoomKindFromType(type) {
300
- if (!type) return;
301
- if (type === 1 || type === 5 || type === 6) return "direct";
302
- return "group";
303
- }
304
- async function resolveNextcloudTalkRoomKind(params) {
305
- const { account, roomToken, runtime } = params;
306
- const key = resolveRoomCacheKey({
307
- accountId: account.accountId,
308
- roomToken
309
- });
310
- const cached = roomCache.get(key);
311
- if (cached) {
312
- const age = Date.now() - cached.fetchedAt;
313
- if (cached.kind && age < ROOM_CACHE_TTL_MS) return cached.kind;
314
- if (cached.error && age < ROOM_CACHE_ERROR_TTL_MS) return;
315
- }
316
- const apiUser = account.config.apiUser?.trim();
317
- const apiPassword = readApiPassword({
318
- apiPassword: account.config.apiPassword,
319
- apiPasswordFile: account.config.apiPasswordFile
320
- });
321
- if (!apiUser || !apiPassword) return;
322
- const baseUrl = account.baseUrl?.trim();
323
- if (!baseUrl) return;
324
- const url = `${baseUrl}/ocs/v2.php/apps/spreed/api/v4/room/${roomToken}`;
325
- const auth = Buffer.from(`${apiUser}:${apiPassword}`, "utf-8").toString("base64");
326
- try {
327
- const { response, release } = await fetchWithSsrFGuard({
328
- url,
329
- init: {
330
- method: "GET",
331
- headers: {
332
- Authorization: `Basic ${auth}`,
333
- "OCS-APIRequest": "true",
334
- Accept: "application/json"
335
- }
336
- },
337
- auditContext: "nextcloud-talk.room-info"
338
- });
339
- try {
340
- if (!response.ok) {
341
- roomCache.set(key, {
342
- fetchedAt: Date.now(),
343
- error: `status:${response.status}`
344
- });
345
- runtime?.log?.(`nextcloud-talk: room lookup failed (${response.status}) token=${roomToken}`);
346
- return;
347
- }
348
- const kind = resolveRoomKindFromType(coerceRoomType((await response.json()).ocs?.data?.type));
349
- roomCache.set(key, {
350
- fetchedAt: Date.now(),
351
- kind
352
- });
353
- return kind;
354
- } finally {
355
- await release();
356
- }
357
- } catch (err) {
358
- roomCache.set(key, {
359
- fetchedAt: Date.now(),
360
- error: err instanceof Error ? err.message : String(err)
361
- });
362
- runtime?.error?.(`nextcloud-talk: room lookup error: ${String(err)}`);
363
- return;
364
- }
365
- }
366
- //#endregion
367
- //#region extensions/nextcloud-talk/src/runtime.ts
368
- const { setRuntime: setNextcloudTalkRuntime, getRuntime: getNextcloudTalkRuntime } = createPluginRuntimeStore("Nextcloud Talk runtime not initialized");
369
- //#endregion
370
- //#region extensions/nextcloud-talk/src/normalize.ts
371
- function stripNextcloudTalkTargetPrefix(raw) {
372
- const trimmed = raw.trim();
373
- if (!trimmed) return;
374
- let normalized = trimmed;
375
- if (normalized.startsWith("nextcloud-talk:")) normalized = normalized.slice(15).trim();
376
- else if (normalized.startsWith("nc-talk:")) normalized = normalized.slice(8).trim();
377
- else if (normalized.startsWith("nc:")) normalized = normalized.slice(3).trim();
378
- if (normalized.startsWith("room:")) normalized = normalized.slice(5).trim();
379
- if (!normalized) return;
380
- return normalized;
381
- }
382
- function normalizeNextcloudTalkMessagingTarget(raw) {
383
- const normalized = stripNextcloudTalkTargetPrefix(raw);
384
- return normalized ? `nextcloud-talk:${normalized}`.toLowerCase() : void 0;
385
- }
386
- function looksLikeNextcloudTalkTargetId(raw) {
387
- const trimmed = raw.trim();
388
- if (!trimmed) return false;
389
- if (/^(nextcloud-talk|nc-talk|nc):/i.test(trimmed)) return true;
390
- return /^[a-z0-9]{8,}$/i.test(trimmed);
391
- }
392
- //#endregion
393
- //#region extensions/nextcloud-talk/src/signature.ts
394
- const SIGNATURE_HEADER = "x-nextcloud-talk-signature";
395
- const RANDOM_HEADER = "x-nextcloud-talk-random";
396
- const BACKEND_HEADER = "x-nextcloud-talk-backend";
397
- /**
398
- * Verify the HMAC-SHA256 signature of an incoming webhook request.
399
- * Signature is calculated as: HMAC-SHA256(random + body, secret)
400
- */
401
- function verifyNextcloudTalkSignature(params) {
402
- const { signature, random, body, secret } = params;
403
- if (!signature || !random || !secret) return false;
404
- const expected = createHmac("sha256", secret).update(random + body).digest("hex");
405
- if (signature.length !== expected.length) return false;
406
- let result = 0;
407
- for (let i = 0; i < signature.length; i++) result |= signature.charCodeAt(i) ^ expected.charCodeAt(i);
408
- return result === 0;
409
- }
410
- /**
411
- * Extract webhook headers from an incoming request.
412
- */
413
- function extractNextcloudTalkHeaders(headers) {
414
- const getHeader = (name) => {
415
- const value = headers[name] ?? headers[name.toLowerCase()];
416
- return Array.isArray(value) ? value[0] : value;
417
- };
418
- const signature = getHeader(SIGNATURE_HEADER);
419
- const random = getHeader(RANDOM_HEADER);
420
- const backend = getHeader(BACKEND_HEADER);
421
- if (!signature || !random || !backend) return null;
422
- return {
423
- signature,
424
- random,
425
- backend
426
- };
427
- }
428
- /**
429
- * Generate signature headers for an outbound request to Nextcloud Talk.
430
- */
431
- function generateNextcloudTalkSignature(params) {
432
- const { body, secret } = params;
433
- const random = randomBytes(32).toString("hex");
434
- return {
435
- random,
436
- signature: createHmac("sha256", secret).update(random + body).digest("hex")
437
- };
438
- }
439
- //#endregion
440
- //#region extensions/nextcloud-talk/src/send.ts
441
- function resolveCredentials(explicit, account) {
442
- const baseUrl = explicit.baseUrl?.trim() ?? account.baseUrl;
443
- const secret = explicit.secret?.trim() ?? account.secret;
444
- if (!baseUrl) throw new Error(`Nextcloud Talk baseUrl missing for account "${account.accountId}" (set channels.nextcloud-talk.baseUrl).`);
445
- if (!secret) throw new Error(`Nextcloud Talk bot secret missing for account "${account.accountId}" (set channels.nextcloud-talk.botSecret/botSecretFile or NEXTCLOUD_TALK_BOT_SECRET for default).`);
446
- return {
447
- baseUrl,
448
- secret
449
- };
450
- }
451
- function normalizeRoomToken(to) {
452
- const normalized = stripNextcloudTalkTargetPrefix(to);
453
- if (!normalized) throw new Error("Room token is required for Nextcloud Talk sends");
454
- return normalized;
455
- }
456
- function resolveNextcloudTalkSendContext(opts) {
457
- const cfg = opts.cfg ?? getNextcloudTalkRuntime().config.loadConfig();
458
- const account = resolveNextcloudTalkAccount({
459
- cfg,
460
- accountId: opts.accountId
461
- });
462
- const { baseUrl, secret } = resolveCredentials({
463
- baseUrl: opts.baseUrl,
464
- secret: opts.secret
465
- }, account);
466
- return {
467
- cfg,
468
- account,
469
- baseUrl,
470
- secret
471
- };
472
- }
473
- async function sendMessageNextcloudTalk(to, text, opts = {}) {
474
- const { cfg, account, baseUrl, secret } = resolveNextcloudTalkSendContext(opts);
475
- const roomToken = normalizeRoomToken(to);
476
- if (!text?.trim()) throw new Error("Message must be non-empty for Nextcloud Talk sends");
477
- const tableMode = getNextcloudTalkRuntime().channel.text.resolveMarkdownTableMode({
478
- cfg,
479
- channel: "nextcloud-talk",
480
- accountId: account.accountId
481
- });
482
- const message = getNextcloudTalkRuntime().channel.text.convertMarkdownTables(text.trim(), tableMode);
483
- const body = { message };
484
- if (opts.replyTo) body.replyTo = opts.replyTo;
485
- const bodyStr = JSON.stringify(body);
486
- const { random, signature } = generateNextcloudTalkSignature({
487
- body: message,
488
- secret
489
- });
490
- const url = `${baseUrl}/ocs/v2.php/apps/spreed/api/v1/bot/${roomToken}/message`;
491
- const response = await fetch(url, {
492
- method: "POST",
493
- headers: {
494
- "Content-Type": "application/json",
495
- "OCS-APIRequest": "true",
496
- "X-Nextcloud-Talk-Bot-Random": random,
497
- "X-Nextcloud-Talk-Bot-Signature": signature
498
- },
499
- body: bodyStr
500
- });
501
- if (!response.ok) {
502
- const errorBody = await response.text().catch(() => "");
503
- const status = response.status;
504
- let errorMsg = `Nextcloud Talk send failed (${status})`;
505
- if (status === 400) errorMsg = `Nextcloud Talk: bad request - ${errorBody || "invalid message format"}`;
506
- else if (status === 401) errorMsg = "Nextcloud Talk: authentication failed - check bot secret";
507
- else if (status === 403) errorMsg = "Nextcloud Talk: forbidden - bot may not have permission in this room";
508
- else if (status === 404) errorMsg = `Nextcloud Talk: room not found (token=${roomToken})`;
509
- else if (errorBody) errorMsg = `Nextcloud Talk send failed: ${errorBody}`;
510
- throw new Error(errorMsg);
511
- }
512
- let messageId = "unknown";
513
- let timestamp;
514
- try {
515
- const data = await response.json();
516
- if (data.ocs?.data?.id != null) messageId = String(data.ocs.data.id);
517
- if (typeof data.ocs?.data?.timestamp === "number") timestamp = data.ocs.data.timestamp;
518
- } catch {}
519
- if (opts.verbose) console.log(`[nextcloud-talk] Sent message ${messageId} to room ${roomToken}`);
520
- getNextcloudTalkRuntime().channel.activity.record({
521
- channel: "nextcloud-talk",
522
- accountId: account.accountId,
523
- direction: "outbound"
524
- });
525
- return {
526
- messageId,
527
- roomToken,
528
- timestamp
529
- };
530
- }
531
- //#endregion
532
- //#region extensions/nextcloud-talk/src/inbound.ts
533
- const CHANNEL_ID = "nextcloud-talk";
534
- async function deliverNextcloudTalkReply(params) {
535
- const { payload, roomToken, accountId, statusSink } = params;
536
- const combined = formatTextWithAttachmentLinks(payload.text, resolveOutboundMediaUrls(payload));
537
- if (!combined) return;
538
- await sendMessageNextcloudTalk(roomToken, combined, {
539
- accountId,
540
- replyTo: payload.replyToId
541
- });
542
- statusSink?.({ lastOutboundAt: Date.now() });
543
- }
544
- async function handleNextcloudTalkInbound(params) {
545
- const { message, account, config, runtime, statusSink } = params;
546
- const core = getNextcloudTalkRuntime();
547
- const pairing = createScopedPairingAccess({
548
- core,
549
- channel: CHANNEL_ID,
550
- accountId: account.accountId
551
- });
552
- const rawBody = message.text?.trim() ?? "";
553
- if (!rawBody) return;
554
- const roomKind = await resolveNextcloudTalkRoomKind({
555
- account,
556
- roomToken: message.roomToken,
557
- runtime
558
- });
559
- const isGroup = roomKind === "direct" ? false : roomKind === "group" ? true : message.isGroupChat;
560
- const senderId = message.senderId;
561
- const senderName = message.senderName;
562
- const roomToken = message.roomToken;
563
- const roomName = message.roomName;
564
- statusSink?.({ lastInboundAt: message.timestamp });
565
- const dmPolicy = account.config.dmPolicy ?? "pairing";
566
- const defaultGroupPolicy = resolveDefaultGroupPolicy(config);
567
- const { groupPolicy, providerMissingFallbackApplied } = resolveAllowlistProviderRuntimeGroupPolicy({
568
- providerConfigPresent: (config.channels?.["nextcloud-talk"] ?? void 0) !== void 0,
569
- groupPolicy: account.config.groupPolicy,
570
- defaultGroupPolicy
571
- });
572
- warnMissingProviderGroupPolicyFallbackOnce({
573
- providerMissingFallbackApplied,
574
- providerKey: "nextcloud-talk",
575
- accountId: account.accountId,
576
- blockedLabel: GROUP_POLICY_BLOCKED_LABEL.room,
577
- log: (message) => runtime.log?.(message)
578
- });
579
- const configAllowFrom = normalizeNextcloudTalkAllowlist(account.config.allowFrom);
580
- const configGroupAllowFrom = normalizeNextcloudTalkAllowlist(account.config.groupAllowFrom);
581
- const storeAllowList = normalizeNextcloudTalkAllowlist(await readStoreAllowFromForDmPolicy({
582
- provider: CHANNEL_ID,
583
- accountId: account.accountId,
584
- dmPolicy,
585
- readStore: pairing.readStoreForDmPolicy
586
- }));
587
- const roomMatch = resolveNextcloudTalkRoomMatch({
588
- rooms: account.config.rooms,
589
- roomToken
590
- });
591
- const roomConfig = roomMatch.roomConfig;
592
- if (isGroup && !roomMatch.allowed) {
593
- runtime.log?.(`nextcloud-talk: drop room ${roomToken} (not allowlisted)`);
594
- return;
595
- }
596
- if (roomConfig?.enabled === false) {
597
- runtime.log?.(`nextcloud-talk: drop room ${roomToken} (disabled)`);
598
- return;
599
- }
600
- const roomAllowFrom = normalizeNextcloudTalkAllowlist(roomConfig?.allowFrom);
601
- const allowTextCommands = core.channel.commands.shouldHandleTextCommands({
602
- cfg: config,
603
- surface: CHANNEL_ID
604
- });
605
- const useAccessGroups = config.commands?.useAccessGroups !== false;
606
- const hasControlCommand = core.channel.text.hasControlCommand(rawBody, config);
607
- const access = resolveDmGroupAccessWithCommandGate({
608
- isGroup,
609
- dmPolicy,
610
- groupPolicy,
611
- allowFrom: configAllowFrom,
612
- groupAllowFrom: configGroupAllowFrom,
613
- storeAllowFrom: storeAllowList,
614
- isSenderAllowed: (allowFrom) => resolveNextcloudTalkAllowlistMatch({
615
- allowFrom,
616
- senderId
617
- }).allowed,
618
- command: {
619
- useAccessGroups,
620
- allowTextCommands,
621
- hasControlCommand
622
- }
623
- });
624
- const commandAuthorized = access.commandAuthorized;
625
- const effectiveGroupAllowFrom = access.effectiveGroupAllowFrom;
626
- if (isGroup) {
627
- if (access.decision !== "allow") {
628
- runtime.log?.(`nextcloud-talk: drop group sender ${senderId} (reason=${access.reason})`);
629
- return;
630
- }
631
- if (!resolveNextcloudTalkGroupAllow({
632
- groupPolicy,
633
- outerAllowFrom: effectiveGroupAllowFrom,
634
- innerAllowFrom: roomAllowFrom,
635
- senderId
636
- }).allowed) {
637
- runtime.log?.(`nextcloud-talk: drop group sender ${senderId} (policy=${groupPolicy})`);
638
- return;
639
- }
640
- } else if (access.decision !== "allow") {
641
- if (access.decision === "pairing") await issuePairingChallenge({
642
- channel: CHANNEL_ID,
643
- senderId,
644
- senderIdLine: `Your Nextcloud user id: ${senderId}`,
645
- meta: { name: senderName || void 0 },
646
- upsertPairingRequest: pairing.upsertPairingRequest,
647
- sendPairingReply: async (text) => {
648
- await sendMessageNextcloudTalk(roomToken, text, { accountId: account.accountId });
649
- statusSink?.({ lastOutboundAt: Date.now() });
650
- },
651
- onReplyError: (err) => {
652
- runtime.error?.(`nextcloud-talk: pairing reply failed for ${senderId}: ${String(err)}`);
653
- }
654
- });
655
- runtime.log?.(`nextcloud-talk: drop DM sender ${senderId} (reason=${access.reason})`);
656
- return;
657
- }
658
- if (access.shouldBlockControlCommand) {
659
- logInboundDrop({
660
- log: (message) => runtime.log?.(message),
661
- channel: CHANNEL_ID,
662
- reason: "control command (unauthorized)",
663
- target: senderId
664
- });
665
- return;
666
- }
667
- const mentionRegexes = core.channel.mentions.buildMentionRegexes(config);
668
- const wasMentioned = mentionRegexes.length ? core.channel.mentions.matchesMentionPatterns(rawBody, mentionRegexes) : false;
669
- const mentionGate = resolveNextcloudTalkMentionGate({
670
- isGroup,
671
- requireMention: isGroup ? resolveNextcloudTalkRequireMention({
672
- roomConfig,
673
- wildcardConfig: roomMatch.wildcardConfig
674
- }) : false,
675
- wasMentioned,
676
- allowTextCommands,
677
- hasControlCommand,
678
- commandAuthorized
679
- });
680
- if (isGroup && mentionGate.shouldSkip) {
681
- runtime.log?.(`nextcloud-talk: drop room ${roomToken} (no mention)`);
682
- return;
683
- }
684
- const route = core.channel.routing.resolveAgentRoute({
685
- cfg: config,
686
- channel: CHANNEL_ID,
687
- accountId: account.accountId,
688
- peer: {
689
- kind: isGroup ? "group" : "direct",
690
- id: isGroup ? roomToken : senderId
691
- }
692
- });
693
- const fromLabel = isGroup ? `room:${roomName || roomToken}` : senderName || `user:${senderId}`;
694
- const storePath = core.channel.session.resolveStorePath(config.session?.store, { agentId: route.agentId });
695
- const envelopeOptions = core.channel.reply.resolveEnvelopeFormatOptions(config);
696
- const previousTimestamp = core.channel.session.readSessionUpdatedAt({
697
- storePath,
698
- sessionKey: route.sessionKey
699
- });
700
- const body = core.channel.reply.formatAgentEnvelope({
701
- channel: "Nextcloud Talk",
702
- from: fromLabel,
703
- timestamp: message.timestamp,
704
- previousTimestamp,
705
- envelope: envelopeOptions,
706
- body: rawBody
707
- });
708
- const groupSystemPrompt = roomConfig?.systemPrompt?.trim() || void 0;
709
- const ctxPayload = core.channel.reply.finalizeInboundContext({
710
- Body: body,
711
- BodyForAgent: rawBody,
712
- RawBody: rawBody,
713
- CommandBody: rawBody,
714
- From: isGroup ? `nextcloud-talk:room:${roomToken}` : `nextcloud-talk:${senderId}`,
715
- To: `nextcloud-talk:${roomToken}`,
716
- SessionKey: route.sessionKey,
717
- AccountId: route.accountId,
718
- ChatType: isGroup ? "group" : "direct",
719
- ConversationLabel: fromLabel,
720
- SenderName: senderName || void 0,
721
- SenderId: senderId,
722
- GroupSubject: isGroup ? roomName || roomToken : void 0,
723
- GroupSystemPrompt: isGroup ? groupSystemPrompt : void 0,
724
- Provider: CHANNEL_ID,
725
- Surface: CHANNEL_ID,
726
- WasMentioned: isGroup ? wasMentioned : void 0,
727
- MessageSid: message.messageId,
728
- Timestamp: message.timestamp,
729
- OriginatingChannel: CHANNEL_ID,
730
- OriginatingTo: `nextcloud-talk:${roomToken}`,
731
- CommandAuthorized: commandAuthorized
732
- });
733
- await dispatchInboundReplyWithBase({
734
- cfg: config,
735
- channel: CHANNEL_ID,
736
- accountId: account.accountId,
737
- route,
738
- storePath,
739
- ctxPayload,
740
- core,
741
- deliver: async (payload) => {
742
- await deliverNextcloudTalkReply({
743
- payload,
744
- roomToken,
745
- accountId: account.accountId,
746
- statusSink
747
- });
748
- },
749
- onRecordError: (err) => {
750
- runtime.error?.(`nextcloud-talk: failed updating session meta: ${String(err)}`);
751
- },
752
- onDispatchError: (err, info) => {
753
- runtime.error?.(`nextcloud-talk ${info.kind} reply failed: ${String(err)}`);
754
- },
755
- replyOptions: {
756
- skillFilter: roomConfig?.skills,
757
- disableBlockStreaming: typeof account.config.blockStreaming === "boolean" ? !account.config.blockStreaming : void 0
758
- }
759
- });
760
- }
761
- //#endregion
762
- //#region extensions/nextcloud-talk/src/replay-guard.ts
763
- const DEFAULT_REPLAY_TTL_MS = 1440 * 60 * 1e3;
764
- const DEFAULT_MEMORY_MAX_SIZE = 1e3;
765
- const DEFAULT_FILE_MAX_ENTRIES = 1e4;
766
- function sanitizeSegment(value) {
767
- const trimmed = value.trim();
768
- if (!trimmed) return "default";
769
- return trimmed.replace(/[^a-zA-Z0-9_-]/g, "_");
770
- }
771
- function buildReplayKey(params) {
772
- const roomToken = params.roomToken.trim();
773
- const messageId = params.messageId.trim();
774
- if (!roomToken || !messageId) return null;
775
- return `${roomToken}:${messageId}`;
776
- }
777
- function createNextcloudTalkReplayGuard(options) {
778
- const stateDir = options.stateDir.trim();
779
- const persistentDedupe = createPersistentDedupe({
780
- ttlMs: options.ttlMs ?? DEFAULT_REPLAY_TTL_MS,
781
- memoryMaxSize: options.memoryMaxSize ?? DEFAULT_MEMORY_MAX_SIZE,
782
- fileMaxEntries: options.fileMaxEntries ?? DEFAULT_FILE_MAX_ENTRIES,
783
- resolveFilePath: (namespace) => path.join(stateDir, "nextcloud-talk", "replay-dedupe", `${sanitizeSegment(namespace)}.json`)
784
- });
785
- return { shouldProcessMessage: async ({ accountId, roomToken, messageId }) => {
786
- const replayKey = buildReplayKey({
787
- roomToken,
788
- messageId
789
- });
790
- if (!replayKey) return true;
791
- return await persistentDedupe.checkAndRecord(replayKey, {
792
- namespace: accountId,
793
- onDiskError: options.onDiskError
794
- });
795
- } };
796
- }
797
- //#endregion
798
- //#region extensions/nextcloud-talk/src/monitor.ts
799
- const DEFAULT_WEBHOOK_PORT = 8788;
800
- const DEFAULT_WEBHOOK_HOST = "0.0.0.0";
801
- const DEFAULT_WEBHOOK_PATH = "/nextcloud-talk-webhook";
802
- const DEFAULT_WEBHOOK_MAX_BODY_BYTES = 1024 * 1024;
803
- const PREAUTH_WEBHOOK_MAX_BODY_BYTES = 64 * 1024;
804
- const PREAUTH_WEBHOOK_BODY_TIMEOUT_MS = 5e3;
805
- const HEALTH_PATH = "/healthz";
806
- const WEBHOOK_ERRORS = {
807
- missingSignatureHeaders: "Missing signature headers",
808
- invalidBackend: "Invalid backend",
809
- invalidSignature: "Invalid signature",
810
- invalidPayloadFormat: "Invalid payload format",
811
- payloadTooLarge: "Payload too large",
812
- internalServerError: "Internal server error"
813
- };
814
- function formatError(err) {
815
- if (err instanceof Error) return err.message;
816
- return typeof err === "string" ? err : JSON.stringify(err);
817
- }
818
- function normalizeOrigin(value) {
819
- try {
820
- return new URL(value).origin.toLowerCase();
821
- } catch {
822
- return null;
823
- }
824
- }
825
- function parseWebhookPayload(body) {
826
- try {
827
- const data = JSON.parse(body);
828
- if (!data.type || !data.actor?.type || !data.actor?.id || !data.object?.type || !data.object?.id || !data.target?.type || !data.target?.id) return null;
829
- return data;
830
- } catch {
831
- return null;
832
- }
833
- }
834
- function writeJsonResponse(res, status, body) {
835
- if (body) {
836
- res.writeHead(status, { "Content-Type": "application/json" });
837
- res.end(JSON.stringify(body));
838
- return;
839
- }
840
- res.writeHead(status);
841
- res.end();
842
- }
843
- function writeWebhookError(res, status, error) {
844
- if (res.headersSent) return;
845
- writeJsonResponse(res, status, { error });
846
- }
847
- function validateWebhookHeaders(params) {
848
- const headers = extractNextcloudTalkHeaders(params.req.headers);
849
- if (!headers) {
850
- writeWebhookError(params.res, 400, WEBHOOK_ERRORS.missingSignatureHeaders);
851
- return null;
852
- }
853
- if (params.isBackendAllowed && !params.isBackendAllowed(headers.backend)) {
854
- writeWebhookError(params.res, 401, WEBHOOK_ERRORS.invalidBackend);
855
- return null;
856
- }
857
- return headers;
858
- }
859
- function verifyWebhookSignature(params) {
860
- if (!verifyNextcloudTalkSignature({
861
- signature: params.headers.signature,
862
- random: params.headers.random,
863
- body: params.body,
864
- secret: params.secret
865
- })) {
866
- writeWebhookError(params.res, 401, WEBHOOK_ERRORS.invalidSignature);
867
- return false;
868
- }
869
- return true;
870
- }
871
- function decodeWebhookCreateMessage(params) {
872
- const payload = parseWebhookPayload(params.body);
873
- if (!payload) {
874
- writeWebhookError(params.res, 400, WEBHOOK_ERRORS.invalidPayloadFormat);
875
- return { kind: "invalid" };
876
- }
877
- if (payload.type !== "Create") return { kind: "ignore" };
878
- return {
879
- kind: "message",
880
- message: payloadToInboundMessage(payload)
881
- };
882
- }
883
- function payloadToInboundMessage(payload) {
884
- return {
885
- messageId: String(payload.object.id),
886
- roomToken: payload.target.id,
887
- roomName: payload.target.name,
888
- senderId: payload.actor.id,
889
- senderName: payload.actor.name ?? "",
890
- text: payload.object.content || payload.object.name || "",
891
- mediaType: payload.object.mediaType || "text/plain",
892
- timestamp: Date.now(),
893
- isGroupChat: true
894
- };
895
- }
896
- function readNextcloudTalkWebhookBody(req, maxBodyBytes) {
897
- return readRequestBodyWithLimit(req, {
898
- maxBytes: Math.min(maxBodyBytes, PREAUTH_WEBHOOK_MAX_BODY_BYTES),
899
- timeoutMs: PREAUTH_WEBHOOK_BODY_TIMEOUT_MS
900
- });
901
- }
902
- function createNextcloudTalkWebhookServer(opts) {
903
- const { port, host, path, secret, onMessage, onError, abortSignal } = opts;
904
- const maxBodyBytes = typeof opts.maxBodyBytes === "number" && Number.isFinite(opts.maxBodyBytes) && opts.maxBodyBytes > 0 ? Math.floor(opts.maxBodyBytes) : DEFAULT_WEBHOOK_MAX_BODY_BYTES;
905
- const readBody = opts.readBody ?? readNextcloudTalkWebhookBody;
906
- const isBackendAllowed = opts.isBackendAllowed;
907
- const shouldProcessMessage = opts.shouldProcessMessage;
908
- const server = createServer(async (req, res) => {
909
- if (req.url === HEALTH_PATH) {
910
- res.writeHead(200, { "Content-Type": "text/plain" });
911
- res.end("ok");
912
- return;
913
- }
914
- if (req.url !== path || req.method !== "POST") {
915
- res.writeHead(404);
916
- res.end();
917
- return;
918
- }
919
- try {
920
- const headers = validateWebhookHeaders({
921
- req,
922
- res,
923
- isBackendAllowed
924
- });
925
- if (!headers) return;
926
- const body = await readBody(req, maxBodyBytes);
927
- if (!verifyWebhookSignature({
928
- headers,
929
- body,
930
- secret,
931
- res
932
- })) return;
933
- const decoded = decodeWebhookCreateMessage({
934
- body,
935
- res
936
- });
937
- if (decoded.kind === "invalid") return;
938
- if (decoded.kind === "ignore") {
939
- writeJsonResponse(res, 200);
940
- return;
941
- }
942
- const message = decoded.message;
943
- if (shouldProcessMessage) {
944
- if (!await shouldProcessMessage(message)) {
945
- writeJsonResponse(res, 200);
946
- return;
947
- }
948
- }
949
- writeJsonResponse(res, 200);
950
- try {
951
- await onMessage(message);
952
- } catch (err) {
953
- onError?.(err instanceof Error ? err : new Error(formatError(err)));
954
- }
955
- } catch (err) {
956
- if (isRequestBodyLimitError(err, "PAYLOAD_TOO_LARGE")) {
957
- writeWebhookError(res, 413, WEBHOOK_ERRORS.payloadTooLarge);
958
- return;
959
- }
960
- if (isRequestBodyLimitError(err, "REQUEST_BODY_TIMEOUT")) {
961
- writeWebhookError(res, 408, requestBodyErrorToText("REQUEST_BODY_TIMEOUT"));
962
- return;
963
- }
964
- const error = err instanceof Error ? err : new Error(formatError(err));
965
- onError?.(error);
966
- writeWebhookError(res, 500, WEBHOOK_ERRORS.internalServerError);
967
- }
968
- });
969
- const start = () => {
970
- return new Promise((resolve) => {
971
- server.listen(port, host, () => resolve());
972
- });
973
- };
974
- let stopped = false;
975
- const stop = () => {
976
- if (stopped) return;
977
- stopped = true;
978
- try {
979
- server.close();
980
- } catch {}
981
- };
982
- if (abortSignal) if (abortSignal.aborted) stop();
983
- else abortSignal.addEventListener("abort", stop, { once: true });
984
- return {
985
- server,
986
- start,
987
- stop
988
- };
989
- }
990
- async function monitorNextcloudTalkProvider(opts) {
991
- const core = getNextcloudTalkRuntime();
992
- const cfg = opts.config ?? core.config.loadConfig();
993
- const account = resolveNextcloudTalkAccount({
994
- cfg,
995
- accountId: opts.accountId
996
- });
997
- const runtime = resolveLoggerBackedRuntime(opts.runtime, core.logging.getChildLogger());
998
- if (!account.secret) throw new Error(`Nextcloud Talk bot secret not configured for account "${account.accountId}"`);
999
- const port = account.config.webhookPort ?? DEFAULT_WEBHOOK_PORT;
1000
- const host = account.config.webhookHost ?? DEFAULT_WEBHOOK_HOST;
1001
- const path = account.config.webhookPath ?? DEFAULT_WEBHOOK_PATH;
1002
- const logger = core.logging.getChildLogger({
1003
- channel: "nextcloud-talk",
1004
- accountId: account.accountId
1005
- });
1006
- const expectedBackendOrigin = normalizeOrigin(account.baseUrl);
1007
- const replayGuard = createNextcloudTalkReplayGuard({
1008
- stateDir: core.state.resolveStateDir(process.env, os.homedir),
1009
- onDiskError: (error) => {
1010
- logger.warn(`[nextcloud-talk:${account.accountId}] replay guard disk error: ${String(error)}`);
1011
- }
1012
- });
1013
- const { start, stop } = createNextcloudTalkWebhookServer({
1014
- port,
1015
- host,
1016
- path,
1017
- secret: account.secret,
1018
- isBackendAllowed: (backend) => {
1019
- if (!expectedBackendOrigin) return true;
1020
- return normalizeOrigin(backend) === expectedBackendOrigin;
1021
- },
1022
- shouldProcessMessage: async (message) => {
1023
- const shouldProcess = await replayGuard.shouldProcessMessage({
1024
- accountId: account.accountId,
1025
- roomToken: message.roomToken,
1026
- messageId: message.messageId
1027
- });
1028
- if (!shouldProcess) logger.warn(`[nextcloud-talk:${account.accountId}] replayed webhook ignored room=${message.roomToken} messageId=${message.messageId}`);
1029
- return shouldProcess;
1030
- },
1031
- onMessage: async (message) => {
1032
- core.channel.activity.record({
1033
- channel: "nextcloud-talk",
1034
- accountId: account.accountId,
1035
- direction: "inbound",
1036
- at: message.timestamp
1037
- });
1038
- if (opts.onMessage) {
1039
- await opts.onMessage(message);
1040
- return;
1041
- }
1042
- await handleNextcloudTalkInbound({
1043
- message,
1044
- account,
1045
- config: cfg,
1046
- runtime,
1047
- statusSink: opts.statusSink
1048
- });
1049
- },
1050
- onError: (error) => {
1051
- logger.error(`[nextcloud-talk:${account.accountId}] webhook error: ${error.message}`);
1052
- },
1053
- abortSignal: opts.abortSignal
1054
- });
1055
- if (opts.abortSignal?.aborted) return { stop };
1056
- await start();
1057
- if (opts.abortSignal?.aborted) {
1058
- stop();
1059
- return { stop };
1060
- }
1061
- const publicUrl = account.config.webhookPublicUrl ?? `http://${host === "0.0.0.0" ? "localhost" : host}:${port}${path}`;
1062
- logger.info(`[nextcloud-talk:${account.accountId}] webhook listening on ${publicUrl}`);
1063
- return { stop };
1064
- }
1065
- //#endregion
1066
- //#region extensions/nextcloud-talk/src/setup-core.ts
1067
- const channel$1 = "nextcloud-talk";
1068
- function normalizeNextcloudTalkBaseUrl(value) {
1069
- return value?.trim().replace(/\/+$/, "") ?? "";
1070
- }
1071
- function validateNextcloudTalkBaseUrl(value) {
1072
- if (!value) return "Required";
1073
- if (!value.startsWith("http://") && !value.startsWith("https://")) return "URL must start with http:// or https://";
1074
- }
1075
- function setNextcloudTalkDmPolicy(cfg, dmPolicy) {
1076
- return setTopLevelChannelDmPolicyWithAllowFrom({
1077
- cfg,
1078
- channel: channel$1,
1079
- dmPolicy
1080
- });
1081
- }
1082
- function setNextcloudTalkAccountConfig(cfg, accountId, updates) {
1083
- return patchScopedAccountConfig({
1084
- cfg,
1085
- channelKey: channel$1,
1086
- accountId,
1087
- patch: updates
1088
- });
1089
- }
1090
- function clearNextcloudTalkAccountFields(cfg, accountId, fields) {
1091
- const section = cfg.channels?.["nextcloud-talk"];
1092
- if (!section) return cfg;
1093
- if (accountId === "default") {
1094
- const nextSection = { ...section };
1095
- for (const field of fields) delete nextSection[field];
1096
- return {
1097
- ...cfg,
1098
- channels: {
1099
- ...cfg.channels ?? {},
1100
- "nextcloud-talk": nextSection
1101
- }
1102
- };
1103
- }
1104
- const currentAccount = section.accounts?.[accountId];
1105
- if (!currentAccount) return cfg;
1106
- const nextAccount = { ...currentAccount };
1107
- for (const field of fields) delete nextAccount[field];
1108
- return {
1109
- ...cfg,
1110
- channels: {
1111
- ...cfg.channels ?? {},
1112
- "nextcloud-talk": {
1113
- ...section,
1114
- accounts: {
1115
- ...section.accounts,
1116
- [accountId]: nextAccount
1117
- }
1118
- }
1119
- }
1120
- };
1121
- }
1122
- async function promptNextcloudTalkAllowFrom(params) {
1123
- const existingAllowFrom = resolveNextcloudTalkAccount({
1124
- cfg: params.cfg,
1125
- accountId: params.accountId
1126
- }).config.allowFrom ?? [];
1127
- await params.prompter.note([
1128
- "1) Check the Nextcloud admin panel for user IDs",
1129
- "2) Or look at the webhook payload logs when someone messages",
1130
- "3) User IDs are typically lowercase usernames in Nextcloud",
1131
- `Docs: ${formatDocsLink("/channels/nextcloud-talk", "nextcloud-talk")}`
1132
- ].join("\n"), "Nextcloud Talk user id");
1133
- let resolvedIds = [];
1134
- while (resolvedIds.length === 0) {
1135
- const entry = await params.prompter.text({
1136
- message: "Nextcloud Talk allowFrom (user id)",
1137
- placeholder: "username",
1138
- initialValue: existingAllowFrom[0] ? String(existingAllowFrom[0]) : void 0,
1139
- validate: (value) => String(value ?? "").trim() ? void 0 : "Required"
1140
- });
1141
- resolvedIds = String(entry).split(/[\n,;]+/g).map((value) => value.trim().toLowerCase()).filter(Boolean);
1142
- if (resolvedIds.length === 0) await params.prompter.note("Please enter at least one valid user ID.", "Nextcloud Talk");
1143
- }
1144
- return setNextcloudTalkAccountConfig(params.cfg, params.accountId, {
1145
- dmPolicy: "allowlist",
1146
- allowFrom: mergeAllowFromEntries(existingAllowFrom.map((value) => String(value).trim().toLowerCase()), resolvedIds)
1147
- });
1148
- }
1149
- async function promptNextcloudTalkAllowFromForAccount(params) {
1150
- const accountId = resolveSetupAccountId({
1151
- accountId: params.accountId,
1152
- defaultAccountId: resolveDefaultNextcloudTalkAccountId(params.cfg)
1153
- });
1154
- return await promptNextcloudTalkAllowFrom({
1155
- cfg: params.cfg,
1156
- prompter: params.prompter,
1157
- accountId
1158
- });
1159
- }
1160
- const nextcloudTalkDmPolicy = {
1161
- label: "Nextcloud Talk",
1162
- channel: channel$1,
1163
- policyKey: "channels.nextcloud-talk.dmPolicy",
1164
- allowFromKey: "channels.nextcloud-talk.allowFrom",
1165
- getCurrent: (cfg) => cfg.channels?.["nextcloud-talk"]?.dmPolicy ?? "pairing",
1166
- setPolicy: (cfg, policy) => setNextcloudTalkDmPolicy(cfg, policy),
1167
- promptAllowFrom: promptNextcloudTalkAllowFromForAccount
1168
- };
1169
- const nextcloudTalkSetupAdapter = {
1170
- resolveAccountId: ({ accountId }) => normalizeAccountId(accountId),
1171
- applyAccountName: ({ cfg, accountId, name }) => applyAccountNameToChannelSection({
1172
- cfg,
1173
- channelKey: channel$1,
1174
- accountId,
1175
- name
1176
- }),
1177
- validateInput: ({ accountId, input }) => {
1178
- const setupInput = input;
1179
- if (setupInput.useEnv && accountId !== "default") return "NEXTCLOUD_TALK_BOT_SECRET can only be used for the default account.";
1180
- if (!setupInput.useEnv && !setupInput.secret && !setupInput.secretFile) return "Nextcloud Talk requires bot secret or --secret-file (or --use-env).";
1181
- if (!setupInput.baseUrl) return "Nextcloud Talk requires --base-url.";
1182
- return null;
1183
- },
1184
- applyAccountConfig: ({ cfg, accountId, input }) => {
1185
- const setupInput = input;
1186
- const namedConfig = applyAccountNameToChannelSection({
1187
- cfg,
1188
- channelKey: channel$1,
1189
- accountId,
1190
- name: setupInput.name
1191
- });
1192
- return setNextcloudTalkAccountConfig(setupInput.useEnv ? clearNextcloudTalkAccountFields(namedConfig, accountId, ["botSecret", "botSecretFile"]) : namedConfig, accountId, {
1193
- baseUrl: normalizeNextcloudTalkBaseUrl(setupInput.baseUrl),
1194
- ...setupInput.useEnv ? {} : setupInput.secretFile ? { botSecretFile: setupInput.secretFile } : setupInput.secret ? { botSecret: setupInput.secret } : {}
1195
- });
1196
- }
1197
- };
1198
- //#endregion
1199
- //#region extensions/nextcloud-talk/src/setup-surface.ts
1200
- const channel = "nextcloud-talk";
1201
- const CONFIGURE_API_FLAG = "__nextcloudTalkConfigureApiCredentials";
1202
- const nextcloudTalkPlugin = {
1203
- id: "nextcloud-talk",
1204
- meta: {
1205
- id: "nextcloud-talk",
1206
- label: "Nextcloud Talk",
1207
- selectionLabel: "Nextcloud Talk (self-hosted)",
1208
- docsPath: "/channels/nextcloud-talk",
1209
- docsLabel: "nextcloud-talk",
1210
- blurb: "Self-hosted chat via Nextcloud Talk webhook bots.",
1211
- aliases: ["nc-talk", "nc"],
1212
- order: 65,
1213
- quickstartAllowFrom: true
1214
- },
1215
- setupWizard: {
1216
- channel,
1217
- stepOrder: "text-first",
1218
- status: {
1219
- configuredLabel: "configured",
1220
- unconfiguredLabel: "needs setup",
1221
- configuredHint: "configured",
1222
- unconfiguredHint: "self-hosted chat",
1223
- configuredScore: 1,
1224
- unconfiguredScore: 5,
1225
- resolveConfigured: ({ cfg }) => listNextcloudTalkAccountIds(cfg).some((accountId) => {
1226
- const account = resolveNextcloudTalkAccount({
1227
- cfg,
1228
- accountId
1229
- });
1230
- return Boolean(account.secret && account.baseUrl);
1231
- })
1232
- },
1233
- introNote: {
1234
- title: "Nextcloud Talk bot setup",
1235
- lines: [
1236
- "1) SSH into your Nextcloud server",
1237
- "2) Run: ./occ talk:bot:install \"MoldClaw\" \"<shared-secret>\" \"<webhook-url>\" --feature reaction",
1238
- "3) Copy the shared secret you used in the command",
1239
- "4) Enable the bot in your Nextcloud Talk room settings",
1240
- "Tip: you can also set NEXTCLOUD_TALK_BOT_SECRET in your env.",
1241
- `Docs: ${formatDocsLink("/channels/nextcloud-talk", "channels/nextcloud-talk")}`
1242
- ],
1243
- shouldShow: ({ cfg, accountId }) => {
1244
- const account = resolveNextcloudTalkAccount({
1245
- cfg,
1246
- accountId
1247
- });
1248
- return !account.secret || !account.baseUrl;
1249
- }
1250
- },
1251
- prepare: async ({ cfg, accountId, credentialValues, prompter }) => {
1252
- const resolvedAccount = resolveNextcloudTalkAccount({
1253
- cfg,
1254
- accountId
1255
- });
1256
- const hasApiCredentials = Boolean(resolvedAccount.config.apiUser?.trim() && (hasConfiguredSecretInput(resolvedAccount.config.apiPassword) || resolvedAccount.config.apiPasswordFile));
1257
- if (!await prompter.confirm({
1258
- message: "Configure optional Nextcloud Talk API credentials for room lookups?",
1259
- initialValue: hasApiCredentials
1260
- })) return;
1261
- return { credentialValues: {
1262
- ...credentialValues,
1263
- [CONFIGURE_API_FLAG]: "1"
1264
- } };
1265
- },
1266
- credentials: [{
1267
- inputKey: "token",
1268
- providerHint: channel,
1269
- credentialLabel: "bot secret",
1270
- preferredEnvVar: "NEXTCLOUD_TALK_BOT_SECRET",
1271
- envPrompt: "NEXTCLOUD_TALK_BOT_SECRET detected. Use env var?",
1272
- keepPrompt: "Nextcloud Talk bot secret already configured. Keep it?",
1273
- inputPrompt: "Enter Nextcloud Talk bot secret",
1274
- allowEnv: ({ accountId }) => accountId === DEFAULT_ACCOUNT_ID,
1275
- inspect: ({ cfg, accountId }) => {
1276
- const resolvedAccount = resolveNextcloudTalkAccount({
1277
- cfg,
1278
- accountId
1279
- });
1280
- return {
1281
- accountConfigured: Boolean(resolvedAccount.secret && resolvedAccount.baseUrl),
1282
- hasConfiguredValue: Boolean(hasConfiguredSecretInput(resolvedAccount.config.botSecret) || resolvedAccount.config.botSecretFile),
1283
- resolvedValue: resolvedAccount.secret || void 0,
1284
- envValue: accountId === "default" ? process.env.NEXTCLOUD_TALK_BOT_SECRET?.trim() || void 0 : void 0
1285
- };
1286
- },
1287
- applyUseEnv: async (params) => {
1288
- const resolvedAccount = resolveNextcloudTalkAccount({
1289
- cfg: params.cfg,
1290
- accountId: params.accountId
1291
- });
1292
- return setNextcloudTalkAccountConfig(clearNextcloudTalkAccountFields(params.cfg, params.accountId, ["botSecret", "botSecretFile"]), params.accountId, { baseUrl: resolvedAccount.baseUrl });
1293
- },
1294
- applySet: async (params) => setNextcloudTalkAccountConfig(clearNextcloudTalkAccountFields(params.cfg, params.accountId, ["botSecret", "botSecretFile"]), params.accountId, { botSecret: params.value })
1295
- }, {
1296
- inputKey: "password",
1297
- providerHint: "nextcloud-talk-api",
1298
- credentialLabel: "API password",
1299
- preferredEnvVar: "NEXTCLOUD_TALK_API_PASSWORD",
1300
- envPrompt: "",
1301
- keepPrompt: "Nextcloud Talk API password already configured. Keep it?",
1302
- inputPrompt: "Enter Nextcloud Talk API password",
1303
- inspect: ({ cfg, accountId }) => {
1304
- const resolvedAccount = resolveNextcloudTalkAccount({
1305
- cfg,
1306
- accountId
1307
- });
1308
- const apiUser = resolvedAccount.config.apiUser?.trim();
1309
- const apiPasswordConfigured = Boolean(hasConfiguredSecretInput(resolvedAccount.config.apiPassword) || resolvedAccount.config.apiPasswordFile);
1310
- return {
1311
- accountConfigured: Boolean(apiUser && apiPasswordConfigured),
1312
- hasConfiguredValue: apiPasswordConfigured
1313
- };
1314
- },
1315
- shouldPrompt: ({ credentialValues }) => credentialValues[CONFIGURE_API_FLAG] === "1",
1316
- applySet: async (params) => setNextcloudTalkAccountConfig(clearNextcloudTalkAccountFields(params.cfg, params.accountId, ["apiPassword", "apiPasswordFile"]), params.accountId, { apiPassword: params.value })
1317
- }],
1318
- textInputs: [{
1319
- inputKey: "httpUrl",
1320
- message: "Enter Nextcloud instance URL (e.g., https://cloud.example.com)",
1321
- currentValue: ({ cfg, accountId }) => resolveNextcloudTalkAccount({
1322
- cfg,
1323
- accountId
1324
- }).baseUrl || void 0,
1325
- shouldPrompt: ({ currentValue }) => !currentValue,
1326
- validate: ({ value }) => validateNextcloudTalkBaseUrl(value),
1327
- normalizeValue: ({ value }) => normalizeNextcloudTalkBaseUrl(value),
1328
- applySet: async (params) => setNextcloudTalkAccountConfig(params.cfg, params.accountId, { baseUrl: params.value })
1329
- }, {
1330
- inputKey: "userId",
1331
- message: "Nextcloud Talk API user",
1332
- currentValue: ({ cfg, accountId }) => resolveNextcloudTalkAccount({
1333
- cfg,
1334
- accountId
1335
- }).config.apiUser?.trim() || void 0,
1336
- shouldPrompt: ({ credentialValues }) => credentialValues[CONFIGURE_API_FLAG] === "1",
1337
- validate: ({ value }) => value ? void 0 : "Required",
1338
- applySet: async (params) => setNextcloudTalkAccountConfig(params.cfg, params.accountId, { apiUser: params.value })
1339
- }],
1340
- dmPolicy: nextcloudTalkDmPolicy,
1341
- disable: (cfg) => setSetupChannelEnabled(cfg, channel, false)
1342
- },
1343
- pairing: {
1344
- idLabel: "nextcloudUserId",
1345
- normalizeAllowEntry: (entry) => entry.replace(/^(nextcloud-talk|nc-talk|nc):/i, "").toLowerCase(),
1346
- notifyApproval: async ({ id }) => {
1347
- console.log(`[nextcloud-talk] User ${id} approved for pairing`);
1348
- }
1349
- },
1350
- capabilities: {
1351
- chatTypes: ["direct", "group"],
1352
- reactions: true,
1353
- threads: false,
1354
- media: true,
1355
- nativeCommands: false,
1356
- blockStreaming: true
1357
- },
1358
- reload: { configPrefixes: ["channels.nextcloud-talk"] },
1359
- configSchema: buildChannelConfigSchema(NextcloudTalkConfigSchema),
1360
- config: {
1361
- listAccountIds: (cfg) => listNextcloudTalkAccountIds(cfg),
1362
- resolveAccount: (cfg, accountId) => resolveNextcloudTalkAccount({
1363
- cfg,
1364
- accountId
1365
- }),
1366
- defaultAccountId: (cfg) => resolveDefaultNextcloudTalkAccountId(cfg),
1367
- setAccountEnabled: ({ cfg, accountId, enabled }) => setAccountEnabledInConfigSection({
1368
- cfg,
1369
- sectionKey: "nextcloud-talk",
1370
- accountId,
1371
- enabled,
1372
- allowTopLevel: true
1373
- }),
1374
- deleteAccount: ({ cfg, accountId }) => deleteAccountFromConfigSection({
1375
- cfg,
1376
- sectionKey: "nextcloud-talk",
1377
- accountId,
1378
- clearBaseFields: [
1379
- "botSecret",
1380
- "botSecretFile",
1381
- "baseUrl",
1382
- "name"
1383
- ]
1384
- }),
1385
- isConfigured: (account) => Boolean(account.secret?.trim() && account.baseUrl?.trim()),
1386
- describeAccount: (account) => ({
1387
- accountId: account.accountId,
1388
- name: account.name,
1389
- enabled: account.enabled,
1390
- configured: Boolean(account.secret?.trim() && account.baseUrl?.trim()),
1391
- secretSource: account.secretSource,
1392
- baseUrl: account.baseUrl ? "[set]" : "[missing]"
1393
- }),
1394
- resolveAllowFrom: ({ cfg, accountId }) => mapAllowFromEntries(resolveNextcloudTalkAccount({
1395
- cfg,
1396
- accountId
1397
- }).config.allowFrom).map((entry) => entry.toLowerCase()),
1398
- formatAllowFrom: ({ allowFrom }) => formatAllowFromLowercase({
1399
- allowFrom,
1400
- stripPrefixRe: /^(nextcloud-talk|nc-talk|nc):/i
1401
- })
1402
- },
1403
- security: {
1404
- resolveDmPolicy: ({ cfg, accountId, account }) => {
1405
- return buildAccountScopedDmSecurityPolicy({
1406
- cfg,
1407
- channelKey: "nextcloud-talk",
1408
- accountId,
1409
- fallbackAccountId: account.accountId ?? "default",
1410
- policy: account.config.dmPolicy,
1411
- allowFrom: account.config.allowFrom ?? [],
1412
- policyPathSuffix: "dmPolicy",
1413
- normalizeEntry: (raw) => raw.replace(/^(nextcloud-talk|nc-talk|nc):/i, "").toLowerCase()
1414
- });
1415
- },
1416
- collectWarnings: ({ account, cfg }) => {
1417
- const roomAllowlistConfigured = account.config.rooms && Object.keys(account.config.rooms).length > 0;
1418
- return collectAllowlistProviderGroupPolicyWarnings({
1419
- cfg,
1420
- providerConfigPresent: cfg.channels?.["nextcloud-talk"] !== void 0,
1421
- configuredGroupPolicy: account.config.groupPolicy,
1422
- collect: (groupPolicy) => collectOpenGroupPolicyRouteAllowlistWarnings({
1423
- groupPolicy,
1424
- routeAllowlistConfigured: Boolean(roomAllowlistConfigured),
1425
- restrictSenders: {
1426
- surface: "Nextcloud Talk rooms",
1427
- openScope: "any member in allowed rooms",
1428
- groupPolicyPath: "channels.nextcloud-talk.groupPolicy",
1429
- groupAllowFromPath: "channels.nextcloud-talk.groupAllowFrom"
1430
- },
1431
- noRouteAllowlist: {
1432
- surface: "Nextcloud Talk rooms",
1433
- routeAllowlistPath: "channels.nextcloud-talk.rooms",
1434
- routeScope: "room",
1435
- groupPolicyPath: "channels.nextcloud-talk.groupPolicy",
1436
- groupAllowFromPath: "channels.nextcloud-talk.groupAllowFrom"
1437
- }
1438
- })
1439
- });
1440
- }
1441
- },
1442
- groups: {
1443
- resolveRequireMention: ({ cfg, accountId, groupId }) => {
1444
- const rooms = resolveNextcloudTalkAccount({
1445
- cfg,
1446
- accountId
1447
- }).config.rooms;
1448
- if (!rooms || !groupId) return true;
1449
- const roomConfig = rooms[groupId];
1450
- if (roomConfig?.requireMention !== void 0) return roomConfig.requireMention;
1451
- const wildcardConfig = rooms["*"];
1452
- if (wildcardConfig?.requireMention !== void 0) return wildcardConfig.requireMention;
1453
- return true;
1454
- },
1455
- resolveToolPolicy: resolveNextcloudTalkGroupToolPolicy
1456
- },
1457
- messaging: {
1458
- normalizeTarget: normalizeNextcloudTalkMessagingTarget,
1459
- targetResolver: {
1460
- looksLikeId: looksLikeNextcloudTalkTargetId,
1461
- hint: "<roomToken>"
1462
- }
1463
- },
1464
- setup: nextcloudTalkSetupAdapter,
1465
- outbound: {
1466
- deliveryMode: "direct",
1467
- chunker: (text, limit) => getNextcloudTalkRuntime().channel.text.chunkMarkdownText(text, limit),
1468
- chunkerMode: "markdown",
1469
- textChunkLimit: 4e3,
1470
- sendText: async ({ cfg, to, text, accountId, replyToId }) => {
1471
- return {
1472
- channel: "nextcloud-talk",
1473
- ...await sendMessageNextcloudTalk(to, text, {
1474
- accountId: accountId ?? void 0,
1475
- replyTo: replyToId ?? void 0,
1476
- cfg
1477
- })
1478
- };
1479
- },
1480
- sendMedia: async ({ cfg, to, text, mediaUrl, accountId, replyToId }) => {
1481
- return {
1482
- channel: "nextcloud-talk",
1483
- ...await sendMessageNextcloudTalk(to, mediaUrl ? `${text}\n\nAttachment: ${mediaUrl}` : text, {
1484
- accountId: accountId ?? void 0,
1485
- replyTo: replyToId ?? void 0,
1486
- cfg
1487
- })
1488
- };
1489
- }
1490
- },
1491
- status: {
1492
- defaultRuntime: {
1493
- accountId: DEFAULT_ACCOUNT_ID,
1494
- running: false,
1495
- lastStartAt: null,
1496
- lastStopAt: null,
1497
- lastError: null
1498
- },
1499
- buildChannelSummary: ({ snapshot }) => {
1500
- const base = buildBaseChannelStatusSummary(snapshot);
1501
- return {
1502
- configured: base.configured,
1503
- secretSource: snapshot.secretSource ?? "none",
1504
- running: base.running,
1505
- mode: "webhook",
1506
- lastStartAt: base.lastStartAt,
1507
- lastStopAt: base.lastStopAt,
1508
- lastError: base.lastError
1509
- };
1510
- },
1511
- buildAccountSnapshot: ({ account, runtime }) => {
1512
- const configured = Boolean(account.secret?.trim() && account.baseUrl?.trim());
1513
- const runtimeSnapshot = buildRuntimeAccountStatusSnapshot({ runtime });
1514
- return {
1515
- accountId: account.accountId,
1516
- name: account.name,
1517
- enabled: account.enabled,
1518
- configured,
1519
- secretSource: account.secretSource,
1520
- baseUrl: account.baseUrl ? "[set]" : "[missing]",
1521
- running: runtimeSnapshot.running,
1522
- lastStartAt: runtimeSnapshot.lastStartAt,
1523
- lastStopAt: runtimeSnapshot.lastStopAt,
1524
- lastError: runtimeSnapshot.lastError,
1525
- mode: "webhook",
1526
- lastInboundAt: runtime?.lastInboundAt ?? null,
1527
- lastOutboundAt: runtime?.lastOutboundAt ?? null
1528
- };
1529
- }
1530
- },
1531
- gateway: {
1532
- startAccount: async (ctx) => {
1533
- const account = ctx.account;
1534
- if (!account.secret || !account.baseUrl) throw new Error(`Nextcloud Talk not configured for account "${account.accountId}" (missing secret or baseUrl)`);
1535
- ctx.log?.info(`[${account.accountId}] starting Nextcloud Talk webhook server`);
1536
- const statusSink = createAccountStatusSink({
1537
- accountId: ctx.accountId,
1538
- setStatus: ctx.setStatus
1539
- });
1540
- await runStoppablePassiveMonitor({
1541
- abortSignal: ctx.abortSignal,
1542
- start: async () => await monitorNextcloudTalkProvider({
1543
- accountId: account.accountId,
1544
- config: ctx.cfg,
1545
- runtime: ctx.runtime,
1546
- abortSignal: ctx.abortSignal,
1547
- statusSink
1548
- })
1549
- });
1550
- },
1551
- logoutAccount: async ({ accountId, cfg }) => {
1552
- const nextCfg = { ...cfg };
1553
- const nextSection = cfg.channels?.["nextcloud-talk"] ? { ...cfg.channels["nextcloud-talk"] } : void 0;
1554
- let cleared = false;
1555
- let changed = false;
1556
- if (nextSection) {
1557
- if (accountId === "default" && nextSection.botSecret) {
1558
- delete nextSection.botSecret;
1559
- cleared = true;
1560
- changed = true;
1561
- }
1562
- const accountCleanup = clearAccountEntryFields({
1563
- accounts: nextSection.accounts,
1564
- accountId,
1565
- fields: ["botSecret"]
1566
- });
1567
- if (accountCleanup.changed) {
1568
- changed = true;
1569
- if (accountCleanup.cleared) cleared = true;
1570
- if (accountCleanup.nextAccounts) nextSection.accounts = accountCleanup.nextAccounts;
1571
- else delete nextSection.accounts;
1572
- }
1573
- }
1574
- if (changed) if (nextSection && Object.keys(nextSection).length > 0) nextCfg.channels = {
1575
- ...nextCfg.channels,
1576
- "nextcloud-talk": nextSection
1577
- };
1578
- else {
1579
- const nextChannels = { ...nextCfg.channels };
1580
- delete nextChannels["nextcloud-talk"];
1581
- if (Object.keys(nextChannels).length > 0) nextCfg.channels = nextChannels;
1582
- else delete nextCfg.channels;
1583
- }
1584
- const loggedOut = resolveNextcloudTalkAccount({
1585
- cfg: changed ? nextCfg : cfg,
1586
- accountId
1587
- }).secretSource === "none";
1588
- if (changed) await getNextcloudTalkRuntime().config.writeConfigFile(nextCfg);
1589
- return {
1590
- cleared,
1591
- envSecret: Boolean(process.env.NEXTCLOUD_TALK_BOT_SECRET?.trim()),
1592
- loggedOut
1593
- };
1594
- }
1595
- }
1596
- };
1597
- //#endregion
1598
- export { setNextcloudTalkRuntime as n, nextcloudTalkPlugin as t };