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 @@
1
+ {"version":3,"file":"supervisor-actions-CiW56eLi.mjs","names":["fs","appendMessage","fs","shared.appendMessage"],"sources":["../src/shared/chats.ts","../src/shared/lite.ts","../src/cli/supervisor-pid.ts","../src/cli/install-detection.ts","../src/cli/supervisor-control.ts","../src/daemon/events.ts","../src/daemon/chats.ts","../src/daemon/pending-replies.ts","../src/cli/supervisor-actions.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 sessionId: string | undefined;\n turnId?: 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 * Populated on `event === 'cron'` with the CronJob id that fired. Used by\n * adapters (gchat `visibility.jobs: 'header'`) to render a terse header\n * instead of the agent-facing prompt.\n */\n jobId?: 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 turnId?: string;\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 { createHash } from 'node:crypto';\nimport { fileURLToPath } from 'node:url';\nimport { readSettings, readEnvironment, getWorkspaceRoot } from './workspace.js';\nimport type { Environment } from './config.js';\n\nconst LITE_MARKER = 'clawmini-lite';\n\nfunction sha256(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\nfunction looksLikeLiteScript(content: string): boolean {\n return content.startsWith('#!') && content.includes(LITE_MARKER);\n}\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\nasync function resolveLiteTargetPath(outPath: string): Promise<string> {\n const isProbablyFile =\n path.extname(outPath) === '.js' ||\n path.extname(outPath) === '.mjs' ||\n path.basename(outPath) === 'clawmini-lite';\n\n try {\n const stat = await fs.stat(outPath);\n if (stat.isDirectory()) {\n return path.join(outPath, 'clawmini-lite.js');\n }\n return outPath;\n } catch {\n if (isProbablyFile) return outPath;\n // No extension and path doesn't yet exist — treat as a directory target.\n return path.join(outPath, 'clawmini-lite.js');\n }\n}\n\n// Content-hashed write that refuses to clobber an arbitrary user file at the\n// export path. Returns:\n// - 'written' when the file was created or updated\n// - 'unchanged' when the on-disk content already matches (no mtime touch)\n// - 'refused' when the existing file looks like it isn't a clawmini-lite\nexport async function refreshLiteAt(\n outPath: string,\n opts: { label?: string } = {}\n): Promise<{ status: 'written' | 'unchanged' | 'refused'; path: string }> {\n const content = await getLiteScriptContent();\n const finalPath = await resolveLiteTargetPath(outPath);\n\n let existing: string | null = null;\n try {\n existing = await fs.readFile(finalPath, 'utf8');\n } catch {\n // missing — write below\n }\n\n if (existing !== null) {\n if (sha256(existing) === sha256(content)) {\n return { status: 'unchanged', path: finalPath };\n }\n if (!looksLikeLiteScript(existing)) {\n const label = opts.label ? ` (${opts.label})` : '';\n console.warn(\n `Refusing to overwrite ${finalPath}${label}: existing file is not a clawmini-lite script`\n );\n return { status: 'refused', path: finalPath };\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 { status: 'written', path: 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 result = await refreshLiteAt(finalExportPath, { label: `Environment: ${envName}` });\n if (result.status === 'written') {\n console.log(\n `Successfully exported clawmini-lite to ${result.path} (Environment: ${envName})`\n );\n } else if (result.status === 'refused') {\n return false;\n }\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","import fs from 'node:fs';\nimport path from 'node:path';\nimport { execFileSync } from 'node:child_process';\nimport { getClawminiDir } from '../shared/workspace.js';\n\nexport function getSupervisorPidPath(startDir = process.cwd()): string {\n return path.join(getClawminiDir(startDir), 'supervisor.pid');\n}\n\n// Returns the kernel-reported start time of `pid` as an opaque string, or\n// null if the process doesn't exist. The exact format is platform-defined\n// but stable per-host, which is all we need: we only ever compare the\n// stored value against a fresh read on the same machine.\nfunction getProcessStartTime(pid: number): string | null {\n try {\n const out = execFileSync('ps', ['-p', String(pid), '-o', 'lstart='], {\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n const trimmed = out.trim();\n return trimmed.length > 0 ? trimmed : null;\n } catch {\n return null;\n }\n}\n\n// The pid file stores `<pid>:<start-time>` so we can detect pid reuse:\n// `kill(pid, 0)` only confirms *something* with that pid is alive. After\n// the supervisor exits the OS may hand the same pid to an unrelated\n// process (browser tab, ssh, etc.) — without the start-time check we'd\n// happily SIGTERM that.\nexport function readSupervisorPid(startDir = process.cwd()): number | null {\n const p = getSupervisorPidPath(startDir);\n if (!fs.existsSync(p)) return null;\n const content = fs.readFileSync(p, 'utf-8').trim();\n const sep = content.indexOf(':');\n if (sep <= 0) return null;\n const pid = parseInt(content.slice(0, sep), 10);\n const storedStart = content.slice(sep + 1).trim();\n if (!Number.isFinite(pid) || pid <= 0 || storedStart.length === 0) return null;\n try {\n process.kill(pid, 0);\n } catch {\n return null;\n }\n const currentStart = getProcessStartTime(pid);\n if (currentStart === null || currentStart !== storedStart) return null;\n return pid;\n}\n\nexport function writeSupervisorPid(pid: number, startDir = process.cwd()): void {\n const startTime = getProcessStartTime(pid);\n if (!startTime) {\n throw new Error(`Cannot read start time for pid ${pid}; refusing to write supervisor.pid`);\n }\n fs.writeFileSync(getSupervisorPidPath(startDir), `${pid}:${startTime}`);\n}\n\nexport function removeSupervisorPid(startDir = process.cwd()): void {\n const p = getSupervisorPidPath(startDir);\n if (fs.existsSync(p)) {\n try {\n fs.unlinkSync(p);\n } catch {\n // best-effort cleanup\n }\n }\n}\n","import fs from 'node:fs';\nimport { execFileSync } from 'node:child_process';\nimport path from 'node:path';\n\nexport interface InstallInfo {\n /** True when the running clawmini binary lives under `npm root -g` after realpath. */\n isNpmGlobal: boolean;\n /** The realpath of the running entry point (process.argv[1] resolved). */\n entryRealPath: string;\n /** The realpath of `npm root -g`, when available. */\n npmRootRealPath: string | null;\n}\n\nfunction realpathOrNull(p: string): string | null {\n try {\n return fs.realpathSync(p);\n } catch {\n return null;\n }\n}\n\nfunction getNpmRootGlobal(): string | null {\n try {\n const out = execFileSync('npm', ['root', '-g'], {\n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n return out.trim() || null;\n } catch {\n return null;\n }\n}\n\nexport function detectInstall(entryPath: string = process.argv[1] ?? ''): InstallInfo {\n const entryRealPath = realpathOrNull(entryPath) ?? entryPath;\n const npmRoot = getNpmRootGlobal();\n const npmRootRealPath = npmRoot ? (realpathOrNull(npmRoot) ?? npmRoot) : null;\n\n let isNpmGlobal = false;\n if (npmRootRealPath) {\n const rootWithSep = npmRootRealPath.endsWith(path.sep)\n ? npmRootRealPath\n : npmRootRealPath + path.sep;\n isNpmGlobal = entryRealPath === npmRootRealPath || entryRealPath.startsWith(rootWithSep);\n }\n\n return { isNpmGlobal, entryRealPath, npmRootRealPath };\n}\n","import fs from 'node:fs';\nimport net from 'node:net';\nimport path from 'node:path';\n\nimport { getClawminiDir } from '../shared/workspace.js';\n\nexport type ControlAction = 'restart' | 'shutdown' | 'upgrade';\n\nexport interface ControlRequest {\n action: ControlAction;\n /** Target version for `upgrade` (e.g. \"1.2.3\" or \"latest\"). */\n version?: string;\n /** Chat to deliver the post-action SystemMessage to. */\n chatId?: string;\n /** User message that triggered the action, threaded onto the reply. */\n messageId?: string;\n}\n\nexport interface ControlResponse {\n ok: boolean;\n error?: string;\n}\n\n// Kept short on purpose: AF_UNIX sun_path is 104 bytes on macOS, 108 on\n// Linux. A workspace nested a few directories deep + \".clawmini/super.sock\"\n// is already close to the limit; \"supervisor.sock\" pushed common paths over\n// it (EINVAL from listen()).\nexport function getControlSocketPath(startDir = process.cwd()): string {\n return path.join(getClawminiDir(startDir), 'super.sock');\n}\n\nexport type ControlHandler = (req: ControlRequest) => Promise<ControlResponse> | ControlResponse;\n\nexport function startControlServer(\n handlers: Record<ControlAction, ControlHandler>,\n socketPath = getControlSocketPath()\n): net.Server {\n if (fs.existsSync(socketPath)) {\n try {\n fs.unlinkSync(socketPath);\n } catch {\n // best-effort\n }\n }\n\n const server = net.createServer((socket) => {\n let buf = '';\n let handled = false;\n\n const respond = (res: ControlResponse): void => {\n if (handled) return;\n handled = true;\n socket.end(JSON.stringify(res) + '\\n');\n };\n\n socket.on('data', (chunk) => {\n if (handled) return;\n buf += chunk.toString();\n const idx = buf.indexOf('\\n');\n if (idx === -1) return;\n const line = buf.slice(0, idx);\n let req: ControlRequest;\n try {\n req = JSON.parse(line) as ControlRequest;\n } catch {\n respond({ ok: false, error: 'invalid request' });\n return;\n }\n const handler = handlers[req.action];\n if (!handler) {\n respond({ ok: false, error: `unknown action: ${req.action}` });\n return;\n }\n Promise.resolve()\n .then(() => handler(req))\n .then(\n (res) => respond(res),\n (err: unknown) =>\n respond({ ok: false, error: err instanceof Error ? err.message : String(err) })\n );\n });\n\n socket.on('error', () => {\n // Ignore; the client likely went away mid-write.\n });\n });\n\n server.listen(socketPath, () => {\n // Restrict to the owning user. The control channel can shut down or\n // upgrade clawmini, so a process running as another local user must not\n // be able to connect just because they can reach the .clawmini directory.\n try {\n fs.chmodSync(socketPath, 0o600);\n } catch {\n // best-effort\n }\n });\n return server;\n}\n\nexport function sendControlRequest(\n req: ControlRequest,\n socketPath = getControlSocketPath(),\n timeoutMs = 5000\n): Promise<ControlResponse> {\n return new Promise((resolve, reject) => {\n const socket = net.createConnection({ path: socketPath });\n let buf = '';\n let settled = false;\n\n const finish = (fn: () => void): void => {\n if (settled) return;\n settled = true;\n try {\n socket.destroy();\n } catch {\n // best-effort\n }\n fn();\n };\n\n const timer = setTimeout(() => {\n finish(() => reject(new Error(`Control request timed out after ${timeoutMs}ms`)));\n }, timeoutMs);\n\n socket.on('connect', () => {\n socket.write(JSON.stringify(req) + '\\n');\n });\n socket.on('data', (chunk) => {\n buf += chunk.toString();\n const idx = buf.indexOf('\\n');\n if (idx !== -1) {\n const line = buf.slice(0, idx);\n clearTimeout(timer);\n try {\n const res = JSON.parse(line) as ControlResponse;\n finish(() => resolve(res));\n } catch (err) {\n finish(() => reject(err instanceof Error ? err : new Error(String(err))));\n }\n }\n });\n socket.on('error', (err) => {\n clearTimeout(timer);\n finish(() => reject(err));\n });\n socket.on('end', () => {\n // If the server closed before sending us a full line, surface it.\n if (!settled) {\n clearTimeout(timer);\n finish(() => reject(new Error('Control server closed connection without responding')));\n }\n });\n });\n}\n","import { EventEmitter } from 'node:events';\nimport type { ChatMessage } from '../shared/chats.js';\n\nexport const daemonEvents = new EventEmitter();\n\nexport const DAEMON_EVENT_MESSAGE_APPENDED = 'message-appended';\nexport const DAEMON_EVENT_TYPING = 'typing';\nexport const DAEMON_EVENT_TURN_STARTED = 'turn-started';\nexport const DAEMON_EVENT_TURN_ENDED = 'turn-ended';\n/**\n * Unified event carrying both `ChatMessage` appends and turn lifecycle\n * events so a single `waitForMessages` subscription can interleave them\n * in emission order (no merge logic or messageQueue on the consumer side).\n */\nexport const DAEMON_EVENT_CHAT_STREAM = 'chat-stream';\n\nexport interface TurnStartedEvent {\n chatId: string;\n turnId: string;\n rootMessageId: string;\n externalRef?: string;\n}\n\nexport interface TurnEndedEvent {\n chatId: string;\n turnId: string;\n outcome: 'ok' | 'error';\n}\n\nexport type TurnLifecycleEvent =\n | { type: 'started'; turnId: string; rootMessageId: string; externalRef?: string }\n | { type: 'ended'; turnId: string; outcome: 'ok' | 'error' };\n\nexport type ChatStreamItem =\n | { kind: 'message'; message: ChatMessage }\n | { kind: 'turn'; event: TurnLifecycleEvent };\n\nexport interface ChatStreamEnvelope {\n chatId: string;\n item: ChatStreamItem;\n}\n\nexport function emitMessageAppended(chatId: string, message: ChatMessage) {\n daemonEvents.emit(DAEMON_EVENT_MESSAGE_APPENDED, { chatId, message });\n const envelope: ChatStreamEnvelope = { chatId, item: { kind: 'message', message } };\n daemonEvents.emit(DAEMON_EVENT_CHAT_STREAM, envelope);\n}\n\nexport function emitTyping(chatId: string) {\n daemonEvents.emit(DAEMON_EVENT_TYPING, { chatId });\n}\n\nexport function emitTurnStarted(event: TurnStartedEvent) {\n daemonEvents.emit(DAEMON_EVENT_TURN_STARTED, event);\n const lifecycle: TurnLifecycleEvent = {\n type: 'started',\n turnId: event.turnId,\n rootMessageId: event.rootMessageId,\n ...(event.externalRef ? { externalRef: event.externalRef } : {}),\n };\n const envelope: ChatStreamEnvelope = {\n chatId: event.chatId,\n item: { kind: 'turn', event: lifecycle },\n };\n daemonEvents.emit(DAEMON_EVENT_CHAT_STREAM, envelope);\n}\n\nexport function emitTurnEnded(event: TurnEndedEvent) {\n daemonEvents.emit(DAEMON_EVENT_TURN_ENDED, event);\n const lifecycle: TurnLifecycleEvent = {\n type: 'ended',\n turnId: event.turnId,\n outcome: event.outcome,\n };\n const envelope: ChatStreamEnvelope = {\n chatId: event.chatId,\n item: { kind: 'turn', event: lifecycle },\n };\n daemonEvents.emit(DAEMON_EVENT_CHAT_STREAM, envelope);\n}\n","import * as shared from '../shared/chats.js';\nimport { emitMessageAppended } from './events.js';\n\nexport async function appendMessage(\n id: string,\n message: shared.ChatMessage,\n startDir = process.cwd()\n): Promise<void> {\n await shared.appendMessage(id, message, startDir);\n emitMessageAppended(id, message);\n}\n\nexport {\n type ChatMessage,\n type UserMessage,\n type CommandLogMessage,\n type SystemMessage,\n type AgentReplyMessage,\n type ToolMessage,\n type PolicyRequestMessage,\n type SubagentStatusMessage,\n getChatsDir,\n isValidChatId,\n createChat,\n listChats,\n deleteChat,\n getMessages,\n findLastMessage,\n getDefaultChatId,\n setDefaultChatId,\n DEFAULT_CHAT_ID,\n} from '../shared/chats.js';\n","import fs from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport path from 'node:path';\n\nimport { getClawminiDir } from '../shared/workspace.js';\nimport type { SystemMessage } from '../shared/chats.js';\nimport { appendMessage } from './chats.js';\n\nexport type PendingReplyKind = 'restart-complete' | 'upgrade-complete' | 'upgrade-failed';\n\nexport interface PendingReply {\n chatId: string;\n kind: PendingReplyKind;\n /** Original user messageId, recorded so the SystemMessage can reference it. */\n messageId?: string;\n /** Requested target version (set for upgrade-* kinds). */\n requestedVersion?: string;\n /** Failure reason; set for upgrade-failed. */\n reason?: string;\n}\n\ninterface PendingRepliesFile {\n version: 1;\n entries: PendingReply[];\n}\n\nexport function getPendingRepliesPath(startDir = process.cwd()): string {\n return path.join(getClawminiDir(startDir), 'pending-replies.json');\n}\n\nfunction readFileSafe(filePath: string): PendingRepliesFile | null {\n if (!fs.existsSync(filePath)) return null;\n try {\n const raw = fs.readFileSync(filePath, 'utf-8');\n const parsed = JSON.parse(raw) as PendingRepliesFile;\n if (!parsed || parsed.version !== 1 || !Array.isArray(parsed.entries)) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction writeAtomic(filePath: string, data: PendingRepliesFile): void {\n // tmp + rename so a crash never leaves a half-written file. The target file\n // is on the same filesystem as the workspace, so rename is atomic.\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n const tmpPath = `${filePath}.${process.pid}.tmp`;\n fs.writeFileSync(tmpPath, JSON.stringify(data, null, 2));\n fs.renameSync(tmpPath, filePath);\n}\n\nfunction tryUnlink(filePath: string): void {\n if (!fs.existsSync(filePath)) return;\n try {\n fs.unlinkSync(filePath);\n } catch {\n // best-effort\n }\n}\n\nexport function enqueuePendingReply(entry: PendingReply, startDir = process.cwd()): void {\n const filePath = getPendingRepliesPath(startDir);\n const existing = readFileSafe(filePath);\n const entries = existing?.entries ?? [];\n entries.push(entry);\n writeAtomic(filePath, { version: 1, entries });\n}\n\n/**\n * Remove the first entry that matches the predicate. Used to roll back an\n * enqueued entry when the supervisor reports the action could not be started.\n */\nexport function dequeuePendingReply(\n predicate: (entry: PendingReply) => boolean,\n startDir = process.cwd()\n): boolean {\n const filePath = getPendingRepliesPath(startDir);\n const existing = readFileSafe(filePath);\n if (!existing) return false;\n const idx = existing.entries.findIndex(predicate);\n if (idx === -1) return false;\n existing.entries.splice(idx, 1);\n if (existing.entries.length === 0) {\n tryUnlink(filePath);\n } else {\n writeAtomic(filePath, existing);\n }\n return true;\n}\n\nexport function readPendingReplies(startDir = process.cwd()): PendingReply[] {\n return readFileSafe(getPendingRepliesPath(startDir))?.entries ?? [];\n}\n\nfunction renderMessage(entry: PendingReply, runtimeVersion: string): string {\n switch (entry.kind) {\n case 'restart-complete':\n return `Clawmini restarted (v${runtimeVersion}).`;\n case 'upgrade-complete':\n return `Clawmini upgraded to v${runtimeVersion}.`;\n case 'upgrade-failed': {\n const target = entry.requestedVersion ? ` to v${entry.requestedVersion}` : '';\n const reason = entry.reason ? `: ${entry.reason}` : '.';\n return `Clawmini upgrade${target} failed${reason}`;\n }\n }\n}\n\n/**\n * Append a SystemMessage for each pending reply. Called from the daemon\n * startup path so adapters (which reconnect via tRPC subscription with\n * lastMessageId) replay the message after the daemon comes back online.\n *\n * Crash-safe: each entry is consumed only after its SystemMessage is\n * appended. A crash mid-loop leaves the un-delivered entries on disk for the\n * next daemon start to drain.\n */\nexport async function drainPendingReplies(\n runtimeVersion: string,\n startDir = process.cwd()\n): Promise<void> {\n const filePath = getPendingRepliesPath(startDir);\n const data = readFileSafe(filePath);\n if (!data) {\n // A corrupt file is treated as empty — remove it so it doesn't trip the\n // next read, but otherwise no-op.\n tryUnlink(filePath);\n return;\n }\n\n const remaining: PendingReply[] = [...data.entries];\n while (remaining.length > 0) {\n const entry = remaining[0]!;\n const sysMsg: SystemMessage = {\n id: randomUUID(),\n role: 'system',\n content: renderMessage(entry, runtimeVersion),\n timestamp: new Date().toISOString(),\n sessionId: undefined,\n event: 'router',\n displayRole: 'agent',\n ...(entry.messageId ? { messageId: entry.messageId } : {}),\n };\n try {\n await appendMessage(entry.chatId, sysMsg, startDir);\n } catch (err) {\n // A delivery failure (e.g. chatId no longer exists) shouldn't block the\n // rest of the queue from draining. Drop the entry after logging — the\n // alternative is an infinite redelivery loop on the next start.\n console.error(\n `Failed to deliver pending reply to chat ${entry.chatId}:`,\n err instanceof Error ? err.message : err\n );\n }\n remaining.shift();\n if (remaining.length === 0) {\n tryUnlink(filePath);\n } else {\n writeAtomic(filePath, { version: 1, entries: remaining });\n }\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { spawn } from 'node:child_process';\n\nimport { detectInstall } from './install-detection.js';\nimport {\n startControlServer,\n type ControlRequest,\n type ControlResponse,\n} from './supervisor-control.js';\nimport { removeSupervisorPid } from './supervisor-pid.js';\nimport { enqueuePendingReply, dequeuePendingReply } from '../daemon/pending-replies.js';\nimport type { Supervisor } from './supervisor.js';\n\n// Grace period before a destructive action fires. The daemon-side router\n// awaits sendControlRequest but the daemon still needs to flush the user\n// message + ack reply through the chat log before the daemon process is\n// killed. SIGTERM arriving mid-flush is non-fatal (the daemon's own SIGTERM\n// handler still runs) but the grace makes the ordering deterministic.\nconst ACTION_GRACE_MS = 1000;\n\n/**\n * Wire up the supervisor control socket so the daemon can request\n * /restart, /shutdown, and /upgrade out-of-band.\n */\nexport function startSupervisorControl(supervisor: Supervisor): void {\n startControlServer({\n restart: async (req: ControlRequest): Promise<ControlResponse> => {\n // Enqueue BEFORE scheduling the kill, so a crash between enqueue and\n // kill leaves the post-restart message ready to drain.\n if (req.chatId) {\n enqueuePendingReply({\n chatId: req.chatId,\n kind: 'restart-complete',\n ...(req.messageId ? { messageId: req.messageId } : {}),\n });\n }\n setTimeout(() => {\n // restartAll instead of restartService('daemon'): adapters hold\n // tRPC subscriptions to the daemon and won't reconnect on their\n // own when the daemon process dies, so outbound replies wouldn't\n // make it back to the chat. Bouncing the adapters forces them to\n // re-subscribe to the new daemon.\n void supervisor.restartAll().catch((err) => {\n process.stderr.write(\n `[supervisor] /restart failed: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n // Restart failed — back out the queued reply so the next successful\n // start doesn't surface a phantom \"restarted\" message.\n if (req.chatId && req.messageId) {\n dequeuePendingReply(\n (e) => e.kind === 'restart-complete' && e.messageId === req.messageId\n );\n }\n });\n }, ACTION_GRACE_MS);\n return { ok: true };\n },\n shutdown: async (): Promise<ControlResponse> => {\n setTimeout(() => void supervisor.shutdown(0), ACTION_GRACE_MS);\n return { ok: true };\n },\n upgrade: async (req: ControlRequest): Promise<ControlResponse> => {\n const info = detectInstall();\n if (!info.isNpmGlobal) {\n return {\n ok: false,\n error: `not installed via npm install -g (running from ${info.entryRealPath})`,\n };\n }\n const version = req.version?.trim();\n if (!version) {\n return { ok: false, error: 'missing target version' };\n }\n if (!isAcceptableVersion(version)) {\n return { ok: false, error: `invalid version: ${version}` };\n }\n setTimeout(() => {\n void runUpgrade(supervisor, version, req.chatId, req.messageId).catch((err) => {\n process.stderr.write(\n `[supervisor] /upgrade encountered an unexpected error: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n });\n }, ACTION_GRACE_MS);\n return { ok: true };\n },\n });\n}\n\n// Accept semver-ish versions (1.2.3, 1.2.3-beta.1, etc.), the literal\n// \"latest\", or a dist-tag (alphanumeric + dashes). Reject anything else so a\n// malicious client can't smuggle shell metacharacters or `--registry=...`\n// into the npm command line.\nexport function isAcceptableVersion(version: string): boolean {\n return /^[a-zA-Z0-9][a-zA-Z0-9._+-]{0,63}$/.test(version);\n}\n\n/**\n * In-place upgrade. Order:\n * 1. `npm install -g clawmini@<version>` (services kept running so the\n * user isn't left in the dark if the install fails).\n * 2. Resolve the freshly-installed binary by absolute path. Bail out with\n * an upgrade-failed reply if it's missing.\n * 3. Enqueue the upgrade-complete reply.\n * 4. Stop all children, spawn the replacement supervisor, exit.\n *\n * Any failure path enqueues an upgrade-failed reply (so the user gets visible\n * feedback) and restarts the daemon to drain it, rather than silently exiting.\n */\nexport async function runUpgrade(\n supervisor: Supervisor,\n version: string,\n chatId?: string,\n messageId?: string\n): Promise<void> {\n const info = detectInstall();\n if (!info.isNpmGlobal || !info.npmRootRealPath) {\n process.stderr.write(\n `[supervisor] /upgrade aborted: clawmini is not installed via npm install -g (running from ${info.entryRealPath}).\\n`\n );\n return;\n }\n\n const installErr = await runNpmInstall(version);\n if (installErr) {\n process.stderr.write(`[supervisor] /upgrade failed: ${installErr}\\n`);\n if (chatId) {\n enqueuePendingReply({\n chatId,\n kind: 'upgrade-failed',\n ...(messageId ? { messageId } : {}),\n requestedVersion: version,\n reason: installErr,\n });\n // The daemon is still running (we never stopped it). Bounce the whole\n // stack so the new daemon drains the failure message AND adapters\n // re-subscribe to it.\n await supervisor.restartAll().catch((err) => {\n process.stderr.write(\n `[supervisor] additionally failed to restart services to surface the failure: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n });\n }\n return;\n }\n\n // npm install reported success — confirm the binary exists where we expect\n // before we start tearing down services.\n const newCli = path.join(info.npmRootRealPath, 'clawmini', 'dist', 'cli', 'index.mjs');\n if (!fs.existsSync(newCli)) {\n const reason = `npm install reported success but ${newCli} is missing`;\n process.stderr.write(`[supervisor] /upgrade aborted: ${reason}\\n`);\n if (chatId) {\n enqueuePendingReply({\n chatId,\n kind: 'upgrade-failed',\n ...(messageId ? { messageId } : {}),\n requestedVersion: version,\n reason,\n });\n await supervisor.restartAll().catch(() => {});\n }\n return;\n }\n\n if (chatId) {\n enqueuePendingReply({\n chatId,\n kind: 'upgrade-complete',\n ...(messageId ? { messageId } : {}),\n requestedVersion: version,\n });\n }\n\n process.stderr.write('[supervisor] /upgrade: stopping all services...\\n');\n await supervisor.stopAllChildren();\n\n process.stderr.write(`[supervisor] /upgrade: relaunching ${newCli} serve --detach...\\n`);\n // Drop our pid file so the new supervisor doesn't see us as already\n // running; it will write its own pid on startup.\n removeSupervisorPid();\n\n // Run the new entry point directly via the current Node binary so the\n // spawn doesn't depend on the shell's PATH being refreshed (which it isn't\n // for an already-running process).\n const replacement = spawn(process.execPath, [newCli, 'serve', '--detach'], {\n detached: true,\n stdio: 'ignore',\n cwd: process.cwd(),\n env: process.env,\n });\n\n const spawnOk = await waitForSpawn(replacement);\n if (!spawnOk) {\n process.stderr.write(\n `[supervisor] /upgrade: replacement supervisor failed to spawn — restarting in place\\n`\n );\n if (chatId) {\n // Roll back the optimistic complete reply and replace it with a\n // failure entry so the user knows the upgrade landed on disk but\n // never came back up.\n dequeuePendingReply(\n (e) =>\n e.kind === 'upgrade-complete' &&\n e.messageId === messageId &&\n e.requestedVersion === version\n );\n enqueuePendingReply({\n chatId,\n kind: 'upgrade-failed',\n ...(messageId ? { messageId } : {}),\n requestedVersion: version,\n reason: 'replacement supervisor failed to spawn',\n });\n }\n // Bring the whole stack back (daemon + adapters + web) so the failure\n // message is drained AND adapters can deliver it to the chat.\n try {\n await supervisor.restartAll();\n } catch (err) {\n process.stderr.write(\n `[supervisor] additionally failed to restart services after spawn failure: ${err instanceof Error ? err.message : String(err)}\\n`\n );\n }\n return;\n }\n\n replacement.unref();\n process.exit(0);\n}\n\nfunction runNpmInstall(version: string): Promise<string | null> {\n return new Promise((resolve) => {\n // execFile-style argv (no shell), so the version argument can't be\n // interpreted by a shell even if it slipped past isAcceptableVersion.\n const child = spawn('npm', ['install', '-g', `clawmini@${version}`], {\n stdio: 'inherit',\n env: process.env,\n });\n child.on('exit', (code) => {\n if (code === 0) resolve(null);\n else resolve(`npm install -g exited with code ${code}`);\n });\n child.on('error', (err) => {\n resolve(err instanceof Error ? err.message : String(err));\n });\n });\n}\n\nfunction waitForSpawn(child: ReturnType<typeof spawn>, timeoutMs = 5000): Promise<boolean> {\n return new Promise((resolve) => {\n let settled = false;\n const settle = (ok: boolean): void => {\n if (settled) return;\n settled = true;\n resolve(ok);\n };\n child.once('spawn', () => settle(true));\n child.once('error', (err) => {\n process.stderr.write(`[supervisor] replacement spawn error: ${err.message}\\n`);\n settle(false);\n });\n // 'spawn' fires almost immediately on success. Cap the wait so we never\n // hang if neither event fires.\n setTimeout(() => settle(true), timeoutMs);\n });\n}\n"],"mappings":"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"}