clawmini 0.0.3 → 0.0.5
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.
- package/README.md +19 -0
- package/dist/adapter-discord/index.d.mts.map +1 -1
- package/dist/adapter-discord/index.mjs +398 -193
- package/dist/adapter-discord/index.mjs.map +1 -1
- package/dist/adapter-google-chat/index.d.mts +5 -0
- package/dist/adapter-google-chat/index.d.mts.map +1 -0
- package/dist/adapter-google-chat/index.mjs +1077 -0
- package/dist/adapter-google-chat/index.mjs.map +1 -0
- package/dist/cli/index.mjs +107 -14
- package/dist/cli/index.mjs.map +1 -1
- package/dist/cli/lite.mjs +175 -16
- package/dist/cli/lite.mjs.map +1 -1
- package/dist/cli/propose-policy.d.mts +1 -0
- package/dist/cli/propose-policy.mjs +7159 -0
- package/dist/cli/propose-policy.mjs.map +1 -0
- package/dist/daemon/index.d.mts.map +1 -1
- package/dist/daemon/index.mjs +1427 -513
- package/dist/daemon/index.mjs.map +1 -1
- package/dist/{lite-oSYSvaOr.mjs → lite-CBxOT1y5.mjs} +101 -24
- package/dist/lite-CBxOT1y5.mjs.map +1 -0
- package/dist/routing-D8rTxtaV.mjs +245 -0
- package/dist/routing-D8rTxtaV.mjs.map +1 -0
- package/dist/web/_app/immutable/assets/0.C-4eziNy.css +1 -0
- package/dist/web/_app/immutable/assets/4.Cc_xwLNl.css +1 -0
- package/dist/web/_app/immutable/chunks/B6YN0Nuq.js +1 -0
- package/dist/web/_app/immutable/chunks/{Dc-UOHw9.js → BmRlVmv6.js} +1 -1
- package/{web/.svelte-kit/output/client/_app/immutable/chunks/8YNcRyEk.js → dist/web/_app/immutable/chunks/C20lZMGz.js} +1 -1
- package/dist/web/_app/immutable/chunks/C9lbZ-kT.js +1 -0
- package/dist/web/_app/immutable/chunks/CK9JZLaG.js +2 -0
- package/dist/web/_app/immutable/chunks/CME08kGM.js +1 -0
- package/dist/web/_app/immutable/chunks/{BPy8HLo7.js → Ck-be5J2.js} +1 -1
- package/dist/web/_app/immutable/chunks/Ck3rYNON.js +1 -0
- package/dist/web/_app/immutable/chunks/DMtIqaiV.js +2 -0
- package/dist/web/_app/immutable/chunks/{B8yYFADm.js → DhD271EB.js} +1 -1
- package/dist/web/_app/immutable/chunks/{DcrmIfTj.js → DpuLqk8d.js} +1 -1
- package/dist/web/_app/immutable/chunks/{ZkLyk0mE.js → Drm9vgeP.js} +1 -1
- package/dist/web/_app/immutable/chunks/DsIToJCP.js +1 -0
- package/dist/web/_app/immutable/chunks/{CyNaE55B.js → Zeh-C-mx.js} +1 -1
- package/{web/.svelte-kit/output/client/_app/immutable/entry/app.DO5eYwVz.js → dist/web/_app/immutable/entry/app.BgB5VkRU.js} +2 -2
- package/dist/web/_app/immutable/entry/start.DuxJo6av.js +1 -0
- package/dist/web/_app/immutable/nodes/0.C9oFZP9h.js +1 -0
- package/dist/web/_app/immutable/nodes/1.BON2Wk6k.js +1 -0
- package/dist/web/_app/immutable/nodes/{2.CK3CLC0f.js → 2.BnwnD1Ki.js} +1 -1
- package/dist/web/_app/immutable/nodes/{3.ncP0xLO6.js → 3.CIs4tjjw.js} +1 -1
- package/dist/web/_app/immutable/nodes/4.DLarELN4.js +60 -0
- package/dist/web/_app/immutable/nodes/{5.BpJUN6QH.js → 5.CE_QKy_3.js} +1 -1
- package/dist/web/_app/version.json +1 -1
- package/dist/web/index.html +12 -12
- package/dist/{workspace-DjoNjhW0.mjs → workspace-BJmJBfKi.mjs} +103 -11
- package/dist/workspace-BJmJBfKi.mjs.map +1 -0
- package/docs/14_google_chat_adapter/development_log.md +40 -0
- package/docs/14_google_chat_adapter/notes.md +28 -0
- package/docs/14_google_chat_adapter/prd.md +35 -0
- package/docs/14_google_chat_adapter/questions.md +9 -0
- package/docs/14_google_chat_adapter/tickets.md +117 -0
- package/docs/15_sandbox_policies/tickets.md +33 -0
- package/docs/16_session_timeout/development_log.md +20 -0
- package/docs/16_session_timeout/notes.md +44 -0
- package/docs/16_session_timeout/prd.md +106 -0
- package/docs/16_session_timeout/questions.md +10 -0
- package/docs/16_session_timeout/tickets.md +64 -0
- package/docs/17_auto_approve_policy/development_log.md +29 -0
- package/docs/17_auto_approve_policy/notes.md +25 -0
- package/docs/17_auto_approve_policy/prd.md +34 -0
- package/docs/17_auto_approve_policy/questions.md +10 -0
- package/docs/17_auto_approve_policy/tickets.md +11 -0
- package/docs/18_clawmini_skills/development_log.md +36 -0
- package/docs/18_clawmini_skills/notes.md +8 -0
- package/docs/18_clawmini_skills/prd.md +45 -0
- package/docs/18_clawmini_skills/questions.md +10 -0
- package/docs/18_clawmini_skills/tickets.md +55 -0
- package/docs/19_subagents/development_log.md +69 -0
- package/docs/19_subagents/notes.md +18 -0
- package/docs/19_subagents/prd.md +156 -0
- package/docs/19_subagents/questions.md +13 -0
- package/docs/19_subagents/tickets.md +113 -0
- package/docs/20_chat_logs_cleanup/development_log.md +50 -0
- package/docs/20_chat_logs_cleanup/notes.md +43 -0
- package/docs/20_chat_logs_cleanup/prd.md +232 -0
- package/docs/20_chat_logs_cleanup/questions.md +2 -0
- package/docs/20_chat_logs_cleanup/tickets.md +98 -0
- package/docs/20_webui_markdown/development_log.md +36 -0
- package/docs/20_webui_markdown/notes.md +23 -0
- package/docs/20_webui_markdown/prd.md +49 -0
- package/docs/20_webui_markdown/questions.md +10 -0
- package/docs/20_webui_markdown/tickets.md +55 -0
- package/docs/21_adapter_filtering/development_log.md +29 -0
- package/docs/21_adapter_filtering/notes.md +25 -0
- package/docs/21_adapter_filtering/prd.md +44 -0
- package/docs/21_adapter_filtering/questions.md +12 -0
- package/docs/21_adapter_filtering/tickets.md +38 -0
- package/docs/21_built_in_routers/development_log.md +17 -0
- package/docs/21_built_in_routers/notes.md +27 -0
- package/docs/21_built_in_routers/prd.md +34 -0
- package/docs/21_built_in_routers/questions.md +4 -0
- package/docs/21_built_in_routers/tickets.md +25 -0
- package/docs/21_fancy_policies/development_log.md +38 -0
- package/docs/21_fancy_policies/notes.md +27 -0
- package/docs/21_fancy_policies/prd.md +58 -0
- package/docs/21_fancy_policies/questions.md +6 -0
- package/docs/21_fancy_policies/tickets.md +48 -0
- package/docs/22_adapter_multi_chat/development_log.md +76 -0
- package/docs/22_adapter_multi_chat/notes.md +42 -0
- package/docs/22_adapter_multi_chat/prd.md +76 -0
- package/docs/22_adapter_multi_chat/questions.md +16 -0
- package/docs/22_adapter_multi_chat/tickets.md +164 -0
- package/docs/23_custom_token_env/development_log.md +31 -0
- package/docs/23_custom_token_env/notes.md +16 -0
- package/docs/23_custom_token_env/prd.md +42 -0
- package/docs/23_custom_token_env/questions.md +8 -0
- package/docs/23_custom_token_env/tickets.md +54 -0
- package/docs/guides/discord_adapter_setup.md +15 -2
- package/docs/guides/google_chat_adapter_setup.md +145 -0
- package/napkin.md +5 -0
- package/package.json +7 -2
- package/src/adapter-discord/config.test.ts +27 -8
- package/src/adapter-discord/config.ts +6 -8
- package/src/adapter-discord/forwarder.test.ts +307 -114
- package/src/adapter-discord/forwarder.ts +260 -75
- package/src/adapter-discord/index.test.ts +278 -0
- package/src/adapter-discord/index.ts +160 -30
- package/src/adapter-discord/interactions.test.ts +96 -0
- package/src/adapter-discord/interactions.ts +156 -0
- package/src/adapter-discord/state.test.ts +9 -8
- package/src/adapter-discord/state.ts +51 -8
- package/src/adapter-google-chat/auth.test.ts +87 -0
- package/src/adapter-google-chat/auth.ts +132 -0
- package/src/adapter-google-chat/cards.ts +71 -0
- package/src/adapter-google-chat/client.test.ts +561 -0
- package/src/adapter-google-chat/client.ts +430 -0
- package/src/adapter-google-chat/config.test.ts +187 -0
- package/src/adapter-google-chat/config.ts +82 -0
- package/src/adapter-google-chat/cron.test.ts +143 -0
- package/src/adapter-google-chat/cron.ts +81 -0
- package/src/adapter-google-chat/forwarder.test.ts +537 -0
- package/src/adapter-google-chat/forwarder.ts +349 -0
- package/src/adapter-google-chat/index.test.ts +62 -0
- package/src/adapter-google-chat/index.ts +61 -0
- package/src/adapter-google-chat/state.test.ts +96 -0
- package/src/adapter-google-chat/state.ts +85 -0
- package/src/adapter-google-chat/subscriptions.ts +124 -0
- package/src/adapter-google-chat/upload.ts +88 -0
- package/src/adapter-google-chat/utils.test.ts +111 -0
- package/src/adapter-google-chat/utils.ts +133 -0
- package/src/cli/commands/init.ts +0 -7
- package/src/cli/commands/messages.ts +18 -3
- package/src/cli/commands/policies.ts +70 -0
- package/src/cli/commands/skills.ts +71 -0
- package/src/cli/commands/web-api/chats.ts +5 -1
- package/src/cli/e2e/basic.test.ts +1 -1
- package/src/cli/e2e/cron.test.ts +1 -1
- package/src/cli/e2e/daemon.test.ts +132 -4
- package/src/cli/e2e/export-lite-func.test.ts +54 -31
- package/src/cli/e2e/fallbacks.test.ts +8 -6
- package/src/cli/e2e/init.test.ts +7 -0
- package/src/cli/e2e/messages.test.ts +90 -55
- package/src/cli/e2e/propose-policy.test.ts +203 -0
- package/src/cli/e2e/requests.test.ts +15 -0
- package/src/cli/e2e/session-timeout.test.ts +192 -0
- package/src/cli/e2e/skills.test.ts +55 -0
- package/src/cli/e2e/slash-new.test.ts +93 -0
- package/src/cli/e2e/subagents.test.ts +106 -0
- package/src/cli/index.ts +4 -0
- package/src/cli/lite.ts +51 -11
- package/src/cli/propose-policy.ts +91 -0
- package/src/cli/subagent-commands.ts +215 -0
- package/src/daemon/agent/agent-context.ts +89 -0
- package/src/daemon/agent/agent-extractors.ts +68 -0
- package/src/daemon/agent/agent-runner.ts +153 -0
- package/src/daemon/agent/agent-session.ts +261 -0
- package/src/daemon/agent/chat-logger.test.ts +158 -0
- package/src/daemon/agent/chat-logger.ts +188 -0
- package/src/daemon/agent/task-scheduler.test.ts +202 -0
- package/src/daemon/agent/task-scheduler.ts +276 -0
- package/src/daemon/agent/types.ts +84 -0
- package/src/daemon/agent/utils.ts +7 -0
- package/src/daemon/api/agent-router.ts +166 -18
- package/src/daemon/api/index.test.ts +50 -18
- package/src/daemon/api/policy-request.test.ts +39 -2
- package/src/daemon/api/subagent-router.test.ts +108 -0
- package/src/daemon/api/subagent-router.ts +296 -0
- package/src/daemon/api/subagent-utils.test.ts +56 -0
- package/src/daemon/api/subagent-utils.ts +130 -0
- package/src/daemon/api/user-router.ts +30 -13
- package/src/daemon/auth.ts +1 -0
- package/src/daemon/chats.ts +6 -0
- package/src/daemon/cron.test.ts +66 -1
- package/src/daemon/cron.ts +35 -8
- package/src/daemon/index.ts +23 -0
- package/src/daemon/message-agent.test.ts +11 -25
- package/src/daemon/message-extraction.test.ts +10 -27
- package/src/daemon/message-fallbacks.test.ts +13 -35
- package/src/daemon/message-interruption.test.ts +70 -53
- package/src/daemon/message-jobs.test.ts +138 -0
- package/src/daemon/message-queue.test.ts +30 -43
- package/src/daemon/message-router.test.ts +12 -11
- package/src/daemon/message-session.test.ts +41 -28
- package/src/daemon/message-typing.test.ts +19 -6
- package/src/daemon/message.ts +103 -515
- package/src/daemon/policy-request-service.ts +8 -3
- package/src/daemon/policy-utils.ts +19 -1
- package/src/daemon/queue.ts +16 -0
- package/src/daemon/request-store.test.ts +4 -0
- package/src/daemon/routers/session-timeout.test.ts +122 -0
- package/src/daemon/routers/session-timeout.ts +71 -0
- package/src/daemon/routers/slash-new.ts +3 -1
- package/src/daemon/routers/slash-policies.test.ts +26 -13
- package/src/daemon/routers/slash-policies.ts +39 -29
- package/src/daemon/routers/types.ts +8 -0
- package/src/daemon/routers.ts +64 -2
- package/src/daemon/utils/spawn.ts +6 -8
- package/src/shared/adapters/commands.test.ts +155 -0
- package/src/shared/adapters/commands.ts +125 -0
- package/src/shared/adapters/filtering.test.ts +111 -0
- package/src/shared/adapters/filtering.ts +57 -0
- package/src/shared/adapters/routing.test.ts +144 -0
- package/src/shared/adapters/routing.ts +109 -0
- package/src/shared/agent-utils.ts +10 -0
- package/src/shared/chats.test.ts +145 -3
- package/src/shared/chats.ts +215 -18
- package/src/shared/config.ts +67 -15
- package/src/shared/lite.ts +22 -18
- package/src/shared/policies.ts +7 -0
- package/src/shared/workspace.test.ts +45 -1
- package/src/shared/workspace.ts +119 -6
- package/templates/debug/settings.json +5 -2
- package/templates/environments/cladding/env.json +2 -2
- package/templates/gemini/.gemini/hooks/check-subagents.mjs +23 -0
- package/templates/gemini/.gemini/hooks/clawmini-logging.sh +17 -0
- package/templates/gemini/.gemini/hooks/insert-pending.sh +9 -0
- package/templates/gemini/.gemini/settings.json +50 -0
- package/templates/gemini/settings.json +22 -8
- package/templates/gemini-claw/.gemini/base-system.md +100 -0
- package/templates/gemini-claw/.gemini/hooks/check-subagents.mjs +23 -0
- package/templates/gemini-claw/.gemini/hooks/clawmini-logging.sh +1 -1
- package/templates/gemini-claw/.gemini/settings.json +13 -0
- package/templates/gemini-claw/.gemini/subagent-system.md +7 -0
- package/templates/gemini-claw/.gemini/system.md +3 -99
- package/templates/gemini-claw/settings.json +27 -22
- package/templates/skills/clawmini-requests/SKILL.md +92 -0
- package/templates/skills/clawmini-subagents/SKILL.md +79 -0
- package/templates/skills/skill-creator/SKILL.md +60 -0
- package/tsdown.config.ts +10 -1
- package/web/.svelte-kit/generated/server/internal.js +2 -1
- package/web/.svelte-kit/non-ambient.d.ts +2 -0
- package/web/.svelte-kit/output/client/.vite/manifest.json +141 -138
- package/web/.svelte-kit/output/client/_app/immutable/assets/0.C-4eziNy.css +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/assets/4.Cc_xwLNl.css +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/B6YN0Nuq.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{Dc-UOHw9.js → BmRlVmv6.js} +1 -1
- package/{dist/web/_app/immutable/chunks/8YNcRyEk.js → web/.svelte-kit/output/client/_app/immutable/chunks/C20lZMGz.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/C9lbZ-kT.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/CK9JZLaG.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/CME08kGM.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{BPy8HLo7.js → Ck-be5J2.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/Ck3rYNON.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/DMtIqaiV.js +2 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{B8yYFADm.js → DhD271EB.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{DcrmIfTj.js → DpuLqk8d.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{ZkLyk0mE.js → Drm9vgeP.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/DsIToJCP.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/chunks/{CyNaE55B.js → Zeh-C-mx.js} +1 -1
- package/{dist/web/_app/immutable/entry/app.DO5eYwVz.js → web/.svelte-kit/output/client/_app/immutable/entry/app.BgB5VkRU.js} +2 -2
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.DuxJo6av.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/0.C9oFZP9h.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/1.BON2Wk6k.js +1 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{2.CK3CLC0f.js → 2.BnwnD1Ki.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{3.ncP0xLO6.js → 3.CIs4tjjw.js} +1 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/4.DLarELN4.js +60 -0
- package/web/.svelte-kit/output/client/_app/immutable/nodes/{5.BpJUN6QH.js → 5.CE_QKy_3.js} +1 -1
- package/web/.svelte-kit/output/client/_app/version.json +1 -1
- package/web/.svelte-kit/output/server/.vite/manifest.json +12 -3
- package/web/.svelte-kit/output/server/_app/immutable/assets/_layout.C-4eziNy.css +1 -0
- package/web/.svelte-kit/output/server/_app/immutable/assets/_page.Cc_xwLNl.css +1 -0
- package/web/.svelte-kit/output/server/chunks/app-state.svelte.js +5 -0
- package/web/.svelte-kit/output/server/chunks/bot.js +4 -4
- package/web/.svelte-kit/output/server/chunks/client.js +2 -1
- package/web/.svelte-kit/output/server/chunks/exports.js +0 -1
- package/web/.svelte-kit/output/server/chunks/internal.js +2 -1
- package/web/.svelte-kit/output/server/chunks/root.js +482 -392
- package/web/.svelte-kit/output/server/entries/pages/_layout.svelte.js +57 -7
- package/web/.svelte-kit/output/server/entries/pages/chats/_id_/_page.svelte.js +234 -9
- package/web/.svelte-kit/output/server/index.js +82 -10
- package/web/.svelte-kit/output/server/manifest-full.js +1 -1
- package/web/.svelte-kit/output/server/manifest.js +1 -1
- package/web/.svelte-kit/output/server/nodes/0.js +2 -2
- package/web/.svelte-kit/output/server/nodes/1.js +1 -1
- package/web/.svelte-kit/output/server/nodes/2.js +1 -1
- package/web/.svelte-kit/output/server/nodes/3.js +1 -1
- package/web/.svelte-kit/output/server/nodes/4.js +2 -2
- package/web/.svelte-kit/output/server/nodes/5.js +1 -1
- package/web/.svelte-kit/types/src/routes/$types.d.ts +1 -2
- package/web/.svelte-kit/types/src/routes/agents/$types.d.ts +1 -2
- package/web/.svelte-kit/types/src/routes/chats/[id]/$types.d.ts +1 -2
- package/web/.svelte-kit/types/src/routes/chats/[id]/settings/$types.d.ts +1 -2
- package/web/package.json +8 -0
- package/web/src/lib/app-state.svelte.ts +5 -1
- package/web/src/lib/components/app/markdown-renderer.svelte +56 -0
- package/web/src/lib/components/app/markdown-renderer.svelte.spec.ts +44 -0
- package/web/src/lib/components/app/message-content.svelte +16 -0
- package/web/src/lib/types.ts +67 -3
- package/web/src/routes/+layout.svelte +31 -1
- package/web/src/routes/chats/[id]/+page.svelte +167 -18
- package/web/src/routes/chats/[id]/page.svelte.spec.ts +58 -7
- package/dist/lite-oSYSvaOr.mjs.map +0 -1
- package/dist/web/_app/immutable/assets/0.GI4C4dpV.css +0 -1
- package/dist/web/_app/immutable/chunks/B5abRDXp.js +0 -1
- package/dist/web/_app/immutable/chunks/Bi0jeV7Q.js +0 -1
- package/dist/web/_app/immutable/chunks/BmUXQ3wy.js +0 -2
- package/dist/web/_app/immutable/chunks/C3k55nDF.js +0 -1
- package/dist/web/_app/immutable/chunks/CpaGRn9L.js +0 -1
- package/dist/web/_app/immutable/chunks/DG5RZBw-.js +0 -2
- package/dist/web/_app/immutable/chunks/DQoygso7.js +0 -1
- package/dist/web/_app/immutable/entry/start.D48mVn1m.js +0 -1
- package/dist/web/_app/immutable/nodes/0.B-0CcADM.js +0 -1
- package/dist/web/_app/immutable/nodes/1.FixKgvRO.js +0 -1
- package/dist/web/_app/immutable/nodes/4.CQYJEgv8.js +0 -1
- package/dist/workspace-DjoNjhW0.mjs.map +0 -1
- package/src/daemon/message-verbosity.test.ts +0 -127
- package/web/.svelte-kit/output/client/_app/immutable/assets/0.GI4C4dpV.css +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/B5abRDXp.js +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/Bi0jeV7Q.js +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/BmUXQ3wy.js +0 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/C3k55nDF.js +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/CpaGRn9L.js +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/chunks/DG5RZBw-.js +0 -2
- package/web/.svelte-kit/output/client/_app/immutable/chunks/DQoygso7.js +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/entry/start.D48mVn1m.js +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/0.B-0CcADM.js +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/1.FixKgvRO.js +0 -1
- package/web/.svelte-kit/output/client/_app/immutable/nodes/4.CQYJEgv8.js +0 -1
- package/web/.svelte-kit/output/server/_app/immutable/assets/_layout.GI4C4dpV.css +0 -1
- /package/templates/{gemini-claw/.gemini/skills → skills}/clawmini-jobs/SKILL.md +0 -0
package/dist/cli/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["handleError","fs"],"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/index.ts"],"sourcesContent":["import { type Agent } from './config.js';\nimport {\n writeAgentSettings,\n applyTemplateToAgent,\n readChatSettings,\n writeChatSettings,\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 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 routers: [\n '@clawmini/slash-new',\n '@clawmini/slash-stop',\n '@clawmini/slash-interrupt',\n '@clawmini/slash-policies',\n '@clawmini/slash-command',\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(chatId, options.lines);\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') {\n console.log(`[USER] ${msg.content}`);\n } else if (msg.role === '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\n let messages = await getMessages(chatId);\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","#!/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';\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(downCmd);\nprogram.addCommand(upCmd);\nprogram.addCommand(webCmd);\nprogram.addCommand(jobsCmd);\nprogram.addCommand(exportLiteCmd);\n\nprogram.parse();\n"],"mappings":"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"}
|
|
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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"}
|
package/dist/cli/lite.mjs
CHANGED
|
@@ -3538,7 +3538,7 @@ var require_objectSpread2 = __commonJS({ "../../node_modules/.pnpm/@oxc-project+
|
|
|
3538
3538
|
var import_objectSpread2$11 = __toESM(require_objectSpread2(), 1);
|
|
3539
3539
|
|
|
3540
3540
|
//#endregion
|
|
3541
|
-
//#region node_modules/@trpc/server/dist/tracked-
|
|
3541
|
+
//#region node_modules/@trpc/server/dist/tracked-DiE3uR1B.mjs
|
|
3542
3542
|
var import_defineProperty$6 = __toESM(require_defineProperty(), 1);
|
|
3543
3543
|
var import_objectSpread2$1$11 = __toESM(require_objectSpread2(), 1);
|
|
3544
3544
|
/** @internal */
|
|
@@ -3653,7 +3653,7 @@ function getTransformer(transformer) {
|
|
|
3653
3653
|
}
|
|
3654
3654
|
|
|
3655
3655
|
//#endregion
|
|
3656
|
-
//#region node_modules/@trpc/client/dist/httpUtils-
|
|
3656
|
+
//#region node_modules/@trpc/client/dist/httpUtils-pyf5RF99.mjs
|
|
3657
3657
|
const isFunction = (fn) => typeof fn === "function";
|
|
3658
3658
|
function getFetch(customFetchImpl) {
|
|
3659
3659
|
if (customFetchImpl) return customFetchImpl;
|
|
@@ -3732,7 +3732,7 @@ const throwIfAborted = (signal) => {
|
|
|
3732
3732
|
throw new AbortError();
|
|
3733
3733
|
};
|
|
3734
3734
|
async function fetchHTTPResponse(opts) {
|
|
3735
|
-
var _opts$methodOverride;
|
|
3735
|
+
var _opts$methodOverride, _opts$trpcAcceptHeade;
|
|
3736
3736
|
throwIfAborted(opts.signal);
|
|
3737
3737
|
const url = opts.getUrl(opts);
|
|
3738
3738
|
const body = opts.getBody(opts);
|
|
@@ -3742,7 +3742,7 @@ async function fetchHTTPResponse(opts) {
|
|
|
3742
3742
|
if (Symbol.iterator in heads) return Object.fromEntries(heads);
|
|
3743
3743
|
return heads;
|
|
3744
3744
|
})();
|
|
3745
|
-
const headers = (0, import_objectSpread2$9.default)((0, import_objectSpread2$9.default)((0, import_objectSpread2$9.default)({}, opts.contentTypeHeader && method !== "GET" ? { "content-type": opts.contentTypeHeader } : {}), opts.trpcAcceptHeader ? { "trpc-accept": opts.trpcAcceptHeader } : void 0), resolvedHeaders);
|
|
3745
|
+
const headers = (0, import_objectSpread2$9.default)((0, import_objectSpread2$9.default)((0, import_objectSpread2$9.default)({}, opts.contentTypeHeader && method !== "GET" ? { "content-type": opts.contentTypeHeader } : {}), opts.trpcAcceptHeader ? { [(_opts$trpcAcceptHeade = opts.trpcAcceptHeaderKey) !== null && _opts$trpcAcceptHeade !== void 0 ? _opts$trpcAcceptHeade : "trpc-accept"]: opts.trpcAcceptHeader } : void 0), resolvedHeaders);
|
|
3746
3746
|
return getFetch(opts.fetch)(url, {
|
|
3747
3747
|
method,
|
|
3748
3748
|
signal: opts.signal,
|
|
@@ -3763,7 +3763,7 @@ async function httpRequest(opts) {
|
|
|
3763
3763
|
}
|
|
3764
3764
|
|
|
3765
3765
|
//#endregion
|
|
3766
|
-
//#region node_modules/@trpc/client/dist/httpLink-
|
|
3766
|
+
//#region node_modules/@trpc/client/dist/httpLink-lG_6juPY.mjs
|
|
3767
3767
|
function isOctetType(input) {
|
|
3768
3768
|
return input instanceof Uint8Array || input instanceof Blob;
|
|
3769
3769
|
}
|
|
@@ -3839,7 +3839,7 @@ function httpLink(opts) {
|
|
|
3839
3839
|
}
|
|
3840
3840
|
|
|
3841
3841
|
//#endregion
|
|
3842
|
-
//#region node_modules/@trpc/client/dist/httpBatchLink-
|
|
3842
|
+
//#region node_modules/@trpc/client/dist/httpBatchLink-LhidKAPw.mjs
|
|
3843
3843
|
var import_objectSpread2$7 = __toESM$1(require_objectSpread2$1(), 1);
|
|
3844
3844
|
|
|
3845
3845
|
//#endregion
|
|
@@ -4329,13 +4329,148 @@ var import_awaitAsyncGenerator = __toESM$1(require_awaitAsyncGenerator(), 1);
|
|
|
4329
4329
|
var import_wrapAsyncGenerator = __toESM$1(require_wrapAsyncGenerator(), 1);
|
|
4330
4330
|
var import_objectSpread2 = __toESM$1(require_objectSpread2$1(), 1);
|
|
4331
4331
|
|
|
4332
|
+
//#endregion
|
|
4333
|
+
//#region src/cli/subagent-commands.ts
|
|
4334
|
+
function registerSubagentCommands(program, getClient) {
|
|
4335
|
+
const subagents = program.command("subagents").description("Manage subagents");
|
|
4336
|
+
subagents.command("spawn <message>").description("Spawn a new subagent").option("-a, --agent <name>", "Target agent name").option("-i, --id <subagentId>", "Optional custom ID for the subagent").option("--async", "Run asynchronously without blocking").action(async (message, options) => {
|
|
4337
|
+
try {
|
|
4338
|
+
const client = getClient();
|
|
4339
|
+
const result = await client.subagentSpawn.mutate({
|
|
4340
|
+
targetAgentId: options.agent,
|
|
4341
|
+
prompt: message,
|
|
4342
|
+
subagentId: options.id,
|
|
4343
|
+
async: options.async
|
|
4344
|
+
});
|
|
4345
|
+
console.log(`Subagent spawned successfully with ID: ${result.id}`);
|
|
4346
|
+
if (!result.isAsync) {
|
|
4347
|
+
console.log(`Waiting for subagent ${result.id} to complete...`);
|
|
4348
|
+
let waitResult;
|
|
4349
|
+
do
|
|
4350
|
+
waitResult = await client.subagentWait.mutate({ subagentId: result.id });
|
|
4351
|
+
while (waitResult.status === "active");
|
|
4352
|
+
if (waitResult.status === "completed" && waitResult.output) console.log(`\n<subagent_output>\n${waitResult.output}\n</subagent_output>`);
|
|
4353
|
+
else console.log(`Subagent status: ${waitResult.status}`);
|
|
4354
|
+
}
|
|
4355
|
+
} catch (err) {
|
|
4356
|
+
console.error("Error:", err instanceof Error ? err.message : err);
|
|
4357
|
+
process.exit(1);
|
|
4358
|
+
}
|
|
4359
|
+
});
|
|
4360
|
+
subagents.command("send <subagentId>").description("Send a message to a subagent").requiredOption("-p, --prompt <prompt>", "Prompt to send").option("--async", "Run asynchronously without blocking").action(async (subagentId, options) => {
|
|
4361
|
+
try {
|
|
4362
|
+
const client = getClient();
|
|
4363
|
+
await client.subagentSend.mutate({
|
|
4364
|
+
subagentId,
|
|
4365
|
+
prompt: options.prompt,
|
|
4366
|
+
async: options.async
|
|
4367
|
+
});
|
|
4368
|
+
console.log(`Message sent to subagent ${subagentId}`);
|
|
4369
|
+
if (!options.async) {
|
|
4370
|
+
let waitResult;
|
|
4371
|
+
do
|
|
4372
|
+
waitResult = await client.subagentWait.mutate({ subagentId });
|
|
4373
|
+
while (waitResult.status === "active");
|
|
4374
|
+
if (waitResult.status === "completed" && waitResult.output) console.log(`\n<subagent_output>\n${waitResult.output}\n</subagent_output>`);
|
|
4375
|
+
else console.log(`Subagent status: ${waitResult.status}`);
|
|
4376
|
+
}
|
|
4377
|
+
} catch (err) {
|
|
4378
|
+
console.error("Error:", err instanceof Error ? err.message : err);
|
|
4379
|
+
process.exit(1);
|
|
4380
|
+
}
|
|
4381
|
+
});
|
|
4382
|
+
subagents.command("wait <subagentId>").description("Wait for a subagent to complete").action(async (subagentId) => {
|
|
4383
|
+
try {
|
|
4384
|
+
const client = getClient();
|
|
4385
|
+
let result;
|
|
4386
|
+
do
|
|
4387
|
+
result = await client.subagentWait.mutate({ subagentId });
|
|
4388
|
+
while (result.status === "active");
|
|
4389
|
+
if (result.status === "completed" && "output" in result && result.output) console.log(result.output);
|
|
4390
|
+
else console.log(`Subagent status: ${result.status}`);
|
|
4391
|
+
} catch (err) {
|
|
4392
|
+
console.error("Error:", err instanceof Error ? err.message : err);
|
|
4393
|
+
process.exit(1);
|
|
4394
|
+
}
|
|
4395
|
+
});
|
|
4396
|
+
subagents.command("stop <subagentId>").description("Stop a subagent").action(async (subagentId) => {
|
|
4397
|
+
try {
|
|
4398
|
+
await getClient().subagentStop.mutate({ subagentId });
|
|
4399
|
+
console.log(`Subagent ${subagentId} stopped`);
|
|
4400
|
+
} catch (err) {
|
|
4401
|
+
console.error("Error:", err instanceof Error ? err.message : err);
|
|
4402
|
+
process.exit(1);
|
|
4403
|
+
}
|
|
4404
|
+
});
|
|
4405
|
+
subagents.command("delete <subagentId>").description("Delete a subagent").action(async (subagentId) => {
|
|
4406
|
+
try {
|
|
4407
|
+
if ((await getClient().subagentDelete.mutate({ subagentId })).deleted) console.log(`Subagent ${subagentId} deleted`);
|
|
4408
|
+
else console.log(`Subagent ${subagentId} not found`);
|
|
4409
|
+
} catch (err) {
|
|
4410
|
+
console.error("Error:", err instanceof Error ? err.message : err);
|
|
4411
|
+
process.exit(1);
|
|
4412
|
+
}
|
|
4413
|
+
});
|
|
4414
|
+
subagents.command("list").description("List all subagents").option("--blocking", "Filter for subagents that block the current agent").option("--json", "Output as JSON").action(async (options) => {
|
|
4415
|
+
try {
|
|
4416
|
+
const subagents = (await getClient().subagentList.query({ blocking: options.blocking })).subagents;
|
|
4417
|
+
if (options.json) {
|
|
4418
|
+
console.log(JSON.stringify(subagents, null, 2));
|
|
4419
|
+
return;
|
|
4420
|
+
}
|
|
4421
|
+
if (subagents.length === 0) {
|
|
4422
|
+
console.log("No subagents found.");
|
|
4423
|
+
return;
|
|
4424
|
+
}
|
|
4425
|
+
for (const sub of subagents) {
|
|
4426
|
+
console.log(`\n=== Subagent: ${sub.id || "N/A"} ===`);
|
|
4427
|
+
console.log(` Agent: ${sub.agentId || "N/A"}`);
|
|
4428
|
+
console.log(` Status: ${sub.status || "N/A"}`);
|
|
4429
|
+
console.log(` Created: ${sub.createdAt || "N/A"}`);
|
|
4430
|
+
console.log(` Session ID: ${sub.sessionId || "N/A"}`);
|
|
4431
|
+
if (sub.parentId) console.log(` Parent ID: ${sub.parentId}`);
|
|
4432
|
+
}
|
|
4433
|
+
console.log();
|
|
4434
|
+
} catch (err) {
|
|
4435
|
+
console.error("Error:", err instanceof Error ? err.message : err);
|
|
4436
|
+
process.exit(1);
|
|
4437
|
+
}
|
|
4438
|
+
});
|
|
4439
|
+
subagents.command("tail <subagentId>").description("View message history for a specific subagent").option("-n, --lines <number>", "Number of messages to show", parseInt).option("--json", "Output raw JSONL format").action(async (subagentId, options) => {
|
|
4440
|
+
try {
|
|
4441
|
+
const messages = (await getClient().subagentTail.query({
|
|
4442
|
+
subagentId,
|
|
4443
|
+
limit: options.lines
|
|
4444
|
+
})).messages;
|
|
4445
|
+
if (options.json) messages.forEach((msg) => console.log(JSON.stringify(msg)));
|
|
4446
|
+
else messages.forEach((msg) => {
|
|
4447
|
+
if (msg.role === "user" || msg.displayRole === "user") console.log(`[USER] ${msg.content}`);
|
|
4448
|
+
else if (msg.role === "agent" || msg.displayRole === "agent") console.log(`[AGENT] ${msg.content.trim()}`);
|
|
4449
|
+
else if (msg.role === "policy") console.log(`[POLICY] ${msg.commandName} ${msg.args.join(" ")}`);
|
|
4450
|
+
else if (msg.role === "tool") console.log(`[TOOL] ${msg.name}`);
|
|
4451
|
+
else if (msg.role === "system") {
|
|
4452
|
+
if (msg.content) console.log(`[LOG] ${msg.content.trim()}`);
|
|
4453
|
+
} else if (msg.role === "command" || msg.role === "legacy_log") {
|
|
4454
|
+
if (msg.content) console.log(`[LOG] ${msg.content.trim()}`);
|
|
4455
|
+
else if (msg.stderr) console.error(`[STDERR] ${msg.stderr.trim()}`);
|
|
4456
|
+
}
|
|
4457
|
+
});
|
|
4458
|
+
} catch (err) {
|
|
4459
|
+
console.error("Error:", err instanceof Error ? err.message : err);
|
|
4460
|
+
process.exit(1);
|
|
4461
|
+
}
|
|
4462
|
+
});
|
|
4463
|
+
}
|
|
4464
|
+
|
|
4332
4465
|
//#endregion
|
|
4333
4466
|
//#region src/cli/lite.ts
|
|
4334
4467
|
/**
|
|
4335
4468
|
* clawmini-lite - A standalone client
|
|
4336
4469
|
*/
|
|
4337
|
-
const
|
|
4338
|
-
const
|
|
4470
|
+
const urlVarName = process.env.CLAW_LITE_URL_VAR || "CLAW_API_URL";
|
|
4471
|
+
const API_URL = process.env.CLAW_LITE_URL_VAR ? process.env[process.env.CLAW_LITE_URL_VAR] : process.env.CLAW_API_URL;
|
|
4472
|
+
const tokenVarName = process.env.CLAW_LITE_API_VAR || "CLAW_API_TOKEN";
|
|
4473
|
+
const API_TOKEN = process.env.CLAW_LITE_API_VAR ? process.env[process.env.CLAW_LITE_API_VAR] : process.env.CLAW_API_TOKEN;
|
|
4339
4474
|
function getClient() {
|
|
4340
4475
|
return createTRPCClient({ links: [httpLink({
|
|
4341
4476
|
url: API_URL,
|
|
@@ -4350,18 +4485,35 @@ function getClient() {
|
|
|
4350
4485
|
const program = new Command();
|
|
4351
4486
|
program.name("clawmini-lite").description("A standalone client for clawmini").hook("preAction", () => {
|
|
4352
4487
|
if (!API_URL || !API_TOKEN) {
|
|
4353
|
-
console.error(
|
|
4488
|
+
console.error(`${urlVarName} and ${tokenVarName} must be set in the environment.`);
|
|
4354
4489
|
process.exit(1);
|
|
4355
4490
|
}
|
|
4356
4491
|
});
|
|
4357
|
-
program.command("
|
|
4492
|
+
program.command("reply <message>").description("Emit an AgentReplyMessage").option("-f, --file <path>", "File path(s) to attach (can specify multiple)", (val, prev) => prev.concat([val]), []).action(async (message, options) => {
|
|
4358
4493
|
try {
|
|
4359
4494
|
const files = options.file.length > 0 ? options.file : void 0;
|
|
4360
|
-
const payload = {};
|
|
4361
|
-
if (message !== void 0) payload.message = message;
|
|
4495
|
+
const payload = { message };
|
|
4362
4496
|
if (files !== void 0) payload.files = files;
|
|
4363
|
-
await getClient().
|
|
4364
|
-
console.log("
|
|
4497
|
+
await getClient().logReplyMessage.mutate(payload);
|
|
4498
|
+
console.log("Reply message appended.");
|
|
4499
|
+
} catch (err) {
|
|
4500
|
+
console.error("Error:", err instanceof Error ? err.message : err);
|
|
4501
|
+
process.exit(1);
|
|
4502
|
+
}
|
|
4503
|
+
});
|
|
4504
|
+
program.command("tool <name> <payload>", { hidden: true }).description("Emit a ToolMessage").action(async (name, payload) => {
|
|
4505
|
+
try {
|
|
4506
|
+
let parsedPayload;
|
|
4507
|
+
try {
|
|
4508
|
+
parsedPayload = JSON.parse(payload);
|
|
4509
|
+
} catch {
|
|
4510
|
+
parsedPayload = payload;
|
|
4511
|
+
}
|
|
4512
|
+
await getClient().logToolMessage.mutate({
|
|
4513
|
+
name,
|
|
4514
|
+
payload: parsedPayload
|
|
4515
|
+
});
|
|
4516
|
+
console.log("Tool message appended.");
|
|
4365
4517
|
} catch (err) {
|
|
4366
4518
|
console.error("Error:", err instanceof Error ? err.message : err);
|
|
4367
4519
|
process.exit(1);
|
|
@@ -4474,13 +4626,20 @@ program.command("request <cmd>").description("Submit a sandbox policy request").
|
|
|
4474
4626
|
args: opaqueArgs,
|
|
4475
4627
|
fileMappings
|
|
4476
4628
|
});
|
|
4477
|
-
|
|
4478
|
-
|
|
4629
|
+
if (request.executionResult) {
|
|
4630
|
+
if (request.executionResult.stdout) process.stdout.write(request.executionResult.stdout);
|
|
4631
|
+
if (request.executionResult.stderr) process.stderr.write(request.executionResult.stderr);
|
|
4632
|
+
process.exit(request.executionResult.exitCode);
|
|
4633
|
+
} else {
|
|
4634
|
+
console.log(`Request created successfully.`);
|
|
4635
|
+
console.log(`Request ID: ${request.id}`);
|
|
4636
|
+
}
|
|
4479
4637
|
} catch (err) {
|
|
4480
4638
|
console.error("Error:", err instanceof Error ? err.message : err);
|
|
4481
4639
|
process.exit(1);
|
|
4482
4640
|
}
|
|
4483
4641
|
});
|
|
4642
|
+
registerSubagentCommands(program, getClient);
|
|
4484
4643
|
program.parse(process.argv);
|
|
4485
4644
|
|
|
4486
4645
|
//#endregion
|