clawmini 0.0.8 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (367) hide show
  1. package/.changeset/README.md +8 -0
  2. package/.changeset/config.json +14 -0
  3. package/.github/workflows/release.yml +49 -0
  4. package/CHANGELOG.md +36 -0
  5. package/README.md +5 -4
  6. package/dist/adapter-discord/index.d.mts.map +1 -1
  7. package/dist/adapter-discord/index.mjs +465 -282
  8. package/dist/adapter-discord/index.mjs.map +1 -1
  9. package/dist/adapter-google-chat/index.mjs +367 -243
  10. package/dist/adapter-google-chat/index.mjs.map +1 -1
  11. package/dist/cli/index.mjs +684 -24
  12. package/dist/cli/index.mjs.map +1 -1
  13. package/dist/cli/lite.mjs +43 -13
  14. package/dist/cli/lite.mjs.map +1 -1
  15. package/dist/cli/{propose-policy.mjs → manage-policies.mjs} +270 -47
  16. package/dist/cli/manage-policies.mjs.map +1 -0
  17. package/dist/cli/run-host.d.mts +1 -0
  18. package/dist/cli/run-host.mjs +3090 -0
  19. package/dist/cli/run-host.mjs.map +1 -0
  20. package/dist/config-CPFQIGdG.mjs +57 -0
  21. package/dist/config-CPFQIGdG.mjs.map +1 -0
  22. package/dist/config-Dvl-Pov4.mjs +76 -0
  23. package/dist/config-Dvl-Pov4.mjs.map +1 -0
  24. package/dist/daemon/index.d.mts.map +1 -1
  25. package/dist/daemon/index.mjs +970 -332
  26. package/dist/daemon/index.mjs.map +1 -1
  27. package/dist/supervisor-actions-CiW56eLi.mjs +843 -0
  28. package/dist/supervisor-actions-CiW56eLi.mjs.map +1 -0
  29. package/dist/turn-log-buffer-DRgW53gl.mjs +767 -0
  30. package/dist/turn-log-buffer-DRgW53gl.mjs.map +1 -0
  31. package/dist/web/_app/immutable/chunks/{Drm9vgeP.js → 3AZlWB6U.js} +1 -1
  32. package/dist/web/_app/immutable/chunks/BhRSsUCh.js +2 -0
  33. package/dist/web/_app/immutable/chunks/BiLeM2i1.js +1 -0
  34. package/{web/.svelte-kit/output/client/_app/immutable/chunks/CME08kGM.js → dist/web/_app/immutable/chunks/BmBj85Ll.js} +1 -1
  35. package/dist/web/_app/immutable/chunks/BrERcKAH.js +1 -0
  36. package/dist/web/_app/immutable/chunks/Bv9252RM.js +1 -0
  37. package/dist/web/_app/immutable/chunks/CIXNBPKi.js +1 -0
  38. package/dist/web/_app/immutable/chunks/DISKL3GN.js +2 -0
  39. package/dist/web/_app/immutable/chunks/{Zeh-C-mx.js → DcpaLzmX.js} +1 -1
  40. package/dist/web/_app/immutable/chunks/DnQ3vS13.js +1 -0
  41. package/dist/web/_app/immutable/chunks/KsloHTKS.js +1 -0
  42. package/{web/.svelte-kit/output/client/_app/immutable/chunks/Ck-be5J2.js → dist/web/_app/immutable/chunks/RsHsUj-8.js} +2 -2
  43. package/dist/web/_app/immutable/chunks/{vDehDcuJ.js → wpfV79dV.js} +1 -1
  44. package/dist/web/_app/immutable/entry/app.CIw1Qj0n.js +2 -0
  45. package/dist/web/_app/immutable/entry/start.Di0-Jhte.js +1 -0
  46. package/dist/web/_app/immutable/nodes/{0.CUGC2p-K.js → 0.DYyUA1au.js} +1 -1
  47. package/dist/web/_app/immutable/nodes/1.D-3QEMMZ.js +1 -0
  48. package/dist/web/_app/immutable/nodes/{2.BnwnD1Ki.js → 2.4olHnH7U.js} +1 -1
  49. package/{web/.svelte-kit/output/client/_app/immutable/nodes/3.0arZe_Uf.js → dist/web/_app/immutable/nodes/3.4w0bE-m2.js} +3 -3
  50. package/dist/web/_app/immutable/nodes/4.CZvjhVHt.js +60 -0
  51. package/dist/web/_app/immutable/nodes/{5.Bq2JzCEj.js → 5.DLbPVJY2.js} +1 -1
  52. package/dist/web/_app/version.json +1 -1
  53. package/dist/web/index.html +12 -12
  54. package/dist/workspace-oWmVh5mi.mjs +1001 -0
  55. package/dist/workspace-oWmVh5mi.mjs.map +1 -0
  56. package/docs/23_adapter_slash_autocomplete/development_log.md +19 -0
  57. package/docs/23_adapter_slash_autocomplete/notes.md +18 -0
  58. package/docs/23_adapter_slash_autocomplete/prd.md +46 -0
  59. package/docs/23_adapter_slash_autocomplete/questions.md +6 -0
  60. package/docs/23_adapter_slash_autocomplete/tickets.md +21 -0
  61. package/docs/24_subagent_job_policy_fixes/development_log.md +22 -0
  62. package/docs/24_subagent_job_policy_fixes/notes.md +28 -0
  63. package/docs/24_subagent_job_policy_fixes/prd.md +59 -0
  64. package/docs/24_subagent_job_policy_fixes/questions.md +3 -0
  65. package/docs/24_subagent_job_policy_fixes/tickets.md +49 -0
  66. package/docs/25_e2e_test_improvements/development_log.md +30 -0
  67. package/docs/25_e2e_test_improvements/notes.md +29 -0
  68. package/docs/25_e2e_test_improvements/prd.md +43 -0
  69. package/docs/25_e2e_test_improvements/questions.md +12 -0
  70. package/docs/25_e2e_test_improvements/tickets-2.md +22 -0
  71. package/docs/25_e2e_test_improvements/tickets.md +22 -0
  72. package/docs/25_policy_cwd/development_log.md +30 -0
  73. package/docs/25_policy_cwd/notes.md +28 -0
  74. package/docs/25_policy_cwd/prd.md +77 -0
  75. package/docs/25_policy_cwd/questions.md +6 -0
  76. package/docs/25_policy_cwd/tickets.md +77 -0
  77. package/docs/CLI_REFERENCE.md +3 -1
  78. package/docs/PHILOSOPHY.md +35 -0
  79. package/docs/adapter-visibility/SPEC.md +461 -0
  80. package/docs/adapter-visibility/SPEC_v2.md +202 -0
  81. package/docs/auto-update/SPEC.md +344 -0
  82. package/docs/backups/SPEC.md +296 -0
  83. package/docs/backups/clawmini.gitignore +69 -0
  84. package/docs/guides/assets/clawmini-avatar.png +0 -0
  85. package/docs/guides/backups.md +332 -0
  86. package/docs/guides/discord_adapter_setup.md +1 -1
  87. package/docs/guides/google_chat_adapter_setup.md +81 -0
  88. package/docs/unified-startup/SPEC.md +203 -0
  89. package/e2e/_helpers/test-environment.test.ts +49 -0
  90. package/e2e/_helpers/test-environment.ts +548 -0
  91. package/e2e/adapters/_google-chat-fixtures.ts +340 -0
  92. package/{src/cli/e2e → e2e/adapters}/adapter-discord.test.ts +22 -23
  93. package/e2e/adapters/adapter-google-chat-downtime.test.ts +157 -0
  94. package/e2e/adapters/adapter-google-chat-inbound.test.ts +697 -0
  95. package/e2e/adapters/adapter-google-chat-outbound.test.ts +297 -0
  96. package/e2e/adapters/adapter-google-chat-roundtrip.test.ts +56 -0
  97. package/e2e/adapters/adapter-google-chat-threads.test.ts +1078 -0
  98. package/e2e/agents/custom-api-env.test.ts +80 -0
  99. package/e2e/agents/export-lite-func.test.ts +104 -0
  100. package/e2e/agents/fallbacks.test.ts +124 -0
  101. package/e2e/agents/interrupt.test.ts +50 -0
  102. package/e2e/agents/no-reply-necessary.test.ts +57 -0
  103. package/e2e/agents/session-timeout-subagents.test.ts +76 -0
  104. package/e2e/agents/subagent-authorization.test.ts +246 -0
  105. package/e2e/agents/subagent-env.test.ts +49 -0
  106. package/e2e/agents/subagent-lifecycle.test.ts +782 -0
  107. package/e2e/agents/subagents-depth.test.ts +47 -0
  108. package/e2e/cli/agents.test.ts +176 -0
  109. package/e2e/cli/auto-update.test.ts +741 -0
  110. package/e2e/cli/basic.test.ts +44 -0
  111. package/{src/cli/e2e → e2e/cli}/export-lite.test.ts +16 -12
  112. package/e2e/cli/init-gitignore.test.ts +86 -0
  113. package/e2e/cli/init.test.ts +76 -0
  114. package/e2e/cli/messages.test.ts +363 -0
  115. package/e2e/cli/serve.test.ts +76 -0
  116. package/{src/cli/e2e → e2e/cli}/skills.test.ts +11 -10
  117. package/{src/cli/e2e → e2e/daemon}/daemon.test.ts +57 -195
  118. package/e2e/jobs/agent-jobs.test.ts +216 -0
  119. package/e2e/jobs/cron.test.ts +64 -0
  120. package/e2e/jobs/restart.test.ts +108 -0
  121. package/e2e/policies/approval-session.test.ts +69 -0
  122. package/e2e/policies/auto-create-policies-file.test.ts +35 -0
  123. package/e2e/policies/builtin-manage-policies.test.ts +184 -0
  124. package/e2e/policies/builtin-run-host.test.ts +180 -0
  125. package/e2e/policies/environment-policies.test.ts +177 -0
  126. package/e2e/policies/manage-policies.test.ts +566 -0
  127. package/e2e/policies/output-size.test.ts +98 -0
  128. package/e2e/policies/policies-context-cwd.test.ts +160 -0
  129. package/e2e/policies/relative-script-path.test.ts +60 -0
  130. package/e2e/policies/requests-show.test.ts +135 -0
  131. package/e2e/policies/requests.test.ts +208 -0
  132. package/e2e/policies/slash-policies.test.ts +308 -0
  133. package/e2e/policies/startup-cleanup.test.ts +48 -0
  134. package/e2e/routers/session-timeout.test.ts +106 -0
  135. package/e2e/routers/slash-model.test.ts +152 -0
  136. package/e2e/routers/slash-new.test.ts +50 -0
  137. package/e2e/routers/slash-restart-adapter.test.ts +96 -0
  138. package/e2e/routers/slash-restart.test.ts +114 -0
  139. package/e2e/routers/slash-shutdown.test.ts +55 -0
  140. package/e2e/routers/slash-stop.test.ts +232 -0
  141. package/e2e/routers/slash-upgrade.test.ts +88 -0
  142. package/{src/cli/e2e → e2e/sandbox}/environments.test.ts +14 -13
  143. package/eslint.config.js +6 -0
  144. package/napkin.md +1 -1
  145. package/package.json +8 -3
  146. package/src/adapter-discord/commands.test.ts +42 -0
  147. package/src/adapter-discord/commands.ts +33 -0
  148. package/src/adapter-discord/config.ts +12 -0
  149. package/src/adapter-discord/forwarder.test.ts +499 -21
  150. package/src/adapter-discord/forwarder.ts +343 -124
  151. package/src/adapter-discord/inbound-cache.test.ts +47 -0
  152. package/src/adapter-discord/inbound-cache.ts +37 -0
  153. package/src/adapter-discord/index.test.ts +67 -2
  154. package/src/adapter-discord/index.ts +84 -216
  155. package/src/adapter-discord/interactions.test.ts +54 -3
  156. package/src/adapter-discord/interactions.ts +97 -53
  157. package/src/adapter-discord/processMessage.ts +239 -0
  158. package/src/adapter-discord/state.ts +1 -0
  159. package/src/adapter-google-chat/auth.test.ts +9 -5
  160. package/src/adapter-google-chat/auth.ts +29 -23
  161. package/src/adapter-google-chat/cards.ts +7 -2
  162. package/src/adapter-google-chat/client.test.ts +37 -2
  163. package/src/adapter-google-chat/client.ts +138 -38
  164. package/src/adapter-google-chat/config.ts +19 -0
  165. package/src/adapter-google-chat/forwarder.test.ts +81 -56
  166. package/src/adapter-google-chat/forwarder.ts +394 -185
  167. package/src/adapter-google-chat/inbound-cache.test.ts +61 -0
  168. package/src/adapter-google-chat/inbound-cache.ts +36 -0
  169. package/src/adapter-google-chat/state.test.ts +1 -0
  170. package/src/adapter-google-chat/state.ts +9 -1
  171. package/src/adapter-google-chat/subscriptions.ts +8 -6
  172. package/src/cli/builtin-policies.ts +44 -0
  173. package/src/cli/commands/agents.ts +59 -5
  174. package/src/cli/commands/down.ts +54 -2
  175. package/src/cli/commands/environments.ts +8 -2
  176. package/src/cli/commands/init.ts +31 -0
  177. package/src/cli/commands/logs.ts +116 -0
  178. package/src/cli/commands/policies.ts +6 -4
  179. package/src/cli/commands/serve.test.ts +67 -0
  180. package/src/cli/commands/serve.ts +284 -0
  181. package/src/cli/commands/up.ts +122 -2
  182. package/src/cli/commands/web-api/agents.ts +3 -2
  183. package/src/cli/index.ts +4 -0
  184. package/src/cli/install-detection.test.ts +72 -0
  185. package/src/cli/install-detection.ts +48 -0
  186. package/src/cli/lite.ts +54 -22
  187. package/src/cli/manage-policies-utils.ts +104 -0
  188. package/src/cli/manage-policies.ts +291 -0
  189. package/src/cli/run-host.ts +45 -0
  190. package/src/cli/supervisor-actions.ts +267 -0
  191. package/src/cli/supervisor-control.test.ts +129 -0
  192. package/src/cli/supervisor-control.ts +155 -0
  193. package/src/cli/supervisor-pid.ts +68 -0
  194. package/src/cli/supervisor.ts +277 -0
  195. package/src/daemon/agent/agent-context.ts +11 -11
  196. package/src/daemon/agent/agent-session.ts +8 -1
  197. package/src/daemon/agent/chat-logger.test.ts +78 -9
  198. package/src/daemon/agent/chat-logger.ts +25 -5
  199. package/src/daemon/agent/turn-registry.test.ts +89 -0
  200. package/src/daemon/agent/turn-registry.ts +94 -0
  201. package/src/daemon/agent/types.ts +2 -0
  202. package/src/daemon/api/agent-policy-endpoints.ts +263 -0
  203. package/src/daemon/api/agent-router.ts +47 -126
  204. package/src/daemon/api/index.test.ts +1 -0
  205. package/src/daemon/api/policy-request.test.ts +7 -5
  206. package/src/daemon/api/router-utils.ts +6 -5
  207. package/src/daemon/api/subagent-router.ts +110 -74
  208. package/src/daemon/api/subagent-utils.test.ts +60 -0
  209. package/src/daemon/api/subagent-utils.ts +113 -87
  210. package/src/daemon/api/user-router.ts +34 -8
  211. package/src/daemon/auth.ts +1 -0
  212. package/src/daemon/cron.test.ts +62 -4
  213. package/src/daemon/cron.ts +42 -16
  214. package/src/daemon/events.ts +65 -0
  215. package/src/daemon/index.ts +24 -1
  216. package/src/daemon/message-interruption.test.ts +1 -0
  217. package/src/daemon/message-jobs.test.ts +1 -0
  218. package/src/daemon/message.ts +78 -14
  219. package/src/daemon/observation.test.ts +26 -18
  220. package/src/daemon/pending-replies.test.ts +112 -0
  221. package/src/daemon/pending-replies.ts +162 -0
  222. package/src/daemon/policy-request-service.ts +3 -1
  223. package/src/daemon/policy-utils.test.ts +66 -1
  224. package/src/daemon/policy-utils.ts +126 -1
  225. package/src/daemon/request-store.ts +31 -0
  226. package/src/daemon/routers/session-timeout.ts +4 -0
  227. package/src/daemon/routers/slash-model.test.ts +344 -0
  228. package/src/daemon/routers/slash-model.ts +207 -0
  229. package/src/daemon/routers/slash-policies.test.ts +38 -32
  230. package/src/daemon/routers/slash-policies.ts +84 -33
  231. package/src/daemon/routers/slash-restart.test.ts +69 -0
  232. package/src/daemon/routers/slash-restart.ts +36 -0
  233. package/src/daemon/routers/slash-shutdown.test.ts +50 -0
  234. package/src/daemon/routers/slash-shutdown.ts +28 -0
  235. package/src/daemon/routers/slash-upgrade.test.ts +116 -0
  236. package/src/daemon/routers/slash-upgrade.ts +76 -0
  237. package/src/daemon/routers/types.ts +7 -0
  238. package/src/daemon/routers.ts +16 -0
  239. package/src/shared/adapters/blockquote.test.ts +28 -0
  240. package/src/shared/adapters/blockquote.ts +20 -0
  241. package/src/shared/adapters/filtering.test.ts +224 -10
  242. package/src/shared/adapters/filtering.ts +95 -7
  243. package/src/shared/adapters/inbound-cache.test.ts +48 -0
  244. package/src/shared/adapters/inbound-cache.ts +54 -0
  245. package/src/shared/adapters/turn-log-buffer.ts +266 -0
  246. package/src/shared/adapters/turn-log.test.ts +389 -0
  247. package/src/shared/adapters/turn-log.ts +357 -0
  248. package/src/shared/agent-utils.ts +12 -5
  249. package/src/shared/chats.test.ts +4 -0
  250. package/src/shared/chats.ts +9 -0
  251. package/src/shared/config.ts +16 -1
  252. package/src/shared/lite.ts +76 -2
  253. package/src/shared/policies.ts +26 -0
  254. package/src/shared/template-manifest.ts +267 -0
  255. package/src/shared/utils/shell.ts +61 -0
  256. package/src/shared/version.ts +34 -0
  257. package/src/shared/workspace.test.ts +217 -0
  258. package/src/shared/workspace.ts +626 -48
  259. package/templates/environments/cladding/allowlist-domain.mjs +125 -0
  260. package/templates/environments/cladding/env.json +21 -1
  261. package/templates/environments/cladding/run-with-network.mjs +54 -0
  262. package/templates/environments/macos-proxy/allowlist-domain.mjs +95 -0
  263. package/templates/environments/macos-proxy/env.json +8 -1
  264. package/templates/environments/macos-proxy/proxy.mjs +0 -1
  265. package/templates/gemini/template.json +5 -0
  266. package/templates/gemini-claw/template.json +13 -0
  267. package/templates/skills/clawmini-requests/SKILL.md +69 -10
  268. package/templates/skills/run-host/SKILL.md +51 -0
  269. package/templates/skills/skill-creator/SKILL.md +4 -3
  270. package/templates/skills/skill-creator/scripts/validate.sh +52 -0
  271. package/tsdown.config.ts +10 -1
  272. package/vitest.config.ts +2 -2
  273. package/web/.svelte-kit/ambient.d.ts +292 -118
  274. package/web/.svelte-kit/generated/server/internal.js +1 -1
  275. package/web/.svelte-kit/output/client/.vite/manifest.json +126 -136
  276. package/web/.svelte-kit/output/client/_app/immutable/chunks/{Drm9vgeP.js → 3AZlWB6U.js} +1 -1
  277. package/web/.svelte-kit/output/client/_app/immutable/chunks/BhRSsUCh.js +2 -0
  278. package/web/.svelte-kit/output/client/_app/immutable/chunks/BiLeM2i1.js +1 -0
  279. package/{dist/web/_app/immutable/chunks/CME08kGM.js → web/.svelte-kit/output/client/_app/immutable/chunks/BmBj85Ll.js} +1 -1
  280. package/web/.svelte-kit/output/client/_app/immutable/chunks/BrERcKAH.js +1 -0
  281. package/web/.svelte-kit/output/client/_app/immutable/chunks/Bv9252RM.js +1 -0
  282. package/web/.svelte-kit/output/client/_app/immutable/chunks/CIXNBPKi.js +1 -0
  283. package/web/.svelte-kit/output/client/_app/immutable/chunks/DISKL3GN.js +2 -0
  284. package/web/.svelte-kit/output/client/_app/immutable/chunks/{Zeh-C-mx.js → DcpaLzmX.js} +1 -1
  285. package/web/.svelte-kit/output/client/_app/immutable/chunks/DnQ3vS13.js +1 -0
  286. package/web/.svelte-kit/output/client/_app/immutable/chunks/KsloHTKS.js +1 -0
  287. package/{dist/web/_app/immutable/chunks/Ck-be5J2.js → web/.svelte-kit/output/client/_app/immutable/chunks/RsHsUj-8.js} +2 -2
  288. package/web/.svelte-kit/output/client/_app/immutable/chunks/{vDehDcuJ.js → wpfV79dV.js} +1 -1
  289. package/web/.svelte-kit/output/client/_app/immutable/entry/app.CIw1Qj0n.js +2 -0
  290. package/web/.svelte-kit/output/client/_app/immutable/entry/start.Di0-Jhte.js +1 -0
  291. package/web/.svelte-kit/output/client/_app/immutable/nodes/{0.CUGC2p-K.js → 0.DYyUA1au.js} +1 -1
  292. package/web/.svelte-kit/output/client/_app/immutable/nodes/1.D-3QEMMZ.js +1 -0
  293. package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.BnwnD1Ki.js → 2.4olHnH7U.js} +1 -1
  294. package/{dist/web/_app/immutable/nodes/3.0arZe_Uf.js → web/.svelte-kit/output/client/_app/immutable/nodes/3.4w0bE-m2.js} +3 -3
  295. package/web/.svelte-kit/output/client/_app/immutable/nodes/4.CZvjhVHt.js +60 -0
  296. package/web/.svelte-kit/output/client/_app/immutable/nodes/{5.Bq2JzCEj.js → 5.DLbPVJY2.js} +1 -1
  297. package/web/.svelte-kit/output/client/_app/version.json +1 -1
  298. package/web/.svelte-kit/output/server/.vite/manifest.json +12 -10
  299. package/web/.svelte-kit/output/server/chunks/Icon.js +1 -1
  300. package/web/.svelte-kit/output/server/chunks/client.js +1 -1
  301. package/web/.svelte-kit/output/server/chunks/exports.js +1 -1
  302. package/web/.svelte-kit/output/server/chunks/index-server.js +2 -1
  303. package/web/.svelte-kit/output/server/chunks/internal.js +1 -1
  304. package/web/.svelte-kit/output/server/chunks/render-context.js +77 -0
  305. package/web/.svelte-kit/output/server/chunks/root.js +739 -788
  306. package/web/.svelte-kit/output/server/chunks/shared.js +234 -21
  307. package/web/.svelte-kit/output/server/index.js +126 -90
  308. package/web/.svelte-kit/output/server/manifest-full.js +1 -1
  309. package/web/.svelte-kit/output/server/manifest.js +1 -1
  310. package/web/.svelte-kit/output/server/nodes/0.js +1 -1
  311. package/web/.svelte-kit/output/server/nodes/1.js +1 -1
  312. package/web/.svelte-kit/output/server/nodes/2.js +1 -1
  313. package/web/.svelte-kit/output/server/nodes/3.js +1 -1
  314. package/web/.svelte-kit/output/server/nodes/4.js +1 -1
  315. package/web/.svelte-kit/output/server/nodes/5.js +1 -1
  316. package/web/.svelte-kit/output/server/remote-entry.js +245 -81
  317. package/web/.svelte-kit/tsconfig.json +4 -1
  318. package/dist/cli/propose-policy.mjs.map +0 -1
  319. package/dist/lite-CBxOT1y5.mjs +0 -241
  320. package/dist/lite-CBxOT1y5.mjs.map +0 -1
  321. package/dist/routing-D8rTxtaV.mjs +0 -245
  322. package/dist/routing-D8rTxtaV.mjs.map +0 -1
  323. package/dist/web/_app/immutable/chunks/B6YN0Nuq.js +0 -1
  324. package/dist/web/_app/immutable/chunks/BmRlVmv6.js +0 -1
  325. package/dist/web/_app/immutable/chunks/CK9JZLaG.js +0 -2
  326. package/dist/web/_app/immutable/chunks/Ck3rYNON.js +0 -1
  327. package/dist/web/_app/immutable/chunks/D5iV40bG.js +0 -1
  328. package/dist/web/_app/immutable/chunks/DMtIqaiV.js +0 -2
  329. package/dist/web/_app/immutable/chunks/DhD271EB.js +0 -1
  330. package/dist/web/_app/immutable/chunks/DpuLqk8d.js +0 -1
  331. package/dist/web/_app/immutable/chunks/DsIToJCP.js +0 -1
  332. package/dist/web/_app/immutable/entry/app.BCSV3nrG.js +0 -2
  333. package/dist/web/_app/immutable/entry/start.D4eLEZUM.js +0 -1
  334. package/dist/web/_app/immutable/nodes/1.CGC_42IQ.js +0 -1
  335. package/dist/web/_app/immutable/nodes/4.ClM1bXLE.js +0 -60
  336. package/dist/workspace-BJmJBfKi.mjs +0 -456
  337. package/dist/workspace-BJmJBfKi.mjs.map +0 -1
  338. package/src/cli/e2e/agents.test.ts +0 -140
  339. package/src/cli/e2e/basic.test.ts +0 -43
  340. package/src/cli/e2e/cron.test.ts +0 -132
  341. package/src/cli/e2e/export-lite-func.test.ts +0 -206
  342. package/src/cli/e2e/fallbacks.test.ts +0 -175
  343. package/src/cli/e2e/init.test.ts +0 -77
  344. package/src/cli/e2e/messages.test.ts +0 -332
  345. package/src/cli/e2e/propose-policy.test.ts +0 -203
  346. package/src/cli/e2e/requests.test.ts +0 -180
  347. package/src/cli/e2e/session-timeout.test.ts +0 -192
  348. package/src/cli/e2e/slash-new.test.ts +0 -93
  349. package/src/cli/e2e/subagents.test.ts +0 -106
  350. package/src/cli/e2e/utils.ts +0 -66
  351. package/src/cli/propose-policy.ts +0 -91
  352. package/web/.svelte-kit/output/client/_app/immutable/chunks/B6YN0Nuq.js +0 -1
  353. package/web/.svelte-kit/output/client/_app/immutable/chunks/BmRlVmv6.js +0 -1
  354. package/web/.svelte-kit/output/client/_app/immutable/chunks/CK9JZLaG.js +0 -2
  355. package/web/.svelte-kit/output/client/_app/immutable/chunks/Ck3rYNON.js +0 -1
  356. package/web/.svelte-kit/output/client/_app/immutable/chunks/D5iV40bG.js +0 -1
  357. package/web/.svelte-kit/output/client/_app/immutable/chunks/DMtIqaiV.js +0 -2
  358. package/web/.svelte-kit/output/client/_app/immutable/chunks/DhD271EB.js +0 -1
  359. package/web/.svelte-kit/output/client/_app/immutable/chunks/DpuLqk8d.js +0 -1
  360. package/web/.svelte-kit/output/client/_app/immutable/chunks/DsIToJCP.js +0 -1
  361. package/web/.svelte-kit/output/client/_app/immutable/entry/app.BCSV3nrG.js +0 -2
  362. package/web/.svelte-kit/output/client/_app/immutable/entry/start.D4eLEZUM.js +0 -1
  363. package/web/.svelte-kit/output/client/_app/immutable/nodes/1.CGC_42IQ.js +0 -1
  364. package/web/.svelte-kit/output/client/_app/immutable/nodes/4.ClM1bXLE.js +0 -60
  365. package/web/.svelte-kit/output/server/chunks/false.js +0 -4
  366. /package/dist/cli/{propose-policy.d.mts → manage-policies.d.mts} +0 -0
  367. /package/{src/cli/e2e → e2e/_helpers}/global-setup.ts +0 -0
@@ -1,456 +0,0 @@
1
- import fs from "node:fs";
2
- import path, { sep } from "node:path";
3
- import { execSync } from "node:child_process";
4
- import fs$1 from "node:fs/promises";
5
- import { fileURLToPath } from "node:url";
6
- import { z } from "zod";
7
-
8
- //#region src/shared/config.ts
9
- const FallbackSchema = z.looseObject({
10
- commands: z.looseObject({
11
- new: z.string().optional(),
12
- append: z.string().optional(),
13
- getSessionId: z.string().optional(),
14
- getMessageContent: z.string().optional()
15
- }).optional(),
16
- env: z.record(z.string(), z.union([z.string(), z.boolean()])).optional(),
17
- retries: z.number().int().min(0).default(1),
18
- delayMs: z.number().int().min(0).default(1e3)
19
- });
20
- const AgentSchema = z.looseObject({
21
- commands: z.looseObject({
22
- new: z.string().optional(),
23
- append: z.string().optional(),
24
- getSessionId: z.string().optional(),
25
- getMessageContent: z.string().optional()
26
- }).optional(),
27
- apiTokenEnvVar: z.string().optional(),
28
- apiUrlEnvVar: z.string().optional(),
29
- env: z.record(z.string(), z.union([z.string(), z.boolean()])).optional(),
30
- subagentEnv: z.record(z.string(), z.union([z.string(), z.boolean()])).optional(),
31
- directory: z.string().optional(),
32
- skillsDir: z.string().optional(),
33
- fallbacks: z.array(FallbackSchema).optional(),
34
- files: z.string().default("./attachments").optional()
35
- });
36
- const CronJobSchema = z.lazy(() => z.looseObject({
37
- id: z.string().min(1),
38
- createdAt: z.string().optional(),
39
- message: z.string().default(""),
40
- reply: z.string().optional(),
41
- agentId: z.string().optional(),
42
- env: z.record(z.string(), z.union([z.string(), z.boolean()])).optional(),
43
- session: z.looseObject({ type: z.string() }).optional(),
44
- schedule: z.union([
45
- z.looseObject({ cron: z.string() }),
46
- z.looseObject({ every: z.string() }),
47
- z.looseObject({ at: z.string() })
48
- ]),
49
- nextSessionId: z.string().optional(),
50
- action: z.enum([
51
- "stop",
52
- "interrupt",
53
- "continue"
54
- ]).optional(),
55
- jobs: z.looseObject({
56
- add: z.array(z.lazy(() => CronJobSchema)).optional(),
57
- remove: z.array(z.string()).optional()
58
- }).optional()
59
- }));
60
- const RouterConfigSchema = z.union([z.string(), z.looseObject({
61
- use: z.string(),
62
- with: z.record(z.string(), z.any()).optional()
63
- })]);
64
- const SubagentTrackerSchema = z.looseObject({
65
- id: z.string(),
66
- agentId: z.string().optional(),
67
- sessionId: z.string().optional(),
68
- createdAt: z.string(),
69
- status: z.enum([
70
- "active",
71
- "completed",
72
- "failed"
73
- ]),
74
- parentId: z.string().optional()
75
- });
76
- const ChatSettingsSchema = z.looseObject({
77
- defaultAgent: z.string().optional(),
78
- sessions: z.record(z.string(), z.string()).optional(),
79
- routers: z.array(RouterConfigSchema).optional(),
80
- jobs: z.array(CronJobSchema).optional(),
81
- subagents: z.record(z.string(), SubagentTrackerSchema).optional()
82
- });
83
- const AgentSessionSettingsSchema = z.looseObject({ env: z.record(z.string(), z.union([z.string(), z.boolean()])).optional() });
84
- const EnvironmentSchema = z.looseObject({
85
- init: z.string().optional(),
86
- up: z.string().optional(),
87
- down: z.string().optional(),
88
- prefix: z.string().optional(),
89
- envFormat: z.string().optional(),
90
- exportLiteTo: z.string().optional(),
91
- env: z.record(z.string(), z.union([z.string(), z.boolean()])).optional()
92
- });
93
- const SettingsSchema = z.looseObject({
94
- chats: z.looseObject({ defaultId: z.string().optional() }).optional(),
95
- defaultAgent: AgentSchema.optional(),
96
- environments: z.record(z.string(), z.string()).optional(),
97
- routers: z.array(RouterConfigSchema).optional(),
98
- files: z.string().default("./attachments").optional(),
99
- api: z.union([z.boolean(), z.looseObject({
100
- host: z.string().optional(),
101
- port: z.number().optional(),
102
- proxy_host: z.string().optional()
103
- })]).optional()
104
- });
105
-
106
- //#endregion
107
- //#region src/shared/utils/fs.ts
108
- function pathIsInsideDir(path, dir, { allowSameDir = false } = {}) {
109
- const dirWithSep = dir.endsWith(sep) ? dir : dir + sep;
110
- if (allowSameDir && path === dir) return true;
111
- return path.startsWith(dirWithSep) && path !== dir;
112
- }
113
-
114
- //#endregion
115
- //#region src/shared/workspace.ts
116
- function getWorkspaceRoot(startDir = process.cwd()) {
117
- let curr = startDir;
118
- while (curr !== path.parse(curr).root) {
119
- if (fs.existsSync(path.join(curr, ".clawmini"))) return curr;
120
- if (fs.existsSync(path.join(curr, "package.json")) || fs.existsSync(path.join(curr, ".git"))) return curr;
121
- curr = path.dirname(curr);
122
- }
123
- return startDir;
124
- }
125
- function resolveAgentWorkDir(agentId, customDir, startDir = process.cwd()) {
126
- const workspaceRoot = getWorkspaceRoot(startDir);
127
- let dirPath = workspaceRoot;
128
- if (customDir) dirPath = path.resolve(workspaceRoot, customDir);
129
- else if (agentId !== "default") dirPath = path.resolve(workspaceRoot, agentId);
130
- if (!pathIsInsideDir(dirPath, workspaceRoot, { allowSameDir: true })) throw new Error("Invalid agent directory: resolves outside the workspace.");
131
- return dirPath;
132
- }
133
- function resolveAgentSkillsDir(agentId, agentData, startDir = process.cwd()) {
134
- const workDir = resolveAgentWorkDir(agentId, agentData.directory, startDir);
135
- return path.resolve(workDir, agentData.skillsDir || ".agents/skills");
136
- }
137
- async function ensureAgentWorkDir(agentId, customDir, startDir = process.cwd()) {
138
- const dirPath = resolveAgentWorkDir(agentId, customDir, startDir);
139
- if (!fs.existsSync(dirPath)) {
140
- await fs$1.mkdir(dirPath, { recursive: true });
141
- console.log(`Created agent working directory at ${dirPath}`);
142
- }
143
- return dirPath;
144
- }
145
- function getClawminiDir(startDir = process.cwd()) {
146
- return path.join(getWorkspaceRoot(startDir), ".clawmini");
147
- }
148
- function getSocketPath(startDir = process.cwd()) {
149
- return path.join(getClawminiDir(startDir), "daemon.sock");
150
- }
151
- function getSettingsPath(startDir = process.cwd()) {
152
- return path.join(getClawminiDir(startDir), "settings.json");
153
- }
154
- function getPoliciesPath(startDir = process.cwd()) {
155
- return path.join(getClawminiDir(startDir), "policies.json");
156
- }
157
- function getChatSettingsPath(chatId, startDir = process.cwd()) {
158
- return path.join(getClawminiDir(startDir), "chats", chatId, "settings.json");
159
- }
160
- function isValidAgentId(agentId) {
161
- if (!agentId || agentId.length === 0) return false;
162
- return /^[a-zA-Z0-9_]+(?:-[a-zA-Z0-9_]+)*$/.test(agentId);
163
- }
164
- function getAgentDir(agentId, startDir = process.cwd()) {
165
- if (!isValidAgentId(agentId)) throw new Error(`Invalid agent ID: ${agentId}`);
166
- return path.join(getClawminiDir(startDir), "agents", agentId);
167
- }
168
- function getAgentSettingsPath(agentId, startDir = process.cwd()) {
169
- return path.join(getAgentDir(agentId, startDir), "settings.json");
170
- }
171
- function getAgentSessionSettingsPath(agentId, sessionId, startDir = process.cwd()) {
172
- if (!isValidAgentId(agentId)) throw new Error(`Invalid agent ID: ${agentId}`);
173
- return path.join(getClawminiDir(startDir), "agents", agentId, "sessions", sessionId, "settings.json");
174
- }
175
- async function readJsonFile(filePath) {
176
- try {
177
- const data = await fs$1.readFile(filePath, "utf-8");
178
- return JSON.parse(data);
179
- } catch {
180
- return null;
181
- }
182
- }
183
- async function writeJsonFile(filePath, data) {
184
- const dir = path.dirname(filePath);
185
- await fs$1.mkdir(dir, { recursive: true });
186
- await fs$1.writeFile(filePath, JSON.stringify(data, null, 2), "utf-8");
187
- }
188
- async function readChatSettings(chatId, startDir = process.cwd()) {
189
- const data = await readJsonFile(getChatSettingsPath(chatId, startDir));
190
- if (!data) return null;
191
- const parsed = ChatSettingsSchema.safeParse(data);
192
- return parsed.success ? parsed.data : null;
193
- }
194
- async function writeChatSettings(chatId, data, startDir = process.cwd()) {
195
- await writeJsonFile(getChatSettingsPath(chatId, startDir), data);
196
- }
197
- const chatSettingsLocks = /* @__PURE__ */ new Map();
198
- async function updateChatSettings(chatId, updater, startDir = process.cwd()) {
199
- const prevLock = chatSettingsLocks.get(chatId) || Promise.resolve();
200
- let release;
201
- const nextLock = new Promise((resolve) => {
202
- release = resolve;
203
- });
204
- const nextLockPromise = prevLock.catch(() => {}).then(() => nextLock);
205
- chatSettingsLocks.set(chatId, nextLockPromise);
206
- try {
207
- await prevLock;
208
- await writeChatSettings(chatId, await updater(await readChatSettings(chatId, startDir) || {}), startDir);
209
- } finally {
210
- release();
211
- if (chatSettingsLocks.get(chatId) === nextLockPromise) chatSettingsLocks.delete(chatId);
212
- }
213
- }
214
- async function readAgentSessionSettings(agentId, sessionId, startDir = process.cwd()) {
215
- const data = await readJsonFile(getAgentSessionSettingsPath(agentId, sessionId, startDir));
216
- if (!data) return null;
217
- const parsed = AgentSessionSettingsSchema.safeParse(data);
218
- return parsed.success ? parsed.data : null;
219
- }
220
- async function writeAgentSessionSettings(agentId, sessionId, data, startDir = process.cwd()) {
221
- await writeJsonFile(getAgentSessionSettingsPath(agentId, sessionId, startDir), data);
222
- }
223
- async function getAgent(agentId, startDir = process.cwd()) {
224
- const filePath = getAgentSettingsPath(agentId, startDir);
225
- let dataStr;
226
- try {
227
- dataStr = await fs$1.readFile(filePath, "utf-8");
228
- } catch (err) {
229
- if (err && typeof err === "object" && "code" in err && err.code === "ENOENT") return null;
230
- throw err;
231
- }
232
- let data;
233
- try {
234
- data = JSON.parse(dataStr);
235
- } catch (parseErr) {
236
- const message = parseErr instanceof Error ? parseErr.message : String(parseErr);
237
- throw new Error(`Invalid JSON in ${filePath}: ${message}`, { cause: parseErr });
238
- }
239
- const parsed = AgentSchema.safeParse(data);
240
- if (!parsed.success) throw new Error(`Invalid schema in ${filePath}: ${parsed.error.message}`);
241
- return parsed.data;
242
- }
243
- async function writeAgentSettings(agentId, data, startDir = process.cwd()) {
244
- await ensureAgentWorkDir(agentId, data.directory, startDir);
245
- await writeJsonFile(getAgentSettingsPath(agentId, startDir), data);
246
- }
247
- async function listAgents(startDir = process.cwd()) {
248
- const agentsDir = path.join(getClawminiDir(startDir), "agents");
249
- try {
250
- const entries = await fs$1.readdir(agentsDir, { withFileTypes: true });
251
- const agentIds = [];
252
- for (const entry of entries) if (entry.isDirectory()) {
253
- const settingsPath = path.join(agentsDir, entry.name, "settings.json");
254
- try {
255
- await fs$1.access(settingsPath);
256
- agentIds.push(entry.name);
257
- } catch {}
258
- }
259
- return agentIds;
260
- } catch {
261
- return [];
262
- }
263
- }
264
- async function deleteAgent(agentId, startDir = process.cwd()) {
265
- const dir = getAgentDir(agentId, startDir);
266
- const agentsDir = path.join(getClawminiDir(startDir), "agents");
267
- if (!pathIsInsideDir(dir, agentsDir)) throw new Error(`Security Error: Cannot delete agent directory outside of ${agentsDir}`);
268
- try {
269
- await fs$1.rm(dir, {
270
- recursive: true,
271
- force: true
272
- });
273
- } catch {}
274
- }
275
- async function isDirectory(dirPath) {
276
- try {
277
- return (await fs$1.stat(dirPath)).isDirectory();
278
- } catch {
279
- return false;
280
- }
281
- }
282
- async function resolveTemplatePathBase(templateName, startDir = process.cwd()) {
283
- const workspaceRoot = getWorkspaceRoot(startDir);
284
- const localTemplatePath = path.join(workspaceRoot, ".clawmini", "templates", templateName);
285
- if (await isDirectory(localTemplatePath)) return localTemplatePath;
286
- let currentDir = path.dirname(fileURLToPath(import.meta.url));
287
- while (currentDir !== path.parse(currentDir).root && !fs.existsSync(path.join(currentDir, "package.json"))) currentDir = path.dirname(currentDir);
288
- const searchPath = path.join(currentDir, "templates", templateName);
289
- if (await isDirectory(searchPath)) return searchPath;
290
- throw new Error(`Template not found: ${templateName} (searched local: ${localTemplatePath}, built-in: ${searchPath})`);
291
- }
292
- async function resolveTemplatePath(templateName, startDir = process.cwd()) {
293
- if (templateName === "environments" || templateName.startsWith("environments/")) throw new Error(`Template not found: ${templateName}`);
294
- return resolveTemplatePathBase(templateName, startDir);
295
- }
296
- async function resolveEnvironmentTemplatePath(templateName, startDir = process.cwd()) {
297
- return resolveTemplatePathBase(path.join("environments", templateName), startDir);
298
- }
299
- async function resolveSkillsTemplatePath(startDir = process.cwd()) {
300
- return resolveTemplatePathBase("skills", startDir);
301
- }
302
- async function copyTemplateBase(templatePath, targetDir, allowMissingDir = false, overwrite = false) {
303
- try {
304
- if ((await fs$1.readdir(targetDir)).length > 0 && !overwrite) throw new Error(`Target directory is not empty: ${targetDir}`);
305
- } catch (err) {
306
- if (err && typeof err === "object" && "code" in err && err.code === "ENOENT") if (allowMissingDir) await fs$1.mkdir(targetDir, { recursive: true });
307
- else throw new Error(`Target directory does not exist: ${targetDir}`, { cause: err });
308
- else throw err;
309
- }
310
- await fs$1.cp(templatePath, targetDir, {
311
- recursive: true,
312
- force: true
313
- });
314
- }
315
- async function copyTemplate(templateName, targetDir, startDir = process.cwd()) {
316
- await copyTemplateBase(await resolveTemplatePath(templateName, startDir), targetDir, false);
317
- }
318
- async function resolveTargetAgentSkillsDir(agentId, startDir = process.cwd()) {
319
- const agentDir = getAgentDir(agentId, startDir);
320
- try {
321
- if (!(await fs$1.stat(agentDir)).isDirectory()) throw new Error(`Agent not found: ${agentId}`);
322
- } catch (err) {
323
- if (err && typeof err === "object" && "code" in err && err.code === "ENOENT") throw new Error(`Agent not found: ${agentId}`, { cause: err });
324
- throw err;
325
- }
326
- let agentData = null;
327
- try {
328
- agentData = await getAgent(agentId, startDir);
329
- } catch {}
330
- if (agentData) return resolveAgentSkillsDir(agentId, agentData, startDir);
331
- const workDir = resolveAgentWorkDir(agentId, void 0, startDir);
332
- return path.resolve(workDir, ".agents/skills");
333
- }
334
- async function copyEnvironmentTemplate(templateName, targetDir, startDir = process.cwd()) {
335
- await copyTemplateBase(await resolveEnvironmentTemplatePath(templateName, startDir), targetDir, true);
336
- }
337
- async function copyAgentSkills(agentId, startDir = process.cwd(), overwrite = false) {
338
- const targetDir = await resolveTargetAgentSkillsDir(agentId, startDir);
339
- await copyTemplateBase(await resolveSkillsTemplatePath(startDir), targetDir, true, overwrite);
340
- }
341
- async function copyAgentSkill(agentId, skillName, startDir = process.cwd(), overwrite = false) {
342
- const targetDir = await resolveTargetAgentSkillsDir(agentId, startDir);
343
- const templatePath = await resolveSkillsTemplatePath(startDir);
344
- const specificSkillPath = path.join(templatePath, skillName);
345
- try {
346
- if (!(await fs$1.stat(specificSkillPath)).isDirectory()) throw new Error(`Skill not found: ${skillName}`);
347
- } catch (err) {
348
- if (err && typeof err === "object" && "code" in err && err.code === "ENOENT") throw new Error(`Skill not found: ${skillName}`, { cause: err });
349
- throw err;
350
- }
351
- await copyTemplateBase(specificSkillPath, path.join(targetDir, skillName), true, overwrite);
352
- }
353
- async function applyTemplateToAgent(agentId, templateName, overrides, startDir = process.cwd()) {
354
- const agentWorkDir = resolveAgentWorkDir(agentId, overrides.directory, startDir);
355
- await copyTemplate(templateName, agentWorkDir, startDir);
356
- const settingsPath = path.join(agentWorkDir, "settings.json");
357
- try {
358
- const rawSettings = await fs$1.readFile(settingsPath, "utf-8");
359
- const parsedSettings = JSON.parse(rawSettings);
360
- const validation = AgentSchema.safeParse(parsedSettings);
361
- if (validation.success) {
362
- const templateData = validation.data;
363
- if (templateData.directory) {
364
- console.warn(`Warning: Ignoring 'directory' field from template settings.json. Using default or provided directory.`);
365
- delete templateData.directory;
366
- }
367
- const mergedEnv = {
368
- ...templateData.env || {},
369
- ...overrides.env || {}
370
- };
371
- const mergedData = {
372
- ...templateData,
373
- ...overrides
374
- };
375
- if (Object.keys(mergedEnv).length > 0) mergedData.env = mergedEnv;
376
- await writeAgentSettings(agentId, mergedData, startDir);
377
- }
378
- } catch {} finally {
379
- try {
380
- await fs$1.rm(settingsPath);
381
- } catch {}
382
- }
383
- }
384
- async function readSettings(startDir = process.cwd()) {
385
- const data = await readJsonFile(getSettingsPath(startDir));
386
- if (!data) return null;
387
- const parsed = SettingsSchema.safeParse(data);
388
- return parsed.success ? parsed.data : null;
389
- }
390
- async function writeSettings(data, startDir = process.cwd()) {
391
- await writeJsonFile(getSettingsPath(startDir), data);
392
- }
393
- async function readPolicies(startDir = process.cwd()) {
394
- const data = await readJsonFile(getPoliciesPath(startDir));
395
- if (!data) return null;
396
- if (data.policies && typeof data.policies === "object") return data;
397
- return null;
398
- }
399
- function getEnvironmentPath(name, startDir = process.cwd()) {
400
- return path.join(getClawminiDir(startDir), "environments", name);
401
- }
402
- async function readEnvironment(name, startDir = process.cwd()) {
403
- const data = await readJsonFile(path.join(getEnvironmentPath(name, startDir), "env.json"));
404
- if (!data) return null;
405
- const parsed = EnvironmentSchema.safeParse(data);
406
- return parsed.success ? parsed.data : null;
407
- }
408
- async function getActiveEnvironmentInfo(targetPath, startDir = process.cwd()) {
409
- const settings = await readSettings(startDir);
410
- if (!settings?.environments) return null;
411
- const workspaceRoot = getWorkspaceRoot(startDir);
412
- const resolvedTarget = path.resolve(workspaceRoot, targetPath);
413
- let bestMatch = null;
414
- let maxDepth = -1;
415
- for (const [envPath, envName] of Object.entries(settings.environments)) {
416
- const resolvedEnvPath = path.resolve(workspaceRoot, envPath);
417
- if (pathIsInsideDir(resolvedTarget, resolvedEnvPath, { allowSameDir: true })) {
418
- const depth = resolvedEnvPath.split(path.sep).length;
419
- if (depth > maxDepth) {
420
- maxDepth = depth;
421
- bestMatch = {
422
- name: envName,
423
- targetPath: resolvedEnvPath
424
- };
425
- }
426
- }
427
- }
428
- return bestMatch;
429
- }
430
- async function enableEnvironment(name, targetPath = "./", startDir = process.cwd()) {
431
- const targetDir = getEnvironmentPath(name, startDir);
432
- if (!fs.existsSync(targetDir)) {
433
- await copyEnvironmentTemplate(name, targetDir, startDir);
434
- console.log(`Copied environment template '${name}'.`);
435
- } else console.log(`Environment template '${name}' already exists in workspace.`);
436
- const settings = await readSettings(startDir) || { chats: { defaultId: "" } };
437
- const environments = settings.environments || {};
438
- environments[targetPath] = name;
439
- settings.environments = environments;
440
- await writeSettings(settings, startDir);
441
- console.log(`Enabled environment '${name}' for path '${targetPath}'.`);
442
- const envConfig = await readEnvironment(name, startDir);
443
- if (envConfig?.init) {
444
- const workspaceRoot = getWorkspaceRoot(startDir);
445
- const affectedDir = path.resolve(workspaceRoot, targetPath);
446
- console.log(`Executing init command for environment '${name}': ${envConfig.init}`);
447
- execSync(envConfig.init, {
448
- cwd: affectedDir,
449
- stdio: "inherit"
450
- });
451
- }
452
- }
453
-
454
- //#endregion
455
- export { writeAgentSessionSettings as C, pathIsInsideDir as D, writeSettings as E, CronJobSchema as O, updateChatSettings as S, writeChatSettings as T, readEnvironment as _, enableEnvironment as a, resolveAgentWorkDir as b, getClawminiDir as c, getSocketPath as d, getWorkspaceRoot as f, readChatSettings as g, readAgentSessionSettings as h, deleteAgent as i, SettingsSchema as k, getEnvironmentPath as l, listAgents as m, copyAgentSkill as n, getActiveEnvironmentInfo as o, isValidAgentId as p, copyAgentSkills as r, getAgent as s, applyTemplateToAgent as t, getSettingsPath as u, readPolicies as v, writeAgentSettings as w, resolveSkillsTemplatePath as x, readSettings as y };
456
- //# sourceMappingURL=workspace-BJmJBfKi.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"workspace-BJmJBfKi.mjs","names":["fsPromises"],"sources":["../src/shared/config.ts","../src/shared/utils/fs.ts","../src/shared/workspace.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const FallbackSchema = z.looseObject({\n commands: z\n .looseObject({\n new: z.string().optional(),\n append: z.string().optional(),\n getSessionId: z.string().optional(),\n getMessageContent: z.string().optional(),\n })\n .optional(),\n env: z.record(z.string(), z.union([z.string(), z.boolean()])).optional(),\n retries: z.number().int().min(0).default(1),\n delayMs: z.number().int().min(0).default(1000),\n});\n\nexport const AgentSchema = z.looseObject({\n commands: z\n .looseObject({\n new: z.string().optional(),\n append: z.string().optional(),\n getSessionId: z.string().optional(),\n getMessageContent: z.string().optional(),\n })\n .optional(),\n apiTokenEnvVar: z.string().optional(),\n apiUrlEnvVar: z.string().optional(),\n env: z.record(z.string(), z.union([z.string(), z.boolean()])).optional(),\n subagentEnv: z.record(z.string(), z.union([z.string(), z.boolean()])).optional(),\n directory: z.string().optional(),\n skillsDir: z.string().optional(),\n fallbacks: z.array(FallbackSchema).optional(),\n files: z.string().default('./attachments').optional(),\n});\n\nexport type Agent = z.infer<typeof AgentSchema>;\n\nexport type CronJob = {\n id: string;\n createdAt?: string;\n message: string;\n reply?: string;\n agentId?: string;\n env?: Record<string, string | boolean>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n session?: { type: string; [key: string]: any };\n schedule: { cron: string } | { every: string } | { at: string };\n nextSessionId?: string;\n action?: 'stop' | 'interrupt' | 'continue';\n jobs?: {\n add?: CronJob[];\n remove?: string[];\n };\n};\n\nexport const CronJobSchema = z.lazy(() =>\n z.looseObject({\n id: z.string().min(1),\n createdAt: z.string().optional(),\n message: z.string().default(''),\n reply: z.string().optional(),\n agentId: z.string().optional(),\n env: z.record(z.string(), z.union([z.string(), z.boolean()])).optional(),\n session: z.looseObject({ type: z.string() }).optional(),\n schedule: z.union([\n z.looseObject({ cron: z.string() }),\n z.looseObject({ every: z.string() }),\n z.looseObject({ at: z.string() }),\n ]),\n nextSessionId: z.string().optional(),\n action: z.enum(['stop', 'interrupt', 'continue']).optional(),\n jobs: z\n .looseObject({\n add: z.array(z.lazy(() => CronJobSchema)).optional(),\n remove: z.array(z.string()).optional(),\n })\n .optional(),\n })\n) as z.ZodType<CronJob>;\n\nexport const RouterConfigSchema = z.union([\n z.string(),\n z.looseObject({\n use: z.string(),\n with: z.record(z.string(), z.any()).optional(),\n }),\n]);\n\nexport type RouterConfig = z.infer<typeof RouterConfigSchema>;\n\nexport const SubagentTrackerSchema = z.looseObject({\n id: z.string(),\n agentId: z.string().optional(),\n sessionId: z.string().optional(),\n createdAt: z.string(),\n status: z.enum(['active', 'completed', 'failed']),\n parentId: z.string().optional(),\n});\n\nexport type SubagentTracker = z.infer<typeof SubagentTrackerSchema>;\n\nexport const ChatSettingsSchema = z.looseObject({\n defaultAgent: z.string().optional(),\n sessions: z.record(z.string(), z.string()).optional(),\n routers: z.array(RouterConfigSchema).optional(),\n jobs: z.array(CronJobSchema).optional(),\n subagents: z.record(z.string(), SubagentTrackerSchema).optional(),\n});\n\nexport type ChatSettings = z.infer<typeof ChatSettingsSchema>;\n\nexport const AgentSessionSettingsSchema = z.looseObject({\n env: z.record(z.string(), z.union([z.string(), z.boolean()])).optional(),\n});\n\nexport type AgentSessionSettings = z.infer<typeof AgentSessionSettingsSchema>;\n\nexport const EnvironmentSchema = z.looseObject({\n init: z.string().optional(),\n up: z.string().optional(),\n down: z.string().optional(),\n prefix: z.string().optional(),\n envFormat: z.string().optional(),\n exportLiteTo: z.string().optional(),\n env: z.record(z.string(), z.union([z.string(), z.boolean()])).optional(),\n});\n\nexport type Environment = z.infer<typeof EnvironmentSchema>;\n\nexport const SettingsSchema = z.looseObject({\n chats: z\n .looseObject({\n defaultId: z.string().optional(),\n })\n .optional(),\n defaultAgent: AgentSchema.optional(),\n environments: z.record(z.string(), z.string()).optional(),\n routers: z.array(RouterConfigSchema).optional(),\n files: z.string().default('./attachments').optional(),\n api: z\n .union([\n z.boolean(),\n z.looseObject({\n host: z.string().optional(),\n port: z.number().optional(),\n proxy_host: z.string().optional(),\n }),\n ])\n .optional(),\n});\n\nexport type Settings = z.infer<typeof SettingsSchema>;\n","import { sep } from 'node:path';\n\nexport function pathIsInsideDir(\n path: string,\n dir: string,\n { allowSameDir = false }: { allowSameDir?: boolean } = {}\n): boolean {\n const dirWithSep = dir.endsWith(sep) ? dir : dir + sep;\n if (allowSameDir && path === dir) {\n return true;\n }\n return path.startsWith(dirWithSep) && path !== dir;\n}\n","/* eslint-disable max-lines */\nimport { execSync } from 'node:child_process';\nimport type { PolicyConfig } from './policies.js';\nimport fs from 'node:fs';\nimport fsPromises from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport {\n type Agent,\n AgentSchema,\n type ChatSettings,\n ChatSettingsSchema,\n type AgentSessionSettings,\n AgentSessionSettingsSchema,\n type Environment,\n EnvironmentSchema,\n type Settings,\n SettingsSchema,\n} from './config.js';\nimport { pathIsInsideDir } from './utils/fs.js';\n\nexport function getWorkspaceRoot(startDir = process.cwd()): string {\n let curr = startDir;\n while (curr !== path.parse(curr).root) {\n if (fs.existsSync(path.join(curr, '.clawmini'))) {\n return curr;\n }\n if (fs.existsSync(path.join(curr, 'package.json')) || fs.existsSync(path.join(curr, '.git'))) {\n return curr;\n }\n curr = path.dirname(curr);\n }\n return startDir;\n}\n\nexport function resolveAgentWorkDir(\n agentId: string,\n customDir?: string,\n startDir = process.cwd()\n): string {\n const workspaceRoot = getWorkspaceRoot(startDir);\n let dirPath = workspaceRoot;\n if (customDir) {\n dirPath = path.resolve(workspaceRoot, customDir);\n } else if (agentId !== 'default') {\n dirPath = path.resolve(workspaceRoot, agentId);\n }\n\n if (!pathIsInsideDir(dirPath, workspaceRoot, { allowSameDir: true })) {\n throw new Error('Invalid agent directory: resolves outside the workspace.');\n }\n\n return dirPath;\n}\n\nexport function resolveAgentSkillsDir(\n agentId: string,\n agentData: Agent,\n startDir = process.cwd()\n): string {\n const workDir = resolveAgentWorkDir(agentId, agentData.directory, startDir);\n return path.resolve(workDir, agentData.skillsDir || '.agents/skills');\n}\n\nexport async function ensureAgentWorkDir(\n agentId: string,\n customDir?: string,\n startDir = process.cwd()\n): Promise<string> {\n const dirPath = resolveAgentWorkDir(agentId, customDir, startDir);\n\n if (!fs.existsSync(dirPath)) {\n await fsPromises.mkdir(dirPath, { recursive: true });\n console.log(`Created agent working directory at ${dirPath}`);\n }\n return dirPath;\n}\n\nexport function getClawminiDir(startDir = process.cwd()): string {\n return path.join(getWorkspaceRoot(startDir), '.clawmini');\n}\n\nexport function getSocketPath(startDir = process.cwd()): string {\n return path.join(getClawminiDir(startDir), 'daemon.sock');\n}\n\nexport function getSettingsPath(startDir = process.cwd()): string {\n return path.join(getClawminiDir(startDir), 'settings.json');\n}\n\nexport function getPoliciesPath(startDir = process.cwd()): string {\n return path.join(getClawminiDir(startDir), 'policies.json');\n}\n\nexport function getChatSettingsPath(chatId: string, startDir = process.cwd()): string {\n return path.join(getClawminiDir(startDir), 'chats', chatId, 'settings.json');\n}\n\nexport function isValidAgentId(agentId: string): boolean {\n if (!agentId || agentId.length === 0) return false;\n return /^[a-zA-Z0-9_]+(?:-[a-zA-Z0-9_]+)*$/.test(agentId);\n}\n\nexport function getAgentDir(agentId: string, startDir = process.cwd()): string {\n if (!isValidAgentId(agentId)) {\n throw new Error(`Invalid agent ID: ${agentId}`);\n }\n return path.join(getClawminiDir(startDir), 'agents', agentId);\n}\n\nexport function getAgentSettingsPath(agentId: string, startDir = process.cwd()): string {\n return path.join(getAgentDir(agentId, startDir), 'settings.json');\n}\n\nexport function getAgentSessionSettingsPath(\n agentId: string,\n sessionId: string,\n startDir = process.cwd()\n): string {\n if (!isValidAgentId(agentId)) {\n throw new Error(`Invalid agent ID: ${agentId}`);\n }\n return path.join(\n getClawminiDir(startDir),\n 'agents',\n agentId,\n 'sessions',\n sessionId,\n 'settings.json'\n );\n}\n\nasync function readJsonFile(filePath: string): Promise<Record<string, unknown> | null> {\n try {\n const data = await fsPromises.readFile(filePath, 'utf-8');\n return JSON.parse(data) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nasync function writeJsonFile(filePath: string, data: Record<string, unknown>): Promise<void> {\n const dir = path.dirname(filePath);\n await fsPromises.mkdir(dir, { recursive: true });\n await fsPromises.writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8');\n}\n\nexport async function readChatSettings(\n chatId: string,\n startDir = process.cwd()\n): Promise<ChatSettings | null> {\n const data = await readJsonFile(getChatSettingsPath(chatId, startDir));\n if (!data) return null;\n const parsed = ChatSettingsSchema.safeParse(data);\n return parsed.success ? parsed.data : null;\n}\n\nexport async function writeChatSettings(\n chatId: string,\n data: ChatSettings,\n startDir = process.cwd()\n): Promise<void> {\n await writeJsonFile(getChatSettingsPath(chatId, startDir), data as Record<string, unknown>);\n}\n\nexport const chatSettingsLocks = new Map<string, Promise<void>>();\n\nexport async function updateChatSettings(\n chatId: string,\n updater: (settings: ChatSettings) => ChatSettings | Promise<ChatSettings>,\n startDir = process.cwd()\n): Promise<void> {\n const prevLock = chatSettingsLocks.get(chatId) || Promise.resolve();\n let release!: () => void;\n const nextLock = new Promise<void>((resolve) => {\n release = resolve;\n });\n const nextLockPromise = prevLock.catch(() => {}).then(() => nextLock);\n chatSettingsLocks.set(chatId, nextLockPromise);\n\n try {\n await prevLock;\n const settings = (await readChatSettings(chatId, startDir)) || {};\n const updated = await updater(settings);\n await writeChatSettings(chatId, updated, startDir);\n } finally {\n release();\n if (chatSettingsLocks.get(chatId) === nextLockPromise) {\n chatSettingsLocks.delete(chatId);\n }\n }\n}\n\nexport async function readAgentSessionSettings(\n agentId: string,\n sessionId: string,\n startDir = process.cwd()\n): Promise<AgentSessionSettings | null> {\n const data = await readJsonFile(getAgentSessionSettingsPath(agentId, sessionId, startDir));\n if (!data) return null;\n const parsed = AgentSessionSettingsSchema.safeParse(data);\n return parsed.success ? parsed.data : null;\n}\n\nexport async function writeAgentSessionSettings(\n agentId: string,\n sessionId: string,\n data: AgentSessionSettings,\n startDir = process.cwd()\n): Promise<void> {\n await writeJsonFile(\n getAgentSessionSettingsPath(agentId, sessionId, startDir),\n data as Record<string, unknown>\n );\n}\n\nexport async function getAgent(agentId: string, startDir = process.cwd()): Promise<Agent | null> {\n const filePath = getAgentSettingsPath(agentId, startDir);\n let dataStr: string;\n try {\n dataStr = await fsPromises.readFile(filePath, 'utf-8');\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') return null;\n throw err;\n }\n\n let data: unknown;\n try {\n data = JSON.parse(dataStr);\n } catch (parseErr: unknown) {\n const message = parseErr instanceof Error ? parseErr.message : String(parseErr);\n throw new Error(`Invalid JSON in ${filePath}: ${message}`, { cause: parseErr });\n }\n\n const parsed = AgentSchema.safeParse(data);\n if (!parsed.success) {\n throw new Error(`Invalid schema in ${filePath}: ${parsed.error.message}`);\n }\n return parsed.data;\n}\n\nexport async function writeAgentSettings(\n agentId: string,\n data: Agent,\n startDir = process.cwd()\n): Promise<void> {\n await ensureAgentWorkDir(agentId, data.directory, startDir);\n await writeJsonFile(getAgentSettingsPath(agentId, startDir), data as Record<string, unknown>);\n}\n\nexport async function listAgents(startDir = process.cwd()): Promise<string[]> {\n const agentsDir = path.join(getClawminiDir(startDir), 'agents');\n try {\n const entries = await fsPromises.readdir(agentsDir, { withFileTypes: true });\n const agentIds = [];\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const settingsPath = path.join(agentsDir, entry.name, 'settings.json');\n try {\n await fsPromises.access(settingsPath);\n agentIds.push(entry.name);\n } catch {\n // No settings.json, probably just a sessions dir for a non-existent agent or default agent\n }\n }\n }\n return agentIds;\n } catch {\n return [];\n }\n}\n\nexport async function deleteAgent(agentId: string, startDir = process.cwd()): Promise<void> {\n const dir = getAgentDir(agentId, startDir);\n const agentsDir = path.join(getClawminiDir(startDir), 'agents');\n\n if (!pathIsInsideDir(dir, agentsDir)) {\n throw new Error(`Security Error: Cannot delete agent directory outside of ${agentsDir}`);\n }\n\n try {\n await fsPromises.rm(dir, { recursive: true, force: true });\n } catch {\n // Ignore if not found\n }\n}\n\nasync function isDirectory(dirPath: string): Promise<boolean> {\n try {\n const stat = await fsPromises.stat(dirPath);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function resolveTemplatePathBase(\n templateName: string,\n startDir = process.cwd()\n): Promise<string> {\n const workspaceRoot = getWorkspaceRoot(startDir);\n const localTemplatePath = path.join(workspaceRoot, '.clawmini', 'templates', templateName);\n\n if (await isDirectory(localTemplatePath)) {\n return localTemplatePath;\n }\n\n // Fallback to built-in templates\n // Find the clawmini package root by looking for package.json\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\n const searchPath = path.join(currentDir, 'templates', templateName);\n\n if (await isDirectory(searchPath)) {\n return searchPath;\n }\n\n throw new Error(\n `Template not found: ${templateName} (searched local: ${localTemplatePath}, built-in: ${searchPath})`\n );\n}\n\nexport async function resolveTemplatePath(\n templateName: string,\n startDir = process.cwd()\n): Promise<string> {\n if (templateName === 'environments' || templateName.startsWith('environments/')) {\n throw new Error(`Template not found: ${templateName}`);\n }\n return resolveTemplatePathBase(templateName, startDir);\n}\n\nexport async function resolveEnvironmentTemplatePath(\n templateName: string,\n startDir = process.cwd()\n): Promise<string> {\n return resolveTemplatePathBase(path.join('environments', templateName), startDir);\n}\n\nexport async function resolveSkillsTemplatePath(startDir = process.cwd()): Promise<string> {\n return resolveTemplatePathBase('skills', startDir);\n}\n\nexport async function copyTemplateBase(\n templatePath: string,\n targetDir: string,\n allowMissingDir: boolean = false,\n overwrite: boolean = false\n): Promise<void> {\n // Check if target directory exists and is not empty\n try {\n const entries = await fsPromises.readdir(targetDir);\n if (entries.length > 0 && !overwrite) {\n throw new Error(`Target directory is not empty: ${targetDir}`);\n }\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') {\n if (allowMissingDir) {\n await fsPromises.mkdir(targetDir, { recursive: true });\n } else {\n throw new Error(`Target directory does not exist: ${targetDir}`, { cause: err });\n }\n } else {\n throw err;\n }\n }\n\n // Recursively copy\n await fsPromises.cp(templatePath, targetDir, { recursive: true, force: true });\n}\n\nexport async function copyTemplate(\n templateName: string,\n targetDir: string,\n startDir = process.cwd()\n): Promise<void> {\n const templatePath = await resolveTemplatePath(templateName, startDir);\n await copyTemplateBase(templatePath, targetDir, false);\n}\n\nexport async function resolveTargetAgentSkillsDir(\n agentId: string,\n startDir = process.cwd()\n): Promise<string> {\n const agentDir = getAgentDir(agentId, startDir);\n try {\n const stat = await fsPromises.stat(agentDir);\n if (!stat.isDirectory()) {\n throw new Error(`Agent not found: ${agentId}`);\n }\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') {\n throw new Error(`Agent not found: ${agentId}`, { cause: err });\n }\n throw err;\n }\n\n let agentData: Agent | null = null;\n try {\n agentData = await getAgent(agentId, startDir);\n } catch {\n // Ignore malformed settings.json\n }\n\n if (agentData) {\n return resolveAgentSkillsDir(agentId, agentData, startDir);\n }\n\n const workDir = resolveAgentWorkDir(agentId, undefined, startDir);\n return path.resolve(workDir, '.agents/skills');\n}\n\nexport async function copyEnvironmentTemplate(\n templateName: string,\n targetDir: string,\n startDir = process.cwd()\n): Promise<void> {\n const templatePath = await resolveEnvironmentTemplatePath(templateName, startDir);\n await copyTemplateBase(templatePath, targetDir, true);\n}\n\nexport async function copyAgentSkills(\n agentId: string,\n startDir = process.cwd(),\n overwrite = false\n): Promise<void> {\n const targetDir = await resolveTargetAgentSkillsDir(agentId, startDir);\n const templatePath = await resolveSkillsTemplatePath(startDir);\n await copyTemplateBase(templatePath, targetDir, true, overwrite);\n}\n\nexport async function copyAgentSkill(\n agentId: string,\n skillName: string,\n startDir = process.cwd(),\n overwrite = false\n): Promise<void> {\n const targetDir = await resolveTargetAgentSkillsDir(agentId, startDir);\n const templatePath = await resolveSkillsTemplatePath(startDir);\n const specificSkillPath = path.join(templatePath, skillName);\n\n try {\n const stat = await fsPromises.stat(specificSkillPath);\n if (!stat.isDirectory()) {\n throw new Error(`Skill not found: ${skillName}`);\n }\n } catch (err: unknown) {\n if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') {\n throw new Error(`Skill not found: ${skillName}`, { cause: err });\n }\n throw err;\n }\n\n const skillTargetDir = path.join(targetDir, skillName);\n await copyTemplateBase(specificSkillPath, skillTargetDir, true, overwrite);\n}\n\nexport async function applyTemplateToAgent(\n agentId: string,\n templateName: string,\n overrides: Agent,\n startDir = process.cwd()\n): Promise<void> {\n const agentWorkDir = resolveAgentWorkDir(agentId, overrides.directory, startDir);\n await copyTemplate(templateName, agentWorkDir, startDir);\n\n const settingsPath = path.join(agentWorkDir, 'settings.json');\n try {\n const rawSettings = await fsPromises.readFile(settingsPath, 'utf-8');\n const parsedSettings = JSON.parse(rawSettings);\n const validation = AgentSchema.safeParse(parsedSettings);\n\n if (validation.success) {\n const templateData = validation.data;\n if (templateData.directory) {\n console.warn(\n `Warning: Ignoring 'directory' field from template settings.json. Using default or provided directory.`\n );\n delete templateData.directory;\n }\n\n // Merge: overrides take precedence over templateData\n const mergedEnv = { ...(templateData.env || {}), ...(overrides.env || {}) };\n const mergedData: Agent = { ...templateData, ...overrides };\n if (Object.keys(mergedEnv).length > 0) {\n mergedData.env = mergedEnv;\n }\n\n await writeAgentSettings(agentId, mergedData, startDir);\n }\n } catch {\n // Ignore parsing or file not found errors\n } finally {\n try {\n await fsPromises.rm(settingsPath);\n } catch {\n // Ignore if it doesn't exist\n }\n }\n}\n\nexport async function readSettings(startDir = process.cwd()): Promise<Settings | null> {\n const data = await readJsonFile(getSettingsPath(startDir));\n if (!data) return null;\n const parsed = SettingsSchema.safeParse(data);\n return parsed.success ? parsed.data : null;\n}\n\nexport async function writeSettings(data: Settings, startDir = process.cwd()): Promise<void> {\n await writeJsonFile(getSettingsPath(startDir), data as Record<string, unknown>);\n}\n\nexport async function readPolicies(startDir = process.cwd()): Promise<PolicyConfig | null> {\n const data = await readJsonFile(getPoliciesPath(startDir));\n if (!data) return null;\n // Basic validation, assuming PolicyConfig structure\n if (data.policies && typeof data.policies === 'object') {\n return data as unknown as PolicyConfig;\n }\n return null;\n}\n\nexport function getEnvironmentPath(name: string, startDir = process.cwd()): string {\n return path.join(getClawminiDir(startDir), 'environments', name);\n}\n\nexport async function readEnvironment(\n name: string,\n startDir = process.cwd()\n): Promise<Environment | null> {\n const data = await readJsonFile(path.join(getEnvironmentPath(name, startDir), 'env.json'));\n if (!data) return null;\n const parsed = EnvironmentSchema.safeParse(data);\n return parsed.success ? parsed.data : null;\n}\n\nexport async function getActiveEnvironmentInfo(\n targetPath: string,\n startDir = process.cwd()\n): Promise<{ name: string; targetPath: string } | null> {\n const settings = await readSettings(startDir);\n if (!settings?.environments) return null;\n\n const workspaceRoot = getWorkspaceRoot(startDir);\n const resolvedTarget = path.resolve(workspaceRoot, targetPath);\n\n let bestMatch: { name: string; targetPath: string } | null = null;\n let maxDepth = -1;\n\n for (const [envPath, envName] of Object.entries(settings.environments)) {\n const resolvedEnvPath = path.resolve(workspaceRoot, envPath);\n\n if (pathIsInsideDir(resolvedTarget, resolvedEnvPath, { allowSameDir: true })) {\n const depth = resolvedEnvPath.split(path.sep).length;\n if (depth > maxDepth) {\n maxDepth = depth;\n bestMatch = { name: envName, targetPath: resolvedEnvPath };\n }\n }\n }\n\n return bestMatch;\n}\n\nexport async function getActiveEnvironmentName(\n targetPath: string,\n startDir = process.cwd()\n): Promise<string | null> {\n const info = await getActiveEnvironmentInfo(targetPath, startDir);\n return info ? info.name : null;\n}\n\nexport async function enableEnvironment(\n name: string,\n targetPath: string = './',\n startDir = process.cwd()\n): Promise<void> {\n const targetDir = getEnvironmentPath(name, startDir);\n\n // Copy template to targetDir if it does not already exist\n if (!fs.existsSync(targetDir)) {\n await copyEnvironmentTemplate(name, targetDir, startDir);\n console.log(`Copied environment template '${name}'.`);\n } else {\n console.log(`Environment template '${name}' already exists in workspace.`);\n }\n\n const settings = (await readSettings(startDir)) || { chats: { defaultId: '' } };\n const environments = settings.environments || {};\n\n environments[targetPath] = name;\n settings.environments = environments;\n\n await writeSettings(settings, startDir);\n console.log(`Enabled environment '${name}' for path '${targetPath}'.`);\n\n // Execute init command if present\n const envConfig = await readEnvironment(name, startDir);\n if (envConfig?.init) {\n // Get the target directory for the environment\n const workspaceRoot = getWorkspaceRoot(startDir);\n const affectedDir = path.resolve(workspaceRoot, targetPath);\n console.log(`Executing init command for environment '${name}': ${envConfig.init}`);\n execSync(envConfig.init, { cwd: affectedDir, stdio: 'inherit' });\n }\n}\n"],"mappings":"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"}