clawmini 0.0.8 → 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/{vDehDcuJ.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.CUGC2p-K.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.0arZe_Uf.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.Bq2JzCEj.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 +0 -1
  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 -118
  274. package/web/.svelte-kit/generated/server/internal.js +1 -1
  275. package/web/.svelte-kit/output/client/.vite/manifest.json +126 -136
  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/{vDehDcuJ.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.CUGC2p-K.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.0arZe_Uf.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.Bq2JzCEj.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/D5iV40bG.js +0 -1
  328. package/dist/web/_app/immutable/chunks/DMtIqaiV.js +0 -2
  329. package/dist/web/_app/immutable/chunks/DhD271EB.js +0 -1
  330. package/dist/web/_app/immutable/chunks/DpuLqk8d.js +0 -1
  331. package/dist/web/_app/immutable/chunks/DsIToJCP.js +0 -1
  332. package/dist/web/_app/immutable/entry/app.BCSV3nrG.js +0 -2
  333. package/dist/web/_app/immutable/entry/start.D4eLEZUM.js +0 -1
  334. package/dist/web/_app/immutable/nodes/1.CGC_42IQ.js +0 -1
  335. package/dist/web/_app/immutable/nodes/4.ClM1bXLE.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/D5iV40bG.js +0 -1
  357. package/web/.svelte-kit/output/client/_app/immutable/chunks/DMtIqaiV.js +0 -2
  358. package/web/.svelte-kit/output/client/_app/immutable/chunks/DhD271EB.js +0 -1
  359. package/web/.svelte-kit/output/client/_app/immutable/chunks/DpuLqk8d.js +0 -1
  360. package/web/.svelte-kit/output/client/_app/immutable/chunks/DsIToJCP.js +0 -1
  361. package/web/.svelte-kit/output/client/_app/immutable/entry/app.BCSV3nrG.js +0 -2
  362. package/web/.svelte-kit/output/client/_app/immutable/entry/start.D4eLEZUM.js +0 -1
  363. package/web/.svelte-kit/output/client/_app/immutable/nodes/1.CGC_42IQ.js +0 -1
  364. package/web/.svelte-kit/output/client/_app/immutable/nodes/4.ClM1bXLE.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,175 +0,0 @@
1
- import { describe, it, expect, beforeAll, afterAll } from 'vitest';
2
- import path from 'node:path';
3
- import fs from 'node:fs';
4
- import { createE2EContext } from './utils.js';
5
-
6
- const { runCli, e2eDir, setupE2E, teardownE2E } = createE2EContext('e2e-tmp-fallbacks');
7
-
8
- describe('E2E Fallbacks Tests', () => {
9
- beforeAll(async () => {
10
- await setupE2E();
11
- await runCli(['init']);
12
- }, 30000);
13
-
14
- afterAll(teardownE2E, 30000);
15
-
16
- it('should fallback when base agent fails with exit code', async () => {
17
- const settingsPath = path.resolve(e2eDir, '.clawmini/settings.json');
18
- const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
19
-
20
- settings.defaultAgent = {
21
- commands: {
22
- new: 'if [ "$SUCCESS" = "true" ]; then echo "Succeeded"; else echo "Failed" >&2; exit 1; fi',
23
- },
24
- fallbacks: [
25
- {
26
- env: { SUCCESS: 'true' },
27
- retries: 0,
28
- delayMs: 100,
29
- },
30
- ],
31
- };
32
- fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
33
-
34
- await runCli(['chats', 'add', 'fb-chat-1']);
35
- await runCli(['messages', 'send', 'test-1', '--chat', 'fb-chat-1']);
36
- await new Promise((resolve) => setTimeout(resolve, 1500));
37
-
38
- const chatLogPath = path.resolve(e2eDir, '.clawmini/chats/fb-chat-1/chat.jsonl');
39
- const chatLog = fs.readFileSync(chatLogPath, 'utf8');
40
- const lines = chatLog
41
- .trim()
42
- .split('\n')
43
- .filter((l) => l.trim().length > 0)
44
- .map((l) => JSON.parse(l));
45
-
46
- // Lines: USER, LOG (retry-delay), LOG (success)
47
- expect(lines.some((l) => l.role === 'command' && l.content.includes('retrying'))).toBe(true);
48
- const commandLogs = lines.filter((l) => l.role === 'command');
49
- const lastLog = commandLogs[commandLogs.length - 1];
50
- expect(lastLog.role).toBe('command');
51
- expect(lastLog.content.trim()).toBe('Succeeded');
52
- expect(lastLog.exitCode).toBe(0);
53
- });
54
-
55
- it('should fallback when base agent returns empty content', async () => {
56
- const settingsPath = path.resolve(e2eDir, '.clawmini/settings.json');
57
- const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
58
-
59
- settings.defaultAgent = {
60
- commands: {
61
- new: 'echo "Base output"',
62
- getMessageContent: 'echo ""', // Empty content
63
- },
64
- fallbacks: [
65
- {
66
- commands: {
67
- getMessageContent: 'echo "Fallback success"',
68
- },
69
- retries: 0,
70
- delayMs: 100,
71
- },
72
- ],
73
- };
74
- fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
75
-
76
- await runCli(['chats', 'add', 'fb-chat-2']);
77
- await runCli(['messages', 'send', 'test-2', '--chat', 'fb-chat-2']);
78
- await new Promise((resolve) => setTimeout(resolve, 1500));
79
-
80
- const chatLogPath = path.resolve(e2eDir, '.clawmini/chats/fb-chat-2/chat.jsonl');
81
- const chatLog = fs.readFileSync(chatLogPath, 'utf8');
82
- const lines = chatLog
83
- .trim()
84
- .split('\n')
85
- .filter((l) => l.trim().length > 0)
86
- .map((l) => JSON.parse(l));
87
-
88
- const lastLog = lines[lines.length - 1];
89
- expect(lastLog.content.trim()).toBe('Fallback success');
90
- });
91
-
92
- it('should support multiple retries with exponential backoff logs', async () => {
93
- const settingsPath = path.resolve(e2eDir, '.clawmini/settings.json');
94
- const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
95
-
96
- // Use a file to track attempts
97
- const attemptFile = path.resolve(e2eDir, 'attempts.txt');
98
- fs.writeFileSync(attemptFile, '0');
99
-
100
- settings.defaultAgent = {
101
- commands: {
102
- new: `
103
- attempts=$(cat ${attemptFile})
104
- attempts=$((attempts + 1))
105
- echo $attempts > ${attemptFile}
106
- if [ $attempts -lt 3 ]; then
107
- exit 1
108
- else
109
- echo "Third time is a charm"
110
- fi
111
- `,
112
- },
113
- fallbacks: [
114
- {
115
- retries: 2,
116
- delayMs: 100,
117
- },
118
- ],
119
- };
120
- fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
121
-
122
- await runCli(['chats', 'add', 'fb-chat-3']);
123
- await runCli(['messages', 'send', 'test-3', '--chat', 'fb-chat-3']);
124
- await new Promise((resolve) => setTimeout(resolve, 2000));
125
-
126
- const chatLogPath = path.resolve(e2eDir, '.clawmini/chats/fb-chat-3/chat.jsonl');
127
- const chatLog = fs.readFileSync(chatLogPath, 'utf8');
128
- const lines = chatLog
129
- .trim()
130
- .split('\n')
131
- .filter((l) => l.trim().length > 0)
132
- .map((l) => JSON.parse(l));
133
-
134
- expect(
135
- lines.filter((l) => l.role === 'command' && l.content.includes('retrying')).length
136
- ).toBeGreaterThanOrEqual(1);
137
- expect(lines[lines.length - 1].content.trim()).toBe('Third time is a charm');
138
- }, 10000);
139
-
140
- it('should report final failure when all fallbacks are exhausted', async () => {
141
- const settingsPath = path.resolve(e2eDir, '.clawmini/settings.json');
142
- const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
143
-
144
- settings.defaultAgent = {
145
- commands: {
146
- new: 'exit 1',
147
- },
148
- fallbacks: [
149
- {
150
- commands: { new: 'echo "Fallback 1 fail" && exit 1' },
151
- retries: 0,
152
- delayMs: 100,
153
- },
154
- ],
155
- };
156
- fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
157
-
158
- await runCli(['chats', 'add', 'fb-chat-4']);
159
- await runCli(['messages', 'send', 'test-4', '--chat', 'fb-chat-4']);
160
- await new Promise((resolve) => setTimeout(resolve, 1500));
161
-
162
- const chatLogPath = path.resolve(e2eDir, '.clawmini/chats/fb-chat-4/chat.jsonl');
163
- const chatLog = fs.readFileSync(chatLogPath, 'utf8');
164
- const lines = chatLog
165
- .trim()
166
- .split('\n')
167
- .filter((l) => l.trim().length > 0)
168
- .map((l) => JSON.parse(l));
169
-
170
- const commandLogs = lines.filter((l) => l.role === 'command');
171
- const lastLog = commandLogs[commandLogs.length - 1];
172
- expect(lastLog.exitCode).toBe(1);
173
- expect(lastLog.stdout.trim()).toBe('Fallback 1 fail');
174
- });
175
- });
@@ -1,77 +0,0 @@
1
- import { describe, it, expect, beforeAll, afterAll } from 'vitest';
2
- import path from 'node:path';
3
- import fs from 'node:fs';
4
- import { createE2EContext } from './utils.js';
5
-
6
- describe('initCmd with flags', () => {
7
- const { runCli, e2eDir, setupE2E, teardownE2E } = createE2EContext('e2e-tmp-init');
8
-
9
- beforeAll(setupE2E, 30000);
10
- afterAll(teardownE2E, 30000);
11
-
12
- it('should fail if --agent-template is provided without --agent', async () => {
13
- const { stderr, code } = await runCli(['init', '--agent-template', 'bob']);
14
- expect(code).toBe(1);
15
- expect(stderr).toContain('--agent-template cannot be used without --agent');
16
- });
17
-
18
- it('should fail with invalid agent id', async () => {
19
- const { stderr, code } = await runCli(['init', '--agent', 'invalid/id']);
20
- expect(code).toBe(1);
21
- expect(stderr).toContain('Invalid agent ID');
22
- });
23
-
24
- it('should run init, create agent, and set default chat', async () => {
25
- const { stdout, stderr, code } = await runCli(['init', '--agent', 'test-agent']);
26
-
27
- expect(stderr).toBe('');
28
- expect(code).toBe(0);
29
- expect(stdout).toContain('Initialized .clawmini/settings.json');
30
- expect(stdout).toContain('Agent test-agent created successfully');
31
- expect(stdout).toContain('Default chat set to test-agent');
32
-
33
- const clawminiDir = path.resolve(e2eDir, '.clawmini');
34
- const settingsPath = path.join(clawminiDir, 'settings.json');
35
- expect(fs.existsSync(settingsPath)).toBe(true);
36
-
37
- const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
38
- expect(settings.chats?.defaultId).toBe('test-agent');
39
-
40
- const agentSettingsPath = path.join(clawminiDir, 'agents', 'test-agent', 'settings.json');
41
- expect(fs.existsSync(agentSettingsPath)).toBe(true);
42
-
43
- const chatSettingsPath = path.join(clawminiDir, 'chats', 'test-agent', 'settings.json');
44
- expect(fs.existsSync(chatSettingsPath)).toBe(true);
45
-
46
- // Verify skills were copied to the agent's default skills directory (.agents/skills)
47
- const skillsDir = path.join(e2eDir, 'test-agent', '.agents', 'skills');
48
- expect(fs.existsSync(skillsDir)).toBe(true);
49
- // Check for at least one skill inside
50
- const skillsList = fs.readdirSync(skillsDir);
51
- expect(skillsList.length).toBeGreaterThan(0);
52
- });
53
-
54
- it.skip('should run init and enable an environment', async () => {
55
- const clawminiDir = path.resolve(e2eDir, '.clawmini');
56
- if (fs.existsSync(clawminiDir)) {
57
- fs.rmSync(clawminiDir, { recursive: true, force: true });
58
- }
59
-
60
- const { stdout, stderr, code } = await runCli(['init', '--environment', 'macos']);
61
-
62
- expect(stderr).toBe('');
63
- expect(code).toBe(0);
64
- expect(stdout).toContain('Initialized .clawmini/settings.json');
65
- expect(stdout).toContain("Copied environment template 'macos'");
66
- expect(stdout).toContain("Enabled environment 'macos' for path './'");
67
-
68
- const settingsPath = path.join(clawminiDir, 'settings.json');
69
- expect(fs.existsSync(settingsPath)).toBe(true);
70
-
71
- const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
72
- expect(settings.environments?.['./']).toBe('macos');
73
-
74
- const envDir = path.join(clawminiDir, 'environments', 'macos');
75
- expect(fs.existsSync(envDir)).toBe(true);
76
- });
77
- });
@@ -1,332 +0,0 @@
1
- import { describe, it, expect, beforeAll, afterAll, vi } from 'vitest';
2
- import path from 'node:path';
3
- import fs from 'node:fs';
4
- import { createE2EContext } from './utils.js';
5
-
6
- const { runCli, e2eDir, setupE2E, teardownE2E } = createE2EContext('e2e-tmp-messages');
7
-
8
- describe('E2E Messages Tests', () => {
9
- beforeAll(async () => {
10
- await setupE2E();
11
- await runCli(['init']);
12
- }, 30000);
13
-
14
- afterAll(teardownE2E, 30000);
15
-
16
- it('should send a message via the daemon', async () => {
17
- const { stdout, code } = await runCli(['messages', 'send', 'e2e test message']);
18
-
19
- expect(code).toBe(0);
20
- expect(stdout).toContain('Message sent successfully.');
21
-
22
- const chatLog = fs.readFileSync(
23
- path.resolve(e2eDir, '.clawmini/chats/default/chat.jsonl'),
24
- 'utf8'
25
- );
26
- expect(chatLog).toContain('e2e test message');
27
- });
28
-
29
- it('should send a message to a specific chat', async () => {
30
- await runCli(['chats', 'add', 'specific-chat']);
31
- const { stdout, code } = await runCli([
32
- 'messages',
33
- 'send',
34
- 'specific chat message',
35
- '--chat',
36
- 'specific-chat',
37
- ]);
38
-
39
- expect(code).toBe(0);
40
- expect(stdout).toContain('Message sent successfully.');
41
-
42
- await new Promise((resolve) => setTimeout(resolve, 500));
43
-
44
- const chatLog = fs.readFileSync(
45
- path.resolve(e2eDir, '.clawmini/chats/specific-chat/chat.jsonl'),
46
- 'utf8'
47
- );
48
- expect(chatLog).toContain('specific chat message');
49
- });
50
-
51
- it('should send a message with a specific session ID', async () => {
52
- await runCli(['chats', 'add', 'session-chat']);
53
- const { stdout, code } = await runCli([
54
- 'messages',
55
- 'send',
56
- 'session test message',
57
- '--chat',
58
- 'session-chat',
59
- '--session',
60
- 'my-test-session',
61
- ]);
62
-
63
- expect(code).toBe(0);
64
- expect(stdout).toContain('Message sent successfully.');
65
-
66
- await new Promise((resolve) => setTimeout(resolve, 500));
67
-
68
- const chatLog = fs.readFileSync(
69
- path.resolve(e2eDir, '.clawmini/chats/session-chat/chat.jsonl'),
70
- 'utf8'
71
- );
72
- expect(chatLog).toContain('session test message');
73
- });
74
-
75
- it('should send a message with a specific agent and persist it', async () => {
76
- await runCli(['agents', 'add', 'custom-agent', '--env', 'CUSTOM_VAR=HELLO']);
77
- await runCli(['chats', 'add', 'agent-chat']);
78
-
79
- const { stdout, code } = await runCli([
80
- 'messages',
81
- 'send',
82
- 'hello custom agent',
83
- '--chat',
84
- 'agent-chat',
85
- '--agent',
86
- 'custom-agent',
87
- ]);
88
-
89
- expect(code).toBe(0);
90
- expect(stdout).toContain('Message sent successfully.');
91
-
92
- const chatSettingsPath = path.resolve(e2eDir, '.clawmini/chats/agent-chat/settings.json');
93
- expect(fs.existsSync(chatSettingsPath)).toBe(true);
94
- const chatSettings = JSON.parse(fs.readFileSync(chatSettingsPath, 'utf8'));
95
- expect(chatSettings.defaultAgent).toBe('custom-agent');
96
-
97
- const { stderr: stderrFail, code: codeFail } = await runCli([
98
- 'messages',
99
- 'send',
100
- 'fail msg',
101
- '--chat',
102
- 'agent-chat',
103
- '--agent',
104
- 'non-existent-agent',
105
- ]);
106
-
107
- expect(codeFail).toBe(1);
108
- expect(stderrFail).toContain("Error: Agent 'non-existent-agent' not found.");
109
- });
110
-
111
- it('should send a message with a file attachment', async () => {
112
- await runCli(['chats', 'add', 'file-chat']);
113
- const testFilePath = path.resolve(e2eDir, 'test-attach.txt');
114
- fs.writeFileSync(testFilePath, 'file content');
115
-
116
- const { stdout, code } = await runCli([
117
- 'messages',
118
- 'send',
119
- 'here is a file',
120
- '--chat',
121
- 'file-chat',
122
- '--file',
123
- testFilePath,
124
- ]);
125
-
126
- expect(code).toBe(0);
127
- expect(stdout).toContain('Message sent successfully.');
128
-
129
- await new Promise((resolve) => setTimeout(resolve, 500));
130
-
131
- const chatLog = fs.readFileSync(
132
- path.resolve(e2eDir, '.clawmini/chats/file-chat/chat.jsonl'),
133
- 'utf8'
134
- );
135
- expect(chatLog).toContain('here is a file');
136
- expect(chatLog).toContain('Attached files:');
137
- expect(chatLog).toContain('test-attach');
138
- });
139
-
140
- it('should view history with tail and --json flag', async () => {
141
- const { stdout, code } = await runCli(['messages', 'tail', '--chat', 'specific-chat']);
142
- expect(code).toBe(0);
143
- expect(stdout).toContain('[USER]');
144
- expect(stdout).toContain('specific chat message');
145
-
146
- const { stdout: jsonStdout, code: jsonCode } = await runCli([
147
- 'messages',
148
- 'tail',
149
- '--json',
150
- '--chat',
151
- 'specific-chat',
152
- ]);
153
- expect(jsonCode).toBe(0);
154
- expect(jsonStdout).toContain('"role":"user"');
155
- expect(jsonStdout).toContain('"content":"specific chat message"');
156
- });
157
-
158
- it('should return immediately with --no-wait flag', async () => {
159
- await runCli(['chats', 'add', 'nowait-chat']);
160
-
161
- const { stdout, code } = await runCli([
162
- 'messages',
163
- 'send',
164
- 'no wait message',
165
- '--chat',
166
- 'nowait-chat',
167
- '--no-wait',
168
- ]);
169
-
170
- expect(code).toBe(0);
171
- expect(stdout).toContain('Message sent successfully.');
172
-
173
- await new Promise((resolve) => setTimeout(resolve, 500));
174
-
175
- const chatLog = fs.readFileSync(
176
- path.resolve(e2eDir, '.clawmini/chats/nowait-chat/chat.jsonl'),
177
- 'utf8'
178
- );
179
- expect(chatLog).toContain('no wait message');
180
- });
181
-
182
- it('should maintain atomic ordering of user and log messages with --no-wait', async () => {
183
- const settingsPath = path.resolve(e2eDir, '.clawmini/settings.json');
184
- const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
185
- const oldCmd = settings.defaultAgent?.commands?.new;
186
-
187
- settings.defaultAgent = typeof settings.defaultAgent === 'object' ? settings.defaultAgent : {};
188
- settings.defaultAgent.commands = settings.defaultAgent.commands || {};
189
- settings.defaultAgent.commands.new = 'sleep 1 && echo $CLAW_CLI_MESSAGE';
190
- fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
191
-
192
- await runCli(['chats', 'add', 'order-chat']);
193
-
194
- await runCli(['messages', 'send', 'first', '--chat', 'order-chat', '--no-wait']);
195
- await runCli(['messages', 'send', 'second', '--chat', 'order-chat', '--no-wait']);
196
-
197
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
198
- let commandLogs: any[] = [];
199
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
200
- let lines: any[] = [];
201
-
202
- await vi.waitFor(
203
- () => {
204
- const chatLog = fs.readFileSync(
205
- path.resolve(e2eDir, '.clawmini/chats/order-chat/chat.jsonl'),
206
- 'utf8'
207
- );
208
- lines = chatLog
209
- .trim()
210
- .split('\n')
211
- .filter(Boolean)
212
- .map((l) => JSON.parse(l));
213
-
214
- commandLogs = lines.filter((l) => l.role === 'command');
215
- expect(commandLogs).toHaveLength(2);
216
- },
217
- { timeout: 10000, interval: 200 }
218
- );
219
-
220
- settings.defaultAgent.commands.new = oldCmd;
221
- fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
222
-
223
- expect(lines[0].role).toBe('user');
224
- expect(lines[0].content).toBe('first');
225
- expect(lines[1].role).toBe('user');
226
- expect(lines[1].content).toBe('second');
227
- expect(commandLogs[0].content.trim()).toBe('first');
228
- expect(commandLogs[1].content.trim()).toBe('second');
229
- }, 10000);
230
-
231
- it('should handle full multi-message session workflow (extraction & append)', async () => {
232
- const settingsPath = path.resolve(e2eDir, '.clawmini/settings.json');
233
- const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
234
- const oldCmds = settings.defaultAgent?.commands || {};
235
-
236
- settings.defaultAgent = typeof settings.defaultAgent === 'object' ? settings.defaultAgent : {};
237
- settings.defaultAgent.commands = {
238
- new: 'echo "NEW $CLAW_CLI_MESSAGE" && echo "ERR NEW" >&2',
239
- append: 'echo "APPEND $CLAW_CLI_MESSAGE" && echo "ERR APPEND" >&2',
240
- getSessionId: 'echo "session-123"',
241
- getMessageContent: 'sed "s/^/EXTRACTED-/"',
242
- };
243
- fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
244
-
245
- await runCli(['chats', 'add', 'workflow-chat']);
246
- const chatLogPath = path.resolve(e2eDir, '.clawmini/chats/workflow-chat/chat.jsonl');
247
-
248
- await runCli(['messages', 'send', 'msg-1', '--chat', 'workflow-chat']);
249
-
250
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
251
- let commandLogs: any[] = [];
252
- await vi.waitFor(
253
- () => {
254
- const chatLog = fs.readFileSync(chatLogPath, 'utf8');
255
- const lines = chatLog
256
- .trim()
257
- .split('\n')
258
- .filter(Boolean)
259
- .map((l) => JSON.parse(l));
260
- commandLogs = lines.filter((l) => l.role === 'command');
261
- expect(commandLogs).toHaveLength(1);
262
- },
263
- { timeout: 10000, interval: 200 }
264
- );
265
-
266
- expect(commandLogs[0].command).toBe('echo "NEW $CLAW_CLI_MESSAGE" && echo "ERR NEW" >&2');
267
- expect(commandLogs[0].content).toContain('EXTRACTED-NEW msg-1');
268
- expect(commandLogs[0].stderr).toContain('ERR NEW');
269
- expect(commandLogs[0].stdout).toContain('NEW msg-1');
270
-
271
- const sessionSettings = JSON.parse(
272
- fs.readFileSync(
273
- path.resolve(e2eDir, '.clawmini/agents/default/sessions/default/settings.json'),
274
- 'utf8'
275
- )
276
- );
277
- expect(sessionSettings.env.SESSION_ID).toBe('session-123');
278
-
279
- await runCli(['messages', 'send', 'msg-2', '--chat', 'workflow-chat']);
280
-
281
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
282
- let commandLogs2: any[] = [];
283
- await vi.waitFor(
284
- () => {
285
- const chatLog = fs.readFileSync(chatLogPath, 'utf8');
286
- const lines = chatLog
287
- .trim()
288
- .split('\n')
289
- .filter(Boolean)
290
- .map((l) => JSON.parse(l));
291
- commandLogs2 = lines.filter((l) => l.role === 'command');
292
- expect(commandLogs2).toHaveLength(2);
293
- },
294
- { timeout: 10000, interval: 200 }
295
- );
296
-
297
- expect(commandLogs2[1].command).toBe(
298
- 'echo "APPEND $CLAW_CLI_MESSAGE" && echo "ERR APPEND" >&2'
299
- );
300
- expect(commandLogs2[1].content).toContain('EXTRACTED-APPEND msg-2');
301
- expect(commandLogs2[1].stderr).toContain('ERR APPEND');
302
- expect(commandLogs2[1].stdout).toContain('APPEND msg-2');
303
-
304
- settings.defaultAgent.commands.getMessageContent = 'echo "EXTRACTION_FAIL" >&2 && exit 1';
305
- fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
306
-
307
- await runCli(['messages', 'send', 'msg-3', '--chat', 'workflow-chat']);
308
-
309
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
310
- let commandLogs3: any[] = [];
311
- await vi.waitFor(
312
- () => {
313
- const chatLog = fs.readFileSync(chatLogPath, 'utf8');
314
- const lines = chatLog
315
- .trim()
316
- .split('\n')
317
- .filter(Boolean)
318
- .map((l) => JSON.parse(l));
319
- commandLogs3 = lines.filter((l) => l.role === 'command');
320
- expect(commandLogs3).toHaveLength(3);
321
- },
322
- { timeout: 10000, interval: 200 }
323
- );
324
-
325
- expect(commandLogs3[2].stdout).toContain('APPEND msg-3');
326
- expect(commandLogs3[2].stderr).toContain('ERR APPEND');
327
- expect(commandLogs3[2].stderr).toContain('getMessageContent failed: EXTRACTION_FAIL');
328
-
329
- settings.defaultAgent.commands = oldCmds;
330
- fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2));
331
- }, 15000);
332
- });