@spacebar_ai/moldclaw-core 2026.3.41 → 2026.3.44

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 (1144) hide show
  1. package/dist/accounts-5qY-dKca.d.ts +103 -0
  2. package/dist/accounts-SqdHz2ZP.js +114 -0
  3. package/dist/acp-cli-E6bcNqiE.js +2093 -0
  4. package/dist/actions.runtime-BU_XMuLk.js +119 -0
  5. package/dist/actions.runtime-CY5h8lqH.js +133 -0
  6. package/dist/agent-scope-lZlwP1At.js +208 -0
  7. package/dist/agents-C4SkadR1.js +853 -0
  8. package/dist/agents-RfwqGCzE.js +222 -0
  9. package/dist/agents.config-CX9CPNfP.js +17 -0
  10. package/dist/agents.config-DF9Zwn9n.js +121 -0
  11. package/dist/allow-list-3WSjz1zl.js +81 -0
  12. package/dist/allowlist-DNbDjFjw.js +142 -0
  13. package/dist/api-BEOpJ7dR.js +117 -0
  14. package/dist/audit-CpJz_eu6.js +787 -0
  15. package/dist/audit-CpfSjvyo.js +54 -0
  16. package/dist/audit-channel.collect.runtime-BeGotloZ.js +605 -0
  17. package/dist/audit-channel.runtime-BJDZ7ETt.js +121 -0
  18. package/dist/audit-extra.async-C2G0mqmk.js +813 -0
  19. package/dist/audit-membership-runtime-B1FqJsPV.js +162 -0
  20. package/dist/audit.deep.runtime-DyL9O_sU.js +25 -0
  21. package/dist/audit.nondeep.runtime-C6jFgJfH.js +832 -0
  22. package/dist/audit.runtime-Dnlsn23e.js +118 -0
  23. package/dist/auth-Ch3Rchm4.js +101 -0
  24. package/dist/auth-choice-CEFSlnLT.js +122 -0
  25. package/dist/auth-choice-CVCef-eU.js +268 -0
  26. package/dist/auth-choice-Cez-pXrg.js +507 -0
  27. package/dist/auth-choice-options-DO78mvPe.js +123 -0
  28. package/dist/auth-choice-prompt-CUkC7Mmb.js +36 -0
  29. package/dist/auth-choice-prompt-DCuQRiVl.js +115 -0
  30. package/dist/auth-choice.apply-helpers-BhbNIV8X.js +66 -0
  31. package/dist/auth-choice.plugin-providers.runtime-4BhqvEw_.js +119 -0
  32. package/dist/auth-profiles-smABVXzp.js +128040 -0
  33. package/dist/auth-profiles.runtime-Cr-ojtTc.js +116 -0
  34. package/dist/banner-CojBHPWr.js +342 -0
  35. package/dist/bluebubbles-BnLsj2Fy.d.ts +6 -0
  36. package/dist/bluebubbles-CVk7M3Bl.js +64 -0
  37. package/dist/bot-DdyrB2z9.d.ts +478 -0
  38. package/dist/brave-w4Fo8WZ3.js +24 -0
  39. package/dist/browser-cli-DWFs3P_i.js +1494 -0
  40. package/dist/build-info.json +3 -3
  41. package/dist/bundled/boot-md/handler.d.ts +1 -1
  42. package/dist/bundled/boot-md/handler.js +35 -35
  43. package/dist/bundled/bootstrap-extra-files/handler.d.ts +1 -1
  44. package/dist/bundled/bootstrap-extra-files/handler.js +1 -1
  45. package/dist/bundled/command-logger/handler.d.ts +1 -1
  46. package/dist/bundled/session-memory/handler.d.ts +1 -1
  47. package/dist/bundled/session-memory/handler.js +36 -36
  48. package/dist/call-Do7wTSr7.js +39 -0
  49. package/dist/call-gdDAt07d.js +640 -0
  50. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  51. package/dist/channel-B26pkce0.js +214 -0
  52. package/dist/channel-BJHp0AQC.js +352 -0
  53. package/dist/channel-BKFOv51P.js +4681 -0
  54. package/dist/channel-BNgpOY8v.js +538 -0
  55. package/dist/channel-BcQAAo2P.js +226 -0
  56. package/dist/channel-BvNdnhbx.js +1598 -0
  57. package/dist/channel-C1Rda3Jd.js +306 -0
  58. package/dist/channel-C87DG-F7.js +803 -0
  59. package/dist/channel-CIip0kvZ.js +619 -0
  60. package/dist/channel-CTPxoT_E2.js +316 -0
  61. package/dist/channel-CklaCzUG.js +562 -0
  62. package/dist/channel-CoJnAdLs.js +920 -0
  63. package/dist/channel-D3tafL1_.js +949 -0
  64. package/dist/channel-DFMrP2uu.js +542 -0
  65. package/dist/channel-DMd5cJQe.js +397 -0
  66. package/dist/channel-Dm34kxAJ.js +207 -0
  67. package/dist/channel-DmwF9udn.js +1321 -0
  68. package/dist/channel-account-context-Bjur9nlh.js +103 -0
  69. package/dist/channel-bGnST659.js +943 -0
  70. package/dist/channel-hIgbkTZf.js +575 -0
  71. package/dist/channel-m_TGrDKo.js +497 -0
  72. package/dist/channel-options-DoUPBMa8.js +50 -0
  73. package/dist/channel-plugin-ids-TZIY4hFs.js +26 -0
  74. package/dist/channel-summary-qD54bOBO.js +111 -0
  75. package/dist/channel.runtime-B0H04Dkk.js +199 -0
  76. package/dist/channel.runtime-BU1f3NkV.js +418 -0
  77. package/dist/channel.runtime-Bj1sfLep.js +4011 -0
  78. package/dist/channel.runtime-BtPAAJc3.js +870 -0
  79. package/dist/channel.runtime-Bx-10m_j.js +171 -0
  80. package/dist/channel.runtime-CI_TBywQ.js +179 -0
  81. package/dist/channel.runtime-CSLj14-Z.js +182 -0
  82. package/dist/channel.runtime-D-lTSYAd.js +404 -0
  83. package/dist/channel.runtime-DJqIOSji.js +127 -0
  84. package/dist/channel.runtime-Ec8aQ9V2.js +241 -0
  85. package/dist/channel.runtime-ax5a1jBm.js +218 -0
  86. package/dist/channel.setup-B-ncdYLT.js +9 -0
  87. package/dist/channel.setup-BY4bh5dm.js +9 -0
  88. package/dist/channel.setup-BovsdMnL.js +57 -0
  89. package/dist/channel.setup-CXzXA25h.js +6 -0
  90. package/dist/channel.setup-DcZUEufN.js +8 -0
  91. package/dist/channel.setup-E6zceRsE.js +8 -0
  92. package/dist/channel.setup-Pc7nGbdX.js +11 -0
  93. package/dist/channels/plugins/actions/discord.d.ts +2 -2
  94. package/dist/channels/plugins/actions/discord.js +35 -35
  95. package/dist/channels/plugins/actions/signal.d.ts +1 -1
  96. package/dist/channels/plugins/actions/signal.js +35 -35
  97. package/dist/channels/plugins/actions/telegram.d.ts +2 -2
  98. package/dist/channels/plugins/actions/telegram.js +35 -35
  99. package/dist/channels/plugins/agent-tools/whatsapp-login.d.ts +3 -3
  100. package/dist/channels/plugins/agent-tools/whatsapp-login.js +35 -35
  101. package/dist/channels-CPtE5ND6.js +404 -0
  102. package/dist/channels-Cj8ZolHI.js +1118 -0
  103. package/dist/channels-cli-D2sKrntt.js +291 -0
  104. package/dist/channels-status-issues-CzIHODg2.js +16 -0
  105. package/dist/clawbot-cli-BcwEDmUn.js +118 -0
  106. package/dist/cleanup-utils-D0L17RsX.js +96 -0
  107. package/dist/cli/daemon-cli.js +1 -1
  108. package/dist/cli-BvGVPKnD.js +154 -0
  109. package/dist/command-registry-CADQzTAg.js +14 -0
  110. package/dist/command-registry-ktiJNAJd.js +242 -0
  111. package/dist/command-secret-gateway-CXp10RTM.js +111 -0
  112. package/dist/compact.runtime-DyKL-Iar.js +116 -0
  113. package/dist/completion-cli-Bz4STrpt.js +17 -0
  114. package/dist/completion-cli-pVda2OFb.js +445 -0
  115. package/dist/config-BbvDRSYp.js +31 -0
  116. package/dist/config-CwBv71QC.js +44 -0
  117. package/dist/config-cli-Y0uXHbOw.js +678 -0
  118. package/dist/config-guard-BpW5g7JE.js +118 -0
  119. package/dist/config-validation-B-vLIsbo.js +262 -0
  120. package/dist/config-value-DT3-5958.js +132 -0
  121. package/dist/configure-B9U-jCqP.js +1100 -0
  122. package/dist/configure-BJ3Wrs5b.js +243 -0
  123. package/dist/control-ui-assets-C1YDYi82.js +232 -0
  124. package/dist/control-ui-shared-Dm5Dh0Lo.js +29 -0
  125. package/dist/core-BwKq3krw.js +150 -0
  126. package/dist/core-hjBwfDsW.d.ts +87 -0
  127. package/dist/cron-cli-DTDgfoMh.js +639 -0
  128. package/dist/daemon-cli-C-dkAXR1.js +339 -0
  129. package/dist/daemon-install-Oy0Q5pMF.js +180 -0
  130. package/dist/deliver-DNGnDqF9.js +111 -0
  131. package/dist/deliver-runtime-CCNZIhET.js +111 -0
  132. package/dist/device-id-cli-XvwZbIyC.js +52 -0
  133. package/dist/device-identity-IG5DngWM.js +365 -0
  134. package/dist/devices-cli-DIsxj4xp.js +342 -0
  135. package/dist/diagnostic-DTPopFvh.js +310 -0
  136. package/dist/directory-cli-DTSY3Ktr.js +311 -0
  137. package/dist/directory-config-helpers-DpFcAbmo.d.ts +38 -0
  138. package/dist/directory.static-CBRAUwUW.js +44 -0
  139. package/dist/discord-CrgxhEWw.js +114 -0
  140. package/dist/discovery-DrG7wmAR.js +48 -0
  141. package/dist/dm-policy-shared-DKoGdUpY.d.ts +95 -0
  142. package/dist/dns-cli-BJiz6CLK.js +217 -0
  143. package/dist/docs-cli-Dq2Yi5qO.js +174 -0
  144. package/dist/doctor-completion-D3GeVcFP.js +90 -0
  145. package/dist/doctor-config-flow-B1cMjr8h.js +112 -0
  146. package/dist/doctor-config-flow-BUe7JpV3.js +2437 -0
  147. package/dist/enable-Bc8bCuVe.js +24 -0
  148. package/dist/entry.js +4 -4
  149. package/dist/exec-approvals-cli-kLAev6bP.js +421 -0
  150. package/dist/extensions/acpx/index.d.ts +1 -1
  151. package/dist/extensions/amazon-bedrock/index.d.ts +1 -1
  152. package/dist/extensions/amazon-bedrock/index.js +4 -4
  153. package/dist/extensions/anthropic/index.d.ts +1 -1
  154. package/dist/extensions/anthropic/index.js +35 -35
  155. package/dist/extensions/bluebubbles/index.d.ts +1 -1
  156. package/dist/extensions/bluebubbles/index.js +39 -39
  157. package/dist/extensions/bluebubbles/setup-entry.d.ts +2 -2
  158. package/dist/extensions/bluebubbles/setup-entry.js +39 -39
  159. package/dist/extensions/brave/index.d.ts +1 -1
  160. package/dist/extensions/brave/index.js +5 -5
  161. package/dist/extensions/byteplus/index.d.ts +1 -1
  162. package/dist/extensions/byteplus/index.js +35 -35
  163. package/dist/extensions/cloudflare-ai-gateway/index.d.ts +1 -1
  164. package/dist/extensions/cloudflare-ai-gateway/index.js +36 -36
  165. package/dist/extensions/copilot-proxy/index.d.ts +1 -1
  166. package/dist/extensions/copilot-proxy/index.js +4 -4
  167. package/dist/extensions/device-pair/index.d.ts +1 -1
  168. package/dist/extensions/device-pair/index.js +4 -4
  169. package/dist/extensions/diagnostics-otel/index.d.ts +1 -1
  170. package/dist/extensions/diagnostics-otel/index.js +4 -4
  171. package/dist/extensions/diffs/index.d.ts +1 -1
  172. package/dist/extensions/discord/index.d.ts +1 -1
  173. package/dist/extensions/discord/index.js +40 -40
  174. package/dist/extensions/discord/setup-entry.d.ts +1 -1
  175. package/dist/extensions/discord/setup-entry.js +38 -38
  176. package/dist/extensions/elevenlabs/index.d.ts +1 -1
  177. package/dist/extensions/elevenlabs/index.js +35 -35
  178. package/dist/extensions/feishu/index.d.ts +2 -2
  179. package/dist/extensions/feishu/index.js +40 -40
  180. package/dist/extensions/feishu/setup-entry.d.ts +2 -2
  181. package/dist/extensions/feishu/setup-entry.js +37 -37
  182. package/dist/extensions/firecrawl/index.d.ts +1 -1
  183. package/dist/extensions/firecrawl/index.js +35 -35
  184. package/dist/extensions/github-copilot/index.d.ts +1 -1
  185. package/dist/extensions/github-copilot/index.js +35 -35
  186. package/dist/extensions/google/index.d.ts +1 -1
  187. package/dist/extensions/google/index.js +35 -35
  188. package/dist/extensions/googlechat/index.d.ts +1 -1
  189. package/dist/extensions/googlechat/index.js +38 -38
  190. package/dist/extensions/googlechat/setup-entry.d.ts +1 -1
  191. package/dist/extensions/googlechat/setup-entry.js +38 -38
  192. package/dist/extensions/huggingface/index.d.ts +1 -1
  193. package/dist/extensions/huggingface/index.js +35 -35
  194. package/dist/extensions/imessage/index.d.ts +1 -1
  195. package/dist/extensions/imessage/index.js +39 -39
  196. package/dist/extensions/imessage/setup-entry.d.ts +1 -1
  197. package/dist/extensions/imessage/setup-entry.js +39 -39
  198. package/dist/extensions/irc/index.d.ts +1 -1
  199. package/dist/extensions/irc/index.js +38 -38
  200. package/dist/extensions/irc/setup-entry.d.ts +2 -2
  201. package/dist/extensions/irc/setup-entry.js +38 -38
  202. package/dist/extensions/kakao-talkchannel/index.d.ts +1 -1
  203. package/dist/extensions/kakao-talkchannel/index.js +4 -4
  204. package/dist/extensions/kilocode/index.d.ts +1 -1
  205. package/dist/extensions/kilocode/index.js +35 -35
  206. package/dist/extensions/kimi-coding/index.d.ts +1 -1
  207. package/dist/extensions/kimi-coding/index.js +35 -35
  208. package/dist/extensions/line/index.d.ts +1 -1
  209. package/dist/extensions/line/index.js +37 -37
  210. package/dist/extensions/line/setup-entry.d.ts +1 -1
  211. package/dist/extensions/line/setup-entry.js +37 -37
  212. package/dist/extensions/llm-task/index.d.ts +1 -1
  213. package/dist/extensions/llm-task/index.js +35 -35
  214. package/dist/extensions/lobster/index.d.ts +1 -1
  215. package/dist/extensions/lobster/index.js +4 -4
  216. package/dist/extensions/matrix/index.d.ts +1 -1
  217. package/dist/extensions/matrix/index.js +40 -40
  218. package/dist/extensions/matrix/setup-entry.d.ts +2 -2
  219. package/dist/extensions/matrix/setup-entry.js +40 -40
  220. package/dist/extensions/mattermost/index.d.ts +1 -1
  221. package/dist/extensions/mattermost/index.js +37 -37
  222. package/dist/extensions/mattermost/setup-entry.d.ts +2 -2
  223. package/dist/extensions/mattermost/setup-entry.js +37 -37
  224. package/dist/extensions/memory-core/index.d.ts +1 -1
  225. package/dist/extensions/memory-core/index.js +4 -4
  226. package/dist/extensions/memory-lancedb/index.d.ts +1 -1
  227. package/dist/extensions/memory-lancedb/index.js +4 -4
  228. package/dist/extensions/microsoft/index.d.ts +1 -1
  229. package/dist/extensions/microsoft/index.js +35 -35
  230. package/dist/extensions/minimax/index.d.ts +1 -1
  231. package/dist/extensions/minimax/index.js +35 -35
  232. package/dist/extensions/mistral/index.d.ts +1 -1
  233. package/dist/extensions/mistral/index.js +35 -35
  234. package/dist/extensions/modelstudio/index.d.ts +1 -1
  235. package/dist/extensions/modelstudio/index.js +35 -35
  236. package/dist/extensions/moonshot/index.d.ts +1 -1
  237. package/dist/extensions/moonshot/index.js +35 -35
  238. package/dist/extensions/msteams/index.d.ts +1 -1
  239. package/dist/extensions/msteams/index.js +40 -40
  240. package/dist/extensions/msteams/setup-entry.d.ts +1 -1
  241. package/dist/extensions/msteams/setup-entry.js +40 -40
  242. package/dist/extensions/nextcloud-talk/index.d.ts +1 -1
  243. package/dist/extensions/nextcloud-talk/index.js +37 -37
  244. package/dist/extensions/nextcloud-talk/setup-entry.d.ts +2 -2
  245. package/dist/extensions/nextcloud-talk/setup-entry.js +37 -37
  246. package/dist/extensions/nostr/index.d.ts +1 -1
  247. package/dist/extensions/nostr/index.js +37 -37
  248. package/dist/extensions/nostr/setup-entry.d.ts +1 -1
  249. package/dist/extensions/nostr/setup-entry.js +37 -37
  250. package/dist/extensions/nvidia/index.d.ts +1 -1
  251. package/dist/extensions/nvidia/index.js +4 -4
  252. package/dist/extensions/ollama/index.d.ts +1 -1
  253. package/dist/extensions/ollama/index.js +7 -7
  254. package/dist/extensions/open-prose/index.d.ts +1 -1
  255. package/dist/extensions/open-prose/index.js +4 -4
  256. package/dist/extensions/openai/index.d.ts +1 -1
  257. package/dist/extensions/openai/index.js +35 -35
  258. package/dist/extensions/opencode/index.d.ts +1 -1
  259. package/dist/extensions/opencode/index.js +35 -35
  260. package/dist/extensions/opencode-go/index.d.ts +1 -1
  261. package/dist/extensions/opencode-go/index.js +35 -35
  262. package/dist/extensions/openrouter/index.d.ts +1 -1
  263. package/dist/extensions/openrouter/index.js +35 -35
  264. package/dist/extensions/openshell/index.d.ts +1 -1
  265. package/dist/extensions/openshell/index.js +35 -35
  266. package/dist/extensions/perplexity/index.d.ts +1 -1
  267. package/dist/extensions/perplexity/index.js +5 -5
  268. package/dist/extensions/phone-control/index.d.ts +1 -1
  269. package/dist/extensions/phone-control/index.js +4 -4
  270. package/dist/extensions/qianfan/index.d.ts +1 -1
  271. package/dist/extensions/qianfan/index.js +35 -35
  272. package/dist/extensions/qwen-portal-auth/index.d.ts +1 -1
  273. package/dist/extensions/qwen-portal-auth/index.js +35 -35
  274. package/dist/extensions/sglang/index.d.ts +1 -1
  275. package/dist/extensions/sglang/index.js +35 -35
  276. package/dist/extensions/signal/index.d.ts +1 -1
  277. package/dist/extensions/signal/index.js +38 -38
  278. package/dist/extensions/signal/setup-entry.d.ts +1 -1
  279. package/dist/extensions/signal/setup-entry.js +38 -38
  280. package/dist/extensions/slack/index.d.ts +1 -1
  281. package/dist/extensions/slack/index.js +39 -39
  282. package/dist/extensions/slack/setup-entry.d.ts +1 -1
  283. package/dist/extensions/slack/setup-entry.js +38 -38
  284. package/dist/extensions/synology-chat/index.d.ts +1 -1
  285. package/dist/extensions/synology-chat/index.js +37 -37
  286. package/dist/extensions/synology-chat/setup-entry.d.ts +1 -1
  287. package/dist/extensions/synology-chat/setup-entry.js +37 -37
  288. package/dist/extensions/synthetic/index.d.ts +1 -1
  289. package/dist/extensions/synthetic/index.js +35 -35
  290. package/dist/extensions/talk-voice/index.d.ts +1 -1
  291. package/dist/extensions/talk-voice/index.js +35 -35
  292. package/dist/extensions/telegram/index.d.ts +1 -1
  293. package/dist/extensions/telegram/index.js +38 -38
  294. package/dist/extensions/telegram/setup-entry.d.ts +1 -1
  295. package/dist/extensions/telegram/setup-entry.js +37 -37
  296. package/dist/extensions/thread-ownership/index.d.ts +1 -1
  297. package/dist/extensions/thread-ownership/index.js +4 -4
  298. package/dist/extensions/tlon/index.d.ts +1 -1
  299. package/dist/extensions/tlon/index.js +37 -37
  300. package/dist/extensions/tlon/setup-entry.d.ts +1 -1
  301. package/dist/extensions/tlon/setup-entry.js +37 -37
  302. package/dist/extensions/together/index.d.ts +1 -1
  303. package/dist/extensions/together/index.js +35 -35
  304. package/dist/extensions/twitch/index.d.ts +2 -2
  305. package/dist/extensions/twitch/index.js +37 -37
  306. package/dist/extensions/venice/index.d.ts +1 -1
  307. package/dist/extensions/venice/index.js +35 -35
  308. package/dist/extensions/vercel-ai-gateway/index.d.ts +1 -1
  309. package/dist/extensions/vercel-ai-gateway/index.js +36 -36
  310. package/dist/extensions/vllm/index.d.ts +1 -1
  311. package/dist/extensions/vllm/index.js +35 -35
  312. package/dist/extensions/voice-call/index.d.ts +1 -1
  313. package/dist/extensions/voice-call/index.js +35 -35
  314. package/dist/extensions/volcengine/index.d.ts +1 -1
  315. package/dist/extensions/volcengine/index.js +35 -35
  316. package/dist/extensions/whatsapp/index.d.ts +1 -1
  317. package/dist/extensions/whatsapp/index.js +38 -38
  318. package/dist/extensions/whatsapp/setup-entry.d.ts +1 -1
  319. package/dist/extensions/whatsapp/setup-entry.js +38 -38
  320. package/dist/extensions/xai/index.d.ts +1 -1
  321. package/dist/extensions/xai/index.js +35 -35
  322. package/dist/extensions/xiaomi/index.d.ts +1 -1
  323. package/dist/extensions/xiaomi/index.js +35 -35
  324. package/dist/extensions/zai/index.d.ts +1 -1
  325. package/dist/extensions/zai/index.js +35 -35
  326. package/dist/extensions/zalo/index.d.ts +1 -1
  327. package/dist/extensions/zalo/index.js +39 -39
  328. package/dist/extensions/zalo/setup-entry.d.ts +1 -1
  329. package/dist/extensions/zalo/setup-entry.js +39 -39
  330. package/dist/extensions/zalouser/index.d.ts +1 -1
  331. package/dist/extensions/zalouser/index.js +40 -40
  332. package/dist/extensions/zalouser/setup-entry.d.ts +1 -1
  333. package/dist/extensions/zalouser/setup-entry.js +40 -40
  334. package/dist/feishu-fIcnHDTd.d.ts +36 -0
  335. package/dist/gateway-cli-0c-8h93_.js +26437 -0
  336. package/dist/gateway-install-token-1PwJvrBY.js +163 -0
  337. package/dist/gateway-rpc-C0Vk51W7.js +26 -0
  338. package/dist/gateway-runtime-CBm3CCoA.js +69 -0
  339. package/dist/git-commit-BTWXFY41.js +177 -0
  340. package/dist/git-commit-D6GTN5Yt.js +2 -0
  341. package/dist/googlechat-BQr4xgoZ.js +307 -0
  342. package/dist/googlechat-BvwsCVKl.d.ts +12 -0
  343. package/dist/group-access-DpiQnd-G.d.ts +61 -0
  344. package/dist/health-6yZQGADY.js +113 -0
  345. package/dist/health-C9DYGyRe.js +570 -0
  346. package/dist/heartbeat-summary-Dct2lqJj.js +57 -0
  347. package/dist/help-CtwSApfq.js +81 -0
  348. package/dist/hooks-9gokOxZ5.d.ts +6 -0
  349. package/dist/hooks-cli-BegKzHZT.js +1000 -0
  350. package/dist/hooks-status-Bm_pGORf.js +78 -0
  351. package/dist/http-registry-D-S6a1Na.d.ts +20 -0
  352. package/dist/identity-file-Diub2a0t.js +60 -0
  353. package/dist/image-generation-CbIVzmAR.d.ts +9 -0
  354. package/dist/imessage-Bgok9kfl.js +31 -0
  355. package/dist/imessage-VIHePprL.js +115 -0
  356. package/dist/inbound-reply-dispatch-B53GAGWq.js +71 -0
  357. package/dist/inbound-reply-dispatch-n7U3qg15.d.ts +72 -0
  358. package/dist/index.js +2 -2
  359. package/dist/install-target-oz1pjfHH.js +574 -0
  360. package/dist/installs-CUFm5V8a.js +532 -0
  361. package/dist/io-BaBxjB1v.js +9739 -0
  362. package/dist/io-CgHb1Jld.js +29 -0
  363. package/dist/irc-CaRKzGvW.js +672 -0
  364. package/dist/library-C5SNBCMb.js +112 -0
  365. package/dist/lifecycle-core-Dn8PK6nk.js +382 -0
  366. package/dist/line/accounts.d.ts +2 -2
  367. package/dist/line/send.d.ts +1 -1
  368. package/dist/line/send.js +7 -7
  369. package/dist/line/template-messages.d.ts +1 -1
  370. package/dist/line-B5QFpgN_.d.ts +75 -0
  371. package/dist/line-fePrrQOD.js +530 -0
  372. package/dist/llm-slug-generator-hKae3XDA.js +67 -0
  373. package/dist/llm-slug-generator.d.ts +1 -1
  374. package/dist/llm-slug-generator.js +36 -36
  375. package/dist/logging-CdisccbY.js +13 -0
  376. package/dist/logging-LKQSgX1d.js +30 -0
  377. package/dist/login-qr-C1YWh4nE.js +233 -0
  378. package/dist/login-qr-WFluMDMb.js +112 -0
  379. package/dist/logs-cli-CNzOvZ2d.js +256 -0
  380. package/dist/manager-runtime-DgMhLTkR.js +111 -0
  381. package/dist/manager.runtime-hUWgpPt2.js +715 -0
  382. package/dist/manifest-registry-CS_p1OBQ.js +1329 -0
  383. package/dist/matrix-43_RGLZN.d.ts +68 -0
  384. package/dist/matrix-CCFxHfxa.js +1269 -0
  385. package/dist/matrix-DWs_qIkJ.js +1495 -0
  386. package/dist/mcp-cli-Ci2jvv3s.js +87 -0
  387. package/dist/media-understanding.runtime-Cdr6iTW6.js +116 -0
  388. package/dist/memory-cli-LZbyF0Iu.js +111 -0
  389. package/dist/memory-search-BHhETk6u.js +17 -0
  390. package/dist/memory-search-tTD5o_rU.js +204 -0
  391. package/dist/method-scopes-B2ZKSsxQ.js +2452 -0
  392. package/dist/model-auth-markers-LqZ4qhrZ.d.ts +20 -0
  393. package/dist/model-picker-CTR5mo4v.js +112 -0
  394. package/dist/model-picker-DG4z_dBs.js +390 -0
  395. package/dist/model-picker.runtime-DMQ9Pj9_.js +125 -0
  396. package/dist/model-selection-bBBxfXdb.js +653 -0
  397. package/dist/model-suppression.runtime-BVG75tZ7.js +116 -0
  398. package/dist/models-BjkVLfgw.js +2514 -0
  399. package/dist/models-ZO01Q4cx.js +118 -0
  400. package/dist/models-cli-DemdF-bm.js +309 -0
  401. package/dist/models-config-B2Jja8ua.js +111 -0
  402. package/dist/models-config.providers.discovery-puxTsH39.d.ts +18 -0
  403. package/dist/moldclaw-root-Cb6HRlUO.js +92 -0
  404. package/dist/monitor-BP4idxJD.js +782 -0
  405. package/dist/monitor-B_eP8Eim.js +772 -0
  406. package/dist/monitor-CRHYNl5J.js +3468 -0
  407. package/dist/monitor-Ci1Xg4g3.js +113 -0
  408. package/dist/monitor-DEodDl3z.js +6823 -0
  409. package/dist/monitor-DJlNKuMz.js +115 -0
  410. package/dist/monitor-DvFwDS9w.js +3076 -0
  411. package/dist/monitor-shared--cEjSf8s.js +444 -0
  412. package/dist/msteams-CV2a8uE8.js +852 -0
  413. package/dist/node-cli-Of2g7DSd.js +2503 -0
  414. package/dist/node-resolve-BYC2FbO2.js +835 -0
  415. package/dist/nodes-cli-CPHM6Upj.js +1380 -0
  416. package/dist/nostr-BFKRoOlz.d.ts +7 -0
  417. package/dist/nostr-lHpcBzz4.js +8744 -0
  418. package/dist/npm-resolution-kqHN85wB.js +60 -0
  419. package/dist/oauth-env-CLG8KOrz.js +10 -0
  420. package/dist/onboard-BON0C360.js +48 -0
  421. package/dist/onboard-CRkIBgOI.js +589 -0
  422. package/dist/onboard-DsKI17iq.js +25 -0
  423. package/dist/onboard-channels-BY3IbBBf.js +1241 -0
  424. package/dist/onboard-channels-CLKdRxvW.js +205 -0
  425. package/dist/onboard-custom-BjPrMo_R.js +571 -0
  426. package/dist/onboard-custom-DqcPiZBN.js +114 -0
  427. package/dist/onboard-helpers-BkrOY5OE.js +113 -0
  428. package/dist/onboard-helpers-DiSRTpZC.js +335 -0
  429. package/dist/onboard-hooks-pzEPZAvl.js +72 -0
  430. package/dist/onboard-remote-ChyLC6Dk.js +181 -0
  431. package/dist/onboard-remote-DHmK9ntl.js +117 -0
  432. package/dist/onboard-search-BgA3jEMW.js +302 -0
  433. package/dist/onboard-skills-BMo_NvnW.js +133 -0
  434. package/dist/onboard-skills-Bba-Z2p8.js +117 -0
  435. package/dist/outbound-media-BHD4aJEX.d.ts +11 -0
  436. package/dist/outbound-media-DSno0N82.js +11 -0
  437. package/dist/pairing-access-CzHpaM0R.d.ts +21 -0
  438. package/dist/pairing-cli-CmklqK0q.js +217 -0
  439. package/dist/perplexity-CXwMDD3u.js +24 -0
  440. package/dist/persistent-dedupe-B9vrAf8t.d.ts +26 -0
  441. package/dist/pi-model-discovery-runtime-BrK7tcaO.js +111 -0
  442. package/dist/pi-tools.before-tool-call.runtime-C5yLUogH.js +381 -0
  443. package/dist/plugin-install-C4AWJIFP.js +117 -0
  444. package/dist/plugin-install-CB3J1hfV.js +184 -0
  445. package/dist/plugin-install-plan-7itZiegi.js +49 -0
  446. package/dist/plugin-registry-DX_GFoiz.js +113 -0
  447. package/dist/plugin-registry-e3cxTtvb.js +49 -0
  448. package/dist/plugin-sdk/account-resolution.js +35 -35
  449. package/dist/plugin-sdk/acp-runtime.js +35 -35
  450. package/dist/plugin-sdk/agent-runtime.js +35 -35
  451. package/dist/plugin-sdk/bluebubbles.js +37 -37
  452. package/dist/plugin-sdk/channel-config-helpers.js +35 -35
  453. package/dist/plugin-sdk/channel-policy.js +35 -35
  454. package/dist/plugin-sdk/channel-runtime.js +35 -35
  455. package/dist/plugin-sdk/compat.js +36 -36
  456. package/dist/plugin-sdk/config-runtime.js +35 -35
  457. package/dist/plugin-sdk/conversation-runtime.js +35 -35
  458. package/dist/plugin-sdk/copilot-proxy.js +4 -4
  459. package/dist/plugin-sdk/core.js +4 -4
  460. package/dist/plugin-sdk/device-pair.js +4 -4
  461. package/dist/plugin-sdk/discord.js +35 -35
  462. package/dist/plugin-sdk/feishu.js +35 -35
  463. package/dist/plugin-sdk/gateway-runtime.js +10 -10
  464. package/dist/plugin-sdk/googlechat.js +37 -37
  465. package/dist/plugin-sdk/image-generation-runtime.js +35 -35
  466. package/dist/plugin-sdk/image-generation.js +35 -35
  467. package/dist/plugin-sdk/imessage.js +36 -36
  468. package/dist/plugin-sdk/index.js +35 -35
  469. package/dist/plugin-sdk/infra-runtime.js +35 -35
  470. package/dist/plugin-sdk/irc.js +37 -37
  471. package/dist/plugin-sdk/line.js +36 -36
  472. package/dist/plugin-sdk/llm-task.js +35 -35
  473. package/dist/plugin-sdk/lobster.js +4 -4
  474. package/dist/plugin-sdk/matrix.js +37 -37
  475. package/dist/plugin-sdk/mattermost.js +36 -36
  476. package/dist/plugin-sdk/media-runtime.js +35 -35
  477. package/dist/plugin-sdk/media-understanding-runtime.js +35 -35
  478. package/dist/plugin-sdk/media-understanding.js +35 -35
  479. package/dist/plugin-sdk/memory-lancedb.js +4 -4
  480. package/dist/plugin-sdk/minimax-portal-auth.js +4 -4
  481. package/dist/plugin-sdk/msteams.js +38 -38
  482. package/dist/plugin-sdk/nextcloud-talk.js +36 -36
  483. package/dist/plugin-sdk/nostr.js +36 -36
  484. package/dist/plugin-sdk/ollama-setup.js +9 -9
  485. package/dist/plugin-sdk/open-prose.js +4 -4
  486. package/dist/plugin-sdk/phone-control.js +4 -4
  487. package/dist/plugin-sdk/plugin-runtime.js +35 -35
  488. package/dist/plugin-sdk/provider-auth.js +35 -35
  489. package/dist/plugin-sdk/provider-models.js +5 -5
  490. package/dist/plugin-sdk/provider-onboard.js +4 -4
  491. package/dist/plugin-sdk/provider-setup.js +39 -39
  492. package/dist/plugin-sdk/provider-stream.js +4 -4
  493. package/dist/plugin-sdk/provider-usage.js +4 -4
  494. package/dist/plugin-sdk/qwen-portal-auth.js +35 -35
  495. package/dist/plugin-sdk/reply-history.js +35 -35
  496. package/dist/plugin-sdk/reply-runtime.js +35 -35
  497. package/dist/plugin-sdk/routing.js +3 -3
  498. package/dist/plugin-sdk/sandbox.js +35 -35
  499. package/dist/plugin-sdk/security-runtime.js +35 -35
  500. package/dist/plugin-sdk/self-hosted-provider-setup.js +37 -37
  501. package/dist/plugin-sdk/setup.js +35 -35
  502. package/dist/plugin-sdk/signal.js +35 -35
  503. package/dist/plugin-sdk/slack.js +35 -35
  504. package/dist/plugin-sdk/speech-runtime.js +35 -35
  505. package/dist/plugin-sdk/speech.js +35 -35
  506. package/dist/plugin-sdk/src/secrets/secure-file-store.d.ts +26 -0
  507. package/dist/plugin-sdk/src/subscription/provider.d.ts +5 -3
  508. package/dist/plugin-sdk/synology-chat.js +36 -36
  509. package/dist/plugin-sdk/talk-voice.js +4 -4
  510. package/dist/plugin-sdk/telegram.js +35 -35
  511. package/dist/plugin-sdk/text-runtime.js +7 -7
  512. package/dist/plugin-sdk/thread-ownership.js +4 -4
  513. package/dist/plugin-sdk/tlon.js +36 -36
  514. package/dist/plugin-sdk/twitch.js +35 -35
  515. package/dist/plugin-sdk/voice-call.js +35 -35
  516. package/dist/plugin-sdk/whatsapp.js +35 -35
  517. package/dist/plugin-sdk/zalo.js +38 -38
  518. package/dist/plugin-sdk/zalouser.js +38 -38
  519. package/dist/plugins/runtime/index.d.ts +1 -1
  520. package/dist/plugins/runtime/index.js +35 -35
  521. package/dist/plugins-DF5FaTO0.js +111 -0
  522. package/dist/plugins-cli-CvTJemqC.js +917 -0
  523. package/dist/policy-CNXISK_a.js +143 -0
  524. package/dist/preflight-audio.runtime-RP000oxo.js +116 -0
  525. package/dist/probe-BkM5pykD.js +21 -0
  526. package/dist/probe-DKbRTJv5.js +1793 -0
  527. package/dist/probe-DkrfRsjU.js +47 -0
  528. package/dist/probe-DpcJ0WeP.js +129 -0
  529. package/dist/probe-auth-BcNjX8hy.js +40 -0
  530. package/dist/probe-auth-DhuAb8ls.js +48 -0
  531. package/dist/probe-wciBj-aL.js +6329 -0
  532. package/dist/program-C8-p0mW5.js +253 -0
  533. package/dist/prompt-select-styled-DH0pVoc0.js +2673 -0
  534. package/dist/provider-api-key-auth.runtime-CAFeIQ1u.js +121 -0
  535. package/dist/provider-auth-choice-CB_HzdTl.js +126 -0
  536. package/dist/provider-auth-choice-helpers-hzDkh3f1.js +48 -0
  537. package/dist/provider-auth-choice-preference-BHCXvNSE.js +189 -0
  538. package/dist/provider-auth-choice.runtime-Dx4ms2C5.js +123 -0
  539. package/dist/provider-auth-choices-0KaDNPBQ.js +57 -0
  540. package/dist/provider-auth-guidance-BaAUiNr_.js +34 -0
  541. package/dist/provider-auth-result-Bto1bYtS.d.ts +18 -0
  542. package/dist/provider-models-DxOmeToO.d.ts +867 -0
  543. package/dist/provider-models-xnyxy6mO.js +2113 -0
  544. package/dist/provider-ollama-setup-DBYK__ov.d.ts +32 -0
  545. package/dist/provider-ollama-setup-QzgCxj44.js +314 -0
  546. package/dist/provider-onboard-B9ionepI.js +139 -0
  547. package/dist/provider-onboard-CURxJ_UX.d.ts +40 -0
  548. package/dist/provider-runtime.runtime-4xwmsl5L.js +111 -0
  549. package/dist/provider-self-hosted-setup-BHd24EDG.js +182 -0
  550. package/dist/provider-self-hosted-setup-qeY8BYSy.d.ts +61 -0
  551. package/dist/provider-stream-Chz_EFw3.js +512 -0
  552. package/dist/provider-usage-C11Q7UwS.js +111 -0
  553. package/dist/provider-usage-kxemdMp2.js +633 -0
  554. package/dist/provider-wizard-CanJoxNC.js +152 -0
  555. package/dist/push-apns-Dsajnm8C.js +1038 -0
  556. package/dist/pw-ai-DUe4BbH2.js +1867 -0
  557. package/dist/qmd-manager-CAAFp7qK.js +1570 -0
  558. package/dist/qr-cli-Bu2jqTPY.js +113 -0
  559. package/dist/qr-cli-Bu9Z-X48.js +369 -0
  560. package/dist/reactions-Cpfum4iU.js +281 -0
  561. package/dist/read-only-account-inspect.discord.runtime-BK0LaMgC.js +116 -0
  562. package/dist/read-only-account-inspect.slack.runtime-DgKiC5wT.js +116 -0
  563. package/dist/read-only-account-inspect.telegram.runtime-mxfgFVOU.js +116 -0
  564. package/dist/redact-snapshot-DD8A4tdd.js +2663 -0
  565. package/dist/register.agent-DU4FtrU2.js +439 -0
  566. package/dist/register.backup-8nOYtJqg.js +625 -0
  567. package/dist/register.configure-DmtecqIH.js +252 -0
  568. package/dist/register.maintenance-Dir3ulKP.js +574 -0
  569. package/dist/register.message-Cfl-f3Ju.js +709 -0
  570. package/dist/register.onboard-Bv7WVzEi.js +192 -0
  571. package/dist/register.setup-BIyeI8RY.js +212 -0
  572. package/dist/register.status-health-sessions-C69WQcF4.js +498 -0
  573. package/dist/register.subclis-B_4KCgTd.js +315 -0
  574. package/dist/register.subclis-BeXsmgBL.js +13 -0
  575. package/dist/replies-DdcFUmki.js +110 -0
  576. package/dist/resolve-channels-DRZqPV5o.js +226 -0
  577. package/dist/resolve-channels-DxW1kqxA.js +262 -0
  578. package/dist/resolve-route-DdX-HBVt.js +538 -0
  579. package/dist/resolve-users-rgCQvkLs.js +143 -0
  580. package/dist/root-help-QAkoA7GD.js +32 -0
  581. package/dist/routes-CcJNnwTF.js +7097 -0
  582. package/dist/rpc-DDUAlBbH.js +67 -0
  583. package/dist/run-main-D9ci5pn7.js +424 -0
  584. package/dist/runtime-Bitmi8Er.d.ts +26 -0
  585. package/dist/runtime-discord-ops.runtime-T4sf7aRB.js +9078 -0
  586. package/dist/runtime-slack-ops.runtime-BQpP48mC.js +4556 -0
  587. package/dist/runtime-telegram-ops.runtime-cVO5dqOp.js +133 -0
  588. package/dist/runtime-whatsapp-login.runtime-DtNx0dSY.js +114 -0
  589. package/dist/runtime-whatsapp-outbound.runtime-Bw47QbFK.js +117 -0
  590. package/dist/sandbox-cli-DsFwjbjC.js +535 -0
  591. package/dist/search-manager-BRAK8fEe.js +16 -0
  592. package/dist/search-manager-BS5Db0A6.js +386 -0
  593. package/dist/secrets-cli-D3J46TJp.js +2070 -0
  594. package/dist/security-cli-B866M9cB.js +575 -0
  595. package/dist/send-B1pX9_Oc.js +283 -0
  596. package/dist/send-B2RrLg83.js +100 -0
  597. package/dist/send-DFnV__Aq.js +1025 -0
  598. package/dist/send-DZIH6CJt.js +629 -0
  599. package/dist/send-sl9WnKbW.js +631 -0
  600. package/dist/server-node-events-BT6egg20.js +506 -0
  601. package/dist/server-zI_K-D05.js +107 -0
  602. package/dist/sessions-C8kiAcoJ.js +112 -0
  603. package/dist/sessions-DLBpp52_.js +218 -0
  604. package/dist/setup-C7eOzMiC.js +387 -0
  605. package/dist/setup-CFIMq-Pz.d.ts +37 -0
  606. package/dist/setup-binary-CcAv8NXz.js +406 -0
  607. package/dist/setup-browser-C4eRV3h6.js +70 -0
  608. package/dist/setup-core-BnR486P-.js +143 -0
  609. package/dist/setup-core-CIswIiu5.js +166 -0
  610. package/dist/setup-core-CcbcrXXg.js +47 -0
  611. package/dist/setup-core-nZSw5BSv.js +205 -0
  612. package/dist/setup-surface-C5iSpT4M.js +490 -0
  613. package/dist/setup-wizard-helpers-r0J6l8ST.d.ts +203 -0
  614. package/dist/setup.finalize-adiRfo0U.js +522 -0
  615. package/dist/setup.gateway-config-BwFWKDfT.js +343 -0
  616. package/dist/shared-12TimyeF.js +182 -0
  617. package/dist/shared-9EWO34-k.js +298 -0
  618. package/dist/shared-B4vUbaRR.js +75 -0
  619. package/dist/shared-bNWpW3Dd.js +96 -0
  620. package/dist/shared-lU1y5dvS.js +102 -0
  621. package/dist/signal-DBlETRu9.js +114 -0
  622. package/dist/skills-Bio8GwTE.js +20 -0
  623. package/dist/skills-DE_MXFSN.js +853 -0
  624. package/dist/skills-cli-BGuW-tKw.js +292 -0
  625. package/dist/skills-install--rnorIoJ.js +763 -0
  626. package/dist/skills-status-B08PtBc_.js +21 -0
  627. package/dist/skills-status-CzM008aB.js +169 -0
  628. package/dist/slack-C4T53Nc-.js +114 -0
  629. package/dist/slash-commands.runtime-B7fsD8Be.js +128 -0
  630. package/dist/slash-dispatch.runtime-t0PAX4vQ.js +141 -0
  631. package/dist/slash-skill-commands.runtime-DIhPnEfR.js +116 -0
  632. package/dist/src-DrDirlvw.js +1701 -0
  633. package/dist/status-Bld14WSA.js +131 -0
  634. package/dist/status-CgeO4RuH.js +43 -0
  635. package/dist/status-HlvixAOq.js +606 -0
  636. package/dist/status-Rom_Lf3c.js +1599 -0
  637. package/dist/status-TwbMH6Am.js +126 -0
  638. package/dist/status-json-DMW7cmuK.js +288 -0
  639. package/dist/status.link-channel-V4LkB6Gq.js +143 -0
  640. package/dist/status.scan.deps.runtime-BE3X-dcP.js +126 -0
  641. package/dist/status.scan.runtime-BxVY4mty.js +119 -0
  642. package/dist/status.summary-CzLM0vVr.js +592 -0
  643. package/dist/status.summary.runtime-BSBnHZ1Q.js +118 -0
  644. package/dist/status.update-BxblMS7P.js +77 -0
  645. package/dist/subagent-orphan-recovery-BpRPryEj.js +307 -0
  646. package/dist/subagent-registry-runtime-DYYU5p3X.js +111 -0
  647. package/dist/subscription-CpFdxuFS.js +33 -0
  648. package/dist/subscription-DaA1urx-.js +102 -0
  649. package/dist/subscription-cli-Bvto9EmO.js +134 -0
  650. package/dist/synology-chat-3nwk-Nj0.js +297 -0
  651. package/dist/system-cli-BvNps8sl.js +94 -0
  652. package/dist/telegram/audit.d.ts +1 -1
  653. package/dist/telegram/audit.js +1 -1
  654. package/dist/telegram/token.d.ts +1 -1
  655. package/dist/telegram/token.js +35 -35
  656. package/dist/telegram-RtKXoEsF.js +114 -0
  657. package/dist/text-chunking-BD5mQe2R.js +84 -0
  658. package/dist/text-chunking-DDUU_vAF.d.ts +79 -0
  659. package/dist/tlon-z-kYmJE-.js +433 -0
  660. package/dist/tui-cli-CzSK08Rh.js +137 -0
  661. package/dist/tui-wV7R1Tlc.js +3834 -0
  662. package/dist/types-2H_e7eWT.d.ts +45 -0
  663. package/dist/types-ZKnGUchG.d.ts +22692 -0
  664. package/dist/types.base-BFiQZ4J9.d.ts +188 -0
  665. package/dist/ui-BWVHreeR.js +31 -0
  666. package/dist/update-D1Wgh1Tj.js +1036 -0
  667. package/dist/update-cli-CZh99uyY.js +1503 -0
  668. package/dist/update-offset-store-D5xTdUr0.js +112 -0
  669. package/dist/update-runner-GbKfoCHs.js +1496 -0
  670. package/dist/upsert-with-lock-BZU7Le8n.js +33 -0
  671. package/dist/usage-Czgwvg0h.js +115 -0
  672. package/dist/web-CMczmL90.js +112 -0
  673. package/dist/web-shared-B5Q0mIJq.d.ts +45 -0
  674. package/dist/webhook-request-guards-CsKDhZJr.d.ts +76 -0
  675. package/dist/webhook-targets-BSmFtesN.js +181 -0
  676. package/dist/webhook-targets-CjxuEE9C.d.ts +106 -0
  677. package/dist/webhooks-cli-Wl9y6AWW.js +350 -0
  678. package/dist/whatsapp-VzRW8MdR.js +114 -0
  679. package/dist/whatsapp-actions-Cg1Wxv8W.js +167 -0
  680. package/dist/workspace-DJ_S272u.js +484 -0
  681. package/dist/workspace-DbZSqjw0.js +289 -0
  682. package/dist/workspace-cli-D93DLmAh.js +154 -0
  683. package/dist/workspace-dirs-CGeIPpGN.js +2003 -0
  684. package/dist/zalo-CK2dlGmu.d.ts +9 -0
  685. package/dist/zalo-Db7s2boL.js +415 -0
  686. package/dist/zalouser-Jh5YTJX3.js +30911 -0
  687. package/docs/reference/templates/AGENTS.dev.md +83 -0
  688. package/docs/reference/templates/AGENTS.md +219 -0
  689. package/docs/reference/templates/BOOT.md +11 -0
  690. package/docs/reference/templates/BOOTSTRAP.md +62 -0
  691. package/docs/reference/templates/HEARTBEAT.md +12 -0
  692. package/docs/reference/templates/IDENTITY.dev.md +47 -0
  693. package/docs/reference/templates/IDENTITY.md +29 -0
  694. package/docs/reference/templates/SOUL.dev.md +76 -0
  695. package/docs/reference/templates/SOUL.md +43 -0
  696. package/docs/reference/templates/TOOLS.dev.md +24 -0
  697. package/docs/reference/templates/TOOLS.md +47 -0
  698. package/docs/reference/templates/USER.dev.md +18 -0
  699. package/docs/reference/templates/USER.md +23 -0
  700. package/extensions/discord/src/monitor/allow-list.ts +8 -1
  701. package/extensions/discord/src/monitor/message-handler.preflight.ts +4 -1
  702. package/package.json +2 -1
  703. package/dist/accounts-CDr-lDaV.d.ts +0 -103
  704. package/dist/accounts-CS8U4v8C.js +0 -114
  705. package/dist/acp-cli-BGT0jXcC.js +0 -2093
  706. package/dist/actions.runtime-BfckTw6c.js +0 -119
  707. package/dist/actions.runtime-Cl9mBfqH.js +0 -133
  708. package/dist/agent-scope-C-YmLnnb.js +0 -208
  709. package/dist/agents-CydD54p8.js +0 -222
  710. package/dist/agents-DpQsZO6O.js +0 -853
  711. package/dist/agents.config-XU7IsYE-.js +0 -121
  712. package/dist/agents.config-ssoQXuvF.js +0 -17
  713. package/dist/allow-list-Cfn6lmMK.js +0 -81
  714. package/dist/allowlist-CCYXVpM9.js +0 -142
  715. package/dist/api-BoXoFKxy.js +0 -117
  716. package/dist/audit-Bv05N5o9.js +0 -787
  717. package/dist/audit-CIWW1Aqm.js +0 -54
  718. package/dist/audit-channel.collect.runtime-Bi7yrdcO.js +0 -605
  719. package/dist/audit-channel.runtime-C_NDweiW.js +0 -121
  720. package/dist/audit-extra.async-Dp7OKSXg.js +0 -813
  721. package/dist/audit-membership-runtime-B8FQ6VtN.js +0 -162
  722. package/dist/audit.deep.runtime-CXhobL6b.js +0 -25
  723. package/dist/audit.nondeep.runtime-CrEm3T16.js +0 -832
  724. package/dist/audit.runtime-CJPKj1Zg.js +0 -118
  725. package/dist/auth-Byfp0flq.js +0 -101
  726. package/dist/auth-choice-BgOjdeXN.js +0 -507
  727. package/dist/auth-choice-CD1Heq0M.js +0 -122
  728. package/dist/auth-choice-ePNfg0iQ.js +0 -268
  729. package/dist/auth-choice-options-BlewQWI0.js +0 -123
  730. package/dist/auth-choice-prompt-BP2b6aXz.js +0 -36
  731. package/dist/auth-choice-prompt-Cmwl4n97.js +0 -115
  732. package/dist/auth-choice.apply-helpers-Dq-nxuuX.js +0 -66
  733. package/dist/auth-choice.plugin-providers.runtime-B23kOUzQ.js +0 -119
  734. package/dist/auth-profiles-1kPLbBwI.js +0 -127823
  735. package/dist/auth-profiles.runtime-DAfSjku1.js +0 -116
  736. package/dist/banner-DeOsobLO.js +0 -342
  737. package/dist/bluebubbles-BsLGedBM.js +0 -64
  738. package/dist/bluebubbles-CnT9wiS4.d.ts +0 -6
  739. package/dist/bot-CuzVYwa_.d.ts +0 -478
  740. package/dist/brave-BoWimrLe.js +0 -24
  741. package/dist/browser-cli-D_S3wEYE.js +0 -1494
  742. package/dist/call-ByEzDJ1_.js +0 -640
  743. package/dist/call-CHCWVg-O.js +0 -39
  744. package/dist/channel-3VC0oOMu.js +0 -214
  745. package/dist/channel-B9fCBPiS.js +0 -207
  746. package/dist/channel-B9q775cM.js +0 -562
  747. package/dist/channel-BG3UK54j.js +0 -803
  748. package/dist/channel-BRQAdMML.js +0 -352
  749. package/dist/channel-BmlLp933.js +0 -1321
  750. package/dist/channel-By6KvdTG.js +0 -920
  751. package/dist/channel-C8rRsdf6.js +0 -226
  752. package/dist/channel-CLEDBbXE.js +0 -943
  753. package/dist/channel-CMvBAG7o.js +0 -306
  754. package/dist/channel-CmlxxjHY.js +0 -1598
  755. package/dist/channel-CqG6_xN0.js +0 -949
  756. package/dist/channel-DNueHKs92.js +0 -316
  757. package/dist/channel-DUtyN7BX.js +0 -4681
  758. package/dist/channel-DWD6GrfZ.js +0 -538
  759. package/dist/channel-DaRYMYzj.js +0 -619
  760. package/dist/channel-Dj6BgLp8.js +0 -575
  761. package/dist/channel-account-context-Ba3u5D21.js +0 -103
  762. package/dist/channel-crabk6Em.js +0 -542
  763. package/dist/channel-i8uqQaK2.js +0 -497
  764. package/dist/channel-options-xljvwHS2.js +0 -50
  765. package/dist/channel-plugin-ids-DAgknSG4.js +0 -26
  766. package/dist/channel-summary-dHTMCG75.js +0 -111
  767. package/dist/channel-xVWQ96Ni.js +0 -397
  768. package/dist/channel.runtime-B6PoZ4BV.js +0 -182
  769. package/dist/channel.runtime-BPZmo57e.js +0 -404
  770. package/dist/channel.runtime-B_1uGR-U.js +0 -199
  771. package/dist/channel.runtime-BiXnPU0d.js +0 -218
  772. package/dist/channel.runtime-BpvDc9sv.js +0 -870
  773. package/dist/channel.runtime-CUua3W80.js +0 -418
  774. package/dist/channel.runtime-CaCBTd0A.js +0 -179
  775. package/dist/channel.runtime-D0FfYvUj.js +0 -4011
  776. package/dist/channel.runtime-DhoJtpvJ.js +0 -241
  777. package/dist/channel.runtime-Kj9EXNE0.js +0 -127
  778. package/dist/channel.runtime-r4tPuPyh.js +0 -171
  779. package/dist/channel.setup-B7d_grfe.js +0 -6
  780. package/dist/channel.setup-C0vu1fhi.js +0 -9
  781. package/dist/channel.setup-CAI0FNHj.js +0 -11
  782. package/dist/channel.setup-CkDVwv5R.js +0 -57
  783. package/dist/channel.setup-Cpd00YqQ.js +0 -8
  784. package/dist/channel.setup-DbBz1-WT.js +0 -9
  785. package/dist/channel.setup-GZnAvD9g.js +0 -8
  786. package/dist/channels-5H484RSw.js +0 -1118
  787. package/dist/channels-BnPudfyx.js +0 -404
  788. package/dist/channels-cli-WIC-QeH_.js +0 -291
  789. package/dist/channels-status-issues-RDmzovJU.js +0 -16
  790. package/dist/clawbot-cli-BgutNwf8.js +0 -118
  791. package/dist/cleanup-utils-DBl1Aij1.js +0 -96
  792. package/dist/cli-1P7u6zqu.js +0 -154
  793. package/dist/command-registry-B8jovrws.js +0 -232
  794. package/dist/command-registry-DtDl1FVm.js +0 -14
  795. package/dist/command-secret-gateway-BgUo3FxJ.js +0 -111
  796. package/dist/compact.runtime-CXbXM0AU.js +0 -116
  797. package/dist/completion-cli-Cik_owAE.js +0 -17
  798. package/dist/completion-cli-RU3P2RSl.js +0 -445
  799. package/dist/config-5HUpB1L1.js +0 -31
  800. package/dist/config-cli-QHaUHoZI.js +0 -433
  801. package/dist/config-guard-C9Sn3pE-.js +0 -118
  802. package/dist/config-sW57gztj.js +0 -44
  803. package/dist/config-validation-5LkjIKNt.js +0 -262
  804. package/dist/config-value-CtTWALxG.js +0 -132
  805. package/dist/configure-BmR2TPLf.js +0 -243
  806. package/dist/configure-DaLN-5xM.js +0 -1100
  807. package/dist/control-ui-assets-CH3MYmAo.js +0 -232
  808. package/dist/control-ui-shared-CA77PTml.js +0 -29
  809. package/dist/core-CvDzLs7B.js +0 -150
  810. package/dist/core-jm751KJ9.d.ts +0 -87
  811. package/dist/cron-cli-tguLpzyq.js +0 -639
  812. package/dist/daemon-cli-ptosOkL8.js +0 -339
  813. package/dist/daemon-install-DzU4EnVa.js +0 -180
  814. package/dist/deliver-DwxFoHM3.js +0 -111
  815. package/dist/deliver-runtime-DOdDyaPI.js +0 -111
  816. package/dist/device-id-cli-GopvlxxZ.js +0 -52
  817. package/dist/device-identity-CRfhC3_s.js +0 -365
  818. package/dist/devices-cli-ain7ESqU.js +0 -342
  819. package/dist/diagnostic-D96Xaqrj.js +0 -310
  820. package/dist/directory-cli-fh1UxGgY.js +0 -311
  821. package/dist/directory-config-helpers-Coivm0Mt.d.ts +0 -38
  822. package/dist/directory.static-CKjJUNGl.js +0 -44
  823. package/dist/discord-CflhwDEM.js +0 -114
  824. package/dist/discovery-x0ZqY4AB.js +0 -48
  825. package/dist/dm-policy-shared-DKzsSLlO.d.ts +0 -95
  826. package/dist/dns-cli-DCHyKjGf.js +0 -217
  827. package/dist/docs-cli-D3OoqYSP.js +0 -174
  828. package/dist/doctor-completion-Bq2eP87s.js +0 -90
  829. package/dist/doctor-config-flow-D8XRG9Ku.js +0 -2437
  830. package/dist/doctor-config-flow-DGiF1HGc.js +0 -112
  831. package/dist/enable-0QSF4YGH.js +0 -24
  832. package/dist/exec-approvals-cli-Bncym0Gd.js +0 -421
  833. package/dist/feishu-C1dM8pl2.d.ts +0 -36
  834. package/dist/gateway-cli-DYscsmA-.js +0 -26437
  835. package/dist/gateway-install-token-CNv17ac9.js +0 -163
  836. package/dist/gateway-rpc-BGC1Rxvg.js +0 -26
  837. package/dist/gateway-runtime-D89mSQPB.js +0 -69
  838. package/dist/git-commit-CeLH5Ozm.js +0 -2
  839. package/dist/git-commit-DUKRiCP-.js +0 -177
  840. package/dist/googlechat-BgXeXjd1.js +0 -307
  841. package/dist/googlechat-CNZQb1jd.d.ts +0 -12
  842. package/dist/group-access-Deh1tVNr.d.ts +0 -61
  843. package/dist/health-BEjzWwaB.js +0 -570
  844. package/dist/health-FjqrWQL6.js +0 -113
  845. package/dist/heartbeat-summary-CfdSA9M1.js +0 -57
  846. package/dist/help-BZeVprq1.js +0 -81
  847. package/dist/hooks-06OUQvAV.d.ts +0 -6
  848. package/dist/hooks-cli-B7uGJs2O.js +0 -1000
  849. package/dist/hooks-status-CfceaUSg.js +0 -78
  850. package/dist/http-registry-DYskWhOr.d.ts +0 -20
  851. package/dist/identity-file-sshkKKIr.js +0 -60
  852. package/dist/image-generation-D4o3j8o6.d.ts +0 -9
  853. package/dist/imessage-BcV3WGx_.js +0 -31
  854. package/dist/imessage-Dhje7Ty-.js +0 -115
  855. package/dist/inbound-reply-dispatch-C73_7SOl.js +0 -71
  856. package/dist/inbound-reply-dispatch-D6_HNqH8.d.ts +0 -72
  857. package/dist/install-target-D7NRhfzc.js +0 -574
  858. package/dist/installs-Bj6jblqc.js +0 -532
  859. package/dist/io-CMfWWPXQ.js +0 -9738
  860. package/dist/io-CV844hAM.js +0 -29
  861. package/dist/irc-DKi1fDYI.js +0 -672
  862. package/dist/library-rygTG3oA.js +0 -112
  863. package/dist/lifecycle-core-BPlvShWY.js +0 -382
  864. package/dist/line-B8gTtl3Y.d.ts +0 -75
  865. package/dist/line-CGsemKWJ.js +0 -530
  866. package/dist/llm-slug-generator-DlhVyMqT.js +0 -67
  867. package/dist/logging-5wu9k6w4.js +0 -30
  868. package/dist/logging-CxP9suT8.js +0 -13
  869. package/dist/login-qr-BcDsiwHs.js +0 -233
  870. package/dist/login-qr-Y8pJ5yV4.js +0 -112
  871. package/dist/logs-cli-XI9oVXpH.js +0 -256
  872. package/dist/manager-runtime-DkIlXBhD.js +0 -111
  873. package/dist/manager.runtime-Q0q2rJCC.js +0 -715
  874. package/dist/manifest-registry-DAd0SRAP.js +0 -1329
  875. package/dist/matrix-BI0DBBrG.js +0 -1495
  876. package/dist/matrix-D2JoHzb4.d.ts +0 -68
  877. package/dist/matrix-DiABGjJR.js +0 -1269
  878. package/dist/mcp-cli-BOyn_DLL.js +0 -87
  879. package/dist/media-understanding.runtime-DjUa7Dka.js +0 -116
  880. package/dist/memory-cli-CJd_vl-Y.js +0 -111
  881. package/dist/memory-search-CEEItIFR.js +0 -17
  882. package/dist/memory-search-Cv1SBrn7.js +0 -204
  883. package/dist/method-scopes-CQE7-bZ-.js +0 -2452
  884. package/dist/model-auth-markers-BFoM4IPf.d.ts +0 -20
  885. package/dist/model-picker-D6_89XHg.js +0 -112
  886. package/dist/model-picker-Svaw-APs.js +0 -390
  887. package/dist/model-picker.runtime-Chi9nV7A.js +0 -125
  888. package/dist/model-selection-hL8i1Jbs.js +0 -653
  889. package/dist/model-suppression.runtime-DjWJZ0X-.js +0 -116
  890. package/dist/models-7qj1dG_W.js +0 -118
  891. package/dist/models-BPOB_xJF.js +0 -2514
  892. package/dist/models-cli-DdlOVUjS.js +0 -309
  893. package/dist/models-config-CBqUS-jX.js +0 -111
  894. package/dist/models-config.providers.discovery-Dc905FWG.d.ts +0 -18
  895. package/dist/moldclaw-root-D6PbhbZk.js +0 -88
  896. package/dist/monitor-BPYhkEqF.js +0 -782
  897. package/dist/monitor-BuTcQ24j.js +0 -3468
  898. package/dist/monitor-CuXvNhFh.js +0 -113
  899. package/dist/monitor-D-TqSIHF.js +0 -6823
  900. package/dist/monitor-DRSgo9u2.js +0 -3076
  901. package/dist/monitor-DcHch39z.js +0 -772
  902. package/dist/monitor-DsHBMrXp.js +0 -115
  903. package/dist/monitor-shared-CL8T4gt1.js +0 -444
  904. package/dist/msteams-7FMwTvQG.js +0 -852
  905. package/dist/node-cli-BCjaSCZM.js +0 -2503
  906. package/dist/node-resolve-D5Hvcgyx.js +0 -835
  907. package/dist/nodes-cli-Dd_SNbkt.js +0 -1380
  908. package/dist/nostr-DBTFTxKs.js +0 -8744
  909. package/dist/nostr-DLqaIuZx.d.ts +0 -7
  910. package/dist/npm-resolution-CYfb3MHG.js +0 -60
  911. package/dist/oauth-env-zPt5RywA.js +0 -10
  912. package/dist/onboard-BEFQQeig.js +0 -25
  913. package/dist/onboard-CJHNyxJh.js +0 -48
  914. package/dist/onboard-D_3UeLEN.js +0 -589
  915. package/dist/onboard-channels-B_JL0Djc.js +0 -1241
  916. package/dist/onboard-channels-CqZzHt2C.js +0 -205
  917. package/dist/onboard-custom-CER3Ggbq.js +0 -571
  918. package/dist/onboard-custom-bNRdGECb.js +0 -114
  919. package/dist/onboard-helpers-BK0Hsb7Y.js +0 -335
  920. package/dist/onboard-helpers-CXZ5RPoR.js +0 -113
  921. package/dist/onboard-hooks-1NsxEDjH.js +0 -72
  922. package/dist/onboard-remote-DuKhC_7W.js +0 -117
  923. package/dist/onboard-remote-OwRcDuB3.js +0 -181
  924. package/dist/onboard-search-Cy8dOq2W.js +0 -302
  925. package/dist/onboard-skills-D5phRa6r.js +0 -117
  926. package/dist/onboard-skills-c9qWCNe9.js +0 -133
  927. package/dist/outbound-media-CXKqTh2X.d.ts +0 -11
  928. package/dist/outbound-media-DYRO2vTD.js +0 -11
  929. package/dist/pairing-access-BwJu1mkk.d.ts +0 -21
  930. package/dist/pairing-cli-BOnv0TYn.js +0 -217
  931. package/dist/perplexity-EZwC3y2b.js +0 -24
  932. package/dist/persistent-dedupe-hNES5tS1.d.ts +0 -26
  933. package/dist/pi-model-discovery-runtime-BToY3A6K.js +0 -111
  934. package/dist/pi-tools.before-tool-call.runtime-D_acPtld.js +0 -381
  935. package/dist/plugin-install-CgJpSjYd.js +0 -184
  936. package/dist/plugin-install-Cl1A4EF6.js +0 -117
  937. package/dist/plugin-install-plan-Dc2Z4DeU.js +0 -49
  938. package/dist/plugin-registry-B1UaWrQD.js +0 -49
  939. package/dist/plugin-registry-Cy8biwnn.js +0 -113
  940. package/dist/plugins-CXwvg50F.js +0 -111
  941. package/dist/plugins-cli-Uvzp2aYV.js +0 -917
  942. package/dist/policy-DsMBbEe7.js +0 -143
  943. package/dist/preflight-audio.runtime-hWsZIYvc.js +0 -116
  944. package/dist/probe-CNsSf1Uf.js +0 -6329
  945. package/dist/probe-CqOIrPhb.js +0 -47
  946. package/dist/probe-DH6gDw-h.js +0 -129
  947. package/dist/probe-DM16PLf4.js +0 -21
  948. package/dist/probe-DvAEEWYr.js +0 -1793
  949. package/dist/probe-auth-COfgCble.js +0 -48
  950. package/dist/probe-auth-I_5TX1Eh.js +0 -40
  951. package/dist/program-Dz80sgTU.js +0 -253
  952. package/dist/prompt-select-styled-wQehwFxK.js +0 -2673
  953. package/dist/provider-api-key-auth.runtime-BR9GU4ya.js +0 -121
  954. package/dist/provider-auth-choice-CdhA84kr.js +0 -126
  955. package/dist/provider-auth-choice-helpers-kabp_0zA.js +0 -48
  956. package/dist/provider-auth-choice-preference-se3zAM_2.js +0 -189
  957. package/dist/provider-auth-choice.runtime-BMc8-xNQ.js +0 -123
  958. package/dist/provider-auth-choices-CYsCViGi.js +0 -57
  959. package/dist/provider-auth-guidance-CMjUWlNf.js +0 -34
  960. package/dist/provider-auth-result-5xgWoVGi.d.ts +0 -18
  961. package/dist/provider-models-BCId_Lfu.js +0 -2113
  962. package/dist/provider-models-D-eFl9oH.d.ts +0 -867
  963. package/dist/provider-ollama-setup-B6XJZ0So.js +0 -314
  964. package/dist/provider-ollama-setup-BF1vhob8.d.ts +0 -32
  965. package/dist/provider-onboard-BjXHP3IZ.d.ts +0 -40
  966. package/dist/provider-onboard-Ca0TaNud.js +0 -139
  967. package/dist/provider-runtime.runtime-DwwkHw_7.js +0 -111
  968. package/dist/provider-self-hosted-setup-BEKLVGpj.js +0 -182
  969. package/dist/provider-self-hosted-setup-BQ5BIlpi.d.ts +0 -61
  970. package/dist/provider-stream-DrUD69ai.js +0 -512
  971. package/dist/provider-usage-BgKHCnjr.js +0 -111
  972. package/dist/provider-usage-D8EZpFz9.js +0 -633
  973. package/dist/provider-wizard-DMdb-zj_.js +0 -152
  974. package/dist/push-apns-BPH6d4VV.js +0 -1038
  975. package/dist/pw-ai-DttfldtL.js +0 -1867
  976. package/dist/qmd-manager-CybcDUfk.js +0 -1570
  977. package/dist/qr-cli-8NcmJ8Ft.js +0 -369
  978. package/dist/qr-cli-DWe0Our3.js +0 -113
  979. package/dist/reactions-D6N0LR16.js +0 -281
  980. package/dist/read-only-account-inspect.discord.runtime-CqUWTRfl.js +0 -116
  981. package/dist/read-only-account-inspect.slack.runtime-9-jpln3q.js +0 -116
  982. package/dist/read-only-account-inspect.telegram.runtime-EKPI1D7n.js +0 -116
  983. package/dist/redact-snapshot-DwJEIVk9.js +0 -2663
  984. package/dist/register.agent-D3YdDirP.js +0 -439
  985. package/dist/register.backup-dR27qCuo.js +0 -625
  986. package/dist/register.configure-BjFhkkka.js +0 -252
  987. package/dist/register.maintenance-DiMQJIOa.js +0 -574
  988. package/dist/register.message-CdZsKYH1.js +0 -709
  989. package/dist/register.onboard-B0rV1eaO.js +0 -192
  990. package/dist/register.setup-wKMvohzo.js +0 -212
  991. package/dist/register.status-health-sessions-BJ68m6pt.js +0 -498
  992. package/dist/register.subclis-CnnrWt2a.js +0 -315
  993. package/dist/register.subclis-lSvTkC6z.js +0 -13
  994. package/dist/replies-BABt9b48.js +0 -110
  995. package/dist/resolve-channels-BqZFl2Ux.js +0 -262
  996. package/dist/resolve-channels-DjQLXb7B.js +0 -226
  997. package/dist/resolve-route-CSHDsa_m.js +0 -538
  998. package/dist/resolve-users-BG6HaSR5.js +0 -143
  999. package/dist/root-help-ohmaCyC_.js +0 -32
  1000. package/dist/routes-4k2kpvoT.js +0 -7097
  1001. package/dist/rpc-Cnwn4Q6L.js +0 -67
  1002. package/dist/run-main-VYlacKA0.js +0 -424
  1003. package/dist/runtime-Cy8pqYUB.d.ts +0 -26
  1004. package/dist/runtime-discord-ops.runtime-DafrU-rI.js +0 -9078
  1005. package/dist/runtime-slack-ops.runtime-CdXBKXwd.js +0 -4556
  1006. package/dist/runtime-telegram-ops.runtime-B12sF7gE.js +0 -133
  1007. package/dist/runtime-whatsapp-login.runtime-CqEudH37.js +0 -114
  1008. package/dist/runtime-whatsapp-outbound.runtime-D5m2qyn-.js +0 -117
  1009. package/dist/sandbox-cli-CHJiEWXB.js +0 -535
  1010. package/dist/search-manager-BtNC3-i_.js +0 -16
  1011. package/dist/search-manager-C7J7B3_a.js +0 -386
  1012. package/dist/secrets-cli-C6yIWBbN.js +0 -2070
  1013. package/dist/security-cli-BVu9BkjD.js +0 -575
  1014. package/dist/send-BSreC7rr.js +0 -631
  1015. package/dist/send-BsLHQG_B.js +0 -1025
  1016. package/dist/send-BuNhp8PH.js +0 -283
  1017. package/dist/send-DOCswVar.js +0 -100
  1018. package/dist/send-Dl0LLErk.js +0 -629
  1019. package/dist/server-node-events-Bq2067EG.js +0 -506
  1020. package/dist/server-y38L7N5H.js +0 -107
  1021. package/dist/sessions-BV8gXURR.js +0 -112
  1022. package/dist/sessions-dl1Kc-Ci.js +0 -218
  1023. package/dist/setup-DGszQH0_.js +0 -387
  1024. package/dist/setup-DR5rRw9y.d.ts +0 -37
  1025. package/dist/setup-binary-C17YnmA8.js +0 -406
  1026. package/dist/setup-browser-CPx-nEsr.js +0 -70
  1027. package/dist/setup-core-BByHN1ME.js +0 -143
  1028. package/dist/setup-core-C0KPlBmL.js +0 -47
  1029. package/dist/setup-core-Cq37G6of.js +0 -166
  1030. package/dist/setup-core-uO84_Y75.js +0 -205
  1031. package/dist/setup-surface-BEMi7Rmb.js +0 -490
  1032. package/dist/setup-wizard-helpers-BtuGx_gN.d.ts +0 -203
  1033. package/dist/setup.finalize-BzPBa8zW.js +0 -522
  1034. package/dist/setup.gateway-config-DdwkF-8e.js +0 -343
  1035. package/dist/shared-BCw4SKjB.js +0 -96
  1036. package/dist/shared-CjNzsULP.js +0 -75
  1037. package/dist/shared-Cu1BE7ZE.js +0 -298
  1038. package/dist/shared-DSClmyUn.js +0 -182
  1039. package/dist/shared-DyJdGH6y.js +0 -102
  1040. package/dist/signal-Dyv4NZsB.js +0 -114
  1041. package/dist/skills-CbB5b27M.js +0 -853
  1042. package/dist/skills-CnfI7Szw.js +0 -20
  1043. package/dist/skills-cli-CavB1f_3.js +0 -292
  1044. package/dist/skills-install-B1OBdgd0.js +0 -763
  1045. package/dist/skills-status-B3gAmIbW.js +0 -169
  1046. package/dist/skills-status-DrHhFgU9.js +0 -21
  1047. package/dist/slack-BRzqnoAz.js +0 -114
  1048. package/dist/slash-commands.runtime-BK88kgds.js +0 -128
  1049. package/dist/slash-dispatch.runtime-COGywwJE.js +0 -141
  1050. package/dist/slash-skill-commands.runtime-Ti4brxgh.js +0 -116
  1051. package/dist/src-DUR6OQxI.js +0 -1701
  1052. package/dist/status-C6dgQY9a.js +0 -131
  1053. package/dist/status-CNK0Q7QH.js +0 -606
  1054. package/dist/status-DBcX0DSC.js +0 -43
  1055. package/dist/status-DKgFgbwv.js +0 -1599
  1056. package/dist/status-Wn5lhNAc.js +0 -126
  1057. package/dist/status-json-D2EkWqAl.js +0 -288
  1058. package/dist/status.link-channel-D3ULIdEa.js +0 -143
  1059. package/dist/status.scan.deps.runtime-BsjWTAm4.js +0 -126
  1060. package/dist/status.scan.runtime-D4HbzROD.js +0 -119
  1061. package/dist/status.summary-C3YxPrDK.js +0 -592
  1062. package/dist/status.summary.runtime-DAkXPSaK.js +0 -118
  1063. package/dist/status.update-B4NnN9P1.js +0 -77
  1064. package/dist/subagent-orphan-recovery-QiQEBv36.js +0 -307
  1065. package/dist/subagent-registry-runtime-BJatPQFK.js +0 -111
  1066. package/dist/subscription-BhZORXN9.js +0 -100
  1067. package/dist/subscription-QEUjQRMv.js +0 -33
  1068. package/dist/subscription-cli-HrULlAgc.js +0 -134
  1069. package/dist/synology-chat-DB76GWMN.js +0 -297
  1070. package/dist/system-cli-D8jDwWuL.js +0 -94
  1071. package/dist/telegram-BHiiqKkQ.js +0 -114
  1072. package/dist/text-chunking-Baonm9Lu.js +0 -84
  1073. package/dist/text-chunking-Y3dPBOuZ.d.ts +0 -79
  1074. package/dist/tlon-DLESxNgD.js +0 -433
  1075. package/dist/tui-C75zi2Cl.js +0 -3834
  1076. package/dist/tui-cli-DFwx5e6i.js +0 -137
  1077. package/dist/types-BBJ3Qz7j.d.ts +0 -45
  1078. package/dist/types-Ckufs_BY.d.ts +0 -22692
  1079. package/dist/types.base-Cw0-zIvE.d.ts +0 -188
  1080. package/dist/ui-B55NOIB6.js +0 -31
  1081. package/dist/update--ojavYQ4.js +0 -1036
  1082. package/dist/update-cli-Cvj5aWYM.js +0 -1503
  1083. package/dist/update-offset-store-upatuWwX.js +0 -112
  1084. package/dist/update-runner-DHkY_-76.js +0 -1496
  1085. package/dist/upsert-with-lock-C171GLaR.js +0 -33
  1086. package/dist/usage-N3bxnbmt.js +0 -115
  1087. package/dist/web-RdvT7gKa.js +0 -112
  1088. package/dist/web-shared-HSGD3yGt.d.ts +0 -45
  1089. package/dist/webhook-request-guards-CosLyl01.d.ts +0 -76
  1090. package/dist/webhook-targets-Bfnag-du.js +0 -181
  1091. package/dist/webhook-targets-Di17rt8e.d.ts +0 -106
  1092. package/dist/webhooks-cli-ZpnXrq7G.js +0 -350
  1093. package/dist/whatsapp-DNTAyZHt.js +0 -114
  1094. package/dist/whatsapp-actions-o1zKQzKZ.js +0 -167
  1095. package/dist/workspace-CpWi5wPr.js +0 -479
  1096. package/dist/workspace-Ii7aRS7c.js +0 -289
  1097. package/dist/workspace-dirs-x10McA9t.js +0 -2003
  1098. package/dist/zalo-BN3VCrRY.d.ts +0 -9
  1099. package/dist/zalo-zm_bYCKg.js +0 -415
  1100. package/dist/zalouser-CvVEUvc5.js +0 -30911
  1101. /package/dist/{account-id-B3YSn4hl.d.ts → account-id-B8ce6G_4.d.ts} +0 -0
  1102. /package/dist/{acpx-CnNv70m2.d.ts → acpx-Ci50I9T2.d.ts} +0 -0
  1103. /package/dist/{agent-media-payload-DE2pEcsz.d.ts → agent-media-payload-en-gS5p6.d.ts} +0 -0
  1104. /package/dist/{allow-from-DPpHnT2A.d.ts → allow-from-cMeQ47Ot.d.ts} +0 -0
  1105. /package/dist/{allowlist-resolution-CLFiZ6nE.d.ts → allowlist-resolution-DoAWbfXV.d.ts} +0 -0
  1106. /package/dist/{bluebubbles-Duhu-Jer.d.ts → bluebubbles-C6yYmUl0.d.ts} +0 -0
  1107. /package/dist/{boolean-param-BhFjB3gp.d.ts → boolean-param-CdO2TFTk.d.ts} +0 -0
  1108. /package/dist/{channel-config-schema-DnnVMdjR.d.ts → channel-config-schema-Chp38wel.d.ts} +0 -0
  1109. /package/dist/{channel-policy-Baq-Z06b.d.ts → channel-policy-g2h6AbYQ.d.ts} +0 -0
  1110. /package/dist/{chat-type-DpiBgwuG.d.ts → chat-type-BLt59pPT.d.ts} +0 -0
  1111. /package/dist/{command-format-vi4xq8e8.d.ts → command-format-BDJC05Jp.d.ts} +0 -0
  1112. /package/dist/{diffs-DK7fVSDo.d.ts → diffs-D_iNKCyn.d.ts} +0 -0
  1113. /package/dist/{directory-runtime-BTLPaysA.d.ts → directory-runtime-DhMex6HY.d.ts} +0 -0
  1114. /package/dist/{exec-C01wtBHu.d.ts → exec-pjfUY4KM.d.ts} +0 -0
  1115. /package/dist/{gaxios-fetch-compat-wZ38b3w3.js → gaxios-fetch-compat-B_vtINdV.js} +0 -0
  1116. /package/dist/{history-CwXuP2TW.d.ts → history-aqSS5VGQ.d.ts} +0 -0
  1117. /package/dist/{inbound-envelope-SggrBs9m.d.ts → inbound-envelope-C5hWuZod.d.ts} +0 -0
  1118. /package/dist/{index-apAZHsDo.d.ts → index-DXVQFYGX.d.ts} +0 -0
  1119. /package/dist/{json-store-r75IZGk9.d.ts → json-store-UnqQ5aV3.d.ts} +0 -0
  1120. /package/dist/{keyed-async-queue-DHIr7yNe.d.ts → keyed-async-queue-guucpLw3.d.ts} +0 -0
  1121. /package/dist/{links-HeQ3r_L0.d.ts → links-Bar0meEK.d.ts} +0 -0
  1122. /package/dist/{markdown-to-line-CDb4Jy3V.d.ts → markdown-to-line-D8uH_KOj.d.ts} +0 -0
  1123. /package/dist/{mattermost-DtCsxpgg.d.ts → mattermost-xl7jAFJL.d.ts} +0 -0
  1124. /package/dist/{net-BATPDwdQ.d.ts → net-rGOKGds6.d.ts} +0 -0
  1125. /package/dist/{nextcloud-talk-Bb2wHOwp.d.ts → nextcloud-talk-De2CZ9dV.d.ts} +0 -0
  1126. /package/dist/{oauth-utils-u567CLT0.d.ts → oauth-utils-DzN1AlEH.d.ts} +0 -0
  1127. /package/dist/{parse-finite-number-l3tNlrZh.d.ts → parse-finite-number-odgyqhi0.d.ts} +0 -0
  1128. /package/dist/{provider-usage.types-C6061OVN.d.ts → provider-usage.types-EDE9o-H_.d.ts} +0 -0
  1129. /package/dist/{reply-history-BDsFnZFl.d.ts → reply-history-CVuU31xe.d.ts} +0 -0
  1130. /package/dist/{reply-payload-CCvM4W9u.d.ts → reply-payload-CHkpBYwL.d.ts} +0 -0
  1131. /package/dist/{request-url-C54l4-xC.d.ts → request-url-DHisbiHY.d.ts} +0 -0
  1132. /package/dist/{run-command-D3RqWcHu.d.ts → run-command-y0Cndsb1.d.ts} +0 -0
  1133. /package/dist/{secret-input-schema-BLBt-NAP.d.ts → secret-input-schema-b1vpYDQN.d.ts} +0 -0
  1134. /package/dist/{session-key-BQ2-bR-9.d.ts → session-key-DTHQl57f.d.ts} +0 -0
  1135. /package/dist/{ssh-config-C4mcH9Ly.js → ssh-config-hEHBfU2_.js} +0 -0
  1136. /package/dist/{testing-DLkhGsoz.d.ts → testing-DszuZXgK.d.ts} +0 -0
  1137. /package/dist/{thinking-DRkjX18p.d.ts → thinking-IwXTGSeT.d.ts} +0 -0
  1138. /package/dist/{tool-send-CMMD1uDu.d.ts → tool-send-DWHRmKpz.d.ts} +0 -0
  1139. /package/dist/{vllm-defaults-CcGuf4hL.d.ts → vllm-defaults-CrxZgE6-.d.ts} +0 -0
  1140. /package/dist/{wait-Daog8bxM.d.ts → wait-wDWw_MTI.d.ts} +0 -0
  1141. /package/dist/{webhook-memory-guards-C5MrExwT.d.ts → webhook-memory-guards-DreORuJy.d.ts} +0 -0
  1142. /package/dist/{windows-spawn-j2l-dqu8.d.ts → windows-spawn-BIzH92x2.d.ts} +0 -0
  1143. /package/dist/{zod-schema.agent-runtime-krMrBnIn.d.ts → zod-schema.agent-runtime-CP2rmis3.d.ts} +0 -0
  1144. /package/dist/{zod-schema.core-BNDieZDZ.d.ts → zod-schema.core-Foi1tYwi.d.ts} +0 -0
@@ -0,0 +1,1598 @@
1
+ import { t as formatDocsLink } from "./links-BcahUP5U.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-smABVXzp.js";
3
+ import { n as normalizeAccountId, t as DEFAULT_ACCOUNT_ID } from "./account-id-BuyZMNja.js";
4
+ import { X as ToolPolicySchema } from "./io-BaBxjB1v.js";
5
+ import { a as hasConfiguredSecretInput, c as normalizeResolvedSecretInputString } from "./types.secrets-Ca-9L8vU.js";
6
+ import { F as requireOpenAllowFrom, a as DmPolicySchema, c as GroupPolicySchema, m as MarkdownConfigSchema, y as ReplyRuntimeConfigSchemaShape } from "./zod-schema.core-DvwgNmpd.js";
7
+ import { J as fetchWithSsrFGuard } from "./provider-web-search-CcUC9ktE.js";
8
+ import { c as resolveAllowlistProviderRuntimeGroupPolicy, f as warnMissingProviderGroupPolicyFallbackOnce, l as resolveDefaultGroupPolicy, n as evaluateMatchedGroupAccessForPolicy, o as GROUP_POLICY_BLOCKED_LABEL } from "./group-access-UAqUyJod.js";
9
+ import { r as buildChannelConfigSchema } from "./config-schema-BNU4GQh_.js";
10
+ import { i as tryReadSecretFileSync } from "./secret-file-p1IhQzwJ.js";
11
+ import { t as formatAllowFromLowercase } from "./allow-from-Brz0jyla.js";
12
+ import { t as createPluginRuntimeStore } from "./runtime-store-DTqHvPYo.js";
13
+ import { t as createAccountStatusSink } from "./channel-lifecycle-DA5pCpey.js";
14
+ import { i as resolveOutboundMediaUrls, n as formatTextWithAttachmentLinks } from "./reply-payload-BD0_s60z.js";
15
+ import { t as dispatchInboundReplyWithBase } from "./inbound-reply-dispatch-B53GAGWq.js";
16
+ import { n as runStoppablePassiveMonitor, t as resolveLoggerBackedRuntime } from "./runtime-CS-itw_w.js";
17
+ import { t as requireChannelOpenAllowFrom } from "./config-schema-helpers-D4ZGZ7dA.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 };