@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,1570 @@
1
+ import "./redact-fatrROh9.js";
2
+ import "./logger-BFfIIIKH.js";
3
+ import { _ as resolveStateDir } from "./paths-D6AgsMTU.js";
4
+ import "./tmp-moldclaw-dir-DWF-d8qD.js";
5
+ import "./theme-BSXzMzAA.js";
6
+ import "./globals-DESrFYmC.js";
7
+ import "./runtime-_tQz41uA.js";
8
+ import "./ansi-BPhP6LBZ.js";
9
+ import { t as createSubsystemLogger } from "./subsystem-CPmDTJ2P.js";
10
+ import "./warning-filter-B1UOeM0G.js";
11
+ import "./utils-C7ykRPCQ.js";
12
+ import { p as resolveAgentWorkspaceDir } from "./agent-scope-lZlwP1At.js";
13
+ import { S as parseAgentSessionKey } from "./session-key-UoG7Kfw5.js";
14
+ import "./boundary-file-read-tPYh_8fH.js";
15
+ import "./logger-BGzLUitz.js";
16
+ import "./exec-CvEtXqTZ.js";
17
+ import "./workspace-DJ_S272u.js";
18
+ import "./path-alias-guards-BtSO7sk7.js";
19
+ import { n as materializeWindowsSpawnProgram, r as resolveWindowsSpawnProgram } from "./windows-spawn-Du1a57S-.js";
20
+ import { f as writeFileWithinRoot } from "./fs-safe-CRXFoBmh.js";
21
+ import "./mime-DGFQe4XX.js";
22
+ import "./paths-ApLcu1Uu.js";
23
+ import "./multimodal-BJBBn_4F.js";
24
+ import { C as isFileMissingError, a as listSessionFilesForAgent, i as buildSessionEntry, r as requireNodeSqlite, t as extractKeywords, w as statRegularFile } from "./query-expansion-D_Mm5Hhi.js";
25
+ import path from "node:path";
26
+ import { spawn } from "node:child_process";
27
+ import os from "node:os";
28
+ import fs from "node:fs/promises";
29
+ import readline from "node:readline";
30
+ //#region src/memory/qmd-process.ts
31
+ function resolveCliSpawnInvocation(params) {
32
+ return materializeWindowsSpawnProgram(resolveWindowsSpawnProgram({
33
+ command: params.command,
34
+ platform: process.platform,
35
+ env: params.env,
36
+ execPath: process.execPath,
37
+ packageName: params.packageName,
38
+ allowShellFallback: false
39
+ }), params.args);
40
+ }
41
+ async function runCliCommand(params) {
42
+ return await new Promise((resolve, reject) => {
43
+ const child = spawn(params.spawnInvocation.command, params.spawnInvocation.argv, {
44
+ env: params.env,
45
+ cwd: params.cwd,
46
+ shell: params.spawnInvocation.shell,
47
+ windowsHide: params.spawnInvocation.windowsHide
48
+ });
49
+ let stdout = "";
50
+ let stderr = "";
51
+ let stdoutTruncated = false;
52
+ let stderrTruncated = false;
53
+ const discardStdout = params.discardStdout === true;
54
+ const timer = params.timeoutMs ? setTimeout(() => {
55
+ child.kill("SIGKILL");
56
+ reject(/* @__PURE__ */ new Error(`${params.commandSummary} timed out after ${params.timeoutMs}ms`));
57
+ }, params.timeoutMs) : null;
58
+ child.stdout.on("data", (data) => {
59
+ if (discardStdout) return;
60
+ const next = appendOutputWithCap(stdout, data.toString("utf8"), params.maxOutputChars);
61
+ stdout = next.text;
62
+ stdoutTruncated = stdoutTruncated || next.truncated;
63
+ });
64
+ child.stderr.on("data", (data) => {
65
+ const next = appendOutputWithCap(stderr, data.toString("utf8"), params.maxOutputChars);
66
+ stderr = next.text;
67
+ stderrTruncated = stderrTruncated || next.truncated;
68
+ });
69
+ child.on("error", (err) => {
70
+ if (timer) clearTimeout(timer);
71
+ reject(err);
72
+ });
73
+ child.on("close", (code) => {
74
+ if (timer) clearTimeout(timer);
75
+ if (!discardStdout && (stdoutTruncated || stderrTruncated)) {
76
+ reject(/* @__PURE__ */ new Error(`${params.commandSummary} produced too much output (limit ${params.maxOutputChars} chars)`));
77
+ return;
78
+ }
79
+ if (code === 0) resolve({
80
+ stdout,
81
+ stderr
82
+ });
83
+ else reject(/* @__PURE__ */ new Error(`${params.commandSummary} failed (code ${code}): ${stderr || stdout}`));
84
+ });
85
+ });
86
+ }
87
+ function appendOutputWithCap(current, chunk, maxChars) {
88
+ const appended = current + chunk;
89
+ if (appended.length <= maxChars) return {
90
+ text: appended,
91
+ truncated: false
92
+ };
93
+ return {
94
+ text: appended.slice(-maxChars),
95
+ truncated: true
96
+ };
97
+ }
98
+ //#endregion
99
+ //#region src/memory/qmd-scope.ts
100
+ function isQmdScopeAllowed(scope, sessionKey) {
101
+ if (!scope) return true;
102
+ const parsed = parseQmdSessionScope(sessionKey);
103
+ const channel = parsed.channel;
104
+ const chatType = parsed.chatType;
105
+ const normalizedKey = parsed.normalizedKey ?? "";
106
+ const rawKey = sessionKey?.trim().toLowerCase() ?? "";
107
+ for (const rule of scope.rules ?? []) {
108
+ if (!rule) continue;
109
+ const match = rule.match ?? {};
110
+ if (match.channel && match.channel !== channel) continue;
111
+ if (match.chatType && match.chatType !== chatType) continue;
112
+ const normalizedPrefix = match.keyPrefix?.trim().toLowerCase() || void 0;
113
+ const rawPrefix = match.rawKeyPrefix?.trim().toLowerCase() || void 0;
114
+ if (rawPrefix && !rawKey.startsWith(rawPrefix)) continue;
115
+ if (normalizedPrefix) {
116
+ if (normalizedPrefix.startsWith("agent:")) {
117
+ if (!rawKey.startsWith(normalizedPrefix)) continue;
118
+ } else if (!normalizedKey.startsWith(normalizedPrefix)) continue;
119
+ }
120
+ return rule.action === "allow";
121
+ }
122
+ return (scope.default ?? "allow") === "allow";
123
+ }
124
+ function deriveQmdScopeChannel(key) {
125
+ return parseQmdSessionScope(key).channel;
126
+ }
127
+ function deriveQmdScopeChatType(key) {
128
+ return parseQmdSessionScope(key).chatType;
129
+ }
130
+ function parseQmdSessionScope(key) {
131
+ const normalized = normalizeQmdSessionKey(key);
132
+ if (!normalized) return {};
133
+ const parts = normalized.split(":").filter(Boolean);
134
+ let chatType;
135
+ if (parts.length >= 2 && (parts[1] === "group" || parts[1] === "channel" || parts[1] === "direct" || parts[1] === "dm")) {
136
+ if (parts.includes("group")) chatType = "group";
137
+ else if (parts.includes("channel")) chatType = "channel";
138
+ return {
139
+ normalizedKey: normalized,
140
+ channel: parts[0]?.toLowerCase(),
141
+ chatType: chatType ?? "direct"
142
+ };
143
+ }
144
+ if (normalized.includes(":group:")) return {
145
+ normalizedKey: normalized,
146
+ chatType: "group"
147
+ };
148
+ if (normalized.includes(":channel:")) return {
149
+ normalizedKey: normalized,
150
+ chatType: "channel"
151
+ };
152
+ return {
153
+ normalizedKey: normalized,
154
+ chatType: "direct"
155
+ };
156
+ }
157
+ function normalizeQmdSessionKey(key) {
158
+ if (!key) return;
159
+ const trimmed = key.trim();
160
+ if (!trimmed) return;
161
+ const normalized = (parseAgentSessionKey(trimmed)?.rest ?? trimmed).toLowerCase();
162
+ if (normalized.startsWith("subagent:")) return;
163
+ return normalized;
164
+ }
165
+ //#endregion
166
+ //#region src/memory/qmd-query-parser.ts
167
+ const log$1 = createSubsystemLogger("memory");
168
+ function parseQmdQueryJson(stdout, stderr) {
169
+ const trimmedStdout = stdout.trim();
170
+ const trimmedStderr = stderr.trim();
171
+ const stdoutIsMarker = trimmedStdout.length > 0 && isQmdNoResultsOutput(trimmedStdout);
172
+ const stderrIsMarker = trimmedStderr.length > 0 && isQmdNoResultsOutput(trimmedStderr);
173
+ if (stdoutIsMarker || !trimmedStdout && stderrIsMarker) return [];
174
+ if (!trimmedStdout) {
175
+ const message = `stdout empty${trimmedStderr ? ` (stderr: ${summarizeQmdStderr(trimmedStderr)})` : ""}`;
176
+ log$1.warn(`qmd query returned invalid JSON: ${message}`);
177
+ throw new Error(`qmd query returned invalid JSON: ${message}`);
178
+ }
179
+ try {
180
+ const parsed = parseQmdQueryResultArray(trimmedStdout);
181
+ if (parsed !== null) return parsed;
182
+ const noisyPayload = extractFirstJsonArray(trimmedStdout);
183
+ if (!noisyPayload) throw new Error("qmd query JSON response was not an array");
184
+ const fallback = parseQmdQueryResultArray(noisyPayload);
185
+ if (fallback !== null) return fallback;
186
+ throw new Error("qmd query JSON response was not an array");
187
+ } catch (err) {
188
+ const message = err instanceof Error ? err.message : String(err);
189
+ log$1.warn(`qmd query returned invalid JSON: ${message}`);
190
+ throw new Error(`qmd query returned invalid JSON: ${message}`, { cause: err });
191
+ }
192
+ }
193
+ function isQmdNoResultsOutput(raw) {
194
+ return raw.split(/\r?\n/).map((line) => line.trim().toLowerCase().replace(/\s+/g, " ")).filter((line) => line.length > 0).some((line) => isQmdNoResultsLine(line));
195
+ }
196
+ function isQmdNoResultsLine(line) {
197
+ if (line === "no results found" || line === "no results found.") return true;
198
+ return /^(?:\[[^\]]+\]\s*)?(?:(?:warn(?:ing)?|info|error|qmd)\s*:\s*)+no results found\.?$/.test(line);
199
+ }
200
+ function summarizeQmdStderr(raw) {
201
+ return raw.length <= 120 ? raw : `${raw.slice(0, 117)}...`;
202
+ }
203
+ function parseQmdQueryResultArray(raw) {
204
+ try {
205
+ const parsed = JSON.parse(raw);
206
+ if (!Array.isArray(parsed)) return null;
207
+ return parsed;
208
+ } catch {
209
+ return null;
210
+ }
211
+ }
212
+ function extractFirstJsonArray(raw) {
213
+ const start = raw.indexOf("[");
214
+ if (start < 0) return null;
215
+ let depth = 0;
216
+ let inString = false;
217
+ let escaped = false;
218
+ for (let i = start; i < raw.length; i += 1) {
219
+ const char = raw[i];
220
+ if (char === void 0) break;
221
+ if (inString) {
222
+ if (escaped) {
223
+ escaped = false;
224
+ continue;
225
+ }
226
+ if (char === "\\") escaped = true;
227
+ else if (char === "\"") inString = false;
228
+ continue;
229
+ }
230
+ if (char === "\"") {
231
+ inString = true;
232
+ continue;
233
+ }
234
+ if (char === "[") depth += 1;
235
+ else if (char === "]") {
236
+ depth -= 1;
237
+ if (depth === 0) return raw.slice(start, i + 1);
238
+ }
239
+ }
240
+ return null;
241
+ }
242
+ //#endregion
243
+ //#region src/memory/qmd-manager.ts
244
+ const log = createSubsystemLogger("memory");
245
+ const SNIPPET_HEADER_RE = /@@\s*-([0-9]+),([0-9]+)/;
246
+ const SEARCH_PENDING_UPDATE_WAIT_MS = 500;
247
+ const MAX_QMD_OUTPUT_CHARS = 2e5;
248
+ const NUL_MARKER_RE = /(?:\^@|\\0|\\x00|\\u0000|null\s*byte|nul\s*byte)/i;
249
+ const QMD_EMBED_BACKOFF_BASE_MS = 6e4;
250
+ const QMD_EMBED_BACKOFF_MAX_MS = 3600 * 1e3;
251
+ const HAN_SCRIPT_RE = /[\u3400-\u9fff]/u;
252
+ const QMD_BM25_HAN_KEYWORD_LIMIT = 12;
253
+ let qmdEmbedQueueTail = Promise.resolve();
254
+ function hasHanScript(value) {
255
+ return HAN_SCRIPT_RE.test(value);
256
+ }
257
+ function normalizeHanBm25Query(query) {
258
+ const trimmed = query.trim();
259
+ if (!trimmed || !hasHanScript(trimmed)) return trimmed;
260
+ const keywords = extractKeywords(trimmed);
261
+ const normalizedKeywords = [];
262
+ const seen = /* @__PURE__ */ new Set();
263
+ for (const keyword of keywords) {
264
+ const token = keyword.trim();
265
+ if (!token || seen.has(token)) continue;
266
+ const includesHan = hasHanScript(token);
267
+ if (includesHan && Array.from(token).length < 2) continue;
268
+ if (!includesHan && token.length < 2) continue;
269
+ seen.add(token);
270
+ normalizedKeywords.push(token);
271
+ if (normalizedKeywords.length >= QMD_BM25_HAN_KEYWORD_LIMIT) break;
272
+ }
273
+ return normalizedKeywords.length > 0 ? normalizedKeywords.join(" ") : trimmed;
274
+ }
275
+ async function runWithQmdEmbedLock(task) {
276
+ const previous = qmdEmbedQueueTail;
277
+ let release;
278
+ qmdEmbedQueueTail = new Promise((resolve) => {
279
+ release = resolve;
280
+ });
281
+ await previous.catch(() => void 0);
282
+ try {
283
+ return await task();
284
+ } finally {
285
+ release?.();
286
+ }
287
+ }
288
+ var QmdMemoryManager = class QmdMemoryManager {
289
+ static async create(params) {
290
+ const resolved = params.resolved.qmd;
291
+ if (!resolved) return null;
292
+ const manager = new QmdMemoryManager({
293
+ cfg: params.cfg,
294
+ agentId: params.agentId,
295
+ resolved
296
+ });
297
+ await manager.initialize(params.mode ?? "full");
298
+ return manager;
299
+ }
300
+ constructor(params) {
301
+ this.collectionRoots = /* @__PURE__ */ new Map();
302
+ this.sources = /* @__PURE__ */ new Set();
303
+ this.docPathCache = /* @__PURE__ */ new Map();
304
+ this.exportedSessionState = /* @__PURE__ */ new Map();
305
+ this.maxQmdOutputChars = MAX_QMD_OUTPUT_CHARS;
306
+ this.updateTimer = null;
307
+ this.pendingUpdate = null;
308
+ this.queuedForcedUpdate = null;
309
+ this.queuedForcedRuns = 0;
310
+ this.closed = false;
311
+ this.db = null;
312
+ this.lastUpdateAt = null;
313
+ this.lastEmbedAt = null;
314
+ this.embedBackoffUntil = null;
315
+ this.embedFailureCount = 0;
316
+ this.attemptedNullByteCollectionRepair = false;
317
+ this.attemptedDuplicateDocumentRepair = false;
318
+ this.cfg = params.cfg;
319
+ this.agentId = params.agentId;
320
+ this.qmd = params.resolved;
321
+ this.workspaceDir = resolveAgentWorkspaceDir(params.cfg, params.agentId);
322
+ this.stateDir = resolveStateDir(process.env, os.homedir);
323
+ this.agentStateDir = path.join(this.stateDir, "agents", this.agentId);
324
+ this.qmdDir = path.join(this.agentStateDir, "qmd");
325
+ this.xdgConfigHome = path.join(this.qmdDir, "xdg-config");
326
+ this.xdgCacheHome = path.join(this.qmdDir, "xdg-cache");
327
+ this.indexPath = path.join(this.xdgCacheHome, "qmd", "index.sqlite");
328
+ this.env = {
329
+ ...process.env,
330
+ XDG_CONFIG_HOME: this.xdgConfigHome,
331
+ QMD_CONFIG_DIR: this.xdgConfigHome,
332
+ XDG_CACHE_HOME: this.xdgCacheHome,
333
+ NO_COLOR: "1"
334
+ };
335
+ this.sessionExporter = this.qmd.sessions.enabled ? {
336
+ dir: this.qmd.sessions.exportDir ?? path.join(this.qmdDir, "sessions"),
337
+ retentionMs: this.qmd.sessions.retentionDays ? this.qmd.sessions.retentionDays * 24 * 60 * 60 * 1e3 : void 0,
338
+ collectionName: this.pickSessionCollectionName()
339
+ } : null;
340
+ if (this.sessionExporter) this.qmd.collections = [...this.qmd.collections, {
341
+ name: this.sessionExporter.collectionName,
342
+ path: this.sessionExporter.dir,
343
+ pattern: "**/*.md",
344
+ kind: "sessions"
345
+ }];
346
+ this.managedCollectionNames = this.computeManagedCollectionNames();
347
+ }
348
+ async initialize(mode) {
349
+ this.bootstrapCollections();
350
+ if (mode === "status") return;
351
+ await fs.mkdir(this.xdgConfigHome, { recursive: true });
352
+ await fs.mkdir(this.xdgCacheHome, { recursive: true });
353
+ await fs.mkdir(path.dirname(this.indexPath), { recursive: true });
354
+ if (this.sessionExporter) await fs.mkdir(this.sessionExporter.dir, { recursive: true });
355
+ await this.symlinkSharedModels();
356
+ await this.ensureCollections();
357
+ if (this.qmd.update.onBoot) {
358
+ const bootRun = this.runUpdate("boot", true);
359
+ if (this.qmd.update.waitForBootSync) await bootRun.catch((err) => {
360
+ log.warn(`qmd boot update failed: ${String(err)}`);
361
+ });
362
+ else bootRun.catch((err) => {
363
+ log.warn(`qmd boot update failed: ${String(err)}`);
364
+ });
365
+ }
366
+ if (this.qmd.update.intervalMs > 0) this.updateTimer = setInterval(() => {
367
+ this.runUpdate("interval").catch((err) => {
368
+ log.warn(`qmd update failed (${String(err)})`);
369
+ });
370
+ }, this.qmd.update.intervalMs);
371
+ }
372
+ bootstrapCollections() {
373
+ this.collectionRoots.clear();
374
+ this.sources.clear();
375
+ for (const collection of this.qmd.collections) {
376
+ const kind = collection.kind === "sessions" ? "sessions" : "memory";
377
+ this.collectionRoots.set(collection.name, {
378
+ path: collection.path,
379
+ kind
380
+ });
381
+ this.sources.add(kind);
382
+ }
383
+ }
384
+ async ensureCollections() {
385
+ const existing = await this.listCollectionsBestEffort();
386
+ await this.migrateLegacyUnscopedCollections(existing);
387
+ for (const collection of this.qmd.collections) {
388
+ const listed = existing.get(collection.name);
389
+ if (listed && !this.shouldRebindCollection(collection, listed)) continue;
390
+ if (listed) try {
391
+ await this.removeCollection(collection.name);
392
+ } catch (err) {
393
+ const message = err instanceof Error ? err.message : String(err);
394
+ if (!this.isCollectionMissingError(message)) log.warn(`qmd collection remove failed for ${collection.name}: ${message}`);
395
+ }
396
+ try {
397
+ await this.ensureCollectionPath(collection);
398
+ await this.addCollection(collection.path, collection.name, collection.pattern);
399
+ existing.set(collection.name, {
400
+ path: collection.path,
401
+ pattern: collection.pattern
402
+ });
403
+ } catch (err) {
404
+ const message = err instanceof Error ? err.message : String(err);
405
+ if (this.isCollectionAlreadyExistsError(message)) {
406
+ if (!await this.tryRebindConflictingCollection({
407
+ collection,
408
+ existing,
409
+ addErrorMessage: message
410
+ })) log.warn(`qmd collection add skipped for ${collection.name}: ${message}`);
411
+ continue;
412
+ }
413
+ log.warn(`qmd collection add failed for ${collection.name}: ${message}`);
414
+ }
415
+ }
416
+ }
417
+ async listCollectionsBestEffort() {
418
+ const existing = /* @__PURE__ */ new Map();
419
+ try {
420
+ const result = await this.runQmd([
421
+ "collection",
422
+ "list",
423
+ "--json"
424
+ ], { timeoutMs: this.qmd.update.commandTimeoutMs });
425
+ const parsed = this.parseListedCollections(result.stdout);
426
+ for (const [name, details] of parsed) existing.set(name, details);
427
+ } catch {}
428
+ return existing;
429
+ }
430
+ findCollectionByPathPattern(collection, listed) {
431
+ for (const [name, details] of listed) {
432
+ if (!details.path || typeof details.pattern !== "string") continue;
433
+ if (!this.pathsMatch(details.path, collection.path)) continue;
434
+ if (details.pattern !== collection.pattern) continue;
435
+ return name;
436
+ }
437
+ return null;
438
+ }
439
+ async tryRebindConflictingCollection(params) {
440
+ const { collection, existing, addErrorMessage } = params;
441
+ let conflictName = this.findCollectionByPathPattern(collection, existing);
442
+ if (!conflictName) {
443
+ const refreshed = await this.listCollectionsBestEffort();
444
+ existing.clear();
445
+ for (const [name, details] of refreshed) existing.set(name, details);
446
+ conflictName = this.findCollectionByPathPattern(collection, existing);
447
+ }
448
+ if (!conflictName) return false;
449
+ if (conflictName === collection.name) {
450
+ existing.set(collection.name, {
451
+ path: collection.path,
452
+ pattern: collection.pattern
453
+ });
454
+ return true;
455
+ }
456
+ log.warn(`qmd collection add conflict for ${collection.name}: path+pattern already bound by ${conflictName}; rebinding`);
457
+ try {
458
+ await this.removeCollection(conflictName);
459
+ existing.delete(conflictName);
460
+ } catch (removeErr) {
461
+ const removeMessage = removeErr instanceof Error ? removeErr.message : String(removeErr);
462
+ if (!this.isCollectionMissingError(removeMessage)) log.warn(`qmd collection remove failed for ${conflictName}: ${removeMessage}`);
463
+ return false;
464
+ }
465
+ try {
466
+ await this.addCollection(collection.path, collection.name, collection.pattern);
467
+ existing.set(collection.name, {
468
+ path: collection.path,
469
+ pattern: collection.pattern
470
+ });
471
+ return true;
472
+ } catch (retryErr) {
473
+ const retryMessage = retryErr instanceof Error ? retryErr.message : String(retryErr);
474
+ log.warn(`qmd collection add failed for ${collection.name} after rebinding ${conflictName}: ${retryMessage} (initial: ${addErrorMessage})`);
475
+ return false;
476
+ }
477
+ }
478
+ async migrateLegacyUnscopedCollections(existing) {
479
+ for (const collection of this.qmd.collections) {
480
+ if (existing.has(collection.name)) continue;
481
+ const legacyName = this.deriveLegacyCollectionName(collection.name);
482
+ if (!legacyName) continue;
483
+ const listedLegacy = existing.get(legacyName);
484
+ if (!listedLegacy) continue;
485
+ if (!this.canMigrateLegacyCollection(collection, listedLegacy)) {
486
+ log.debug(`qmd legacy collection migration skipped for ${legacyName} (path/pattern mismatch)`);
487
+ continue;
488
+ }
489
+ try {
490
+ await this.removeCollection(legacyName);
491
+ existing.delete(legacyName);
492
+ } catch (err) {
493
+ const message = err instanceof Error ? err.message : String(err);
494
+ if (!this.isCollectionMissingError(message)) log.warn(`qmd collection remove failed for ${legacyName}: ${message}`);
495
+ }
496
+ }
497
+ }
498
+ deriveLegacyCollectionName(scopedName) {
499
+ const agentSuffix = `-${this.sanitizeCollectionNameSegment(this.agentId)}`;
500
+ if (!scopedName.endsWith(agentSuffix)) return null;
501
+ return scopedName.slice(0, -agentSuffix.length).trim() || null;
502
+ }
503
+ canMigrateLegacyCollection(collection, listedLegacy) {
504
+ if (listedLegacy.path && !this.pathsMatch(listedLegacy.path, collection.path)) return false;
505
+ if (typeof listedLegacy.pattern === "string" && listedLegacy.pattern !== collection.pattern) return false;
506
+ return true;
507
+ }
508
+ async ensureCollectionPath(collection) {
509
+ if (!this.isDirectoryGlobPattern(collection.pattern)) return;
510
+ await fs.mkdir(collection.path, { recursive: true });
511
+ }
512
+ isDirectoryGlobPattern(pattern) {
513
+ return pattern.includes("*") || pattern.includes("?") || pattern.includes("[");
514
+ }
515
+ isCollectionAlreadyExistsError(message) {
516
+ const lower = message.toLowerCase();
517
+ return lower.includes("already exists") || lower.includes("exists");
518
+ }
519
+ isCollectionMissingError(message) {
520
+ const lower = message.toLowerCase();
521
+ return lower.includes("not found") || lower.includes("does not exist") || lower.includes("missing");
522
+ }
523
+ isMissingCollectionSearchError(err) {
524
+ const message = err instanceof Error ? err.message : String(err);
525
+ return this.isCollectionMissingError(message) && message.toLowerCase().includes("collection");
526
+ }
527
+ async tryRepairMissingCollectionSearch(err) {
528
+ if (!this.isMissingCollectionSearchError(err)) return false;
529
+ log.warn("qmd search failed because a managed collection is missing; repairing collections and retrying once");
530
+ await this.ensureCollections();
531
+ return true;
532
+ }
533
+ async addCollection(pathArg, name, pattern) {
534
+ await this.runQmd([
535
+ "collection",
536
+ "add",
537
+ pathArg,
538
+ "--name",
539
+ name,
540
+ "--mask",
541
+ pattern
542
+ ], { timeoutMs: this.qmd.update.commandTimeoutMs });
543
+ }
544
+ async removeCollection(name) {
545
+ await this.runQmd([
546
+ "collection",
547
+ "remove",
548
+ name
549
+ ], { timeoutMs: this.qmd.update.commandTimeoutMs });
550
+ }
551
+ parseListedCollections(output) {
552
+ const listed = /* @__PURE__ */ new Map();
553
+ const trimmed = output.trim();
554
+ if (!trimmed) return listed;
555
+ try {
556
+ const parsed = JSON.parse(trimmed);
557
+ if (Array.isArray(parsed)) {
558
+ for (const entry of parsed) {
559
+ if (typeof entry === "string") {
560
+ listed.set(entry, {});
561
+ continue;
562
+ }
563
+ if (!entry || typeof entry !== "object") continue;
564
+ const name = entry.name;
565
+ if (typeof name !== "string") continue;
566
+ const listedPath = entry.path;
567
+ const listedPattern = entry.pattern;
568
+ const listedMask = entry.mask;
569
+ listed.set(name, {
570
+ path: typeof listedPath === "string" ? listedPath : void 0,
571
+ pattern: typeof listedPattern === "string" ? listedPattern : typeof listedMask === "string" ? listedMask : void 0
572
+ });
573
+ }
574
+ return listed;
575
+ }
576
+ } catch {}
577
+ let currentName = null;
578
+ for (const rawLine of output.split(/\r?\n/)) {
579
+ const line = rawLine.trimEnd();
580
+ if (!line.trim()) {
581
+ currentName = null;
582
+ continue;
583
+ }
584
+ const collectionLine = /^\s*([a-z0-9._-]+)\s+\(qmd:\/\/[^)]+\)\s*$/i.exec(line);
585
+ if (collectionLine) {
586
+ currentName = collectionLine[1];
587
+ if (!listed.has(currentName)) listed.set(currentName, {});
588
+ continue;
589
+ }
590
+ if (/^\s*collections\b/i.test(line)) continue;
591
+ const bareNameLine = /^\s*([a-z0-9._-]+)\s*$/i.exec(line);
592
+ if (bareNameLine && !line.includes(":")) {
593
+ currentName = bareNameLine[1];
594
+ if (!listed.has(currentName)) listed.set(currentName, {});
595
+ continue;
596
+ }
597
+ if (!currentName) continue;
598
+ const patternLine = /^\s*(?:pattern|mask)\s*:\s*(.+?)\s*$/i.exec(line);
599
+ if (patternLine) {
600
+ const existing = listed.get(currentName) ?? {};
601
+ existing.pattern = patternLine[1].trim();
602
+ listed.set(currentName, existing);
603
+ continue;
604
+ }
605
+ const pathLine = /^\s*path\s*:\s*(.+?)\s*$/i.exec(line);
606
+ if (pathLine) {
607
+ const existing = listed.get(currentName) ?? {};
608
+ existing.path = pathLine[1].trim();
609
+ listed.set(currentName, existing);
610
+ }
611
+ }
612
+ return listed;
613
+ }
614
+ shouldRebindCollection(collection, listed) {
615
+ if (!listed.path) return false;
616
+ if (!this.pathsMatch(listed.path, collection.path)) return true;
617
+ if (typeof listed.pattern === "string" && listed.pattern !== collection.pattern) return true;
618
+ return false;
619
+ }
620
+ pathsMatch(left, right) {
621
+ const normalize = (value) => {
622
+ const resolved = path.isAbsolute(value) ? path.resolve(value) : path.resolve(this.workspaceDir, value);
623
+ const normalized = path.normalize(resolved);
624
+ return process.platform === "win32" ? normalized.toLowerCase() : normalized;
625
+ };
626
+ return normalize(left) === normalize(right);
627
+ }
628
+ shouldRepairNullByteCollectionError(err) {
629
+ const message = err instanceof Error ? err.message : String(err);
630
+ const lower = message.toLowerCase();
631
+ return (lower.includes("enotdir") || lower.includes("not a directory")) && NUL_MARKER_RE.test(message);
632
+ }
633
+ shouldRepairDuplicateDocumentConstraint(err) {
634
+ const lower = (err instanceof Error ? err.message : String(err)).toLowerCase();
635
+ return lower.includes("unique constraint failed") && lower.includes("documents.collection") && lower.includes("documents.path");
636
+ }
637
+ async rebuildManagedCollectionsForRepair(reason) {
638
+ for (const collection of this.qmd.collections) {
639
+ try {
640
+ await this.removeCollection(collection.name);
641
+ } catch (removeErr) {
642
+ const removeMessage = removeErr instanceof Error ? removeErr.message : String(removeErr);
643
+ if (!this.isCollectionMissingError(removeMessage)) log.warn(`qmd collection remove failed for ${collection.name}: ${removeMessage}`);
644
+ }
645
+ try {
646
+ await this.addCollection(collection.path, collection.name, collection.pattern);
647
+ } catch (addErr) {
648
+ const addMessage = addErr instanceof Error ? addErr.message : String(addErr);
649
+ if (!this.isCollectionAlreadyExistsError(addMessage)) log.warn(`qmd collection add failed for ${collection.name}: ${addMessage}`);
650
+ }
651
+ }
652
+ log.warn(`qmd managed collections rebuilt for update repair (${reason})`);
653
+ }
654
+ async tryRepairNullByteCollections(err, reason) {
655
+ if (this.attemptedNullByteCollectionRepair) return false;
656
+ if (!this.shouldRepairNullByteCollectionError(err)) return false;
657
+ this.attemptedNullByteCollectionRepair = true;
658
+ log.warn(`qmd update failed with suspected null-byte collection metadata (${reason}); rebuilding managed collections and retrying once`);
659
+ await this.rebuildManagedCollectionsForRepair(`null-byte metadata (${reason})`);
660
+ return true;
661
+ }
662
+ async tryRepairDuplicateDocumentConstraint(err, reason) {
663
+ if (this.attemptedDuplicateDocumentRepair) return false;
664
+ if (!this.shouldRepairDuplicateDocumentConstraint(err)) return false;
665
+ this.attemptedDuplicateDocumentRepair = true;
666
+ log.warn(`qmd update failed with duplicate document constraint (${reason}); rebuilding managed collections and retrying once`);
667
+ await this.rebuildManagedCollectionsForRepair(`duplicate-document constraint (${reason})`);
668
+ return true;
669
+ }
670
+ async search(query, opts) {
671
+ if (!this.isScopeAllowed(opts?.sessionKey)) {
672
+ this.logScopeDenied(opts?.sessionKey);
673
+ return [];
674
+ }
675
+ const trimmed = query.trim();
676
+ if (!trimmed) return [];
677
+ await this.waitForPendingUpdateBeforeSearch();
678
+ const limit = Math.min(this.qmd.limits.maxResults, opts?.maxResults ?? this.qmd.limits.maxResults);
679
+ const collectionNames = this.listManagedCollectionNames();
680
+ if (collectionNames.length === 0) {
681
+ log.warn("qmd query skipped: no managed collections configured");
682
+ return [];
683
+ }
684
+ const qmdSearchCommand = this.qmd.searchMode;
685
+ const mcporterEnabled = this.qmd.mcporter.enabled;
686
+ const runSearchAttempt = async (allowMissingCollectionRepair) => {
687
+ try {
688
+ if (mcporterEnabled) {
689
+ const tool = qmdSearchCommand === "search" ? "search" : qmdSearchCommand === "vsearch" ? "vector_search" : "deep_search";
690
+ const minScore = opts?.minScore ?? 0;
691
+ if (collectionNames.length > 1) return await this.runMcporterAcrossCollections({
692
+ tool,
693
+ query: trimmed,
694
+ limit,
695
+ minScore,
696
+ collectionNames
697
+ });
698
+ return await this.runQmdSearchViaMcporter({
699
+ mcporter: this.qmd.mcporter,
700
+ tool,
701
+ query: trimmed,
702
+ limit,
703
+ minScore,
704
+ collection: collectionNames[0],
705
+ timeoutMs: this.qmd.limits.timeoutMs
706
+ });
707
+ }
708
+ if (collectionNames.length > 1) return await this.runQueryAcrossCollections(trimmed, limit, collectionNames, qmdSearchCommand);
709
+ const args = this.buildSearchArgs(qmdSearchCommand, trimmed, limit);
710
+ args.push(...this.buildCollectionFilterArgs(collectionNames));
711
+ const result = await this.runQmd(args, { timeoutMs: this.qmd.limits.timeoutMs });
712
+ return parseQmdQueryJson(result.stdout, result.stderr);
713
+ } catch (err) {
714
+ if (allowMissingCollectionRepair && this.isMissingCollectionSearchError(err)) throw err;
715
+ if (!mcporterEnabled && qmdSearchCommand !== "query" && this.isUnsupportedQmdOptionError(err)) {
716
+ log.warn(`qmd ${qmdSearchCommand} does not support configured flags; retrying search with qmd query`);
717
+ try {
718
+ if (collectionNames.length > 1) return await this.runQueryAcrossCollections(trimmed, limit, collectionNames, "query");
719
+ const fallbackArgs = this.buildSearchArgs("query", trimmed, limit);
720
+ fallbackArgs.push(...this.buildCollectionFilterArgs(collectionNames));
721
+ const fallback = await this.runQmd(fallbackArgs, { timeoutMs: this.qmd.limits.timeoutMs });
722
+ return parseQmdQueryJson(fallback.stdout, fallback.stderr);
723
+ } catch (fallbackErr) {
724
+ log.warn(`qmd query fallback failed: ${String(fallbackErr)}`);
725
+ throw fallbackErr instanceof Error ? fallbackErr : new Error(String(fallbackErr));
726
+ }
727
+ }
728
+ const label = mcporterEnabled ? "mcporter/qmd" : `qmd ${qmdSearchCommand}`;
729
+ log.warn(`${label} failed: ${String(err)}`);
730
+ throw err instanceof Error ? err : new Error(String(err));
731
+ }
732
+ };
733
+ let parsed;
734
+ try {
735
+ parsed = await runSearchAttempt(true);
736
+ } catch (err) {
737
+ if (!await this.tryRepairMissingCollectionSearch(err)) throw err instanceof Error ? err : new Error(String(err));
738
+ parsed = await runSearchAttempt(false);
739
+ }
740
+ const results = [];
741
+ for (const entry of parsed) {
742
+ const docHints = this.normalizeDocHints({
743
+ preferredCollection: entry.collection,
744
+ preferredFile: entry.file
745
+ });
746
+ const doc = await this.resolveDocLocation(entry.docid, docHints);
747
+ if (!doc) continue;
748
+ const snippet = entry.snippet?.slice(0, this.qmd.limits.maxSnippetChars) ?? "";
749
+ const lines = this.extractSnippetLines(snippet);
750
+ const score = typeof entry.score === "number" ? entry.score : 0;
751
+ if (score < (opts?.minScore ?? 0)) continue;
752
+ results.push({
753
+ path: doc.rel,
754
+ startLine: lines.startLine,
755
+ endLine: lines.endLine,
756
+ score,
757
+ snippet,
758
+ source: doc.source
759
+ });
760
+ }
761
+ return this.clampResultsByInjectedChars(this.diversifyResultsBySource(results, limit));
762
+ }
763
+ async sync(params) {
764
+ if (params?.sessionFiles?.some((sessionFile) => sessionFile.trim().length > 0)) log.debug("qmd sync ignoring targeted sessionFiles hint; running regular update");
765
+ if (params?.progress) params.progress({
766
+ completed: 0,
767
+ total: 1,
768
+ label: "Updating QMD index…"
769
+ });
770
+ await this.runUpdate(params?.reason ?? "manual", params?.force);
771
+ if (params?.progress) params.progress({
772
+ completed: 1,
773
+ total: 1,
774
+ label: "QMD index updated"
775
+ });
776
+ }
777
+ async readFile(params) {
778
+ const relPath = params.relPath?.trim();
779
+ if (!relPath) throw new Error("path required");
780
+ const absPath = this.resolveReadPath(relPath);
781
+ if (!absPath.endsWith(".md")) throw new Error("path required");
782
+ if ((await statRegularFile(absPath)).missing) return {
783
+ text: "",
784
+ path: relPath
785
+ };
786
+ if (params.from !== void 0 || params.lines !== void 0) {
787
+ const partial = await this.readPartialText(absPath, params.from, params.lines);
788
+ if (partial.missing) return {
789
+ text: "",
790
+ path: relPath
791
+ };
792
+ return {
793
+ text: partial.text,
794
+ path: relPath
795
+ };
796
+ }
797
+ const full = await this.readFullText(absPath);
798
+ if (full.missing) return {
799
+ text: "",
800
+ path: relPath
801
+ };
802
+ if (!params.from && !params.lines) return {
803
+ text: full.text,
804
+ path: relPath
805
+ };
806
+ const lines = full.text.split("\n");
807
+ const start = Math.max(1, params.from ?? 1);
808
+ const count = Math.max(1, params.lines ?? lines.length);
809
+ return {
810
+ text: lines.slice(start - 1, start - 1 + count).join("\n"),
811
+ path: relPath
812
+ };
813
+ }
814
+ status() {
815
+ const counts = this.readCounts();
816
+ return {
817
+ backend: "qmd",
818
+ provider: "qmd",
819
+ model: "qmd",
820
+ requestedProvider: "qmd",
821
+ files: counts.totalDocuments,
822
+ chunks: counts.totalDocuments,
823
+ dirty: false,
824
+ workspaceDir: this.workspaceDir,
825
+ dbPath: this.indexPath,
826
+ sources: Array.from(this.sources),
827
+ sourceCounts: counts.sourceCounts,
828
+ vector: {
829
+ enabled: true,
830
+ available: true
831
+ },
832
+ batch: {
833
+ enabled: false,
834
+ failures: 0,
835
+ limit: 0,
836
+ wait: false,
837
+ concurrency: 0,
838
+ pollIntervalMs: 0,
839
+ timeoutMs: 0
840
+ },
841
+ custom: { qmd: {
842
+ collections: this.qmd.collections.length,
843
+ lastUpdateAt: this.lastUpdateAt
844
+ } }
845
+ };
846
+ }
847
+ async probeEmbeddingAvailability() {
848
+ return { ok: true };
849
+ }
850
+ async probeVectorAvailability() {
851
+ return true;
852
+ }
853
+ async close() {
854
+ if (this.closed) return;
855
+ this.closed = true;
856
+ if (this.updateTimer) {
857
+ clearInterval(this.updateTimer);
858
+ this.updateTimer = null;
859
+ }
860
+ this.queuedForcedRuns = 0;
861
+ await this.pendingUpdate?.catch(() => void 0);
862
+ await this.queuedForcedUpdate?.catch(() => void 0);
863
+ if (this.db) {
864
+ this.db.close();
865
+ this.db = null;
866
+ }
867
+ }
868
+ async runUpdate(reason, force, opts) {
869
+ if (this.closed) return;
870
+ if (this.pendingUpdate) {
871
+ if (force) return this.enqueueForcedUpdate(reason);
872
+ return this.pendingUpdate;
873
+ }
874
+ if (this.queuedForcedUpdate && !opts?.fromForcedQueue) {
875
+ if (force) return this.enqueueForcedUpdate(reason);
876
+ return this.queuedForcedUpdate;
877
+ }
878
+ if (this.shouldSkipUpdate(force)) return;
879
+ const run = async () => {
880
+ if (this.sessionExporter) await this.exportSessions();
881
+ await this.runQmdUpdateWithRetry(reason);
882
+ if (this.shouldRunEmbed(force)) try {
883
+ await runWithQmdEmbedLock(async () => {
884
+ await this.runQmd(["embed"], {
885
+ timeoutMs: this.qmd.update.embedTimeoutMs,
886
+ discardOutput: true
887
+ });
888
+ });
889
+ this.lastEmbedAt = Date.now();
890
+ this.embedBackoffUntil = null;
891
+ this.embedFailureCount = 0;
892
+ } catch (err) {
893
+ this.noteEmbedFailure(reason, err);
894
+ }
895
+ this.lastUpdateAt = Date.now();
896
+ this.docPathCache.clear();
897
+ };
898
+ this.pendingUpdate = run().finally(() => {
899
+ this.pendingUpdate = null;
900
+ });
901
+ await this.pendingUpdate;
902
+ }
903
+ async runQmdUpdateWithRetry(reason) {
904
+ const maxAttempts = reason === "boot" || reason.startsWith("boot:") ? 3 : 1;
905
+ for (let attempt = 1; attempt <= maxAttempts; attempt += 1) try {
906
+ await this.runQmdUpdateOnce(reason);
907
+ return;
908
+ } catch (err) {
909
+ if (attempt >= maxAttempts || !this.isRetryableUpdateError(err)) throw err;
910
+ const delayMs = 500 * 2 ** (attempt - 1);
911
+ log.warn(`qmd update retry ${attempt}/${maxAttempts - 1} after failure (${reason}): ${String(err)}`);
912
+ await new Promise((resolve) => setTimeout(resolve, delayMs));
913
+ }
914
+ }
915
+ async runQmdUpdateOnce(reason) {
916
+ try {
917
+ await this.runQmd(["update"], {
918
+ timeoutMs: this.qmd.update.updateTimeoutMs,
919
+ discardOutput: true
920
+ });
921
+ } catch (err) {
922
+ if (!await this.tryRepairNullByteCollections(err, reason) && !await this.tryRepairDuplicateDocumentConstraint(err, reason)) throw err;
923
+ await this.runQmd(["update"], {
924
+ timeoutMs: this.qmd.update.updateTimeoutMs,
925
+ discardOutput: true
926
+ });
927
+ }
928
+ }
929
+ isRetryableUpdateError(err) {
930
+ if (this.isSqliteBusyError(err)) return true;
931
+ return (err instanceof Error ? err.message : String(err)).toLowerCase().includes("timed out");
932
+ }
933
+ shouldRunEmbed(force) {
934
+ if (this.qmd.searchMode === "search") return false;
935
+ const now = Date.now();
936
+ if (this.embedBackoffUntil !== null && now < this.embedBackoffUntil) return false;
937
+ const embedIntervalMs = this.qmd.update.embedIntervalMs;
938
+ return Boolean(force) || this.lastEmbedAt === null || embedIntervalMs > 0 && now - this.lastEmbedAt > embedIntervalMs;
939
+ }
940
+ noteEmbedFailure(reason, err) {
941
+ this.embedFailureCount += 1;
942
+ const delayMs = Math.min(QMD_EMBED_BACKOFF_MAX_MS, QMD_EMBED_BACKOFF_BASE_MS * 2 ** Math.max(0, this.embedFailureCount - 1));
943
+ this.embedBackoffUntil = Date.now() + delayMs;
944
+ log.warn(`qmd embed failed (${reason}): ${String(err)}; backing off for ${Math.ceil(delayMs / 1e3)}s`);
945
+ }
946
+ enqueueForcedUpdate(reason) {
947
+ this.queuedForcedRuns += 1;
948
+ if (!this.queuedForcedUpdate) this.queuedForcedUpdate = this.drainForcedUpdates(reason).finally(() => {
949
+ this.queuedForcedUpdate = null;
950
+ });
951
+ return this.queuedForcedUpdate;
952
+ }
953
+ async drainForcedUpdates(reason) {
954
+ await this.pendingUpdate?.catch(() => void 0);
955
+ while (!this.closed && this.queuedForcedRuns > 0) {
956
+ this.queuedForcedRuns -= 1;
957
+ await this.runUpdate(`${reason}:queued`, true, { fromForcedQueue: true });
958
+ }
959
+ }
960
+ /**
961
+ * Symlink the default QMD models directory into our custom XDG_CACHE_HOME so
962
+ * that the pre-installed ML models (~/.cache/qmd/models/) are reused rather
963
+ * than re-downloaded for every agent. If the default models directory does
964
+ * not exist, or a models directory/symlink already exists in the target, this
965
+ * is a no-op.
966
+ */
967
+ async symlinkSharedModels() {
968
+ const defaultCacheHome = process.env.XDG_CACHE_HOME || (process.platform === "win32" ? process.env.LOCALAPPDATA : void 0) || path.join(os.homedir(), ".cache");
969
+ const defaultModelsDir = path.join(defaultCacheHome, "qmd", "models");
970
+ const targetModelsDir = path.join(this.xdgCacheHome, "qmd", "models");
971
+ try {
972
+ if (!(await fs.stat(defaultModelsDir).catch((err) => {
973
+ if (err.code === "ENOENT") return null;
974
+ throw err;
975
+ }))?.isDirectory()) return;
976
+ try {
977
+ await fs.lstat(targetModelsDir);
978
+ return;
979
+ } catch {}
980
+ try {
981
+ await fs.symlink(defaultModelsDir, targetModelsDir, "dir");
982
+ } catch (symlinkErr) {
983
+ const code = symlinkErr.code;
984
+ if (process.platform === "win32" && (code === "EPERM" || code === "ENOTSUP")) await fs.symlink(defaultModelsDir, targetModelsDir, "junction");
985
+ else throw symlinkErr;
986
+ }
987
+ log.debug(`symlinked qmd models: ${defaultModelsDir} → ${targetModelsDir}`);
988
+ } catch (err) {
989
+ log.warn(`failed to symlink qmd models directory: ${String(err)}`);
990
+ }
991
+ }
992
+ async runQmd(args, opts) {
993
+ return await runCliCommand({
994
+ commandSummary: `qmd ${args.join(" ")}`,
995
+ spawnInvocation: resolveCliSpawnInvocation({
996
+ command: this.qmd.command,
997
+ args,
998
+ env: this.env,
999
+ packageName: "qmd"
1000
+ }),
1001
+ env: this.env,
1002
+ cwd: this.workspaceDir,
1003
+ timeoutMs: opts?.timeoutMs,
1004
+ maxOutputChars: this.maxQmdOutputChars,
1005
+ discardStdout: opts?.discardOutput
1006
+ });
1007
+ }
1008
+ async ensureMcporterDaemonStarted(mcporter) {
1009
+ if (!mcporter.enabled) return;
1010
+ if (!mcporter.startDaemon) {
1011
+ const g = globalThis;
1012
+ if (!g.__moldclawMcporterColdStartWarned) {
1013
+ g.__moldclawMcporterColdStartWarned = true;
1014
+ log.warn("mcporter qmd bridge enabled but startDaemon=false; each query may cold-start QMD MCP. Consider setting memory.qmd.mcporter.startDaemon=true to keep it warm.");
1015
+ }
1016
+ return;
1017
+ }
1018
+ const g = globalThis;
1019
+ if (!g.__moldclawMcporterDaemonStart) g.__moldclawMcporterDaemonStart = (async () => {
1020
+ try {
1021
+ await this.runMcporter(["daemon", "start"], { timeoutMs: 1e4 });
1022
+ } catch (err) {
1023
+ log.warn(`mcporter daemon start failed: ${String(err)}`);
1024
+ delete g.__moldclawMcporterDaemonStart;
1025
+ }
1026
+ })();
1027
+ await g.__moldclawMcporterDaemonStart;
1028
+ }
1029
+ async runMcporter(args, opts) {
1030
+ const spawnInvocation = resolveCliSpawnInvocation({
1031
+ command: "mcporter",
1032
+ args,
1033
+ env: this.env,
1034
+ packageName: "mcporter"
1035
+ });
1036
+ return await runCliCommand({
1037
+ commandSummary: `${spawnInvocation.command} ${spawnInvocation.argv.join(" ")}`,
1038
+ spawnInvocation,
1039
+ env: this.env,
1040
+ cwd: this.workspaceDir,
1041
+ timeoutMs: opts?.timeoutMs,
1042
+ maxOutputChars: this.maxQmdOutputChars
1043
+ });
1044
+ }
1045
+ async runQmdSearchViaMcporter(params) {
1046
+ await this.ensureMcporterDaemonStarted(params.mcporter);
1047
+ const selector = `${params.mcporter.serverName}.${params.tool}`;
1048
+ const callArgs = {
1049
+ query: params.query,
1050
+ limit: params.limit,
1051
+ minScore: params.minScore
1052
+ };
1053
+ if (params.collection) callArgs.collection = params.collection;
1054
+ const result = await this.runMcporter([
1055
+ "call",
1056
+ selector,
1057
+ "--args",
1058
+ JSON.stringify(callArgs),
1059
+ "--output",
1060
+ "json",
1061
+ "--timeout",
1062
+ String(Math.max(0, params.timeoutMs))
1063
+ ], { timeoutMs: Math.max(params.timeoutMs + 2e3, 5e3) });
1064
+ const parsedUnknown = JSON.parse(result.stdout);
1065
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
1066
+ const structured = isRecord(parsedUnknown) && isRecord(parsedUnknown.structuredContent) ? parsedUnknown.structuredContent : parsedUnknown;
1067
+ const results = isRecord(structured) && Array.isArray(structured.results) ? structured.results : Array.isArray(structured) ? structured : [];
1068
+ const out = [];
1069
+ for (const item of results) {
1070
+ if (!isRecord(item)) continue;
1071
+ const docidRaw = item.docid;
1072
+ const docid = typeof docidRaw === "string" ? docidRaw.replace(/^#/, "").trim() : "";
1073
+ if (!docid) continue;
1074
+ const scoreRaw = item.score;
1075
+ const score = typeof scoreRaw === "number" ? scoreRaw : Number(scoreRaw);
1076
+ const snippet = typeof item.snippet === "string" ? item.snippet : "";
1077
+ out.push({
1078
+ docid,
1079
+ score: Number.isFinite(score) ? score : 0,
1080
+ snippet
1081
+ });
1082
+ }
1083
+ return out;
1084
+ }
1085
+ async readPartialText(absPath, from, lines) {
1086
+ const start = Math.max(1, from ?? 1);
1087
+ const count = Math.max(1, lines ?? Number.POSITIVE_INFINITY);
1088
+ let handle;
1089
+ try {
1090
+ handle = await fs.open(absPath);
1091
+ } catch (err) {
1092
+ if (isFileMissingError(err)) return { missing: true };
1093
+ throw err;
1094
+ }
1095
+ const stream = handle.createReadStream({ encoding: "utf-8" });
1096
+ const rl = readline.createInterface({
1097
+ input: stream,
1098
+ crlfDelay: Infinity
1099
+ });
1100
+ const selected = [];
1101
+ let index = 0;
1102
+ try {
1103
+ for await (const line of rl) {
1104
+ index += 1;
1105
+ if (index < start) continue;
1106
+ if (selected.length >= count) break;
1107
+ selected.push(line);
1108
+ }
1109
+ } finally {
1110
+ rl.close();
1111
+ await handle.close();
1112
+ }
1113
+ return {
1114
+ missing: false,
1115
+ text: selected.slice(0, count).join("\n")
1116
+ };
1117
+ }
1118
+ async readFullText(absPath) {
1119
+ try {
1120
+ return {
1121
+ missing: false,
1122
+ text: await fs.readFile(absPath, "utf-8")
1123
+ };
1124
+ } catch (err) {
1125
+ if (isFileMissingError(err)) return { missing: true };
1126
+ throw err;
1127
+ }
1128
+ }
1129
+ ensureDb() {
1130
+ if (this.db) return this.db;
1131
+ const { DatabaseSync } = requireNodeSqlite();
1132
+ this.db = new DatabaseSync(this.indexPath, { readOnly: true });
1133
+ this.db.exec("PRAGMA busy_timeout = 1000");
1134
+ return this.db;
1135
+ }
1136
+ async exportSessions() {
1137
+ if (!this.sessionExporter) return;
1138
+ const exportDir = this.sessionExporter.dir;
1139
+ await fs.mkdir(exportDir, { recursive: true });
1140
+ const files = await listSessionFilesForAgent(this.agentId);
1141
+ const keep = /* @__PURE__ */ new Set();
1142
+ const tracked = /* @__PURE__ */ new Set();
1143
+ const cutoff = this.sessionExporter.retentionMs ? Date.now() - this.sessionExporter.retentionMs : null;
1144
+ for (const sessionFile of files) {
1145
+ const entry = await buildSessionEntry(sessionFile);
1146
+ if (!entry) continue;
1147
+ if (cutoff && entry.mtimeMs < cutoff) continue;
1148
+ const targetName = `${path.basename(sessionFile, ".jsonl")}.md`;
1149
+ const target = path.join(exportDir, targetName);
1150
+ tracked.add(sessionFile);
1151
+ const state = this.exportedSessionState.get(sessionFile);
1152
+ if (!state || state.hash !== entry.hash || state.mtimeMs !== entry.mtimeMs) await writeFileWithinRoot({
1153
+ rootDir: exportDir,
1154
+ relativePath: targetName,
1155
+ data: this.renderSessionMarkdown(entry),
1156
+ encoding: "utf-8"
1157
+ });
1158
+ this.exportedSessionState.set(sessionFile, {
1159
+ hash: entry.hash,
1160
+ mtimeMs: entry.mtimeMs,
1161
+ target
1162
+ });
1163
+ keep.add(target);
1164
+ }
1165
+ const exported = await fs.readdir(exportDir).catch(() => []);
1166
+ for (const name of exported) {
1167
+ if (!name.endsWith(".md")) continue;
1168
+ const full = path.join(exportDir, name);
1169
+ if (!keep.has(full)) await fs.rm(full, { force: true });
1170
+ }
1171
+ for (const [sessionFile, state] of this.exportedSessionState) if (!tracked.has(sessionFile) || !state.target.startsWith(exportDir + path.sep)) this.exportedSessionState.delete(sessionFile);
1172
+ }
1173
+ renderSessionMarkdown(entry) {
1174
+ return `${`# Session ${path.basename(entry.absPath, path.extname(entry.absPath))}`}\n\n${entry.content?.trim().length ? entry.content.trim() : "(empty)"}\n`;
1175
+ }
1176
+ pickSessionCollectionName() {
1177
+ const existing = new Set(this.qmd.collections.map((collection) => collection.name));
1178
+ const base = `sessions-${this.sanitizeCollectionNameSegment(this.agentId)}`;
1179
+ if (!existing.has(base)) return base;
1180
+ let counter = 2;
1181
+ let candidate = `${base}-${counter}`;
1182
+ while (existing.has(candidate)) {
1183
+ counter += 1;
1184
+ candidate = `${base}-${counter}`;
1185
+ }
1186
+ return candidate;
1187
+ }
1188
+ sanitizeCollectionNameSegment(input) {
1189
+ return input.toLowerCase().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "") || "agent";
1190
+ }
1191
+ async resolveDocLocation(docid, hints) {
1192
+ const normalizedHints = this.normalizeDocHints(hints);
1193
+ if (!docid) return this.resolveDocLocationFromHints(normalizedHints);
1194
+ const normalized = docid.startsWith("#") ? docid.slice(1) : docid;
1195
+ if (!normalized) return null;
1196
+ const cacheKey = `${normalizedHints.preferredCollection ?? "*"}:${normalized}`;
1197
+ const cached = this.docPathCache.get(cacheKey);
1198
+ if (cached) return cached;
1199
+ const db = this.ensureDb();
1200
+ let rows = [];
1201
+ try {
1202
+ rows = db.prepare("SELECT collection, path FROM documents WHERE hash = ? AND active = 1").all(normalized);
1203
+ if (rows.length === 0) rows = db.prepare("SELECT collection, path FROM documents WHERE hash LIKE ? AND active = 1").all(`${normalized}%`);
1204
+ } catch (err) {
1205
+ if (this.isSqliteBusyError(err)) {
1206
+ log.debug(`qmd index is busy while resolving doc path: ${String(err)}`);
1207
+ throw this.createQmdBusyError(err);
1208
+ }
1209
+ throw err;
1210
+ }
1211
+ if (rows.length === 0) return null;
1212
+ const location = this.pickDocLocation(rows, normalizedHints);
1213
+ if (!location) return null;
1214
+ this.docPathCache.set(cacheKey, location);
1215
+ return location;
1216
+ }
1217
+ resolveDocLocationFromHints(hints) {
1218
+ if (!hints.preferredCollection || !hints.preferredFile) return null;
1219
+ const collectionRelativePath = this.toCollectionRelativePath(hints.preferredCollection, hints.preferredFile);
1220
+ if (!collectionRelativePath) return null;
1221
+ return this.toDocLocation(hints.preferredCollection, collectionRelativePath);
1222
+ }
1223
+ normalizeDocHints(hints) {
1224
+ const preferredCollection = hints?.preferredCollection?.trim();
1225
+ const preferredFile = hints?.preferredFile?.trim();
1226
+ if (!preferredFile) return preferredCollection ? { preferredCollection } : {};
1227
+ const parsedQmdFile = this.parseQmdFileUri(preferredFile);
1228
+ return {
1229
+ preferredCollection: parsedQmdFile?.collection ?? preferredCollection,
1230
+ preferredFile: parsedQmdFile?.collectionRelativePath ?? preferredFile
1231
+ };
1232
+ }
1233
+ parseQmdFileUri(fileRef) {
1234
+ if (!fileRef.toLowerCase().startsWith("qmd://")) return null;
1235
+ try {
1236
+ const parsed = new URL(fileRef);
1237
+ const collection = decodeURIComponent(parsed.hostname).trim();
1238
+ const pathname = decodeURIComponent(parsed.pathname).replace(/^\/+/, "").trim();
1239
+ if (!collection && !pathname) return null;
1240
+ return {
1241
+ collection: collection || void 0,
1242
+ collectionRelativePath: pathname || void 0
1243
+ };
1244
+ } catch {
1245
+ return null;
1246
+ }
1247
+ }
1248
+ toCollectionRelativePath(collection, filePath) {
1249
+ const root = this.collectionRoots.get(collection);
1250
+ if (!root) return null;
1251
+ const trimmedFilePath = filePath.trim();
1252
+ if (!trimmedFilePath) return null;
1253
+ const normalizedInput = path.normalize(trimmedFilePath);
1254
+ const absolutePath = path.isAbsolute(normalizedInput) ? normalizedInput : path.resolve(root.path, normalizedInput);
1255
+ if (!this.isWithinRoot(root.path, absolutePath)) return null;
1256
+ const relative = path.relative(root.path, absolutePath);
1257
+ if (!relative || relative === ".") return null;
1258
+ return relative.replace(/\\/g, "/");
1259
+ }
1260
+ pickDocLocation(rows, hints) {
1261
+ if (hints?.preferredCollection) for (const row of rows) {
1262
+ if (row.collection !== hints.preferredCollection) continue;
1263
+ const location = this.toDocLocation(row.collection, row.path);
1264
+ if (location) return location;
1265
+ }
1266
+ if (hints?.preferredFile) {
1267
+ const preferred = path.normalize(hints.preferredFile);
1268
+ for (const row of rows) {
1269
+ const rowPath = path.normalize(row.path);
1270
+ if (rowPath !== preferred && !rowPath.endsWith(path.sep + preferred)) continue;
1271
+ const location = this.toDocLocation(row.collection, row.path);
1272
+ if (location) return location;
1273
+ }
1274
+ }
1275
+ for (const row of rows) {
1276
+ const location = this.toDocLocation(row.collection, row.path);
1277
+ if (location) return location;
1278
+ }
1279
+ return null;
1280
+ }
1281
+ extractSnippetLines(snippet) {
1282
+ const match = SNIPPET_HEADER_RE.exec(snippet);
1283
+ if (match) {
1284
+ const start = Number(match[1]);
1285
+ const count = Number(match[2]);
1286
+ if (Number.isFinite(start) && Number.isFinite(count)) return {
1287
+ startLine: start,
1288
+ endLine: start + count - 1
1289
+ };
1290
+ }
1291
+ return {
1292
+ startLine: 1,
1293
+ endLine: snippet.split("\n").length
1294
+ };
1295
+ }
1296
+ readCounts() {
1297
+ try {
1298
+ const rows = this.ensureDb().prepare("SELECT collection, COUNT(*) as c FROM documents WHERE active = 1 GROUP BY collection").all();
1299
+ const bySource = /* @__PURE__ */ new Map();
1300
+ for (const source of this.sources) bySource.set(source, {
1301
+ files: 0,
1302
+ chunks: 0
1303
+ });
1304
+ let total = 0;
1305
+ for (const row of rows) {
1306
+ const source = this.collectionRoots.get(row.collection)?.kind ?? "memory";
1307
+ const entry = bySource.get(source) ?? {
1308
+ files: 0,
1309
+ chunks: 0
1310
+ };
1311
+ entry.files += row.c ?? 0;
1312
+ entry.chunks += row.c ?? 0;
1313
+ bySource.set(source, entry);
1314
+ total += row.c ?? 0;
1315
+ }
1316
+ return {
1317
+ totalDocuments: total,
1318
+ sourceCounts: Array.from(bySource.entries()).map(([source, value]) => ({
1319
+ source,
1320
+ files: value.files,
1321
+ chunks: value.chunks
1322
+ }))
1323
+ };
1324
+ } catch (err) {
1325
+ log.warn(`failed to read qmd index stats: ${String(err)}`);
1326
+ return {
1327
+ totalDocuments: 0,
1328
+ sourceCounts: Array.from(this.sources).map((source) => ({
1329
+ source,
1330
+ files: 0,
1331
+ chunks: 0
1332
+ }))
1333
+ };
1334
+ }
1335
+ }
1336
+ logScopeDenied(sessionKey) {
1337
+ const channel = deriveQmdScopeChannel(sessionKey) ?? "unknown";
1338
+ const chatType = deriveQmdScopeChatType(sessionKey) ?? "unknown";
1339
+ const key = sessionKey?.trim() || "<none>";
1340
+ log.warn(`qmd search denied by scope (channel=${channel}, chatType=${chatType}, session=${key})`);
1341
+ }
1342
+ isScopeAllowed(sessionKey) {
1343
+ return isQmdScopeAllowed(this.qmd.scope, sessionKey);
1344
+ }
1345
+ toDocLocation(collection, collectionRelativePath) {
1346
+ const root = this.collectionRoots.get(collection);
1347
+ if (!root) return null;
1348
+ const normalizedRelative = collectionRelativePath.replace(/\\/g, "/");
1349
+ const absPath = path.normalize(path.resolve(root.path, collectionRelativePath));
1350
+ const relativeToWorkspace = path.relative(this.workspaceDir, absPath);
1351
+ return {
1352
+ rel: this.buildSearchPath(collection, normalizedRelative, relativeToWorkspace, absPath),
1353
+ abs: absPath,
1354
+ source: root.kind
1355
+ };
1356
+ }
1357
+ buildSearchPath(collection, collectionRelativePath, relativeToWorkspace, absPath) {
1358
+ if (this.isInsideWorkspace(relativeToWorkspace)) {
1359
+ const normalized = relativeToWorkspace.replace(/\\/g, "/");
1360
+ if (!normalized) return path.basename(absPath);
1361
+ return normalized;
1362
+ }
1363
+ return `qmd/${collection}/${collectionRelativePath.replace(/^\/+/, "")}`;
1364
+ }
1365
+ isInsideWorkspace(relativePath) {
1366
+ if (!relativePath) return true;
1367
+ if (relativePath.startsWith("..")) return false;
1368
+ if (relativePath.startsWith(`..${path.sep}`)) return false;
1369
+ return !path.isAbsolute(relativePath);
1370
+ }
1371
+ resolveReadPath(relPath) {
1372
+ if (relPath.startsWith("qmd/")) {
1373
+ const [, collection, ...rest] = relPath.split("/");
1374
+ if (!collection || rest.length === 0) throw new Error("invalid qmd path");
1375
+ const root = this.collectionRoots.get(collection);
1376
+ if (!root) throw new Error(`unknown qmd collection: ${collection}`);
1377
+ const joined = rest.join("/");
1378
+ const resolved = path.resolve(root.path, joined);
1379
+ if (!this.isWithinRoot(root.path, resolved)) throw new Error("qmd path escapes collection");
1380
+ return resolved;
1381
+ }
1382
+ const absPath = path.resolve(this.workspaceDir, relPath);
1383
+ if (!this.isWithinWorkspace(absPath)) throw new Error("path escapes workspace");
1384
+ return absPath;
1385
+ }
1386
+ isWithinWorkspace(absPath) {
1387
+ const normalizedWorkspace = this.workspaceDir.endsWith(path.sep) ? this.workspaceDir : `${this.workspaceDir}${path.sep}`;
1388
+ if (absPath === this.workspaceDir) return true;
1389
+ return (absPath.endsWith(path.sep) ? absPath : `${absPath}${path.sep}`).startsWith(normalizedWorkspace);
1390
+ }
1391
+ isWithinRoot(root, candidate) {
1392
+ const normalizedRoot = root.endsWith(path.sep) ? root : `${root}${path.sep}`;
1393
+ if (candidate === root) return true;
1394
+ return (candidate.endsWith(path.sep) ? candidate : `${candidate}${path.sep}`).startsWith(normalizedRoot);
1395
+ }
1396
+ clampResultsByInjectedChars(results) {
1397
+ const budget = this.qmd.limits.maxInjectedChars;
1398
+ if (!budget || budget <= 0) return results;
1399
+ let remaining = budget;
1400
+ const clamped = [];
1401
+ for (const entry of results) {
1402
+ if (remaining <= 0) break;
1403
+ const snippet = entry.snippet ?? "";
1404
+ if (snippet.length <= remaining) {
1405
+ clamped.push(entry);
1406
+ remaining -= snippet.length;
1407
+ } else {
1408
+ const trimmed = snippet.slice(0, Math.max(0, remaining));
1409
+ clamped.push({
1410
+ ...entry,
1411
+ snippet: trimmed
1412
+ });
1413
+ break;
1414
+ }
1415
+ }
1416
+ return clamped;
1417
+ }
1418
+ diversifyResultsBySource(results, limit) {
1419
+ const target = Math.max(0, limit);
1420
+ if (target <= 0) return [];
1421
+ if (results.length <= 1) return results.slice(0, target);
1422
+ const bySource = /* @__PURE__ */ new Map();
1423
+ for (const entry of results) {
1424
+ const list = bySource.get(entry.source) ?? [];
1425
+ list.push(entry);
1426
+ bySource.set(entry.source, list);
1427
+ }
1428
+ const hasSessions = bySource.has("sessions");
1429
+ const hasMemory = bySource.has("memory");
1430
+ if (!hasSessions || !hasMemory) return results.slice(0, target);
1431
+ const sourceOrder = Array.from(bySource.entries()).toSorted((a, b) => (b[1][0]?.score ?? 0) - (a[1][0]?.score ?? 0)).map(([source]) => source);
1432
+ const diversified = [];
1433
+ while (diversified.length < target) {
1434
+ let emitted = false;
1435
+ for (const source of sourceOrder) {
1436
+ const next = bySource.get(source)?.shift();
1437
+ if (!next) continue;
1438
+ diversified.push(next);
1439
+ emitted = true;
1440
+ if (diversified.length >= target) break;
1441
+ }
1442
+ if (!emitted) break;
1443
+ }
1444
+ return diversified;
1445
+ }
1446
+ shouldSkipUpdate(force) {
1447
+ if (force) return false;
1448
+ const debounceMs = this.qmd.update.debounceMs;
1449
+ if (debounceMs <= 0) return false;
1450
+ if (!this.lastUpdateAt) return false;
1451
+ return Date.now() - this.lastUpdateAt < debounceMs;
1452
+ }
1453
+ isSqliteBusyError(err) {
1454
+ const normalized = (err instanceof Error ? err.message : String(err)).toLowerCase();
1455
+ return normalized.includes("sqlite_busy") || normalized.includes("database is locked");
1456
+ }
1457
+ isUnsupportedQmdOptionError(err) {
1458
+ const normalized = (err instanceof Error ? err.message : String(err)).toLowerCase();
1459
+ return normalized.includes("unknown flag") || normalized.includes("unknown option") || normalized.includes("unrecognized option") || normalized.includes("flag provided but not defined") || normalized.includes("unexpected argument");
1460
+ }
1461
+ createQmdBusyError(err) {
1462
+ const message = err instanceof Error ? err.message : String(err);
1463
+ return /* @__PURE__ */ new Error(`qmd index busy while reading results: ${message}`);
1464
+ }
1465
+ async waitForPendingUpdateBeforeSearch() {
1466
+ const pending = this.pendingUpdate;
1467
+ if (!pending) return;
1468
+ await Promise.race([pending.catch(() => void 0), new Promise((resolve) => setTimeout(resolve, SEARCH_PENDING_UPDATE_WAIT_MS))]);
1469
+ }
1470
+ async runQueryAcrossCollections(query, limit, collectionNames, command) {
1471
+ log.debug(`qmd ${command} multi-collection workaround active (${collectionNames.length} collections)`);
1472
+ const bestByResultKey = /* @__PURE__ */ new Map();
1473
+ for (const collectionName of collectionNames) {
1474
+ const args = this.buildSearchArgs(command, query, limit);
1475
+ args.push("-c", collectionName);
1476
+ const result = await this.runQmd(args, { timeoutMs: this.qmd.limits.timeoutMs });
1477
+ const parsed = parseQmdQueryJson(result.stdout, result.stderr);
1478
+ for (const entry of parsed) {
1479
+ const normalizedHints = this.normalizeDocHints({
1480
+ preferredCollection: entry.collection ?? collectionName,
1481
+ preferredFile: entry.file
1482
+ });
1483
+ const normalizedDocId = typeof entry.docid === "string" && entry.docid.trim().length > 0 ? entry.docid : void 0;
1484
+ const withCollection = {
1485
+ ...entry,
1486
+ docid: normalizedDocId,
1487
+ collection: normalizedHints.preferredCollection ?? entry.collection ?? collectionName,
1488
+ file: normalizedHints.preferredFile ?? entry.file
1489
+ };
1490
+ const resultKey = this.buildQmdResultKey(withCollection);
1491
+ if (!resultKey) continue;
1492
+ const prev = bestByResultKey.get(resultKey);
1493
+ const prevScore = typeof prev?.score === "number" ? prev.score : Number.NEGATIVE_INFINITY;
1494
+ const nextScore = typeof withCollection.score === "number" ? withCollection.score : Number.NEGATIVE_INFINITY;
1495
+ if (!prev || nextScore > prevScore) bestByResultKey.set(resultKey, withCollection);
1496
+ }
1497
+ }
1498
+ return [...bestByResultKey.values()].toSorted((a, b) => (b.score ?? 0) - (a.score ?? 0));
1499
+ }
1500
+ buildQmdResultKey(entry) {
1501
+ if (typeof entry.docid === "string" && entry.docid.trim().length > 0) return `docid:${entry.docid}`;
1502
+ const hints = this.normalizeDocHints({
1503
+ preferredCollection: entry.collection,
1504
+ preferredFile: entry.file
1505
+ });
1506
+ if (!hints.preferredCollection || !hints.preferredFile) return null;
1507
+ const collectionRelativePath = this.toCollectionRelativePath(hints.preferredCollection, hints.preferredFile);
1508
+ if (!collectionRelativePath) return null;
1509
+ return `file:${hints.preferredCollection}:${collectionRelativePath}`;
1510
+ }
1511
+ async runMcporterAcrossCollections(params) {
1512
+ const bestByDocId = /* @__PURE__ */ new Map();
1513
+ for (const collectionName of params.collectionNames) {
1514
+ const parsed = await this.runQmdSearchViaMcporter({
1515
+ mcporter: this.qmd.mcporter,
1516
+ tool: params.tool,
1517
+ query: params.query,
1518
+ limit: params.limit,
1519
+ minScore: params.minScore,
1520
+ collection: collectionName,
1521
+ timeoutMs: this.qmd.limits.timeoutMs
1522
+ });
1523
+ for (const entry of parsed) {
1524
+ if (typeof entry.docid !== "string" || !entry.docid.trim()) continue;
1525
+ const prev = bestByDocId.get(entry.docid);
1526
+ const prevScore = typeof prev?.score === "number" ? prev.score : Number.NEGATIVE_INFINITY;
1527
+ const nextScore = typeof entry.score === "number" ? entry.score : Number.NEGATIVE_INFINITY;
1528
+ if (!prev || nextScore > prevScore) bestByDocId.set(entry.docid, entry);
1529
+ }
1530
+ }
1531
+ return [...bestByDocId.values()].toSorted((a, b) => (b.score ?? 0) - (a.score ?? 0));
1532
+ }
1533
+ listManagedCollectionNames() {
1534
+ return this.managedCollectionNames;
1535
+ }
1536
+ computeManagedCollectionNames() {
1537
+ const seen = /* @__PURE__ */ new Set();
1538
+ const names = [];
1539
+ for (const collection of this.qmd.collections) {
1540
+ const name = collection.name?.trim();
1541
+ if (!name || seen.has(name)) continue;
1542
+ seen.add(name);
1543
+ names.push(name);
1544
+ }
1545
+ return names;
1546
+ }
1547
+ buildCollectionFilterArgs(collectionNames) {
1548
+ if (collectionNames.length === 0) return [];
1549
+ return collectionNames.filter(Boolean).flatMap((name) => ["-c", name]);
1550
+ }
1551
+ buildSearchArgs(command, query, limit) {
1552
+ const normalizedQuery = command === "search" ? normalizeHanBm25Query(query) : query;
1553
+ if (command === "query") return [
1554
+ "query",
1555
+ normalizedQuery,
1556
+ "--json",
1557
+ "-n",
1558
+ String(limit)
1559
+ ];
1560
+ return [
1561
+ command,
1562
+ normalizedQuery,
1563
+ "--json",
1564
+ "-n",
1565
+ String(limit)
1566
+ ];
1567
+ }
1568
+ };
1569
+ //#endregion
1570
+ export { QmdMemoryManager };