@spacebar_ai/moldclaw-core 2026.3.14 → 2026.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1074) hide show
  1. package/README.md +108 -3
  2. package/dist/account-id-plS5L20e.d.ts +1 -0
  3. package/dist/accounts-BAYVGC2k.js +109 -0
  4. package/dist/accounts-DrjRgReV.d.ts +103 -0
  5. package/dist/acp-cli-at_UYEOS.js +2088 -0
  6. package/dist/acpx-Chy1GQ_k.d.ts +5 -0
  7. package/dist/actions.runtime-C0F7dMfO.js +114 -0
  8. package/dist/actions.runtime-caI2LG9o.js +128 -0
  9. package/dist/agent-media-payload-CkpAqaOh.d.ts +16 -0
  10. package/dist/agents-B98yPGc5.js +853 -0
  11. package/dist/agents-BrLr08L3.js +217 -0
  12. package/dist/allow-from-BIwT4dl7.d.ts +42 -0
  13. package/dist/allow-list-CHt7yvAf.js +81 -0
  14. package/dist/allowlist-CxQo2wQc.js +142 -0
  15. package/dist/allowlist-resolution-B7ib7gye.d.ts +17 -0
  16. package/dist/api-Co7TNHbL.js +6953 -0
  17. package/dist/api-cEQ_ql_8.js +112 -0
  18. package/dist/audit-AnKnnlaZ.js +787 -0
  19. package/dist/audit-channel.collect.runtime-CAk1DFQ3.js +600 -0
  20. package/dist/audit-channel.runtime-5phdZp_m.js +116 -0
  21. package/dist/audit-extra.async-B8ZXFxic.js +813 -0
  22. package/dist/audit-hdKa3D-u.js +54 -0
  23. package/dist/audit-membership-runtime-CJV5XvGU.js +157 -0
  24. package/dist/audit.deep.runtime-DNMcRQrp.js +24 -0
  25. package/dist/audit.nondeep.runtime-DhNDL6yM.js +831 -0
  26. package/dist/audit.runtime-Bx7uWEh8.js +113 -0
  27. package/dist/auth-choice-C37W9MA7.js +268 -0
  28. package/dist/auth-choice-CNppOY_V.js +117 -0
  29. package/dist/auth-choice-XYFnp6fI.js +502 -0
  30. package/dist/auth-choice-options-D6oZY4Xo.js +123 -0
  31. package/dist/auth-choice-prompt-BhRqchJx.js +110 -0
  32. package/dist/auth-choice-prompt-C1xv0N08.js +36 -0
  33. package/dist/auth-choice.plugin-providers.runtime-DhLEtbmR.js +114 -0
  34. package/dist/auth-profiles-9zZdaXJK.js +127756 -0
  35. package/dist/auth-profiles.runtime-HONFDgiu.js +111 -0
  36. package/dist/bluebubbles-BY8JhO4y.js +64 -0
  37. package/dist/bluebubbles-CQjEnzK_.d.ts +6 -0
  38. package/dist/bluebubbles-RmcKgkBa.d.ts +45 -0
  39. package/dist/boolean-param-F1sMwnPu.d.ts +5 -0
  40. package/dist/bot-BGh-ATV7.d.ts +478 -0
  41. package/dist/brave-CljenznH.js +24 -0
  42. package/dist/browser-cli-CX8i0wf0.js +1492 -0
  43. package/dist/build-info.json +3 -3
  44. package/dist/bundled/boot-md/handler.d.ts +6 -0
  45. package/dist/bundled/boot-md/handler.js +26 -26
  46. package/dist/bundled/bootstrap-extra-files/handler.d.ts +6 -0
  47. package/dist/bundled/command-logger/handler.d.ts +9 -0
  48. package/dist/bundled/session-memory/handler.d.ts +9 -0
  49. package/dist/bundled/session-memory/handler.js +27 -27
  50. package/dist/call-Bc257L16.js +37 -0
  51. package/dist/call-DYFR7oGy.js +639 -0
  52. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  53. package/dist/channel-Bd-igGEW.js +803 -0
  54. package/dist/channel-BgRMb6bZ.js +575 -0
  55. package/dist/channel-BtcLrU6J.js +1598 -0
  56. package/dist/channel-Bwf6m_hD.js +538 -0
  57. package/dist/channel-C7-kgDBd.js +562 -0
  58. package/dist/channel-CEXOAxIc.js +949 -0
  59. package/dist/channel-CpZ3p9MJ.js +226 -0
  60. package/dist/channel-CqBlN6A2.js +619 -0
  61. package/dist/channel-DKhfHW4U.js +352 -0
  62. package/dist/channel-DS3t_KdJ2.js +316 -0
  63. package/dist/channel-DY24FA1v.js +4681 -0
  64. package/dist/channel-DYFGmImJ.js +542 -0
  65. package/dist/channel-DcyIqX5p.js +207 -0
  66. package/dist/channel-J-2XcAli.js +214 -0
  67. package/dist/channel-N616f4gZ.js +306 -0
  68. package/dist/channel-NY7aU2Gj.js +397 -0
  69. package/dist/channel-PNI8BOmm.js +1321 -0
  70. package/dist/channel-UcXepDJs.js +943 -0
  71. package/dist/channel-account-context-CL3hEq1j.js +103 -0
  72. package/dist/channel-config-schema-Q2nzcCCR.d.ts +1 -0
  73. package/dist/channel-jA_jodJo.js +920 -0
  74. package/dist/channel-options-CtgU5qkG.js +50 -0
  75. package/dist/channel-policy-7wXDp6d3.d.ts +1 -0
  76. package/dist/channel-rGI8uig4.js +497 -0
  77. package/dist/channel-summary-DGJZXo0r.js +106 -0
  78. package/dist/channel.runtime--WZvlNJM.js +413 -0
  79. package/dist/channel.runtime-B0ct42DL.js +122 -0
  80. package/dist/channel.runtime-BEZUZrYB.js +177 -0
  81. package/dist/channel.runtime-BMuWmsIC.js +166 -0
  82. package/dist/channel.runtime-BtvHP0po.js +4006 -0
  83. package/dist/channel.runtime-Cwf993pX.js +194 -0
  84. package/dist/channel.runtime-Cy4lEpTX.js +174 -0
  85. package/dist/channel.runtime-DAz6axda.js +865 -0
  86. package/dist/channel.runtime-DdQ2mOVh.js +236 -0
  87. package/dist/channel.runtime-Dy3HPgOU.js +399 -0
  88. package/dist/channel.runtime-iqfC25k7.js +213 -0
  89. package/dist/channel.setup-B4VYMZlQ.js +9 -0
  90. package/dist/channel.setup-BohGbCbI.js +57 -0
  91. package/dist/channel.setup-Bq2AQqqc.js +6 -0
  92. package/dist/channel.setup-BxiSfLp1.js +8 -0
  93. package/dist/channel.setup-DOUS6fjO.js +8 -0
  94. package/dist/channel.setup-DXhdYU3g.js +9 -0
  95. package/dist/channel.setup-N51CgfNy.js +11 -0
  96. package/dist/channels/plugins/actions/discord.d.ts +3 -0
  97. package/dist/channels/plugins/actions/discord.js +26 -26
  98. package/dist/channels/plugins/actions/signal.d.ts +2 -0
  99. package/dist/channels/plugins/actions/signal.js +26 -26
  100. package/dist/channels/plugins/actions/telegram.d.ts +3 -0
  101. package/dist/channels/plugins/actions/telegram.js +26 -26
  102. package/dist/channels/plugins/agent-tools/whatsapp-login.d.ts +4 -0
  103. package/dist/channels/plugins/agent-tools/whatsapp-login.js +26 -26
  104. package/dist/channels-CueeFf0q.js +404 -0
  105. package/dist/channels-PheAd73E.js +1113 -0
  106. package/dist/channels-cli-CXzVF84v.js +286 -0
  107. package/dist/channels-status-issues-BjWBQHhU.js +16 -0
  108. package/dist/chat-type-BlSN0vo4.d.ts +5 -0
  109. package/dist/clawbot-cli-BBehDXW1.js +113 -0
  110. package/dist/cli/daemon-cli.d.ts +58 -0
  111. package/dist/cli/daemon-cli.js +1 -1
  112. package/dist/cli-CIm7d5Id.js +149 -0
  113. package/dist/command-format-pq3tS8t2.d.ts +4 -0
  114. package/dist/command-registry-CDkp__KH.js +13 -0
  115. package/dist/command-registry-DSEkUBW1.js +212 -0
  116. package/dist/command-secret-gateway-CqP_o0n8.js +106 -0
  117. package/dist/compact.runtime-Qm_csEtG.js +111 -0
  118. package/dist/completion-cli-Ch1sgSLQ.js +445 -0
  119. package/dist/completion-cli-vF067Tso.js +16 -0
  120. package/dist/config-B2W1zTP1.js +44 -0
  121. package/dist/config-CMhKplgO.js +938 -0
  122. package/dist/config-DchtRsvs.js +30 -0
  123. package/dist/config-cli-C41d88_c.js +428 -0
  124. package/dist/config-guard-B_vjkXCQ.js +117 -0
  125. package/dist/config-schema-pPBCF4hz.js +31 -0
  126. package/dist/config-validation-6om9cBUx.js +262 -0
  127. package/dist/config-value-Dl3XEpA6.js +132 -0
  128. package/dist/configure-BxzvDSzu.js +1100 -0
  129. package/dist/configure-CLMLoWAn.js +238 -0
  130. package/dist/control-ui-shared-E8Nz6uKZ.js +29 -0
  131. package/dist/core-Cd3fMFKq.d.ts +87 -0
  132. package/dist/credentials-yYt6VWCq.js +268 -0
  133. package/dist/cron-cli-CA3lV3kh.js +634 -0
  134. package/dist/daemon-cli-BtQuIXEk.js +339 -0
  135. package/dist/daemon-install-BWKGzgMm.js +175 -0
  136. package/dist/deliver-CgMNmfTy.js +106 -0
  137. package/dist/deliver-runtime-Bn1KWoiQ.js +106 -0
  138. package/dist/devices-cli-D601npiL.js +340 -0
  139. package/dist/diagnostic-CkiYEGqt.js +310 -0
  140. package/dist/diffs-B5tZ8Coj.d.ts +1 -0
  141. package/dist/directory-cli-skEV8MT7.js +306 -0
  142. package/dist/directory-config-helpers-B-tiBKIv.d.ts +38 -0
  143. package/dist/directory-runtime-BEJ2fCIR.d.ts +1 -0
  144. package/dist/directory.static-CnyzoWbV.js +44 -0
  145. package/dist/discord-B_gbzPti.js +109 -0
  146. package/dist/discovery-CqI-e_Mv.js +48 -0
  147. package/dist/dm-policy-shared-nybkS1uP.d.ts +95 -0
  148. package/dist/dns-cli-Cjes3Ruw.js +216 -0
  149. package/dist/docs-cli-C3g3Gi_d.js +173 -0
  150. package/dist/doctor-completion-TvgV4SZH.js +90 -0
  151. package/dist/doctor-config-flow-0w9Ux7V8.js +107 -0
  152. package/dist/doctor-config-flow-DLzr8W7Y.js +2437 -0
  153. package/dist/enable-VYzv8b2z.js +24 -0
  154. package/dist/entry.d.ts +7 -0
  155. package/dist/entry.js +1 -1
  156. package/dist/env-overrides-DYVIkuvN.js +434 -0
  157. package/dist/env-overrides.runtime-6kijpIuu.js +17 -0
  158. package/dist/exec-approvals-cli-D_lkTG-l.js +419 -0
  159. package/dist/exec-sVmouhA9.d.ts +39 -0
  160. package/dist/extensions/acpx/index.d.ts +11 -0
  161. package/dist/extensions/acpx/index.js +1 -1
  162. package/dist/extensions/amazon-bedrock/index.d.ts +11 -0
  163. package/dist/extensions/anthropic/index.d.ts +11 -0
  164. package/dist/extensions/anthropic/index.js +26 -26
  165. package/dist/extensions/bluebubbles/index.d.ts +11 -0
  166. package/dist/extensions/bluebubbles/index.js +30 -30
  167. package/dist/extensions/bluebubbles/setup-entry.d.ts +59 -0
  168. package/dist/extensions/bluebubbles/setup-entry.js +30 -30
  169. package/dist/extensions/brave/index.d.ts +11 -0
  170. package/dist/extensions/brave/index.js +2 -2
  171. package/dist/extensions/byteplus/index.d.ts +11 -0
  172. package/dist/extensions/byteplus/index.js +26 -26
  173. package/dist/extensions/cloudflare-ai-gateway/index.d.ts +11 -0
  174. package/dist/extensions/cloudflare-ai-gateway/index.js +27 -27
  175. package/dist/extensions/copilot-proxy/index.d.ts +11 -0
  176. package/dist/extensions/device-pair/index.d.ts +12 -0
  177. package/dist/extensions/diagnostics-otel/index.d.ts +11 -0
  178. package/dist/extensions/diffs/index.d.ts +11 -0
  179. package/dist/extensions/discord/index.d.ts +11 -0
  180. package/dist/extensions/discord/index.js +31 -31
  181. package/dist/extensions/discord/setup-entry.d.ts +7 -0
  182. package/dist/extensions/discord/setup-entry.js +29 -29
  183. package/dist/extensions/elevenlabs/index.d.ts +11 -0
  184. package/dist/extensions/elevenlabs/index.js +26 -26
  185. package/dist/extensions/feishu/index.d.ts +229 -0
  186. package/dist/extensions/feishu/index.js +31 -31
  187. package/dist/extensions/feishu/setup-entry.d.ts +9 -0
  188. package/dist/extensions/feishu/setup-entry.js +28 -28
  189. package/dist/extensions/firecrawl/index.d.ts +11 -0
  190. package/dist/extensions/firecrawl/index.js +26 -26
  191. package/dist/extensions/github-copilot/index.d.ts +11 -0
  192. package/dist/extensions/github-copilot/index.js +27 -27
  193. package/dist/extensions/google/index.d.ts +11 -0
  194. package/dist/extensions/google/index.js +26 -26
  195. package/dist/extensions/googlechat/index.d.ts +11 -0
  196. package/dist/extensions/googlechat/index.js +30 -30
  197. package/dist/extensions/googlechat/setup-entry.d.ts +19 -0
  198. package/dist/extensions/googlechat/setup-entry.js +30 -30
  199. package/dist/extensions/huggingface/index.d.ts +11 -0
  200. package/dist/extensions/huggingface/index.js +26 -26
  201. package/dist/extensions/imessage/index.d.ts +11 -0
  202. package/dist/extensions/imessage/index.js +30 -30
  203. package/dist/extensions/imessage/setup-entry.d.ts +7 -0
  204. package/dist/extensions/imessage/setup-entry.js +30 -30
  205. package/dist/extensions/irc/index.d.ts +11 -0
  206. package/dist/extensions/irc/index.js +29 -29
  207. package/dist/extensions/irc/setup-entry.d.ts +8 -0
  208. package/dist/extensions/irc/setup-entry.js +29 -29
  209. package/dist/extensions/kakao-talkchannel/index.d.ts +19 -0
  210. package/dist/extensions/kakao-talkchannel/index.js +1762 -0
  211. package/dist/extensions/kakao-talkchannel/moldclaw.plugin.json +111 -0
  212. package/dist/extensions/kakao-talkchannel/package.json +12 -0
  213. package/dist/extensions/kilocode/index.d.ts +11 -0
  214. package/dist/extensions/kilocode/index.js +26 -26
  215. package/dist/extensions/kimi-coding/index.d.ts +11 -0
  216. package/dist/extensions/kimi-coding/index.js +26 -26
  217. package/dist/extensions/line/index.d.ts +11 -0
  218. package/dist/extensions/line/index.js +28 -28
  219. package/dist/extensions/line/setup-entry.d.ts +7 -0
  220. package/dist/extensions/line/setup-entry.js +28 -28
  221. package/dist/extensions/llm-task/index.d.ts +11 -0
  222. package/dist/extensions/llm-task/index.js +28 -28
  223. package/dist/extensions/lobster/index.d.ts +11 -0
  224. package/dist/extensions/matrix/index.d.ts +11 -0
  225. package/dist/extensions/matrix/index.js +31 -31
  226. package/dist/extensions/matrix/setup-entry.d.ts +20 -0
  227. package/dist/extensions/matrix/setup-entry.js +31 -31
  228. package/dist/extensions/mattermost/index.d.ts +11 -0
  229. package/dist/extensions/mattermost/index.js +28 -28
  230. package/dist/extensions/mattermost/setup-entry.d.ts +88 -0
  231. package/dist/extensions/mattermost/setup-entry.js +28 -28
  232. package/dist/extensions/memory-core/index.d.ts +11 -0
  233. package/dist/extensions/memory-lancedb/index.d.ts +25 -0
  234. package/dist/extensions/microsoft/index.d.ts +11 -0
  235. package/dist/extensions/microsoft/index.js +26 -26
  236. package/dist/extensions/minimax/index.d.ts +11 -0
  237. package/dist/extensions/minimax/index.js +26 -26
  238. package/dist/extensions/mistral/index.d.ts +11 -0
  239. package/dist/extensions/mistral/index.js +26 -26
  240. package/dist/extensions/modelstudio/index.d.ts +11 -0
  241. package/dist/extensions/modelstudio/index.js +26 -26
  242. package/dist/extensions/moonshot/index.d.ts +11 -0
  243. package/dist/extensions/moonshot/index.js +26 -26
  244. package/dist/extensions/msteams/index.d.ts +11 -0
  245. package/dist/extensions/msteams/index.js +31 -31
  246. package/dist/extensions/msteams/setup-entry.d.ts +11 -0
  247. package/dist/extensions/msteams/setup-entry.js +31 -31
  248. package/dist/extensions/nextcloud-talk/index.d.ts +11 -0
  249. package/dist/extensions/nextcloud-talk/index.js +28 -28
  250. package/dist/extensions/nextcloud-talk/setup-entry.d.ts +60 -0
  251. package/dist/extensions/nextcloud-talk/setup-entry.js +28 -28
  252. package/dist/extensions/nostr/index.d.ts +11 -0
  253. package/dist/extensions/nostr/index.js +28 -28
  254. package/dist/extensions/nostr/setup-entry.d.ts +49 -0
  255. package/dist/extensions/nostr/setup-entry.js +28 -28
  256. package/dist/extensions/nvidia/index.d.ts +11 -0
  257. package/dist/extensions/ollama/index.d.ts +11 -0
  258. package/dist/extensions/open-prose/index.d.ts +11 -0
  259. package/dist/extensions/openai/index.d.ts +11 -0
  260. package/dist/extensions/openai/index.js +26 -26
  261. package/dist/extensions/opencode/index.d.ts +11 -0
  262. package/dist/extensions/opencode/index.js +26 -26
  263. package/dist/extensions/opencode-go/index.d.ts +11 -0
  264. package/dist/extensions/opencode-go/index.js +26 -26
  265. package/dist/extensions/openrouter/index.d.ts +11 -0
  266. package/dist/extensions/openrouter/index.js +26 -26
  267. package/dist/extensions/openshell/index.d.ts +11 -0
  268. package/dist/extensions/openshell/index.js +26 -26
  269. package/dist/extensions/perplexity/index.d.ts +11 -0
  270. package/dist/extensions/perplexity/index.js +2 -2
  271. package/dist/extensions/phone-control/index.d.ts +12 -0
  272. package/dist/extensions/qianfan/index.d.ts +11 -0
  273. package/dist/extensions/qianfan/index.js +26 -26
  274. package/dist/extensions/qwen-portal-auth/index.d.ts +12 -0
  275. package/dist/extensions/qwen-portal-auth/index.js +26 -26
  276. package/dist/extensions/sglang/index.d.ts +11 -0
  277. package/dist/extensions/sglang/index.js +26 -26
  278. package/dist/extensions/signal/index.d.ts +11 -0
  279. package/dist/extensions/signal/index.js +29 -29
  280. package/dist/extensions/signal/setup-entry.d.ts +7 -0
  281. package/dist/extensions/signal/setup-entry.js +29 -29
  282. package/dist/extensions/slack/index.d.ts +11 -0
  283. package/dist/extensions/slack/index.js +30 -30
  284. package/dist/extensions/slack/setup-entry.d.ts +7 -0
  285. package/dist/extensions/slack/setup-entry.js +29 -29
  286. package/dist/extensions/synology-chat/index.d.ts +11 -0
  287. package/dist/extensions/synology-chat/index.js +28 -28
  288. package/dist/extensions/synology-chat/setup-entry.d.ts +138 -0
  289. package/dist/extensions/synology-chat/setup-entry.js +28 -28
  290. package/dist/extensions/synthetic/index.d.ts +11 -0
  291. package/dist/extensions/synthetic/index.js +26 -26
  292. package/dist/extensions/talk-voice/index.d.ts +12 -0
  293. package/dist/extensions/talk-voice/index.js +26 -26
  294. package/dist/extensions/telegram/index.d.ts +11 -0
  295. package/dist/extensions/telegram/index.js +29 -29
  296. package/dist/extensions/telegram/setup-entry.d.ts +7 -0
  297. package/dist/extensions/telegram/setup-entry.js +28 -28
  298. package/dist/extensions/thread-ownership/index.d.ts +12 -0
  299. package/dist/extensions/tlon/index.d.ts +11 -0
  300. package/dist/extensions/tlon/index.js +28 -28
  301. package/dist/extensions/tlon/setup-entry.d.ts +7 -0
  302. package/dist/extensions/tlon/setup-entry.js +28 -28
  303. package/dist/extensions/together/index.d.ts +11 -0
  304. package/dist/extensions/together/index.js +26 -26
  305. package/dist/extensions/twitch/index.d.ts +39 -0
  306. package/dist/extensions/twitch/index.js +28 -28
  307. package/dist/extensions/venice/index.d.ts +11 -0
  308. package/dist/extensions/venice/index.js +26 -26
  309. package/dist/extensions/vercel-ai-gateway/index.d.ts +11 -0
  310. package/dist/extensions/vercel-ai-gateway/index.js +26 -26
  311. package/dist/extensions/vllm/index.d.ts +11 -0
  312. package/dist/extensions/vllm/index.js +26 -26
  313. package/dist/extensions/voice-call/index.d.ts +11 -0
  314. package/dist/extensions/voice-call/index.js +26 -26
  315. package/dist/extensions/volcengine/index.d.ts +11 -0
  316. package/dist/extensions/volcengine/index.js +26 -26
  317. package/dist/extensions/whatsapp/index.d.ts +11 -0
  318. package/dist/extensions/whatsapp/index.js +29 -29
  319. package/dist/extensions/whatsapp/setup-entry.d.ts +7 -0
  320. package/dist/extensions/whatsapp/setup-entry.js +29 -29
  321. package/dist/extensions/xai/index.d.ts +11 -0
  322. package/dist/extensions/xai/index.js +26 -26
  323. package/dist/extensions/xiaomi/index.d.ts +11 -0
  324. package/dist/extensions/xiaomi/index.js +26 -26
  325. package/dist/extensions/zai/index.d.ts +11 -0
  326. package/dist/extensions/zai/index.js +26 -26
  327. package/dist/extensions/zalo/index.d.ts +11 -0
  328. package/dist/extensions/zalo/index.js +30 -30
  329. package/dist/extensions/zalo/setup-entry.d.ts +34 -0
  330. package/dist/extensions/zalo/setup-entry.js +30 -30
  331. package/dist/extensions/zalouser/index.d.ts +11 -0
  332. package/dist/extensions/zalouser/index.js +31 -31
  333. package/dist/extensions/zalouser/setup-entry.d.ts +42 -0
  334. package/dist/extensions/zalouser/setup-entry.js +31 -31
  335. package/dist/feishu-DCKEC3ao.d.ts +36 -0
  336. package/dist/gateway-cli-DN1Ii6J-.js +26432 -0
  337. package/dist/gateway-install-token-CJYFJBaC.js +163 -0
  338. package/dist/gateway-rpc-CroQg9MB.js +26 -0
  339. package/dist/gateway-runtime-D9FRZqKP.js +69 -0
  340. package/dist/googlechat-CBCkerAy.js +307 -0
  341. package/dist/googlechat-CSUNieHX.d.ts +12 -0
  342. package/dist/group-access-rSvkIglb.d.ts +61 -0
  343. package/dist/health-B6WwLJp4.js +570 -0
  344. package/dist/health-CAlJydXv.js +108 -0
  345. package/dist/history-BwNxb0sJ.d.ts +75 -0
  346. package/dist/hooks-BYlfU3Nf.d.ts +6 -0
  347. package/dist/hooks-cli-DuKmdo_H.js +995 -0
  348. package/dist/http-registry-DX_LVtuK.d.ts +20 -0
  349. package/dist/image-generation-DKkdRpve.d.ts +9 -0
  350. package/dist/imessage-7abjbe2Q.js +31 -0
  351. package/dist/imessage-DOH1yaDE.js +110 -0
  352. package/dist/inbound-envelope-CmvweL6U.d.ts +78 -0
  353. package/dist/inbound-reply-dispatch-BvnKTOec.js +71 -0
  354. package/dist/inbound-reply-dispatch-C7LjHRZN.d.ts +72 -0
  355. package/dist/index-DTQqfqj9.d.ts +1 -0
  356. package/dist/index.d.ts +27 -0
  357. package/dist/index.js +2 -2
  358. package/dist/infra/warning-filter.d.ts +10 -0
  359. package/dist/install-target-tXRD7VkM.js +574 -0
  360. package/dist/installs-C8fz8sm3.js +532 -0
  361. package/dist/io-C6XifaT4.js +9737 -0
  362. package/dist/io-C8awRnSW.js +28 -0
  363. package/dist/ipv4-d88_Jn2p.js +82 -0
  364. package/dist/irc-DpR6FXjN.js +672 -0
  365. package/dist/json-store-Sr_kk-II.d.ts +14 -0
  366. package/dist/keyed-async-queue-BA3BKukE.d.ts +19 -0
  367. package/dist/library-DOwowAGN.js +107 -0
  368. package/dist/lifecycle-core-BHHBoRTY.js +382 -0
  369. package/dist/line/accounts.d.ts +3 -0
  370. package/dist/line/send.d.ts +2 -0
  371. package/dist/line/send.js +4 -4
  372. package/dist/line/template-messages.d.ts +2 -0
  373. package/dist/line-8rsNbJCP.js +530 -0
  374. package/dist/line-D_cvIf6B.d.ts +75 -0
  375. package/dist/links-BOnvOj1z.d.ts +7 -0
  376. package/dist/llm-slug-generator-D9HjWtJT.js +67 -0
  377. package/dist/llm-slug-generator.d.ts +12 -0
  378. package/dist/llm-slug-generator.js +27 -27
  379. package/dist/logging-BhqLWxTD.js +13 -0
  380. package/dist/logging-DfaiL4OX.js +29 -0
  381. package/dist/login-qr-COBYR52w.js +233 -0
  382. package/dist/login-qr-xK4QIpPc.js +107 -0
  383. package/dist/logs-cli-RSSTw8L_.js +254 -0
  384. package/dist/manager-runtime-DL6JoSj9.js +106 -0
  385. package/dist/manager.runtime-Cbyhg1vB.js +710 -0
  386. package/dist/markdown-to-line-BTlEkOls.d.ts +91 -0
  387. package/dist/matrix-DX-jaB88.js +1490 -0
  388. package/dist/matrix-H6Yyj1QZ.d.ts +68 -0
  389. package/dist/matrix-J8s45tRw.js +1269 -0
  390. package/dist/mattermost-D75n6bRI.d.ts +6 -0
  391. package/dist/mcp-cli-CLc3_yCO.js +86 -0
  392. package/dist/media-understanding.runtime-BI0Lljbl.js +111 -0
  393. package/dist/memory-cli-CTp2cYrf.js +106 -0
  394. package/dist/method-scopes-Du8ODGFW.js +2586 -0
  395. package/dist/model-auth-markers-DEDakSUW.d.ts +20 -0
  396. package/dist/model-picker-CDBs7LJF.js +390 -0
  397. package/dist/model-picker-CRix4Wwv.js +107 -0
  398. package/dist/model-picker.runtime-CITyy3Rn.js +120 -0
  399. package/dist/model-suppression.runtime-Ce7D6QUT.js +111 -0
  400. package/dist/models-BK1eanuP.js +113 -0
  401. package/dist/models-X4Czy3uE.js +2514 -0
  402. package/dist/models-cli-C79Ulviy.js +304 -0
  403. package/dist/models-config-DALlu3S9.js +106 -0
  404. package/dist/models-config.providers.discovery-CSJ1STM1.d.ts +18 -0
  405. package/dist/monitor-B45a_RpX.js +3468 -0
  406. package/dist/monitor-C8KbJ-i0.js +767 -0
  407. package/dist/monitor-CIhrvegZ.js +3076 -0
  408. package/dist/monitor-CQut7klP.js +6823 -0
  409. package/dist/monitor-DZb5IJle.js +777 -0
  410. package/dist/monitor-DaFkdD27.js +108 -0
  411. package/dist/monitor-Do9Tp2Ii.js +110 -0
  412. package/dist/monitor-shared-CMK9cDOb.js +444 -0
  413. package/dist/msteams-A6H_wv5F.js +852 -0
  414. package/dist/net-DpMJgN-o.d.ts +19 -0
  415. package/dist/nextcloud-talk-f1pZ5Bge.d.ts +1 -0
  416. package/dist/node-cli-BXnmsjzL.js +2498 -0
  417. package/dist/node-resolve-CupmrA0Y.js +835 -0
  418. package/dist/nodes-cli-DZVrah_8.js +1375 -0
  419. package/dist/nostr-DMV534Ks.d.ts +7 -0
  420. package/dist/nostr-SAk3tjtR.js +8744 -0
  421. package/dist/npm-resolution-Dr9wssCY.js +60 -0
  422. package/dist/oauth-utils-DnyXdWU9.d.ts +10 -0
  423. package/dist/onboard-BE5pmb1g.js +589 -0
  424. package/dist/onboard-channels-3hNVY0E7.js +1241 -0
  425. package/dist/onboard-channels-vaO3nWLL.js +200 -0
  426. package/dist/onboard-custom-CI5uFyWH.js +571 -0
  427. package/dist/onboard-custom-eIvRswgv.js +109 -0
  428. package/dist/onboard-helpers-ChMWfUnl.js +335 -0
  429. package/dist/onboard-helpers-DRFi9oaD.js +108 -0
  430. package/dist/onboard-remote-BTspTgA4.js +112 -0
  431. package/dist/onboard-remote-so38yXlX.js +181 -0
  432. package/dist/onboard-search-DS0tZS24.js +297 -0
  433. package/dist/onboard-skills-B9DxCCiU.js +133 -0
  434. package/dist/onboard-skills-so0a_BJV.js +112 -0
  435. package/dist/outbound-media-BiJscGlR.js +11 -0
  436. package/dist/outbound-media-DJF-TuJu.d.ts +11 -0
  437. package/dist/pairing-access-CuiJP9xN.d.ts +21 -0
  438. package/dist/pairing-cli-DN0u1Cez.js +212 -0
  439. package/dist/parse-finite-number-B3FJTjyQ.d.ts +5 -0
  440. package/dist/perplexity-Bw1u3CAF.js +24 -0
  441. package/dist/persistent-dedupe-DR5Ka6BX.d.ts +26 -0
  442. package/dist/pi-model-discovery-runtime-iwKNCaYu.js +106 -0
  443. package/dist/pi-tools.before-tool-call.runtime-BM_N-JZe.js +380 -0
  444. package/dist/plugin-install--KVul05Z.js +184 -0
  445. package/dist/plugin-install-DVpPsLkS.js +112 -0
  446. package/dist/plugin-install-plan-Dwc6-coz.js +49 -0
  447. package/dist/plugin-registry-XRswugE9.js +108 -0
  448. package/dist/plugin-registry-jozQafRo.js +49 -0
  449. package/dist/plugin-sdk/account-resolution.js +26 -26
  450. package/dist/plugin-sdk/acp-runtime.js +26 -26
  451. package/dist/plugin-sdk/acpx.js +1 -1
  452. package/dist/plugin-sdk/agent-runtime.js +26 -26
  453. package/dist/plugin-sdk/bluebubbles.js +29 -29
  454. package/dist/plugin-sdk/channel-config-helpers.js +26 -26
  455. package/dist/plugin-sdk/channel-config-schema.js +2 -2
  456. package/dist/plugin-sdk/channel-policy.js +26 -26
  457. package/dist/plugin-sdk/channel-runtime.js +26 -26
  458. package/dist/plugin-sdk/compat.js +27 -27
  459. package/dist/plugin-sdk/config-runtime.js +28 -28
  460. package/dist/plugin-sdk/conversation-runtime.js +26 -26
  461. package/dist/plugin-sdk/discord.js +26 -26
  462. package/dist/plugin-sdk/feishu.js +27 -27
  463. package/dist/plugin-sdk/gateway-runtime.js +8 -8
  464. package/dist/plugin-sdk/googlechat.js +29 -29
  465. package/dist/plugin-sdk/image-generation-runtime.js +26 -26
  466. package/dist/plugin-sdk/image-generation.js +26 -26
  467. package/dist/plugin-sdk/imessage.js +27 -27
  468. package/dist/plugin-sdk/index.js +26 -26
  469. package/dist/plugin-sdk/infra-runtime.js +26 -26
  470. package/dist/plugin-sdk/irc.js +29 -29
  471. package/dist/plugin-sdk/line.js +27 -27
  472. package/dist/plugin-sdk/llm-task.js +26 -26
  473. package/dist/plugin-sdk/matrix.js +29 -29
  474. package/dist/plugin-sdk/mattermost.js +28 -28
  475. package/dist/plugin-sdk/media-runtime.js +26 -26
  476. package/dist/plugin-sdk/media-understanding-runtime.js +26 -26
  477. package/dist/plugin-sdk/media-understanding.js +26 -26
  478. package/dist/plugin-sdk/msteams.js +30 -30
  479. package/dist/plugin-sdk/nextcloud-talk.js +28 -28
  480. package/dist/plugin-sdk/nostr.js +27 -27
  481. package/dist/plugin-sdk/plugin-runtime.js +26 -26
  482. package/dist/plugin-sdk/provider-auth.js +28 -28
  483. package/dist/plugin-sdk/provider-setup.js +27 -27
  484. package/dist/plugin-sdk/provider-web-search.js +1 -1
  485. package/dist/plugin-sdk/qwen-portal-auth.js +26 -26
  486. package/dist/plugin-sdk/reply-history.js +26 -26
  487. package/dist/plugin-sdk/reply-runtime.js +26 -26
  488. package/dist/plugin-sdk/sandbox.js +26 -26
  489. package/dist/plugin-sdk/security-runtime.js +26 -26
  490. package/dist/plugin-sdk/self-hosted-provider-setup.js +27 -27
  491. package/dist/plugin-sdk/setup.js +27 -27
  492. package/dist/plugin-sdk/signal.js +26 -26
  493. package/dist/plugin-sdk/slack.js +26 -26
  494. package/dist/plugin-sdk/speech-runtime.js +26 -26
  495. package/dist/plugin-sdk/speech.js +26 -26
  496. package/dist/plugin-sdk/src/channels/plugins/setup-wizard-helpers.d.ts +3 -0
  497. package/dist/plugin-sdk/src/config/config-lock.d.ts +38 -0
  498. package/dist/plugin-sdk/src/config/config.d.ts +1 -1
  499. package/dist/plugin-sdk/src/config/io.d.ts +39 -0
  500. package/dist/plugin-sdk/src/config/types.gateway.d.ts +12 -0
  501. package/dist/plugin-sdk/src/config/types.secrets.d.ts +10 -0
  502. package/dist/plugin-sdk/src/config/zod-schema.d.ts +2 -0
  503. package/dist/plugin-sdk/src/gateway/credential-planner.d.ts +3 -1
  504. package/dist/plugin-sdk/src/secrets/provider-env-vars.d.ts +61 -0
  505. package/dist/plugin-sdk/src/secrets/sec1-placeholder.d.ts +181 -0
  506. package/dist/plugin-sdk/src/secrets/sec1-utils.d.ts +57 -0
  507. package/dist/plugin-sdk/synology-chat.js +27 -27
  508. package/dist/plugin-sdk/telegram.js +26 -26
  509. package/dist/plugin-sdk/text-runtime.js +4 -4
  510. package/dist/plugin-sdk/tlon.js +27 -27
  511. package/dist/plugin-sdk/twitch.js +26 -26
  512. package/dist/plugin-sdk/voice-call.js +26 -26
  513. package/dist/plugin-sdk/whatsapp.js +26 -26
  514. package/dist/plugin-sdk/zalo.js +30 -30
  515. package/dist/plugin-sdk/zalouser.js +29 -29
  516. package/dist/plugins/runtime/index.d.ts +22 -0
  517. package/dist/plugins/runtime/index.js +26 -26
  518. package/dist/plugins-C4PiDdjc.js +106 -0
  519. package/dist/plugins-cli-zhmliYNU.js +912 -0
  520. package/dist/policy-CcSolumc.js +143 -0
  521. package/dist/preflight-audio.runtime-BAbfqqzW.js +111 -0
  522. package/dist/probe-Bgt5c-cr.js +129 -0
  523. package/dist/probe-CPk5iGcg.js +47 -0
  524. package/dist/probe-DR4KRKXz.js +19 -0
  525. package/dist/probe-DnoCyJ_m.js +1793 -0
  526. package/dist/probe-VsLtK3vQ.js +6328 -0
  527. package/dist/probe-auth-BnsKrQt7.js +38 -0
  528. package/dist/probe-auth-DYdUG8l1.js +48 -0
  529. package/dist/program-8enYYBsc.js +247 -0
  530. package/dist/prompt-select-styled-DxBcUasv.js +2673 -0
  531. package/dist/provider-api-key-auth.runtime-DsLZyt6h.js +116 -0
  532. package/dist/provider-auth-choice-30EvRxqc.js +126 -0
  533. package/dist/provider-auth-choice-preference-DMr1WmRg.js +189 -0
  534. package/dist/provider-auth-choice.runtime-CI98BgQF.js +118 -0
  535. package/dist/provider-auth-guidance-WKDIi_wk.js +34 -0
  536. package/dist/provider-auth-result-Cs8wguSI.d.ts +18 -0
  537. package/dist/provider-models-EOys_Nvi.d.ts +867 -0
  538. package/dist/provider-ollama-setup-D89zlm9C.d.ts +32 -0
  539. package/dist/provider-onboard-BzOpgCLu.d.ts +40 -0
  540. package/dist/provider-runtime.runtime-Cm4as2KG.js +106 -0
  541. package/dist/provider-self-hosted-setup-Bmv_AQmw.d.ts +61 -0
  542. package/dist/provider-self-hosted-setup-CJwFVVB4.js +182 -0
  543. package/dist/provider-usage-CVNyLLDb.js +106 -0
  544. package/dist/provider-usage.types-CdTymHNu.d.ts +16 -0
  545. package/dist/provider-web-search-BJhXD5dH.js +2392 -0
  546. package/dist/provider-wizard-DMMYXjlW.js +152 -0
  547. package/dist/push-apns-BnWTdTEk.js +1038 -0
  548. package/dist/pw-ai-CtK_7Cy2.js +1866 -0
  549. package/dist/qr-cli-CA-BF0--.js +108 -0
  550. package/dist/qr-cli-D18HiUkh.js +369 -0
  551. package/dist/reactions-Df7XG8Uh.js +281 -0
  552. package/dist/read-only-account-inspect.discord.runtime-B-FP0mwb.js +111 -0
  553. package/dist/read-only-account-inspect.slack.runtime-DkWZ2ccW.js +111 -0
  554. package/dist/read-only-account-inspect.telegram.runtime-BnlTkn_e.js +111 -0
  555. package/dist/redact-snapshot-DVdstBvO.js +2661 -0
  556. package/dist/ref-contract-RPkB754Q.js +53 -0
  557. package/dist/register.agent-DVAxXQKW.js +434 -0
  558. package/dist/register.backup-CUuL5KUZ.js +624 -0
  559. package/dist/register.configure-bC0UEwfU.js +247 -0
  560. package/dist/register.maintenance-iIqvl_eT.js +569 -0
  561. package/dist/register.message-CEDd4z07.js +704 -0
  562. package/dist/register.onboard-Cejfnysy.js +187 -0
  563. package/dist/register.setup-DU7uHdYt.js +207 -0
  564. package/dist/register.status-health-sessions-BWphMXNR.js +493 -0
  565. package/dist/register.subclis-DnIweTEG.js +315 -0
  566. package/dist/register.subclis-gJX_Pbub.js +12 -0
  567. package/dist/registry-Dgwc-7eS.js +1183 -0
  568. package/dist/replies-D9PEZ8yn.js +110 -0
  569. package/dist/reply-history-lHgoC4l3.d.ts +1 -0
  570. package/dist/reply-payload-Bd2HuR4g.d.ts +46 -0
  571. package/dist/request-url-BcSJaiiu.d.ts +5 -0
  572. package/dist/resolve-BbsCHGLY.js +660 -0
  573. package/dist/resolve-channels-BtrGC95o.js +262 -0
  574. package/dist/resolve-channels-C1SthO1N.js +226 -0
  575. package/dist/resolve-users-CgSxHrU0.js +143 -0
  576. package/dist/routes-BZtqNrBf.js +7097 -0
  577. package/dist/rpc-D3KMxG4J.js +67 -0
  578. package/dist/run-command-C8b3dCZV.d.ts +16 -0
  579. package/dist/run-main-BlWJVotF.js +423 -0
  580. package/dist/runtime-RWGbO5Qy.d.ts +26 -0
  581. package/dist/runtime-discord-ops.runtime-DUXIYvQr.js +9073 -0
  582. package/dist/runtime-slack-ops.runtime-n1yFfyp1.js +4551 -0
  583. package/dist/runtime-telegram-ops.runtime-PZUWchjT.js +128 -0
  584. package/dist/runtime-whatsapp-login.runtime-xsuNyvGz.js +109 -0
  585. package/dist/runtime-whatsapp-outbound.runtime-5EfEyCsO.js +112 -0
  586. package/dist/sandbox-cli-Dw1nWNmQ.js +530 -0
  587. package/dist/search-manager-BJoRxOaf.js +15 -0
  588. package/dist/search-manager-DxkQvUrW.js +386 -0
  589. package/dist/secret-input-schema-Cp_La9qv.d.ts +19 -0
  590. package/dist/secrets-cli-BPyV2gSq.js +2065 -0
  591. package/dist/security-cli-EK4sSRfG.js +570 -0
  592. package/dist/send-B01Gvh9m.js +629 -0
  593. package/dist/send-B4L4wRJO.js +100 -0
  594. package/dist/send-BDcGrXt0.js +1025 -0
  595. package/dist/send-BRRtHxyR.js +283 -0
  596. package/dist/send-DU6dmMXW.js +631 -0
  597. package/dist/server-CWw5GFEg.js +106 -0
  598. package/dist/server-node-events-92cDVswC.js +501 -0
  599. package/dist/session-key-DbkfhOjM.d.ts +46 -0
  600. package/dist/sessions-B052uHA3.js +218 -0
  601. package/dist/sessions-Cef4dZNP.js +107 -0
  602. package/dist/setup-BlQPyDPy.js +387 -0
  603. package/dist/setup-DcSZ_pTn.d.ts +37 -0
  604. package/dist/setup-core-B9mdZYnU.js +166 -0
  605. package/dist/setup-core-Cj0sLkpP.js +47 -0
  606. package/dist/setup-core-CkZbebOv.js +143 -0
  607. package/dist/setup-core-MRNjnrJl.js +205 -0
  608. package/dist/setup-surface-3ZY0JtWE.js +490 -0
  609. package/dist/setup-wizard-helpers-Dwzb9Dcz.d.ts +203 -0
  610. package/dist/setup.finalize-B5ETm3Ui.js +517 -0
  611. package/dist/setup.gateway-config-C8hdtlbw.js +338 -0
  612. package/dist/setup.secret-input-BZSIeiqy.js +25 -0
  613. package/dist/shared--9_eQ_lc.js +75 -0
  614. package/dist/shared-CxkH3H0U.js +102 -0
  615. package/dist/shared-DTNL0hA9.js +298 -0
  616. package/dist/shared-HSP1OV-Q.js +96 -0
  617. package/dist/shared-UIjWb_3B.js +182 -0
  618. package/dist/signal-CTI6bSmB.js +109 -0
  619. package/dist/skills-4-r1mfJM.js +853 -0
  620. package/dist/skills-RNm54CBO.js +19 -0
  621. package/dist/skills-cli-te7dSs5p.js +291 -0
  622. package/dist/skills-install-Del-Ogv8.js +763 -0
  623. package/dist/skills-status-BZpoMXrR.js +169 -0
  624. package/dist/skills-status-Dq61Sz8U.js +20 -0
  625. package/dist/slack-oc-viUtl.js +109 -0
  626. package/dist/slash-commands.runtime-NdkD2LZV.js +123 -0
  627. package/dist/slash-dispatch.runtime-DQgeaF3J.js +136 -0
  628. package/dist/slash-skill-commands.runtime-DmOl2DnL.js +111 -0
  629. package/dist/src-0wtt7seR.js +1696 -0
  630. package/dist/status-5oR_gqv_.js +121 -0
  631. package/dist/status-BO8LY0hC.js +1599 -0
  632. package/dist/status-D_oHA9yO.js +126 -0
  633. package/dist/status-IrMacJRj.js +606 -0
  634. package/dist/status-Prdeg53E.js +43 -0
  635. package/dist/status-json-Da0hR-1Z.js +286 -0
  636. package/dist/status.link-channel-BgUJEZAz.js +138 -0
  637. package/dist/status.scan.deps.runtime-D9vHTxOW.js +121 -0
  638. package/dist/status.scan.runtime-D-EdD5CW.js +114 -0
  639. package/dist/status.summary--i6xduWH.js +592 -0
  640. package/dist/status.summary.runtime-BqMXjaBc.js +113 -0
  641. package/dist/subagent-orphan-recovery-DiRJcFQc.js +302 -0
  642. package/dist/subagent-registry-runtime-B66EYEYm.js +106 -0
  643. package/dist/synology-chat-BemXqdzG.js +297 -0
  644. package/dist/system-cli-CSuiia4-.js +92 -0
  645. package/dist/telegram/audit.d.ts +2 -0
  646. package/dist/telegram/audit.js +1 -1
  647. package/dist/telegram/token.d.ts +2 -0
  648. package/dist/telegram/token.js +26 -26
  649. package/dist/telegram-DLFcRv5a.js +109 -0
  650. package/dist/testing-DZrulv-n.d.ts +1755 -0
  651. package/dist/text-chunking-BaYBIUoR.d.ts +79 -0
  652. package/dist/text-chunking-C8kmbNfa.js +84 -0
  653. package/dist/thinking-D8aqmr3o.d.ts +13 -0
  654. package/dist/tlon-Bpr4f3yF.js +433 -0
  655. package/dist/tool-send-BHKm5ztm.d.ts +9 -0
  656. package/dist/tui-BY3QRgC1.js +3834 -0
  657. package/dist/tui-cli-CCfZOlV0.js +132 -0
  658. package/dist/types-CKx5nDZB.d.ts +45 -0
  659. package/dist/types-DBhDdMQd.d.ts +22670 -0
  660. package/dist/types.base-B_TkkSS8.d.ts +188 -0
  661. package/dist/types.secrets-Bojc4omL.js +92 -0
  662. package/dist/ui-1UpZZyI3.js +31 -0
  663. package/dist/update-BR4JvFpV.js +1036 -0
  664. package/dist/update-cli-BZv44lFq.js +1498 -0
  665. package/dist/update-offset-store-DGdBotIW.js +107 -0
  666. package/dist/update-runner-D34sooPe.js +1496 -0
  667. package/dist/vllm-defaults-BCGSJ7K0.d.ts +13 -0
  668. package/dist/wait-BU9vJv22.d.ts +4 -0
  669. package/dist/web-CXpU2D41.js +107 -0
  670. package/dist/web-shared-B4sL45ah.d.ts +45 -0
  671. package/dist/webhook-memory-guards-B7oLVseG.d.ts +43 -0
  672. package/dist/webhook-request-guards-CqIH7equ.d.ts +76 -0
  673. package/dist/webhook-targets-CAAGATtk.js +181 -0
  674. package/dist/webhook-targets-oQ0jd4r0.d.ts +106 -0
  675. package/dist/webhooks-cli-B46t2VT5.js +349 -0
  676. package/dist/whatsapp-Dniwd4Rv.js +109 -0
  677. package/dist/whatsapp-actions-fL46PsNs.js +162 -0
  678. package/dist/windows-spawn-DGeE98SH.d.ts +43 -0
  679. package/dist/workspace-dirs-d3Ms_ryk.js +2002 -0
  680. package/dist/zalo-Csulx0XK.d.ts +9 -0
  681. package/dist/zalo-gh0yAWmS.js +415 -0
  682. package/dist/zalouser-CuxRvztM.js +30911 -0
  683. package/dist/zod-schema.agent-runtime-B4MkB-_3.d.ts +10 -0
  684. package/dist/zod-schema.core-D5reNip6.js +541 -0
  685. package/dist/zod-schema.core-DN3RhEUG.d.ts +173 -0
  686. package/docs/SEC1.md +523 -0
  687. package/docs/SEC1_IMPLEMENTATION/CHANNELS_REPORT.md +173 -0
  688. package/docs/SEC1_IMPLEMENTATION/CORE_UTIL_REPORT.md +139 -0
  689. package/docs/SEC1_IMPLEMENTATION/DOCS_REPORT.md +134 -0
  690. package/docs/SEC1_IMPLEMENTATION/ENV_MAP_DRAFT.md +148 -0
  691. package/docs/SEC1_IMPLEMENTATION/INTEGRATION_REPORT.md +170 -0
  692. package/docs/SEC1_IMPLEMENTATION/PROVIDERS_REPORT.md +291 -0
  693. package/docs/SEC1_IMPLEMENTATION/QA_REPORT.md +249 -0
  694. package/docs/SEC1_IMPLEMENTATION/RECURSIVE_QA/wave1-channels.md +317 -0
  695. package/docs/SEC1_IMPLEMENTATION/RECURSIVE_QA/wave1-docs.md +212 -0
  696. package/docs/SEC1_IMPLEMENTATION/RECURSIVE_QA/wave1-security.md +368 -0
  697. package/docs/SEC1_IMPLEMENTATION/RECURSIVE_QA/wave2-critic-consolidated.md +195 -0
  698. package/docs/SEC1_IMPLEMENTATION/RECURSIVE_QA/wave3-fix-report.md +105 -0
  699. package/docs/SEC1_IMPLEMENTATION/STRATEGY.md +451 -0
  700. package/docs/SEC1_IMPLEMENTATION/TEST_REPORT.md +156 -0
  701. package/docs/pipeline-sdk/CLI_SPEC.md +609 -0
  702. package/docs/pipeline-sdk/PIPELINE_SDK_DESIGN.md +1372 -0
  703. package/extensions/kakao-talkchannel/MIGRATION_ARCH_ANALYSIS.md +455 -0
  704. package/extensions/kakao-talkchannel/MIGRATION_CODE_ANALYSIS.md +383 -0
  705. package/extensions/kakao-talkchannel/MIGRATION_STRATEGY.md +115 -0
  706. package/extensions/kakao-talkchannel/README.md +50 -0
  707. package/extensions/kakao-talkchannel/index.ts +20 -0
  708. package/extensions/kakao-talkchannel/moldclaw.plugin.json +98 -0
  709. package/extensions/kakao-talkchannel/package.json +12 -0
  710. package/extensions/kakao-talkchannel/src/adapters/config.ts +132 -0
  711. package/extensions/kakao-talkchannel/src/adapters/gateway.ts +974 -0
  712. package/extensions/kakao-talkchannel/src/adapters/outbound.ts +52 -0
  713. package/extensions/kakao-talkchannel/src/adapters/pairing.ts +35 -0
  714. package/extensions/kakao-talkchannel/src/adapters/security.ts +57 -0
  715. package/extensions/kakao-talkchannel/src/adapters/setup.ts +105 -0
  716. package/extensions/kakao-talkchannel/src/adapters/status.ts +117 -0
  717. package/extensions/kakao-talkchannel/src/channel.ts +58 -0
  718. package/extensions/kakao-talkchannel/src/commands/card.ts +413 -0
  719. package/extensions/kakao-talkchannel/src/config/schema.ts +129 -0
  720. package/extensions/kakao-talkchannel/src/kakao/callback.ts +133 -0
  721. package/extensions/kakao-talkchannel/src/kakao/limits.ts +129 -0
  722. package/extensions/kakao-talkchannel/src/kakao/payload.ts +138 -0
  723. package/extensions/kakao-talkchannel/src/kakao/response.ts +373 -0
  724. package/extensions/kakao-talkchannel/src/relay/client.ts +146 -0
  725. package/extensions/kakao-talkchannel/src/relay/session.ts +137 -0
  726. package/extensions/kakao-talkchannel/src/relay/sse.ts +258 -0
  727. package/extensions/kakao-talkchannel/src/relay/stream.ts +149 -0
  728. package/extensions/kakao-talkchannel/src/runtime.ts +21 -0
  729. package/extensions/kakao-talkchannel/src/types.ts +447 -0
  730. package/extensions/kakao-talkchannel/src/version.ts +3 -0
  731. package/extensions/kakao-talkchannel/tsconfig.json +19 -0
  732. package/package.json +23 -8
  733. package/skills/meshy/SKILL.md +69 -0
  734. package/skills/meshy/scripts/__pycache__/check_status.cpython-312.pyc +0 -0
  735. package/skills/meshy/scripts/__pycache__/image_to_3d.cpython-312.pyc +0 -0
  736. package/skills/meshy/scripts/__pycache__/text_to_3d.cpython-312.pyc +0 -0
  737. package/skills/meshy/scripts/check_status.py +147 -0
  738. package/skills/meshy/scripts/image_to_3d.py +229 -0
  739. package/skills/meshy/scripts/text_to_3d.py +214 -0
  740. package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
  741. package/skills/openai-whisper-api/scripts/transcribe.sh +0 -0
  742. package/skills/tavily-search/SKILL.md +61 -0
  743. package/skills/tavily-search/scripts/__pycache__/search.cpython-312.pyc +0 -0
  744. package/skills/tavily-search/scripts/search.py +238 -0
  745. package/skills/video-frames/scripts/frame.sh +0 -0
  746. package/LICENSE +0 -21
  747. package/dist/accounts-UcSvD34O.js +0 -109
  748. package/dist/acp-cli-BPb8PgHP.js +0 -2088
  749. package/dist/actions.runtime-BL5QRooG.js +0 -114
  750. package/dist/actions.runtime-DSdfSo40.js +0 -128
  751. package/dist/agents-CHeX_5-H.js +0 -217
  752. package/dist/agents-DQRL9XKP.js +0 -853
  753. package/dist/allow-list-Boi79v-U.js +0 -81
  754. package/dist/allowlist-B2eBBeMF.js +0 -142
  755. package/dist/api-CFAtRSYL.js +0 -6953
  756. package/dist/api-D5JNJj8n.js +0 -112
  757. package/dist/audit-BM0GsdzV.js +0 -787
  758. package/dist/audit-BqRK9OSj.js +0 -54
  759. package/dist/audit-channel.collect.runtime-BPvDB8aq.js +0 -600
  760. package/dist/audit-channel.runtime-D3fzHiAo.js +0 -116
  761. package/dist/audit-extra.async-NveNIzX0.js +0 -813
  762. package/dist/audit-membership-runtime-mu470WFO.js +0 -157
  763. package/dist/audit.deep.runtime-RdxvW8Tj.js +0 -24
  764. package/dist/audit.nondeep.runtime-DDu8vA9Z.js +0 -831
  765. package/dist/audit.runtime-Y8C9W7s9.js +0 -113
  766. package/dist/auth-choice-C1CIxRsi.js +0 -268
  767. package/dist/auth-choice-CTvqWiDI.js +0 -117
  768. package/dist/auth-choice-Ddzko1B8.js +0 -502
  769. package/dist/auth-choice-options-BIAmAiCe.js +0 -123
  770. package/dist/auth-choice-prompt-B815kArz.js +0 -110
  771. package/dist/auth-choice-prompt-CGhTNCJx.js +0 -36
  772. package/dist/auth-choice.plugin-providers.runtime-AvAZ6S5W.js +0 -114
  773. package/dist/auth-profiles-BJcHzwPy.js +0 -127650
  774. package/dist/auth-profiles.runtime-CieFilK5.js +0 -111
  775. package/dist/bluebubbles-F8FGE9cH.js +0 -64
  776. package/dist/brave-BG5Yopn8.js +0 -24
  777. package/dist/browser-cli-Co7PJGZF.js +0 -1492
  778. package/dist/call-CoaQYq7c.js +0 -639
  779. package/dist/call-D3eu5Jjh.js +0 -37
  780. package/dist/channel-BftWD6yu.js +0 -1321
  781. package/dist/channel-Bub9U5Xg.js +0 -214
  782. package/dist/channel-C0oDs7TO.js +0 -4681
  783. package/dist/channel-C8CnEdkZ.js +0 -352
  784. package/dist/channel-CI-RC-xf.js +0 -497
  785. package/dist/channel-CY-hZCOJ.js +0 -397
  786. package/dist/channel-CbtGJB2x.js +0 -943
  787. package/dist/channel-CcfK3wP8.js +0 -803
  788. package/dist/channel-DBoDIeVj.js +0 -619
  789. package/dist/channel-DEq6Ecs-.js +0 -920
  790. package/dist/channel-DH4dhW1n.js +0 -226
  791. package/dist/channel-DQ_wdKg_.js +0 -575
  792. package/dist/channel-DT6qD1Ic.js +0 -207
  793. package/dist/channel-DZNAyxwr.js +0 -542
  794. package/dist/channel-DtakwAEe.js +0 -538
  795. package/dist/channel-DuYgH6p1.js +0 -562
  796. package/dist/channel-Hn-AN-d52.js +0 -316
  797. package/dist/channel-_R4hbD5h.js +0 -1598
  798. package/dist/channel-account-context-DXq8dlvI.js +0 -103
  799. package/dist/channel-kQmEVn3I.js +0 -306
  800. package/dist/channel-options-DHfxaklg.js +0 -50
  801. package/dist/channel-summary-DUpnoYhI.js +0 -106
  802. package/dist/channel-t-JxCWk6.js +0 -949
  803. package/dist/channel.runtime--GYriaXU.js +0 -213
  804. package/dist/channel.runtime-BJtn3GOH.js +0 -174
  805. package/dist/channel.runtime-BV7t_oNz.js +0 -166
  806. package/dist/channel.runtime-Bi8a3n9S.js +0 -865
  807. package/dist/channel.runtime-BjsYF0NN.js +0 -122
  808. package/dist/channel.runtime-BnI6YtmI.js +0 -413
  809. package/dist/channel.runtime-CQOftcCd.js +0 -194
  810. package/dist/channel.runtime-CuIAcPjZ.js +0 -4006
  811. package/dist/channel.runtime-DH1Q1G4k.js +0 -399
  812. package/dist/channel.runtime-DYYUPKxr.js +0 -236
  813. package/dist/channel.runtime-U5Gszsr5.js +0 -177
  814. package/dist/channel.setup-BQFHmgki.js +0 -9
  815. package/dist/channel.setup-BVoDwklu.js +0 -8
  816. package/dist/channel.setup-Bf73HsXr.js +0 -57
  817. package/dist/channel.setup-CblD4flM.js +0 -11
  818. package/dist/channel.setup-DgxlrPgz.js +0 -6
  819. package/dist/channel.setup-GLIAEVKL.js +0 -8
  820. package/dist/channel.setup-YTy5R1sz.js +0 -9
  821. package/dist/channels-CTL8iR9J.js +0 -404
  822. package/dist/channels-DBGvnjHY.js +0 -1113
  823. package/dist/channels-cli-BmVO5-sq.js +0 -286
  824. package/dist/channels-status-issues-kDtsWzA-.js +0 -16
  825. package/dist/clawbot-cli-DtcMJHqX.js +0 -113
  826. package/dist/cli-BNGECGVY.js +0 -149
  827. package/dist/command-registry-1SDrWgER.js +0 -13
  828. package/dist/command-registry-DNorYU4w.js +0 -212
  829. package/dist/command-secret-gateway-DqDZparO.js +0 -106
  830. package/dist/compact.runtime-C1ZN8UGb.js +0 -111
  831. package/dist/completion-cli-Q_Jt5Foc.js +0 -16
  832. package/dist/completion-cli-QkTXhuJh.js +0 -445
  833. package/dist/config-BbxrRaLf.js +0 -938
  834. package/dist/config-CkD8DJ7L.js +0 -44
  835. package/dist/config-cli-BoPrlYTp.js +0 -428
  836. package/dist/config-guard-CEhCvr_u.js +0 -117
  837. package/dist/config-schema-GQ6uWjXe.js +0 -31
  838. package/dist/config-validation-woE2_LpC.js +0 -262
  839. package/dist/config-value-Dh8m-CFf.js +0 -132
  840. package/dist/config-y4i5g7s4.js +0 -30
  841. package/dist/configure-DGRzwdFN.js +0 -1100
  842. package/dist/configure-S4AHE3k_.js +0 -238
  843. package/dist/control-ui-shared-kLBp4YlS.js +0 -29
  844. package/dist/credentials-D5uBf_C5.js +0 -265
  845. package/dist/cron-cli-lGupeVCW.js +0 -634
  846. package/dist/daemon-cli-Cs_edi0I.js +0 -339
  847. package/dist/daemon-install-DIFpP_qv.js +0 -175
  848. package/dist/deliver-DYa_DFZU.js +0 -106
  849. package/dist/deliver-runtime-DCW_o2Ot.js +0 -106
  850. package/dist/devices-cli-YsGOW2-w.js +0 -340
  851. package/dist/diagnostic-vMghIesG.js +0 -310
  852. package/dist/directory-cli-DtjMQjU5.js +0 -306
  853. package/dist/directory.static-DBZGvsdF.js +0 -44
  854. package/dist/discord-DYCu19HT.js +0 -109
  855. package/dist/discovery-DZYAoDF_.js +0 -48
  856. package/dist/dns-cli-DqW4pNgW.js +0 -216
  857. package/dist/docs-cli-Bu9TBlDU.js +0 -173
  858. package/dist/doctor-completion-B5hcQD5c.js +0 -90
  859. package/dist/doctor-config-flow-BBB2ZKfT.js +0 -107
  860. package/dist/doctor-config-flow-DDBYUS9f.js +0 -2437
  861. package/dist/enable-Tmsp8QuB.js +0 -24
  862. package/dist/env-overrides-BHxqjYZG.js +0 -434
  863. package/dist/env-overrides.runtime-Cz98bf-l.js +0 -17
  864. package/dist/exec-approvals-cli-wO5cYfMa.js +0 -419
  865. package/dist/gateway-cli-CFvDGhB9.js +0 -26429
  866. package/dist/gateway-install-token-CskJfo_N.js +0 -163
  867. package/dist/gateway-rpc-srYfBID9.js +0 -26
  868. package/dist/gateway-runtime-C76hUmUV.js +0 -69
  869. package/dist/googlechat-Cha5utST.js +0 -307
  870. package/dist/health-DDQYYsJy.js +0 -108
  871. package/dist/health-DXZykGaX.js +0 -570
  872. package/dist/hooks-cli-DfkurPYP.js +0 -995
  873. package/dist/imessage-B26k39pl.js +0 -110
  874. package/dist/imessage-Bp1_6cws.js +0 -31
  875. package/dist/inbound-reply-dispatch-DoIJLztA.js +0 -71
  876. package/dist/install-target-BjOuS4I8.js +0 -574
  877. package/dist/installs-Cz4k0W1Y.js +0 -532
  878. package/dist/io-B0OKifLZ.js +0 -28
  879. package/dist/io-DcoxdH6t.js +0 -9570
  880. package/dist/ipv4-CTQQ4_IW.js +0 -82
  881. package/dist/irc-B8vBDigm.js +0 -672
  882. package/dist/library-VCM_cQY4.js +0 -107
  883. package/dist/lifecycle-core-Ctz36PdQ.js +0 -382
  884. package/dist/line-B_uTLrdI.js +0 -530
  885. package/dist/llm-slug-generator-YWg0g2pj.js +0 -67
  886. package/dist/logging-S-5LPdfQ.js +0 -13
  887. package/dist/logging-ueBMCGMR.js +0 -29
  888. package/dist/login-qr-pcACm2Ng.js +0 -107
  889. package/dist/login-qr-pv-kxMfF.js +0 -233
  890. package/dist/logs-cli-RgADgSMO.js +0 -254
  891. package/dist/manager-runtime-BhTkoKmb.js +0 -106
  892. package/dist/manager.runtime-BjHzikoK.js +0 -710
  893. package/dist/matrix-C4EEu2Qp.js +0 -1490
  894. package/dist/matrix-Dfzcc5nV.js +0 -1269
  895. package/dist/mcp-cli-CJmOm9Oj.js +0 -86
  896. package/dist/media-understanding.runtime-DCETFCw_.js +0 -111
  897. package/dist/memory-cli-DFqd6tYx.js +0 -106
  898. package/dist/method-scopes-D-Q9dvbj.js +0 -2586
  899. package/dist/model-picker-Z-CUcuMr.js +0 -390
  900. package/dist/model-picker-v5mUsZ4J.js +0 -107
  901. package/dist/model-picker.runtime-A_z0dHfS.js +0 -120
  902. package/dist/model-suppression.runtime-QVWVJRr-.js +0 -111
  903. package/dist/models-Bbj0xV4F.js +0 -2514
  904. package/dist/models-D-OIjZqU.js +0 -113
  905. package/dist/models-cli-Bpn-5i4h.js +0 -304
  906. package/dist/models-config-Cwa5cJbC.js +0 -106
  907. package/dist/monitor-BchfCAaU.js +0 -6823
  908. package/dist/monitor-BydV44SP.js +0 -3076
  909. package/dist/monitor-CT8axwfm.js +0 -767
  910. package/dist/monitor-CZGWNOvn.js +0 -777
  911. package/dist/monitor-DN62r69g.js +0 -3468
  912. package/dist/monitor-DZ0fzJku.js +0 -110
  913. package/dist/monitor-DvNjzWFu.js +0 -108
  914. package/dist/monitor-shared-B-DBSlkQ.js +0 -444
  915. package/dist/msteams-Bf-wk2Rp.js +0 -852
  916. package/dist/node-cli-kH16TQI7.js +0 -2498
  917. package/dist/node-resolve-DfOpQmxm.js +0 -835
  918. package/dist/nodes-cli-CkAMXW5u.js +0 -1375
  919. package/dist/nostr-B8UGHclZ.js +0 -8744
  920. package/dist/npm-resolution-DmjlifII.js +0 -60
  921. package/dist/onboard-C883nfyw.js +0 -589
  922. package/dist/onboard-channels-Dc-BxN7p.js +0 -200
  923. package/dist/onboard-channels-j5EENtum.js +0 -1241
  924. package/dist/onboard-custom-0atne0C5.js +0 -571
  925. package/dist/onboard-custom-CWMqwjJx.js +0 -109
  926. package/dist/onboard-helpers-D3wWfH8F.js +0 -335
  927. package/dist/onboard-helpers-DZmRCe8l.js +0 -108
  928. package/dist/onboard-remote-Cn6kW-p0.js +0 -112
  929. package/dist/onboard-remote-Cx4w5VAk.js +0 -181
  930. package/dist/onboard-search-Ck9HRh2M.js +0 -297
  931. package/dist/onboard-skills-BtqrGioT.js +0 -133
  932. package/dist/onboard-skills-Dnw19Os8.js +0 -112
  933. package/dist/outbound-media-C5Nv4o18.js +0 -11
  934. package/dist/pairing-cli-Cwy9QZ_4.js +0 -212
  935. package/dist/perplexity-Brhpb45X.js +0 -24
  936. package/dist/pi-model-discovery-runtime-DIOdo6D8.js +0 -106
  937. package/dist/pi-tools.before-tool-call.runtime-CFM4gsDF.js +0 -380
  938. package/dist/plugin-install-BOV00hia.js +0 -112
  939. package/dist/plugin-install-Bak8fUBv.js +0 -184
  940. package/dist/plugin-install-plan-bKkEefRf.js +0 -49
  941. package/dist/plugin-registry-DxAXQUlZ.js +0 -108
  942. package/dist/plugin-registry-n0p3phem.js +0 -49
  943. package/dist/plugins-Ca3RK8Fi.js +0 -106
  944. package/dist/plugins-cli-BnC51H2R.js +0 -912
  945. package/dist/policy-BJv97w9e.js +0 -143
  946. package/dist/preflight-audio.runtime-BrFcf-6_.js +0 -111
  947. package/dist/probe-063xvvZc.js +0 -19
  948. package/dist/probe-BJEb2wGv.js +0 -1793
  949. package/dist/probe-CJQlxgsl.js +0 -47
  950. package/dist/probe-Caa2HznF.js +0 -6328
  951. package/dist/probe-CfL4tnJ6.js +0 -129
  952. package/dist/probe-auth-DN2Ec83-.js +0 -38
  953. package/dist/probe-auth-D_UKzu4m.js +0 -48
  954. package/dist/program-BOMdC7MC.js +0 -247
  955. package/dist/prompt-select-styled-DDnCfM3j.js +0 -2673
  956. package/dist/provider-api-key-auth.runtime-DUns3fwX.js +0 -116
  957. package/dist/provider-auth-choice-B_j1ctT2.js +0 -126
  958. package/dist/provider-auth-choice-preference-BaOBZ_Xn.js +0 -189
  959. package/dist/provider-auth-choice.runtime-DOako_zV.js +0 -118
  960. package/dist/provider-auth-guidance-CrjxnoNZ.js +0 -34
  961. package/dist/provider-runtime.runtime-BkOkgmTw.js +0 -106
  962. package/dist/provider-self-hosted-setup-BFDU6dRa.js +0 -182
  963. package/dist/provider-usage-CaDE0mqq.js +0 -106
  964. package/dist/provider-web-search-BR7etTjJ.js +0 -2392
  965. package/dist/provider-wizard-DCPdKUvb.js +0 -152
  966. package/dist/push-apns-B_OZjm4v.js +0 -1038
  967. package/dist/pw-ai-dG60P0hQ.js +0 -1866
  968. package/dist/qr-cli-DWfiw79I.js +0 -369
  969. package/dist/qr-cli-DwuKtyZQ.js +0 -108
  970. package/dist/reactions-CIGAPBn8.js +0 -281
  971. package/dist/read-only-account-inspect.discord.runtime-D54mnq8l.js +0 -111
  972. package/dist/read-only-account-inspect.slack.runtime-Bxs9ObMC.js +0 -111
  973. package/dist/read-only-account-inspect.telegram.runtime-UoVuf_Yo.js +0 -111
  974. package/dist/redact-snapshot-DZ3Vq-SC.js +0 -2657
  975. package/dist/ref-contract-D96lSYLs.js +0 -53
  976. package/dist/register.agent-2KmeahEL.js +0 -434
  977. package/dist/register.backup-ECBnWVR7.js +0 -624
  978. package/dist/register.configure-Doz1daCp.js +0 -247
  979. package/dist/register.maintenance-C33cV-WM.js +0 -569
  980. package/dist/register.message-CnL0NiF6.js +0 -704
  981. package/dist/register.onboard-BrYGZeQA.js +0 -187
  982. package/dist/register.setup-Bx6gEg6X.js +0 -207
  983. package/dist/register.status-health-sessions-FLb0CUOO.js +0 -493
  984. package/dist/register.subclis-BuqgaeIf.js +0 -12
  985. package/dist/register.subclis-DwdgfdnT.js +0 -315
  986. package/dist/registry-xhgvU89y.js +0 -1107
  987. package/dist/replies-hB2aipLu.js +0 -110
  988. package/dist/resolve-3ErMOltL.js +0 -660
  989. package/dist/resolve-channels-BV8GXuPe.js +0 -226
  990. package/dist/resolve-channels-CTY_XRIP.js +0 -262
  991. package/dist/resolve-users-DQ4Ne4Zc.js +0 -143
  992. package/dist/routes-BNDsNO_e.js +0 -7097
  993. package/dist/rpc-BLGTBWXq.js +0 -67
  994. package/dist/run-main-COAE4GlI.js +0 -423
  995. package/dist/runtime-discord-ops.runtime-Dxg-nlgd.js +0 -9073
  996. package/dist/runtime-slack-ops.runtime-Di474LJr.js +0 -4551
  997. package/dist/runtime-telegram-ops.runtime-Da8vgf3O.js +0 -128
  998. package/dist/runtime-whatsapp-login.runtime-DcouP4iF.js +0 -109
  999. package/dist/runtime-whatsapp-outbound.runtime-CYamaEJX.js +0 -112
  1000. package/dist/sandbox-cli-U5ZTxhxL.js +0 -530
  1001. package/dist/search-manager-CfizyEMk.js +0 -386
  1002. package/dist/search-manager-DaF2QP4s.js +0 -15
  1003. package/dist/secrets-cli-C0gytFip.js +0 -2065
  1004. package/dist/security-cli-C74EuLUO.js +0 -570
  1005. package/dist/send-BTLVBf_E.js +0 -631
  1006. package/dist/send-BlWWCEZE.js +0 -1025
  1007. package/dist/send-CfypD1B_.js +0 -100
  1008. package/dist/send-Cm9v3uhF.js +0 -283
  1009. package/dist/send-g2odQuYI.js +0 -629
  1010. package/dist/server-C8b5QJ2s.js +0 -106
  1011. package/dist/server-node-events-xqQe5xiu.js +0 -501
  1012. package/dist/sessions-CSSzvgPQ.js +0 -107
  1013. package/dist/sessions-z0GIvdKa.js +0 -218
  1014. package/dist/setup-D9XTmlF8.js +0 -387
  1015. package/dist/setup-core-BDrLOwYO.js +0 -143
  1016. package/dist/setup-core-CM7cY7_i.js +0 -166
  1017. package/dist/setup-core-CnmgANY-.js +0 -205
  1018. package/dist/setup-core-DgcjCKmG.js +0 -47
  1019. package/dist/setup-surface-DzRrVKYj.js +0 -490
  1020. package/dist/setup.finalize-UaPu_adv.js +0 -517
  1021. package/dist/setup.gateway-config-Djc1ceEh.js +0 -338
  1022. package/dist/setup.secret-input-BkczghbR.js +0 -25
  1023. package/dist/shared-BHizGoNk.js +0 -298
  1024. package/dist/shared-CUfYhQkP.js +0 -96
  1025. package/dist/shared-DYYqr9EC.js +0 -75
  1026. package/dist/shared-DthOxMRQ.js +0 -182
  1027. package/dist/shared-On_A5_hW.js +0 -102
  1028. package/dist/signal-D6px9PGZ.js +0 -109
  1029. package/dist/skills-B4h1k-SP.js +0 -853
  1030. package/dist/skills-Bto10BGB.js +0 -19
  1031. package/dist/skills-cli-CXGR3Y5j.js +0 -291
  1032. package/dist/skills-install-B1AlkK8C.js +0 -763
  1033. package/dist/skills-status-BsmJ_iSg.js +0 -20
  1034. package/dist/skills-status-DGdxY3OI.js +0 -169
  1035. package/dist/slack-B7vWFmxP.js +0 -109
  1036. package/dist/slash-commands.runtime-DXdAT84n.js +0 -123
  1037. package/dist/slash-dispatch.runtime-CNf2-9Aj.js +0 -136
  1038. package/dist/slash-skill-commands.runtime-CBjffHRX.js +0 -111
  1039. package/dist/src-Cp7P7T08.js +0 -1696
  1040. package/dist/status-158fWh4A.js +0 -43
  1041. package/dist/status-BJIVLJnb.js +0 -1599
  1042. package/dist/status-BQiBI6N9.js +0 -126
  1043. package/dist/status-CZipXGUu.js +0 -121
  1044. package/dist/status-ZZIVFLI-.js +0 -606
  1045. package/dist/status-json-BNUy5Mem.js +0 -286
  1046. package/dist/status.link-channel-B694y1Xu.js +0 -138
  1047. package/dist/status.scan.deps.runtime-BcoKEzQD.js +0 -121
  1048. package/dist/status.scan.runtime-CqScDt-p.js +0 -114
  1049. package/dist/status.summary-AMek7qvI.js +0 -592
  1050. package/dist/status.summary.runtime-XgkcQ_kr.js +0 -113
  1051. package/dist/subagent-orphan-recovery-CrCYTmFC.js +0 -302
  1052. package/dist/subagent-registry-runtime-Cg-YvLx3.js +0 -106
  1053. package/dist/synology-chat-0G85jIqQ.js +0 -297
  1054. package/dist/system-cli-kZtSxKNm.js +0 -92
  1055. package/dist/telegram-DV0Wy89w.js +0 -109
  1056. package/dist/text-chunking-C2J2Oeul.js +0 -84
  1057. package/dist/tlon-DmK1NUVP.js +0 -433
  1058. package/dist/tui-D3bNPLG7.js +0 -3834
  1059. package/dist/tui-cli-DtMp9k_s.js +0 -132
  1060. package/dist/types.secrets-DuSPmmWB.js +0 -80
  1061. package/dist/ui-CeGztSEL.js +0 -31
  1062. package/dist/update-De7VudzP.js +0 -1036
  1063. package/dist/update-cli-BH8Pb-So.js +0 -1498
  1064. package/dist/update-offset-store-syELkdEW.js +0 -107
  1065. package/dist/update-runner-Cq-Q40T9.js +0 -1496
  1066. package/dist/web-CjMtvfSq.js +0 -107
  1067. package/dist/webhook-targets-_jTR0Bb_.js +0 -181
  1068. package/dist/webhooks-cli-DQ6u2Qau.js +0 -349
  1069. package/dist/whatsapp-CyLk16SZ.js +0 -109
  1070. package/dist/whatsapp-actions-Dzr2Wzqw.js +0 -162
  1071. package/dist/workspace-dirs-L1_QQ9mB.js +0 -2002
  1072. package/dist/zalo-CrehfXvK.js +0 -415
  1073. package/dist/zalouser-D1QD-O-I.js +0 -30911
  1074. package/dist/zod-schema.core-CWxzqcUs.js +0 -541
@@ -1,2002 +0,0 @@
1
- import { r as STATE_DIR } from "./paths-D6AgsMTU.js";
2
- import { m as defaultRuntime, t as createSubsystemLogger } from "./subsystem-S4LNMNHd.js";
3
- import { n as markmoldClawExecEnv } from "./moldclaw-exec-env-BxT8Gxx3.js";
4
- import { D as isPlainObject, y as resolveUserPath } from "./utils-rjVNXUns.js";
5
- import { i as resolveAgentConfig, m as resolveDefaultAgentId, p as resolveAgentWorkspaceDir } from "./agent-scope-DA7O8MVG.js";
6
- import { c as normalizeAgentId, u as resolveAgentIdFromSessionKey } from "./session-key-DyhRsRh-.js";
7
- import { o as resolvePathViaExistingAncestorSync } from "./boundary-file-read-Y1cMjPlu.js";
8
- import { l as normalizeSecretInputString } from "./types.secrets-DuSPmmWB.js";
9
- import { t as getBlockedNetworkModeReason } from "./network-mode-CE-ihBf6.js";
10
- import { l as CHANNEL_IDS, s as normalizeChannelId } from "./registry-DcDGl2X7.js";
11
- import { n as getProcessStartTime, r as isPidAlive, t as resolveProcessScopedMap } from "./process-scoped-map-C7rag2cs.js";
12
- import { t as formatCliCommand } from "./command-format-DIDjlImI.js";
13
- import { t as sanitizeEnvVars } from "./sanitize-env-vars-Cgaa5oYm.js";
14
- import { n as materializeWindowsSpawnProgram, r as resolveWindowsSpawnProgram } from "./windows-spawn-DKPZKfeS.js";
15
- import { r as writeJsonAtomic } from "./json-files-BhLX9wE7.js";
16
- import fs from "node:fs";
17
- import path, { posix } from "node:path";
18
- import { spawn } from "node:child_process";
19
- import fs$1 from "node:fs/promises";
20
- import crypto from "node:crypto";
21
- //#region src/agents/sandbox/constants.ts
22
- const DEFAULT_SANDBOX_WORKSPACE_ROOT = path.join(STATE_DIR, "sandboxes");
23
- const DEFAULT_SANDBOX_IMAGE = "moldclaw-sandbox:bookworm-slim";
24
- const DEFAULT_TOOL_ALLOW = [
25
- "exec",
26
- "process",
27
- "read",
28
- "write",
29
- "edit",
30
- "apply_patch",
31
- "image",
32
- "sessions_list",
33
- "sessions_history",
34
- "sessions_send",
35
- "sessions_spawn",
36
- "sessions_yield",
37
- "subagents",
38
- "session_status"
39
- ];
40
- const DEFAULT_TOOL_DENY = [
41
- "browser",
42
- "canvas",
43
- "nodes",
44
- "cron",
45
- "gateway",
46
- ...CHANNEL_IDS
47
- ];
48
- const DEFAULT_SANDBOX_BROWSER_IMAGE = "moldclaw-sandbox-browser:bookworm-slim";
49
- const DEFAULT_SANDBOX_COMMON_IMAGE = "moldclaw-sandbox-common:bookworm-slim";
50
- const SANDBOX_BROWSER_SECURITY_HASH_EPOCH = "2026-02-28-no-sandbox-env";
51
- const SANDBOX_AGENT_WORKSPACE_MOUNT = "/agent";
52
- const SANDBOX_STATE_DIR = path.join(STATE_DIR, "sandbox");
53
- const SANDBOX_REGISTRY_PATH = path.join(SANDBOX_STATE_DIR, "containers.json");
54
- const SANDBOX_BROWSER_REGISTRY_PATH = path.join(SANDBOX_STATE_DIR, "browsers.json");
55
- //#endregion
56
- //#region src/agents/glob-pattern.ts
57
- function escapeRegex(value) {
58
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
59
- }
60
- function compileGlobPattern(params) {
61
- const normalized = params.normalize(params.raw);
62
- if (!normalized) return {
63
- kind: "exact",
64
- value: ""
65
- };
66
- if (normalized === "*") return { kind: "all" };
67
- if (!normalized.includes("*")) return {
68
- kind: "exact",
69
- value: normalized
70
- };
71
- return {
72
- kind: "regex",
73
- value: new RegExp(`^${escapeRegex(normalized).replaceAll("\\*", ".*")}$`)
74
- };
75
- }
76
- function compileGlobPatterns(params) {
77
- if (!Array.isArray(params.raw)) return [];
78
- return params.raw.map((raw) => compileGlobPattern({
79
- raw,
80
- normalize: params.normalize
81
- })).filter((pattern) => pattern.kind !== "exact" || pattern.value);
82
- }
83
- function matchesAnyGlobPattern(value, patterns) {
84
- for (const pattern of patterns) {
85
- if (pattern.kind === "all") return true;
86
- if (pattern.kind === "exact" && value === pattern.value) return true;
87
- if (pattern.kind === "regex" && pattern.value.test(value)) return true;
88
- }
89
- return false;
90
- }
91
- //#endregion
92
- //#region src/agents/tool-catalog.ts
93
- const CORE_TOOL_SECTION_ORDER = [
94
- {
95
- id: "fs",
96
- label: "Files"
97
- },
98
- {
99
- id: "runtime",
100
- label: "Runtime"
101
- },
102
- {
103
- id: "web",
104
- label: "Web"
105
- },
106
- {
107
- id: "memory",
108
- label: "Memory"
109
- },
110
- {
111
- id: "sessions",
112
- label: "Sessions"
113
- },
114
- {
115
- id: "ui",
116
- label: "UI"
117
- },
118
- {
119
- id: "messaging",
120
- label: "Messaging"
121
- },
122
- {
123
- id: "automation",
124
- label: "Automation"
125
- },
126
- {
127
- id: "nodes",
128
- label: "Nodes"
129
- },
130
- {
131
- id: "agents",
132
- label: "Agents"
133
- },
134
- {
135
- id: "media",
136
- label: "Media"
137
- }
138
- ];
139
- const CORE_TOOL_DEFINITIONS = [
140
- {
141
- id: "read",
142
- label: "read",
143
- description: "Read file contents",
144
- sectionId: "fs",
145
- profiles: ["coding"]
146
- },
147
- {
148
- id: "write",
149
- label: "write",
150
- description: "Create or overwrite files",
151
- sectionId: "fs",
152
- profiles: ["coding"]
153
- },
154
- {
155
- id: "edit",
156
- label: "edit",
157
- description: "Make precise edits",
158
- sectionId: "fs",
159
- profiles: ["coding"]
160
- },
161
- {
162
- id: "apply_patch",
163
- label: "apply_patch",
164
- description: "Patch files (OpenAI)",
165
- sectionId: "fs",
166
- profiles: ["coding"]
167
- },
168
- {
169
- id: "exec",
170
- label: "exec",
171
- description: "Run shell commands",
172
- sectionId: "runtime",
173
- profiles: ["coding"]
174
- },
175
- {
176
- id: "process",
177
- label: "process",
178
- description: "Manage background processes",
179
- sectionId: "runtime",
180
- profiles: ["coding"]
181
- },
182
- {
183
- id: "web_search",
184
- label: "web_search",
185
- description: "Search the web",
186
- sectionId: "web",
187
- profiles: ["coding"],
188
- includeInmoldClawGroup: true
189
- },
190
- {
191
- id: "web_fetch",
192
- label: "web_fetch",
193
- description: "Fetch web content",
194
- sectionId: "web",
195
- profiles: ["coding"],
196
- includeInmoldClawGroup: true
197
- },
198
- {
199
- id: "memory_search",
200
- label: "memory_search",
201
- description: "Semantic search",
202
- sectionId: "memory",
203
- profiles: ["coding"],
204
- includeInmoldClawGroup: true
205
- },
206
- {
207
- id: "memory_get",
208
- label: "memory_get",
209
- description: "Read memory files",
210
- sectionId: "memory",
211
- profiles: ["coding"],
212
- includeInmoldClawGroup: true
213
- },
214
- {
215
- id: "sessions_list",
216
- label: "sessions_list",
217
- description: "List sessions",
218
- sectionId: "sessions",
219
- profiles: ["coding", "messaging"],
220
- includeInmoldClawGroup: true
221
- },
222
- {
223
- id: "sessions_history",
224
- label: "sessions_history",
225
- description: "Session history",
226
- sectionId: "sessions",
227
- profiles: ["coding", "messaging"],
228
- includeInmoldClawGroup: true
229
- },
230
- {
231
- id: "sessions_send",
232
- label: "sessions_send",
233
- description: "Send to session",
234
- sectionId: "sessions",
235
- profiles: ["coding", "messaging"],
236
- includeInmoldClawGroup: true
237
- },
238
- {
239
- id: "sessions_spawn",
240
- label: "sessions_spawn",
241
- description: "Spawn sub-agent",
242
- sectionId: "sessions",
243
- profiles: ["coding"],
244
- includeInmoldClawGroup: true
245
- },
246
- {
247
- id: "sessions_yield",
248
- label: "sessions_yield",
249
- description: "End turn to receive sub-agent results",
250
- sectionId: "sessions",
251
- profiles: ["coding"],
252
- includeInmoldClawGroup: true
253
- },
254
- {
255
- id: "subagents",
256
- label: "subagents",
257
- description: "Manage sub-agents",
258
- sectionId: "sessions",
259
- profiles: ["coding"],
260
- includeInmoldClawGroup: true
261
- },
262
- {
263
- id: "session_status",
264
- label: "session_status",
265
- description: "Session status",
266
- sectionId: "sessions",
267
- profiles: [
268
- "minimal",
269
- "coding",
270
- "messaging"
271
- ],
272
- includeInmoldClawGroup: true
273
- },
274
- {
275
- id: "browser",
276
- label: "browser",
277
- description: "Control web browser",
278
- sectionId: "ui",
279
- profiles: [],
280
- includeInmoldClawGroup: true
281
- },
282
- {
283
- id: "canvas",
284
- label: "canvas",
285
- description: "Control canvases",
286
- sectionId: "ui",
287
- profiles: [],
288
- includeInmoldClawGroup: true
289
- },
290
- {
291
- id: "message",
292
- label: "message",
293
- description: "Send messages",
294
- sectionId: "messaging",
295
- profiles: ["messaging"],
296
- includeInmoldClawGroup: true
297
- },
298
- {
299
- id: "cron",
300
- label: "cron",
301
- description: "Schedule tasks",
302
- sectionId: "automation",
303
- profiles: ["coding"],
304
- includeInmoldClawGroup: true
305
- },
306
- {
307
- id: "gateway",
308
- label: "gateway",
309
- description: "Gateway control",
310
- sectionId: "automation",
311
- profiles: [],
312
- includeInmoldClawGroup: true
313
- },
314
- {
315
- id: "nodes",
316
- label: "nodes",
317
- description: "Nodes + devices",
318
- sectionId: "nodes",
319
- profiles: [],
320
- includeInmoldClawGroup: true
321
- },
322
- {
323
- id: "agents_list",
324
- label: "agents_list",
325
- description: "List agents",
326
- sectionId: "agents",
327
- profiles: [],
328
- includeInmoldClawGroup: true
329
- },
330
- {
331
- id: "image",
332
- label: "image",
333
- description: "Image understanding",
334
- sectionId: "media",
335
- profiles: ["coding"],
336
- includeInmoldClawGroup: true
337
- },
338
- {
339
- id: "image_generate",
340
- label: "image_generate",
341
- description: "Image generation",
342
- sectionId: "media",
343
- profiles: ["coding"],
344
- includeInmoldClawGroup: true
345
- },
346
- {
347
- id: "tts",
348
- label: "tts",
349
- description: "Text-to-speech conversion",
350
- sectionId: "media",
351
- profiles: [],
352
- includeInmoldClawGroup: true
353
- }
354
- ];
355
- const CORE_TOOL_BY_ID = new Map(CORE_TOOL_DEFINITIONS.map((tool) => [tool.id, tool]));
356
- function listCoreToolIdsForProfile(profile) {
357
- return CORE_TOOL_DEFINITIONS.filter((tool) => tool.profiles.includes(profile)).map((tool) => tool.id);
358
- }
359
- const CORE_TOOL_PROFILES = {
360
- minimal: { allow: listCoreToolIdsForProfile("minimal") },
361
- coding: { allow: listCoreToolIdsForProfile("coding") },
362
- messaging: { allow: listCoreToolIdsForProfile("messaging") },
363
- full: {}
364
- };
365
- function buildCoreToolGroupMap() {
366
- const sectionToolMap = /* @__PURE__ */ new Map();
367
- for (const tool of CORE_TOOL_DEFINITIONS) {
368
- const groupId = `group:${tool.sectionId}`;
369
- const list = sectionToolMap.get(groupId) ?? [];
370
- list.push(tool.id);
371
- sectionToolMap.set(groupId, list);
372
- }
373
- const moldclawTools = CORE_TOOL_DEFINITIONS.filter((tool) => tool.includeInmoldClawGroup).map((tool) => tool.id);
374
- return {
375
- "group:moldclaw": moldclawTools,
376
- ...Object.fromEntries(sectionToolMap.entries())
377
- };
378
- }
379
- const CORE_TOOL_GROUPS = buildCoreToolGroupMap();
380
- const PROFILE_OPTIONS = [
381
- {
382
- id: "minimal",
383
- label: "Minimal"
384
- },
385
- {
386
- id: "coding",
387
- label: "Coding"
388
- },
389
- {
390
- id: "messaging",
391
- label: "Messaging"
392
- },
393
- {
394
- id: "full",
395
- label: "Full"
396
- }
397
- ];
398
- function resolveCoreToolProfilePolicy(profile) {
399
- if (!profile) return;
400
- const resolved = CORE_TOOL_PROFILES[profile];
401
- if (!resolved) return;
402
- if (!resolved.allow && !resolved.deny) return;
403
- return {
404
- allow: resolved.allow ? [...resolved.allow] : void 0,
405
- deny: resolved.deny ? [...resolved.deny] : void 0
406
- };
407
- }
408
- function listCoreToolSections() {
409
- return CORE_TOOL_SECTION_ORDER.map((section) => ({
410
- id: section.id,
411
- label: section.label,
412
- tools: CORE_TOOL_DEFINITIONS.filter((tool) => tool.sectionId === section.id).map((tool) => ({
413
- id: tool.id,
414
- label: tool.label,
415
- description: tool.description
416
- }))
417
- })).filter((section) => section.tools.length > 0);
418
- }
419
- function resolveCoreToolProfiles(toolId) {
420
- const tool = CORE_TOOL_BY_ID.get(toolId);
421
- if (!tool) return [];
422
- return [...tool.profiles];
423
- }
424
- function isKnownCoreToolId(toolId) {
425
- return CORE_TOOL_BY_ID.has(toolId);
426
- }
427
- //#endregion
428
- //#region src/agents/tool-policy-shared.ts
429
- const TOOL_NAME_ALIASES = {
430
- bash: "exec",
431
- "apply-patch": "apply_patch"
432
- };
433
- const TOOL_GROUPS = { ...CORE_TOOL_GROUPS };
434
- function normalizeToolName(name) {
435
- const normalized = name.trim().toLowerCase();
436
- return TOOL_NAME_ALIASES[normalized] ?? normalized;
437
- }
438
- function normalizeToolList(list) {
439
- if (!list) return [];
440
- return list.map(normalizeToolName).filter(Boolean);
441
- }
442
- function expandToolGroups(list) {
443
- const normalized = normalizeToolList(list);
444
- const expanded = [];
445
- for (const value of normalized) {
446
- const group = TOOL_GROUPS[value];
447
- if (group) {
448
- expanded.push(...group);
449
- continue;
450
- }
451
- expanded.push(value);
452
- }
453
- return Array.from(new Set(expanded));
454
- }
455
- function resolveToolProfilePolicy(profile) {
456
- return resolveCoreToolProfilePolicy(profile);
457
- }
458
- //#endregion
459
- //#region src/agents/tool-policy.ts
460
- function wrapOwnerOnlyToolExecution(tool, senderIsOwner) {
461
- if (tool.ownerOnly !== true || senderIsOwner || !tool.execute) return tool;
462
- return {
463
- ...tool,
464
- execute: async () => {
465
- throw new Error("Tool restricted to owner senders.");
466
- }
467
- };
468
- }
469
- const OWNER_ONLY_TOOL_NAME_FALLBACKS = new Set([
470
- "whatsapp_login",
471
- "cron",
472
- "gateway",
473
- "nodes"
474
- ]);
475
- function isOwnerOnlyToolName(name) {
476
- return OWNER_ONLY_TOOL_NAME_FALLBACKS.has(normalizeToolName(name));
477
- }
478
- function isOwnerOnlyTool(tool) {
479
- return tool.ownerOnly === true || isOwnerOnlyToolName(tool.name);
480
- }
481
- function applyOwnerOnlyToolPolicy(tools, senderIsOwner) {
482
- const withGuard = tools.map((tool) => {
483
- if (!isOwnerOnlyTool(tool)) return tool;
484
- return wrapOwnerOnlyToolExecution(tool, senderIsOwner);
485
- });
486
- if (senderIsOwner) return withGuard;
487
- return withGuard.filter((tool) => !isOwnerOnlyTool(tool));
488
- }
489
- function collectExplicitAllowlist(policies) {
490
- const entries = [];
491
- for (const policy of policies) {
492
- if (!policy?.allow) continue;
493
- for (const value of policy.allow) {
494
- if (typeof value !== "string") continue;
495
- const trimmed = value.trim();
496
- if (trimmed) entries.push(trimmed);
497
- }
498
- }
499
- return entries;
500
- }
501
- function buildPluginToolGroups(params) {
502
- const all = [];
503
- const byPlugin = /* @__PURE__ */ new Map();
504
- for (const tool of params.tools) {
505
- const meta = params.toolMeta(tool);
506
- if (!meta) continue;
507
- const name = normalizeToolName(tool.name);
508
- all.push(name);
509
- const pluginId = meta.pluginId.toLowerCase();
510
- const list = byPlugin.get(pluginId) ?? [];
511
- list.push(name);
512
- byPlugin.set(pluginId, list);
513
- }
514
- return {
515
- all,
516
- byPlugin
517
- };
518
- }
519
- function expandPluginGroups(list, groups) {
520
- if (!list || list.length === 0) return list;
521
- const expanded = [];
522
- for (const entry of list) {
523
- const normalized = normalizeToolName(entry);
524
- if (normalized === "group:plugins") {
525
- if (groups.all.length > 0) expanded.push(...groups.all);
526
- else expanded.push(normalized);
527
- continue;
528
- }
529
- const tools = groups.byPlugin.get(normalized);
530
- if (tools && tools.length > 0) {
531
- expanded.push(...tools);
532
- continue;
533
- }
534
- expanded.push(normalized);
535
- }
536
- return Array.from(new Set(expanded));
537
- }
538
- function expandPolicyWithPluginGroups(policy, groups) {
539
- if (!policy) return;
540
- return {
541
- allow: expandPluginGroups(policy.allow, groups),
542
- deny: expandPluginGroups(policy.deny, groups)
543
- };
544
- }
545
- function stripPluginOnlyAllowlist(policy, groups, coreTools) {
546
- if (!policy?.allow || policy.allow.length === 0) return {
547
- policy,
548
- unknownAllowlist: [],
549
- strippedAllowlist: false
550
- };
551
- const normalized = normalizeToolList(policy.allow);
552
- if (normalized.length === 0) return {
553
- policy,
554
- unknownAllowlist: [],
555
- strippedAllowlist: false
556
- };
557
- const pluginIds = new Set(groups.byPlugin.keys());
558
- const pluginTools = new Set(groups.all);
559
- const unknownAllowlist = [];
560
- let hasCoreEntry = false;
561
- for (const entry of normalized) {
562
- if (entry === "*") {
563
- hasCoreEntry = true;
564
- continue;
565
- }
566
- const isPluginEntry = entry === "group:plugins" || pluginIds.has(entry) || pluginTools.has(entry);
567
- const isCoreEntry = expandToolGroups([entry]).some((tool) => coreTools.has(tool));
568
- if (isCoreEntry) hasCoreEntry = true;
569
- if (!isCoreEntry && !isPluginEntry) unknownAllowlist.push(entry);
570
- }
571
- const strippedAllowlist = !hasCoreEntry;
572
- if (strippedAllowlist) {}
573
- return {
574
- policy: strippedAllowlist ? {
575
- ...policy,
576
- allow: void 0
577
- } : policy,
578
- unknownAllowlist: Array.from(new Set(unknownAllowlist)),
579
- strippedAllowlist
580
- };
581
- }
582
- function mergeAlsoAllowPolicy(policy, alsoAllow) {
583
- if (!policy?.allow || !Array.isArray(alsoAllow) || alsoAllow.length === 0) return policy;
584
- return {
585
- ...policy,
586
- allow: Array.from(new Set([...policy.allow, ...alsoAllow]))
587
- };
588
- }
589
- //#endregion
590
- //#region src/agents/sandbox/tool-policy.ts
591
- function normalizeGlob(value) {
592
- return value.trim().toLowerCase();
593
- }
594
- function isToolAllowed(policy, name) {
595
- const normalized = normalizeGlob(name);
596
- if (matchesAnyGlobPattern(normalized, compileGlobPatterns({
597
- raw: expandToolGroups(policy.deny ?? []),
598
- normalize: normalizeGlob
599
- }))) return false;
600
- const allow = compileGlobPatterns({
601
- raw: expandToolGroups(policy.allow ?? []),
602
- normalize: normalizeGlob
603
- });
604
- if (allow.length === 0) return true;
605
- return matchesAnyGlobPattern(normalized, allow);
606
- }
607
- function resolveSandboxToolPolicyForAgent(cfg, agentId) {
608
- const agentConfig = cfg && agentId ? resolveAgentConfig(cfg, agentId) : void 0;
609
- const agentAllow = agentConfig?.tools?.sandbox?.tools?.allow;
610
- const agentDeny = agentConfig?.tools?.sandbox?.tools?.deny;
611
- const globalAllow = cfg?.tools?.sandbox?.tools?.allow;
612
- const globalDeny = cfg?.tools?.sandbox?.tools?.deny;
613
- const allowSource = Array.isArray(agentAllow) ? {
614
- source: "agent",
615
- key: "agents.list[].tools.sandbox.tools.allow"
616
- } : Array.isArray(globalAllow) ? {
617
- source: "global",
618
- key: "tools.sandbox.tools.allow"
619
- } : {
620
- source: "default",
621
- key: "tools.sandbox.tools.allow"
622
- };
623
- const denySource = Array.isArray(agentDeny) ? {
624
- source: "agent",
625
- key: "agents.list[].tools.sandbox.tools.deny"
626
- } : Array.isArray(globalDeny) ? {
627
- source: "global",
628
- key: "tools.sandbox.tools.deny"
629
- } : {
630
- source: "default",
631
- key: "tools.sandbox.tools.deny"
632
- };
633
- const deny = Array.isArray(agentDeny) ? agentDeny : Array.isArray(globalDeny) ? globalDeny : [...DEFAULT_TOOL_DENY];
634
- const allow = Array.isArray(agentAllow) ? agentAllow : Array.isArray(globalAllow) ? globalAllow : [...DEFAULT_TOOL_ALLOW];
635
- const expandedDeny = expandToolGroups(deny);
636
- let expandedAllow = expandToolGroups(allow);
637
- if (expandedAllow.length > 0 && !expandedDeny.map((v) => v.toLowerCase()).includes("image") && !expandedAllow.map((v) => v.toLowerCase()).includes("image")) expandedAllow = [...expandedAllow, "image"];
638
- return {
639
- allow: expandedAllow,
640
- deny: expandedDeny,
641
- sources: {
642
- allow: allowSource,
643
- deny: denySource
644
- }
645
- };
646
- }
647
- //#endregion
648
- //#region src/agents/sandbox/config.ts
649
- const DANGEROUS_SANDBOX_DOCKER_BOOLEAN_KEYS = [
650
- "dangerouslyAllowReservedContainerTargets",
651
- "dangerouslyAllowExternalBindSources",
652
- "dangerouslyAllowContainerNamespaceJoin"
653
- ];
654
- const DEFAULT_SANDBOX_SSH_COMMAND = "ssh";
655
- const DEFAULT_SANDBOX_SSH_WORKSPACE_ROOT = "/tmp/moldclaw-sandboxes";
656
- function resolveDangerousSandboxDockerBooleans(agentDocker, globalDocker) {
657
- const resolved = {};
658
- for (const key of DANGEROUS_SANDBOX_DOCKER_BOOLEAN_KEYS) resolved[key] = agentDocker?.[key] ?? globalDocker?.[key];
659
- return resolved;
660
- }
661
- function resolveSandboxBrowserDockerCreateConfig(params) {
662
- const browserNetwork = params.browser.network.trim();
663
- const base = {
664
- ...params.docker,
665
- network: browserNetwork || "moldclaw-sandbox-browser",
666
- image: params.browser.image
667
- };
668
- return params.browser.binds !== void 0 ? {
669
- ...base,
670
- binds: params.browser.binds
671
- } : base;
672
- }
673
- function resolveSandboxScope(params) {
674
- if (params.scope) return params.scope;
675
- if (typeof params.perSession === "boolean") return params.perSession ? "session" : "shared";
676
- return "agent";
677
- }
678
- function resolveSandboxDockerConfig(params) {
679
- const agentDocker = params.scope === "shared" ? void 0 : params.agentDocker;
680
- const globalDocker = params.globalDocker;
681
- const env = agentDocker?.env ? {
682
- ...globalDocker?.env ?? { LANG: "C.UTF-8" },
683
- ...agentDocker.env
684
- } : globalDocker?.env ?? { LANG: "C.UTF-8" };
685
- const ulimits = agentDocker?.ulimits ? {
686
- ...globalDocker?.ulimits,
687
- ...agentDocker.ulimits
688
- } : globalDocker?.ulimits;
689
- const binds = [...globalDocker?.binds ?? [], ...agentDocker?.binds ?? []];
690
- return {
691
- image: agentDocker?.image ?? globalDocker?.image ?? "moldclaw-sandbox:bookworm-slim",
692
- containerPrefix: agentDocker?.containerPrefix ?? globalDocker?.containerPrefix ?? "moldclaw-sbx-",
693
- workdir: agentDocker?.workdir ?? globalDocker?.workdir ?? "/workspace",
694
- readOnlyRoot: agentDocker?.readOnlyRoot ?? globalDocker?.readOnlyRoot ?? true,
695
- tmpfs: agentDocker?.tmpfs ?? globalDocker?.tmpfs ?? [
696
- "/tmp",
697
- "/var/tmp",
698
- "/run"
699
- ],
700
- network: agentDocker?.network ?? globalDocker?.network ?? "none",
701
- user: agentDocker?.user ?? globalDocker?.user,
702
- capDrop: agentDocker?.capDrop ?? globalDocker?.capDrop ?? ["ALL"],
703
- env,
704
- setupCommand: agentDocker?.setupCommand ?? globalDocker?.setupCommand,
705
- pidsLimit: agentDocker?.pidsLimit ?? globalDocker?.pidsLimit,
706
- memory: agentDocker?.memory ?? globalDocker?.memory,
707
- memorySwap: agentDocker?.memorySwap ?? globalDocker?.memorySwap,
708
- cpus: agentDocker?.cpus ?? globalDocker?.cpus,
709
- ulimits,
710
- seccompProfile: agentDocker?.seccompProfile ?? globalDocker?.seccompProfile,
711
- apparmorProfile: agentDocker?.apparmorProfile ?? globalDocker?.apparmorProfile,
712
- dns: agentDocker?.dns ?? globalDocker?.dns,
713
- extraHosts: agentDocker?.extraHosts ?? globalDocker?.extraHosts,
714
- binds: binds.length ? binds : void 0,
715
- ...resolveDangerousSandboxDockerBooleans(agentDocker, globalDocker)
716
- };
717
- }
718
- function resolveSandboxBrowserConfig(params) {
719
- const agentBrowser = params.scope === "shared" ? void 0 : params.agentBrowser;
720
- const globalBrowser = params.globalBrowser;
721
- const binds = [...globalBrowser?.binds ?? [], ...agentBrowser?.binds ?? []];
722
- const bindsConfigured = globalBrowser?.binds !== void 0 || agentBrowser?.binds !== void 0;
723
- return {
724
- enabled: agentBrowser?.enabled ?? globalBrowser?.enabled ?? false,
725
- image: agentBrowser?.image ?? globalBrowser?.image ?? "moldclaw-sandbox-browser:bookworm-slim",
726
- containerPrefix: agentBrowser?.containerPrefix ?? globalBrowser?.containerPrefix ?? "moldclaw-sbx-browser-",
727
- network: agentBrowser?.network ?? globalBrowser?.network ?? "moldclaw-sandbox-browser",
728
- cdpPort: agentBrowser?.cdpPort ?? globalBrowser?.cdpPort ?? 9222,
729
- cdpSourceRange: agentBrowser?.cdpSourceRange ?? globalBrowser?.cdpSourceRange,
730
- vncPort: agentBrowser?.vncPort ?? globalBrowser?.vncPort ?? 5900,
731
- noVncPort: agentBrowser?.noVncPort ?? globalBrowser?.noVncPort ?? 6080,
732
- headless: agentBrowser?.headless ?? globalBrowser?.headless ?? false,
733
- enableNoVnc: agentBrowser?.enableNoVnc ?? globalBrowser?.enableNoVnc ?? true,
734
- allowHostControl: agentBrowser?.allowHostControl ?? globalBrowser?.allowHostControl ?? false,
735
- autoStart: agentBrowser?.autoStart ?? globalBrowser?.autoStart ?? true,
736
- autoStartTimeoutMs: agentBrowser?.autoStartTimeoutMs ?? globalBrowser?.autoStartTimeoutMs ?? 12e3,
737
- binds: bindsConfigured ? binds : void 0
738
- };
739
- }
740
- function resolveSandboxPruneConfig(params) {
741
- const agentPrune = params.scope === "shared" ? void 0 : params.agentPrune;
742
- const globalPrune = params.globalPrune;
743
- return {
744
- idleHours: agentPrune?.idleHours ?? globalPrune?.idleHours ?? 24,
745
- maxAgeDays: agentPrune?.maxAgeDays ?? globalPrune?.maxAgeDays ?? 7
746
- };
747
- }
748
- function normalizeOptionalString(value) {
749
- const trimmed = value?.trim();
750
- return trimmed ? trimmed : void 0;
751
- }
752
- function normalizeRemoteRoot(value, fallback) {
753
- const normalized = normalizeOptionalString(value) ?? fallback;
754
- const posix = normalized.replaceAll("\\", "/");
755
- if (!posix.startsWith("/")) throw new Error(`Sandbox SSH workspaceRoot must be an absolute POSIX path: ${normalized}`);
756
- return posix.replace(/\/+$/g, "") || "/";
757
- }
758
- function resolveSandboxSshConfig(params) {
759
- const agentSsh = params.scope === "shared" ? void 0 : params.agentSsh;
760
- const globalSsh = params.globalSsh;
761
- return {
762
- target: normalizeOptionalString(agentSsh?.target ?? globalSsh?.target),
763
- command: normalizeOptionalString(agentSsh?.command ?? globalSsh?.command) ?? DEFAULT_SANDBOX_SSH_COMMAND,
764
- workspaceRoot: normalizeRemoteRoot(agentSsh?.workspaceRoot ?? globalSsh?.workspaceRoot, DEFAULT_SANDBOX_SSH_WORKSPACE_ROOT),
765
- strictHostKeyChecking: agentSsh?.strictHostKeyChecking ?? globalSsh?.strictHostKeyChecking ?? true,
766
- updateHostKeys: agentSsh?.updateHostKeys ?? globalSsh?.updateHostKeys ?? true,
767
- identityFile: normalizeOptionalString(agentSsh?.identityFile ?? globalSsh?.identityFile),
768
- certificateFile: normalizeOptionalString(agentSsh?.certificateFile ?? globalSsh?.certificateFile),
769
- knownHostsFile: normalizeOptionalString(agentSsh?.knownHostsFile ?? globalSsh?.knownHostsFile),
770
- identityData: normalizeSecretInputString(agentSsh?.identityData ?? globalSsh?.identityData),
771
- certificateData: normalizeSecretInputString(agentSsh?.certificateData ?? globalSsh?.certificateData),
772
- knownHostsData: normalizeSecretInputString(agentSsh?.knownHostsData ?? globalSsh?.knownHostsData)
773
- };
774
- }
775
- function resolveSandboxConfigForAgent(cfg, agentId) {
776
- const agent = cfg?.agents?.defaults?.sandbox;
777
- let agentSandbox;
778
- const agentConfig = cfg && agentId ? resolveAgentConfig(cfg, agentId) : void 0;
779
- if (agentConfig?.sandbox) agentSandbox = agentConfig.sandbox;
780
- const scope = resolveSandboxScope({
781
- scope: agentSandbox?.scope ?? agent?.scope,
782
- perSession: agentSandbox?.perSession ?? agent?.perSession
783
- });
784
- const toolPolicy = resolveSandboxToolPolicyForAgent(cfg, agentId);
785
- return {
786
- mode: agentSandbox?.mode ?? agent?.mode ?? "off",
787
- backend: agentSandbox?.backend?.trim() || agent?.backend?.trim() || "docker",
788
- scope,
789
- workspaceAccess: agentSandbox?.workspaceAccess ?? agent?.workspaceAccess ?? "none",
790
- workspaceRoot: agentSandbox?.workspaceRoot ?? agent?.workspaceRoot ?? DEFAULT_SANDBOX_WORKSPACE_ROOT,
791
- docker: resolveSandboxDockerConfig({
792
- scope,
793
- globalDocker: agent?.docker,
794
- agentDocker: agentSandbox?.docker
795
- }),
796
- ssh: resolveSandboxSshConfig({
797
- scope,
798
- globalSsh: agent?.ssh,
799
- agentSsh: agentSandbox?.ssh
800
- }),
801
- browser: resolveSandboxBrowserConfig({
802
- scope,
803
- globalBrowser: agent?.browser,
804
- agentBrowser: agentSandbox?.browser
805
- }),
806
- tools: {
807
- allow: toolPolicy.allow,
808
- deny: toolPolicy.deny
809
- },
810
- prune: resolveSandboxPruneConfig({
811
- scope,
812
- globalPrune: agent?.prune,
813
- agentPrune: agentSandbox?.prune
814
- })
815
- };
816
- }
817
- //#endregion
818
- //#region src/agents/sandbox/hash.ts
819
- function hashTextSha256(value) {
820
- return crypto.createHash("sha256").update(value).digest("hex");
821
- }
822
- //#endregion
823
- //#region src/agents/sandbox/config-hash.ts
824
- function normalizeForHash(value) {
825
- if (value === void 0) return;
826
- if (Array.isArray(value)) return value.map(normalizeForHash).filter((item) => item !== void 0);
827
- if (value && typeof value === "object") {
828
- const entries = Object.entries(value).toSorted(([a], [b]) => a.localeCompare(b));
829
- const normalized = {};
830
- for (const [key, entryValue] of entries) {
831
- const next = normalizeForHash(entryValue);
832
- if (next !== void 0) normalized[key] = next;
833
- }
834
- return normalized;
835
- }
836
- return value;
837
- }
838
- function computeSandboxConfigHash(input) {
839
- return computeHash(input);
840
- }
841
- function computeSandboxBrowserConfigHash(input) {
842
- return computeHash(input);
843
- }
844
- function computeHash(input) {
845
- const payload = normalizeForHash(input);
846
- return hashTextSha256(JSON.stringify(payload));
847
- }
848
- //#endregion
849
- //#region src/agents/session-write-lock.ts
850
- function isValidLockNumber(value) {
851
- return typeof value === "number" && Number.isInteger(value) && value >= 0;
852
- }
853
- const CLEANUP_SIGNALS = [
854
- "SIGINT",
855
- "SIGTERM",
856
- "SIGQUIT",
857
- "SIGABRT"
858
- ];
859
- const CLEANUP_STATE_KEY = Symbol.for("moldclaw.sessionWriteLockCleanupState");
860
- const HELD_LOCKS_KEY = Symbol.for("moldclaw.sessionWriteLockHeldLocks");
861
- const WATCHDOG_STATE_KEY = Symbol.for("moldclaw.sessionWriteLockWatchdogState");
862
- const DEFAULT_STALE_MS = 1800 * 1e3;
863
- const DEFAULT_MAX_HOLD_MS = 300 * 1e3;
864
- const DEFAULT_WATCHDOG_INTERVAL_MS = 6e4;
865
- const DEFAULT_TIMEOUT_GRACE_MS = 120 * 1e3;
866
- const MAX_LOCK_HOLD_MS = 2147e6;
867
- const HELD_LOCKS = resolveProcessScopedMap(HELD_LOCKS_KEY);
868
- function resolveCleanupState() {
869
- const proc = process;
870
- if (!proc[CLEANUP_STATE_KEY]) proc[CLEANUP_STATE_KEY] = {
871
- registered: false,
872
- cleanupHandlers: /* @__PURE__ */ new Map()
873
- };
874
- return proc[CLEANUP_STATE_KEY];
875
- }
876
- function resolveWatchdogState() {
877
- const proc = process;
878
- if (!proc[WATCHDOG_STATE_KEY]) proc[WATCHDOG_STATE_KEY] = {
879
- started: false,
880
- intervalMs: DEFAULT_WATCHDOG_INTERVAL_MS
881
- };
882
- return proc[WATCHDOG_STATE_KEY];
883
- }
884
- function resolvePositiveMs(value, fallback, opts = {}) {
885
- if (typeof value !== "number" || Number.isNaN(value) || value <= 0) return fallback;
886
- if (value === Number.POSITIVE_INFINITY) return opts.allowInfinity ? value : fallback;
887
- if (!Number.isFinite(value)) return fallback;
888
- return value;
889
- }
890
- function resolveSessionLockMaxHoldFromTimeout(params) {
891
- const minMs = resolvePositiveMs(params.minMs, DEFAULT_MAX_HOLD_MS);
892
- const timeoutMs = resolvePositiveMs(params.timeoutMs, minMs, { allowInfinity: true });
893
- if (timeoutMs === Number.POSITIVE_INFINITY) return MAX_LOCK_HOLD_MS;
894
- const graceMs = resolvePositiveMs(params.graceMs, DEFAULT_TIMEOUT_GRACE_MS);
895
- return Math.min(MAX_LOCK_HOLD_MS, Math.max(minMs, timeoutMs + graceMs));
896
- }
897
- async function releaseHeldLock(normalizedSessionFile, held, opts = {}) {
898
- if (HELD_LOCKS.get(normalizedSessionFile) !== held) return false;
899
- if (opts.force) held.count = 0;
900
- else {
901
- held.count -= 1;
902
- if (held.count > 0) return false;
903
- }
904
- if (held.releasePromise) {
905
- await held.releasePromise.catch(() => void 0);
906
- return true;
907
- }
908
- HELD_LOCKS.delete(normalizedSessionFile);
909
- held.releasePromise = (async () => {
910
- try {
911
- await held.handle.close();
912
- } catch {}
913
- try {
914
- await fs$1.rm(held.lockPath, { force: true });
915
- } catch {}
916
- })();
917
- try {
918
- await held.releasePromise;
919
- return true;
920
- } finally {
921
- held.releasePromise = void 0;
922
- }
923
- }
924
- /**
925
- * Synchronously release all held locks.
926
- * Used during process exit when async operations aren't reliable.
927
- */
928
- function releaseAllLocksSync() {
929
- for (const [sessionFile, held] of HELD_LOCKS) {
930
- try {
931
- if (typeof held.handle.close === "function") held.handle.close().catch(() => {});
932
- } catch {}
933
- try {
934
- fs.rmSync(held.lockPath, { force: true });
935
- } catch {}
936
- HELD_LOCKS.delete(sessionFile);
937
- }
938
- }
939
- async function runLockWatchdogCheck(nowMs = Date.now()) {
940
- let released = 0;
941
- for (const [sessionFile, held] of HELD_LOCKS.entries()) {
942
- const heldForMs = nowMs - held.acquiredAt;
943
- if (heldForMs <= held.maxHoldMs) continue;
944
- console.warn(`[session-write-lock] releasing lock held for ${heldForMs}ms (max=${held.maxHoldMs}ms): ${held.lockPath}`);
945
- if (await releaseHeldLock(sessionFile, held, { force: true })) released += 1;
946
- }
947
- return released;
948
- }
949
- function ensureWatchdogStarted(intervalMs) {
950
- const watchdogState = resolveWatchdogState();
951
- if (watchdogState.started) return;
952
- watchdogState.started = true;
953
- watchdogState.intervalMs = intervalMs;
954
- watchdogState.timer = setInterval(() => {
955
- runLockWatchdogCheck().catch(() => {});
956
- }, intervalMs);
957
- watchdogState.timer.unref?.();
958
- }
959
- function handleTerminationSignal(signal) {
960
- releaseAllLocksSync();
961
- const cleanupState = resolveCleanupState();
962
- if (process.listenerCount(signal) === 1) {
963
- const handler = cleanupState.cleanupHandlers.get(signal);
964
- if (handler) {
965
- process.off(signal, handler);
966
- cleanupState.cleanupHandlers.delete(signal);
967
- }
968
- try {
969
- process.kill(process.pid, signal);
970
- } catch {}
971
- }
972
- }
973
- function registerCleanupHandlers() {
974
- const cleanupState = resolveCleanupState();
975
- if (!cleanupState.registered) {
976
- cleanupState.registered = true;
977
- process.on("exit", () => {
978
- releaseAllLocksSync();
979
- });
980
- }
981
- ensureWatchdogStarted(DEFAULT_WATCHDOG_INTERVAL_MS);
982
- for (const signal of CLEANUP_SIGNALS) {
983
- if (cleanupState.cleanupHandlers.has(signal)) continue;
984
- try {
985
- const handler = () => handleTerminationSignal(signal);
986
- cleanupState.cleanupHandlers.set(signal, handler);
987
- process.on(signal, handler);
988
- } catch {}
989
- }
990
- }
991
- async function readLockPayload(lockPath) {
992
- try {
993
- const raw = await fs$1.readFile(lockPath, "utf8");
994
- const parsed = JSON.parse(raw);
995
- const payload = {};
996
- if (isValidLockNumber(parsed.pid) && parsed.pid > 0) payload.pid = parsed.pid;
997
- if (typeof parsed.createdAt === "string") payload.createdAt = parsed.createdAt;
998
- if (isValidLockNumber(parsed.starttime)) payload.starttime = parsed.starttime;
999
- return payload;
1000
- } catch {
1001
- return null;
1002
- }
1003
- }
1004
- function inspectLockPayload(payload, staleMs, nowMs) {
1005
- const pid = isValidLockNumber(payload?.pid) && payload.pid > 0 ? payload.pid : null;
1006
- const pidAlive = pid !== null ? isPidAlive(pid) : false;
1007
- const createdAt = typeof payload?.createdAt === "string" ? payload.createdAt : null;
1008
- const createdAtMs = createdAt ? Date.parse(createdAt) : NaN;
1009
- const ageMs = Number.isFinite(createdAtMs) ? Math.max(0, nowMs - createdAtMs) : null;
1010
- const storedStarttime = isValidLockNumber(payload?.starttime) ? payload.starttime : null;
1011
- const pidRecycled = pidAlive && pid !== null && storedStarttime !== null ? (() => {
1012
- const currentStarttime = getProcessStartTime(pid);
1013
- return currentStarttime !== null && currentStarttime !== storedStarttime;
1014
- })() : false;
1015
- const staleReasons = [];
1016
- if (pid === null) staleReasons.push("missing-pid");
1017
- else if (!pidAlive) staleReasons.push("dead-pid");
1018
- else if (pidRecycled) staleReasons.push("recycled-pid");
1019
- if (ageMs === null) staleReasons.push("invalid-createdAt");
1020
- else if (ageMs > staleMs) staleReasons.push("too-old");
1021
- return {
1022
- pid,
1023
- pidAlive,
1024
- createdAt,
1025
- ageMs,
1026
- stale: staleReasons.length > 0,
1027
- staleReasons
1028
- };
1029
- }
1030
- function lockInspectionNeedsMtimeStaleFallback(details) {
1031
- return details.stale && details.staleReasons.every((reason) => reason === "missing-pid" || reason === "invalid-createdAt");
1032
- }
1033
- async function shouldReclaimContendedLockFile(lockPath, details, staleMs, nowMs) {
1034
- if (!details.stale) return false;
1035
- if (!lockInspectionNeedsMtimeStaleFallback(details)) return true;
1036
- try {
1037
- const stat = await fs$1.stat(lockPath);
1038
- return Math.max(0, nowMs - stat.mtimeMs) > staleMs;
1039
- } catch (error) {
1040
- return error?.code !== "ENOENT";
1041
- }
1042
- }
1043
- function shouldTreatAsOrphanSelfLock(params) {
1044
- if ((isValidLockNumber(params.payload?.pid) ? params.payload.pid : null) !== process.pid) return false;
1045
- if (isValidLockNumber(params.payload?.starttime)) return false;
1046
- return !HELD_LOCKS.has(params.normalizedSessionFile);
1047
- }
1048
- async function cleanStaleLockFiles(params) {
1049
- const sessionsDir = path.resolve(params.sessionsDir);
1050
- const staleMs = resolvePositiveMs(params.staleMs, DEFAULT_STALE_MS);
1051
- const removeStale = params.removeStale !== false;
1052
- const nowMs = params.nowMs ?? Date.now();
1053
- let entries = [];
1054
- try {
1055
- entries = await fs$1.readdir(sessionsDir, { withFileTypes: true });
1056
- } catch (err) {
1057
- if (err.code === "ENOENT") return {
1058
- locks: [],
1059
- cleaned: []
1060
- };
1061
- throw err;
1062
- }
1063
- const locks = [];
1064
- const cleaned = [];
1065
- const lockEntries = entries.filter((entry) => entry.name.endsWith(".jsonl.lock")).toSorted((a, b) => a.name.localeCompare(b.name));
1066
- for (const entry of lockEntries) {
1067
- const lockPath = path.join(sessionsDir, entry.name);
1068
- const lockInfo = {
1069
- lockPath,
1070
- ...inspectLockPayload(await readLockPayload(lockPath), staleMs, nowMs),
1071
- removed: false
1072
- };
1073
- if (lockInfo.stale && removeStale) {
1074
- await fs$1.rm(lockPath, { force: true });
1075
- lockInfo.removed = true;
1076
- cleaned.push(lockInfo);
1077
- params.log?.warn?.(`removed stale session lock: ${lockPath} (${lockInfo.staleReasons.join(", ") || "unknown"})`);
1078
- }
1079
- locks.push(lockInfo);
1080
- }
1081
- return {
1082
- locks,
1083
- cleaned
1084
- };
1085
- }
1086
- async function acquireSessionWriteLock(params) {
1087
- registerCleanupHandlers();
1088
- const timeoutMs = resolvePositiveMs(params.timeoutMs, 1e4, { allowInfinity: true });
1089
- const staleMs = resolvePositiveMs(params.staleMs, DEFAULT_STALE_MS);
1090
- const maxHoldMs = resolvePositiveMs(params.maxHoldMs, DEFAULT_MAX_HOLD_MS);
1091
- const sessionFile = path.resolve(params.sessionFile);
1092
- const sessionDir = path.dirname(sessionFile);
1093
- await fs$1.mkdir(sessionDir, { recursive: true });
1094
- let normalizedDir = sessionDir;
1095
- try {
1096
- normalizedDir = await fs$1.realpath(sessionDir);
1097
- } catch {}
1098
- const normalizedSessionFile = path.join(normalizedDir, path.basename(sessionFile));
1099
- const lockPath = `${normalizedSessionFile}.lock`;
1100
- const allowReentrant = params.allowReentrant ?? true;
1101
- const held = HELD_LOCKS.get(normalizedSessionFile);
1102
- if (allowReentrant && held) {
1103
- held.count += 1;
1104
- return { release: async () => {
1105
- await releaseHeldLock(normalizedSessionFile, held);
1106
- } };
1107
- }
1108
- const startedAt = Date.now();
1109
- let attempt = 0;
1110
- while (Date.now() - startedAt < timeoutMs) {
1111
- attempt += 1;
1112
- let handle = null;
1113
- try {
1114
- handle = await fs$1.open(lockPath, "wx");
1115
- const createdAt = (/* @__PURE__ */ new Date()).toISOString();
1116
- const starttime = getProcessStartTime(process.pid);
1117
- const lockPayload = {
1118
- pid: process.pid,
1119
- createdAt
1120
- };
1121
- if (starttime !== null) lockPayload.starttime = starttime;
1122
- await handle.writeFile(JSON.stringify(lockPayload, null, 2), "utf8");
1123
- const createdHeld = {
1124
- count: 1,
1125
- handle,
1126
- lockPath,
1127
- acquiredAt: Date.now(),
1128
- maxHoldMs
1129
- };
1130
- HELD_LOCKS.set(normalizedSessionFile, createdHeld);
1131
- return { release: async () => {
1132
- await releaseHeldLock(normalizedSessionFile, createdHeld);
1133
- } };
1134
- } catch (err) {
1135
- if (handle) {
1136
- try {
1137
- await handle.close();
1138
- } catch {}
1139
- try {
1140
- await fs$1.rm(lockPath, { force: true });
1141
- } catch {}
1142
- }
1143
- if (err.code !== "EEXIST") throw err;
1144
- const payload = await readLockPayload(lockPath);
1145
- const nowMs = Date.now();
1146
- const inspected = inspectLockPayload(payload, staleMs, nowMs);
1147
- if (await shouldReclaimContendedLockFile(lockPath, shouldTreatAsOrphanSelfLock({
1148
- payload,
1149
- normalizedSessionFile
1150
- }) ? {
1151
- ...inspected,
1152
- stale: true,
1153
- staleReasons: inspected.staleReasons.includes("orphan-self-pid") ? inspected.staleReasons : [...inspected.staleReasons, "orphan-self-pid"]
1154
- } : inspected, staleMs, nowMs)) {
1155
- await fs$1.rm(lockPath, { force: true });
1156
- continue;
1157
- }
1158
- const delay = Math.min(1e3, 50 * attempt);
1159
- await new Promise((r) => setTimeout(r, delay));
1160
- }
1161
- }
1162
- const payload = await readLockPayload(lockPath);
1163
- const owner = typeof payload?.pid === "number" ? `pid=${payload.pid}` : "unknown";
1164
- throw new Error(`session file locked (timeout ${timeoutMs}ms): ${owner} ${lockPath}`);
1165
- }
1166
- [...CLEANUP_SIGNALS];
1167
- //#endregion
1168
- //#region src/agents/sandbox/registry.ts
1169
- function isRecord(value) {
1170
- return Boolean(value) && typeof value === "object";
1171
- }
1172
- function isRegistryEntry(value) {
1173
- return isRecord(value) && typeof value.containerName === "string";
1174
- }
1175
- function normalizeSandboxRegistryEntry(entry) {
1176
- return {
1177
- ...entry,
1178
- backendId: entry.backendId?.trim() || "docker",
1179
- runtimeLabel: entry.runtimeLabel?.trim() || entry.containerName,
1180
- configLabelKind: entry.configLabelKind?.trim() || "Image"
1181
- };
1182
- }
1183
- function isRegistryFile(value) {
1184
- if (!isRecord(value)) return false;
1185
- const maybeEntries = value.entries;
1186
- return Array.isArray(maybeEntries) && maybeEntries.every(isRegistryEntry);
1187
- }
1188
- async function withRegistryLock(registryPath, fn) {
1189
- const lock = await acquireSessionWriteLock({
1190
- sessionFile: registryPath,
1191
- allowReentrant: false
1192
- });
1193
- try {
1194
- return await fn();
1195
- } finally {
1196
- await lock.release();
1197
- }
1198
- }
1199
- async function readRegistryFromFile(registryPath, mode) {
1200
- try {
1201
- const raw = await fs$1.readFile(registryPath, "utf-8");
1202
- const parsed = JSON.parse(raw);
1203
- if (isRegistryFile(parsed)) return parsed;
1204
- if (mode === "fallback") return { entries: [] };
1205
- throw new Error(`Invalid sandbox registry format: ${registryPath}`);
1206
- } catch (error) {
1207
- if (error?.code === "ENOENT") return { entries: [] };
1208
- if (mode === "fallback") return { entries: [] };
1209
- if (error instanceof Error) throw error;
1210
- throw new Error(`Failed to read sandbox registry file: ${registryPath}`, { cause: error });
1211
- }
1212
- }
1213
- async function writeRegistryFile(registryPath, registry) {
1214
- await writeJsonAtomic(registryPath, registry, { trailingNewline: true });
1215
- }
1216
- async function readRegistry() {
1217
- return { entries: (await readRegistryFromFile(SANDBOX_REGISTRY_PATH, "fallback")).entries.map((entry) => normalizeSandboxRegistryEntry(entry)) };
1218
- }
1219
- function upsertEntry(entries, entry) {
1220
- const existing = entries.find((item) => item.containerName === entry.containerName);
1221
- const next = entries.filter((item) => item.containerName !== entry.containerName);
1222
- next.push({
1223
- ...entry,
1224
- backendId: entry.backendId ?? existing?.backendId,
1225
- runtimeLabel: entry.runtimeLabel ?? existing?.runtimeLabel,
1226
- createdAtMs: existing?.createdAtMs ?? entry.createdAtMs,
1227
- image: existing?.image ?? entry.image,
1228
- configLabelKind: entry.configLabelKind ?? existing?.configLabelKind,
1229
- configHash: entry.configHash ?? existing?.configHash
1230
- });
1231
- return next;
1232
- }
1233
- function removeEntry(entries, containerName) {
1234
- return entries.filter((entry) => entry.containerName !== containerName);
1235
- }
1236
- async function withRegistryMutation(registryPath, mutate) {
1237
- await withRegistryLock(registryPath, async () => {
1238
- const next = mutate((await readRegistryFromFile(registryPath, "strict")).entries);
1239
- if (next === null) return;
1240
- await writeRegistryFile(registryPath, { entries: next });
1241
- });
1242
- }
1243
- async function updateRegistry(entry) {
1244
- await withRegistryMutation(SANDBOX_REGISTRY_PATH, (entries) => upsertEntry(entries, entry));
1245
- }
1246
- async function removeRegistryEntry(containerName) {
1247
- await withRegistryMutation(SANDBOX_REGISTRY_PATH, (entries) => {
1248
- const next = removeEntry(entries, containerName);
1249
- if (next.length === entries.length) return null;
1250
- return next;
1251
- });
1252
- }
1253
- async function readBrowserRegistry() {
1254
- return await readRegistryFromFile(SANDBOX_BROWSER_REGISTRY_PATH, "fallback");
1255
- }
1256
- async function updateBrowserRegistry(entry) {
1257
- await withRegistryMutation(SANDBOX_BROWSER_REGISTRY_PATH, (entries) => upsertEntry(entries, entry));
1258
- }
1259
- async function removeBrowserRegistryEntry(containerName) {
1260
- await withRegistryMutation(SANDBOX_BROWSER_REGISTRY_PATH, (entries) => {
1261
- const next = removeEntry(entries, containerName);
1262
- if (next.length === entries.length) return null;
1263
- return next;
1264
- });
1265
- }
1266
- //#endregion
1267
- //#region src/agents/sandbox/shared.ts
1268
- function slugifySessionKey(value) {
1269
- const trimmed = value.trim() || "session";
1270
- const hash = hashTextSha256(trimmed).slice(0, 8);
1271
- return `${trimmed.toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 32) || "session"}-${hash}`;
1272
- }
1273
- function resolveSandboxWorkspaceDir(root, sessionKey) {
1274
- const resolvedRoot = resolveUserPath(root);
1275
- const slug = slugifySessionKey(sessionKey);
1276
- return path.join(resolvedRoot, slug);
1277
- }
1278
- function resolveSandboxScopeKey(scope, sessionKey) {
1279
- const trimmed = sessionKey.trim() || "main";
1280
- if (scope === "shared") return "shared";
1281
- if (scope === "session") return trimmed;
1282
- return `agent:${resolveAgentIdFromSessionKey(trimmed)}`;
1283
- }
1284
- function resolveSandboxAgentId(scopeKey) {
1285
- const trimmed = scopeKey.trim();
1286
- if (!trimmed || trimmed === "shared") return;
1287
- const parts = trimmed.split(":").filter(Boolean);
1288
- if (parts[0] === "agent" && parts[1]) return normalizeAgentId(parts[1]);
1289
- return resolveAgentIdFromSessionKey(trimmed);
1290
- }
1291
- //#endregion
1292
- //#region src/agents/sandbox/bind-spec.ts
1293
- function splitSandboxBindSpec(spec) {
1294
- const separator = getHostContainerSeparatorIndex(spec);
1295
- if (separator === -1) return null;
1296
- const host = spec.slice(0, separator);
1297
- const rest = spec.slice(separator + 1);
1298
- const optionsStart = rest.indexOf(":");
1299
- if (optionsStart === -1) return {
1300
- host,
1301
- container: rest,
1302
- options: ""
1303
- };
1304
- return {
1305
- host,
1306
- container: rest.slice(0, optionsStart),
1307
- options: rest.slice(optionsStart + 1)
1308
- };
1309
- }
1310
- function getHostContainerSeparatorIndex(spec) {
1311
- const hasDriveLetterPrefix = /^[A-Za-z]:[\\/]/.test(spec);
1312
- for (let i = hasDriveLetterPrefix ? 2 : 0; i < spec.length; i += 1) if (spec[i] === ":") return i;
1313
- return -1;
1314
- }
1315
- //#endregion
1316
- //#region src/agents/sandbox/host-paths.ts
1317
- function stripWindowsNamespacePrefix(input) {
1318
- if (input.startsWith("\\\\?\\")) {
1319
- const withoutPrefix = input.slice(4);
1320
- if (withoutPrefix.toUpperCase().startsWith("UNC\\")) return `\\\\${withoutPrefix.slice(4)}`;
1321
- return withoutPrefix;
1322
- }
1323
- if (input.startsWith("//?/")) {
1324
- const withoutPrefix = input.slice(4);
1325
- if (withoutPrefix.toUpperCase().startsWith("UNC/")) return `//${withoutPrefix.slice(4)}`;
1326
- return withoutPrefix;
1327
- }
1328
- return input;
1329
- }
1330
- /**
1331
- * Normalize a POSIX host path: resolve `.`, `..`, collapse `//`, strip trailing `/`.
1332
- */
1333
- function normalizeSandboxHostPath(raw) {
1334
- const trimmed = stripWindowsNamespacePrefix(raw.trim());
1335
- if (!trimmed) return "/";
1336
- return posix.normalize(trimmed.replaceAll("\\", "/")).replace(/\/+$/, "") || "/";
1337
- }
1338
- /**
1339
- * Resolve a path through the deepest existing ancestor so parent symlinks are honored
1340
- * even when the final source leaf does not exist yet.
1341
- */
1342
- function resolveSandboxHostPathViaExistingAncestor(sourcePath) {
1343
- if (!sourcePath.startsWith("/")) return sourcePath;
1344
- return normalizeSandboxHostPath(resolvePathViaExistingAncestorSync(sourcePath));
1345
- }
1346
- //#endregion
1347
- //#region src/agents/sandbox/validate-sandbox-security.ts
1348
- /**
1349
- * Sandbox security validation — blocks dangerous Docker configurations.
1350
- *
1351
- * Threat model: local-trusted config, but protect against foot-guns and config injection.
1352
- * Enforced at runtime when creating sandbox containers.
1353
- */
1354
- const BLOCKED_HOST_PATHS = [
1355
- "/etc",
1356
- "/private/etc",
1357
- "/proc",
1358
- "/sys",
1359
- "/dev",
1360
- "/root",
1361
- "/boot",
1362
- "/run",
1363
- "/var/run",
1364
- "/private/var/run",
1365
- "/var/run/docker.sock",
1366
- "/private/var/run/docker.sock",
1367
- "/run/docker.sock"
1368
- ];
1369
- const BLOCKED_SECCOMP_PROFILES = new Set(["unconfined"]);
1370
- const BLOCKED_APPARMOR_PROFILES = new Set(["unconfined"]);
1371
- const RESERVED_CONTAINER_TARGET_PATHS = ["/workspace", SANDBOX_AGENT_WORKSPACE_MOUNT];
1372
- function parseBindSpec(bind) {
1373
- const trimmed = bind.trim();
1374
- const parsed = splitSandboxBindSpec(trimmed);
1375
- if (!parsed) return {
1376
- source: trimmed,
1377
- target: ""
1378
- };
1379
- return {
1380
- source: parsed.host,
1381
- target: parsed.container
1382
- };
1383
- }
1384
- /**
1385
- * Parse the host/source path from a Docker bind mount string.
1386
- * Format: `source:target[:mode]`
1387
- */
1388
- function parseBindSourcePath(bind) {
1389
- return parseBindSpec(bind).source.trim();
1390
- }
1391
- function parseBindTargetPath(bind) {
1392
- return parseBindSpec(bind).target.trim();
1393
- }
1394
- /**
1395
- * Normalize a POSIX path: resolve `.`, `..`, collapse `//`, strip trailing `/`.
1396
- */
1397
- function normalizeHostPath(raw) {
1398
- return normalizeSandboxHostPath(raw);
1399
- }
1400
- /**
1401
- * String-only blocked-path check (no filesystem I/O).
1402
- * Blocks:
1403
- * - binds that target blocked paths (equal or under)
1404
- * - binds that cover the system root (mounting "/" is never safe)
1405
- * - non-absolute source paths (relative / volume names) because they are hard to validate safely
1406
- */
1407
- function getBlockedBindReason(bind) {
1408
- const sourceRaw = parseBindSourcePath(bind);
1409
- if (!sourceRaw.startsWith("/")) return {
1410
- kind: "non_absolute",
1411
- sourcePath: sourceRaw
1412
- };
1413
- return getBlockedReasonForSourcePath(normalizeHostPath(sourceRaw));
1414
- }
1415
- function getBlockedReasonForSourcePath(sourceNormalized) {
1416
- if (sourceNormalized === "/") return {
1417
- kind: "covers",
1418
- blockedPath: "/"
1419
- };
1420
- for (const blocked of BLOCKED_HOST_PATHS) if (sourceNormalized === blocked || sourceNormalized.startsWith(blocked + "/")) return {
1421
- kind: "targets",
1422
- blockedPath: blocked
1423
- };
1424
- return null;
1425
- }
1426
- function normalizeAllowedRoots(roots) {
1427
- if (!roots?.length) return [];
1428
- const normalized = roots.map((entry) => entry.trim()).filter((entry) => entry.startsWith("/")).map(normalizeHostPath);
1429
- const expanded = /* @__PURE__ */ new Set();
1430
- for (const root of normalized) {
1431
- expanded.add(root);
1432
- const real = resolveSandboxHostPathViaExistingAncestor(root);
1433
- if (real !== root) expanded.add(real);
1434
- }
1435
- return [...expanded];
1436
- }
1437
- function isPathInsidePosix(root, target) {
1438
- if (root === "/") return true;
1439
- return target === root || target.startsWith(`${root}/`);
1440
- }
1441
- function getOutsideAllowedRootsReason(sourceNormalized, allowedRoots) {
1442
- if (allowedRoots.length === 0) return null;
1443
- for (const root of allowedRoots) if (isPathInsidePosix(root, sourceNormalized)) return null;
1444
- return {
1445
- kind: "outside_allowed_roots",
1446
- sourcePath: sourceNormalized,
1447
- allowedRoots
1448
- };
1449
- }
1450
- function getReservedTargetReason(bind) {
1451
- const targetRaw = parseBindTargetPath(bind);
1452
- if (!targetRaw || !targetRaw.startsWith("/")) return null;
1453
- const target = normalizeHostPath(targetRaw);
1454
- for (const reserved of RESERVED_CONTAINER_TARGET_PATHS) if (isPathInsidePosix(reserved, target)) return {
1455
- kind: "reserved_target",
1456
- targetPath: target,
1457
- reservedPath: reserved
1458
- };
1459
- return null;
1460
- }
1461
- function enforceSourcePathPolicy(params) {
1462
- const blockedReason = getBlockedReasonForSourcePath(params.sourcePath);
1463
- if (blockedReason) throw formatBindBlockedError({
1464
- bind: params.bind,
1465
- reason: blockedReason
1466
- });
1467
- if (params.allowSourcesOutsideAllowedRoots) return;
1468
- const allowedReason = getOutsideAllowedRootsReason(params.sourcePath, params.allowedRoots);
1469
- if (allowedReason) throw formatBindBlockedError({
1470
- bind: params.bind,
1471
- reason: allowedReason
1472
- });
1473
- }
1474
- function formatBindBlockedError(params) {
1475
- if (params.reason.kind === "non_absolute") return /* @__PURE__ */ new Error(`Sandbox security: bind mount "${params.bind}" uses a non-absolute source path "${params.reason.sourcePath}". Only absolute POSIX paths are supported for sandbox binds.`);
1476
- if (params.reason.kind === "outside_allowed_roots") return /* @__PURE__ */ new Error(`Sandbox security: bind mount "${params.bind}" source "${params.reason.sourcePath}" is outside allowed roots (${params.reason.allowedRoots.join(", ")}). Use a dangerous override only when you fully trust this runtime.`);
1477
- if (params.reason.kind === "reserved_target") return /* @__PURE__ */ new Error(`Sandbox security: bind mount "${params.bind}" targets reserved container path "${params.reason.reservedPath}" (resolved target: "${params.reason.targetPath}"). This can shadow moldClaw sandbox mounts. Use a dangerous override only when you fully trust this runtime.`);
1478
- const verb = params.reason.kind === "covers" ? "covers" : "targets";
1479
- return /* @__PURE__ */ new Error(`Sandbox security: bind mount "${params.bind}" ${verb} blocked path "${params.reason.blockedPath}". Mounting system directories (or Docker socket paths) into sandbox containers is not allowed. Use project-specific paths instead (e.g. /home/user/myproject).`);
1480
- }
1481
- /**
1482
- * Validate bind mounts — throws if any source path is dangerous.
1483
- * Includes a symlink/realpath pass via existing ancestors so non-existent leaf
1484
- * paths cannot bypass source-root and blocked-path checks.
1485
- */
1486
- function validateBindMounts(binds, options) {
1487
- if (!binds?.length) return;
1488
- const allowedRoots = normalizeAllowedRoots(options?.allowedSourceRoots);
1489
- for (const rawBind of binds) {
1490
- const bind = rawBind.trim();
1491
- if (!bind) continue;
1492
- const blocked = getBlockedBindReason(bind);
1493
- if (blocked) throw formatBindBlockedError({
1494
- bind,
1495
- reason: blocked
1496
- });
1497
- if (!options?.allowReservedContainerTargets) {
1498
- const reservedTarget = getReservedTargetReason(bind);
1499
- if (reservedTarget) throw formatBindBlockedError({
1500
- bind,
1501
- reason: reservedTarget
1502
- });
1503
- }
1504
- const sourceNormalized = normalizeHostPath(parseBindSourcePath(bind));
1505
- enforceSourcePathPolicy({
1506
- bind,
1507
- sourcePath: sourceNormalized,
1508
- allowedRoots,
1509
- allowSourcesOutsideAllowedRoots: options?.allowSourcesOutsideAllowedRoots === true
1510
- });
1511
- enforceSourcePathPolicy({
1512
- bind,
1513
- sourcePath: resolveSandboxHostPathViaExistingAncestor(sourceNormalized),
1514
- allowedRoots,
1515
- allowSourcesOutsideAllowedRoots: options?.allowSourcesOutsideAllowedRoots === true
1516
- });
1517
- }
1518
- }
1519
- function validateNetworkMode(network, options) {
1520
- const blockedReason = getBlockedNetworkModeReason({
1521
- network,
1522
- allowContainerNamespaceJoin: options?.allowContainerNamespaceJoin
1523
- });
1524
- if (blockedReason === "host") throw new Error(`Sandbox security: network mode "${network}" is blocked. Network "host" mode bypasses container network isolation. Use "bridge" or "none" instead.`);
1525
- if (blockedReason === "container_namespace_join") throw new Error(`Sandbox security: network mode "${network}" is blocked by default. Network "container:*" joins another container namespace and bypasses sandbox network isolation. Use a custom bridge network, or set dangerouslyAllowContainerNamespaceJoin=true only when you fully trust this runtime.`);
1526
- }
1527
- function validateSeccompProfile(profile) {
1528
- if (profile && BLOCKED_SECCOMP_PROFILES.has(profile.trim().toLowerCase())) throw new Error(`Sandbox security: seccomp profile "${profile}" is blocked. Disabling seccomp removes syscall filtering and weakens sandbox isolation. Use a custom seccomp profile file or omit this setting.`);
1529
- }
1530
- function validateApparmorProfile(profile) {
1531
- if (profile && BLOCKED_APPARMOR_PROFILES.has(profile.trim().toLowerCase())) throw new Error(`Sandbox security: apparmor profile "${profile}" is blocked. Disabling AppArmor removes mandatory access controls and weakens sandbox isolation. Use a named AppArmor profile or omit this setting.`);
1532
- }
1533
- function validateSandboxSecurity(cfg) {
1534
- validateBindMounts(cfg.binds, cfg);
1535
- validateNetworkMode(cfg.network, { allowContainerNamespaceJoin: cfg.dangerouslyAllowContainerNamespaceJoin === true });
1536
- validateSeccompProfile(cfg.seccompProfile);
1537
- validateApparmorProfile(cfg.apparmorProfile);
1538
- }
1539
- //#endregion
1540
- //#region src/agents/sandbox/workspace-mounts.ts
1541
- function mainWorkspaceMountSuffix(access) {
1542
- return access === "rw" ? "" : ":ro";
1543
- }
1544
- function agentWorkspaceMountSuffix(access) {
1545
- return access === "ro" ? ":ro" : "";
1546
- }
1547
- function appendWorkspaceMountArgs(params) {
1548
- const { args, workspaceDir, agentWorkspaceDir, workdir, workspaceAccess } = params;
1549
- args.push("-v", `${workspaceDir}:${workdir}${mainWorkspaceMountSuffix(workspaceAccess)}`);
1550
- if (workspaceAccess !== "none" && workspaceDir !== agentWorkspaceDir) args.push("-v", `${agentWorkspaceDir}:${SANDBOX_AGENT_WORKSPACE_MOUNT}${agentWorkspaceMountSuffix(workspaceAccess)}`);
1551
- }
1552
- //#endregion
1553
- //#region src/agents/sandbox/docker.ts
1554
- function createAbortError() {
1555
- const err = /* @__PURE__ */ new Error("Aborted");
1556
- err.name = "AbortError";
1557
- return err;
1558
- }
1559
- const DEFAULT_DOCKER_SPAWN_RUNTIME = {
1560
- platform: process.platform,
1561
- env: process.env,
1562
- execPath: process.execPath
1563
- };
1564
- function resolveDockerSpawnInvocation(args, runtime = DEFAULT_DOCKER_SPAWN_RUNTIME) {
1565
- const resolved = materializeWindowsSpawnProgram(resolveWindowsSpawnProgram({
1566
- command: "docker",
1567
- platform: runtime.platform,
1568
- env: runtime.env,
1569
- execPath: runtime.execPath,
1570
- packageName: "docker",
1571
- allowShellFallback: false
1572
- }), args);
1573
- return {
1574
- command: resolved.command,
1575
- args: resolved.argv,
1576
- shell: resolved.shell,
1577
- windowsHide: resolved.windowsHide
1578
- };
1579
- }
1580
- function execDockerRaw(args, opts) {
1581
- return new Promise((resolve, reject) => {
1582
- const spawnInvocation = resolveDockerSpawnInvocation(args);
1583
- const child = spawn(spawnInvocation.command, spawnInvocation.args, {
1584
- stdio: [
1585
- "pipe",
1586
- "pipe",
1587
- "pipe"
1588
- ],
1589
- shell: spawnInvocation.shell,
1590
- windowsHide: spawnInvocation.windowsHide
1591
- });
1592
- const stdoutChunks = [];
1593
- const stderrChunks = [];
1594
- let aborted = false;
1595
- const signal = opts?.signal;
1596
- const handleAbort = () => {
1597
- if (aborted) return;
1598
- aborted = true;
1599
- child.kill("SIGTERM");
1600
- };
1601
- if (signal) if (signal.aborted) handleAbort();
1602
- else signal.addEventListener("abort", handleAbort);
1603
- child.stdout?.on("data", (chunk) => {
1604
- stdoutChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
1605
- });
1606
- child.stderr?.on("data", (chunk) => {
1607
- stderrChunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
1608
- });
1609
- child.on("error", (error) => {
1610
- if (signal) signal.removeEventListener("abort", handleAbort);
1611
- if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") {
1612
- reject(Object.assign(/* @__PURE__ */ new Error("Sandbox mode requires Docker, but the \"docker\" command was not found in PATH. Install Docker (and ensure \"docker\" is available), or set `agents.defaults.sandbox.mode=off` to disable sandboxing."), {
1613
- code: "INVALID_CONFIG",
1614
- cause: error
1615
- }));
1616
- return;
1617
- }
1618
- reject(error);
1619
- });
1620
- child.on("close", (code) => {
1621
- if (signal) signal.removeEventListener("abort", handleAbort);
1622
- const stdout = Buffer.concat(stdoutChunks);
1623
- const stderr = Buffer.concat(stderrChunks);
1624
- if (aborted || signal?.aborted) {
1625
- reject(createAbortError());
1626
- return;
1627
- }
1628
- const exitCode = code ?? 0;
1629
- if (exitCode !== 0 && !opts?.allowFailure) {
1630
- const message = stderr.length > 0 ? stderr.toString("utf8").trim() : "";
1631
- reject(Object.assign(new Error(message || `docker ${args.join(" ")} failed`), {
1632
- code: exitCode,
1633
- stdout,
1634
- stderr
1635
- }));
1636
- return;
1637
- }
1638
- resolve({
1639
- stdout,
1640
- stderr,
1641
- code: exitCode
1642
- });
1643
- });
1644
- const stdin = child.stdin;
1645
- if (stdin) if (opts?.input !== void 0) stdin.end(opts.input);
1646
- else stdin.end();
1647
- });
1648
- }
1649
- const log = createSubsystemLogger("docker");
1650
- const HOT_CONTAINER_WINDOW_MS = 300 * 1e3;
1651
- async function execDocker(args, opts) {
1652
- const result = await execDockerRaw(args, opts);
1653
- return {
1654
- stdout: result.stdout.toString("utf8"),
1655
- stderr: result.stderr.toString("utf8"),
1656
- code: result.code
1657
- };
1658
- }
1659
- async function readDockerContainerLabel(containerName, label) {
1660
- const result = await execDocker([
1661
- "inspect",
1662
- "-f",
1663
- `{{ index .Config.Labels "${label}" }}`,
1664
- containerName
1665
- ], { allowFailure: true });
1666
- if (result.code !== 0) return null;
1667
- const raw = result.stdout.trim();
1668
- if (!raw || raw === "<no value>") return null;
1669
- return raw;
1670
- }
1671
- async function readDockerContainerEnvVar(containerName, envVar) {
1672
- const result = await execDocker([
1673
- "inspect",
1674
- "-f",
1675
- "{{range .Config.Env}}{{println .}}{{end}}",
1676
- containerName
1677
- ], { allowFailure: true });
1678
- if (result.code !== 0) return null;
1679
- for (const line of result.stdout.split(/\r?\n/)) if (line.startsWith(`${envVar}=`)) return line.slice(envVar.length + 1);
1680
- return null;
1681
- }
1682
- async function readDockerPort(containerName, port) {
1683
- const result = await execDocker([
1684
- "port",
1685
- containerName,
1686
- `${port}/tcp`
1687
- ], { allowFailure: true });
1688
- if (result.code !== 0) return null;
1689
- const match = (result.stdout.trim().split(/\r?\n/)[0] ?? "").match(/:(\d+)\s*$/);
1690
- if (!match) return null;
1691
- const mapped = Number.parseInt(match[1] ?? "", 10);
1692
- return Number.isFinite(mapped) ? mapped : null;
1693
- }
1694
- async function dockerImageExists(image) {
1695
- const result = await execDocker([
1696
- "image",
1697
- "inspect",
1698
- image
1699
- ], { allowFailure: true });
1700
- if (result.code === 0) return true;
1701
- const stderr = result.stderr.trim();
1702
- if (stderr.includes("No such image")) return false;
1703
- throw new Error(`Failed to inspect sandbox image: ${stderr}`);
1704
- }
1705
- async function ensureDockerImage(image) {
1706
- if (await dockerImageExists(image)) return;
1707
- if (image === "moldclaw-sandbox:bookworm-slim") {
1708
- await execDocker(["pull", "debian:bookworm-slim"]);
1709
- await execDocker([
1710
- "tag",
1711
- "debian:bookworm-slim",
1712
- DEFAULT_SANDBOX_IMAGE
1713
- ]);
1714
- return;
1715
- }
1716
- throw new Error(`Sandbox image not found: ${image}. Build or pull it first.`);
1717
- }
1718
- async function dockerContainerState(name) {
1719
- const result = await execDocker([
1720
- "inspect",
1721
- "-f",
1722
- "{{.State.Running}}",
1723
- name
1724
- ], { allowFailure: true });
1725
- if (result.code !== 0) return {
1726
- exists: false,
1727
- running: false
1728
- };
1729
- return {
1730
- exists: true,
1731
- running: result.stdout.trim() === "true"
1732
- };
1733
- }
1734
- function normalizeDockerLimit(value) {
1735
- if (value === void 0 || value === null) return;
1736
- if (typeof value === "number") return Number.isFinite(value) ? String(value) : void 0;
1737
- const trimmed = value.trim();
1738
- return trimmed ? trimmed : void 0;
1739
- }
1740
- function formatUlimitValue(name, value) {
1741
- if (!name.trim()) return null;
1742
- if (typeof value === "number" || typeof value === "string") {
1743
- const raw = String(value).trim();
1744
- return raw ? `${name}=${raw}` : null;
1745
- }
1746
- const soft = typeof value.soft === "number" ? Math.max(0, value.soft) : void 0;
1747
- const hard = typeof value.hard === "number" ? Math.max(0, value.hard) : void 0;
1748
- if (soft === void 0 && hard === void 0) return null;
1749
- if (soft === void 0) return `${name}=${hard}`;
1750
- if (hard === void 0) return `${name}=${soft}`;
1751
- return `${name}=${soft}:${hard}`;
1752
- }
1753
- function buildSandboxCreateArgs(params) {
1754
- validateSandboxSecurity({
1755
- ...params.cfg,
1756
- allowedSourceRoots: params.bindSourceRoots,
1757
- allowSourcesOutsideAllowedRoots: params.allowSourcesOutsideAllowedRoots ?? params.cfg.dangerouslyAllowExternalBindSources === true,
1758
- allowReservedContainerTargets: params.allowReservedContainerTargets ?? params.cfg.dangerouslyAllowReservedContainerTargets === true,
1759
- dangerouslyAllowContainerNamespaceJoin: params.allowContainerNamespaceJoin ?? params.cfg.dangerouslyAllowContainerNamespaceJoin === true
1760
- });
1761
- const createdAtMs = params.createdAtMs ?? Date.now();
1762
- const args = [
1763
- "create",
1764
- "--name",
1765
- params.name
1766
- ];
1767
- args.push("--label", "moldclaw.sandbox=1");
1768
- args.push("--label", `moldclaw.sessionKey=${params.scopeKey}`);
1769
- args.push("--label", `moldclaw.createdAtMs=${createdAtMs}`);
1770
- if (params.configHash) args.push("--label", `moldclaw.configHash=${params.configHash}`);
1771
- for (const [key, value] of Object.entries(params.labels ?? {})) if (key && value) args.push("--label", `${key}=${value}`);
1772
- if (params.cfg.readOnlyRoot) args.push("--read-only");
1773
- for (const entry of params.cfg.tmpfs) args.push("--tmpfs", entry);
1774
- if (params.cfg.network) args.push("--network", params.cfg.network);
1775
- if (params.cfg.user) args.push("--user", params.cfg.user);
1776
- const envSanitization = sanitizeEnvVars(params.cfg.env ?? {}, params.envSanitizationOptions);
1777
- if (envSanitization.blocked.length > 0) log.warn(`Blocked sensitive environment variables: ${envSanitization.blocked.join(", ")}`);
1778
- if (envSanitization.warnings.length > 0) log.warn(`Suspicious environment variables: ${envSanitization.warnings.join(", ")}`);
1779
- for (const [key, value] of Object.entries(markmoldClawExecEnv(envSanitization.allowed))) args.push("--env", `${key}=${value}`);
1780
- for (const cap of params.cfg.capDrop) args.push("--cap-drop", cap);
1781
- args.push("--security-opt", "no-new-privileges");
1782
- if (params.cfg.seccompProfile) args.push("--security-opt", `seccomp=${params.cfg.seccompProfile}`);
1783
- if (params.cfg.apparmorProfile) args.push("--security-opt", `apparmor=${params.cfg.apparmorProfile}`);
1784
- for (const entry of params.cfg.dns ?? []) if (entry.trim()) args.push("--dns", entry);
1785
- for (const entry of params.cfg.extraHosts ?? []) if (entry.trim()) args.push("--add-host", entry);
1786
- if (typeof params.cfg.pidsLimit === "number" && params.cfg.pidsLimit > 0) args.push("--pids-limit", String(params.cfg.pidsLimit));
1787
- const memory = normalizeDockerLimit(params.cfg.memory);
1788
- if (memory) args.push("--memory", memory);
1789
- const memorySwap = normalizeDockerLimit(params.cfg.memorySwap);
1790
- if (memorySwap) args.push("--memory-swap", memorySwap);
1791
- if (typeof params.cfg.cpus === "number" && params.cfg.cpus > 0) args.push("--cpus", String(params.cfg.cpus));
1792
- for (const [name, value] of Object.entries(params.cfg.ulimits ?? {})) {
1793
- const formatted = formatUlimitValue(name, value);
1794
- if (formatted) args.push("--ulimit", formatted);
1795
- }
1796
- if (params.includeBinds !== false && params.cfg.binds?.length) for (const bind of params.cfg.binds) args.push("-v", bind);
1797
- return args;
1798
- }
1799
- function appendCustomBinds(args, cfg) {
1800
- if (!cfg.binds?.length) return;
1801
- for (const bind of cfg.binds) args.push("-v", bind);
1802
- }
1803
- async function createSandboxContainer(params) {
1804
- const { name, cfg, workspaceDir, scopeKey } = params;
1805
- await ensureDockerImage(cfg.image);
1806
- const args = buildSandboxCreateArgs({
1807
- name,
1808
- cfg,
1809
- scopeKey,
1810
- configHash: params.configHash,
1811
- includeBinds: false,
1812
- bindSourceRoots: [workspaceDir, params.agentWorkspaceDir]
1813
- });
1814
- args.push("--workdir", cfg.workdir);
1815
- appendWorkspaceMountArgs({
1816
- args,
1817
- workspaceDir,
1818
- agentWorkspaceDir: params.agentWorkspaceDir,
1819
- workdir: cfg.workdir,
1820
- workspaceAccess: params.workspaceAccess
1821
- });
1822
- appendCustomBinds(args, cfg);
1823
- args.push(cfg.image, "sleep", "infinity");
1824
- await execDocker(args);
1825
- await execDocker(["start", name]);
1826
- if (cfg.setupCommand?.trim()) await execDocker([
1827
- "exec",
1828
- "-i",
1829
- name,
1830
- "/bin/sh",
1831
- "-lc",
1832
- cfg.setupCommand
1833
- ]);
1834
- }
1835
- async function readContainerConfigHash(containerName) {
1836
- return await readDockerContainerLabel(containerName, "moldclaw.configHash");
1837
- }
1838
- function formatSandboxRecreateHint(params) {
1839
- if (params.scope === "session") return formatCliCommand(`moldclaw sandbox recreate --session ${params.sessionKey}`);
1840
- if (params.scope === "agent") return formatCliCommand(`moldclaw sandbox recreate --agent ${resolveSandboxAgentId(params.sessionKey) ?? "main"}`);
1841
- return formatCliCommand("moldclaw sandbox recreate --all");
1842
- }
1843
- async function ensureSandboxContainer(params) {
1844
- const scopeKey = resolveSandboxScopeKey(params.cfg.scope, params.sessionKey);
1845
- const slug = params.cfg.scope === "shared" ? "shared" : slugifySessionKey(scopeKey);
1846
- const containerName = `${params.cfg.docker.containerPrefix}${slug}`.slice(0, 63);
1847
- const expectedHash = computeSandboxConfigHash({
1848
- docker: params.cfg.docker,
1849
- workspaceAccess: params.cfg.workspaceAccess,
1850
- workspaceDir: params.workspaceDir,
1851
- agentWorkspaceDir: params.agentWorkspaceDir
1852
- });
1853
- const now = Date.now();
1854
- const state = await dockerContainerState(containerName);
1855
- let hasContainer = state.exists;
1856
- let running = state.running;
1857
- let currentHash = null;
1858
- let hashMismatch = false;
1859
- let registryEntry;
1860
- if (hasContainer) {
1861
- registryEntry = (await readRegistry()).entries.find((entry) => entry.containerName === containerName);
1862
- currentHash = await readContainerConfigHash(containerName);
1863
- if (!currentHash) currentHash = registryEntry?.configHash ?? null;
1864
- hashMismatch = !currentHash || currentHash !== expectedHash;
1865
- if (hashMismatch) {
1866
- const lastUsedAtMs = registryEntry?.lastUsedAtMs;
1867
- if (running && (typeof lastUsedAtMs !== "number" || now - lastUsedAtMs < HOT_CONTAINER_WINDOW_MS)) {
1868
- const hint = formatSandboxRecreateHint({
1869
- scope: params.cfg.scope,
1870
- sessionKey: scopeKey
1871
- });
1872
- defaultRuntime.log(`Sandbox config changed for ${containerName} (recently used). Recreate to apply: ${hint}`);
1873
- } else {
1874
- await execDocker([
1875
- "rm",
1876
- "-f",
1877
- containerName
1878
- ], { allowFailure: true });
1879
- hasContainer = false;
1880
- running = false;
1881
- }
1882
- }
1883
- }
1884
- if (!hasContainer) await createSandboxContainer({
1885
- name: containerName,
1886
- cfg: params.cfg.docker,
1887
- workspaceDir: params.workspaceDir,
1888
- workspaceAccess: params.cfg.workspaceAccess,
1889
- agentWorkspaceDir: params.agentWorkspaceDir,
1890
- scopeKey,
1891
- configHash: expectedHash
1892
- });
1893
- else if (!running) await execDocker(["start", containerName]);
1894
- await updateRegistry({
1895
- containerName,
1896
- backendId: "docker",
1897
- runtimeLabel: containerName,
1898
- sessionKey: scopeKey,
1899
- createdAtMs: now,
1900
- lastUsedAtMs: now,
1901
- image: params.cfg.docker.image,
1902
- configLabelKind: "Image",
1903
- configHash: hashMismatch && running ? currentHash ?? void 0 : expectedHash
1904
- });
1905
- return containerName;
1906
- }
1907
- //#endregion
1908
- //#region src/config/commands.ts
1909
- function resolveAutoDefault(providerId) {
1910
- const id = normalizeChannelId(providerId);
1911
- if (!id) return false;
1912
- if (id === "discord" || id === "telegram") return true;
1913
- if (id === "slack") return false;
1914
- return false;
1915
- }
1916
- function resolveNativeSkillsEnabled(params) {
1917
- return resolveNativeCommandSetting(params);
1918
- }
1919
- function resolveNativeCommandsEnabled(params) {
1920
- return resolveNativeCommandSetting(params);
1921
- }
1922
- function resolveNativeCommandSetting(params) {
1923
- const { providerId, providerSetting, globalSetting } = params;
1924
- const setting = providerSetting === void 0 ? globalSetting : providerSetting;
1925
- if (setting === true) return true;
1926
- if (setting === false) return false;
1927
- return resolveAutoDefault(providerId);
1928
- }
1929
- function isNativeCommandsExplicitlyDisabled(params) {
1930
- const { providerSetting, globalSetting } = params;
1931
- if (providerSetting === false) return true;
1932
- if (providerSetting === void 0) return globalSetting === false;
1933
- return false;
1934
- }
1935
- function getOwnCommandFlagValue(config, key) {
1936
- const { commands } = config ?? {};
1937
- if (!isPlainObject(commands) || !Object.hasOwn(commands, key)) return;
1938
- return commands[key];
1939
- }
1940
- function isCommandFlagEnabled(config, key) {
1941
- return getOwnCommandFlagValue(config, key) === true;
1942
- }
1943
- function isRestartEnabled(config) {
1944
- return getOwnCommandFlagValue(config, "restart") !== false;
1945
- }
1946
- //#endregion
1947
- //#region src/agents/sandbox-tool-policy.ts
1948
- function unionAllow(base, extra) {
1949
- if (!Array.isArray(extra) || extra.length === 0) return base;
1950
- if (!Array.isArray(base) || base.length === 0) return Array.from(new Set(["*", ...extra]));
1951
- return Array.from(new Set([...base, ...extra]));
1952
- }
1953
- function pickSandboxToolPolicy(config) {
1954
- if (!config) return;
1955
- const allow = Array.isArray(config.allow) ? unionAllow(config.allow, config.alsoAllow) : Array.isArray(config.alsoAllow) && config.alsoAllow.length > 0 ? unionAllow(void 0, config.alsoAllow) : void 0;
1956
- const deny = Array.isArray(config.deny) ? config.deny : void 0;
1957
- if (!allow && !deny) return;
1958
- return {
1959
- allow,
1960
- deny
1961
- };
1962
- }
1963
- //#endregion
1964
- //#region src/agents/tool-policy-match.ts
1965
- function makeToolPolicyMatcher(policy) {
1966
- const deny = compileGlobPatterns({
1967
- raw: expandToolGroups(policy.deny ?? []),
1968
- normalize: normalizeToolName
1969
- });
1970
- const allow = compileGlobPatterns({
1971
- raw: expandToolGroups(policy.allow ?? []),
1972
- normalize: normalizeToolName
1973
- });
1974
- return (name) => {
1975
- const normalized = normalizeToolName(name);
1976
- if (matchesAnyGlobPattern(normalized, deny)) return false;
1977
- if (allow.length === 0) return true;
1978
- if (matchesAnyGlobPattern(normalized, allow)) return true;
1979
- if (normalized === "apply_patch" && matchesAnyGlobPattern("exec", allow)) return true;
1980
- return false;
1981
- };
1982
- }
1983
- function isToolAllowedByPolicyName(name, policy) {
1984
- if (!policy) return true;
1985
- return makeToolPolicyMatcher(policy)(name);
1986
- }
1987
- function isToolAllowedByPolicies(name, policies) {
1988
- return policies.every((policy) => isToolAllowedByPolicyName(name, policy));
1989
- }
1990
- //#endregion
1991
- //#region src/agents/workspace-dirs.ts
1992
- function listAgentWorkspaceDirs(cfg) {
1993
- const dirs = /* @__PURE__ */ new Set();
1994
- const list = cfg.agents?.list;
1995
- if (Array.isArray(list)) {
1996
- for (const entry of list) if (entry && typeof entry === "object" && typeof entry.id === "string") dirs.add(resolveAgentWorkspaceDir(cfg, entry.id));
1997
- }
1998
- dirs.add(resolveAgentWorkspaceDir(cfg, resolveDefaultAgentId(cfg)));
1999
- return [...dirs];
2000
- }
2001
- //#endregion
2002
- export { listCoreToolSections as $, removeRegistryEntry as A, isToolAllowed as B, resolveSandboxAgentId as C, readBrowserRegistry as D, slugifySessionKey as E, resolveSessionLockMaxHoldFromTimeout as F, expandPolicyWithPluginGroups as G, applyOwnerOnlyToolPolicy as H, computeSandboxBrowserConfigHash as I, expandToolGroups as J, mergeAlsoAllowPolicy as K, resolveSandboxBrowserDockerCreateConfig as L, updateRegistry as M, acquireSessionWriteLock as N, readRegistry as O, cleanStaleLockFiles as P, isKnownCoreToolId as Q, resolveSandboxConfigForAgent as R, splitSandboxBindSpec as S, resolveSandboxWorkspaceDir as T, buildPluginToolGroups as U, resolveSandboxToolPolicyForAgent as V, collectExplicitAllowlist as W, resolveToolProfilePolicy as X, normalizeToolName as Y, PROFILE_OPTIONS as Z, readDockerPort as _, isCommandFlagEnabled as a, DEFAULT_SANDBOX_IMAGE as at, validateNetworkMode as b, resolveNativeCommandsEnabled as c, dockerContainerState as d, resolveCoreToolProfiles as et, ensureSandboxContainer as f, readDockerContainerLabel as g, readDockerContainerEnvVar as h, pickSandboxToolPolicy as i, DEFAULT_SANDBOX_COMMON_IMAGE as it, updateBrowserRegistry as j, removeBrowserRegistryEntry as k, resolveNativeSkillsEnabled as l, execDockerRaw as m, isToolAllowedByPolicies as n, matchesAnyGlobPattern as nt, isNativeCommandsExplicitlyDisabled as o, SANDBOX_AGENT_WORKSPACE_MOUNT as ot, execDocker as p, stripPluginOnlyAllowlist as q, isToolAllowedByPolicyName as r, DEFAULT_SANDBOX_BROWSER_IMAGE as rt, isRestartEnabled as s, SANDBOX_BROWSER_SECURITY_HASH_EPOCH as st, listAgentWorkspaceDirs as t, compileGlobPatterns as tt, buildSandboxCreateArgs as u, appendWorkspaceMountArgs as v, resolveSandboxScopeKey as w, resolveSandboxHostPathViaExistingAncestor as x, getBlockedBindReason as y, resolveSandboxScope as z };