clawmini 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/config.json +14 -0
  3. package/.github/workflows/release.yml +49 -0
  4. package/CHANGELOG.md +36 -0
  5. package/README.md +5 -4
  6. package/dist/adapter-discord/index.d.mts.map +1 -1
  7. package/dist/adapter-discord/index.mjs +465 -282
  8. package/dist/adapter-discord/index.mjs.map +1 -1
  9. package/dist/adapter-google-chat/index.mjs +367 -243
  10. package/dist/adapter-google-chat/index.mjs.map +1 -1
  11. package/dist/cli/index.mjs +684 -24
  12. package/dist/cli/index.mjs.map +1 -1
  13. package/dist/cli/lite.mjs +43 -13
  14. package/dist/cli/lite.mjs.map +1 -1
  15. package/dist/cli/{propose-policy.mjs → manage-policies.mjs} +270 -47
  16. package/dist/cli/manage-policies.mjs.map +1 -0
  17. package/dist/cli/run-host.d.mts +1 -0
  18. package/dist/cli/run-host.mjs +3090 -0
  19. package/dist/cli/run-host.mjs.map +1 -0
  20. package/dist/config-CPFQIGdG.mjs +57 -0
  21. package/dist/config-CPFQIGdG.mjs.map +1 -0
  22. package/dist/config-Dvl-Pov4.mjs +76 -0
  23. package/dist/config-Dvl-Pov4.mjs.map +1 -0
  24. package/dist/daemon/index.d.mts.map +1 -1
  25. package/dist/daemon/index.mjs +970 -332
  26. package/dist/daemon/index.mjs.map +1 -1
  27. package/dist/supervisor-actions-CiW56eLi.mjs +843 -0
  28. package/dist/supervisor-actions-CiW56eLi.mjs.map +1 -0
  29. package/dist/turn-log-buffer-DRgW53gl.mjs +767 -0
  30. package/dist/turn-log-buffer-DRgW53gl.mjs.map +1 -0
  31. package/dist/web/_app/immutable/chunks/{Drm9vgeP.js → 3AZlWB6U.js} +1 -1
  32. package/dist/web/_app/immutable/chunks/BhRSsUCh.js +2 -0
  33. package/dist/web/_app/immutable/chunks/BiLeM2i1.js +1 -0
  34. package/{web/.svelte-kit/output/client/_app/immutable/chunks/CME08kGM.js → dist/web/_app/immutable/chunks/BmBj85Ll.js} +1 -1
  35. package/dist/web/_app/immutable/chunks/BrERcKAH.js +1 -0
  36. package/dist/web/_app/immutable/chunks/Bv9252RM.js +1 -0
  37. package/dist/web/_app/immutable/chunks/CIXNBPKi.js +1 -0
  38. package/dist/web/_app/immutable/chunks/DISKL3GN.js +2 -0
  39. package/dist/web/_app/immutable/chunks/{Zeh-C-mx.js → DcpaLzmX.js} +1 -1
  40. package/dist/web/_app/immutable/chunks/DnQ3vS13.js +1 -0
  41. package/dist/web/_app/immutable/chunks/KsloHTKS.js +1 -0
  42. package/{web/.svelte-kit/output/client/_app/immutable/chunks/Ck-be5J2.js → dist/web/_app/immutable/chunks/RsHsUj-8.js} +2 -2
  43. package/dist/web/_app/immutable/chunks/{G_zz-Gou.js → wpfV79dV.js} +1 -1
  44. package/dist/web/_app/immutable/entry/app.CIw1Qj0n.js +2 -0
  45. package/dist/web/_app/immutable/entry/start.Di0-Jhte.js +1 -0
  46. package/dist/web/_app/immutable/nodes/{0.CYS8iApT.js → 0.DYyUA1au.js} +1 -1
  47. package/dist/web/_app/immutable/nodes/1.D-3QEMMZ.js +1 -0
  48. package/dist/web/_app/immutable/nodes/{2.BnwnD1Ki.js → 2.4olHnH7U.js} +1 -1
  49. package/{web/.svelte-kit/output/client/_app/immutable/nodes/3.Dr0ot9sV.js → dist/web/_app/immutable/nodes/3.4w0bE-m2.js} +3 -3
  50. package/dist/web/_app/immutable/nodes/4.CZvjhVHt.js +60 -0
  51. package/dist/web/_app/immutable/nodes/{5.BBGQ_i84.js → 5.DLbPVJY2.js} +1 -1
  52. package/dist/web/_app/version.json +1 -1
  53. package/dist/web/index.html +12 -12
  54. package/dist/workspace-oWmVh5mi.mjs +1001 -0
  55. package/dist/workspace-oWmVh5mi.mjs.map +1 -0
  56. package/docs/23_adapter_slash_autocomplete/development_log.md +19 -0
  57. package/docs/23_adapter_slash_autocomplete/notes.md +18 -0
  58. package/docs/23_adapter_slash_autocomplete/prd.md +46 -0
  59. package/docs/23_adapter_slash_autocomplete/questions.md +6 -0
  60. package/docs/23_adapter_slash_autocomplete/tickets.md +21 -0
  61. package/docs/24_subagent_job_policy_fixes/development_log.md +22 -0
  62. package/docs/24_subagent_job_policy_fixes/notes.md +28 -0
  63. package/docs/24_subagent_job_policy_fixes/prd.md +59 -0
  64. package/docs/24_subagent_job_policy_fixes/questions.md +3 -0
  65. package/docs/24_subagent_job_policy_fixes/tickets.md +49 -0
  66. package/docs/25_e2e_test_improvements/development_log.md +30 -0
  67. package/docs/25_e2e_test_improvements/notes.md +29 -0
  68. package/docs/25_e2e_test_improvements/prd.md +43 -0
  69. package/docs/25_e2e_test_improvements/questions.md +12 -0
  70. package/docs/25_e2e_test_improvements/tickets-2.md +22 -0
  71. package/docs/25_e2e_test_improvements/tickets.md +22 -0
  72. package/docs/25_policy_cwd/development_log.md +30 -0
  73. package/docs/25_policy_cwd/notes.md +28 -0
  74. package/docs/25_policy_cwd/prd.md +77 -0
  75. package/docs/25_policy_cwd/questions.md +6 -0
  76. package/docs/25_policy_cwd/tickets.md +77 -0
  77. package/docs/CLI_REFERENCE.md +3 -1
  78. package/docs/PHILOSOPHY.md +35 -0
  79. package/docs/adapter-visibility/SPEC.md +461 -0
  80. package/docs/adapter-visibility/SPEC_v2.md +202 -0
  81. package/docs/auto-update/SPEC.md +344 -0
  82. package/docs/backups/SPEC.md +296 -0
  83. package/docs/backups/clawmini.gitignore +69 -0
  84. package/docs/guides/assets/clawmini-avatar.png +0 -0
  85. package/docs/guides/backups.md +332 -0
  86. package/docs/guides/discord_adapter_setup.md +1 -1
  87. package/docs/guides/google_chat_adapter_setup.md +81 -0
  88. package/docs/unified-startup/SPEC.md +203 -0
  89. package/e2e/_helpers/test-environment.test.ts +49 -0
  90. package/e2e/_helpers/test-environment.ts +548 -0
  91. package/e2e/adapters/_google-chat-fixtures.ts +340 -0
  92. package/{src/cli/e2e → e2e/adapters}/adapter-discord.test.ts +22 -23
  93. package/e2e/adapters/adapter-google-chat-downtime.test.ts +157 -0
  94. package/e2e/adapters/adapter-google-chat-inbound.test.ts +697 -0
  95. package/e2e/adapters/adapter-google-chat-outbound.test.ts +297 -0
  96. package/e2e/adapters/adapter-google-chat-roundtrip.test.ts +56 -0
  97. package/e2e/adapters/adapter-google-chat-threads.test.ts +1078 -0
  98. package/e2e/agents/custom-api-env.test.ts +80 -0
  99. package/e2e/agents/export-lite-func.test.ts +104 -0
  100. package/e2e/agents/fallbacks.test.ts +124 -0
  101. package/e2e/agents/interrupt.test.ts +50 -0
  102. package/e2e/agents/no-reply-necessary.test.ts +57 -0
  103. package/e2e/agents/session-timeout-subagents.test.ts +76 -0
  104. package/e2e/agents/subagent-authorization.test.ts +246 -0
  105. package/e2e/agents/subagent-env.test.ts +49 -0
  106. package/e2e/agents/subagent-lifecycle.test.ts +782 -0
  107. package/e2e/agents/subagents-depth.test.ts +47 -0
  108. package/e2e/cli/agents.test.ts +176 -0
  109. package/e2e/cli/auto-update.test.ts +741 -0
  110. package/e2e/cli/basic.test.ts +44 -0
  111. package/{src/cli/e2e → e2e/cli}/export-lite.test.ts +16 -12
  112. package/e2e/cli/init-gitignore.test.ts +86 -0
  113. package/e2e/cli/init.test.ts +76 -0
  114. package/e2e/cli/messages.test.ts +363 -0
  115. package/e2e/cli/serve.test.ts +76 -0
  116. package/{src/cli/e2e → e2e/cli}/skills.test.ts +11 -10
  117. package/{src/cli/e2e → e2e/daemon}/daemon.test.ts +57 -195
  118. package/e2e/jobs/agent-jobs.test.ts +216 -0
  119. package/e2e/jobs/cron.test.ts +64 -0
  120. package/e2e/jobs/restart.test.ts +108 -0
  121. package/e2e/policies/approval-session.test.ts +69 -0
  122. package/e2e/policies/auto-create-policies-file.test.ts +35 -0
  123. package/e2e/policies/builtin-manage-policies.test.ts +184 -0
  124. package/e2e/policies/builtin-run-host.test.ts +180 -0
  125. package/e2e/policies/environment-policies.test.ts +177 -0
  126. package/e2e/policies/manage-policies.test.ts +566 -0
  127. package/e2e/policies/output-size.test.ts +98 -0
  128. package/e2e/policies/policies-context-cwd.test.ts +160 -0
  129. package/e2e/policies/relative-script-path.test.ts +60 -0
  130. package/e2e/policies/requests-show.test.ts +135 -0
  131. package/e2e/policies/requests.test.ts +208 -0
  132. package/e2e/policies/slash-policies.test.ts +308 -0
  133. package/e2e/policies/startup-cleanup.test.ts +48 -0
  134. package/e2e/routers/session-timeout.test.ts +106 -0
  135. package/e2e/routers/slash-model.test.ts +152 -0
  136. package/e2e/routers/slash-new.test.ts +50 -0
  137. package/e2e/routers/slash-restart-adapter.test.ts +96 -0
  138. package/e2e/routers/slash-restart.test.ts +114 -0
  139. package/e2e/routers/slash-shutdown.test.ts +55 -0
  140. package/e2e/routers/slash-stop.test.ts +232 -0
  141. package/e2e/routers/slash-upgrade.test.ts +88 -0
  142. package/{src/cli/e2e → e2e/sandbox}/environments.test.ts +14 -13
  143. package/eslint.config.js +6 -0
  144. package/napkin.md +1 -1
  145. package/package.json +8 -3
  146. package/src/adapter-discord/commands.test.ts +42 -0
  147. package/src/adapter-discord/commands.ts +33 -0
  148. package/src/adapter-discord/config.ts +12 -0
  149. package/src/adapter-discord/forwarder.test.ts +499 -21
  150. package/src/adapter-discord/forwarder.ts +343 -124
  151. package/src/adapter-discord/inbound-cache.test.ts +47 -0
  152. package/src/adapter-discord/inbound-cache.ts +37 -0
  153. package/src/adapter-discord/index.test.ts +67 -2
  154. package/src/adapter-discord/index.ts +84 -216
  155. package/src/adapter-discord/interactions.test.ts +54 -3
  156. package/src/adapter-discord/interactions.ts +97 -53
  157. package/src/adapter-discord/processMessage.ts +239 -0
  158. package/src/adapter-discord/state.ts +1 -0
  159. package/src/adapter-google-chat/auth.test.ts +9 -5
  160. package/src/adapter-google-chat/auth.ts +29 -23
  161. package/src/adapter-google-chat/cards.ts +7 -2
  162. package/src/adapter-google-chat/client.test.ts +37 -2
  163. package/src/adapter-google-chat/client.ts +138 -38
  164. package/src/adapter-google-chat/config.ts +19 -0
  165. package/src/adapter-google-chat/forwarder.test.ts +81 -56
  166. package/src/adapter-google-chat/forwarder.ts +394 -185
  167. package/src/adapter-google-chat/inbound-cache.test.ts +61 -0
  168. package/src/adapter-google-chat/inbound-cache.ts +36 -0
  169. package/src/adapter-google-chat/state.test.ts +1 -0
  170. package/src/adapter-google-chat/state.ts +9 -1
  171. package/src/adapter-google-chat/subscriptions.ts +8 -6
  172. package/src/cli/builtin-policies.ts +44 -0
  173. package/src/cli/commands/agents.ts +59 -5
  174. package/src/cli/commands/down.ts +54 -2
  175. package/src/cli/commands/environments.ts +8 -2
  176. package/src/cli/commands/init.ts +31 -0
  177. package/src/cli/commands/logs.ts +116 -0
  178. package/src/cli/commands/policies.ts +6 -4
  179. package/src/cli/commands/serve.test.ts +67 -0
  180. package/src/cli/commands/serve.ts +284 -0
  181. package/src/cli/commands/up.ts +122 -2
  182. package/src/cli/commands/web-api/agents.ts +3 -2
  183. package/src/cli/index.ts +4 -0
  184. package/src/cli/install-detection.test.ts +72 -0
  185. package/src/cli/install-detection.ts +48 -0
  186. package/src/cli/lite.ts +54 -22
  187. package/src/cli/manage-policies-utils.ts +104 -0
  188. package/src/cli/manage-policies.ts +291 -0
  189. package/src/cli/run-host.ts +45 -0
  190. package/src/cli/supervisor-actions.ts +267 -0
  191. package/src/cli/supervisor-control.test.ts +129 -0
  192. package/src/cli/supervisor-control.ts +155 -0
  193. package/src/cli/supervisor-pid.ts +68 -0
  194. package/src/cli/supervisor.ts +277 -0
  195. package/src/daemon/agent/agent-context.ts +11 -11
  196. package/src/daemon/agent/agent-session.ts +8 -1
  197. package/src/daemon/agent/chat-logger.test.ts +78 -9
  198. package/src/daemon/agent/chat-logger.ts +25 -5
  199. package/src/daemon/agent/turn-registry.test.ts +89 -0
  200. package/src/daemon/agent/turn-registry.ts +94 -0
  201. package/src/daemon/agent/types.ts +2 -0
  202. package/src/daemon/api/agent-policy-endpoints.ts +263 -0
  203. package/src/daemon/api/agent-router.ts +47 -126
  204. package/src/daemon/api/index.test.ts +1 -0
  205. package/src/daemon/api/policy-request.test.ts +7 -5
  206. package/src/daemon/api/router-utils.ts +6 -5
  207. package/src/daemon/api/subagent-router.ts +110 -74
  208. package/src/daemon/api/subagent-utils.test.ts +60 -0
  209. package/src/daemon/api/subagent-utils.ts +113 -87
  210. package/src/daemon/api/user-router.ts +34 -8
  211. package/src/daemon/auth.ts +1 -0
  212. package/src/daemon/cron.test.ts +62 -4
  213. package/src/daemon/cron.ts +42 -16
  214. package/src/daemon/events.ts +65 -0
  215. package/src/daemon/index.ts +24 -1
  216. package/src/daemon/message-interruption.test.ts +1 -0
  217. package/src/daemon/message-jobs.test.ts +1 -0
  218. package/src/daemon/message.ts +78 -14
  219. package/src/daemon/observation.test.ts +26 -18
  220. package/src/daemon/pending-replies.test.ts +112 -0
  221. package/src/daemon/pending-replies.ts +162 -0
  222. package/src/daemon/policy-request-service.ts +3 -1
  223. package/src/daemon/policy-utils.test.ts +66 -1
  224. package/src/daemon/policy-utils.ts +126 -1
  225. package/src/daemon/request-store.ts +31 -0
  226. package/src/daemon/routers/session-timeout.ts +4 -0
  227. package/src/daemon/routers/slash-model.test.ts +344 -0
  228. package/src/daemon/routers/slash-model.ts +207 -0
  229. package/src/daemon/routers/slash-policies.test.ts +38 -32
  230. package/src/daemon/routers/slash-policies.ts +84 -33
  231. package/src/daemon/routers/slash-restart.test.ts +69 -0
  232. package/src/daemon/routers/slash-restart.ts +36 -0
  233. package/src/daemon/routers/slash-shutdown.test.ts +50 -0
  234. package/src/daemon/routers/slash-shutdown.ts +28 -0
  235. package/src/daemon/routers/slash-upgrade.test.ts +116 -0
  236. package/src/daemon/routers/slash-upgrade.ts +76 -0
  237. package/src/daemon/routers/types.ts +7 -0
  238. package/src/daemon/routers.ts +16 -0
  239. package/src/shared/adapters/blockquote.test.ts +28 -0
  240. package/src/shared/adapters/blockquote.ts +20 -0
  241. package/src/shared/adapters/filtering.test.ts +224 -10
  242. package/src/shared/adapters/filtering.ts +95 -7
  243. package/src/shared/adapters/inbound-cache.test.ts +48 -0
  244. package/src/shared/adapters/inbound-cache.ts +54 -0
  245. package/src/shared/adapters/turn-log-buffer.ts +266 -0
  246. package/src/shared/adapters/turn-log.test.ts +389 -0
  247. package/src/shared/adapters/turn-log.ts +357 -0
  248. package/src/shared/agent-utils.ts +12 -5
  249. package/src/shared/chats.test.ts +4 -0
  250. package/src/shared/chats.ts +9 -0
  251. package/src/shared/config.ts +16 -1
  252. package/src/shared/lite.ts +76 -2
  253. package/src/shared/policies.ts +26 -0
  254. package/src/shared/template-manifest.ts +267 -0
  255. package/src/shared/utils/shell.ts +61 -0
  256. package/src/shared/version.ts +34 -0
  257. package/src/shared/workspace.test.ts +217 -0
  258. package/src/shared/workspace.ts +626 -48
  259. package/templates/environments/cladding/allowlist-domain.mjs +125 -0
  260. package/templates/environments/cladding/env.json +21 -1
  261. package/templates/environments/cladding/run-with-network.mjs +54 -0
  262. package/templates/environments/macos-proxy/allowlist-domain.mjs +95 -0
  263. package/templates/environments/macos-proxy/env.json +8 -1
  264. package/templates/environments/macos-proxy/proxy.mjs +42 -13
  265. package/templates/gemini/template.json +5 -0
  266. package/templates/gemini-claw/template.json +13 -0
  267. package/templates/skills/clawmini-requests/SKILL.md +69 -10
  268. package/templates/skills/run-host/SKILL.md +51 -0
  269. package/templates/skills/skill-creator/SKILL.md +4 -3
  270. package/templates/skills/skill-creator/scripts/validate.sh +52 -0
  271. package/tsdown.config.ts +10 -1
  272. package/vitest.config.ts +2 -2
  273. package/web/.svelte-kit/ambient.d.ts +292 -176
  274. package/web/.svelte-kit/generated/server/internal.js +1 -1
  275. package/web/.svelte-kit/output/client/.vite/manifest.json +127 -137
  276. package/web/.svelte-kit/output/client/_app/immutable/chunks/{Drm9vgeP.js → 3AZlWB6U.js} +1 -1
  277. package/web/.svelte-kit/output/client/_app/immutable/chunks/BhRSsUCh.js +2 -0
  278. package/web/.svelte-kit/output/client/_app/immutable/chunks/BiLeM2i1.js +1 -0
  279. package/{dist/web/_app/immutable/chunks/CME08kGM.js → web/.svelte-kit/output/client/_app/immutable/chunks/BmBj85Ll.js} +1 -1
  280. package/web/.svelte-kit/output/client/_app/immutable/chunks/BrERcKAH.js +1 -0
  281. package/web/.svelte-kit/output/client/_app/immutable/chunks/Bv9252RM.js +1 -0
  282. package/web/.svelte-kit/output/client/_app/immutable/chunks/CIXNBPKi.js +1 -0
  283. package/web/.svelte-kit/output/client/_app/immutable/chunks/DISKL3GN.js +2 -0
  284. package/web/.svelte-kit/output/client/_app/immutable/chunks/{Zeh-C-mx.js → DcpaLzmX.js} +1 -1
  285. package/web/.svelte-kit/output/client/_app/immutable/chunks/DnQ3vS13.js +1 -0
  286. package/web/.svelte-kit/output/client/_app/immutable/chunks/KsloHTKS.js +1 -0
  287. package/{dist/web/_app/immutable/chunks/Ck-be5J2.js → web/.svelte-kit/output/client/_app/immutable/chunks/RsHsUj-8.js} +2 -2
  288. package/web/.svelte-kit/output/client/_app/immutable/chunks/{G_zz-Gou.js → wpfV79dV.js} +1 -1
  289. package/web/.svelte-kit/output/client/_app/immutable/entry/app.CIw1Qj0n.js +2 -0
  290. package/web/.svelte-kit/output/client/_app/immutable/entry/start.Di0-Jhte.js +1 -0
  291. package/web/.svelte-kit/output/client/_app/immutable/nodes/{0.CYS8iApT.js → 0.DYyUA1au.js} +1 -1
  292. package/web/.svelte-kit/output/client/_app/immutable/nodes/1.D-3QEMMZ.js +1 -0
  293. package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.BnwnD1Ki.js → 2.4olHnH7U.js} +1 -1
  294. package/{dist/web/_app/immutable/nodes/3.Dr0ot9sV.js → web/.svelte-kit/output/client/_app/immutable/nodes/3.4w0bE-m2.js} +3 -3
  295. package/web/.svelte-kit/output/client/_app/immutable/nodes/4.CZvjhVHt.js +60 -0
  296. package/web/.svelte-kit/output/client/_app/immutable/nodes/{5.BBGQ_i84.js → 5.DLbPVJY2.js} +1 -1
  297. package/web/.svelte-kit/output/client/_app/version.json +1 -1
  298. package/web/.svelte-kit/output/server/.vite/manifest.json +12 -10
  299. package/web/.svelte-kit/output/server/chunks/Icon.js +1 -1
  300. package/web/.svelte-kit/output/server/chunks/client.js +1 -1
  301. package/web/.svelte-kit/output/server/chunks/exports.js +1 -1
  302. package/web/.svelte-kit/output/server/chunks/index-server.js +2 -1
  303. package/web/.svelte-kit/output/server/chunks/internal.js +1 -1
  304. package/web/.svelte-kit/output/server/chunks/render-context.js +77 -0
  305. package/web/.svelte-kit/output/server/chunks/root.js +739 -788
  306. package/web/.svelte-kit/output/server/chunks/shared.js +234 -21
  307. package/web/.svelte-kit/output/server/index.js +126 -90
  308. package/web/.svelte-kit/output/server/manifest-full.js +1 -1
  309. package/web/.svelte-kit/output/server/manifest.js +1 -1
  310. package/web/.svelte-kit/output/server/nodes/0.js +1 -1
  311. package/web/.svelte-kit/output/server/nodes/1.js +1 -1
  312. package/web/.svelte-kit/output/server/nodes/2.js +1 -1
  313. package/web/.svelte-kit/output/server/nodes/3.js +1 -1
  314. package/web/.svelte-kit/output/server/nodes/4.js +1 -1
  315. package/web/.svelte-kit/output/server/nodes/5.js +1 -1
  316. package/web/.svelte-kit/output/server/remote-entry.js +245 -81
  317. package/web/.svelte-kit/tsconfig.json +4 -1
  318. package/dist/cli/propose-policy.mjs.map +0 -1
  319. package/dist/lite-CBxOT1y5.mjs +0 -241
  320. package/dist/lite-CBxOT1y5.mjs.map +0 -1
  321. package/dist/routing-D8rTxtaV.mjs +0 -245
  322. package/dist/routing-D8rTxtaV.mjs.map +0 -1
  323. package/dist/web/_app/immutable/chunks/B6YN0Nuq.js +0 -1
  324. package/dist/web/_app/immutable/chunks/BmRlVmv6.js +0 -1
  325. package/dist/web/_app/immutable/chunks/CK9JZLaG.js +0 -2
  326. package/dist/web/_app/immutable/chunks/Ck3rYNON.js +0 -1
  327. package/dist/web/_app/immutable/chunks/DMtIqaiV.js +0 -2
  328. package/dist/web/_app/immutable/chunks/DhD271EB.js +0 -1
  329. package/dist/web/_app/immutable/chunks/DpuLqk8d.js +0 -1
  330. package/dist/web/_app/immutable/chunks/DsIToJCP.js +0 -1
  331. package/dist/web/_app/immutable/chunks/bBmtyQMj.js +0 -1
  332. package/dist/web/_app/immutable/entry/app.CJmSwntr.js +0 -2
  333. package/dist/web/_app/immutable/entry/start.ZpUrT2ak.js +0 -1
  334. package/dist/web/_app/immutable/nodes/1.Bli0Hqzn.js +0 -1
  335. package/dist/web/_app/immutable/nodes/4.oBhvQhcA.js +0 -60
  336. package/dist/workspace-BJmJBfKi.mjs +0 -456
  337. package/dist/workspace-BJmJBfKi.mjs.map +0 -1
  338. package/src/cli/e2e/agents.test.ts +0 -140
  339. package/src/cli/e2e/basic.test.ts +0 -43
  340. package/src/cli/e2e/cron.test.ts +0 -132
  341. package/src/cli/e2e/export-lite-func.test.ts +0 -206
  342. package/src/cli/e2e/fallbacks.test.ts +0 -175
  343. package/src/cli/e2e/init.test.ts +0 -77
  344. package/src/cli/e2e/messages.test.ts +0 -332
  345. package/src/cli/e2e/propose-policy.test.ts +0 -203
  346. package/src/cli/e2e/requests.test.ts +0 -180
  347. package/src/cli/e2e/session-timeout.test.ts +0 -192
  348. package/src/cli/e2e/slash-new.test.ts +0 -93
  349. package/src/cli/e2e/subagents.test.ts +0 -106
  350. package/src/cli/e2e/utils.ts +0 -66
  351. package/src/cli/propose-policy.ts +0 -91
  352. package/web/.svelte-kit/output/client/_app/immutable/chunks/B6YN0Nuq.js +0 -1
  353. package/web/.svelte-kit/output/client/_app/immutable/chunks/BmRlVmv6.js +0 -1
  354. package/web/.svelte-kit/output/client/_app/immutable/chunks/CK9JZLaG.js +0 -2
  355. package/web/.svelte-kit/output/client/_app/immutable/chunks/Ck3rYNON.js +0 -1
  356. package/web/.svelte-kit/output/client/_app/immutable/chunks/DMtIqaiV.js +0 -2
  357. package/web/.svelte-kit/output/client/_app/immutable/chunks/DhD271EB.js +0 -1
  358. package/web/.svelte-kit/output/client/_app/immutable/chunks/DpuLqk8d.js +0 -1
  359. package/web/.svelte-kit/output/client/_app/immutable/chunks/DsIToJCP.js +0 -1
  360. package/web/.svelte-kit/output/client/_app/immutable/chunks/bBmtyQMj.js +0 -1
  361. package/web/.svelte-kit/output/client/_app/immutable/entry/app.CJmSwntr.js +0 -2
  362. package/web/.svelte-kit/output/client/_app/immutable/entry/start.ZpUrT2ak.js +0 -1
  363. package/web/.svelte-kit/output/client/_app/immutable/nodes/1.Bli0Hqzn.js +0 -1
  364. package/web/.svelte-kit/output/client/_app/immutable/nodes/4.oBhvQhcA.js +0 -60
  365. package/web/.svelte-kit/output/server/chunks/false.js +0 -4
  366. /package/dist/cli/{propose-policy.d.mts → manage-policies.d.mts} +0 -0
  367. /package/{src/cli/e2e → e2e/_helpers}/global-setup.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["handleError","fs","fsPromises"],"sources":["../../src/shared/agent-utils.ts","../../src/cli/utils.ts","../../src/cli/commands/init.ts","../../src/cli/client.ts","../../src/cli/commands/messages.ts","../../src/cli/commands/chats.ts","../../src/cli/commands/agents.ts","../../src/cli/commands/down.ts","../../src/cli/commands/up.ts","../../src/cli/commands/web-api/utils.ts","../../src/cli/commands/web-api/agents.ts","../../src/cli/commands/web-api/chats.ts","../../src/cli/commands/web.ts","../../src/cli/commands/jobs.ts","../../src/cli/commands/export-lite.ts","../../src/cli/commands/environments.ts","../../src/cli/commands/policies.ts","../../src/cli/commands/skills.ts","../../src/cli/index.ts"],"sourcesContent":["import { type Agent } from './config.js';\nimport {\n writeAgentSettings,\n applyTemplateToAgent,\n readChatSettings,\n writeChatSettings,\n copyAgentSkills,\n} from './workspace.js';\nimport { createChat, listChats } from './chats.js';\n\nexport async function createAgentWithChat(\n agentId: string,\n agentData: Agent,\n template?: string,\n startDir = process.cwd()\n): Promise<void> {\n await writeAgentSettings(agentId, agentData, startDir);\n\n if (template) {\n await applyTemplateToAgent(agentId, template, agentData, startDir);\n }\n\n try {\n await copyAgentSkills(agentId, startDir);\n console.log(`Copied skills to agent ${agentId}.`);\n } catch (err) {\n console.warn(\n `Warning: Failed to copy skills to agent ${agentId}: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n const existingChats = await listChats(startDir);\n if (existingChats.includes(agentId)) {\n console.warn(`Warning: Chat ${agentId} already exists.`);\n } else {\n await createChat(agentId, startDir);\n const currentSettings = (await readChatSettings(agentId, startDir)) || {};\n await writeChatSettings(agentId, { ...currentSettings, defaultAgent: agentId }, startDir);\n }\n}\n","export function handleError(action: string, err: unknown): never {\n console.error(`Failed to ${action}:`, err instanceof Error ? err.message : String(err));\n process.exit(1);\n}\n","import { Command } from 'commander';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { isValidAgentId, enableEnvironment } from '../../shared/workspace.js';\nimport { setDefaultChatId } from '../../shared/chats.js';\nimport { type Agent } from '../../shared/config.js';\nimport { createAgentWithChat } from '../../shared/agent-utils.js';\nimport { handleError } from '../utils.js';\n\nexport const initCmd = new Command('init')\n .description('Initialize a new .clawmini settings folder')\n .option('--agent <name>', 'Initialize with a specific agent')\n .option('--agent-template <name>', 'Template to use for the agent')\n .option('--environment <name>', 'Enable a specific environment')\n .action(async (options: { agent?: string; agentTemplate?: string; environment?: string }) => {\n if (options.agentTemplate && !options.agent) {\n handleError('initialize', new Error('--agent-template cannot be used without --agent'));\n }\n\n if (options.agent && !isValidAgentId(options.agent)) {\n handleError('initialize', new Error(`Invalid agent ID: ${options.agent}`));\n }\n\n const cwd = process.cwd();\n const dirPath = path.join(cwd, '.clawmini');\n const settingsPath = path.join(dirPath, 'settings.json');\n\n if (fs.existsSync(settingsPath)) {\n console.log('.clawmini already initialized');\n return;\n }\n\n const defaultSettings = {\n defaultAgent: {\n commands: {\n new: 'echo $CLAW_CLI_MESSAGE',\n },\n env: {},\n },\n api: true,\n };\n\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n\n fs.writeFileSync(settingsPath, JSON.stringify(defaultSettings, null, 2));\n console.log('Initialized .clawmini/settings.json');\n\n if (options.agent) {\n try {\n const agentId = options.agent;\n const agentData: Agent = {};\n await createAgentWithChat(agentId, agentData, options.agentTemplate);\n\n console.log(`Agent ${agentId} created successfully.`);\n\n await setDefaultChatId(agentId);\n console.log(`Default chat set to ${agentId}.`);\n } catch (err) {\n handleError('create agent', err);\n }\n }\n\n if (options.environment) {\n try {\n await enableEnvironment(options.environment);\n } catch (err) {\n handleError('enable environment', err);\n }\n }\n });\n","import { createTRPCClient, httpLink } from '@trpc/client';\nimport type { UserRouter as AppRouter } from '../daemon/api/index.js';\nimport { getSocketPath, getClawminiDir } from '../shared/workspace.js';\nimport { createUnixSocketFetch } from '../shared/fetch.js';\nimport { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport async function getDaemonClient(options: { autoStart?: boolean } = {}) {\n const { autoStart = true } = options;\n const socketPath = getSocketPath();\n\n // Check if server is running by verifying socket exists\n // (A better check would be to ping it, but this is a start)\n if (!fs.existsSync(socketPath)) {\n if (!autoStart) {\n throw new Error('Daemon not running.');\n }\n console.log('Daemon not running. Starting daemon...');\n\n // Start daemon in the background\n const daemonPath = new URL('../daemon/index.mjs', import.meta.url).pathname;\n const logFile = fs.openSync(path.join(getClawminiDir(), 'daemon.log'), 'a');\n const child = spawn(process.execPath, [daemonPath], {\n detached: true,\n stdio: ['ignore', logFile, logFile],\n });\n child.unref();\n\n // Wait up to 5 seconds for the daemon to start and create the socket\n for (let i = 0; i < 50; i++) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n if (fs.existsSync(socketPath)) {\n break;\n }\n }\n\n if (!fs.existsSync(socketPath)) {\n throw new Error('Failed to start daemon.');\n }\n }\n\n return createTRPCClient<AppRouter>({\n links: [\n httpLink({\n url: 'http://localhost',\n fetch: createUnixSocketFetch(socketPath),\n }),\n ],\n });\n}\n","import { Command } from 'commander';\nimport { getDaemonClient } from '../client.js';\nimport { getMessages, getDefaultChatId } from '../../shared/chats.js';\nimport { getAgent, isValidAgentId, getClawminiDir } from '../../shared/workspace.js';\nimport * as fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport const messagesCmd = new Command('messages').description('Manage messages');\n\nmessagesCmd\n .command('send <message>')\n .description('Send a new message')\n .option('-c, --chat <id>', 'Specific chat to send the message to')\n .option('-s, --session <id>', 'Specific session to send the message to')\n .option('-a, --agent <name>', 'Specific agent to use for this message')\n .option('--no-wait', 'Return immediately after the server queues the message')\n .option('-f, --file <path>', 'File to attach', (val, prev: string[]) => prev.concat([val]), [])\n .action(async (message, options) => {\n try {\n if (options.agent) {\n if (!isValidAgentId(options.agent)) {\n console.error(`Error: Invalid agent ID '${options.agent}'.`);\n process.exit(1);\n }\n\n if (options.agent !== 'default') {\n const agent = await getAgent(options.agent);\n if (!agent) {\n console.error(`Error: Agent '${options.agent}' not found.`);\n process.exit(1);\n }\n }\n }\n\n let finalFiles: string[] | undefined = undefined;\n if (options.file && options.file.length > 0) {\n finalFiles = [];\n const tmpDir = path.join(getClawminiDir(process.cwd()), 'tmp');\n await fs.mkdir(tmpDir, { recursive: true });\n for (const f of options.file) {\n const dest = path.join(\n tmpDir,\n `cli-${Date.now()}-${Math.random().toString(36).substring(2, 7)}-${path.basename(f)}`\n );\n await fs.copyFile(path.resolve(process.cwd(), f), dest);\n finalFiles.push(dest);\n }\n }\n\n const trpc = await getDaemonClient();\n await trpc.sendMessage.mutate({\n type: 'send-message',\n client: 'cli',\n data: {\n message,\n chatId: options.chat,\n sessionId: options.session,\n agentId: options.agent,\n noWait: !options.wait,\n files: finalFiles,\n },\n });\n console.log('Message sent successfully.');\n } catch (err) {\n console.error('Failed to send message:', err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nmessagesCmd\n .command('tail')\n .description('View message history')\n .option('-n, --lines <number>', 'Number of messages to show', parseInt)\n .option('--json', 'Output raw JSONL format')\n .option('-c, --chat <id>', 'Specific chat to view')\n .action(async (options) => {\n try {\n const chatId = options.chat ?? (await getDefaultChatId());\n const messages = await getMessages(\n chatId,\n options.lines,\n undefined,\n (msg) => !msg.subagentId\n );\n\n if (options.json) {\n messages.forEach((msg) => console.log(JSON.stringify(msg)));\n } else {\n messages.forEach((msg) => {\n if (msg.role === 'user' || msg.displayRole === 'user') {\n console.log(`[USER] ${msg.content}`);\n } else if (msg.role === 'agent' || msg.displayRole === 'agent') {\n console.log(`[AGENT] ${msg.content.trim()}`);\n } else if (msg.role === 'policy') {\n console.log(`[POLICY] ${msg.commandName} ${msg.args.join(' ')}`);\n } else if (msg.role === 'tool') {\n console.log(`[TOOL] ${msg.name}`);\n } else if (msg.role === 'system') {\n if (msg.content) {\n console.log(`[LOG] ${msg.content.trim()}`);\n }\n } else if (msg.role === 'command' || msg.role === 'legacy_log') {\n if (msg.content) {\n console.log(`[LOG] ${msg.content.trim()}`);\n } else if (msg.stderr) {\n console.error(`[STDERR] ${msg.stderr.trim()}`);\n }\n }\n });\n }\n } catch (err) {\n console.error(\n 'Failed to retrieve messages:',\n err instanceof Error ? err.message : String(err)\n );\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport {\n listChats,\n createChat,\n deleteChat,\n setDefaultChatId,\n getDefaultChatId,\n DEFAULT_CHAT_ID,\n} from '../../shared/chats.js';\n\nexport const chatsCmd = new Command('chats').description('Manage chat sessions');\n\nchatsCmd\n .command('list')\n .description('Display existing chats')\n .action(async () => {\n try {\n const chats = await listChats();\n const defaultId = await getDefaultChatId();\n if (chats.length === 0) {\n console.log('No chats found.');\n return;\n }\n for (const id of chats) {\n const marker = id === defaultId ? ' *' : '';\n console.log(`- ${id}${marker}`);\n }\n } catch (err) {\n console.error('Failed to list chats:', err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nchatsCmd\n .command('add <id>')\n .description('Initialize a new chat')\n .action(async (id: string) => {\n try {\n await createChat(id);\n console.log(`Chat ${id} created successfully.`);\n } catch (err) {\n console.error('Failed to create chat:', err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nchatsCmd\n .command('delete <id>')\n .description('Remove a chat')\n .action(async (id: string) => {\n try {\n const defaultId = await getDefaultChatId();\n await deleteChat(id);\n console.log(`Chat ${id} deleted successfully.`);\n if (id === defaultId) {\n await setDefaultChatId(DEFAULT_CHAT_ID);\n console.log(`Default chat reset to default.`);\n }\n } catch (err) {\n console.error('Failed to delete chat:', err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nchatsCmd\n .command('set-default <id>')\n .description('Update the workspace default chat')\n .action(async (id: string) => {\n try {\n await setDefaultChatId(id);\n console.log(`Default chat set to ${id}.`);\n } catch (err) {\n console.error(\n 'Failed to set default chat:',\n err instanceof Error ? err.message : String(err)\n );\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport {\n listAgents,\n getAgent,\n writeAgentSettings,\n deleteAgent,\n isValidAgentId,\n} from '../../shared/workspace.js';\nimport { type Agent } from '../../shared/config.js';\nimport { createAgentWithChat } from '../../shared/agent-utils.js';\nimport { handleError } from '../utils.js';\n\nexport const agentsCmd = new Command('agents').description('Manage agents');\n\nfunction parseEnv(envArray: string[] | undefined): Record<string, string> | undefined {\n if (!envArray || envArray.length === 0) return undefined;\n const env: Record<string, string> = {};\n for (const e of envArray) {\n const [key, ...rest] = e.split('=');\n if (key && rest.length >= 0) {\n env[key] = rest.join('=');\n }\n }\n return env;\n}\n\nfunction assertValidAgentId(id: string): void {\n if (!isValidAgentId(id)) {\n throw new Error(`Invalid agent ID: ${id}`);\n }\n}\n\nagentsCmd\n .command('list')\n .description('Display existing agents')\n .action(async () => {\n try {\n const agents = await listAgents();\n if (agents.length === 0) {\n console.log('No agents found.');\n return;\n }\n for (const id of agents) {\n console.log(`- ${id}`);\n }\n } catch (err) {\n handleError('list agents', err);\n }\n });\n\nagentsCmd\n .command('add <id>')\n .description('Create a new agent')\n .option('-d, --directory <dir>', 'Working directory for the agent')\n .option('-t, --template <name>', 'Template to use for the agent')\n .option(\n '-e, --env <env...>',\n 'Environment variables in KEY=VALUE format (can be specified multiple times)'\n )\n .action(\n async (id: string, options: { directory?: string; template?: string; env?: string[] }) => {\n try {\n assertValidAgentId(id);\n const existing = await getAgent(id);\n if (existing) {\n throw new Error(`Agent ${id} already exists.`);\n }\n\n const agentData: Agent = {};\n\n if (options.directory) {\n agentData.directory = options.directory;\n }\n const env = parseEnv(options.env);\n if (env) {\n agentData.env = { ...(agentData.env || {}), ...env };\n }\n\n await createAgentWithChat(id, agentData, options.template);\n\n console.log(`Agent ${id} created successfully.`);\n } catch (err) {\n handleError('create agent', err);\n }\n }\n );\n\nagentsCmd\n .command('update <id>')\n .description('Update an existing agent')\n .option('-d, --directory <dir>', 'Working directory for the agent')\n .option(\n '-e, --env <env...>',\n 'Environment variables in KEY=VALUE format (can be specified multiple times)'\n )\n .action(async (id: string, options: { directory?: string; env?: string[] }) => {\n try {\n assertValidAgentId(id);\n const existing = await getAgent(id);\n if (!existing) {\n throw new Error(`Agent ${id} does not exist.`);\n }\n\n const agentData: Agent = { ...existing };\n\n if (options.directory !== undefined) {\n agentData.directory = options.directory;\n }\n\n const env = parseEnv(options.env);\n if (env) {\n agentData.env = { ...(agentData.env || {}), ...env };\n }\n\n await writeAgentSettings(id, agentData);\n console.log(`Agent ${id} updated successfully.`);\n } catch (err) {\n handleError('update agent', err);\n }\n });\n\nagentsCmd\n .command('delete <id>')\n .description('Remove an agent')\n .action(async (id: string) => {\n try {\n assertValidAgentId(id);\n const existing = await getAgent(id);\n if (!existing) {\n throw new Error(`Agent ${id} does not exist.`);\n }\n\n await deleteAgent(id);\n console.log(`Agent ${id} deleted successfully.`);\n } catch (err) {\n handleError('delete agent', err);\n }\n });\n","import { Command } from 'commander';\nimport { getDaemonClient } from '../client.js';\nimport { getSocketPath } from '../../shared/workspace.js';\nimport fs from 'node:fs';\n\nexport const downCmd = new Command('down')\n .description('Stop the local clawmini daemon server')\n .action(async () => {\n try {\n const client = await getDaemonClient({ autoStart: false });\n process.stdout.write('Shutting down clawmini daemon...');\n await client.shutdown.mutate();\n\n const socketPath = getSocketPath();\n // Wait for the socket file to be removed by the daemon's exit handler\n while (fs.existsSync(socketPath)) {\n await new Promise((resolve) => setTimeout(resolve, 200));\n process.stdout.write('.');\n }\n console.log('\\nSuccessfully shut down clawmini daemon.');\n } catch (err: unknown) {\n if (err instanceof Error && err.message === 'Daemon not running.') {\n console.log('Daemon is not running.');\n } else {\n console.error(\n '\\nFailed to shut down daemon:',\n err instanceof Error ? err.message : String(err)\n );\n process.exit(1);\n }\n }\n });\n","import { Command } from 'commander';\nimport { getDaemonClient } from '../client.js';\nimport { getSocketPath } from '../../shared/workspace.js';\nimport fs from 'node:fs';\n\nexport const upCmd = new Command('up')\n .description('Start the local clawmini daemon server')\n .action(async () => {\n try {\n const socketPath = getSocketPath();\n const wasRunning = fs.existsSync(socketPath);\n\n const client = await getDaemonClient({ autoStart: true });\n // Perform a ping to ensure the server is responding\n await client.ping.query();\n\n if (wasRunning) {\n console.log('Daemon is already running.');\n } else {\n console.log('Successfully started clawmini daemon.');\n }\n } catch (err: unknown) {\n console.error('Failed to start daemon:', err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n","import http from 'node:http';\nimport { type ZodType } from 'zod';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function parseJsonBody<T = any>(\n req: http.IncomingMessage,\n schema?: ZodType<T>\n): Promise<T> {\n if (req.headers['content-type'] !== 'application/json') {\n throw new Error('Invalid Content-Type');\n }\n let bodyStr = '';\n for await (const chunk of req) {\n bodyStr += chunk;\n }\n const rawBody = JSON.parse(bodyStr);\n if (schema) {\n return schema.parse(rawBody);\n }\n return rawBody as T;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function sendJsonResponse(res: http.ServerResponse, statusCode: number, data: any) {\n res.writeHead(statusCode, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(data));\n}\n","import http from 'node:http';\nimport { z } from 'zod';\nimport {\n listAgents,\n getAgent,\n writeAgentSettings,\n deleteAgent,\n isValidAgentId,\n} from '../../../shared/workspace.js';\nimport { parseJsonBody, sendJsonResponse } from './utils.js';\n\nexport async function handleApiAgents(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n urlPath: string\n) {\n if (req.method === 'GET' && urlPath === '/api/agents') {\n const agentIds = await listAgents();\n const agents = [];\n for (const id of agentIds) {\n try {\n const agent = await getAgent(id);\n if (agent) {\n agents.push({ id, ...agent });\n }\n } catch (err: unknown) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n console.error(`Failed to load agent ${id}: ${errorMessage}`);\n agents.push({ id, error: errorMessage });\n }\n }\n sendJsonResponse(res, 200, agents);\n return true;\n }\n\n if (req.method === 'POST' && urlPath === '/api/agents') {\n try {\n const schema = z.object({\n id: z.string().refine(isValidAgentId, { message: 'Invalid agent ID' }),\n directory: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n commands: z.record(z.string(), z.string()).optional(),\n });\n\n const body = await parseJsonBody(req, schema);\n\n const existing = await getAgent(body.id);\n if (existing) {\n sendJsonResponse(res, 409, { error: 'Agent already exists' });\n return true;\n }\n\n const newAgent = {\n directory: body.directory,\n env: body.env || {},\n commands: body.commands || {},\n };\n\n try {\n await writeAgentSettings(body.id, newAgent);\n } catch (err) {\n sendJsonResponse(res, 400, {\n error: err instanceof Error ? err.message : 'Invalid agent directory',\n });\n return true;\n }\n\n sendJsonResponse(res, 201, { id: body.id, ...newAgent });\n } catch {\n sendJsonResponse(res, 500, { error: 'Failed to create agent' });\n }\n return true;\n }\n\n const agentMatch = urlPath.match(/^\\/api\\/agents\\/([^/]+)$/);\n if (agentMatch && agentMatch[1]) {\n const agentId = agentMatch[1];\n\n if (!isValidAgentId(agentId)) {\n sendJsonResponse(res, 400, { error: 'Invalid agent ID' });\n return true;\n }\n\n if (req.method === 'GET') {\n try {\n const agent = await getAgent(agentId);\n if (!agent) {\n sendJsonResponse(res, 404, { error: 'Agent not found' });\n return true;\n }\n sendJsonResponse(res, 200, { id: agentId, ...agent });\n } catch (err: unknown) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n sendJsonResponse(res, 500, { error: errorMessage });\n }\n return true;\n }\n\n if (req.method === 'PUT' || req.method === 'POST') {\n try {\n const schema = z.object({\n directory: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n commands: z.record(z.string(), z.string()).optional(),\n });\n\n const body = await parseJsonBody(req, schema);\n\n const agent = (await getAgent(agentId)) || {};\n if (body.directory !== undefined) agent.directory = body.directory;\n if (body.env !== undefined) agent.env = body.env;\n if (body.commands !== undefined) agent.commands = body.commands;\n\n try {\n await writeAgentSettings(agentId, agent);\n } catch (err) {\n sendJsonResponse(res, 400, {\n error: err instanceof Error ? err.message : 'Invalid agent directory',\n });\n return true;\n }\n\n sendJsonResponse(res, 200, { id: agentId, ...agent });\n } catch {\n sendJsonResponse(res, 500, { error: 'Failed to update agent' });\n }\n return true;\n }\n\n if (req.method === 'DELETE') {\n await deleteAgent(agentId);\n sendJsonResponse(res, 200, { success: true });\n return true;\n }\n }\n\n return false;\n}\n","import http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport {\n listChats,\n getMessages,\n getChatsDir,\n createChat,\n isValidChatId,\n} from '../../../shared/chats.js';\nimport { writeChatSettings } from '../../../shared/workspace.js';\nimport { getDaemonClient } from '../../client.js';\nimport { parseJsonBody, sendJsonResponse } from './utils.js';\n\nexport async function handleApiChats(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n urlPath: string\n) {\n if (req.method === 'GET' && urlPath === '/api/chats') {\n const chats = await listChats();\n sendJsonResponse(res, 200, chats);\n return true;\n }\n\n if (req.method === 'POST' && urlPath === '/api/chats') {\n try {\n const schema = z.object({\n id: z.string().refine(isValidChatId, {\n message: 'Invalid chat ID. Must be alphanumeric with dashes or underscores.',\n }),\n agent: z.string().optional(),\n });\n\n const body = await parseJsonBody(req, schema);\n\n await createChat(body.id);\n if (body.agent) {\n await writeChatSettings(body.id, { defaultAgent: body.agent });\n }\n sendJsonResponse(res, 201, { id: body.id, agent: body.agent });\n } catch {\n sendJsonResponse(res, 500, { error: 'Failed to create chat' });\n }\n return true;\n }\n\n const chatMatch = urlPath.match(/^\\/api\\/chats\\/([^/]+)$/);\n if (req.method === 'GET' && chatMatch && chatMatch[1]) {\n const chatId = chatMatch[1];\n try {\n const url = new URL(req.url || '', `http://${req.headers.host}`);\n const since = url.searchParams.get('since');\n const before = url.searchParams.get('before');\n const limitParam = url.searchParams.get('limit');\n const parsedLimit = limitParam ? parseInt(limitParam, 10) : undefined;\n const limit = Number.isNaN(parsedLimit) ? undefined : parsedLimit;\n\n let messages = await getMessages(chatId, limit, undefined, undefined, before || undefined);\n\n if (since) {\n const sinceIndex = messages.findIndex((m) => m.id === since);\n if (sinceIndex !== -1) {\n messages = messages.slice(sinceIndex + 1);\n }\n }\n\n sendJsonResponse(res, 200, messages);\n } catch {\n sendJsonResponse(res, 404, { error: 'Chat not found' });\n }\n return true;\n }\n\n const streamMatch = urlPath.match(/^\\/api\\/chats\\/([^/]+)\\/stream$/);\n if (req.method === 'GET' && streamMatch && streamMatch[1]) {\n const chatId = streamMatch[1];\n\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.flushHeaders();\n\n const chatsDir = await getChatsDir();\n const chatFile = path.join(chatsDir, chatId, 'chat.jsonl');\n\n if (!fs.existsSync(chatFile)) {\n await createChat(chatId);\n }\n\n let currentSize = fs.statSync(chatFile).size;\n\n const watcher = fs.watch(chatFile, (eventType) => {\n if (eventType === 'change') {\n try {\n const stat = fs.statSync(chatFile);\n if (stat.size > currentSize) {\n const stream = fs.createReadStream(chatFile, {\n start: currentSize,\n end: stat.size - 1,\n });\n currentSize = stat.size;\n\n let buffer = '';\n stream.on('data', (chunk) => {\n buffer += chunk.toString();\n const parts = buffer.split('\\n');\n buffer = parts.pop() || '';\n for (const line of parts) {\n if (line.trim()) {\n res.write(`data: ${line}\\n\\n`);\n }\n }\n });\n stream.on('end', () => {\n if (buffer.trim()) {\n res.write(`data: ${buffer}\\n\\n`);\n }\n });\n }\n } catch {\n // File might be temporarily inaccessible\n }\n }\n });\n\n req.on('close', () => {\n watcher.close();\n });\n\n // Send an initial ping to establish connection\n res.write(': connected\\n\\n');\n return true;\n }\n\n const messageMatch = urlPath.match(/^\\/api\\/chats\\/([^/]+)\\/messages$/);\n if (req.method === 'POST' && messageMatch && messageMatch[1]) {\n const chatId = messageMatch[1];\n\n const schema = z.object({\n message: z.string().min(1, 'Missing or invalid \"message\" field'),\n });\n\n let body;\n try {\n body = await parseJsonBody(req, schema);\n } catch (err) {\n sendJsonResponse(res, 400, {\n error: err instanceof Error ? err.message : 'Invalid request',\n });\n return true;\n }\n\n try {\n const client = await getDaemonClient();\n await client.sendMessage.mutate({\n type: 'send-message',\n client: 'cli',\n data: {\n message: body.message,\n chatId,\n noWait: true,\n },\n });\n sendJsonResponse(res, 200, { success: true });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n sendJsonResponse(res, 500, { error: errorMessage || 'Internal Server Error' });\n }\n return true;\n }\n\n const cronMatch = urlPath.match(/^\\/api\\/chats\\/([^/]+)\\/cron(?:\\/([^/]+))?$/);\n if (cronMatch && cronMatch[1]) {\n const chatId = cronMatch[1];\n const jobId = cronMatch[2]; // undefined if not present\n\n if (req.method === 'GET') {\n try {\n const client = await getDaemonClient();\n const jobs = await client.listCronJobs.query({ chatId });\n sendJsonResponse(res, 200, jobs);\n } catch {\n sendJsonResponse(res, 500, { error: 'Failed to list cron jobs' });\n }\n return true;\n }\n\n if (req.method === 'POST') {\n try {\n const client = await getDaemonClient();\n const body = await parseJsonBody(req);\n await client.addCronJob.mutate({ chatId, job: body });\n sendJsonResponse(res, 201, { success: true });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n sendJsonResponse(res, 500, { error: errorMessage || 'Failed to add cron job' });\n }\n return true;\n }\n\n if (req.method === 'DELETE' && jobId) {\n try {\n const client = await getDaemonClient();\n await client.deleteCronJob.mutate({ chatId, id: jobId });\n sendJsonResponse(res, 200, { success: true });\n } catch {\n sendJsonResponse(res, 500, { error: 'Failed to delete cron job' });\n }\n return true;\n }\n }\n\n return false;\n}\n","import { Command } from 'commander';\nimport http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { pathIsInsideDir } from '../../shared/utils/fs.js';\nimport { sendJsonResponse } from './web-api/utils.js';\nimport { handleApiAgents } from './web-api/agents.js';\nimport { handleApiChats } from './web-api/chats.js';\n\nconst mimeTypes: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'text/javascript',\n '.mjs': 'text/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n};\n\nexport const webCmd = new Command('web')\n .description('Start the local clawmini web interface')\n .option('-p, --port <number>', 'Port to bind the server to', '8080')\n .option('-H, --host <string>', 'Host to bind the server to', '127.0.0.1')\n .action((options) => {\n const port = parseInt(options.port, 10);\n if (isNaN(port)) {\n console.error('Invalid port number.');\n process.exit(1);\n }\n\n // When bundled into dist/cli/index.mjs, import.meta.url resolves to that file.\n // So __dirname will be dist/cli, and webDir will be dist/web.\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const webDir = path.resolve(__dirname, '../web');\n\n const server = http.createServer(async (req, res) => {\n try {\n const urlPath = req.url === '/' ? '/index.html' : req.url?.split('?')[0] || '/';\n\n // API Routes\n if (urlPath.startsWith('/api/')) {\n res.setHeader('Content-Type', 'application/json');\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (urlPath.startsWith('/api/agents') && (await handleApiAgents(req, res, urlPath)))\n return;\n if (urlPath.startsWith('/api/chats') && (await handleApiChats(req, res, urlPath))) return;\n\n sendJsonResponse(res, 404, { error: 'Not Found' });\n return;\n }\n\n // Static Files\n let filePath = path.join(webDir, urlPath);\n\n // Prevent directory traversal\n if (!pathIsInsideDir(filePath, webDir)) {\n res.writeHead(403);\n res.end('Forbidden');\n return;\n }\n\n if (!fs.existsSync(filePath) || fs.statSync(filePath).isDirectory()) {\n // SPA fallback to index.html\n filePath = path.join(webDir, 'index.html');\n if (!fs.existsSync(filePath)) {\n res.writeHead(404);\n res.end('Not Found');\n return;\n }\n }\n\n const extname = path.extname(filePath).toLowerCase();\n const contentType = mimeTypes[extname] || 'application/octet-stream';\n\n res.writeHead(200, { 'Content-Type': contentType });\n const readStream = fs.createReadStream(filePath);\n readStream.pipe(res);\n } catch (err) {\n console.error('Error serving request:', err);\n res.writeHead(500);\n res.end('Internal Server Error');\n }\n });\n\n server.listen(port, options.host, () => {\n console.log(`Clawmini web interface running at http://${options.host}:${port}/`);\n });\n });\n","import { Command } from 'commander';\nimport { getDaemonClient } from '../client.js';\nimport type { CronJob } from '../../shared/config.js';\n\nexport const jobsCmd = new Command('jobs').description('Manage background jobs');\n\nfunction parseKeyValueArray(arr: string[] | undefined): Record<string, string> | undefined {\n if (!arr || arr.length === 0) return undefined;\n const result: Record<string, string> = {};\n for (const item of arr) {\n const [key, ...rest] = item.split('=');\n if (key && rest.length >= 0) {\n result[key] = rest.join('=');\n }\n }\n return result;\n}\n\nfunction handleError(action: string, err: unknown): never {\n console.error(`Failed to ${action}:`, err instanceof Error ? err.message : String(err));\n process.exit(1);\n}\n\njobsCmd\n .command('list')\n .description('Display existing jobs')\n .option('-c, --chat <id>', 'Specific chat to list jobs from')\n .option('--json', 'Output full JSON for each job')\n .action(async (options) => {\n try {\n const trpc = await getDaemonClient();\n let jobs = await trpc.listCronJobs.query({ chatId: options.chat });\n\n jobs = jobs.sort((a, b) => {\n const timeA = a.createdAt ? new Date(a.createdAt).getTime() : 0;\n const timeB = b.createdAt ? new Date(b.createdAt).getTime() : 0;\n return timeA - timeB;\n });\n\n if (options.json) {\n console.log(JSON.stringify(jobs, null, 2));\n return;\n }\n\n if (jobs.length === 0) {\n console.log('No jobs found.');\n return;\n }\n for (const job of jobs) {\n let schedule = '';\n if ('cron' in job.schedule) schedule = `cron: ${job.schedule.cron}`;\n else if ('every' in job.schedule) schedule = `every: ${job.schedule.every}`;\n else if ('at' in job.schedule) schedule = `at: ${job.schedule.at}`;\n\n console.log(`- ${job.id} (${schedule})`);\n }\n } catch (err) {\n handleError('list jobs', err);\n }\n });\n\njobsCmd\n .command('add <name>')\n .description('Create a new job')\n .option('-m, --message <text>', 'The message to send', '')\n .option('-r, --reply <text>', 'An immediate reply to append')\n .option(\n '--at <time-or-interval>',\n 'Execute once at this UTC time or after an interval (e.g., 2m, 4h)'\n )\n .option('--every <duration>', 'Execute repeatedly at this interval (e.g., 20m, 4h)')\n .option('--cron <expression>', 'Execute according to the crontab expression')\n .option('-a, --agent <agentid>', 'Agent to use')\n .option(\n '-e, --env <env...>',\n 'Environment variables in KEY=VALUE format (can be specified multiple times)'\n )\n .option('-s, --session <type>', 'Session type (e.g. new)')\n .option('-c, --chat <chatid>', 'Specify the chat')\n .action(async (name, options) => {\n try {\n const schedules = [options.at, options.every, options.cron].filter(Boolean);\n if (schedules.length > 1) {\n throw new Error(\n 'More than one schedule flag was set. Please use only one of --at, --every, or --cron.'\n );\n }\n if (schedules.length === 0) {\n throw new Error('A schedule must be specified (--at, --every, or --cron).');\n }\n\n let schedule: CronJob['schedule'];\n if (options.at) schedule = { at: options.at };\n else if (options.every) schedule = { every: options.every };\n else schedule = { cron: options.cron };\n\n const job: CronJob = {\n id: name,\n createdAt: new Date().toISOString(),\n message: options.message,\n schedule,\n };\n\n if (options.reply) job.reply = options.reply;\n if (options.agent) job.agentId = options.agent;\n\n const env = parseKeyValueArray(options.env);\n if (env) job.env = env;\n\n if (options.session) {\n if (options.session !== 'new') {\n throw new Error('Only the \"new\" session type is supported.');\n }\n job.session = { type: options.session };\n }\n\n const trpc = await getDaemonClient();\n await trpc.addCronJob.mutate({ chatId: options.chat, job });\n console.log(`Job '${name}' created successfully.`);\n } catch (err) {\n handleError('create job', err);\n }\n });\n\njobsCmd\n .command('delete <name>')\n .description('Remove a job')\n .option('-c, --chat <chatid>', 'Specify the chat')\n .action(async (name, options) => {\n try {\n const trpc = await getDaemonClient();\n const result = await trpc.deleteCronJob.mutate({ chatId: options.chat, id: name });\n if (result.deleted) {\n console.log(`Job '${name}' deleted successfully.`);\n } else {\n console.log(`Job '${name}' not found.`);\n }\n } catch (err) {\n handleError('delete job', err);\n }\n });\n","import { Command } from 'commander';\nimport path from 'node:path';\nimport {\n getLiteScriptContent,\n writeLiteScript,\n exportLiteToAllEnvironments,\n} from '../../shared/lite.js';\n\nexport const exportLiteCmd = new Command('export-lite')\n .description('Export the standalone clawmini-lite client script')\n .option(\n '-o, --out <path>',\n 'Output path or directory for the script (defaults to current directory)'\n )\n .option('--stdout', 'Output the script to stdout instead of a file')\n .action(async (options: { out?: string; stdout?: boolean }) => {\n let liteScriptContent = '';\n try {\n liteScriptContent = await getLiteScriptContent();\n } catch (err) {\n console.error(\n `Failed to read compiled clawmini-lite script. Ensure you have built the project (npm run build). Error: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n\n if (options.stdout) {\n process.stdout.write(liteScriptContent);\n return;\n }\n\n const defaultFilename = 'clawmini-lite.js';\n let finalPath = path.resolve(process.cwd(), defaultFilename);\n\n if (options.out) {\n finalPath = path.resolve(process.cwd(), options.out);\n try {\n const writtenPath = await writeLiteScript(finalPath);\n console.log(`Successfully exported clawmini-lite to ${writtenPath}`);\n } catch (err) {\n console.error(\n `Failed to export script: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n return;\n }\n\n const exportedToEnvironments = await exportLiteToAllEnvironments(process.cwd());\n\n if (!exportedToEnvironments) {\n try {\n const writtenPath = await writeLiteScript(finalPath);\n console.log(`Successfully exported clawmini-lite to ${writtenPath}`);\n } catch (err) {\n console.error(\n `Failed to export script: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n }\n });\n","import { Command } from 'commander';\nimport { readSettings, writeSettings, enableEnvironment } from '../../shared/workspace.js';\nimport { handleError } from '../utils.js';\n\nexport const environmentsCmd = new Command('environments').description('Manage environments');\n\nenvironmentsCmd\n .command('enable <name>')\n .description('Enable an environment for a path in the workspace')\n .option('-p, --path <subpath>', 'Path to apply the environment to', './')\n .action(async (name: string, options: { path: string }) => {\n try {\n await enableEnvironment(name, options.path);\n } catch (err) {\n handleError('enable environment', err);\n }\n });\n\nenvironmentsCmd\n .command('disable')\n .description('Disable an environment mapping')\n .option('-p, --path <subpath>', 'Path to remove the environment from', './')\n .action(async (options: { path: string }) => {\n try {\n const settings = await readSettings();\n if (!settings?.environments || !settings.environments[options.path]) {\n console.log(`No environment mapping found for path '${options.path}'.`);\n return;\n }\n\n const name = settings.environments[options.path];\n delete settings.environments[options.path];\n await writeSettings(settings);\n\n console.log(`Disabled environment '${name}' for path '${options.path}'.`);\n } catch (err) {\n handleError('disable environment', err);\n }\n });\n","import { Command } from 'commander';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { handleError } from '../utils.js';\nimport { resolveCompiledScript } from '../../shared/lite.js';\nimport type { PolicyConfig } from '../../shared/policies.js';\nimport { getClawminiDir } from '../../shared/workspace.js';\n\nconst SUPPORTED_POLICIES = ['propose-policy'];\n\nexport const policiesCmd = new Command('policies').description('Manage sandbox policies');\n\npoliciesCmd\n .command('add <name>')\n .description('Add a new policy')\n .action(async (name: string) => {\n if (!SUPPORTED_POLICIES.includes(name)) {\n handleError(\n 'add policy',\n new Error(\n `Unsupported policy: \"${name}\". Supported policies: ${SUPPORTED_POLICIES.join(', ')}`\n )\n );\n }\n\n const dirPath = getClawminiDir();\n const policyScriptsDir = path.join(dirPath, 'policy-scripts');\n const policiesPath = path.join(dirPath, 'policies.json');\n\n if (!fs.existsSync(dirPath)) {\n handleError(\n 'add policy',\n new Error('.clawmini directory not found. Please run \"clawmini init\" first.')\n );\n }\n\n if (!fs.existsSync(policyScriptsDir)) {\n fs.mkdirSync(policyScriptsDir, { recursive: true });\n }\n\n // Update or create policies.json\n let policies: PolicyConfig = { policies: {} };\n if (fs.existsSync(policiesPath)) {\n policies = JSON.parse(fs.readFileSync(policiesPath, 'utf8'));\n }\n\n policies.policies[name] = {\n description: 'Propose a new policy to create',\n command: `./.clawmini/policy-scripts/${name}.js`,\n allowHelp: true,\n };\n\n fs.writeFileSync(policiesPath, JSON.stringify(policies, null, 2));\n console.log(`Registered ${name} in .clawmini/policies.json`);\n\n try {\n const foundPath = await resolveCompiledScript(name, import.meta.url);\n let scriptContent = fs.readFileSync(foundPath, 'utf8');\n\n if (!scriptContent.startsWith('#!')) {\n scriptContent = '#!/usr/bin/env node\\n' + scriptContent;\n }\n\n const destPath = path.join(policyScriptsDir, `${name}.js`);\n fs.writeFileSync(destPath, scriptContent, { mode: 0o755 });\n console.log(`Copied ${name} script to ${destPath}`);\n } catch (err) {\n handleError('add policy', err);\n }\n });\n","import { Command } from 'commander';\nimport { promises as fsPromises, Dirent } from 'fs';\nimport {\n resolveSkillsTemplatePath,\n copyAgentSkills,\n copyAgentSkill,\n} from '../../shared/workspace.js';\nimport { handleError } from '../utils.js';\n\nexport const skillsCmd = new Command('skills').description('Manage template skills');\n\nskillsCmd\n .command('list')\n .description('List available template skills')\n .action(async () => {\n try {\n let skillsDir: string;\n try {\n skillsDir = await resolveSkillsTemplatePath();\n } catch (err: unknown) {\n if (err instanceof Error && err.message.includes('Template not found: skills')) {\n console.error('No skills found. The templates/skills directory does not exist.');\n return;\n }\n throw err;\n }\n\n let entries: Dirent[];\n try {\n entries = await fsPromises.readdir(skillsDir, { withFileTypes: true });\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') {\n console.error('No skills found.');\n return;\n }\n throw err;\n }\n\n const skills = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n\n if (skills.length === 0) {\n console.error('No skills found.');\n return;\n }\n for (const skill of skills) {\n console.log(`- ${skill}`);\n }\n } catch (err) {\n handleError('list skills', err);\n }\n });\n\nskillsCmd\n .command('add [skill-name]')\n .description('Add a skill to an agent, overwriting the target skill directory if it exists')\n .option('-a, --agent <agentId>', 'Agent ID (defaults to \"default\")')\n .action(async (skillName: string | undefined, options: { agent?: string }) => {\n try {\n const agentId = options.agent || 'default';\n\n if (skillName) {\n await copyAgentSkill(agentId, skillName, process.cwd(), true);\n console.log(`Successfully added skill '${skillName}' to agent '${agentId}'.`);\n } else {\n await copyAgentSkills(agentId, process.cwd(), true);\n console.log(`Successfully added all skills to agent '${agentId}'.`);\n }\n } catch (err) {\n handleError('add skill', err);\n }\n });\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { initCmd } from './commands/init.js';\nimport { messagesCmd } from './commands/messages.js';\nimport { chatsCmd } from './commands/chats.js';\nimport { agentsCmd } from './commands/agents.js';\nimport { downCmd } from './commands/down.js';\nimport { upCmd } from './commands/up.js';\nimport { webCmd } from './commands/web.js';\nimport { jobsCmd } from './commands/jobs.js';\nimport { exportLiteCmd } from './commands/export-lite.js';\nimport { environmentsCmd } from './commands/environments.js';\nimport { policiesCmd } from './commands/policies.js';\nimport { skillsCmd } from './commands/skills.js';\n\nconst program = new Command();\n\nprogram.name('clawmini').description('Clawmini CLI').version('0.0.1');\n\nprogram.addCommand(initCmd);\nprogram.addCommand(messagesCmd);\nprogram.addCommand(chatsCmd);\nprogram.addCommand(agentsCmd);\nprogram.addCommand(environmentsCmd);\nprogram.addCommand(skillsCmd);\nprogram.addCommand(downCmd);\nprogram.addCommand(upCmd);\nprogram.addCommand(webCmd);\nprogram.addCommand(jobsCmd);\nprogram.addCommand(exportLiteCmd);\nprogram.addCommand(policiesCmd);\n\nprogram.parse();\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["handleError","fs","fs","SERVICE_ALIASES","fsPromises"],"sources":["../../src/shared/agent-utils.ts","../../src/cli/utils.ts","../../src/cli/builtin-policies.ts","../../src/cli/commands/init.ts","../../src/cli/client.ts","../../src/cli/commands/messages.ts","../../src/cli/commands/chats.ts","../../src/cli/commands/agents.ts","../../src/cli/commands/down.ts","../../src/cli/commands/up.ts","../../src/cli/supervisor.ts","../../src/cli/commands/serve.ts","../../src/cli/commands/logs.ts","../../src/cli/commands/web-api/utils.ts","../../src/cli/commands/web-api/agents.ts","../../src/cli/commands/web-api/chats.ts","../../src/cli/commands/web.ts","../../src/cli/commands/jobs.ts","../../src/cli/commands/export-lite.ts","../../src/cli/commands/environments.ts","../../src/cli/commands/policies.ts","../../src/cli/commands/skills.ts","../../src/cli/index.ts"],"sourcesContent":["import { type Agent } from './config.js';\nimport {\n writeAgentSettings,\n applyTemplateToAgent,\n readChatSettings,\n writeChatSettings,\n refreshAgentSkills,\n getAgent,\n} from './workspace.js';\nimport { createChat, listChats } from './chats.js';\n\nexport async function createAgentWithChat(\n agentId: string,\n agentData: Agent,\n template?: string,\n startDir = process.cwd(),\n opts: { fork?: boolean; force?: boolean } = {}\n): Promise<void> {\n await writeAgentSettings(agentId, agentData, startDir);\n\n if (template) {\n await applyTemplateToAgent(agentId, template, agentData, startDir, opts);\n }\n\n try {\n const resolved = await getAgent(agentId, startDir);\n if (resolved?.skillsDir === null) {\n console.log(`Skipping skills for agent ${agentId} (skillsDir is null).`);\n } else if (resolved) {\n await refreshAgentSkills(agentId, resolved, startDir, { firstInstall: true });\n console.log(`Installed skills for agent ${agentId}.`);\n }\n } catch (err) {\n console.warn(\n `Warning: Failed to copy skills to agent ${agentId}: ${err instanceof Error ? err.message : String(err)}`\n );\n }\n\n const existingChats = await listChats(startDir);\n if (existingChats.includes(agentId)) {\n console.warn(`Warning: Chat ${agentId} already exists.`);\n } else {\n await createChat(agentId, startDir);\n const currentSettings = (await readChatSettings(agentId, startDir)) || {};\n await writeChatSettings(agentId, { ...currentSettings, defaultAgent: agentId }, startDir);\n }\n}\n","export function handleError(action: string, err: unknown): never {\n console.error(`Failed to ${action}:`, err instanceof Error ? err.message : String(err));\n process.exit(1);\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { resolveCompiledScript } from '../shared/lite.js';\nimport { getClawminiDir } from '../shared/workspace.js';\nimport { BUILTIN_POLICIES } from '../shared/policies.js';\n\nconst HASHBANG = '#!/usr/bin/env node\\n';\n\nfunction sha256(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\nexport async function installBuiltinPolicies(dirPath = getClawminiDir()): Promise<void> {\n const policyScriptsDir = path.join(dirPath, 'policy-scripts');\n await fs.mkdir(policyScriptsDir, { recursive: true });\n\n for (const name of Object.keys(BUILTIN_POLICIES)) {\n try {\n const sourcePath = await resolveCompiledScript(name, import.meta.url);\n let scriptContent = await fs.readFile(sourcePath, 'utf8');\n if (!scriptContent.startsWith('#!')) {\n scriptContent = HASHBANG + scriptContent;\n }\n\n const destPath = path.join(policyScriptsDir, `${name}.js`);\n let existing: string | null = null;\n try {\n existing = await fs.readFile(destPath, 'utf8');\n } catch {\n // missing — write below\n }\n if (existing !== null && sha256(existing) === sha256(scriptContent)) {\n continue;\n }\n await fs.writeFile(destPath, scriptContent, { mode: 0o755 });\n } catch (err) {\n console.warn(\n `Warning: Could not install built-in policy ${name}:`,\n err instanceof Error ? err.message : String(err)\n );\n }\n }\n}\n","import { Command } from 'commander';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { isValidAgentId, enableEnvironment } from '../../shared/workspace.js';\nimport { setDefaultChatId } from '../../shared/chats.js';\nimport { type Agent } from '../../shared/config.js';\nimport { createAgentWithChat } from '../../shared/agent-utils.js';\nimport { handleError } from '../utils.js';\nimport { installBuiltinPolicies } from '../builtin-policies.js';\n\nfunction readBackupGitignoreTemplate(): string | null {\n let currentDir = path.dirname(fileURLToPath(import.meta.url));\n while (\n currentDir !== path.parse(currentDir).root &&\n !fs.existsSync(path.join(currentDir, 'package.json'))\n ) {\n currentDir = path.dirname(currentDir);\n }\n const templatePath = path.join(currentDir, 'docs', 'backups', 'clawmini.gitignore');\n try {\n return fs.readFileSync(templatePath, 'utf8');\n } catch {\n return null;\n }\n}\n\nexport const initCmd = new Command('init')\n .description('Initialize a new .clawmini settings folder')\n .option('--agent <name>', 'Initialize with a specific agent')\n .option('--agent-template <name>', 'Template to use for the agent')\n .option('--environment <name>', 'Enable a specific environment')\n .action(async (options: { agent?: string; agentTemplate?: string; environment?: string }) => {\n if (options.agentTemplate && !options.agent) {\n handleError('initialize', new Error('--agent-template cannot be used without --agent'));\n }\n\n if (options.agent && !isValidAgentId(options.agent)) {\n handleError('initialize', new Error(`Invalid agent ID: ${options.agent}`));\n }\n\n const cwd = process.cwd();\n const dirPath = path.join(cwd, '.clawmini');\n const settingsPath = path.join(dirPath, 'settings.json');\n\n if (fs.existsSync(settingsPath)) {\n console.log('.clawmini already initialized');\n return;\n }\n\n const defaultSettings = {\n defaultAgent: {\n commands: {\n new: 'echo $CLAW_CLI_MESSAGE',\n },\n env: {},\n },\n api: true,\n };\n\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true });\n }\n\n fs.writeFileSync(settingsPath, JSON.stringify(defaultSettings, null, 2));\n console.log('Initialized .clawmini/settings.json');\n\n const gitignoreTemplate = readBackupGitignoreTemplate();\n if (gitignoreTemplate) {\n const gitignorePath = path.join(dirPath, '.gitignore');\n if (!fs.existsSync(gitignorePath)) {\n fs.writeFileSync(gitignorePath, gitignoreTemplate);\n console.log('Initialized .clawmini/.gitignore');\n }\n } else {\n console.warn('Warning: backup .gitignore template not found; skipping .clawmini/.gitignore');\n }\n\n await installBuiltinPolicies(dirPath);\n\n if (options.agent) {\n try {\n const agentId = options.agent;\n const agentData: Agent = {};\n await createAgentWithChat(agentId, agentData, options.agentTemplate);\n\n console.log(`Agent ${agentId} created successfully.`);\n\n await setDefaultChatId(agentId);\n console.log(`Default chat set to ${agentId}.`);\n } catch (err) {\n handleError('create agent', err);\n }\n }\n\n if (options.environment) {\n try {\n await enableEnvironment(options.environment);\n } catch (err) {\n handleError('enable environment', err);\n }\n }\n });\n","import { createTRPCClient, httpLink } from '@trpc/client';\nimport type { UserRouter as AppRouter } from '../daemon/api/index.js';\nimport { getSocketPath, getClawminiDir } from '../shared/workspace.js';\nimport { createUnixSocketFetch } from '../shared/fetch.js';\nimport { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport async function getDaemonClient(options: { autoStart?: boolean } = {}) {\n const { autoStart = true } = options;\n const socketPath = getSocketPath();\n\n // Check if server is running by verifying socket exists\n // (A better check would be to ping it, but this is a start)\n if (!fs.existsSync(socketPath)) {\n if (!autoStart) {\n throw new Error('Daemon not running.');\n }\n console.log('Daemon not running. Starting daemon...');\n\n // Start daemon in the background\n const daemonPath = new URL('../daemon/index.mjs', import.meta.url).pathname;\n const logFile = fs.openSync(path.join(getClawminiDir(), 'daemon.log'), 'a');\n const child = spawn(process.execPath, [daemonPath], {\n detached: true,\n stdio: ['ignore', logFile, logFile],\n });\n child.unref();\n\n // Wait up to 5 seconds for the daemon to start and create the socket\n for (let i = 0; i < 50; i++) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n if (fs.existsSync(socketPath)) {\n break;\n }\n }\n\n if (!fs.existsSync(socketPath)) {\n throw new Error('Failed to start daemon.');\n }\n }\n\n return createTRPCClient<AppRouter>({\n links: [\n httpLink({\n url: 'http://localhost',\n fetch: createUnixSocketFetch(socketPath),\n }),\n ],\n });\n}\n","import { Command } from 'commander';\nimport { getDaemonClient } from '../client.js';\nimport { getMessages, getDefaultChatId } from '../../shared/chats.js';\nimport { getAgent, isValidAgentId, getClawminiDir } from '../../shared/workspace.js';\nimport * as fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport const messagesCmd = new Command('messages').description('Manage messages');\n\nmessagesCmd\n .command('send <message>')\n .description('Send a new message')\n .option('-c, --chat <id>', 'Specific chat to send the message to')\n .option('-s, --session <id>', 'Specific session to send the message to')\n .option('-a, --agent <name>', 'Specific agent to use for this message')\n .option('--no-wait', 'Return immediately after the server queues the message')\n .option('-f, --file <path>', 'File to attach', (val, prev: string[]) => prev.concat([val]), [])\n .action(async (message, options) => {\n try {\n if (options.agent) {\n if (!isValidAgentId(options.agent)) {\n console.error(`Error: Invalid agent ID '${options.agent}'.`);\n process.exit(1);\n }\n\n if (options.agent !== 'default') {\n const agent = await getAgent(options.agent);\n if (!agent) {\n console.error(`Error: Agent '${options.agent}' not found.`);\n process.exit(1);\n }\n }\n }\n\n let finalFiles: string[] | undefined = undefined;\n if (options.file && options.file.length > 0) {\n finalFiles = [];\n const tmpDir = path.join(getClawminiDir(process.cwd()), 'tmp');\n await fs.mkdir(tmpDir, { recursive: true });\n for (const f of options.file) {\n const dest = path.join(\n tmpDir,\n `cli-${Date.now()}-${Math.random().toString(36).substring(2, 7)}-${path.basename(f)}`\n );\n await fs.copyFile(path.resolve(process.cwd(), f), dest);\n finalFiles.push(dest);\n }\n }\n\n const trpc = await getDaemonClient();\n await trpc.sendMessage.mutate({\n type: 'send-message',\n client: 'cli',\n data: {\n message,\n chatId: options.chat,\n sessionId: options.session,\n agentId: options.agent,\n noWait: !options.wait,\n files: finalFiles,\n },\n });\n console.log('Message sent successfully.');\n } catch (err) {\n console.error('Failed to send message:', err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nmessagesCmd\n .command('tail')\n .description('View message history')\n .option('-n, --lines <number>', 'Number of messages to show', parseInt)\n .option('--json', 'Output raw JSONL format')\n .option('-c, --chat <id>', 'Specific chat to view')\n .action(async (options) => {\n try {\n const chatId = options.chat ?? (await getDefaultChatId());\n const messages = await getMessages(\n chatId,\n options.lines,\n undefined,\n (msg) => !msg.subagentId\n );\n\n if (options.json) {\n messages.forEach((msg) => console.log(JSON.stringify(msg)));\n } else {\n messages.forEach((msg) => {\n if (msg.role === 'user' || msg.displayRole === 'user') {\n console.log(`[USER] ${msg.content}`);\n } else if (msg.role === 'agent' || msg.displayRole === 'agent') {\n console.log(`[AGENT] ${msg.content.trim()}`);\n } else if (msg.role === 'policy') {\n console.log(`[POLICY] ${msg.commandName} ${msg.args.join(' ')}`);\n } else if (msg.role === 'tool') {\n console.log(`[TOOL] ${msg.name}`);\n } else if (msg.role === 'system') {\n if (msg.content) {\n console.log(`[LOG] ${msg.content.trim()}`);\n }\n } else if (msg.role === 'command' || msg.role === 'legacy_log') {\n if (msg.content) {\n console.log(`[LOG] ${msg.content.trim()}`);\n } else if (msg.stderr) {\n console.error(`[STDERR] ${msg.stderr.trim()}`);\n }\n }\n });\n }\n } catch (err) {\n console.error(\n 'Failed to retrieve messages:',\n err instanceof Error ? err.message : String(err)\n );\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport {\n listChats,\n createChat,\n deleteChat,\n setDefaultChatId,\n getDefaultChatId,\n DEFAULT_CHAT_ID,\n} from '../../shared/chats.js';\n\nexport const chatsCmd = new Command('chats').description('Manage chat sessions');\n\nchatsCmd\n .command('list')\n .description('Display existing chats')\n .action(async () => {\n try {\n const chats = await listChats();\n const defaultId = await getDefaultChatId();\n if (chats.length === 0) {\n console.log('No chats found.');\n return;\n }\n for (const id of chats) {\n const marker = id === defaultId ? ' *' : '';\n console.log(`- ${id}${marker}`);\n }\n } catch (err) {\n console.error('Failed to list chats:', err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nchatsCmd\n .command('add <id>')\n .description('Initialize a new chat')\n .action(async (id: string) => {\n try {\n await createChat(id);\n console.log(`Chat ${id} created successfully.`);\n } catch (err) {\n console.error('Failed to create chat:', err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nchatsCmd\n .command('delete <id>')\n .description('Remove a chat')\n .action(async (id: string) => {\n try {\n const defaultId = await getDefaultChatId();\n await deleteChat(id);\n console.log(`Chat ${id} deleted successfully.`);\n if (id === defaultId) {\n await setDefaultChatId(DEFAULT_CHAT_ID);\n console.log(`Default chat reset to default.`);\n }\n } catch (err) {\n console.error('Failed to delete chat:', err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\nchatsCmd\n .command('set-default <id>')\n .description('Update the workspace default chat')\n .action(async (id: string) => {\n try {\n await setDefaultChatId(id);\n console.log(`Default chat set to ${id}.`);\n } catch (err) {\n console.error(\n 'Failed to set default chat:',\n err instanceof Error ? err.message : String(err)\n );\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport {\n listAgents,\n getAgent,\n getAgentOverlay,\n writeAgentSettings,\n deleteAgent,\n isValidAgentId,\n refreshAgentTemplate,\n refreshAgentSkills,\n formatPlanActions,\n} from '../../shared/workspace.js';\nimport { type Agent } from '../../shared/config.js';\nimport { createAgentWithChat } from '../../shared/agent-utils.js';\nimport { handleError } from '../utils.js';\n\nexport const agentsCmd = new Command('agents').description('Manage agents');\n\nfunction parseEnv(envArray: string[] | undefined): Record<string, string> | undefined {\n if (!envArray || envArray.length === 0) return undefined;\n const env: Record<string, string> = {};\n for (const e of envArray) {\n const [key, ...rest] = e.split('=');\n if (key && rest.length >= 0) {\n env[key] = rest.join('=');\n }\n }\n return env;\n}\n\nfunction assertValidAgentId(id: string): void {\n if (!isValidAgentId(id)) {\n throw new Error(`Invalid agent ID: ${id}`);\n }\n}\n\nagentsCmd\n .command('list')\n .description('Display existing agents')\n .action(async () => {\n try {\n const agents = await listAgents();\n if (agents.length === 0) {\n console.log('No agents found.');\n return;\n }\n for (const id of agents) {\n console.log(`- ${id}`);\n }\n } catch (err) {\n handleError('list agents', err);\n }\n });\n\nagentsCmd\n .command('add <id>')\n .description('Create a new agent')\n .option('-d, --directory <dir>', 'Working directory for the agent')\n .option('-t, --template <name>', 'Template to use for the agent')\n .option(\n '-e, --env <env...>',\n 'Environment variables in KEY=VALUE format (can be specified multiple times)'\n )\n .option('--fork', 'Copy the template settings into the agent fully (legacy, no auto-update)')\n .option('--force', 'Overwrite existing files in the target directory on first install')\n .action(\n async (\n id: string,\n options: {\n directory?: string;\n template?: string;\n env?: string[];\n fork?: boolean;\n force?: boolean;\n }\n ) => {\n try {\n assertValidAgentId(id);\n const existing = await getAgentOverlay(id);\n if (existing) {\n throw new Error(`Agent ${id} already exists.`);\n }\n\n const agentData: Agent = {};\n\n if (options.directory) {\n agentData.directory = options.directory;\n }\n const env = parseEnv(options.env);\n if (env) {\n agentData.env = { ...(agentData.env || {}), ...env };\n }\n\n const applyOpts = {\n ...(options.fork ? { fork: true } : {}),\n ...(options.force ? { force: true } : {}),\n };\n await createAgentWithChat(id, agentData, options.template, process.cwd(), applyOpts);\n\n console.log(`Agent ${id} created successfully.`);\n } catch (err) {\n handleError('create agent', err);\n }\n }\n );\n\nagentsCmd\n .command('update <id>')\n .description('Update an existing agent')\n .option('-d, --directory <dir>', 'Working directory for the agent')\n .option(\n '-e, --env <env...>',\n 'Environment variables in KEY=VALUE format (can be specified multiple times)'\n )\n .action(async (id: string, options: { directory?: string; env?: string[] }) => {\n try {\n assertValidAgentId(id);\n const existing = await getAgentOverlay(id);\n if (!existing) {\n throw new Error(`Agent ${id} does not exist.`);\n }\n\n const agentData: Agent = { ...existing };\n\n if (options.directory !== undefined) {\n agentData.directory = options.directory;\n }\n\n const env = parseEnv(options.env);\n if (env) {\n agentData.env = { ...(agentData.env || {}), ...env };\n }\n\n await writeAgentSettings(id, agentData);\n console.log(`Agent ${id} updated successfully.`);\n } catch (err) {\n handleError('update agent', err);\n }\n });\n\nagentsCmd\n .command('delete <id>')\n .description('Remove an agent')\n .action(async (id: string) => {\n try {\n assertValidAgentId(id);\n const existing = await getAgentOverlay(id);\n if (!existing) {\n throw new Error(`Agent ${id} does not exist.`);\n }\n\n await deleteAgent(id);\n console.log(`Agent ${id} deleted successfully.`);\n } catch (err) {\n handleError('delete agent', err);\n }\n });\n\nagentsCmd\n .command('refresh <id>')\n .description(\"Refresh the agent's tracked template files against the installed clawmini\")\n .option('--accept', 'Overwrite files that have diverged from the recorded SHA')\n .option('--dry-run', 'Print the per-file plan without writing anything')\n .action(async (id: string, options: { accept?: boolean; dryRun?: boolean }) => {\n try {\n assertValidAgentId(id);\n const overlay = await getAgentOverlay(id);\n if (!overlay) {\n throw new Error(`Agent ${id} does not exist.`);\n }\n const refreshOpts = {\n ...(options.accept === undefined ? {} : { accept: options.accept }),\n ...(options.dryRun === undefined ? {} : { dryRun: options.dryRun }),\n };\n if (overlay.extends) {\n const plan = await refreshAgentTemplate(id, overlay, process.cwd(), refreshOpts);\n if (plan) {\n for (const line of formatPlanActions(plan)) console.log(line);\n }\n }\n\n const resolved = await getAgent(id);\n if (resolved) {\n const skillsPlan = await refreshAgentSkills(id, resolved, process.cwd(), refreshOpts);\n if (skillsPlan) {\n for (const line of formatPlanActions(skillsPlan)) console.log(line);\n }\n }\n } catch (err) {\n handleError('refresh agent', err);\n }\n });\n","import { Command } from 'commander';\nimport { getDaemonClient } from '../client.js';\nimport { getSocketPath } from '../../shared/workspace.js';\nimport { readSupervisorPid, removeSupervisorPid } from '../supervisor-pid.js';\nimport fs from 'node:fs';\n\nfunction isErrnoCode(err: unknown, code: string): boolean {\n return err instanceof Error && (err as NodeJS.ErrnoException).code === code;\n}\n\nasync function stopSupervisor(pid: number): Promise<void> {\n process.stdout.write(`Stopping clawmini supervisor (pid ${pid})`);\n try {\n process.kill(pid, 'SIGTERM');\n } catch (err) {\n if (isErrnoCode(err, 'ESRCH')) {\n process.stdout.write('\\nSupervisor already exited.\\n');\n return;\n }\n throw new Error(\n `Failed to signal supervisor: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err }\n );\n }\n\n // Poll until the process is gone or we time out. Must exceed the\n // supervisor's internal phase-2 timeout (60s for the daemon) so we don't\n // bail while it's still draining `down` hooks.\n const TIMEOUT_MS = 90_000;\n const deadline = Date.now() + TIMEOUT_MS;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 200));\n process.stdout.write('.');\n try {\n process.kill(pid, 0);\n } catch {\n process.stdout.write('\\nSuccessfully shut down clawmini supervisor.\\n');\n return;\n }\n }\n throw new Error(`Supervisor did not exit within ${TIMEOUT_MS / 1000} seconds.`);\n}\n\nexport const downCmd = new Command('down')\n .description('Stop the local clawmini supervisor or daemon')\n .action(async () => {\n const supPid = readSupervisorPid();\n if (supPid) {\n try {\n await stopSupervisor(supPid);\n return;\n } catch (err) {\n console.error('\\n', err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n }\n\n // No live supervisor — drop any stale pid file so future commands\n // aren't confused by it.\n removeSupervisorPid();\n\n try {\n const client = await getDaemonClient({ autoStart: false });\n process.stdout.write('Shutting down clawmini daemon...');\n await client.shutdown.mutate();\n\n const socketPath = getSocketPath();\n while (fs.existsSync(socketPath)) {\n await new Promise((resolve) => setTimeout(resolve, 200));\n process.stdout.write('.');\n }\n console.log('\\nSuccessfully shut down clawmini daemon.');\n } catch (err: unknown) {\n if (err instanceof Error && err.message === 'Daemon not running.') {\n console.log('Daemon is not running.');\n } else {\n console.error(\n '\\nFailed to shut down daemon:',\n err instanceof Error ? err.message : String(err)\n );\n process.exit(1);\n }\n }\n });\n","import { Command } from 'commander';\nimport { getDaemonClient } from '../client.js';\nimport {\n getAgent,\n getAgentOverlay,\n getPoliciesPath,\n getSocketPath,\n listAgents,\n refreshAgentTemplate,\n refreshAgentSkills,\n formatPlanActions,\n} from '../../shared/workspace.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { installBuiltinPolicies } from '../builtin-policies.js';\nimport { exportLiteToAllEnvironments } from '../../shared/lite.js';\n\n// resolvePolicies only exposes built-ins when a policies file exists, so a\n// fresh project needs an empty one for run-host etc. to be visible.\nexport function ensureDefaultPoliciesFile(): void {\n const policiesPath = getPoliciesPath();\n if (fs.existsSync(policiesPath)) return;\n fs.mkdirSync(path.dirname(policiesPath), { recursive: true });\n fs.writeFileSync(policiesPath, JSON.stringify({ policies: {} }, null, 2));\n}\n\ninterface DivergedAction {\n action: 'skip-diverged';\n relPath: string;\n reason: 'edited' | 'no-recorded-sha';\n}\n\nfunction logPlanWarnings(\n agentId: string,\n directory: string | undefined,\n actions: Array<{ action: string; relPath: string; reason?: string }>\n): void {\n const workdir = directory ?? agentId;\n for (const rawAction of actions) {\n if (rawAction.action !== 'skip-diverged') continue;\n const action = rawAction as DivergedAction;\n if (action.reason === 'edited') {\n console.warn(\n `./${path.join(workdir, action.relPath)} differs from template; skipping refresh. Run 'clawmini agents refresh ${agentId} --accept' to overwrite.`\n );\n } else if (action.reason === 'no-recorded-sha') {\n console.warn(\n `./${path.join(workdir, action.relPath)} has no recorded SHA; skipping. Run 'clawmini agents refresh ${agentId} --accept' to adopt the current file.`\n );\n }\n }\n}\n\n// Walk every agent and refresh its tracked files against the installed\n// clawmini. Workdir-template refresh requires `extends`; skill refresh runs\n// for any agent that hasn't opted out via `skillsDir: null`. Diverged files\n// are skipped with a warning. Returns the aggregated plan actions for\n// dry-run printing.\nexport async function refreshAllAgents(opts: { dryRun?: boolean } = {}): Promise<string[]> {\n const output: string[] = [];\n const agentIds = await listAgents();\n for (const agentId of agentIds) {\n let overlay;\n try {\n overlay = await getAgentOverlay(agentId);\n } catch (err) {\n console.warn(\n `Skipping refresh for agent '${agentId}': ${err instanceof Error ? err.message : String(err)}`\n );\n continue;\n }\n if (!overlay) continue;\n\n try {\n if (overlay.extends) {\n const plan = await refreshAgentTemplate(\n agentId,\n overlay,\n process.cwd(),\n opts.dryRun ? { dryRun: true } : {}\n );\n if (plan) {\n logPlanWarnings(agentId, overlay.directory, plan.actions);\n output.push(...formatPlanActions(plan, { agentId }));\n }\n }\n\n const resolved = await getAgent(agentId);\n if (resolved) {\n const skillsPlan = await refreshAgentSkills(\n agentId,\n resolved,\n process.cwd(),\n opts.dryRun ? { dryRun: true } : {}\n );\n if (skillsPlan) {\n logPlanWarnings(agentId, overlay.directory, skillsPlan.actions);\n output.push(...formatPlanActions(skillsPlan, { agentId }));\n }\n }\n } catch (err) {\n console.warn(\n `Failed to refresh agent '${agentId}': ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n return output;\n}\n\nexport const upCmd = new Command('up')\n .description('Start the local clawmini daemon server')\n .option('--dry-run', 'Print the per-file refresh plan without writing anything')\n .action(async (options: { dryRun?: boolean }) => {\n try {\n const socketPath = getSocketPath();\n const wasRunning = fs.existsSync(socketPath);\n\n if (options.dryRun) {\n const lines = await refreshAllAgents({ dryRun: true });\n if (lines.length === 0) {\n console.log('Dry run: no agents to refresh.');\n } else {\n for (const line of lines) console.log(line);\n }\n return;\n }\n\n await installBuiltinPolicies();\n ensureDefaultPoliciesFile();\n await exportLiteToAllEnvironments();\n await refreshAllAgents();\n\n const client = await getDaemonClient({ autoStart: true });\n // Perform a ping to ensure the server is responding\n await client.ping.query();\n\n if (wasRunning) {\n console.log('Daemon is already running.');\n } else {\n console.log('Successfully started clawmini daemon.');\n }\n } catch (err: unknown) {\n console.error('Failed to start daemon:', err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n","import type { ChildProcess } from 'node:child_process';\nimport { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport readline from 'node:readline';\nimport { fileURLToPath } from 'node:url';\n\nimport { getSocketPath } from '../shared/workspace.js';\n\nexport type ServiceName = 'daemon' | 'web' | 'adapter-discord' | 'adapter-google-chat';\n\nexport const DISPLAY_NAMES: Record<ServiceName, string> = {\n daemon: 'daemon',\n web: 'web',\n 'adapter-discord': 'discord',\n 'adapter-google-chat': 'google-chat',\n};\n\n// Adapters and the web UI are mostly stateless — give them a tight window.\n// The daemon runs `down` hooks (e.g. sandbox/container teardown) that can\n// legitimately take tens of seconds, so it needs much longer to drain.\nconst ADAPTER_TERMINATE_TIMEOUT_MS = 10_000;\nconst DAEMON_TERMINATE_TIMEOUT_MS = 60_000;\n\ninterface ResolvedCommand {\n command: string;\n args: string[];\n}\n\nexport function resolveServiceCommand(service: ServiceName): ResolvedCommand {\n const cliPath = fileURLToPath(import.meta.url);\n switch (service) {\n case 'daemon':\n return {\n command: process.execPath,\n args: [new URL('../daemon/index.mjs', import.meta.url).pathname],\n };\n case 'web':\n return { command: process.execPath, args: [cliPath, 'web'] };\n case 'adapter-discord':\n return {\n command: process.execPath,\n args: [new URL('../adapter-discord/index.mjs', import.meta.url).pathname],\n };\n case 'adapter-google-chat':\n return {\n command: process.execPath,\n args: [new URL('../adapter-google-chat/index.mjs', import.meta.url).pathname],\n };\n }\n}\n\nexport class Supervisor {\n private children = new Map<ServiceName, ChildProcess>();\n private logFds = new Map<ServiceName, number>();\n private shuttingDown = false;\n private restarting = new Set<ServiceName>();\n // Services that have ever been started in this supervisor's lifetime. Used\n // by restartAll() to know what to bring back after a stopAllChildren().\n // We don't remove entries when a service stops — a crash-and-restart of an\n // adapter shouldn't drop it from the \"originally enabled\" set.\n private enabledServices = new Set<ServiceName>();\n private readonly logDir: string;\n\n constructor(logDir: string) {\n this.logDir = logDir;\n if (!fs.existsSync(logDir)) fs.mkdirSync(logDir, { recursive: true });\n }\n\n async startService(service: ServiceName): Promise<void> {\n this.enabledServices.add(service);\n const { command, args } = resolveServiceCommand(service);\n const logPath = path.join(this.logDir, `${service}.log`);\n const logFd = fs.openSync(logPath, 'a');\n this.logFds.set(service, logFd);\n\n fs.writeSync(\n logFd,\n `\\n--- clawmini serve: ${service} starting at ${new Date().toISOString()} ---\\n`\n );\n\n const child = spawn(command, args, {\n stdio: ['ignore', 'pipe', 'pipe'],\n env: process.env,\n cwd: process.cwd(),\n });\n\n this.children.set(service, child);\n this.attachPipe(service, child.stdout!, logFd, 'stdout');\n this.attachPipe(service, child.stderr!, logFd, 'stderr');\n\n child.on('exit', (code, signal) => {\n const msg = `exited code=${code} signal=${signal}`;\n process.stderr.write(`[${DISPLAY_NAMES[service]}] ${msg}\\n`);\n try {\n fs.writeSync(logFd, `--- ${msg} at ${new Date().toISOString()} ---\\n`);\n fs.closeSync(logFd);\n } catch {\n // best-effort\n }\n this.logFds.delete(service);\n this.children.delete(service);\n\n if (service === 'daemon' && !this.shuttingDown && !this.restarting.has('daemon')) {\n process.stderr.write('[supervisor] daemon exited unexpectedly — shutting down\\n');\n void this.shutdown(1);\n }\n });\n }\n\n private attachPipe(\n service: ServiceName,\n stream: NodeJS.ReadableStream,\n logFd: number,\n kind: 'stdout' | 'stderr'\n ): void {\n const prefix = `[${DISPLAY_NAMES[service]}] `;\n const target = kind === 'stderr' ? process.stderr : process.stdout;\n const rl = readline.createInterface({ input: stream });\n rl.on('line', (line) => {\n try {\n fs.writeSync(logFd, line + '\\n');\n } catch {\n // best-effort: logs on disk are not critical\n }\n target.write(prefix + line + '\\n');\n });\n }\n\n async waitForDaemonSocket(timeoutMs = 10_000): Promise<void> {\n const socketPath = getSocketPath();\n const start = Date.now();\n while (Date.now() - start < timeoutMs) {\n if (fs.existsSync(socketPath)) return;\n if (!this.children.has('daemon')) {\n throw new Error('Daemon exited before socket became available.');\n }\n await new Promise((r) => setTimeout(r, 100));\n }\n throw new Error(`Daemon did not start within ${timeoutMs}ms`);\n }\n\n async shutdown(exitCode = 0): Promise<void> {\n if (this.shuttingDown) return;\n this.shuttingDown = true;\n process.stderr.write('\\n[supervisor] shutting down...\\n');\n\n await this.stopAllChildren();\n\n process.exit(exitCode);\n }\n\n /**\n * Stop all children and close log fds without exiting the process. Used by\n * `/upgrade`, which needs to tear down everything, run an install, then\n * launch a fresh supervisor.\n */\n async stopAllChildren(): Promise<void> {\n // Phase 1: stop adapters and the web UI in parallel. They depend on the\n // daemon, so taking them down first lets the daemon's `down` hooks run\n // without interference from disconnect noise.\n const adapterStops: Promise<void>[] = [];\n for (const [name, child] of this.children) {\n if (name === 'daemon') continue;\n adapterStops.push(Supervisor.terminateChild(name, child, ADAPTER_TERMINATE_TIMEOUT_MS));\n }\n await Promise.allSettled(adapterStops);\n\n // Phase 2: stop the daemon with a generous timeout so its `down` hooks\n // (sandbox/container teardown) can complete.\n const daemonChild = this.children.get('daemon');\n if (daemonChild) {\n await Supervisor.terminateChild('daemon', daemonChild, DAEMON_TERMINATE_TIMEOUT_MS);\n }\n\n for (const fd of this.logFds.values()) {\n try {\n fs.closeSync(fd);\n } catch {\n // best-effort\n }\n }\n this.logFds.clear();\n }\n\n /**\n * Bounce every service that has ever been started under this supervisor.\n * Daemon goes down with the adapters, then comes back first so the\n * adapters can re-establish their tRPC subscriptions to the new daemon.\n *\n * This is what `/restart` and the `/upgrade` failure recovery paths call:\n * just bouncing the daemon would leave adapter-discord (and any other\n * adapter) holding a dead subscription, so outbound messages would never\n * reach the chat. The user-visible symptom was \"I send /restart and then\n * the daemon's reply never shows up in Discord.\"\n */\n async restartAll(): Promise<void> {\n if (this.shuttingDown) return;\n // Suppress the daemon's unexpected-exit guard while we tear it down.\n this.restarting.add('daemon');\n try {\n await this.stopAllChildren();\n // Wait for the exit handlers to drain bookkeeping.\n await new Promise((r) => setImmediate(r));\n\n if (this.enabledServices.has('daemon')) {\n await this.startService('daemon');\n await this.waitForDaemonSocket();\n }\n for (const name of this.enabledServices) {\n if (name === 'daemon') continue;\n await this.startService(name);\n }\n } finally {\n this.restarting.delete('daemon');\n }\n }\n\n /**\n * Stop and re-spawn a single service. The exit handler is suppressed so a\n * restarted daemon doesn't trigger a full shutdown.\n */\n async restartService(service: ServiceName): Promise<void> {\n if (this.shuttingDown) return;\n this.restarting.add(service);\n try {\n const child = this.children.get(service);\n if (child) {\n const timeoutMs =\n service === 'daemon' ? DAEMON_TERMINATE_TIMEOUT_MS : ADAPTER_TERMINATE_TIMEOUT_MS;\n await Supervisor.terminateChild(service, child, timeoutMs);\n }\n // Wait until the exit handler has cleared bookkeeping. The handler runs\n // synchronously on the same tick as `exit`, so a microtask hop is enough.\n await new Promise((r) => setImmediate(r));\n await this.startService(service);\n if (service === 'daemon') {\n await this.waitForDaemonSocket();\n }\n } finally {\n this.restarting.delete(service);\n }\n }\n\n private static terminateChild(\n name: ServiceName,\n child: ChildProcess,\n timeoutMs: number\n ): Promise<void> {\n return new Promise((resolve) => {\n if (child.exitCode !== null || child.signalCode !== null) {\n resolve();\n return;\n }\n const timer = setTimeout(() => {\n process.stderr.write(\n `[supervisor] ${name} did not exit in ${Math.round(timeoutMs / 1000)}s, sending SIGKILL\\n`\n );\n try {\n child.kill('SIGKILL');\n } catch {\n // ignore\n }\n }, timeoutMs);\n child.once('exit', () => {\n clearTimeout(timer);\n resolve();\n });\n try {\n child.kill('SIGTERM');\n } catch {\n clearTimeout(timer);\n resolve();\n }\n });\n }\n}\n","import { Command } from 'commander';\nimport { spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport net from 'node:net';\nimport path from 'node:path';\n\nimport { getClawminiDir, getSocketPath } from '../../shared/workspace.js';\nimport { installBuiltinPolicies } from '../builtin-policies.js';\nimport { exportLiteToAllEnvironments } from '../../shared/lite.js';\nimport { ensureDefaultPoliciesFile, refreshAllAgents } from './up.js';\nimport { getDiscordConfigPath } from '../../adapter-discord/config.js';\nimport { getGoogleChatConfigPath } from '../../adapter-google-chat/config.js';\nimport { startSupervisorControl } from '../supervisor-actions.js';\nimport { getControlSocketPath } from '../supervisor-control.js';\nimport {\n getSupervisorPidPath,\n readSupervisorPid,\n removeSupervisorPid,\n writeSupervisorPid,\n} from '../supervisor-pid.js';\nimport { Supervisor, type ServiceName } from '../supervisor.js';\n\nconst ALL_SERVICES: ServiceName[] = ['daemon', 'web', 'adapter-discord', 'adapter-google-chat'];\n\nconst SERVICE_ALIASES: Record<string, ServiceName> = {\n daemon: 'daemon',\n web: 'web',\n discord: 'adapter-discord',\n 'adapter-discord': 'adapter-discord',\n 'google-chat': 'adapter-google-chat',\n 'adapter-google-chat': 'adapter-google-chat',\n};\n\ninterface ResolveInput {\n only?: string | undefined;\n exclude?: string | undefined;\n adapterConfigPresent?: Partial<Record<ServiceName, boolean>> | undefined;\n}\n\n// Exported for unit tests.\nexport function resolveEnabledServices(opts: ResolveInput): ServiceName[] {\n const parseList = (csv: string | undefined): ServiceName[] => {\n if (!csv) return [];\n const names = csv\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n return names.map((name) => {\n const resolved = SERVICE_ALIASES[name];\n if (!resolved) {\n throw new Error(\n `Unknown service: '${name}'. Valid: ${Object.keys(SERVICE_ALIASES).join(', ')}`\n );\n }\n return resolved;\n });\n };\n\n const configPresent: Record<ServiceName, boolean> = {\n daemon: true,\n web: true,\n 'adapter-discord': false,\n 'adapter-google-chat': false,\n ...(opts.adapterConfigPresent ?? {}),\n };\n\n const excluded = new Set(parseList(opts.exclude));\n\n const only = parseList(opts.only);\n if (only.length > 0) {\n return only.filter((n) => !excluded.has(n));\n }\n\n return ALL_SERVICES.filter((n) => configPresent[n] && !excluded.has(n));\n}\n\nasync function runPreStart(): Promise<void> {\n await installBuiltinPolicies();\n ensureDefaultPoliciesFile();\n await exportLiteToAllEnvironments();\n await refreshAllAgents();\n}\n\ninterface ServeOptions {\n detach?: boolean;\n only?: string;\n exclude?: string;\n}\n\nasync function runForeground(enabled: ServiceName[]): Promise<void> {\n const logDir = path.join(getClawminiDir(), 'logs');\n const supervisor = new Supervisor(logDir);\n\n writeSupervisorPid(process.pid);\n process.on('exit', () => {\n removeSupervisorPid();\n try {\n fs.unlinkSync(getControlSocketPath());\n } catch {\n // best-effort cleanup\n }\n });\n\n const onSignal = () => {\n void supervisor.shutdown(0);\n };\n process.on('SIGINT', onSignal);\n process.on('SIGTERM', onSignal);\n\n if (enabled.includes('daemon')) {\n process.stderr.write('[supervisor] starting daemon...\\n');\n await supervisor.startService('daemon');\n await supervisor.waitForDaemonSocket();\n process.stderr.write('[supervisor] daemon ready\\n');\n }\n\n for (const name of enabled) {\n if (name === 'daemon') continue;\n await supervisor.startService(name);\n }\n\n startSupervisorControl(supervisor);\n\n process.stderr.write(`[supervisor] running: ${enabled.join(', ')}\\n`);\n process.stderr.write(\"[supervisor] press Ctrl-C to stop (or run 'clawmini down' elsewhere)\\n\");\n}\n\nfunction isSocketLive(socketPath: string): Promise<boolean> {\n return new Promise((resolve) => {\n const client = net.createConnection({ path: socketPath });\n client.on('connect', () => {\n client.destroy();\n resolve(true);\n });\n client.on('error', () => resolve(false));\n });\n}\n\nfunction printSupervisorLogTail(supLog: string, fromOffset: number): void {\n if (!fs.existsSync(supLog)) return;\n const size = fs.statSync(supLog).size;\n if (size <= fromOffset) return;\n const fd = fs.openSync(supLog, 'r');\n try {\n const len = size - fromOffset;\n const buf = Buffer.alloc(len);\n fs.readSync(fd, buf, 0, len, fromOffset);\n const text = buf.toString('utf-8');\n process.stderr.write('--- supervisor.log ---\\n');\n process.stderr.write(text);\n if (!text.endsWith('\\n')) process.stderr.write('\\n');\n } finally {\n fs.closeSync(fd);\n }\n}\n\nasync function runDetached(args: string[]): Promise<never> {\n const clawDir = getClawminiDir();\n const logDir = path.join(clawDir, 'logs');\n if (!fs.existsSync(logDir)) fs.mkdirSync(logDir, { recursive: true });\n const supLog = path.join(logDir, 'supervisor.log');\n const supLogOffset = fs.existsSync(supLog) ? fs.statSync(supLog).size : 0;\n const outFd = fs.openSync(supLog, 'a');\n\n // Drop any stale pid file so we can detect the new child writing one.\n removeSupervisorPid();\n\n const childArgs = args.filter((a) => a !== '--detach' && a !== '-d');\n const child = spawn(process.execPath, childArgs, {\n detached: true,\n stdio: ['ignore', outFd, outFd],\n cwd: process.cwd(),\n env: process.env,\n });\n child.unref();\n fs.closeSync(outFd);\n\n const pidPath = getSupervisorPidPath();\n const socketPath = getSocketPath();\n const STARTUP_TIMEOUT_MS = 30_000;\n const deadline = Date.now() + STARTUP_TIMEOUT_MS;\n while (Date.now() < deadline) {\n if (child.exitCode !== null || child.signalCode !== null) {\n console.error(\n `clawmini serve exited during startup (code=${child.exitCode}, signal=${child.signalCode}).`\n );\n printSupervisorLogTail(supLog, supLogOffset);\n process.exit(1);\n }\n if (fs.existsSync(pidPath) && fs.existsSync(socketPath)) {\n console.log(`Started clawmini supervisor in background (pid ${child.pid}).`);\n console.log(` Logs: clawmini logs -f`);\n console.log(` Stop: clawmini down`);\n process.exit(0);\n }\n await new Promise((r) => setTimeout(r, 100));\n }\n\n console.error(`clawmini serve did not become ready within ${STARTUP_TIMEOUT_MS / 1000}s.`);\n printSupervisorLogTail(supLog, supLogOffset);\n process.exit(1);\n}\n\nexport const serveCmd = new Command('serve')\n .description('Run daemon, web UI, and configured adapters under one supervisor')\n .option('-d, --detach', 'Run in the background; logs go to .clawmini/logs/')\n .option('--only <services>', 'Comma-separated subset to run (daemon,web,discord,google-chat)')\n .option('--exclude <services>', 'Comma-separated services to skip')\n .action(async (options: ServeOptions) => {\n const clawDir = getClawminiDir();\n if (!fs.existsSync(clawDir)) {\n console.error(`Not a clawmini workspace (no ${clawDir}). Run 'clawmini init' first.`);\n process.exit(1);\n }\n\n const existingSupervisorPid = readSupervisorPid();\n if (existingSupervisorPid) {\n console.error(\n `clawmini serve is already running (pid ${existingSupervisorPid}). Run 'clawmini down' to stop it.`\n );\n process.exit(1);\n }\n\n const socketPath = getSocketPath();\n if (fs.existsSync(socketPath)) {\n if (await isSocketLive(socketPath)) {\n console.error(\n \"A clawmini daemon is already running (socket present). Run 'clawmini down' before 'clawmini serve'.\"\n );\n process.exit(1);\n }\n // Socket file is left over from a crashed/killed daemon — remove it\n // so we can bind cleanly.\n try {\n fs.unlinkSync(socketPath);\n process.stderr.write(`[supervisor] removed stale socket at ${socketPath}\\n`);\n } catch (err) {\n console.error(\n `Failed to remove stale socket at ${socketPath}: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n }\n\n let enabled: ServiceName[];\n try {\n enabled = resolveEnabledServices({\n only: options.only,\n exclude: options.exclude,\n adapterConfigPresent: {\n 'adapter-discord': fs.existsSync(getDiscordConfigPath()),\n 'adapter-google-chat': fs.existsSync(getGoogleChatConfigPath()),\n },\n });\n } catch (err) {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n\n if (enabled.length === 0) {\n console.error('No services selected. Check --only/--exclude.');\n process.exit(1);\n }\n\n if (options.detach) {\n await runDetached(process.argv.slice(1));\n return;\n }\n\n try {\n await runPreStart();\n } catch (err) {\n console.error('Pre-start setup failed:', err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n\n try {\n await runForeground(enabled);\n } catch (err) {\n console.error('Failed to start services:', err instanceof Error ? err.message : String(err));\n removeSupervisorPid();\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { getClawminiDir } from '../../shared/workspace.js';\n\nconst SERVICE_ALIASES: Record<string, string> = {\n daemon: 'daemon',\n web: 'web',\n discord: 'adapter-discord',\n 'adapter-discord': 'adapter-discord',\n 'google-chat': 'adapter-google-chat',\n 'adapter-google-chat': 'adapter-google-chat',\n supervisor: 'supervisor',\n};\n\nfunction displayNameFor(logBase: string): string {\n if (logBase.startsWith('adapter-')) return logBase.slice('adapter-'.length);\n return logBase;\n}\n\nfunction tailString(content: string, n: number): string[] {\n const lines = content.split('\\n');\n if (lines.length > 0 && lines[lines.length - 1] === '') lines.pop();\n return lines.slice(-n);\n}\n\ninterface LogsOptions {\n follow?: boolean;\n service?: string;\n lines?: string;\n}\n\nexport const logsCmd = new Command('logs')\n .description('View logs from clawmini services (daemon, web, adapters)')\n .option('-f, --follow', 'Follow the logs as new lines are written')\n .option(\n '-s, --service <name>',\n 'Restrict to one service: daemon, web, discord, google-chat, supervisor'\n )\n .option('-n, --lines <count>', 'Number of lines to show from the tail of each file', '50')\n .action(async (options: LogsOptions) => {\n const logDir = path.join(getClawminiDir(), 'logs');\n if (!fs.existsSync(logDir)) {\n console.error(`No log directory at ${logDir}. Start the supervisor with 'clawmini serve'.`);\n process.exit(1);\n }\n\n let targets: string[];\n if (options.service) {\n const resolved = SERVICE_ALIASES[options.service];\n if (!resolved) {\n console.error(\n `Unknown service '${options.service}'. Valid: ${Object.keys(SERVICE_ALIASES).join(', ')}`\n );\n process.exit(1);\n }\n targets = [`${resolved}.log`];\n } else {\n targets = fs.readdirSync(logDir).filter((f) => f.endsWith('.log'));\n }\n\n const linesCount = Math.max(0, parseInt(options.lines ?? '50', 10) || 50);\n\n for (const file of targets) {\n const full = path.join(logDir, file);\n if (!fs.existsSync(full)) continue;\n const prefix = `[${displayNameFor(file.replace(/\\.log$/, ''))}] `;\n const content = fs.readFileSync(full, 'utf-8');\n for (const line of tailString(content, linesCount)) {\n process.stdout.write(prefix + line + '\\n');\n }\n }\n\n if (!options.follow) return;\n\n const watched: Array<{ file: string; full: string; prefix: string; position: number }> = [];\n for (const file of targets) {\n const full = path.join(logDir, file);\n const prefix = `[${displayNameFor(file.replace(/\\.log$/, ''))}] `;\n const position = fs.existsSync(full) ? fs.statSync(full).size : 0;\n watched.push({ file, full, prefix, position });\n fs.watchFile(full, { interval: 500 }, (curr) => {\n const entry = watched.find((w) => w.full === full);\n if (!entry) return;\n if (curr.size < entry.position) {\n entry.position = 0;\n }\n if (curr.size > entry.position) {\n const fd = fs.openSync(full, 'r');\n const buf = Buffer.alloc(curr.size - entry.position);\n fs.readSync(fd, buf, 0, buf.length, entry.position);\n fs.closeSync(fd);\n entry.position = curr.size;\n\n const text = buf.toString();\n const lines = text.split('\\n');\n if (lines.length > 0 && lines[lines.length - 1] === '') lines.pop();\n for (const line of lines) {\n process.stdout.write(entry.prefix + line + '\\n');\n }\n }\n });\n }\n\n const stop = () => {\n for (const entry of watched) fs.unwatchFile(entry.full);\n process.exit(0);\n };\n process.on('SIGINT', stop);\n process.on('SIGTERM', stop);\n\n await new Promise<void>(() => {\n /* intentionally unresolved; signals drive termination */\n });\n });\n","import http from 'node:http';\nimport { type ZodType } from 'zod';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport async function parseJsonBody<T = any>(\n req: http.IncomingMessage,\n schema?: ZodType<T>\n): Promise<T> {\n if (req.headers['content-type'] !== 'application/json') {\n throw new Error('Invalid Content-Type');\n }\n let bodyStr = '';\n for await (const chunk of req) {\n bodyStr += chunk;\n }\n const rawBody = JSON.parse(bodyStr);\n if (schema) {\n return schema.parse(rawBody);\n }\n return rawBody as T;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function sendJsonResponse(res: http.ServerResponse, statusCode: number, data: any) {\n res.writeHead(statusCode, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify(data));\n}\n","import http from 'node:http';\nimport { z } from 'zod';\nimport {\n listAgents,\n getAgent,\n getAgentOverlay,\n writeAgentSettings,\n deleteAgent,\n isValidAgentId,\n} from '../../../shared/workspace.js';\nimport { parseJsonBody, sendJsonResponse } from './utils.js';\n\nexport async function handleApiAgents(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n urlPath: string\n) {\n if (req.method === 'GET' && urlPath === '/api/agents') {\n const agentIds = await listAgents();\n const agents = [];\n for (const id of agentIds) {\n try {\n const agent = await getAgent(id);\n if (agent) {\n agents.push({ id, ...agent });\n }\n } catch (err: unknown) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n console.error(`Failed to load agent ${id}: ${errorMessage}`);\n agents.push({ id, error: errorMessage });\n }\n }\n sendJsonResponse(res, 200, agents);\n return true;\n }\n\n if (req.method === 'POST' && urlPath === '/api/agents') {\n try {\n const schema = z.object({\n id: z.string().refine(isValidAgentId, { message: 'Invalid agent ID' }),\n directory: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n commands: z.record(z.string(), z.string()).optional(),\n });\n\n const body = await parseJsonBody(req, schema);\n\n const existing = await getAgentOverlay(body.id);\n if (existing) {\n sendJsonResponse(res, 409, { error: 'Agent already exists' });\n return true;\n }\n\n const newAgent = {\n directory: body.directory,\n env: body.env || {},\n commands: body.commands || {},\n };\n\n try {\n await writeAgentSettings(body.id, newAgent);\n } catch (err) {\n sendJsonResponse(res, 400, {\n error: err instanceof Error ? err.message : 'Invalid agent directory',\n });\n return true;\n }\n\n sendJsonResponse(res, 201, { id: body.id, ...newAgent });\n } catch {\n sendJsonResponse(res, 500, { error: 'Failed to create agent' });\n }\n return true;\n }\n\n const agentMatch = urlPath.match(/^\\/api\\/agents\\/([^/]+)$/);\n if (agentMatch && agentMatch[1]) {\n const agentId = agentMatch[1];\n\n if (!isValidAgentId(agentId)) {\n sendJsonResponse(res, 400, { error: 'Invalid agent ID' });\n return true;\n }\n\n if (req.method === 'GET') {\n try {\n const agent = await getAgent(agentId);\n if (!agent) {\n sendJsonResponse(res, 404, { error: 'Agent not found' });\n return true;\n }\n sendJsonResponse(res, 200, { id: agentId, ...agent });\n } catch (err: unknown) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n sendJsonResponse(res, 500, { error: errorMessage });\n }\n return true;\n }\n\n if (req.method === 'PUT' || req.method === 'POST') {\n try {\n const schema = z.object({\n directory: z.string().optional(),\n env: z.record(z.string(), z.string()).optional(),\n commands: z.record(z.string(), z.string()).optional(),\n });\n\n const body = await parseJsonBody(req, schema);\n\n const agent = (await getAgentOverlay(agentId)) || {};\n if (body.directory !== undefined) agent.directory = body.directory;\n if (body.env !== undefined) agent.env = body.env;\n if (body.commands !== undefined) agent.commands = body.commands;\n\n try {\n await writeAgentSettings(agentId, agent);\n } catch (err) {\n sendJsonResponse(res, 400, {\n error: err instanceof Error ? err.message : 'Invalid agent directory',\n });\n return true;\n }\n\n sendJsonResponse(res, 200, { id: agentId, ...agent });\n } catch {\n sendJsonResponse(res, 500, { error: 'Failed to update agent' });\n }\n return true;\n }\n\n if (req.method === 'DELETE') {\n await deleteAgent(agentId);\n sendJsonResponse(res, 200, { success: true });\n return true;\n }\n }\n\n return false;\n}\n","import http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport {\n listChats,\n getMessages,\n getChatsDir,\n createChat,\n isValidChatId,\n} from '../../../shared/chats.js';\nimport { writeChatSettings } from '../../../shared/workspace.js';\nimport { getDaemonClient } from '../../client.js';\nimport { parseJsonBody, sendJsonResponse } from './utils.js';\n\nexport async function handleApiChats(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n urlPath: string\n) {\n if (req.method === 'GET' && urlPath === '/api/chats') {\n const chats = await listChats();\n sendJsonResponse(res, 200, chats);\n return true;\n }\n\n if (req.method === 'POST' && urlPath === '/api/chats') {\n try {\n const schema = z.object({\n id: z.string().refine(isValidChatId, {\n message: 'Invalid chat ID. Must be alphanumeric with dashes or underscores.',\n }),\n agent: z.string().optional(),\n });\n\n const body = await parseJsonBody(req, schema);\n\n await createChat(body.id);\n if (body.agent) {\n await writeChatSettings(body.id, { defaultAgent: body.agent });\n }\n sendJsonResponse(res, 201, { id: body.id, agent: body.agent });\n } catch {\n sendJsonResponse(res, 500, { error: 'Failed to create chat' });\n }\n return true;\n }\n\n const chatMatch = urlPath.match(/^\\/api\\/chats\\/([^/]+)$/);\n if (req.method === 'GET' && chatMatch && chatMatch[1]) {\n const chatId = chatMatch[1];\n try {\n const url = new URL(req.url || '', `http://${req.headers.host}`);\n const since = url.searchParams.get('since');\n const before = url.searchParams.get('before');\n const limitParam = url.searchParams.get('limit');\n const parsedLimit = limitParam ? parseInt(limitParam, 10) : undefined;\n const limit = Number.isNaN(parsedLimit) ? undefined : parsedLimit;\n\n let messages = await getMessages(chatId, limit, undefined, undefined, before || undefined);\n\n if (since) {\n const sinceIndex = messages.findIndex((m) => m.id === since);\n if (sinceIndex !== -1) {\n messages = messages.slice(sinceIndex + 1);\n }\n }\n\n sendJsonResponse(res, 200, messages);\n } catch {\n sendJsonResponse(res, 404, { error: 'Chat not found' });\n }\n return true;\n }\n\n const streamMatch = urlPath.match(/^\\/api\\/chats\\/([^/]+)\\/stream$/);\n if (req.method === 'GET' && streamMatch && streamMatch[1]) {\n const chatId = streamMatch[1];\n\n res.setHeader('Content-Type', 'text/event-stream');\n res.setHeader('Cache-Control', 'no-cache');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.flushHeaders();\n\n const chatsDir = await getChatsDir();\n const chatFile = path.join(chatsDir, chatId, 'chat.jsonl');\n\n if (!fs.existsSync(chatFile)) {\n await createChat(chatId);\n }\n\n let currentSize = fs.statSync(chatFile).size;\n\n const watcher = fs.watch(chatFile, (eventType) => {\n if (eventType === 'change') {\n try {\n const stat = fs.statSync(chatFile);\n if (stat.size > currentSize) {\n const stream = fs.createReadStream(chatFile, {\n start: currentSize,\n end: stat.size - 1,\n });\n currentSize = stat.size;\n\n let buffer = '';\n stream.on('data', (chunk) => {\n buffer += chunk.toString();\n const parts = buffer.split('\\n');\n buffer = parts.pop() || '';\n for (const line of parts) {\n if (line.trim()) {\n res.write(`data: ${line}\\n\\n`);\n }\n }\n });\n stream.on('end', () => {\n if (buffer.trim()) {\n res.write(`data: ${buffer}\\n\\n`);\n }\n });\n }\n } catch {\n // File might be temporarily inaccessible\n }\n }\n });\n\n req.on('close', () => {\n watcher.close();\n });\n\n // Send an initial ping to establish connection\n res.write(': connected\\n\\n');\n return true;\n }\n\n const messageMatch = urlPath.match(/^\\/api\\/chats\\/([^/]+)\\/messages$/);\n if (req.method === 'POST' && messageMatch && messageMatch[1]) {\n const chatId = messageMatch[1];\n\n const schema = z.object({\n message: z.string().min(1, 'Missing or invalid \"message\" field'),\n });\n\n let body;\n try {\n body = await parseJsonBody(req, schema);\n } catch (err) {\n sendJsonResponse(res, 400, {\n error: err instanceof Error ? err.message : 'Invalid request',\n });\n return true;\n }\n\n try {\n const client = await getDaemonClient();\n await client.sendMessage.mutate({\n type: 'send-message',\n client: 'cli',\n data: {\n message: body.message,\n chatId,\n noWait: true,\n },\n });\n sendJsonResponse(res, 200, { success: true });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n sendJsonResponse(res, 500, { error: errorMessage || 'Internal Server Error' });\n }\n return true;\n }\n\n const cronMatch = urlPath.match(/^\\/api\\/chats\\/([^/]+)\\/cron(?:\\/([^/]+))?$/);\n if (cronMatch && cronMatch[1]) {\n const chatId = cronMatch[1];\n const jobId = cronMatch[2]; // undefined if not present\n\n if (req.method === 'GET') {\n try {\n const client = await getDaemonClient();\n const jobs = await client.listCronJobs.query({ chatId });\n sendJsonResponse(res, 200, jobs);\n } catch {\n sendJsonResponse(res, 500, { error: 'Failed to list cron jobs' });\n }\n return true;\n }\n\n if (req.method === 'POST') {\n try {\n const client = await getDaemonClient();\n const body = await parseJsonBody(req);\n await client.addCronJob.mutate({ chatId, job: body });\n sendJsonResponse(res, 201, { success: true });\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Unknown error';\n sendJsonResponse(res, 500, { error: errorMessage || 'Failed to add cron job' });\n }\n return true;\n }\n\n if (req.method === 'DELETE' && jobId) {\n try {\n const client = await getDaemonClient();\n await client.deleteCronJob.mutate({ chatId, id: jobId });\n sendJsonResponse(res, 200, { success: true });\n } catch {\n sendJsonResponse(res, 500, { error: 'Failed to delete cron job' });\n }\n return true;\n }\n }\n\n return false;\n}\n","import { Command } from 'commander';\nimport http from 'node:http';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { pathIsInsideDir } from '../../shared/utils/fs.js';\nimport { sendJsonResponse } from './web-api/utils.js';\nimport { handleApiAgents } from './web-api/agents.js';\nimport { handleApiChats } from './web-api/chats.js';\n\nconst mimeTypes: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'text/javascript',\n '.mjs': 'text/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n};\n\nexport const webCmd = new Command('web')\n .description('Start the local clawmini web interface')\n .option('-p, --port <number>', 'Port to bind the server to', '8080')\n .option('-H, --host <string>', 'Host to bind the server to', '127.0.0.1')\n .action((options) => {\n const port = parseInt(options.port, 10);\n if (isNaN(port)) {\n console.error('Invalid port number.');\n process.exit(1);\n }\n\n // When bundled into dist/cli/index.mjs, import.meta.url resolves to that file.\n // So __dirname will be dist/cli, and webDir will be dist/web.\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = path.dirname(__filename);\n const webDir = path.resolve(__dirname, '../web');\n\n const server = http.createServer(async (req, res) => {\n try {\n const urlPath = req.url === '/' ? '/index.html' : req.url?.split('?')[0] || '/';\n\n // API Routes\n if (urlPath.startsWith('/api/')) {\n res.setHeader('Content-Type', 'application/json');\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');\n res.setHeader('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.writeHead(204);\n res.end();\n return;\n }\n\n if (urlPath.startsWith('/api/agents') && (await handleApiAgents(req, res, urlPath)))\n return;\n if (urlPath.startsWith('/api/chats') && (await handleApiChats(req, res, urlPath))) return;\n\n sendJsonResponse(res, 404, { error: 'Not Found' });\n return;\n }\n\n // Static Files\n let filePath = path.join(webDir, urlPath);\n\n // Prevent directory traversal\n if (!pathIsInsideDir(filePath, webDir)) {\n res.writeHead(403);\n res.end('Forbidden');\n return;\n }\n\n if (!fs.existsSync(filePath) || fs.statSync(filePath).isDirectory()) {\n // SPA fallback to index.html\n filePath = path.join(webDir, 'index.html');\n if (!fs.existsSync(filePath)) {\n res.writeHead(404);\n res.end('Not Found');\n return;\n }\n }\n\n const extname = path.extname(filePath).toLowerCase();\n const contentType = mimeTypes[extname] || 'application/octet-stream';\n\n res.writeHead(200, { 'Content-Type': contentType });\n const readStream = fs.createReadStream(filePath);\n readStream.pipe(res);\n } catch (err) {\n console.error('Error serving request:', err);\n res.writeHead(500);\n res.end('Internal Server Error');\n }\n });\n\n server.listen(port, options.host, () => {\n console.log(`Clawmini web interface running at http://${options.host}:${port}/`);\n });\n });\n","import { Command } from 'commander';\nimport { getDaemonClient } from '../client.js';\nimport type { CronJob } from '../../shared/config.js';\n\nexport const jobsCmd = new Command('jobs').description('Manage background jobs');\n\nfunction parseKeyValueArray(arr: string[] | undefined): Record<string, string> | undefined {\n if (!arr || arr.length === 0) return undefined;\n const result: Record<string, string> = {};\n for (const item of arr) {\n const [key, ...rest] = item.split('=');\n if (key && rest.length >= 0) {\n result[key] = rest.join('=');\n }\n }\n return result;\n}\n\nfunction handleError(action: string, err: unknown): never {\n console.error(`Failed to ${action}:`, err instanceof Error ? err.message : String(err));\n process.exit(1);\n}\n\njobsCmd\n .command('list')\n .description('Display existing jobs')\n .option('-c, --chat <id>', 'Specific chat to list jobs from')\n .option('--json', 'Output full JSON for each job')\n .action(async (options) => {\n try {\n const trpc = await getDaemonClient();\n let jobs = await trpc.listCronJobs.query({ chatId: options.chat });\n\n jobs = jobs.sort((a, b) => {\n const timeA = a.createdAt ? new Date(a.createdAt).getTime() : 0;\n const timeB = b.createdAt ? new Date(b.createdAt).getTime() : 0;\n return timeA - timeB;\n });\n\n if (options.json) {\n console.log(JSON.stringify(jobs, null, 2));\n return;\n }\n\n if (jobs.length === 0) {\n console.log('No jobs found.');\n return;\n }\n for (const job of jobs) {\n let schedule = '';\n if ('cron' in job.schedule) schedule = `cron: ${job.schedule.cron}`;\n else if ('every' in job.schedule) schedule = `every: ${job.schedule.every}`;\n else if ('at' in job.schedule) schedule = `at: ${job.schedule.at}`;\n\n console.log(`- ${job.id} (${schedule})`);\n }\n } catch (err) {\n handleError('list jobs', err);\n }\n });\n\njobsCmd\n .command('add <name>')\n .description('Create a new job')\n .option('-m, --message <text>', 'The message to send', '')\n .option('-r, --reply <text>', 'An immediate reply to append')\n .option(\n '--at <time-or-interval>',\n 'Execute once at this UTC time or after an interval (e.g., 2m, 4h)'\n )\n .option('--every <duration>', 'Execute repeatedly at this interval (e.g., 20m, 4h)')\n .option('--cron <expression>', 'Execute according to the crontab expression')\n .option('-a, --agent <agentid>', 'Agent to use')\n .option(\n '-e, --env <env...>',\n 'Environment variables in KEY=VALUE format (can be specified multiple times)'\n )\n .option('-s, --session <type>', 'Session type (e.g. new)')\n .option('-c, --chat <chatid>', 'Specify the chat')\n .action(async (name, options) => {\n try {\n const schedules = [options.at, options.every, options.cron].filter(Boolean);\n if (schedules.length > 1) {\n throw new Error(\n 'More than one schedule flag was set. Please use only one of --at, --every, or --cron.'\n );\n }\n if (schedules.length === 0) {\n throw new Error('A schedule must be specified (--at, --every, or --cron).');\n }\n\n let schedule: CronJob['schedule'];\n if (options.at) schedule = { at: options.at };\n else if (options.every) schedule = { every: options.every };\n else schedule = { cron: options.cron };\n\n const job: CronJob = {\n id: name,\n createdAt: new Date().toISOString(),\n message: options.message,\n schedule,\n };\n\n if (options.reply) job.reply = options.reply;\n if (options.agent) job.agentId = options.agent;\n\n const env = parseKeyValueArray(options.env);\n if (env) job.env = env;\n\n if (options.session) {\n if (options.session !== 'new') {\n throw new Error('Only the \"new\" session type is supported.');\n }\n job.session = { type: options.session };\n }\n\n const trpc = await getDaemonClient();\n await trpc.addCronJob.mutate({ chatId: options.chat, job });\n console.log(`Job '${name}' created successfully.`);\n } catch (err) {\n handleError('create job', err);\n }\n });\n\njobsCmd\n .command('delete <name>')\n .description('Remove a job')\n .option('-c, --chat <chatid>', 'Specify the chat')\n .action(async (name, options) => {\n try {\n const trpc = await getDaemonClient();\n const result = await trpc.deleteCronJob.mutate({ chatId: options.chat, id: name });\n if (result.deleted) {\n console.log(`Job '${name}' deleted successfully.`);\n } else {\n console.log(`Job '${name}' not found.`);\n }\n } catch (err) {\n handleError('delete job', err);\n }\n });\n","import { Command } from 'commander';\nimport path from 'node:path';\nimport {\n getLiteScriptContent,\n writeLiteScript,\n exportLiteToAllEnvironments,\n} from '../../shared/lite.js';\n\nexport const exportLiteCmd = new Command('export-lite')\n .description('Export the standalone clawmini-lite client script')\n .option(\n '-o, --out <path>',\n 'Output path or directory for the script (defaults to current directory)'\n )\n .option('--stdout', 'Output the script to stdout instead of a file')\n .action(async (options: { out?: string; stdout?: boolean }) => {\n let liteScriptContent = '';\n try {\n liteScriptContent = await getLiteScriptContent();\n } catch (err) {\n console.error(\n `Failed to read compiled clawmini-lite script. Ensure you have built the project (npm run build). Error: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n\n if (options.stdout) {\n process.stdout.write(liteScriptContent);\n return;\n }\n\n const defaultFilename = 'clawmini-lite.js';\n let finalPath = path.resolve(process.cwd(), defaultFilename);\n\n if (options.out) {\n finalPath = path.resolve(process.cwd(), options.out);\n try {\n const writtenPath = await writeLiteScript(finalPath);\n console.log(`Successfully exported clawmini-lite to ${writtenPath}`);\n } catch (err) {\n console.error(\n `Failed to export script: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n return;\n }\n\n const exportedToEnvironments = await exportLiteToAllEnvironments(process.cwd());\n\n if (!exportedToEnvironments) {\n try {\n const writtenPath = await writeLiteScript(finalPath);\n console.log(`Successfully exported clawmini-lite to ${writtenPath}`);\n } catch (err) {\n console.error(\n `Failed to export script: ${err instanceof Error ? err.message : String(err)}`\n );\n process.exit(1);\n }\n }\n });\n","import { Command } from 'commander';\nimport { readSettings, writeSettings, enableEnvironment } from '../../shared/workspace.js';\nimport { handleError } from '../utils.js';\n\nexport const environmentsCmd = new Command('environments').description('Manage environments');\n\nenvironmentsCmd\n .command('enable <name>')\n .description('Enable an environment for a path in the workspace')\n .option('-p, --path <subpath>', 'Path to apply the environment to', './')\n .option('--fork', 'Clone the built-in template directory instead of writing a thin overlay')\n .action(async (name: string, options: { path: string; fork?: boolean }) => {\n try {\n await enableEnvironment(\n name,\n options.path,\n process.cwd(),\n options.fork ? { fork: true } : {}\n );\n } catch (err) {\n handleError('enable environment', err);\n }\n });\n\nenvironmentsCmd\n .command('disable')\n .description('Disable an environment mapping')\n .option('-p, --path <subpath>', 'Path to remove the environment from', './')\n .action(async (options: { path: string }) => {\n try {\n const settings = await readSettings();\n if (!settings?.environments || !settings.environments[options.path]) {\n console.log(`No environment mapping found for path '${options.path}'.`);\n return;\n }\n\n const name = settings.environments[options.path];\n delete settings.environments[options.path];\n await writeSettings(settings);\n\n console.log(`Disabled environment '${name}' for path '${options.path}'.`);\n } catch (err) {\n handleError('disable environment', err);\n }\n });\n","import { Command } from 'commander';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { handleError } from '../utils.js';\nimport { resolveCompiledScript } from '../../shared/lite.js';\nimport { BUILTIN_POLICIES, type PolicyConfig } from '../../shared/policies.js';\nimport { getClawminiDir } from '../../shared/workspace.js';\n\nconst SUPPORTED_POLICIES = ['manage-policies'];\n\nexport const policiesCmd = new Command('policies').description('Manage sandbox policies');\n\npoliciesCmd\n .command('add <name>')\n .description('Add a new policy')\n .action(async (name: string) => {\n if (!SUPPORTED_POLICIES.includes(name)) {\n handleError(\n 'add policy',\n new Error(\n `Unsupported policy: \"${name}\". Supported policies: ${SUPPORTED_POLICIES.join(', ')}`\n )\n );\n }\n\n const dirPath = getClawminiDir();\n const policyScriptsDir = path.join(dirPath, 'policy-scripts');\n const policiesPath = path.join(dirPath, 'policies.json');\n\n if (!fs.existsSync(dirPath)) {\n handleError(\n 'add policy',\n new Error('.clawmini directory not found. Please run \"clawmini init\" first.')\n );\n }\n\n if (!fs.existsSync(policyScriptsDir)) {\n fs.mkdirSync(policyScriptsDir, { recursive: true });\n }\n\n // Update or create policies.json\n let policies: PolicyConfig = { policies: {} };\n if (fs.existsSync(policiesPath)) {\n policies = JSON.parse(fs.readFileSync(policiesPath, 'utf8'));\n }\n\n const builtin = BUILTIN_POLICIES[name];\n policies.policies[name] = {\n description: builtin?.description ?? `Built-in policy ${name}`,\n command: `./.clawmini/policy-scripts/${name}.js`,\n allowHelp: builtin?.allowHelp ?? true,\n ...(builtin?.autoApprove !== undefined ? { autoApprove: builtin.autoApprove } : {}),\n };\n\n fs.writeFileSync(policiesPath, JSON.stringify(policies, null, 2));\n console.log(`Registered ${name} in .clawmini/policies.json`);\n\n try {\n const foundPath = await resolveCompiledScript(name, import.meta.url);\n let scriptContent = fs.readFileSync(foundPath, 'utf8');\n\n if (!scriptContent.startsWith('#!')) {\n scriptContent = '#!/usr/bin/env node\\n' + scriptContent;\n }\n\n const destPath = path.join(policyScriptsDir, `${name}.js`);\n fs.writeFileSync(destPath, scriptContent, { mode: 0o755 });\n console.log(`Copied ${name} script to ${destPath}`);\n } catch (err) {\n handleError('add policy', err);\n }\n });\n","import { Command } from 'commander';\nimport { promises as fsPromises, Dirent } from 'fs';\nimport {\n resolveSkillsTemplatePath,\n copyAgentSkills,\n copyAgentSkill,\n} from '../../shared/workspace.js';\nimport { handleError } from '../utils.js';\n\nexport const skillsCmd = new Command('skills').description('Manage template skills');\n\nskillsCmd\n .command('list')\n .description('List available template skills')\n .action(async () => {\n try {\n let skillsDir: string;\n try {\n skillsDir = await resolveSkillsTemplatePath();\n } catch (err: unknown) {\n if (err instanceof Error && err.message.includes('Template not found: skills')) {\n console.error('No skills found. The templates/skills directory does not exist.');\n return;\n }\n throw err;\n }\n\n let entries: Dirent[];\n try {\n entries = await fsPromises.readdir(skillsDir, { withFileTypes: true });\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') {\n console.error('No skills found.');\n return;\n }\n throw err;\n }\n\n const skills = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n\n if (skills.length === 0) {\n console.error('No skills found.');\n return;\n }\n for (const skill of skills) {\n console.log(`- ${skill}`);\n }\n } catch (err) {\n handleError('list skills', err);\n }\n });\n\nskillsCmd\n .command('add [skill-name]')\n .description('Add a skill to an agent, overwriting the target skill directory if it exists')\n .option('-a, --agent <agentId>', 'Agent ID (defaults to \"default\")')\n .action(async (skillName: string | undefined, options: { agent?: string }) => {\n try {\n const agentId = options.agent || 'default';\n\n if (skillName) {\n await copyAgentSkill(agentId, skillName, process.cwd(), true);\n console.log(`Successfully added skill '${skillName}' to agent '${agentId}'.`);\n } else {\n await copyAgentSkills(agentId, process.cwd(), true);\n console.log(`Successfully added all skills to agent '${agentId}'.`);\n }\n } catch (err) {\n handleError('add skill', err);\n }\n });\n","#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { initCmd } from './commands/init.js';\nimport { messagesCmd } from './commands/messages.js';\nimport { chatsCmd } from './commands/chats.js';\nimport { agentsCmd } from './commands/agents.js';\nimport { downCmd } from './commands/down.js';\nimport { upCmd } from './commands/up.js';\nimport { serveCmd } from './commands/serve.js';\nimport { logsCmd } from './commands/logs.js';\nimport { webCmd } from './commands/web.js';\nimport { jobsCmd } from './commands/jobs.js';\nimport { exportLiteCmd } from './commands/export-lite.js';\nimport { environmentsCmd } from './commands/environments.js';\nimport { policiesCmd } from './commands/policies.js';\nimport { skillsCmd } from './commands/skills.js';\n\nconst program = new Command();\n\nprogram.name('clawmini').description('Clawmini CLI').version('0.0.1');\n\nprogram.addCommand(initCmd);\nprogram.addCommand(messagesCmd);\nprogram.addCommand(chatsCmd);\nprogram.addCommand(agentsCmd);\nprogram.addCommand(environmentsCmd);\nprogram.addCommand(skillsCmd);\nprogram.addCommand(downCmd);\nprogram.addCommand(upCmd);\nprogram.addCommand(serveCmd);\nprogram.addCommand(logsCmd);\nprogram.addCommand(webCmd);\nprogram.addCommand(jobsCmd);\nprogram.addCommand(exportLiteCmd);\nprogram.addCommand(policiesCmd);\n\nprogram.parse();\n"],"mappings":"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"}
package/dist/cli/lite.mjs CHANGED
@@ -4541,7 +4541,7 @@ jobs.command("list").description("List cron jobs").action(async () => {
4541
4541
  process.exit(1);
4542
4542
  }
4543
4543
  });
4544
- jobs.command("add <name>").description("Add a cron job").option("--at <time>", "Schedule at specific time").option("--every <interval>", "Schedule at interval").option("--cron <cron>", "Schedule via cron expression").option("-m, --message <msg>", "Message to send").option("-r, --reply <reply>", "Reply text").option("-a, --agent <agentId>", "Agent ID").option("-s, --session <type>", "Session type (must be \"new\")").option("-e, --env <env>", "Environment variables in key=value format", (val, prev) => prev.concat([val]), []).option("-c, --chat <chatId>", "Chat ID").action(async (name, options) => {
4544
+ jobs.command("add <name>").description("Add a cron job").option("--at <time>", "Schedule at specific time").option("--every <interval>", "Schedule at interval").option("--cron <cron>", "Schedule via cron expression").option("-m, --message <msg>", "Message to send").option("-r, --reply <reply>", "Reply text").option("-s, --session <type>", "Session type (must be \"new\")").action(async (name, options) => {
4545
4545
  try {
4546
4546
  let schedule;
4547
4547
  if (options.at) schedule = { at: options.at };
@@ -4550,24 +4550,14 @@ jobs.command("add <name>").description("Add a cron job").option("--at <time>", "
4550
4550
  else throw new Error("A schedule must be specified (--at, --every, or --cron).");
4551
4551
  const job = {
4552
4552
  id: name,
4553
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
4554
4553
  message: options.message || "",
4555
4554
  schedule
4556
4555
  };
4557
4556
  if (options.reply) job.reply = options.reply;
4558
- if (options.agent) job.agentId = options.agent;
4559
4557
  if (options.session) {
4560
4558
  if (options.session !== "new") throw new Error("Only \"new\" session type is supported.");
4561
4559
  job.session = { type: "new" };
4562
4560
  }
4563
- if (options.env && options.env.length > 0) {
4564
- const jobEnv = {};
4565
- for (const e of options.env) {
4566
- const [k, ...v] = e.split("=");
4567
- if (k) jobEnv[k] = v.join("=");
4568
- }
4569
- job.env = jobEnv;
4570
- }
4571
4561
  await getClient().addCronJob.mutate({ job });
4572
4562
  console.log(`Job '${name}' created successfully.`);
4573
4563
  } catch (err) {
@@ -4585,7 +4575,8 @@ jobs.command("delete <name>").description("Delete a cron job").action(async (nam
4585
4575
  process.exit(1);
4586
4576
  }
4587
4577
  });
4588
- program.command("requests").description("Manage sandbox policy requests").command("list").description("List available policies").action(async () => {
4578
+ const requests = program.command("requests").description("Manage sandbox policy requests");
4579
+ requests.command("list").description("List available policies").action(async () => {
4589
4580
  try {
4590
4581
  const config = await getClient().listPolicies.query();
4591
4582
  if (!config || !config.policies || Object.keys(config.policies).length === 0) {
@@ -4602,6 +4593,38 @@ program.command("requests").description("Manage sandbox policy requests").comman
4602
4593
  process.exit(1);
4603
4594
  }
4604
4595
  });
4596
+ requests.command("show <name>").description("Show full details of a single policy. Includes the script body when the command points inside .clawmini/policy-scripts/.").action(async (name) => {
4597
+ try {
4598
+ const client = getClient();
4599
+ const policy = (await client.listPolicies.query())?.policies?.[name];
4600
+ if (!policy) {
4601
+ console.error(`Policy not found: ${name}`);
4602
+ process.exit(1);
4603
+ }
4604
+ console.log(JSON.stringify({
4605
+ name,
4606
+ ...policy
4607
+ }, null, 2));
4608
+ try {
4609
+ const script = await client.readPolicyScript.query({ commandName: name });
4610
+ console.log(`\n--- Script: ${script.path} (${script.size} bytes) ---`);
4611
+ if ("spilledTo" in script && script.spilledTo) console.log(`(script body too large to inline; copied to ${script.spilledTo})`);
4612
+ else if ("content" in script && typeof script.content === "string") {
4613
+ process.stdout.write(script.content);
4614
+ if (!script.content.endsWith("\n")) process.stdout.write("\n");
4615
+ }
4616
+ } catch (err) {
4617
+ const code = err?.data?.code;
4618
+ if (code === "BAD_REQUEST" || code === "NOT_FOUND") {
4619
+ const msg = err instanceof Error ? err.message : String(err);
4620
+ console.log(`\n(no script body: ${msg})`);
4621
+ } else throw err;
4622
+ }
4623
+ } catch (err) {
4624
+ console.error("Error:", err instanceof Error ? err.message : err);
4625
+ process.exit(1);
4626
+ }
4627
+ });
4605
4628
  program.command("request <cmd>").description("Submit a sandbox policy request").option("--help", "Execute the underlying command with --help and print the output").option("-f, --file <mappings...>", "File mappings in the format name=path").allowUnknownOption().allowExcessArguments(true).helpOption("-h, --cli-help", "display CLI help for command").action(async (cmdName, options, command) => {
4606
4629
  try {
4607
4630
  const client = getClient();
@@ -4624,7 +4647,8 @@ program.command("request <cmd>").description("Submit a sandbox policy request").
4624
4647
  const request = await client.createPolicyRequest.mutate({
4625
4648
  commandName: cmdName,
4626
4649
  args: opaqueArgs,
4627
- fileMappings
4650
+ fileMappings,
4651
+ cwd: process.cwd()
4628
4652
  });
4629
4653
  if (request.executionResult) {
4630
4654
  if (request.executionResult.stdout) process.stdout.write(request.executionResult.stdout);
@@ -4633,6 +4657,12 @@ program.command("request <cmd>").description("Submit a sandbox policy request").
4633
4657
  } else {
4634
4658
  console.log(`Request created successfully.`);
4635
4659
  console.log(`Request ID: ${request.id}`);
4660
+ console.log("");
4661
+ console.log("This request has not run yet — it is queued for user approval. When the");
4662
+ console.log("user approves (or rejects) it, the result will arrive as a new user");
4663
+ console.log("message in this chat; do not poll. Finish any unrelated work that does");
4664
+ console.log("not depend on this request, then end your turn with a brief message");
4665
+ console.log("explaining you are blocked on this request.");
4636
4666
  }
4637
4667
  } catch (err) {
4638
4668
  console.error("Error:", err instanceof Error ? err.message : err);