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
@@ -0,0 +1,246 @@
1
+ import { describe, it, expect, beforeAll, afterAll, afterEach } from 'vitest';
2
+ import {
3
+ TestEnvironment,
4
+ type ChatSubscription,
5
+ commandMatching,
6
+ } from '../_helpers/test-environment.js';
7
+
8
+ // Verifies the subagent router only lets a caller act on its own direct
9
+ // children — peers, grandchildren, and parents are off-limits. The router
10
+ // enforces `sub.parentId === ctx.tokenPayload.subagentId` on every mutation
11
+ // and query; these tests probe each endpoint via the lite CLI.
12
+
13
+ const FORBIDDEN_PATTERN = /not a child of the caller|Subagent not found/i;
14
+
15
+ describe('E2E Subagent Authorization', () => {
16
+ let env: TestEnvironment;
17
+
18
+ beforeAll(async () => {
19
+ env = new TestEnvironment('e2e-subagent-authz');
20
+ await env.setup();
21
+ await env.setupSubagentEnv();
22
+ }, 30000);
23
+
24
+ afterAll(() => env.teardown(), 30000);
25
+ afterEach(() => env.disconnectAll());
26
+
27
+ async function spawnSibling(
28
+ chatId: string,
29
+ chat: ChatSubscription,
30
+ id: string,
31
+ body: string
32
+ ): Promise<void> {
33
+ await env.sendMessage(`clawmini-lite.js subagents spawn --id ${id} --async "${body}"`, {
34
+ chat: chatId,
35
+ agent: 'debug-agent',
36
+ });
37
+ await chat.waitForMessage(
38
+ commandMatching((m) => m.subagentId === id && m.stdout.length > 0)
39
+ );
40
+ }
41
+
42
+ // Runs `body` inside a newly-spawned subagent `attackerId` whose parent is
43
+ // the root agent, and waits for `body`'s output to land in that subagent's
44
+ // command log. Used to exercise "sibling attacks peer" scenarios — the
45
+ // attacker's CLI call runs with its own token, so the router sees it as a
46
+ // peer of any other top-level subagent.
47
+ async function runAttack(
48
+ chatId: string,
49
+ chat: ChatSubscription,
50
+ attackerId: string,
51
+ body: string
52
+ ): Promise<string> {
53
+ await env.sendMessage(
54
+ `clawmini-lite.js subagents spawn --id ${attackerId} --async "${body}"`,
55
+ { chat: chatId, agent: 'debug-agent' }
56
+ );
57
+ // Wait for ANY command log from the attacker — we inspect it after.
58
+ const log = await chat.waitForMessage(
59
+ commandMatching(
60
+ (m) => m.subagentId === attackerId && (m.stdout.length > 0 || !!m.stderr)
61
+ ),
62
+ 15000
63
+ );
64
+ return JSON.stringify(log);
65
+ }
66
+
67
+ it('peer subagent cannot tail a sibling', async () => {
68
+ const chatId = 'authz-tail';
69
+ await env.addChat(chatId, 'debug-agent');
70
+ const chat = await env.connect(chatId);
71
+
72
+ await spawnSibling(chatId, chat, 'authz-tail-victim', 'echo victim-secret');
73
+
74
+ const serialized = await runAttack(
75
+ chatId,
76
+ chat,
77
+ 'authz-tail-attacker',
78
+ 'clawmini-lite.js subagents tail authz-tail-victim --json'
79
+ );
80
+
81
+ expect(serialized).toMatch(FORBIDDEN_PATTERN);
82
+ expect(serialized).not.toContain('victim-secret');
83
+ }, 30000);
84
+
85
+ it('peer subagent cannot wait on a sibling', async () => {
86
+ const chatId = 'authz-wait';
87
+ await env.addChat(chatId, 'debug-agent');
88
+ const chat = await env.connect(chatId);
89
+
90
+ await spawnSibling(chatId, chat, 'authz-wait-victim', 'echo wait-victim');
91
+
92
+ const serialized = await runAttack(
93
+ chatId,
94
+ chat,
95
+ 'authz-wait-attacker',
96
+ 'clawmini-lite.js subagents wait authz-wait-victim'
97
+ );
98
+
99
+ expect(serialized).toMatch(FORBIDDEN_PATTERN);
100
+ }, 30000);
101
+
102
+ it('peer subagent cannot send to a sibling', async () => {
103
+ const chatId = 'authz-send';
104
+ await env.addChat(chatId, 'debug-agent');
105
+ const chat = await env.connect(chatId);
106
+
107
+ await spawnSibling(chatId, chat, 'authz-send-victim', 'echo send-victim');
108
+
109
+ const serialized = await runAttack(
110
+ chatId,
111
+ chat,
112
+ 'authz-send-attacker',
113
+ "clawmini-lite.js subagents send authz-send-victim --async -p 'echo injected'"
114
+ );
115
+
116
+ expect(serialized).toMatch(FORBIDDEN_PATTERN);
117
+ // Victim must not have received the injected prompt.
118
+ const victimLogs = chat.messageBuffer.filter(
119
+ (m) => (m as { subagentId?: string }).subagentId === 'authz-send-victim'
120
+ );
121
+ expect(JSON.stringify(victimLogs)).not.toContain('injected');
122
+ }, 30000);
123
+
124
+ it('peer subagent cannot stop a sibling', async () => {
125
+ const chatId = 'authz-stop';
126
+ await env.addChat(chatId, 'debug-agent');
127
+ const chat = await env.connect(chatId);
128
+
129
+ // Long-running victim so an unauthorized stop would be observable via
130
+ // tracker state.
131
+ await env.sendMessage(
132
+ 'clawmini-lite.js subagents spawn --id authz-stop-victim --async "sleep 5 && echo victim-survived"',
133
+ { chat: chatId, agent: 'debug-agent' }
134
+ );
135
+ for (let i = 0; i < 50; i++) {
136
+ const settings = env.getChatSettings(chatId) as {
137
+ subagents?: Record<string, { status: string }>;
138
+ };
139
+ if (settings.subagents?.['authz-stop-victim']?.status === 'active') break;
140
+ await new Promise((r) => setTimeout(r, 100));
141
+ }
142
+
143
+ const serialized = await runAttack(
144
+ chatId,
145
+ chat,
146
+ 'authz-stop-attacker',
147
+ 'clawmini-lite.js subagents stop authz-stop-victim'
148
+ );
149
+
150
+ expect(serialized).toMatch(FORBIDDEN_PATTERN);
151
+ // Victim's status must not have flipped to 'failed' from the stop attempt.
152
+ const settings = env.getChatSettings(chatId) as {
153
+ subagents?: Record<string, { status: string }>;
154
+ };
155
+ expect(settings.subagents?.['authz-stop-victim']?.status).toBe('active');
156
+ }, 30000);
157
+
158
+ it('peer subagent cannot delete a sibling', async () => {
159
+ const chatId = 'authz-delete';
160
+ await env.addChat(chatId, 'debug-agent');
161
+ const chat = await env.connect(chatId);
162
+
163
+ await spawnSibling(chatId, chat, 'authz-delete-victim', 'echo delete-victim');
164
+
165
+ const serialized = await runAttack(
166
+ chatId,
167
+ chat,
168
+ 'authz-delete-attacker',
169
+ 'clawmini-lite.js subagents delete authz-delete-victim'
170
+ );
171
+
172
+ expect(serialized).toMatch(FORBIDDEN_PATTERN);
173
+ // Victim tracker must still exist.
174
+ const settings = env.getChatSettings(chatId) as {
175
+ subagents?: Record<string, unknown>;
176
+ };
177
+ expect(settings.subagents?.['authz-delete-victim']).toBeTruthy();
178
+ }, 30000);
179
+
180
+ it('parent cannot reach a grandchild via tail/wait/send/stop/delete', async () => {
181
+ // Grandchildren belong to a subagent, not the root, so the root's token
182
+ // (subagentId=undefined) should not satisfy parentId === undefined for
183
+ // those records (their parentId is the intermediate subagent).
184
+ const chatId = 'authz-gchild';
185
+ await env.addChat(chatId, 'debug-agent');
186
+ const chat = await env.connect(chatId);
187
+
188
+ // Outer spawns inner and stays alive long enough for us to observe state.
189
+ await env.sendMessage(
190
+ 'clawmini-lite.js subagents spawn --id authz-outer --async "clawmini-lite.js subagents spawn --id authz-inner --async \\"echo inner-done\\" && sleep 2"',
191
+ { chat: chatId, agent: 'debug-agent' }
192
+ );
193
+ // Wait for inner to land in settings.
194
+ for (let i = 0; i < 80; i++) {
195
+ const s = env.getChatSettings(chatId) as {
196
+ subagents?: Record<string, { parentId?: string }>;
197
+ };
198
+ if (s.subagents?.['authz-inner']?.parentId === 'authz-outer') break;
199
+ await new Promise((r) => setTimeout(r, 100));
200
+ }
201
+
202
+ // From the root agent's chat, each op on authz-inner must fail.
203
+ const attacks = [
204
+ 'clawmini-lite.js subagents tail authz-inner --json',
205
+ 'clawmini-lite.js subagents wait authz-inner',
206
+ "clawmini-lite.js subagents send authz-inner --async -p 'echo x'",
207
+ 'clawmini-lite.js subagents stop authz-inner',
208
+ 'clawmini-lite.js subagents delete authz-inner',
209
+ ];
210
+ for (const attack of attacks) {
211
+ await env.sendMessage(attack, { chat: chatId, agent: 'debug-agent' });
212
+ const log = await chat.waitForMessage(
213
+ commandMatching(
214
+ (m) => !m.subagentId && m.stdout.includes(`${attack}:`) && !!m.stderr
215
+ ),
216
+ 15000
217
+ );
218
+ expect(JSON.stringify(log)).toMatch(FORBIDDEN_PATTERN);
219
+ }
220
+ }, 45000);
221
+
222
+ it('subagent CAN access its own child (positive control)', async () => {
223
+ // Make sure the authz enforcement isn't over-broad: a subagent that
224
+ // spawns its own child must still be able to tail/wait/stop/delete it.
225
+ const chatId = 'authz-positive';
226
+ await env.addChat(chatId, 'debug-agent');
227
+ const chat = await env.connect(chatId);
228
+
229
+ // Outer spawns inner, then tails inner's log — inner.parentId === outer,
230
+ // caller token.subagentId === outer, so access is allowed.
231
+ await env.sendMessage(
232
+ 'clawmini-lite.js subagents spawn --id pos-outer --async "clawmini-lite.js subagents spawn --id pos-inner --async \\"echo inner-visible\\" && sleep 1 && clawmini-lite.js subagents tail pos-inner --json"',
233
+ { chat: chatId, agent: 'debug-agent' }
234
+ );
235
+
236
+ const outerLog = await chat.waitForMessage(
237
+ commandMatching(
238
+ (m) => m.subagentId === 'pos-outer' && m.stdout.includes('inner-visible')
239
+ ),
240
+ 20000
241
+ );
242
+ // Must NOT contain the forbidden error — the happy path has content, not
243
+ // an error message.
244
+ expect(outerLog.stdout).not.toMatch(/not a child of the caller/i);
245
+ }, 30000);
246
+ });
@@ -0,0 +1,49 @@
1
+ import { describe, it, expect, beforeAll, afterAll, afterEach } from 'vitest';
2
+ import { TestEnvironment, type ChatSubscription, commandMatching } from '../_helpers/test-environment.js';
3
+
4
+ describe('E2E Agent subagentEnv Merge', () => {
5
+ let env: TestEnvironment;
6
+ let chat: ChatSubscription | undefined;
7
+
8
+ beforeAll(async () => {
9
+ env = new TestEnvironment('e2e-subagent-env');
10
+ await env.setup();
11
+ await env.setupSubagentEnv();
12
+
13
+ env.updateAgentSettings('debug-agent', {
14
+ env: { PARENT_VAR: 'parent' },
15
+ subagentEnv: { SUBAGENT_VAR: 'sub', PARENT_VAR: 'overridden' },
16
+ });
17
+ }, 30000);
18
+
19
+ afterAll(() => env.teardown(), 30000);
20
+ afterEach(() => env.disconnectAll());
21
+
22
+ it('applies subagentEnv only to subagent invocations, not the parent', async () => {
23
+ await env.addChat('subenv-chat', 'debug-agent');
24
+ chat = await env.connect('subenv-chat');
25
+
26
+ // 1) Parent: plain env dump should include PARENT_VAR and omit SUBAGENT_VAR.
27
+ await env.sendMessage('env', { chat: 'subenv-chat', agent: 'debug-agent' });
28
+ const parentLog = await chat.waitForMessage(
29
+ commandMatching(
30
+ (m) => !m.subagentId && m.stdout.includes('[DEBUG] env:') && m.stdout.includes('PARENT_VAR=')
31
+ )
32
+ );
33
+ expect(parentLog.stdout).toMatch(/^PARENT_VAR=parent$/m);
34
+ expect(parentLog.stdout).not.toMatch(/^SUBAGENT_VAR=/m);
35
+
36
+ // 2) Subagent: spawn one that runs env; its log should show overridden
37
+ // PARENT_VAR and the subagent-only SUBAGENT_VAR.
38
+ await env.sendMessage('clawmini-lite.js subagents spawn --async "env"', {
39
+ chat: 'subenv-chat',
40
+ agent: 'debug-agent',
41
+ });
42
+
43
+ const subLog = await chat.waitForMessage(
44
+ commandMatching((m) => typeof m.subagentId === 'string' && m.stdout.includes('SUBAGENT_VAR='))
45
+ );
46
+ expect(subLog.stdout).toMatch(/^SUBAGENT_VAR=sub$/m);
47
+ expect(subLog.stdout).toMatch(/^PARENT_VAR=overridden$/m);
48
+ }, 20000);
49
+ });