clawmini 0.0.7 → 0.0.9

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 (367) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/config.json +14 -0
  3. package/.github/workflows/release.yml +49 -0
  4. package/CHANGELOG.md +36 -0
  5. package/README.md +5 -4
  6. package/dist/adapter-discord/index.d.mts.map +1 -1
  7. package/dist/adapter-discord/index.mjs +465 -282
  8. package/dist/adapter-discord/index.mjs.map +1 -1
  9. package/dist/adapter-google-chat/index.mjs +367 -243
  10. package/dist/adapter-google-chat/index.mjs.map +1 -1
  11. package/dist/cli/index.mjs +684 -24
  12. package/dist/cli/index.mjs.map +1 -1
  13. package/dist/cli/lite.mjs +43 -13
  14. package/dist/cli/lite.mjs.map +1 -1
  15. package/dist/cli/{propose-policy.mjs → manage-policies.mjs} +270 -47
  16. package/dist/cli/manage-policies.mjs.map +1 -0
  17. package/dist/cli/run-host.d.mts +1 -0
  18. package/dist/cli/run-host.mjs +3090 -0
  19. package/dist/cli/run-host.mjs.map +1 -0
  20. package/dist/config-CPFQIGdG.mjs +57 -0
  21. package/dist/config-CPFQIGdG.mjs.map +1 -0
  22. package/dist/config-Dvl-Pov4.mjs +76 -0
  23. package/dist/config-Dvl-Pov4.mjs.map +1 -0
  24. package/dist/daemon/index.d.mts.map +1 -1
  25. package/dist/daemon/index.mjs +970 -332
  26. package/dist/daemon/index.mjs.map +1 -1
  27. package/dist/supervisor-actions-CiW56eLi.mjs +843 -0
  28. package/dist/supervisor-actions-CiW56eLi.mjs.map +1 -0
  29. package/dist/turn-log-buffer-DRgW53gl.mjs +767 -0
  30. package/dist/turn-log-buffer-DRgW53gl.mjs.map +1 -0
  31. package/dist/web/_app/immutable/chunks/{Drm9vgeP.js → 3AZlWB6U.js} +1 -1
  32. package/dist/web/_app/immutable/chunks/BhRSsUCh.js +2 -0
  33. package/dist/web/_app/immutable/chunks/BiLeM2i1.js +1 -0
  34. package/{web/.svelte-kit/output/client/_app/immutable/chunks/CME08kGM.js → dist/web/_app/immutable/chunks/BmBj85Ll.js} +1 -1
  35. package/dist/web/_app/immutable/chunks/BrERcKAH.js +1 -0
  36. package/dist/web/_app/immutable/chunks/Bv9252RM.js +1 -0
  37. package/dist/web/_app/immutable/chunks/CIXNBPKi.js +1 -0
  38. package/dist/web/_app/immutable/chunks/DISKL3GN.js +2 -0
  39. package/dist/web/_app/immutable/chunks/{Zeh-C-mx.js → DcpaLzmX.js} +1 -1
  40. package/dist/web/_app/immutable/chunks/DnQ3vS13.js +1 -0
  41. package/dist/web/_app/immutable/chunks/KsloHTKS.js +1 -0
  42. package/{web/.svelte-kit/output/client/_app/immutable/chunks/Ck-be5J2.js → dist/web/_app/immutable/chunks/RsHsUj-8.js} +2 -2
  43. package/dist/web/_app/immutable/chunks/{G_zz-Gou.js → wpfV79dV.js} +1 -1
  44. package/dist/web/_app/immutable/entry/app.CIw1Qj0n.js +2 -0
  45. package/dist/web/_app/immutable/entry/start.Di0-Jhte.js +1 -0
  46. package/dist/web/_app/immutable/nodes/{0.CYS8iApT.js → 0.DYyUA1au.js} +1 -1
  47. package/dist/web/_app/immutable/nodes/1.D-3QEMMZ.js +1 -0
  48. package/dist/web/_app/immutable/nodes/{2.BnwnD1Ki.js → 2.4olHnH7U.js} +1 -1
  49. package/{web/.svelte-kit/output/client/_app/immutable/nodes/3.Dr0ot9sV.js → dist/web/_app/immutable/nodes/3.4w0bE-m2.js} +3 -3
  50. package/dist/web/_app/immutable/nodes/4.CZvjhVHt.js +60 -0
  51. package/dist/web/_app/immutable/nodes/{5.BBGQ_i84.js → 5.DLbPVJY2.js} +1 -1
  52. package/dist/web/_app/version.json +1 -1
  53. package/dist/web/index.html +12 -12
  54. package/dist/workspace-oWmVh5mi.mjs +1001 -0
  55. package/dist/workspace-oWmVh5mi.mjs.map +1 -0
  56. package/docs/23_adapter_slash_autocomplete/development_log.md +19 -0
  57. package/docs/23_adapter_slash_autocomplete/notes.md +18 -0
  58. package/docs/23_adapter_slash_autocomplete/prd.md +46 -0
  59. package/docs/23_adapter_slash_autocomplete/questions.md +6 -0
  60. package/docs/23_adapter_slash_autocomplete/tickets.md +21 -0
  61. package/docs/24_subagent_job_policy_fixes/development_log.md +22 -0
  62. package/docs/24_subagent_job_policy_fixes/notes.md +28 -0
  63. package/docs/24_subagent_job_policy_fixes/prd.md +59 -0
  64. package/docs/24_subagent_job_policy_fixes/questions.md +3 -0
  65. package/docs/24_subagent_job_policy_fixes/tickets.md +49 -0
  66. package/docs/25_e2e_test_improvements/development_log.md +30 -0
  67. package/docs/25_e2e_test_improvements/notes.md +29 -0
  68. package/docs/25_e2e_test_improvements/prd.md +43 -0
  69. package/docs/25_e2e_test_improvements/questions.md +12 -0
  70. package/docs/25_e2e_test_improvements/tickets-2.md +22 -0
  71. package/docs/25_e2e_test_improvements/tickets.md +22 -0
  72. package/docs/25_policy_cwd/development_log.md +30 -0
  73. package/docs/25_policy_cwd/notes.md +28 -0
  74. package/docs/25_policy_cwd/prd.md +77 -0
  75. package/docs/25_policy_cwd/questions.md +6 -0
  76. package/docs/25_policy_cwd/tickets.md +77 -0
  77. package/docs/CLI_REFERENCE.md +3 -1
  78. package/docs/PHILOSOPHY.md +35 -0
  79. package/docs/adapter-visibility/SPEC.md +461 -0
  80. package/docs/adapter-visibility/SPEC_v2.md +202 -0
  81. package/docs/auto-update/SPEC.md +344 -0
  82. package/docs/backups/SPEC.md +296 -0
  83. package/docs/backups/clawmini.gitignore +69 -0
  84. package/docs/guides/assets/clawmini-avatar.png +0 -0
  85. package/docs/guides/backups.md +332 -0
  86. package/docs/guides/discord_adapter_setup.md +1 -1
  87. package/docs/guides/google_chat_adapter_setup.md +81 -0
  88. package/docs/unified-startup/SPEC.md +203 -0
  89. package/e2e/_helpers/test-environment.test.ts +49 -0
  90. package/e2e/_helpers/test-environment.ts +548 -0
  91. package/e2e/adapters/_google-chat-fixtures.ts +340 -0
  92. package/{src/cli/e2e → e2e/adapters}/adapter-discord.test.ts +22 -23
  93. package/e2e/adapters/adapter-google-chat-downtime.test.ts +157 -0
  94. package/e2e/adapters/adapter-google-chat-inbound.test.ts +697 -0
  95. package/e2e/adapters/adapter-google-chat-outbound.test.ts +297 -0
  96. package/e2e/adapters/adapter-google-chat-roundtrip.test.ts +56 -0
  97. package/e2e/adapters/adapter-google-chat-threads.test.ts +1078 -0
  98. package/e2e/agents/custom-api-env.test.ts +80 -0
  99. package/e2e/agents/export-lite-func.test.ts +104 -0
  100. package/e2e/agents/fallbacks.test.ts +124 -0
  101. package/e2e/agents/interrupt.test.ts +50 -0
  102. package/e2e/agents/no-reply-necessary.test.ts +57 -0
  103. package/e2e/agents/session-timeout-subagents.test.ts +76 -0
  104. package/e2e/agents/subagent-authorization.test.ts +246 -0
  105. package/e2e/agents/subagent-env.test.ts +49 -0
  106. package/e2e/agents/subagent-lifecycle.test.ts +782 -0
  107. package/e2e/agents/subagents-depth.test.ts +47 -0
  108. package/e2e/cli/agents.test.ts +176 -0
  109. package/e2e/cli/auto-update.test.ts +741 -0
  110. package/e2e/cli/basic.test.ts +44 -0
  111. package/{src/cli/e2e → e2e/cli}/export-lite.test.ts +16 -12
  112. package/e2e/cli/init-gitignore.test.ts +86 -0
  113. package/e2e/cli/init.test.ts +76 -0
  114. package/e2e/cli/messages.test.ts +363 -0
  115. package/e2e/cli/serve.test.ts +76 -0
  116. package/{src/cli/e2e → e2e/cli}/skills.test.ts +11 -10
  117. package/{src/cli/e2e → e2e/daemon}/daemon.test.ts +57 -195
  118. package/e2e/jobs/agent-jobs.test.ts +216 -0
  119. package/e2e/jobs/cron.test.ts +64 -0
  120. package/e2e/jobs/restart.test.ts +108 -0
  121. package/e2e/policies/approval-session.test.ts +69 -0
  122. package/e2e/policies/auto-create-policies-file.test.ts +35 -0
  123. package/e2e/policies/builtin-manage-policies.test.ts +184 -0
  124. package/e2e/policies/builtin-run-host.test.ts +180 -0
  125. package/e2e/policies/environment-policies.test.ts +177 -0
  126. package/e2e/policies/manage-policies.test.ts +566 -0
  127. package/e2e/policies/output-size.test.ts +98 -0
  128. package/e2e/policies/policies-context-cwd.test.ts +160 -0
  129. package/e2e/policies/relative-script-path.test.ts +60 -0
  130. package/e2e/policies/requests-show.test.ts +135 -0
  131. package/e2e/policies/requests.test.ts +208 -0
  132. package/e2e/policies/slash-policies.test.ts +308 -0
  133. package/e2e/policies/startup-cleanup.test.ts +48 -0
  134. package/e2e/routers/session-timeout.test.ts +106 -0
  135. package/e2e/routers/slash-model.test.ts +152 -0
  136. package/e2e/routers/slash-new.test.ts +50 -0
  137. package/e2e/routers/slash-restart-adapter.test.ts +96 -0
  138. package/e2e/routers/slash-restart.test.ts +114 -0
  139. package/e2e/routers/slash-shutdown.test.ts +55 -0
  140. package/e2e/routers/slash-stop.test.ts +232 -0
  141. package/e2e/routers/slash-upgrade.test.ts +88 -0
  142. package/{src/cli/e2e → e2e/sandbox}/environments.test.ts +14 -13
  143. package/eslint.config.js +6 -0
  144. package/napkin.md +1 -1
  145. package/package.json +8 -3
  146. package/src/adapter-discord/commands.test.ts +42 -0
  147. package/src/adapter-discord/commands.ts +33 -0
  148. package/src/adapter-discord/config.ts +12 -0
  149. package/src/adapter-discord/forwarder.test.ts +499 -21
  150. package/src/adapter-discord/forwarder.ts +343 -124
  151. package/src/adapter-discord/inbound-cache.test.ts +47 -0
  152. package/src/adapter-discord/inbound-cache.ts +37 -0
  153. package/src/adapter-discord/index.test.ts +67 -2
  154. package/src/adapter-discord/index.ts +84 -216
  155. package/src/adapter-discord/interactions.test.ts +54 -3
  156. package/src/adapter-discord/interactions.ts +97 -53
  157. package/src/adapter-discord/processMessage.ts +239 -0
  158. package/src/adapter-discord/state.ts +1 -0
  159. package/src/adapter-google-chat/auth.test.ts +9 -5
  160. package/src/adapter-google-chat/auth.ts +29 -23
  161. package/src/adapter-google-chat/cards.ts +7 -2
  162. package/src/adapter-google-chat/client.test.ts +37 -2
  163. package/src/adapter-google-chat/client.ts +138 -38
  164. package/src/adapter-google-chat/config.ts +19 -0
  165. package/src/adapter-google-chat/forwarder.test.ts +81 -56
  166. package/src/adapter-google-chat/forwarder.ts +394 -185
  167. package/src/adapter-google-chat/inbound-cache.test.ts +61 -0
  168. package/src/adapter-google-chat/inbound-cache.ts +36 -0
  169. package/src/adapter-google-chat/state.test.ts +1 -0
  170. package/src/adapter-google-chat/state.ts +9 -1
  171. package/src/adapter-google-chat/subscriptions.ts +8 -6
  172. package/src/cli/builtin-policies.ts +44 -0
  173. package/src/cli/commands/agents.ts +59 -5
  174. package/src/cli/commands/down.ts +54 -2
  175. package/src/cli/commands/environments.ts +8 -2
  176. package/src/cli/commands/init.ts +31 -0
  177. package/src/cli/commands/logs.ts +116 -0
  178. package/src/cli/commands/policies.ts +6 -4
  179. package/src/cli/commands/serve.test.ts +67 -0
  180. package/src/cli/commands/serve.ts +284 -0
  181. package/src/cli/commands/up.ts +122 -2
  182. package/src/cli/commands/web-api/agents.ts +3 -2
  183. package/src/cli/index.ts +4 -0
  184. package/src/cli/install-detection.test.ts +72 -0
  185. package/src/cli/install-detection.ts +48 -0
  186. package/src/cli/lite.ts +54 -22
  187. package/src/cli/manage-policies-utils.ts +104 -0
  188. package/src/cli/manage-policies.ts +291 -0
  189. package/src/cli/run-host.ts +45 -0
  190. package/src/cli/supervisor-actions.ts +267 -0
  191. package/src/cli/supervisor-control.test.ts +129 -0
  192. package/src/cli/supervisor-control.ts +155 -0
  193. package/src/cli/supervisor-pid.ts +68 -0
  194. package/src/cli/supervisor.ts +277 -0
  195. package/src/daemon/agent/agent-context.ts +11 -11
  196. package/src/daemon/agent/agent-session.ts +8 -1
  197. package/src/daemon/agent/chat-logger.test.ts +78 -9
  198. package/src/daemon/agent/chat-logger.ts +25 -5
  199. package/src/daemon/agent/turn-registry.test.ts +89 -0
  200. package/src/daemon/agent/turn-registry.ts +94 -0
  201. package/src/daemon/agent/types.ts +2 -0
  202. package/src/daemon/api/agent-policy-endpoints.ts +263 -0
  203. package/src/daemon/api/agent-router.ts +47 -126
  204. package/src/daemon/api/index.test.ts +1 -0
  205. package/src/daemon/api/policy-request.test.ts +7 -5
  206. package/src/daemon/api/router-utils.ts +6 -5
  207. package/src/daemon/api/subagent-router.ts +110 -74
  208. package/src/daemon/api/subagent-utils.test.ts +60 -0
  209. package/src/daemon/api/subagent-utils.ts +113 -87
  210. package/src/daemon/api/user-router.ts +34 -8
  211. package/src/daemon/auth.ts +1 -0
  212. package/src/daemon/cron.test.ts +62 -4
  213. package/src/daemon/cron.ts +42 -16
  214. package/src/daemon/events.ts +65 -0
  215. package/src/daemon/index.ts +24 -1
  216. package/src/daemon/message-interruption.test.ts +1 -0
  217. package/src/daemon/message-jobs.test.ts +1 -0
  218. package/src/daemon/message.ts +78 -14
  219. package/src/daemon/observation.test.ts +26 -18
  220. package/src/daemon/pending-replies.test.ts +112 -0
  221. package/src/daemon/pending-replies.ts +162 -0
  222. package/src/daemon/policy-request-service.ts +3 -1
  223. package/src/daemon/policy-utils.test.ts +66 -1
  224. package/src/daemon/policy-utils.ts +126 -1
  225. package/src/daemon/request-store.ts +31 -0
  226. package/src/daemon/routers/session-timeout.ts +4 -0
  227. package/src/daemon/routers/slash-model.test.ts +344 -0
  228. package/src/daemon/routers/slash-model.ts +207 -0
  229. package/src/daemon/routers/slash-policies.test.ts +38 -32
  230. package/src/daemon/routers/slash-policies.ts +84 -33
  231. package/src/daemon/routers/slash-restart.test.ts +69 -0
  232. package/src/daemon/routers/slash-restart.ts +36 -0
  233. package/src/daemon/routers/slash-shutdown.test.ts +50 -0
  234. package/src/daemon/routers/slash-shutdown.ts +28 -0
  235. package/src/daemon/routers/slash-upgrade.test.ts +116 -0
  236. package/src/daemon/routers/slash-upgrade.ts +76 -0
  237. package/src/daemon/routers/types.ts +7 -0
  238. package/src/daemon/routers.ts +16 -0
  239. package/src/shared/adapters/blockquote.test.ts +28 -0
  240. package/src/shared/adapters/blockquote.ts +20 -0
  241. package/src/shared/adapters/filtering.test.ts +224 -10
  242. package/src/shared/adapters/filtering.ts +95 -7
  243. package/src/shared/adapters/inbound-cache.test.ts +48 -0
  244. package/src/shared/adapters/inbound-cache.ts +54 -0
  245. package/src/shared/adapters/turn-log-buffer.ts +266 -0
  246. package/src/shared/adapters/turn-log.test.ts +389 -0
  247. package/src/shared/adapters/turn-log.ts +357 -0
  248. package/src/shared/agent-utils.ts +12 -5
  249. package/src/shared/chats.test.ts +4 -0
  250. package/src/shared/chats.ts +9 -0
  251. package/src/shared/config.ts +16 -1
  252. package/src/shared/lite.ts +76 -2
  253. package/src/shared/policies.ts +26 -0
  254. package/src/shared/template-manifest.ts +267 -0
  255. package/src/shared/utils/shell.ts +61 -0
  256. package/src/shared/version.ts +34 -0
  257. package/src/shared/workspace.test.ts +217 -0
  258. package/src/shared/workspace.ts +626 -48
  259. package/templates/environments/cladding/allowlist-domain.mjs +125 -0
  260. package/templates/environments/cladding/env.json +21 -1
  261. package/templates/environments/cladding/run-with-network.mjs +54 -0
  262. package/templates/environments/macos-proxy/allowlist-domain.mjs +95 -0
  263. package/templates/environments/macos-proxy/env.json +8 -1
  264. package/templates/environments/macos-proxy/proxy.mjs +42 -13
  265. package/templates/gemini/template.json +5 -0
  266. package/templates/gemini-claw/template.json +13 -0
  267. package/templates/skills/clawmini-requests/SKILL.md +69 -10
  268. package/templates/skills/run-host/SKILL.md +51 -0
  269. package/templates/skills/skill-creator/SKILL.md +4 -3
  270. package/templates/skills/skill-creator/scripts/validate.sh +52 -0
  271. package/tsdown.config.ts +10 -1
  272. package/vitest.config.ts +2 -2
  273. package/web/.svelte-kit/ambient.d.ts +292 -176
  274. package/web/.svelte-kit/generated/server/internal.js +1 -1
  275. package/web/.svelte-kit/output/client/.vite/manifest.json +127 -137
  276. package/web/.svelte-kit/output/client/_app/immutable/chunks/{Drm9vgeP.js → 3AZlWB6U.js} +1 -1
  277. package/web/.svelte-kit/output/client/_app/immutable/chunks/BhRSsUCh.js +2 -0
  278. package/web/.svelte-kit/output/client/_app/immutable/chunks/BiLeM2i1.js +1 -0
  279. package/{dist/web/_app/immutable/chunks/CME08kGM.js → web/.svelte-kit/output/client/_app/immutable/chunks/BmBj85Ll.js} +1 -1
  280. package/web/.svelte-kit/output/client/_app/immutable/chunks/BrERcKAH.js +1 -0
  281. package/web/.svelte-kit/output/client/_app/immutable/chunks/Bv9252RM.js +1 -0
  282. package/web/.svelte-kit/output/client/_app/immutable/chunks/CIXNBPKi.js +1 -0
  283. package/web/.svelte-kit/output/client/_app/immutable/chunks/DISKL3GN.js +2 -0
  284. package/web/.svelte-kit/output/client/_app/immutable/chunks/{Zeh-C-mx.js → DcpaLzmX.js} +1 -1
  285. package/web/.svelte-kit/output/client/_app/immutable/chunks/DnQ3vS13.js +1 -0
  286. package/web/.svelte-kit/output/client/_app/immutable/chunks/KsloHTKS.js +1 -0
  287. package/{dist/web/_app/immutable/chunks/Ck-be5J2.js → web/.svelte-kit/output/client/_app/immutable/chunks/RsHsUj-8.js} +2 -2
  288. package/web/.svelte-kit/output/client/_app/immutable/chunks/{G_zz-Gou.js → wpfV79dV.js} +1 -1
  289. package/web/.svelte-kit/output/client/_app/immutable/entry/app.CIw1Qj0n.js +2 -0
  290. package/web/.svelte-kit/output/client/_app/immutable/entry/start.Di0-Jhte.js +1 -0
  291. package/web/.svelte-kit/output/client/_app/immutable/nodes/{0.CYS8iApT.js → 0.DYyUA1au.js} +1 -1
  292. package/web/.svelte-kit/output/client/_app/immutable/nodes/1.D-3QEMMZ.js +1 -0
  293. package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.BnwnD1Ki.js → 2.4olHnH7U.js} +1 -1
  294. package/{dist/web/_app/immutable/nodes/3.Dr0ot9sV.js → web/.svelte-kit/output/client/_app/immutable/nodes/3.4w0bE-m2.js} +3 -3
  295. package/web/.svelte-kit/output/client/_app/immutable/nodes/4.CZvjhVHt.js +60 -0
  296. package/web/.svelte-kit/output/client/_app/immutable/nodes/{5.BBGQ_i84.js → 5.DLbPVJY2.js} +1 -1
  297. package/web/.svelte-kit/output/client/_app/version.json +1 -1
  298. package/web/.svelte-kit/output/server/.vite/manifest.json +12 -10
  299. package/web/.svelte-kit/output/server/chunks/Icon.js +1 -1
  300. package/web/.svelte-kit/output/server/chunks/client.js +1 -1
  301. package/web/.svelte-kit/output/server/chunks/exports.js +1 -1
  302. package/web/.svelte-kit/output/server/chunks/index-server.js +2 -1
  303. package/web/.svelte-kit/output/server/chunks/internal.js +1 -1
  304. package/web/.svelte-kit/output/server/chunks/render-context.js +77 -0
  305. package/web/.svelte-kit/output/server/chunks/root.js +739 -788
  306. package/web/.svelte-kit/output/server/chunks/shared.js +234 -21
  307. package/web/.svelte-kit/output/server/index.js +126 -90
  308. package/web/.svelte-kit/output/server/manifest-full.js +1 -1
  309. package/web/.svelte-kit/output/server/manifest.js +1 -1
  310. package/web/.svelte-kit/output/server/nodes/0.js +1 -1
  311. package/web/.svelte-kit/output/server/nodes/1.js +1 -1
  312. package/web/.svelte-kit/output/server/nodes/2.js +1 -1
  313. package/web/.svelte-kit/output/server/nodes/3.js +1 -1
  314. package/web/.svelte-kit/output/server/nodes/4.js +1 -1
  315. package/web/.svelte-kit/output/server/nodes/5.js +1 -1
  316. package/web/.svelte-kit/output/server/remote-entry.js +245 -81
  317. package/web/.svelte-kit/tsconfig.json +4 -1
  318. package/dist/cli/propose-policy.mjs.map +0 -1
  319. package/dist/lite-CBxOT1y5.mjs +0 -241
  320. package/dist/lite-CBxOT1y5.mjs.map +0 -1
  321. package/dist/routing-D8rTxtaV.mjs +0 -245
  322. package/dist/routing-D8rTxtaV.mjs.map +0 -1
  323. package/dist/web/_app/immutable/chunks/B6YN0Nuq.js +0 -1
  324. package/dist/web/_app/immutable/chunks/BmRlVmv6.js +0 -1
  325. package/dist/web/_app/immutable/chunks/CK9JZLaG.js +0 -2
  326. package/dist/web/_app/immutable/chunks/Ck3rYNON.js +0 -1
  327. package/dist/web/_app/immutable/chunks/DMtIqaiV.js +0 -2
  328. package/dist/web/_app/immutable/chunks/DhD271EB.js +0 -1
  329. package/dist/web/_app/immutable/chunks/DpuLqk8d.js +0 -1
  330. package/dist/web/_app/immutable/chunks/DsIToJCP.js +0 -1
  331. package/dist/web/_app/immutable/chunks/bBmtyQMj.js +0 -1
  332. package/dist/web/_app/immutable/entry/app.CJmSwntr.js +0 -2
  333. package/dist/web/_app/immutable/entry/start.ZpUrT2ak.js +0 -1
  334. package/dist/web/_app/immutable/nodes/1.Bli0Hqzn.js +0 -1
  335. package/dist/web/_app/immutable/nodes/4.oBhvQhcA.js +0 -60
  336. package/dist/workspace-BJmJBfKi.mjs +0 -456
  337. package/dist/workspace-BJmJBfKi.mjs.map +0 -1
  338. package/src/cli/e2e/agents.test.ts +0 -140
  339. package/src/cli/e2e/basic.test.ts +0 -43
  340. package/src/cli/e2e/cron.test.ts +0 -132
  341. package/src/cli/e2e/export-lite-func.test.ts +0 -206
  342. package/src/cli/e2e/fallbacks.test.ts +0 -175
  343. package/src/cli/e2e/init.test.ts +0 -77
  344. package/src/cli/e2e/messages.test.ts +0 -332
  345. package/src/cli/e2e/propose-policy.test.ts +0 -203
  346. package/src/cli/e2e/requests.test.ts +0 -180
  347. package/src/cli/e2e/session-timeout.test.ts +0 -192
  348. package/src/cli/e2e/slash-new.test.ts +0 -93
  349. package/src/cli/e2e/subagents.test.ts +0 -106
  350. package/src/cli/e2e/utils.ts +0 -66
  351. package/src/cli/propose-policy.ts +0 -91
  352. package/web/.svelte-kit/output/client/_app/immutable/chunks/B6YN0Nuq.js +0 -1
  353. package/web/.svelte-kit/output/client/_app/immutable/chunks/BmRlVmv6.js +0 -1
  354. package/web/.svelte-kit/output/client/_app/immutable/chunks/CK9JZLaG.js +0 -2
  355. package/web/.svelte-kit/output/client/_app/immutable/chunks/Ck3rYNON.js +0 -1
  356. package/web/.svelte-kit/output/client/_app/immutable/chunks/DMtIqaiV.js +0 -2
  357. package/web/.svelte-kit/output/client/_app/immutable/chunks/DhD271EB.js +0 -1
  358. package/web/.svelte-kit/output/client/_app/immutable/chunks/DpuLqk8d.js +0 -1
  359. package/web/.svelte-kit/output/client/_app/immutable/chunks/DsIToJCP.js +0 -1
  360. package/web/.svelte-kit/output/client/_app/immutable/chunks/bBmtyQMj.js +0 -1
  361. package/web/.svelte-kit/output/client/_app/immutable/entry/app.CJmSwntr.js +0 -2
  362. package/web/.svelte-kit/output/client/_app/immutable/entry/start.ZpUrT2ak.js +0 -1
  363. package/web/.svelte-kit/output/client/_app/immutable/nodes/1.Bli0Hqzn.js +0 -1
  364. package/web/.svelte-kit/output/client/_app/immutable/nodes/4.oBhvQhcA.js +0 -60
  365. package/web/.svelte-kit/output/server/chunks/false.js +0 -4
  366. /package/dist/cli/{propose-policy.d.mts → manage-policies.d.mts} +0 -0
  367. /package/{src/cli/e2e → e2e/_helpers}/global-setup.ts +0 -0
@@ -1,241 +0,0 @@
1
- import { D as pathIsInsideDir, _ as readEnvironment, c as getClawminiDir, f as getWorkspaceRoot, u as getSettingsPath, y as readSettings } from "./workspace-BJmJBfKi.mjs";
2
- import { existsSync } from "node:fs";
3
- import path from "node:path";
4
- import fs$1 from "node:fs/promises";
5
- import { fileURLToPath } from "node:url";
6
-
7
- //#region src/shared/chats.ts
8
- const DEFAULT_CHAT_ID = "default";
9
- async function getChatsDir(startDir = process.cwd()) {
10
- const dir = path.join(getClawminiDir(startDir), "chats");
11
- if (!existsSync(dir)) await fs$1.mkdir(dir, { recursive: true });
12
- return dir;
13
- }
14
- function isValidChatId(chatId) {
15
- if (!chatId || chatId.length === 0) return false;
16
- return /^[a-zA-Z0-9_-]+$/.test(chatId);
17
- }
18
- function assertValidChatId(id) {
19
- if (!isValidChatId(id)) throw new Error(`Invalid chat ID: ${id}`);
20
- }
21
- async function createChat(id, startDir = process.cwd()) {
22
- assertValidChatId(id);
23
- const chatsDir = await getChatsDir(startDir);
24
- const chatDir = path.join(chatsDir, id);
25
- if (!existsSync(chatDir)) await fs$1.mkdir(chatDir, { recursive: true });
26
- const chatFile = path.join(chatDir, "chat.jsonl");
27
- if (!existsSync(chatFile)) await fs$1.writeFile(chatFile, "");
28
- }
29
- async function listChats(startDir = process.cwd()) {
30
- const chatsDir = await getChatsDir(startDir);
31
- try {
32
- return (await fs$1.readdir(chatsDir, { withFileTypes: true })).filter((e) => e.isDirectory()).map((e) => e.name);
33
- } catch {
34
- return [];
35
- }
36
- }
37
- async function deleteChat(id, startDir = process.cwd()) {
38
- assertValidChatId(id);
39
- const chatsDir = await getChatsDir(startDir);
40
- const chatDir = path.join(chatsDir, id);
41
- if (!pathIsInsideDir(chatDir, chatsDir)) throw new Error(`Security Error: Cannot delete chat directory outside of ${chatsDir}`);
42
- if (existsSync(chatDir)) await fs$1.rm(chatDir, {
43
- recursive: true,
44
- force: true
45
- });
46
- }
47
- async function appendMessage(id, message, startDir = process.cwd()) {
48
- assertValidChatId(id);
49
- const chatsDir = await getChatsDir(startDir);
50
- const chatDir = path.join(chatsDir, id);
51
- if (!existsSync(chatDir)) await createChat(id, startDir);
52
- const chatFile = path.join(chatDir, "chat.jsonl");
53
- await fs$1.appendFile(chatFile, JSON.stringify(message) + "\n");
54
- }
55
- async function* readLinesBackwards(filePath) {
56
- const fd = await fs$1.open(filePath, "r");
57
- try {
58
- const stats = await fd.stat();
59
- if (stats.size === 0) return;
60
- const chunkSize = 64 * 1024;
61
- let position = stats.size;
62
- const buffer = Buffer.alloc(chunkSize);
63
- let leftoverBuffer = Buffer.alloc(0);
64
- while (position > 0) {
65
- const readSize = Math.min(chunkSize, position);
66
- position -= readSize;
67
- const { bytesRead } = await fd.read(buffer, 0, readSize, position);
68
- const currentChunk = buffer.subarray(0, bytesRead);
69
- let combinedBuffer = Buffer.concat([currentChunk, leftoverBuffer]);
70
- let lastNewlineIdx = combinedBuffer.lastIndexOf(10);
71
- while (lastNewlineIdx !== -1) {
72
- const line = combinedBuffer.subarray(lastNewlineIdx + 1).toString("utf8").trim();
73
- if (line) yield line;
74
- combinedBuffer = combinedBuffer.subarray(0, lastNewlineIdx);
75
- lastNewlineIdx = combinedBuffer.lastIndexOf(10);
76
- }
77
- leftoverBuffer = combinedBuffer;
78
- }
79
- if (leftoverBuffer.length > 0) {
80
- const line = leftoverBuffer.toString("utf8").trim();
81
- if (line) yield line;
82
- }
83
- } finally {
84
- await fd.close();
85
- }
86
- }
87
- function parseChatMessage(line) {
88
- try {
89
- const msg = JSON.parse(line);
90
- if (msg && msg.role === "log") msg.role = "legacy_log";
91
- return msg;
92
- } catch {
93
- return null;
94
- }
95
- }
96
- async function getMessages(id, limit, startDir = process.cwd(), predicate, before) {
97
- assertValidChatId(id);
98
- const chatsDir = await getChatsDir(startDir);
99
- const chatFile = path.join(chatsDir, id, "chat.jsonl");
100
- if (!existsSync(chatFile)) throw new Error(`Chat directory or file for '${id}' not found.`);
101
- limit = limit ?? 100;
102
- if (limit <= 0) {
103
- let messages = (await fs$1.readFile(chatFile, "utf8")).split("\n").filter((line) => line.trim() !== "").map((line) => parseChatMessage(line)).filter((msg) => msg !== null);
104
- if (before) {
105
- const beforeIndex = messages.findIndex((m) => m.id === before);
106
- if (beforeIndex !== -1) messages = messages.slice(0, beforeIndex);
107
- else messages = [];
108
- }
109
- if (predicate) messages = messages.filter(predicate);
110
- return messages;
111
- }
112
- const messages = [];
113
- let skipping = before !== void 0;
114
- for await (const line of readLinesBackwards(chatFile)) try {
115
- const msg = parseChatMessage(line);
116
- if (!msg) continue;
117
- if (skipping) {
118
- if (msg.id === before) skipping = false;
119
- continue;
120
- }
121
- if (!predicate || predicate(msg)) {
122
- messages.push(msg);
123
- if (messages.length >= limit) break;
124
- }
125
- } catch {}
126
- return messages.reverse();
127
- }
128
- async function getDefaultChatId(startDir = process.cwd()) {
129
- const settingsPath = getSettingsPath(startDir);
130
- if (!existsSync(settingsPath)) return DEFAULT_CHAT_ID;
131
- try {
132
- const content = await fs$1.readFile(settingsPath, "utf8");
133
- return JSON.parse(content).chats?.defaultId || DEFAULT_CHAT_ID;
134
- } catch {
135
- return DEFAULT_CHAT_ID;
136
- }
137
- }
138
- async function setDefaultChatId(id, startDir = process.cwd()) {
139
- assertValidChatId(id);
140
- const settingsPath = getSettingsPath(startDir);
141
- let settings = {};
142
- if (existsSync(settingsPath)) try {
143
- const content = await fs$1.readFile(settingsPath, "utf8");
144
- settings = JSON.parse(content);
145
- } catch {}
146
- if (!settings.chats) settings.chats = {};
147
- settings.chats.defaultId = id;
148
- const clawminiDir = getClawminiDir(startDir);
149
- if (!existsSync(clawminiDir)) await fs$1.mkdir(clawminiDir, { recursive: true });
150
- await fs$1.writeFile(settingsPath, JSON.stringify(settings, null, 2));
151
- }
152
- async function findLastMessage(id, predicate, startDir = process.cwd()) {
153
- assertValidChatId(id);
154
- const chatsDir = await getChatsDir(startDir);
155
- const chatFile = path.join(chatsDir, id, "chat.jsonl");
156
- if (!existsSync(chatFile)) return null;
157
- for await (const line of readLinesBackwards(chatFile)) try {
158
- const msg = parseChatMessage(line);
159
- if (!msg) continue;
160
- if (predicate(msg)) return msg;
161
- } catch {}
162
- return null;
163
- }
164
-
165
- //#endregion
166
- //#region src/shared/lite.ts
167
- async function resolveCompiledScript(scriptName, metaUrl) {
168
- const __dirname = path.dirname(fileURLToPath(metaUrl));
169
- const filename = scriptName.endsWith(".mjs") ? scriptName : `${scriptName}.mjs`;
170
- const searchPaths = [
171
- path.resolve(__dirname, `cli/${filename}`),
172
- path.resolve(__dirname, filename),
173
- path.resolve(__dirname, `../cli/${filename}`),
174
- path.resolve(__dirname, `../../dist/cli/${filename}`),
175
- path.resolve(__dirname, `../${filename}`),
176
- path.resolve(__dirname, `../../${filename}`)
177
- ];
178
- for (const scriptPath of searchPaths) try {
179
- await fs$1.access(scriptPath);
180
- return scriptPath;
181
- } catch {}
182
- throw new Error(`Could not find compiled script: ${filename}`);
183
- }
184
- async function getLiteScriptContent() {
185
- let liteScriptContent;
186
- const liteScriptPath = await resolveCompiledScript("lite", import.meta.url);
187
- liteScriptContent = await fs$1.readFile(liteScriptPath, "utf8");
188
- if (!liteScriptContent.startsWith("#!")) liteScriptContent = "#!/usr/bin/env node\n" + liteScriptContent;
189
- return liteScriptContent;
190
- }
191
- async function writeLiteScript(outPath) {
192
- const content = await getLiteScriptContent();
193
- let finalPath = outPath;
194
- const isDir = finalPath.endsWith(path.sep) || !(path.extname(finalPath) === ".js" || path.extname(finalPath) === ".mjs" || path.basename(finalPath) === "clawmini-lite");
195
- try {
196
- if ((await fs$1.stat(finalPath)).isDirectory()) finalPath = path.join(finalPath, "clawmini-lite.js");
197
- } catch {
198
- if (isDir && !path.extname(finalPath) && !finalPath.endsWith("clawmini-lite") && !finalPath.endsWith("clawmini-lite.js")) {
199
- await fs$1.mkdir(finalPath, { recursive: true });
200
- finalPath = path.join(finalPath, "clawmini-lite.js");
201
- }
202
- }
203
- const dir = path.dirname(finalPath);
204
- await fs$1.mkdir(dir, { recursive: true });
205
- await fs$1.writeFile(finalPath, content, { mode: 493 });
206
- return finalPath;
207
- }
208
- async function exportLiteToEnvironment(envName, envConfig, affectedDir) {
209
- if (!envConfig?.exportLiteTo) return false;
210
- const finalExportPath = path.resolve(affectedDir, envConfig.exportLiteTo);
211
- if (!finalExportPath.startsWith(affectedDir + path.sep) && finalExportPath !== affectedDir && !finalExportPath.startsWith(affectedDir + "/")) {
212
- console.warn(`Skipping export for environment '${envName}': exportLiteTo path '${envConfig.exportLiteTo}' escapes the environment target directory '${affectedDir}'`);
213
- return false;
214
- }
215
- try {
216
- const writtenPath = await writeLiteScript(finalExportPath);
217
- console.log(`Successfully exported clawmini-lite to ${writtenPath} (Environment: ${envName})`);
218
- return true;
219
- } catch (err) {
220
- console.error(`Failed to export clawmini-lite to ${finalExportPath} (Environment: ${envName}): ${err instanceof Error ? err.message : String(err)}`);
221
- return false;
222
- }
223
- }
224
- async function exportLiteToAllEnvironments(startDir = process.cwd()) {
225
- let exportedToEnvironments = false;
226
- try {
227
- const workspaceRoot = getWorkspaceRoot(startDir);
228
- const settings = await readSettings(workspaceRoot);
229
- if (settings?.environments) for (const [envPath, envName] of Object.entries(settings.environments)) {
230
- const envConfig = await readEnvironment(envName, workspaceRoot);
231
- if (envConfig) {
232
- if (await exportLiteToEnvironment(envName, envConfig, path.resolve(workspaceRoot, envPath))) exportedToEnvironments = true;
233
- }
234
- }
235
- } catch {}
236
- return exportedToEnvironments;
237
- }
238
-
239
- //#endregion
240
- export { writeLiteScript as a, createChat as c, getChatsDir as d, getDefaultChatId as f, setDefaultChatId as g, listChats as h, resolveCompiledScript as i, deleteChat as l, isValidChatId as m, exportLiteToEnvironment as n, DEFAULT_CHAT_ID as o, getMessages as p, getLiteScriptContent as r, appendMessage as s, exportLiteToAllEnvironments as t, findLastMessage as u };
241
- //# sourceMappingURL=lite-CBxOT1y5.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lite-CBxOT1y5.mjs","names":["fs","fs"],"sources":["../src/shared/chats.ts","../src/shared/lite.ts"],"sourcesContent":["/* eslint-disable max-lines */\nimport fs from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { getClawminiDir, getSettingsPath } from './workspace.js';\nimport { pathIsInsideDir } from './utils/fs.js';\n\nexport const DEFAULT_CHAT_ID = 'default';\n\nexport interface BaseMessage {\n id: string;\n role: string;\n displayRole?: 'user' | 'agent';\n content: string;\n timestamp: string;\n subagentId?: string;\n}\n\nexport interface UserMessage extends BaseMessage {\n role: 'user';\n agentContent?: string;\n files?: string[];\n}\n\nexport interface AgentReplyMessage extends BaseMessage {\n role: 'agent';\n files?: string[];\n}\n\nexport interface LogMessage extends BaseMessage {\n role: 'log';\n messageId: string;\n type?: 'tool' | 'unknown';\n}\n\nexport interface CommandLogMessage extends BaseMessage {\n role: 'command';\n messageId: string;\n command: string;\n cwd: string;\n stdout: string;\n stderr: string;\n exitCode: number;\n retryAttemptIndex?: number;\n}\n\nexport interface SystemMessage extends BaseMessage {\n role: 'system';\n event: 'cron' | 'policy_approved' | 'policy_rejected' | 'subagent_update' | 'router' | 'other';\n messageId?: string;\n}\n\nexport interface ToolMessage extends BaseMessage {\n role: 'tool';\n messageId: string;\n name: string;\n payload: unknown;\n}\n\nexport interface PolicyRequestMessage extends BaseMessage {\n role: 'policy';\n messageId: string;\n requestId: string;\n commandName: string;\n args: string[];\n status: 'pending' | 'approved' | 'rejected';\n}\n\nexport interface SubagentStatusMessage extends BaseMessage {\n role: 'subagent_status';\n subagentId: string;\n status: 'completed' | 'failed';\n}\n\nexport interface LegacyLogMessage extends BaseMessage {\n role: 'legacy_log';\n messageId?: string;\n source?: string;\n files?: string[];\n level?: 'default' | 'debug' | 'verbose';\n command?: string;\n cwd?: string;\n stdout?: string;\n stderr?: string;\n exitCode?: number;\n}\n\nexport type ChatMessage =\n | UserMessage\n | AgentReplyMessage\n | CommandLogMessage\n | SystemMessage\n | ToolMessage\n | PolicyRequestMessage\n | SubagentStatusMessage\n | LegacyLogMessage;\n\nexport async function getChatsDir(startDir = process.cwd()): Promise<string> {\n const dir = path.join(getClawminiDir(startDir), 'chats');\n if (!existsSync(dir)) {\n await fs.mkdir(dir, { recursive: true });\n }\n return dir;\n}\n\nexport function isValidChatId(chatId: string): boolean {\n if (!chatId || chatId.length === 0) return false;\n return /^[a-zA-Z0-9_-]+$/.test(chatId);\n}\n\nfunction assertValidChatId(id: string): void {\n if (!isValidChatId(id)) {\n throw new Error(`Invalid chat ID: ${id}`);\n }\n}\n\nexport async function createChat(id: string, startDir = process.cwd()): Promise<void> {\n assertValidChatId(id);\n const chatsDir = await getChatsDir(startDir);\n const chatDir = path.join(chatsDir, id);\n if (!existsSync(chatDir)) {\n await fs.mkdir(chatDir, { recursive: true });\n }\n const chatFile = path.join(chatDir, 'chat.jsonl');\n if (!existsSync(chatFile)) {\n await fs.writeFile(chatFile, '');\n }\n}\n\nexport async function listChats(startDir = process.cwd()): Promise<string[]> {\n const chatsDir = await getChatsDir(startDir);\n try {\n const entries = await fs.readdir(chatsDir, { withFileTypes: true });\n return entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n return [];\n }\n}\n\nexport async function deleteChat(id: string, startDir = process.cwd()): Promise<void> {\n assertValidChatId(id);\n const chatsDir = await getChatsDir(startDir);\n const chatDir = path.join(chatsDir, id);\n\n if (!pathIsInsideDir(chatDir, chatsDir)) {\n throw new Error(`Security Error: Cannot delete chat directory outside of ${chatsDir}`);\n }\n\n if (existsSync(chatDir)) {\n await fs.rm(chatDir, { recursive: true, force: true });\n }\n}\n\nexport async function appendMessage(\n id: string,\n message: ChatMessage,\n startDir = process.cwd()\n): Promise<void> {\n assertValidChatId(id);\n const chatsDir = await getChatsDir(startDir);\n const chatDir = path.join(chatsDir, id);\n if (!existsSync(chatDir)) {\n await createChat(id, startDir);\n }\n const chatFile = path.join(chatDir, 'chat.jsonl');\n await fs.appendFile(chatFile, JSON.stringify(message) + '\\n');\n}\n\nasync function* readLinesBackwards(filePath: string): AsyncGenerator<string, void, unknown> {\n const fd = await fs.open(filePath, 'r');\n try {\n const stats = await fd.stat();\n if (stats.size === 0) return;\n\n const chunkSize = 64 * 1024;\n let position = stats.size;\n const buffer = Buffer.alloc(chunkSize);\n let leftoverBuffer = Buffer.alloc(0);\n\n while (position > 0) {\n const readSize = Math.min(chunkSize, position);\n position -= readSize;\n\n const { bytesRead } = await fd.read(buffer, 0, readSize, position);\n\n const currentChunk = buffer.subarray(0, bytesRead);\n let combinedBuffer = Buffer.concat([currentChunk, leftoverBuffer]);\n\n let lastNewlineIdx = combinedBuffer.lastIndexOf(0x0a);\n\n while (lastNewlineIdx !== -1) {\n const lineBuffer = combinedBuffer.subarray(lastNewlineIdx + 1);\n const line = lineBuffer.toString('utf8').trim();\n\n if (line) {\n yield line;\n }\n\n combinedBuffer = combinedBuffer.subarray(0, lastNewlineIdx);\n lastNewlineIdx = combinedBuffer.lastIndexOf(0x0a);\n }\n leftoverBuffer = combinedBuffer;\n }\n\n if (leftoverBuffer.length > 0) {\n const line = leftoverBuffer.toString('utf8').trim();\n if (line) {\n yield line;\n }\n }\n } finally {\n await fd.close();\n }\n}\n\nexport function parseChatMessage(line: string): ChatMessage | null {\n try {\n const msg = JSON.parse(line);\n if (msg && msg.role === 'log') {\n msg.role = 'legacy_log';\n }\n return msg as ChatMessage;\n } catch {\n return null;\n }\n}\n\nexport async function getMessages(\n id: string,\n limit?: number,\n startDir = process.cwd(),\n predicate?: (msg: ChatMessage) => boolean,\n before?: string\n): Promise<ChatMessage[]> {\n assertValidChatId(id);\n const chatsDir = await getChatsDir(startDir);\n const chatFile = path.join(chatsDir, id, 'chat.jsonl');\n if (!existsSync(chatFile)) {\n throw new Error(`Chat directory or file for '${id}' not found.`);\n }\n\n limit = limit ?? 100;\n\n if (limit <= 0) {\n const content = await fs.readFile(chatFile, 'utf8');\n const lines = content.split('\\n').filter((line) => line.trim() !== '');\n\n let messages = lines\n .map((line) => parseChatMessage(line))\n .filter((msg): msg is ChatMessage => msg !== null);\n\n if (before) {\n const beforeIndex = messages.findIndex((m) => m.id === before);\n if (beforeIndex !== -1) {\n messages = messages.slice(0, beforeIndex);\n } else {\n messages = [];\n }\n }\n\n if (predicate) {\n messages = messages.filter(predicate);\n }\n\n return messages;\n }\n\n // We have a limit > 0, read backwards to avoid parsing the whole file\n const messages: ChatMessage[] = [];\n let skipping = before !== undefined;\n\n for await (const line of readLinesBackwards(chatFile)) {\n try {\n const msg = parseChatMessage(line);\n if (!msg) continue;\n\n if (skipping) {\n if (msg.id === before) {\n skipping = false;\n }\n continue;\n }\n\n if (!predicate || predicate(msg)) {\n messages.push(msg);\n if (messages.length >= limit) {\n break;\n }\n }\n } catch {\n // Ignore invalid JSON lines\n }\n }\n\n return messages.reverse();\n}\n\nexport async function getDefaultChatId(startDir = process.cwd()): Promise<string> {\n const settingsPath = getSettingsPath(startDir);\n if (!existsSync(settingsPath)) return DEFAULT_CHAT_ID;\n\n try {\n const content = await fs.readFile(settingsPath, 'utf8');\n const settings = JSON.parse(content);\n return settings.chats?.defaultId || DEFAULT_CHAT_ID;\n } catch {\n return DEFAULT_CHAT_ID;\n }\n}\n\nexport async function setDefaultChatId(id: string, startDir = process.cwd()): Promise<void> {\n assertValidChatId(id);\n const settingsPath = getSettingsPath(startDir);\n let settings: { chats?: { defaultId?: string; [key: string]: unknown }; [key: string]: unknown } =\n {};\n if (existsSync(settingsPath)) {\n try {\n const content = await fs.readFile(settingsPath, 'utf8');\n settings = JSON.parse(content);\n } catch {\n // Ignore invalid JSON\n }\n }\n\n if (!settings.chats) {\n settings.chats = {};\n }\n settings.chats.defaultId = id;\n\n const clawminiDir = getClawminiDir(startDir);\n if (!existsSync(clawminiDir)) {\n await fs.mkdir(clawminiDir, { recursive: true });\n }\n\n await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2));\n}\n\nexport async function findLastMessage(\n id: string,\n predicate: (msg: ChatMessage) => boolean,\n startDir = process.cwd()\n): Promise<ChatMessage | null> {\n assertValidChatId(id);\n const chatsDir = await getChatsDir(startDir);\n const chatFile = path.join(chatsDir, id, 'chat.jsonl');\n if (!existsSync(chatFile)) {\n return null;\n }\n\n for await (const line of readLinesBackwards(chatFile)) {\n try {\n const msg = parseChatMessage(line);\n if (!msg) continue;\n if (predicate(msg)) return msg;\n } catch {\n // Ignore invalid JSON lines\n }\n }\n\n return null;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { readSettings, readEnvironment, getWorkspaceRoot } from './workspace.js';\nimport type { Environment } from './config.js';\n\nexport async function resolveCompiledScript(scriptName: string, metaUrl: string): Promise<string> {\n const __dirname = path.dirname(fileURLToPath(metaUrl));\n const filename = scriptName.endsWith('.mjs') ? scriptName : `${scriptName}.mjs`;\n\n const searchPaths = [\n path.resolve(__dirname, `cli/${filename}`), // If bundled in a shared chunk at dist/\n path.resolve(__dirname, filename), // If bundled in dist/cli or dist/daemon and lite is next to it\n path.resolve(__dirname, `../cli/${filename}`), // If bundled in dist/daemon, it might be in ../cli/\n path.resolve(__dirname, `../../dist/cli/${filename}`), // Fallback for development/testing when running from src/shared\n path.resolve(__dirname, `../${filename}`), // Used from src/cli/commands (1 level deep) -> dist/cli\n path.resolve(__dirname, `../../${filename}`), // Used from src/cli/commands -> dist/cli (2 levels deep)\n ];\n\n for (const scriptPath of searchPaths) {\n try {\n await fs.access(scriptPath);\n return scriptPath;\n } catch {\n // Continue searching\n }\n }\n\n throw new Error(`Could not find compiled script: ${filename}`);\n}\n\nexport async function getLiteScriptContent(): Promise<string> {\n let liteScriptContent: string;\n const liteScriptPath = await resolveCompiledScript('lite', import.meta.url);\n\n liteScriptContent = await fs.readFile(liteScriptPath, 'utf8');\n\n // Ensure it has the hashbang (if tsdown stripped it or if missing)\n if (!liteScriptContent.startsWith('#!')) {\n liteScriptContent = '#!/usr/bin/env node\\n' + liteScriptContent;\n }\n return liteScriptContent;\n}\n\nexport async function writeLiteScript(outPath: string): Promise<string> {\n const content = await getLiteScriptContent();\n\n let finalPath = outPath;\n const isDir =\n finalPath.endsWith(path.sep) ||\n !(\n path.extname(finalPath) === '.js' ||\n path.extname(finalPath) === '.mjs' ||\n path.basename(finalPath) === 'clawmini-lite'\n );\n\n try {\n const stat = await fs.stat(finalPath);\n if (stat.isDirectory()) {\n finalPath = path.join(finalPath, 'clawmini-lite.js');\n }\n } catch {\n if (\n isDir &&\n !path.extname(finalPath) &&\n !finalPath.endsWith('clawmini-lite') &&\n !finalPath.endsWith('clawmini-lite.js')\n ) {\n await fs.mkdir(finalPath, { recursive: true });\n finalPath = path.join(finalPath, 'clawmini-lite.js');\n }\n }\n\n const dir = path.dirname(finalPath);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(finalPath, content, { mode: 0o755 });\n return finalPath;\n}\n\nexport async function exportLiteToEnvironment(\n envName: string,\n envConfig: Environment,\n affectedDir: string\n): Promise<boolean> {\n if (!envConfig?.exportLiteTo) return false;\n\n const finalExportPath = path.resolve(affectedDir, envConfig.exportLiteTo);\n\n if (\n !finalExportPath.startsWith(affectedDir + path.sep) &&\n finalExportPath !== affectedDir &&\n !finalExportPath.startsWith(affectedDir + '/')\n ) {\n console.warn(\n `Skipping export for environment '${envName}': exportLiteTo path '${envConfig.exportLiteTo}' escapes the environment target directory '${affectedDir}'`\n );\n return false;\n }\n\n try {\n const writtenPath = await writeLiteScript(finalExportPath);\n console.log(`Successfully exported clawmini-lite to ${writtenPath} (Environment: ${envName})`);\n return true;\n } catch (err) {\n console.error(\n `Failed to export clawmini-lite to ${finalExportPath} (Environment: ${envName}): ${err instanceof Error ? err.message : String(err)}`\n );\n return false;\n }\n}\n\nexport async function exportLiteToAllEnvironments(startDir = process.cwd()): Promise<boolean> {\n let exportedToEnvironments = false;\n try {\n const workspaceRoot = getWorkspaceRoot(startDir);\n const settings = await readSettings(workspaceRoot);\n if (settings?.environments) {\n for (const [envPath, envName] of Object.entries(settings.environments)) {\n const envConfig = await readEnvironment(envName, workspaceRoot);\n if (envConfig) {\n const affectedDir = path.resolve(workspaceRoot, envPath);\n const exported = await exportLiteToEnvironment(envName, envConfig, affectedDir);\n if (exported) {\n exportedToEnvironments = true;\n }\n }\n }\n }\n } catch {\n // Ignore settings read errors\n }\n return exportedToEnvironments;\n}\n"],"mappings":"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"}
@@ -1,245 +0,0 @@
1
- import http from "node:http";
2
-
3
- //#region src/shared/event-source.ts
4
- function createUnixSocketEventSource(socketPath) {
5
- return class UnixSocketEventSource {
6
- readyState = 0;
7
- CONNECTING = 0;
8
- OPEN = 1;
9
- CLOSED = 2;
10
- req = null;
11
- listeners = {};
12
- constructor(url, init) {
13
- const parsedUrl = new URL(url);
14
- const options = {
15
- socketPath,
16
- path: parsedUrl.pathname + parsedUrl.search,
17
- method: "GET",
18
- headers: {
19
- Accept: "text/event-stream",
20
- "Cache-Control": "no-cache",
21
- ...init?.headers
22
- }
23
- };
24
- this.req = http.request(options, (res) => {
25
- if (res.statusCode === 200) {
26
- this.readyState = this.OPEN;
27
- this.dispatchEvent({ type: "open" });
28
- } else {
29
- this.readyState = this.CLOSED;
30
- this.dispatchEvent({
31
- type: "error",
32
- message: `Unexpected status code: ${res.statusCode}`
33
- });
34
- return;
35
- }
36
- let buffer = "";
37
- res.on("data", (chunk) => {
38
- buffer += chunk.toString("utf-8");
39
- const lines = buffer.split(/\r?\n\r?\n/);
40
- buffer = lines.pop() || "";
41
- for (const block of lines) this.parseBlock(block);
42
- });
43
- res.on("end", () => {
44
- if (buffer) this.parseBlock(buffer);
45
- this.readyState = this.CLOSED;
46
- this.dispatchEvent({ type: "close" });
47
- });
48
- });
49
- this.req.on("error", (err) => {
50
- this.readyState = this.CLOSED;
51
- this.dispatchEvent({
52
- type: "error",
53
- error: err
54
- });
55
- });
56
- this.req.end();
57
- }
58
- parseBlock(block) {
59
- if (!block.trim()) return;
60
- const lines = block.split(/\r?\n/);
61
- let eventType = "message";
62
- let data = "";
63
- let id = "";
64
- for (const line of lines) if (line.startsWith("event: ")) eventType = line.slice(7).trim();
65
- else if (line.startsWith("data: ")) data += (data ? "\n" : "") + line.slice(6);
66
- else if (line.startsWith("id: ")) id = line.slice(4).trim();
67
- if (data) this.dispatchEvent({
68
- type: eventType,
69
- data,
70
- lastEventId: id
71
- });
72
- }
73
- addEventListener(type, listener) {
74
- if (!this.listeners[type]) this.listeners[type] = [];
75
- this.listeners[type].push(listener);
76
- }
77
- removeEventListener(type, listener) {
78
- if (!this.listeners[type]) return;
79
- this.listeners[type] = this.listeners[type].filter((l) => l !== listener);
80
- }
81
- dispatchEvent(event) {
82
- const type = event.type;
83
- if (this.listeners[type]) for (const listener of this.listeners[type]) listener(event);
84
- }
85
- close() {
86
- this.readyState = this.CLOSED;
87
- if (this.req) this.req.destroy();
88
- }
89
- };
90
- }
91
-
92
- //#endregion
93
- //#region src/shared/adapters/filtering.ts
94
- function shouldDisplayMessage(message, config) {
95
- const overrides = config.filters || {};
96
- if (message.subagentId && overrides["subagent"] !== true) return false;
97
- if (message.displayRole === "agent" || message.role === "agent" || message.role === "legacy_log" || message.role === "policy" && message.status === "pending") return true;
98
- if (message.subagentId && overrides["subagent"] === true && (message.role === "user" || message.displayRole === "user")) return true;
99
- if (overrides[message.role] === true || message.displayRole && overrides[message.displayRole] === true) return true;
100
- return false;
101
- }
102
- function formatMessage(message) {
103
- if (!message.subagentId) return message.content;
104
- if (message.role === "user" || message.displayRole === "user") return `[To:${message.subagentId}]\n${message.content}`;
105
- return `[From:${message.subagentId}]\n${message.content}`;
106
- }
107
-
108
- //#endregion
109
- //#region src/shared/adapters/commands.ts
110
- const VALID_ROLES = new Set([
111
- "subagent",
112
- "command",
113
- "system",
114
- "tool",
115
- "policy",
116
- "subagent_status",
117
- "legacy_log"
118
- ]);
119
- async function handleAdapterCommand(content, config, trpcClient, chatId) {
120
- const trimmed = content.trim();
121
- if (trimmed === "/show all") {
122
- const newConfig = { filters: { ...config.filters } };
123
- for (const role of VALID_ROLES) newConfig.filters[role] = true;
124
- return {
125
- type: "text",
126
- text: "Configuration updated: Showing all messages.",
127
- newConfig
128
- };
129
- }
130
- if (trimmed === "/hide all") return {
131
- type: "text",
132
- text: "Configuration updated: Hidden all overrides (using defaults).",
133
- newConfig: { filters: {} }
134
- };
135
- if (trimmed === "/show" || trimmed === "/hide") return {
136
- type: "text",
137
- text: `Valid options for ${trimmed}: ${Array.from(VALID_ROLES).join(", ")}`
138
- };
139
- if (trimmed.startsWith("/show ")) {
140
- const role = trimmed.slice(6).trim();
141
- if (!VALID_ROLES.has(role)) return {
142
- type: "text",
143
- text: `Error: '${role}' is not a valid message role or special value. Valid options: ${Array.from(VALID_ROLES).join(", ")}`
144
- };
145
- return {
146
- type: "text",
147
- text: `Configuration updated: Showing messages for '${role}'.`,
148
- newConfig: { filters: {
149
- ...config.filters,
150
- [role]: true
151
- } }
152
- };
153
- }
154
- if (trimmed.startsWith("/hide ")) {
155
- const role = trimmed.slice(6).trim();
156
- if (!VALID_ROLES.has(role)) return {
157
- type: "text",
158
- text: `Error: '${role}' is not a valid message role or special value. Valid options: ${Array.from(VALID_ROLES).join(", ")}`
159
- };
160
- return {
161
- type: "text",
162
- text: `Configuration updated: Hiding messages for '${role}'.`,
163
- newConfig: { filters: {
164
- ...config.filters,
165
- [role]: false
166
- } }
167
- };
168
- }
169
- if (trimmed === "/debug" || trimmed.startsWith("/debug ")) {
170
- const match = trimmed.match(/^\/debug\s+(\d+)$/);
171
- const limit = match ? parseInt(match[1], 10) : 5;
172
- const messages = await trpcClient.getMessages.query({
173
- chatId,
174
- limit: limit * 10
175
- });
176
- const ignoredMessages = [];
177
- for (let i = messages.length - 1; i >= 0; i--) {
178
- const msg = messages[i];
179
- if (!msg) continue;
180
- if ((msg.role === "user" || msg.displayRole === "user") && !msg.subagentId) continue;
181
- if (!shouldDisplayMessage(msg, config)) {
182
- ignoredMessages.push(msg);
183
- if (ignoredMessages.length >= limit) break;
184
- }
185
- }
186
- ignoredMessages.reverse();
187
- return {
188
- type: "debug",
189
- messages: ignoredMessages
190
- };
191
- }
192
- return null;
193
- }
194
-
195
- //#endregion
196
- //#region src/shared/adapters/routing.ts
197
- async function handleRoutingCommand(content, externalContextId, currentChannelChatMap, adapterName, trpcClient) {
198
- const trimmed = content.trim();
199
- if (trimmed.startsWith("/chat")) {
200
- const chatId = trimmed.split(/\s+/).slice(1)[0];
201
- const availableChats = await trpcClient.getChats.query();
202
- if (!chatId || !availableChats.includes(chatId)) return {
203
- type: "reply",
204
- text: `Available chats:\n${availableChats.length > 0 ? availableChats.map((c) => `- ${c}`).join("\n") : "No chats available."}\n\nPlease specify a valid chat ID: \`/chat [chat-id]\``
205
- };
206
- for (const [channelId, mappedId] of Object.entries(currentChannelChatMap)) if (mappedId === chatId && channelId !== externalContextId) return {
207
- type: "reply",
208
- text: `Error: Chat \`${chatId}\` is already mapped to another channel/space. Strict 1:1 mapping is required.`
209
- };
210
- return {
211
- type: "mapped",
212
- text: `Successfully mapped this channel/space to chat \`${chatId}\`.`,
213
- newChatId: chatId
214
- };
215
- }
216
- if (trimmed.startsWith("/agent")) {
217
- const agentId = trimmed.split(/\s+/).slice(1)[0];
218
- const availableAgents = await trpcClient.getAgents.query();
219
- if (!agentId || !availableAgents.includes(agentId)) return {
220
- type: "reply",
221
- text: `Available agents:\n${availableAgents.length > 0 ? availableAgents.map((a) => `- ${a}`).join("\n") : "No agents available."}\n\nPlease specify a valid agent ID: \`/agent [agent-id]\``
222
- };
223
- const availableChats = await trpcClient.getChats.query();
224
- let newChatId = `${agentId}-${adapterName}`;
225
- let counter = 1;
226
- while (availableChats.includes(newChatId)) {
227
- newChatId = `${agentId}-${adapterName}-${counter}`;
228
- counter++;
229
- }
230
- await trpcClient.createChat.mutate({
231
- chatId: newChatId,
232
- agent: agentId
233
- });
234
- return {
235
- type: "mapped",
236
- text: `Successfully created new chat \`${newChatId}\` with agent \`${agentId}\` and mapped it to this channel/space.`,
237
- newChatId
238
- };
239
- }
240
- return null;
241
- }
242
-
243
- //#endregion
244
- export { createUnixSocketEventSource as a, shouldDisplayMessage as i, handleAdapterCommand as n, formatMessage as r, handleRoutingCommand as t };
245
- //# sourceMappingURL=routing-D8rTxtaV.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routing-D8rTxtaV.mjs","names":[],"sources":["../src/shared/event-source.ts","../src/shared/adapters/filtering.ts","../src/shared/adapters/commands.ts","../src/shared/adapters/routing.ts"],"sourcesContent":["import http from 'node:http';\n\nexport function createUnixSocketEventSource(socketPath: string) {\n return class UnixSocketEventSource {\n public readyState: number = 0; // CONNECTING\n public readonly CONNECTING = 0;\n public readonly OPEN = 1;\n public readonly CLOSED = 2;\n\n req: http.ClientRequest | null = null;\n listeners: Record<string, ((event: Record<string, unknown>) => void)[]> = {};\n\n constructor(url: string, init?: Record<string, unknown>) {\n const parsedUrl = new URL(url);\n\n const options: http.RequestOptions = {\n socketPath,\n path: parsedUrl.pathname + parsedUrl.search,\n method: 'GET',\n headers: {\n Accept: 'text/event-stream',\n 'Cache-Control': 'no-cache',\n ...(init?.headers as Record<string, string> | undefined),\n },\n };\n\n this.req = http.request(options, (res) => {\n if (res.statusCode === 200) {\n this.readyState = this.OPEN;\n this.dispatchEvent({ type: 'open' });\n } else {\n this.readyState = this.CLOSED;\n this.dispatchEvent({\n type: 'error',\n message: `Unexpected status code: ${res.statusCode}`,\n });\n return;\n }\n\n let buffer = '';\n res.on('data', (chunk) => {\n buffer += chunk.toString('utf-8');\n const lines = buffer.split(/\\r?\\n\\r?\\n/);\n buffer = lines.pop() || '';\n\n for (const block of lines) {\n this.parseBlock(block);\n }\n });\n\n res.on('end', () => {\n if (buffer) this.parseBlock(buffer);\n this.readyState = this.CLOSED;\n this.dispatchEvent({ type: 'close' });\n });\n });\n\n this.req.on('error', (err) => {\n this.readyState = this.CLOSED;\n this.dispatchEvent({ type: 'error', error: err });\n });\n\n this.req.end();\n }\n\n parseBlock(block: string) {\n if (!block.trim()) return;\n\n const lines = block.split(/\\r?\\n/);\n let eventType = 'message';\n let data = '';\n let id = '';\n\n for (const line of lines) {\n if (line.startsWith('event: ')) {\n eventType = line.slice(7).trim();\n } else if (line.startsWith('data: ')) {\n data += (data ? '\\n' : '') + line.slice(6);\n } else if (line.startsWith('id: ')) {\n id = line.slice(4).trim();\n }\n }\n\n if (data) {\n this.dispatchEvent({\n type: eventType,\n data,\n lastEventId: id,\n });\n }\n }\n\n public addEventListener(type: string, listener: (event: Record<string, unknown>) => void) {\n if (!this.listeners[type]) {\n this.listeners[type] = [];\n }\n this.listeners[type].push(listener);\n }\n\n public removeEventListener(type: string, listener: (event: Record<string, unknown>) => void) {\n if (!this.listeners[type]) return;\n this.listeners[type] = this.listeners[type].filter((l) => l !== listener);\n }\n\n dispatchEvent(event: Record<string, unknown>) {\n const type = event.type as string;\n if (this.listeners[type]) {\n for (const listener of this.listeners[type]) {\n listener(event);\n }\n }\n }\n\n public close() {\n this.readyState = this.CLOSED;\n if (this.req) {\n this.req.destroy();\n }\n }\n };\n}\n","import type { ChatMessage } from '../chats.js';\n\nexport interface FilteringConfig {\n filters?: Record<string, boolean> | undefined;\n}\n\nexport function shouldDisplayMessage(message: ChatMessage, config: FilteringConfig): boolean {\n const overrides = config.filters || {};\n\n // If the message has a subagentId, return false immediately unless subagent messages are allowed.\n if (message.subagentId && overrides['subagent'] !== true) {\n return false;\n }\n\n // Then check if it's a standard agent message (via role/displayRole) and always return true if so.\n const isStandardAgent =\n message.displayRole === 'agent' ||\n message.role === 'agent' ||\n message.role === 'legacy_log' ||\n (message.role === 'policy' && message.status === 'pending');\n\n if (isStandardAgent) {\n return true;\n }\n\n // Then check if it's a user message directed to a subagent, if subagent messages are allowed\n if (\n message.subagentId &&\n overrides['subagent'] === true &&\n (message.role === 'user' || message.displayRole === 'user')\n ) {\n return true;\n }\n\n // Finally, check if the role is allowed and forward it if so.\n if (\n overrides[message.role] === true ||\n (message.displayRole && overrides[message.displayRole] === true)\n ) {\n return true;\n }\n\n return false;\n}\n\nexport function formatMessage(message: ChatMessage): string {\n if (!message.subagentId) {\n return message.content;\n }\n\n const isToSubagent = message.role === 'user' || message.displayRole === 'user';\n if (isToSubagent) {\n return `[To:${message.subagentId}]\\n${message.content}`;\n }\n\n return `[From:${message.subagentId}]\\n${message.content}`;\n}\n","import { shouldDisplayMessage, type FilteringConfig } from './filtering.js';\nimport type { ChatMessage } from '../chats.js';\n\nexport interface CommandTrpcClient {\n getMessages: {\n query: (args: { chatId: string; limit: number }) => Promise<ChatMessage[]>;\n };\n}\n\nconst VALID_ROLES = new Set([\n 'subagent',\n 'command',\n 'system',\n 'tool',\n 'policy',\n 'subagent_status',\n 'legacy_log',\n]);\n\nexport type AdapterCommandResult =\n | { type: 'text'; text: string; newConfig?: FilteringConfig }\n | { type: 'debug'; messages: ChatMessage[] }\n | null;\n\nexport async function handleAdapterCommand(\n content: string,\n config: FilteringConfig,\n trpcClient: CommandTrpcClient,\n chatId: string\n): Promise<AdapterCommandResult> {\n const trimmed = content.trim();\n\n if (trimmed === '/show all') {\n const newConfig: FilteringConfig = { filters: { ...config.filters } };\n for (const role of VALID_ROLES) {\n newConfig.filters![role] = true;\n }\n return { type: 'text', text: 'Configuration updated: Showing all messages.', newConfig };\n }\n\n if (trimmed === '/hide all') {\n return {\n type: 'text',\n text: 'Configuration updated: Hidden all overrides (using defaults).',\n newConfig: { filters: {} },\n };\n }\n\n if (trimmed === '/show' || trimmed === '/hide') {\n return {\n type: 'text',\n text: `Valid options for ${trimmed}: ${Array.from(VALID_ROLES).join(', ')}`,\n };\n }\n\n if (trimmed.startsWith('/show ')) {\n const role = trimmed.slice(6).trim();\n if (!VALID_ROLES.has(role)) {\n return {\n type: 'text',\n text: `Error: '${role}' is not a valid message role or special value. Valid options: ${Array.from(VALID_ROLES).join(', ')}`,\n };\n }\n return {\n type: 'text',\n text: `Configuration updated: Showing messages for '${role}'.`,\n newConfig: { filters: { ...config.filters, [role]: true } },\n };\n }\n\n if (trimmed.startsWith('/hide ')) {\n const role = trimmed.slice(6).trim();\n if (!VALID_ROLES.has(role)) {\n return {\n type: 'text',\n text: `Error: '${role}' is not a valid message role or special value. Valid options: ${Array.from(VALID_ROLES).join(', ')}`,\n };\n }\n return {\n type: 'text',\n text: `Configuration updated: Hiding messages for '${role}'.`,\n newConfig: { filters: { ...config.filters, [role]: false } },\n };\n }\n\n if (trimmed === '/debug' || trimmed.startsWith('/debug ')) {\n const match = trimmed.match(/^\\/debug\\s+(\\d+)$/);\n const limit = match ? parseInt(match[1] as string, 10) : 5;\n\n // Fetch recent messages\n // Fetch a larger batch since we need to filter them down\n const messages: ChatMessage[] = await trpcClient.getMessages.query({\n chatId,\n limit: limit * 10,\n });\n\n const ignoredMessages: ChatMessage[] = [];\n\n // Iterating backwards (newest to oldest)\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (!msg) continue;\n\n // Exclude user messages without subagentIds\n const isUserWithoutSubagent =\n (msg.role === 'user' || msg.displayRole === 'user') && !msg.subagentId;\n if (isUserWithoutSubagent) continue;\n\n const isDisplayed = shouldDisplayMessage(msg, config);\n if (!isDisplayed) {\n ignoredMessages.push(msg);\n if (ignoredMessages.length >= limit) {\n break;\n }\n }\n }\n\n // Reverse back to chronological order\n ignoredMessages.reverse();\n\n return { type: 'debug', messages: ignoredMessages };\n }\n\n return null;\n}\n","export type RoutingTrpcClient = {\n getChats: { query: () => Promise<string[]> };\n getAgents: { query: () => Promise<string[]> };\n createChat: {\n mutate: (args: {\n chatId: string;\n agent?: string;\n }) => Promise<{ success: boolean; chatId: string }>;\n };\n sendMessage: {\n mutate: (args: {\n type: 'send-message';\n client: 'cli';\n data: {\n message: string;\n chatId?: string;\n agentId?: string;\n adapter?: string;\n noWait?: boolean;\n };\n }) => Promise<{ success: boolean }>;\n };\n};\n\nexport type RoutingCommandResult =\n | { type: 'reply'; text: string }\n | { type: 'mapped'; text: string; newChatId: string }\n | null;\n\nexport async function handleRoutingCommand(\n content: string,\n externalContextId: string,\n currentChannelChatMap: Record<string, string>,\n adapterName: string,\n trpcClient: RoutingTrpcClient\n): Promise<RoutingCommandResult> {\n const trimmed = content.trim();\n\n if (trimmed.startsWith('/chat')) {\n const args = trimmed.split(/\\s+/).slice(1);\n const chatId = args[0];\n\n const availableChats = await trpcClient.getChats.query();\n\n if (!chatId || !availableChats.includes(chatId)) {\n const formattedList =\n availableChats.length > 0\n ? availableChats.map((c) => `- ${c}`).join('\\n')\n : 'No chats available.';\n return {\n type: 'reply',\n text: `Available chats:\\n${formattedList}\\n\\nPlease specify a valid chat ID: \\`/chat [chat-id]\\``,\n };\n }\n\n // Strict 1:1 Mapping Constraint\n for (const [channelId, mappedId] of Object.entries(currentChannelChatMap)) {\n if (mappedId === chatId && channelId !== externalContextId) {\n return {\n type: 'reply',\n text: `Error: Chat \\`${chatId}\\` is already mapped to another channel/space. Strict 1:1 mapping is required.`,\n };\n }\n }\n\n return {\n type: 'mapped',\n text: `Successfully mapped this channel/space to chat \\`${chatId}\\`.`,\n newChatId: chatId,\n };\n }\n\n if (trimmed.startsWith('/agent')) {\n const args = trimmed.split(/\\s+/).slice(1);\n const agentId = args[0];\n\n const availableAgents = await trpcClient.getAgents.query();\n\n if (!agentId || !availableAgents.includes(agentId)) {\n const formattedList =\n availableAgents.length > 0\n ? availableAgents.map((a) => `- ${a}`).join('\\n')\n : 'No agents available.';\n return {\n type: 'reply',\n text: `Available agents:\\n${formattedList}\\n\\nPlease specify a valid agent ID: \\`/agent [agent-id]\\``,\n };\n }\n\n const availableChats = await trpcClient.getChats.query();\n let newChatId = `${agentId}-${adapterName}`;\n let counter = 1;\n\n while (availableChats.includes(newChatId)) {\n newChatId = `${agentId}-${adapterName}-${counter}`;\n counter++;\n }\n\n await trpcClient.createChat.mutate({ chatId: newChatId, agent: agentId });\n\n return {\n type: 'mapped',\n text: `Successfully created new chat \\`${newChatId}\\` with agent \\`${agentId}\\` and mapped it to this channel/space.`,\n newChatId,\n };\n }\n\n return null;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- import{U,V as g,W as C,K as R,X as A,Y as $,h as x,k as M,Z as G,_ as Z,b as q,d as z,E as V,e as W,g as X,i as H,j as D,m as J,$ as Q,a0 as k,o as B,L as P,a1 as ee,a2 as O,a3 as m,a4 as re,a5 as K,w,l as se,D as te,a6 as ne,a7 as ie,a8 as ae,a9 as fe,A as ue,aa as ce,ab as oe,y as le,ac as de,ad as I,ae as T,af as _,ag as N,ah as pe}from"./CME08kGM.js";let b=!1;function he(r){var e=b;try{return b=!1,[r(),b]}finally{b=e}}class _e{anchor;#r=new Map;#s=new Map;#e=new Map;#t=new Set;#n=!0;constructor(e,t=!0){this.anchor=e,this.#n=t}#i=e=>{if(this.#r.has(e)){var t=this.#r.get(e),s=this.#s.get(t);if(s)U(s),this.#t.delete(t);else{var n=this.#e.get(t);n&&(this.#s.set(t,n.effect),this.#e.delete(t),n.fragment.lastChild.remove(),this.anchor.before(n.fragment),s=n.effect)}for(const[a,u]of this.#r){if(this.#r.delete(a),a===e)break;const i=this.#e.get(u);i&&(g(i.effect),this.#e.delete(u))}for(const[a,u]of this.#s){if(a===t||this.#t.has(a))continue;const i=()=>{if(Array.from(this.#r.values()).includes(a)){var o=document.createDocumentFragment();G(u,o),o.append(R()),this.#e.set(a,{effect:u,fragment:o})}else g(u);this.#t.delete(a),this.#s.delete(a)};this.#n||!s?(this.#t.add(a),C(u,i,!1)):i()}}};#a=e=>{this.#r.delete(e);const t=Array.from(this.#r.values());for(const[s,n]of this.#e)t.includes(s)||(g(n.effect),this.#e.delete(s))};ensure(e,t){var s=$,n=Z();if(t&&!this.#s.has(e)&&!this.#e.has(e))if(n){var a=document.createDocumentFragment(),u=R();a.append(u),this.#e.set(e,{effect:A(()=>t(u)),fragment:a})}else this.#s.set(e,A(()=>t(this.anchor)));if(this.#r.set(s,e),n){for(const[i,f]of this.#s)i===e?s.unskip_effect(f):s.skip_effect(f);for(const[i,f]of this.#e)i===e?s.unskip_effect(f.effect):s.skip_effect(f.effect);s.oncommit(this.#i),s.ondiscard(this.#a)}else x&&(this.anchor=M),this.#i(s)}}function ge(r,e,t=!1){var s;x&&(s=M,z());var n=new _e(r),a=t?V:0;function u(i,f){if(x){var o=W(s);if(i!==parseInt(o.substring(1))){var l=X();H(l),n.anchor=l,D(!1),n.ensure(i,f),D(!0);return}}n.ensure(i,f)}q(()=>{var i=!1;e((f,o=0)=>{i=!0,u(o,f)}),i||u(-1,null)},a)}function L(r,e){return r===e||r?.[O]===e}function xe(r={},e,t,s){var n=J.r,a=P;return Q(()=>{var u,i;return k(()=>{u=i,i=[],B(()=>{r!==t(...i)&&(e(r,...i),u&&L(t(...u),r)&&e(null,...u))})}),()=>{let f=a;for(;f!==n&&f.parent!==null&&f.parent.f&ee;)f=f.parent;const o=()=>{i&&L(t(...i),r)&&e(null,...i)},l=f.teardown;f.teardown=()=>{o(),l?.()}}}),r}const ve={get(r,e){if(!r.exclude.includes(e))return r.props[e]},set(r,e){return!1},getOwnPropertyDescriptor(r,e){if(!r.exclude.includes(e)&&e in r.props)return{enumerable:!0,configurable:!0,value:r.props[e]}},has(r,e){return r.exclude.includes(e)?!1:e in r.props},ownKeys(r){return Reflect.ownKeys(r.props).filter(e=>!r.exclude.includes(e))}};function me(r,e,t){return new Proxy({props:r,exclude:e},ve)}const be={get(r,e){if(!r.exclude.includes(e))return w(r.version),e in r.special?r.special[e]():r.props[e]},set(r,e,t){if(!(e in r.special)){var s=P;try{T(r.parent_effect),r.special[e]=Pe({get[e](){return r.props[e]}},e,K)}finally{T(s)}}return r.special[e](t),I(r.version),!0},getOwnPropertyDescriptor(r,e){if(!r.exclude.includes(e)&&e in r.props)return{enumerable:!0,configurable:!0,value:r.props[e]}},deleteProperty(r,e){return r.exclude.includes(e)||(r.exclude.push(e),I(r.version)),!0},has(r,e){return r.exclude.includes(e)?!1:e in r.props},ownKeys(r){return Reflect.ownKeys(r.props).filter(e=>!r.exclude.includes(e))}};function Oe(r,e){return new Proxy({props:r,exclude:e,special:{},version:ae(0),parent_effect:P},be)}const we={get(r,e){let t=r.props.length;for(;t--;){let s=r.props[t];if(_(s)&&(s=s()),typeof s=="object"&&s!==null&&e in s)return s[e]}},set(r,e,t){let s=r.props.length;for(;s--;){let n=r.props[s];_(n)&&(n=n());const a=m(n,e);if(a&&a.set)return a.set(t),!0}return!1},getOwnPropertyDescriptor(r,e){let t=r.props.length;for(;t--;){let s=r.props[t];if(_(s)&&(s=s()),typeof s=="object"&&s!==null&&e in s){const n=m(s,e);return n&&!n.configurable&&(n.configurable=!0),n}}},has(r,e){if(e===O||e===N)return!1;for(let t of r.props)if(_(t)&&(t=t()),t!=null&&e in t)return!0;return!1},ownKeys(r){const e=[];for(let t of r.props)if(_(t)&&(t=t()),!!t){for(const s in t)e.includes(s)||e.push(s);for(const s of Object.getOwnPropertySymbols(t))e.includes(s)||e.push(s)}return e}};function ye(...r){return new Proxy({props:r},we)}function Pe(r,e,t,s){var n=!ue||(t&ce)!==0,a=(t&fe)!==0,u=(t&pe)!==0,i=s,f=!0,o=()=>(f&&(f=!1,i=u?B(s):s),i);let l;if(a){var Y=O in r||N in r;l=m(r,e)?.set??(Y&&e in r?c=>r[e]=c:void 0)}var p,y=!1;a?[p,y]=he(()=>r[e]):p=r[e],p===void 0&&s!==void 0&&(p=o(),l&&(n&&re(),l(p)));var d;if(n?d=()=>{var c=r[e];return c===void 0?o():(f=!0,c)}:d=()=>{var c=r[e];return c!==void 0&&(i=void 0),c===void 0?i:c},n&&(t&K)===0)return d;if(l){var j=r.$$legacy;return(function(c,v){return arguments.length>0?((!n||!v||j||y)&&l(v?d():c),c):d()})}var S=!1,h=((t&oe)!==0?le:de)(()=>(S=!1,d()));a&&w(h);var F=P;return(function(c,v){if(arguments.length>0){const E=v?w(h):n&&a?se(c):c;return te(h,E),S=!0,i!==void 0&&(i=E),c}return ne&&S||(F.f&ie)!==0?h.v:w(h)})}export{_e as B,xe as b,ge as i,Oe as l,Pe as p,me as r,ye as s};
@@ -1 +0,0 @@
1
- import{J as T,K as c,L as v,M as l,N as h,T as g,O as w,h as i,k as n,R as E,d as m,P as N,i as y,Q as M,S as x}from"./CME08kGM.js";const O=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function C(e){return O?.createHTML(e)??e}function p(e){var r=T("template");return r.innerHTML=C(e.replaceAll("<!>","<!---->")),r.content}function a(e,r){var t=v;t.nodes===null&&(t.nodes={start:e,end:r,a:null,t:null})}function P(e,r){var t=(r&g)!==0,f=(r&w)!==0,s,d=!e.startsWith("<!>");return()=>{if(i)return a(n,null),n;s===void 0&&(s=p(d?e:"<!>"+e),t||(s=l(s)));var o=f||h?document.importNode(s,!0):s.cloneNode(!0);if(t){var _=l(o),u=o.lastChild;a(_,u)}else a(o,o);return o}}function L(e,r,t="svg"){var f=!e.startsWith("<!>"),s=`<${t}>${f?e:"<!>"+e}</${t}>`,d;return()=>{if(i)return a(n,null),n;if(!d){var o=p(s),_=l(o);d=l(_)}var u=d.cloneNode(!0);return a(u,u),u}}function R(e,r){return L(e,r,"svg")}function $(e=""){if(!i){var r=c(e+"");return a(r,r),r}var t=n;return t.nodeType!==N?(t.before(t=c()),y(t)):M(t),a(t,t),t}function D(){if(i)return a(n,null),n;var e=document.createDocumentFragment(),r=document.createComment(""),t=c();return e.append(r,t),a(r,t),e}function I(e,r){if(i){var t=v;((t.f&E)===0||t.nodes.end===null)&&(t.nodes.end=n),m();return}e!==null&&e.before(r)}function S(){if(i&&n&&n.nodeType===x&&n.textContent?.startsWith("$")){const e=n.textContent.substring(1);return m(),e}return(window.__svelte??={}).uid??=1,`c${window.__svelte.uid++}`}const b="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(b);export{I as a,a as b,D as c,R as d,P as f,S as p,$ as t};