compact-agent 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/README.md +394 -0
  2. package/bin/anycode.js +2 -0
  3. package/bin/crowcoder.js +19 -0
  4. package/bin/ecc-hooks.cjs +138 -0
  5. package/dist/agents.d.ts +17 -0
  6. package/dist/agents.js +1603 -0
  7. package/dist/agents.js.map +1 -0
  8. package/dist/api.d.ts +16 -0
  9. package/dist/api.js +115 -0
  10. package/dist/api.js.map +1 -0
  11. package/dist/autonomous-loops.d.ts +108 -0
  12. package/dist/autonomous-loops.js +526 -0
  13. package/dist/autonomous-loops.js.map +1 -0
  14. package/dist/codemaps.d.ts +53 -0
  15. package/dist/codemaps.js +325 -0
  16. package/dist/codemaps.js.map +1 -0
  17. package/dist/compaction.d.ts +30 -0
  18. package/dist/compaction.js +125 -0
  19. package/dist/compaction.js.map +1 -0
  20. package/dist/config.d.ts +5 -0
  21. package/dist/config.js +79 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/content-engine.d.ts +97 -0
  24. package/dist/content-engine.js +721 -0
  25. package/dist/content-engine.js.map +1 -0
  26. package/dist/cost-tracker.d.ts +49 -0
  27. package/dist/cost-tracker.js +150 -0
  28. package/dist/cost-tracker.js.map +1 -0
  29. package/dist/counter-button.d.ts +35 -0
  30. package/dist/counter-button.js +48 -0
  31. package/dist/counter-button.js.map +1 -0
  32. package/dist/counter.d.ts +21 -0
  33. package/dist/counter.js +31 -0
  34. package/dist/counter.js.map +1 -0
  35. package/dist/coverage.d.ts +23 -0
  36. package/dist/coverage.js +215 -0
  37. package/dist/coverage.js.map +1 -0
  38. package/dist/docs-sync.d.ts +23 -0
  39. package/dist/docs-sync.js +266 -0
  40. package/dist/docs-sync.js.map +1 -0
  41. package/dist/ecc.d.ts +41 -0
  42. package/dist/ecc.js +644 -0
  43. package/dist/ecc.js.map +1 -0
  44. package/dist/evaluation.d.ts +24 -0
  45. package/dist/evaluation.js +412 -0
  46. package/dist/evaluation.js.map +1 -0
  47. package/dist/export.d.ts +22 -0
  48. package/dist/export.js +109 -0
  49. package/dist/export.js.map +1 -0
  50. package/dist/git-workflow.d.ts +22 -0
  51. package/dist/git-workflow.js +197 -0
  52. package/dist/git-workflow.js.map +1 -0
  53. package/dist/hook-controls.d.ts +34 -0
  54. package/dist/hook-controls.js +90 -0
  55. package/dist/hook-controls.js.map +1 -0
  56. package/dist/hooks.d.ts +30 -0
  57. package/dist/hooks.js +130 -0
  58. package/dist/hooks.js.map +1 -0
  59. package/dist/html-parser.d.ts +18 -0
  60. package/dist/html-parser.js +101 -0
  61. package/dist/html-parser.js.map +1 -0
  62. package/dist/index.d.ts +12 -0
  63. package/dist/index.js +1230 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/learning.d.ts +35 -0
  66. package/dist/learning.js +238 -0
  67. package/dist/learning.js.map +1 -0
  68. package/dist/login.d.ts +37 -0
  69. package/dist/login.js +191 -0
  70. package/dist/login.js.map +1 -0
  71. package/dist/memory.d.ts +39 -0
  72. package/dist/memory.js +183 -0
  73. package/dist/memory.js.map +1 -0
  74. package/dist/model-router.d.ts +23 -0
  75. package/dist/model-router.js +145 -0
  76. package/dist/model-router.js.map +1 -0
  77. package/dist/modes.d.ts +17 -0
  78. package/dist/modes.js +217 -0
  79. package/dist/modes.js.map +1 -0
  80. package/dist/orchestration.d.ts +37 -0
  81. package/dist/orchestration.js +139 -0
  82. package/dist/orchestration.js.map +1 -0
  83. package/dist/package-detect.d.ts +36 -0
  84. package/dist/package-detect.js +529 -0
  85. package/dist/package-detect.js.map +1 -0
  86. package/dist/permissions.d.ts +25 -0
  87. package/dist/permissions.js +50 -0
  88. package/dist/permissions.js.map +1 -0
  89. package/dist/pm2-manager.d.ts +40 -0
  90. package/dist/pm2-manager.js +127 -0
  91. package/dist/pm2-manager.js.map +1 -0
  92. package/dist/query.d.ts +15 -0
  93. package/dist/query.js +278 -0
  94. package/dist/query.js.map +1 -0
  95. package/dist/refactor.d.ts +22 -0
  96. package/dist/refactor.js +226 -0
  97. package/dist/refactor.js.map +1 -0
  98. package/dist/retry.d.ts +20 -0
  99. package/dist/retry.js +88 -0
  100. package/dist/retry.js.map +1 -0
  101. package/dist/rules.d.ts +34 -0
  102. package/dist/rules.js +942 -0
  103. package/dist/rules.js.map +1 -0
  104. package/dist/schema.d.ts +23 -0
  105. package/dist/schema.js +12 -0
  106. package/dist/schema.js.map +1 -0
  107. package/dist/search-first.d.ts +17 -0
  108. package/dist/search-first.js +301 -0
  109. package/dist/search-first.js.map +1 -0
  110. package/dist/security.d.ts +10 -0
  111. package/dist/security.js +145 -0
  112. package/dist/security.js.map +1 -0
  113. package/dist/sessions.d.ts +21 -0
  114. package/dist/sessions.js +112 -0
  115. package/dist/sessions.js.map +1 -0
  116. package/dist/skill-create.d.ts +38 -0
  117. package/dist/skill-create.js +389 -0
  118. package/dist/skill-create.js.map +1 -0
  119. package/dist/skills.d.ts +34 -0
  120. package/dist/skills.js +161 -0
  121. package/dist/skills.js.map +1 -0
  122. package/dist/strategic-compaction.d.ts +24 -0
  123. package/dist/strategic-compaction.js +144 -0
  124. package/dist/strategic-compaction.js.map +1 -0
  125. package/dist/system-prompt.d.ts +3 -0
  126. package/dist/system-prompt.js +101 -0
  127. package/dist/system-prompt.js.map +1 -0
  128. package/dist/theme.d.ts +60 -0
  129. package/dist/theme.js +220 -0
  130. package/dist/theme.js.map +1 -0
  131. package/dist/tools/bash.d.ts +2 -0
  132. package/dist/tools/bash.js +49 -0
  133. package/dist/tools/bash.js.map +1 -0
  134. package/dist/tools/edit.d.ts +2 -0
  135. package/dist/tools/edit.js +76 -0
  136. package/dist/tools/edit.js.map +1 -0
  137. package/dist/tools/glob.d.ts +2 -0
  138. package/dist/tools/glob.js +54 -0
  139. package/dist/tools/glob.js.map +1 -0
  140. package/dist/tools/grep.d.ts +2 -0
  141. package/dist/tools/grep.js +64 -0
  142. package/dist/tools/grep.js.map +1 -0
  143. package/dist/tools/index.d.ts +5 -0
  144. package/dist/tools/index.js +27 -0
  145. package/dist/tools/index.js.map +1 -0
  146. package/dist/tools/list-dir.d.ts +2 -0
  147. package/dist/tools/list-dir.js +51 -0
  148. package/dist/tools/list-dir.js.map +1 -0
  149. package/dist/tools/read.d.ts +2 -0
  150. package/dist/tools/read.js +56 -0
  151. package/dist/tools/read.js.map +1 -0
  152. package/dist/tools/types.d.ts +45 -0
  153. package/dist/tools/types.js +2 -0
  154. package/dist/tools/types.js.map +1 -0
  155. package/dist/tools/web-fetch.d.ts +2 -0
  156. package/dist/tools/web-fetch.js +41 -0
  157. package/dist/tools/web-fetch.js.map +1 -0
  158. package/dist/tools/web-search.d.ts +27 -0
  159. package/dist/tools/web-search.js +139 -0
  160. package/dist/tools/web-search.js.map +1 -0
  161. package/dist/tools/write.d.ts +2 -0
  162. package/dist/tools/write.js +36 -0
  163. package/dist/tools/write.js.map +1 -0
  164. package/dist/types.d.ts +28 -0
  165. package/dist/types.js +57 -0
  166. package/dist/types.js.map +1 -0
  167. package/dist/users.d.ts +51 -0
  168. package/dist/users.js +193 -0
  169. package/dist/users.js.map +1 -0
  170. package/dist/verification.d.ts +73 -0
  171. package/dist/verification.js +269 -0
  172. package/dist/verification.js.map +1 -0
  173. package/dist/walkthrough.d.ts +10 -0
  174. package/dist/walkthrough.js +121 -0
  175. package/dist/walkthrough.js.map +1 -0
  176. package/package.json +58 -0
  177. package/resources/ecc/agents/architect.json +16 -0
  178. package/resources/ecc/agents/architect.md +212 -0
  179. package/resources/ecc/agents/build-error-resolver.json +17 -0
  180. package/resources/ecc/agents/build-error-resolver.md +116 -0
  181. package/resources/ecc/agents/chief-of-staff.json +17 -0
  182. package/resources/ecc/agents/chief-of-staff.md +153 -0
  183. package/resources/ecc/agents/code-reviewer.json +16 -0
  184. package/resources/ecc/agents/code-reviewer.md +238 -0
  185. package/resources/ecc/agents/database-reviewer.json +16 -0
  186. package/resources/ecc/agents/database-reviewer.md +92 -0
  187. package/resources/ecc/agents/doc-updater.json +16 -0
  188. package/resources/ecc/agents/doc-updater.md +108 -0
  189. package/resources/ecc/agents/e2e-runner.json +17 -0
  190. package/resources/ecc/agents/e2e-runner.md +109 -0
  191. package/resources/ecc/agents/go-build-resolver.json +17 -0
  192. package/resources/ecc/agents/go-build-resolver.md +96 -0
  193. package/resources/ecc/agents/go-reviewer.json +16 -0
  194. package/resources/ecc/agents/go-reviewer.md +77 -0
  195. package/resources/ecc/agents/harness-optimizer.json +15 -0
  196. package/resources/ecc/agents/harness-optimizer.md +34 -0
  197. package/resources/ecc/agents/loop-operator.json +16 -0
  198. package/resources/ecc/agents/loop-operator.md +36 -0
  199. package/resources/ecc/agents/planner.json +15 -0
  200. package/resources/ecc/agents/planner.md +212 -0
  201. package/resources/ecc/agents/python-reviewer.json +16 -0
  202. package/resources/ecc/agents/python-reviewer.md +99 -0
  203. package/resources/ecc/agents/refactor-cleaner.json +17 -0
  204. package/resources/ecc/agents/refactor-cleaner.md +87 -0
  205. package/resources/ecc/agents/security-reviewer.json +16 -0
  206. package/resources/ecc/agents/security-reviewer.md +109 -0
  207. package/resources/ecc/agents/tdd-guide.json +17 -0
  208. package/resources/ecc/agents/tdd-guide.md +93 -0
  209. package/resources/ecc/commands/add-language-rules.md +39 -0
  210. package/resources/ecc/commands/database-migration.md +36 -0
  211. package/resources/ecc/commands/feature-development.md +38 -0
  212. package/resources/ecc/prompts/build-fix.prompt.md +47 -0
  213. package/resources/ecc/prompts/code-review.prompt.md +56 -0
  214. package/resources/ecc/prompts/plan.prompt.md +52 -0
  215. package/resources/ecc/prompts/refactor.prompt.md +50 -0
  216. package/resources/ecc/prompts/security-review.prompt.md +70 -0
  217. package/resources/ecc/prompts/tdd.prompt.md +47 -0
  218. package/resources/ecc/rules/common-agents.md +53 -0
  219. package/resources/ecc/rules/common-coding-style.md +52 -0
  220. package/resources/ecc/rules/common-development-workflow.md +33 -0
  221. package/resources/ecc/rules/common-git-workflow.md +28 -0
  222. package/resources/ecc/rules/common-hooks.md +34 -0
  223. package/resources/ecc/rules/common-patterns.md +35 -0
  224. package/resources/ecc/rules/common-performance.md +59 -0
  225. package/resources/ecc/rules/common-security.md +33 -0
  226. package/resources/ecc/rules/common-testing.md +33 -0
  227. package/resources/ecc/rules/golang-coding-style.md +31 -0
  228. package/resources/ecc/rules/golang-hooks.md +16 -0
  229. package/resources/ecc/rules/golang-patterns.md +44 -0
  230. package/resources/ecc/rules/golang-security.md +33 -0
  231. package/resources/ecc/rules/golang-testing.md +30 -0
  232. package/resources/ecc/rules/kotlin-coding-style.md +39 -0
  233. package/resources/ecc/rules/kotlin-hooks.md +16 -0
  234. package/resources/ecc/rules/kotlin-patterns.md +50 -0
  235. package/resources/ecc/rules/kotlin-security.md +58 -0
  236. package/resources/ecc/rules/kotlin-testing.md +38 -0
  237. package/resources/ecc/rules/php-coding-style.md +25 -0
  238. package/resources/ecc/rules/php-hooks.md +21 -0
  239. package/resources/ecc/rules/php-patterns.md +23 -0
  240. package/resources/ecc/rules/php-security.md +24 -0
  241. package/resources/ecc/rules/php-testing.md +26 -0
  242. package/resources/ecc/rules/python-coding-style.md +42 -0
  243. package/resources/ecc/rules/python-hooks.md +19 -0
  244. package/resources/ecc/rules/python-patterns.md +39 -0
  245. package/resources/ecc/rules/python-security.md +30 -0
  246. package/resources/ecc/rules/python-testing.md +38 -0
  247. package/resources/ecc/rules/swift-coding-style.md +47 -0
  248. package/resources/ecc/rules/swift-hooks.md +20 -0
  249. package/resources/ecc/rules/swift-patterns.md +66 -0
  250. package/resources/ecc/rules/swift-security.md +33 -0
  251. package/resources/ecc/rules/swift-testing.md +45 -0
  252. package/resources/ecc/rules/typescript-coding-style.md +63 -0
  253. package/resources/ecc/rules/typescript-hooks.md +20 -0
  254. package/resources/ecc/rules/typescript-patterns.md +50 -0
  255. package/resources/ecc/rules/typescript-security.md +26 -0
  256. package/resources/ecc/rules/typescript-testing.md +16 -0
  257. package/resources/ecc/skills/agent-introspection-debugging/SKILL.md +152 -0
  258. package/resources/ecc/skills/agent-introspection-debugging/agents/openai.yaml +7 -0
  259. package/resources/ecc/skills/agent-sort/SKILL.md +214 -0
  260. package/resources/ecc/skills/agent-sort/agents/openai.yaml +7 -0
  261. package/resources/ecc/skills/api-design/SKILL.md +522 -0
  262. package/resources/ecc/skills/api-design/agents/openai.yaml +7 -0
  263. package/resources/ecc/skills/article-writing/SKILL.md +78 -0
  264. package/resources/ecc/skills/article-writing/agents/openai.yaml +7 -0
  265. package/resources/ecc/skills/backend-patterns/SKILL.md +597 -0
  266. package/resources/ecc/skills/backend-patterns/agents/openai.yaml +7 -0
  267. package/resources/ecc/skills/brand-voice/SKILL.md +96 -0
  268. package/resources/ecc/skills/brand-voice/agents/openai.yaml +7 -0
  269. package/resources/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -0
  270. package/resources/ecc/skills/bun-runtime/SKILL.md +83 -0
  271. package/resources/ecc/skills/bun-runtime/agents/openai.yaml +7 -0
  272. package/resources/ecc/skills/coding-standards/SKILL.md +548 -0
  273. package/resources/ecc/skills/coding-standards/agents/openai.yaml +7 -0
  274. package/resources/ecc/skills/content-engine/SKILL.md +130 -0
  275. package/resources/ecc/skills/content-engine/agents/openai.yaml +7 -0
  276. package/resources/ecc/skills/crosspost/SKILL.md +110 -0
  277. package/resources/ecc/skills/crosspost/agents/openai.yaml +7 -0
  278. package/resources/ecc/skills/deep-research/SKILL.md +154 -0
  279. package/resources/ecc/skills/deep-research/agents/openai.yaml +7 -0
  280. package/resources/ecc/skills/dmux-workflows/SKILL.md +143 -0
  281. package/resources/ecc/skills/dmux-workflows/agents/openai.yaml +7 -0
  282. package/resources/ecc/skills/documentation-lookup/SKILL.md +89 -0
  283. package/resources/ecc/skills/documentation-lookup/agents/openai.yaml +7 -0
  284. package/resources/ecc/skills/e2e-testing/SKILL.md +325 -0
  285. package/resources/ecc/skills/e2e-testing/agents/openai.yaml +7 -0
  286. package/resources/ecc/skills/eval-harness/SKILL.md +235 -0
  287. package/resources/ecc/skills/eval-harness/agents/openai.yaml +7 -0
  288. package/resources/ecc/skills/everything-claude-code/SKILL.md +442 -0
  289. package/resources/ecc/skills/everything-claude-code/agents/openai.yaml +7 -0
  290. package/resources/ecc/skills/exa-search/SKILL.md +169 -0
  291. package/resources/ecc/skills/exa-search/agents/openai.yaml +7 -0
  292. package/resources/ecc/skills/fal-ai-media/SKILL.md +276 -0
  293. package/resources/ecc/skills/fal-ai-media/agents/openai.yaml +7 -0
  294. package/resources/ecc/skills/frontend-patterns/SKILL.md +647 -0
  295. package/resources/ecc/skills/frontend-patterns/agents/openai.yaml +7 -0
  296. package/resources/ecc/skills/frontend-slides/SKILL.md +183 -0
  297. package/resources/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
  298. package/resources/ecc/skills/frontend-slides/agents/openai.yaml +7 -0
  299. package/resources/ecc/skills/investor-materials/SKILL.md +95 -0
  300. package/resources/ecc/skills/investor-materials/agents/openai.yaml +7 -0
  301. package/resources/ecc/skills/investor-outreach/SKILL.md +90 -0
  302. package/resources/ecc/skills/investor-outreach/agents/openai.yaml +7 -0
  303. package/resources/ecc/skills/market-research/SKILL.md +74 -0
  304. package/resources/ecc/skills/market-research/agents/openai.yaml +7 -0
  305. package/resources/ecc/skills/mcp-server-patterns/SKILL.md +66 -0
  306. package/resources/ecc/skills/mcp-server-patterns/agents/openai.yaml +7 -0
  307. package/resources/ecc/skills/mle-workflow/SKILL.md +346 -0
  308. package/resources/ecc/skills/mle-workflow/agents/openai.yaml +7 -0
  309. package/resources/ecc/skills/nextjs-turbopack/SKILL.md +43 -0
  310. package/resources/ecc/skills/nextjs-turbopack/agents/openai.yaml +7 -0
  311. package/resources/ecc/skills/product-capability/SKILL.md +140 -0
  312. package/resources/ecc/skills/product-capability/agents/openai.yaml +7 -0
  313. package/resources/ecc/skills/security-review/SKILL.md +494 -0
  314. package/resources/ecc/skills/security-review/agents/openai.yaml +7 -0
  315. package/resources/ecc/skills/strategic-compact/SKILL.md +102 -0
  316. package/resources/ecc/skills/strategic-compact/agents/openai.yaml +7 -0
  317. package/resources/ecc/skills/tdd-workflow/SKILL.md +409 -0
  318. package/resources/ecc/skills/tdd-workflow/agents/openai.yaml +7 -0
  319. package/resources/ecc/skills/verification-loop/SKILL.md +125 -0
  320. package/resources/ecc/skills/verification-loop/agents/openai.yaml +7 -0
  321. package/resources/ecc/skills/video-editing/SKILL.md +307 -0
  322. package/resources/ecc/skills/video-editing/agents/openai.yaml +7 -0
  323. package/resources/ecc/skills/x-api/SKILL.md +229 -0
  324. package/resources/ecc/skills/x-api/agents/openai.yaml +7 -0
package/dist/theme.js ADDED
@@ -0,0 +1,220 @@
1
+ /**
2
+ * TUI theme — Crowcoder terminal styling.
3
+ *
4
+ * Inspired by Gemini CLI and Claude Code design patterns:
5
+ * - Semantic color tokens (not raw hex everywhere)
6
+ * - Unicode symbols for status indicators
7
+ * - Clean typography with proper contrast
8
+ * - CMYK base palette
9
+ */
10
+ import chalk from 'chalk';
11
+ // ── CMYK Base Palette ───────────────────────────────────
12
+ const palette = {
13
+ // Primary CMYK
14
+ cyan: '#00BCD4',
15
+ cyanLight: '#4DD0E1',
16
+ cyanDim: '#00838F',
17
+ magenta: '#E91E63',
18
+ magentaDim: '#AD1457',
19
+ yellow: '#FFEB3B',
20
+ yellowDim: '#F9A825',
21
+ key: '#212121',
22
+ // Neutrals (high contrast for dark terminals)
23
+ white: '#ECEFF1',
24
+ light: '#CFD8DC',
25
+ mid: '#B0BEC5',
26
+ gray: '#90A4AE',
27
+ darkGray: '#607D8B',
28
+ };
29
+ // ── Symbols (matching Gemini/Claude patterns) ───────────
30
+ export const sym = {
31
+ crow: '◆', // Brand mark (filled diamond)
32
+ prompt: '❯', // User input prompt
33
+ assistant: '✦', // Assistant message prefix
34
+ success: '✓', // Tool success
35
+ error: '✗', // Tool error
36
+ pending: '○', // Tool pending
37
+ running: '●', // Tool running
38
+ thinking: '∴', // Thinking indicator
39
+ warn: '⚠', // Warning
40
+ arrow: '→', // Flow indicator
41
+ bullet: '▸', // List item
42
+ divider: '─', // Horizontal rule char
43
+ };
44
+ // ── Theme (semantic color tokens) ───────────────────────
45
+ export const theme = {
46
+ // ── Brand ──
47
+ brand: chalk.hex(palette.cyan),
48
+ brandBold: chalk.hex(palette.cyan).bold,
49
+ brandDim: chalk.hex(palette.cyanDim),
50
+ // ── Semantic Status ──
51
+ success: chalk.hex('#4DD0E1'),
52
+ warning: chalk.hex(palette.yellow),
53
+ error: chalk.hex(palette.magenta),
54
+ info: chalk.hex(palette.cyanLight),
55
+ // ── Text Hierarchy ──
56
+ primary: chalk.hex(palette.white),
57
+ secondary: chalk.hex(palette.mid),
58
+ dim: chalk.hex(palette.gray),
59
+ muted: chalk.hex(palette.darkGray),
60
+ bright: chalk.white.bold,
61
+ italic: chalk.hex(palette.mid).italic,
62
+ // ── UI Elements ──
63
+ header: chalk.hex(palette.cyan).bold,
64
+ subheader: chalk.hex(palette.cyanLight),
65
+ command: chalk.hex(palette.yellow),
66
+ cost: chalk.hex(palette.gray),
67
+ link: chalk.hex(palette.cyanLight).underline,
68
+ // ── Prompt & Messages ──
69
+ prompt: chalk.hex(palette.cyan).bold,
70
+ assistant: chalk.hex(palette.cyanLight).bold,
71
+ user: chalk.hex(palette.white),
72
+ // ── Tool Calls ──
73
+ toolName: chalk.hex(palette.cyan).bold,
74
+ toolArgs: chalk.hex(palette.mid),
75
+ toolStatus: chalk.hex('#4DD0E1'),
76
+ toolError: chalk.hex(palette.magenta),
77
+ toolTime: chalk.hex(palette.gray),
78
+ // ── Thinking ──
79
+ thinkBorder: chalk.hex(palette.darkGray),
80
+ thinkText: chalk.hex(palette.gray).italic,
81
+ thinkLabel: chalk.hex(palette.darkGray).italic,
82
+ // ── Mode Badges ──
83
+ modeBadge: (mode) => {
84
+ const colors = {
85
+ dev: chalk.bgHex(palette.cyan).hex(palette.key),
86
+ review: chalk.bgHex(palette.cyanDim).hex(palette.white),
87
+ tdd: chalk.bgHex(palette.magenta).hex(palette.white),
88
+ research: chalk.bgHex(palette.yellow).hex(palette.key),
89
+ plan: chalk.bgHex(palette.yellowDim).hex(palette.key),
90
+ debug: chalk.bgHex(palette.magentaDim).hex(palette.white),
91
+ architect: chalk.bgHex(palette.cyanLight).hex(palette.key),
92
+ };
93
+ return (colors[mode] || chalk.bgGray.white)(` ${mode.toUpperCase()} `);
94
+ },
95
+ // ── Security Badges ──
96
+ secBadge: (level) => {
97
+ const colors = {
98
+ critical: chalk.bgHex(palette.magenta).white.bold,
99
+ high: chalk.hex(palette.magenta).bold,
100
+ medium: chalk.hex(palette.yellow),
101
+ low: chalk.hex(palette.gray),
102
+ safe: chalk.hex(palette.cyan),
103
+ };
104
+ return (colors[level] || chalk.white)(level.toUpperCase());
105
+ },
106
+ };
107
+ // ── Banner (single unified startup display) ────────────
108
+ export function printBanner(provider, model, mode, permissionMode, sessionId, toolNames) {
109
+ const b = theme.brandBold;
110
+ const d = theme.dim;
111
+ const s = theme.secondary;
112
+ const w = theme.bright;
113
+ console.log('');
114
+ console.log(b(` ${sym.crow} C O M P A C T A G E N T`));
115
+ console.log(d(' A dense, feature-rich AI coding agent'));
116
+ console.log('');
117
+ console.log(d(' ' + sym.divider.repeat(40)));
118
+ console.log(s(' Provider ') + w(provider) + s(' ') + d('│') + s(' Model ') + w(model));
119
+ console.log(s(' Mode ') + theme.modeBadge(mode) + s(' ') + d('│') + s(' Perms ') + w(permissionMode));
120
+ console.log(s(' Session ') + d(sessionId.slice(0, 12)));
121
+ console.log(d(' ' + sym.divider.repeat(40)));
122
+ console.log(s(' Tools: ') + d(toolNames.join(', ')));
123
+ console.log('');
124
+ console.log(d(' Type ') + theme.command('/help') + d(' for commands ') + d('•') + d(' Ctrl+C to exit'));
125
+ console.log('');
126
+ }
127
+ // ── Splash Screen (for full mode — Compact Agent emblem) ──
128
+ // Half-scale 2x2->1 downsample of the original emblem. 18 lines × ~35 cols
129
+ // fits any terminal ≥45 cols wide and ≥24 rows tall.
130
+ const COMPACT_AGENT_SPLASH = [
131
+ ' @@@@@@@@ @@@@@@@@',
132
+ ' @@@@ @@@@@@ @@@@@',
133
+ ' @@@@ @@@@@@ @@@@',
134
+ ' @@@@@@ @@@ @@@@ @@@@@@',
135
+ ' @@@@ @@@@@@ @@@@ @@@@@@@ @@@',
136
+ ' @@@ @@@@ @@@@@ @@@@ @@',
137
+ ' @@@ @@@@@ @@@@ @@@ @@@@ @@',
138
+ ' @@@ @@@ @@@@ @@@@ @@@@ @@@',
139
+ ' @@@@@ @@@@ @@@@@ @@@@@',
140
+ ' @@@@@ @@@@ @@@@@ @@@@@',
141
+ ' @@@ @@@ @@@@ @@@@ @@@ @@@',
142
+ ' @@@ @@@@@ @@@@@@@@ @@@@@ @@',
143
+ ' @@@ @@@@ @@@@ @@@@@ @@',
144
+ ' @@@@ @@@@@@@ @@@ @@@@@@@ @@@',
145
+ ' @@@@@@ @@@ @@@ @@@@@@',
146
+ ' @@@@ @@@@@@ @@@@',
147
+ ' @@@@@@@@@@@@@@@@@@@@@@',
148
+ ' @@@@@@@@ @@@@@@@@',
149
+ ];
150
+ export function printSplash() {
151
+ const c = chalk.hex(palette.cyan);
152
+ console.log('');
153
+ for (const line of COMPACT_AGENT_SPLASH)
154
+ console.log(c(line.replace(/\s+$/, '')));
155
+ console.log('');
156
+ }
157
+ // ── Section Header ──────────────────────────────────────
158
+ export function printSection(title) {
159
+ console.log('');
160
+ console.log(theme.header(` ${sym.divider}${sym.divider} ${title} ${sym.divider.repeat(Math.max(2, 36 - title.length))}`));
161
+ }
162
+ // ── Key-Value Pair ──────────────────────────────────────
163
+ export function printKV(key, value, indent = 2) {
164
+ const padding = ' '.repeat(indent);
165
+ console.log(padding + theme.secondary(key.padEnd(14)) + theme.bright(value));
166
+ }
167
+ // ── Tool Execution Display ──────────────────────────────
168
+ export function printToolRun(name, args) {
169
+ console.log(theme.toolName(` ${sym.running} ${name}`) +
170
+ theme.toolArgs(` ${args}`));
171
+ }
172
+ export function printToolResult(success, elapsed, output) {
173
+ const icon = success ? theme.toolStatus(sym.success) : theme.toolError(sym.error);
174
+ const time = theme.toolTime(`(${elapsed}ms)`);
175
+ const preview = output.length > 200
176
+ ? theme.dim(output.slice(0, 150) + '...')
177
+ : theme.dim(output);
178
+ console.log(` ${icon} ${time} ${preview}`);
179
+ }
180
+ // ── Thinking Display ────────────────────────────────────
181
+ export function printThinkingOpen() {
182
+ console.log('');
183
+ console.log(theme.thinkBorder(' │ ') + theme.thinkLabel(`${sym.thinking} Thinking...`));
184
+ }
185
+ export function printThinkingText(text) {
186
+ // Prefix each line with the left border
187
+ process.stdout.write(theme.thinkBorder(' │ ') + theme.thinkText(text));
188
+ }
189
+ export function printThinkingClose() {
190
+ console.log('');
191
+ console.log(theme.thinkBorder(' │'));
192
+ }
193
+ // ── Cost Display ────────────────────────────────────────
194
+ export function printCost(prompt, completion, cost, warning) {
195
+ const p = prompt > 999 ? `${(prompt / 1000).toFixed(1)}K` : String(prompt);
196
+ const c = completion > 999 ? `${(completion / 1000).toFixed(1)}K` : String(completion);
197
+ process.stdout.write(theme.cost(`\n ${p}${sym.arrow}${c} tokens $${cost.toFixed(4)}`));
198
+ if (warning) {
199
+ console.log(theme.warning(`\n ${sym.warn} ${warning}`));
200
+ }
201
+ }
202
+ // ── Security Display ────────────────────────────────────
203
+ export function printSecurityBadge(level, threats, blocked) {
204
+ console.log(` ${sym.warn} Security: ${theme.secBadge(level)}`);
205
+ for (const t of threats) {
206
+ console.log(theme.warning(` ${sym.bullet} ${t}`));
207
+ }
208
+ if (blocked) {
209
+ console.log(chalk.bgHex(palette.magenta).white(` BLOCKED ${sym.divider} this operation was prevented`));
210
+ }
211
+ }
212
+ // ── Divider ─────────────────────────────────────────────
213
+ export function printDivider() {
214
+ console.log(theme.muted(' ' + sym.divider.repeat(38)));
215
+ }
216
+ // ── Spinner ─────────────────────────────────────────────
217
+ export function spinner(text) {
218
+ return theme.dim(` ${sym.running} ${text}`);
219
+ }
220
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Tool } from './types.js';
2
+ export declare const BashTool: Tool;
@@ -0,0 +1,49 @@
1
+ import { exec } from 'node:child_process';
2
+ export const BashTool = {
3
+ name: 'bash',
4
+ description: 'Execute a shell command and return its stdout/stderr. Use for running builds, tests, git commands, installs, and any terminal operation.',
5
+ parameters: {
6
+ type: 'object',
7
+ properties: {
8
+ command: {
9
+ type: 'string',
10
+ description: 'The shell command to execute',
11
+ },
12
+ timeout: {
13
+ type: 'number',
14
+ description: 'Timeout in milliseconds (default 120000)',
15
+ },
16
+ },
17
+ required: ['command'],
18
+ },
19
+ isReadOnly: false,
20
+ isDestructive: true,
21
+ async call(input, cwd) {
22
+ const command = input.command;
23
+ const timeout = input.timeout || 120_000;
24
+ return new Promise((resolve) => {
25
+ exec(command, {
26
+ cwd,
27
+ timeout,
28
+ maxBuffer: 10 * 1024 * 1024, // 10MB
29
+ shell: process.platform === 'win32' ? 'bash' : '/bin/bash',
30
+ }, (error, stdout, stderr) => {
31
+ if (error && !stdout && !stderr) {
32
+ resolve({ output: `Error: ${error.message}`, isError: true });
33
+ return;
34
+ }
35
+ const out = [stdout, stderr].filter(Boolean).join('\n');
36
+ const MAX_OUTPUT = 100_000;
37
+ const truncated = out.length > MAX_OUTPUT;
38
+ const finalOutput = out.slice(0, MAX_OUTPUT) || '(no output)';
39
+ resolve({
40
+ output: truncated
41
+ ? finalOutput + '\n... (output truncated, over 100KB)'
42
+ : finalOutput,
43
+ isError: !!error,
44
+ });
45
+ });
46
+ });
47
+ },
48
+ };
49
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../src/tools/bash.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAG1C,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,IAAI,EAAE,MAAM;IACZ,WAAW,EACT,0IAA0I;IAC5I,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,8BAA8B;aAC5C;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0CAA0C;aACxD;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,UAAU,EAAE,KAAK;IACjB,aAAa,EAAE,IAAI;IAEnB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG;QACnB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAiB,CAAC;QACxC,MAAM,OAAO,GAAI,KAAK,CAAC,OAAkB,IAAI,OAAO,CAAC;QAErD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,IAAI,CACF,OAAO,EACP;gBACE,GAAG;gBACH,OAAO;gBACP,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;gBACpC,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW;aAC3D,EACD,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACxB,IAAI,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;oBAChC,OAAO,CAAC,EAAE,MAAM,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC9D,OAAO;gBACT,CAAC;gBACD,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxD,MAAM,UAAU,GAAG,OAAO,CAAC;gBAC3B,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC;gBAC1C,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,aAAa,CAAC;gBAE9D,OAAO,CAAC;oBACN,MAAM,EAAE,SAAS;wBACf,CAAC,CAAC,WAAW,GAAG,sCAAsC;wBACtD,CAAC,CAAC,WAAW;oBACf,OAAO,EAAE,CAAC,CAAC,KAAK;iBACjB,CAAC,CAAC;YACL,CAAC,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Tool } from './types.js';
2
+ export declare const EditTool: Tool;
@@ -0,0 +1,76 @@
1
+ import { readFileSync, writeFileSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ export const EditTool = {
4
+ name: 'edit_file',
5
+ description: 'Perform a find-and-replace edit on a file. Provide the exact old_string to find and the new_string to replace it with. The old_string must be unique in the file unless replace_all is true.',
6
+ parameters: {
7
+ type: 'object',
8
+ properties: {
9
+ file_path: {
10
+ type: 'string',
11
+ description: 'Path to the file to edit',
12
+ },
13
+ old_string: {
14
+ type: 'string',
15
+ description: 'The exact text to find (must match including whitespace)',
16
+ },
17
+ new_string: {
18
+ type: 'string',
19
+ description: 'The replacement text',
20
+ },
21
+ replace_all: {
22
+ type: 'boolean',
23
+ description: 'Replace all occurrences (default false)',
24
+ },
25
+ },
26
+ required: ['file_path', 'old_string', 'new_string'],
27
+ },
28
+ isReadOnly: false,
29
+ isDestructive: false,
30
+ async call(input, cwd) {
31
+ try {
32
+ const filePath = resolve(cwd, input.file_path);
33
+ const oldStr = input.old_string;
34
+ const newStr = input.new_string;
35
+ const replaceAll = input.replace_all || false;
36
+ let content = readFileSync(filePath, 'utf-8');
37
+ const occurrences = content.split(oldStr).length - 1;
38
+ if (occurrences === 0) {
39
+ return { output: `Error: old_string not found in ${filePath}`, isError: true };
40
+ }
41
+ if (occurrences > 1 && !replaceAll) {
42
+ // Show context around first occurrence
43
+ const idx = content.indexOf(oldStr);
44
+ const contextStart = Math.max(0, idx - 200);
45
+ const contextEnd = Math.min(content.length, idx + oldStr.length + 200);
46
+ const context = content.slice(contextStart, contextEnd);
47
+ const preview = context
48
+ .split('\n')
49
+ .slice(0, 5)
50
+ .map((line) => (line.length > 80 ? line.slice(0, 77) + '...' : line))
51
+ .join('\n');
52
+ return {
53
+ output: `Error: old_string found ${occurrences} times — set replace_all=true or provide more context to make it unique.\n\nContext around first match:\n\`\`\`\n${preview}\n\`\`\``,
54
+ isError: true,
55
+ };
56
+ }
57
+ if (replaceAll) {
58
+ content = content.split(oldStr).join(newStr);
59
+ }
60
+ else {
61
+ content = content.replace(oldStr, newStr);
62
+ }
63
+ writeFileSync(filePath, content, 'utf-8');
64
+ const replaced = replaceAll ? occurrences : 1;
65
+ return {
66
+ output: `Replaced ${replaced} occurrence${replaced > 1 ? 's' : ''} in ${filePath}`,
67
+ isError: false,
68
+ };
69
+ }
70
+ catch (e) {
71
+ const msg = e instanceof Error ? e.message : String(e);
72
+ return { output: `Error editing file: ${msg}`, isError: true };
73
+ }
74
+ },
75
+ };
76
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,IAAI,EAAE,WAAW;IACjB,WAAW,EACT,8LAA8L;IAChM,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0BAA0B;aACxC;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0DAA0D;aACxE;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sBAAsB;aACpC;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,yCAAyC;aACvD;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,CAAC;KACpD;IACD,UAAU,EAAE,KAAK;IACjB,aAAa,EAAE,KAAK;IAEpB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG;QACnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,SAAmB,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,KAAK,CAAC,UAAoB,CAAC;YAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,UAAoB,CAAC;YAC1C,MAAM,UAAU,GAAI,KAAK,CAAC,WAAuB,IAAI,KAAK,CAAC;YAE3D,IAAI,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAE9C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YACrD,IAAI,WAAW,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,EAAE,MAAM,EAAE,kCAAkC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACjF,CAAC;YACD,IAAI,WAAW,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,uCAAuC;gBACvC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACpC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;gBAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;gBACvE,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;gBACxD,MAAM,OAAO,GAAG,OAAO;qBACpB,KAAK,CAAC,IAAI,CAAC;qBACX,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;qBACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;qBACpE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEd,OAAO;oBACL,MAAM,EAAE,2BAA2B,WAAW,oHAAoH,OAAO,UAAU;oBACnL,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5C,CAAC;YAED,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO;gBACL,MAAM,EAAE,YAAY,QAAQ,cAAc,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,OAAO,QAAQ,EAAE;gBAClF,OAAO,EAAE,KAAK;aACf,CAAC;QACJ,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,EAAE,MAAM,EAAE,uBAAuB,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACjE,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Tool } from './types.js';
2
+ export declare const GlobTool: Tool;
@@ -0,0 +1,54 @@
1
+ import { glob } from 'glob';
2
+ import { resolve } from 'node:path';
3
+ export const GlobTool = {
4
+ name: 'glob',
5
+ description: 'Find files matching a glob pattern (e.g. "**/*.ts", "src/**/*.js"). Returns file paths sorted by modification time.',
6
+ parameters: {
7
+ type: 'object',
8
+ properties: {
9
+ pattern: {
10
+ type: 'string',
11
+ description: 'Glob pattern (e.g. "**/*.py", "src/**/test_*.ts")',
12
+ },
13
+ path: {
14
+ type: 'string',
15
+ description: 'Base directory to search in (default: cwd)',
16
+ },
17
+ max_results: {
18
+ type: 'number',
19
+ description: 'Max files to return (default 200)',
20
+ },
21
+ },
22
+ required: ['pattern'],
23
+ },
24
+ isReadOnly: true,
25
+ isDestructive: false,
26
+ async call(input, cwd) {
27
+ try {
28
+ const pattern = input.pattern;
29
+ const base = input.path ? resolve(cwd, input.path) : cwd;
30
+ const maxResults = input.max_results || 200;
31
+ const files = await glob(pattern, {
32
+ cwd: base,
33
+ nodir: true,
34
+ absolute: true,
35
+ ignore: ['**/node_modules/**', '**/.git/**'],
36
+ maxDepth: 20,
37
+ });
38
+ if (files.length === 0) {
39
+ return { output: 'No files matched the pattern.', isError: false };
40
+ }
41
+ const result = files.slice(0, maxResults).join('\n');
42
+ let output = result;
43
+ if (files.length > maxResults) {
44
+ output += `\n\n... (${files.length - maxResults} more files)`;
45
+ }
46
+ return { output, isError: false };
47
+ }
48
+ catch (e) {
49
+ const msg = e instanceof Error ? e.message : String(e);
50
+ return { output: `Error: ${msg}`, isError: true };
51
+ }
52
+ },
53
+ };
54
+ //# sourceMappingURL=glob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glob.js","sourceRoot":"","sources":["../../src/tools/glob.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,CAAC,MAAM,QAAQ,GAAS;IAC5B,IAAI,EAAE,MAAM;IACZ,WAAW,EACT,qHAAqH;IACvH,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mDAAmD;aACjE;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,4CAA4C;aAC1D;YACD,WAAW,EAAE;gBACX,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mCAAmC;aACjD;SACF;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC;KACtB;IACD,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,KAAK;IAEpB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAiB,CAAC;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACnE,MAAM,UAAU,GAAI,KAAK,CAAC,WAAsB,IAAI,GAAG,CAAC;YAExD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE;gBAChC,GAAG,EAAE,IAAI;gBACT,KAAK,EAAE,IAAI;gBACX,QAAQ,EAAE,IAAI;gBACd,MAAM,EAAE,CAAC,oBAAoB,EAAE,YAAY,CAAC;gBAC5C,QAAQ,EAAE,EAAE;aACb,CAAC,CAAC;YAEH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,EAAE,MAAM,EAAE,+BAA+B,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACrE,CAAC;YAED,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrD,IAAI,MAAM,GAAG,MAAM,CAAC;YACpB,IAAI,KAAK,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC9B,MAAM,IAAI,YAAY,KAAK,CAAC,MAAM,GAAG,UAAU,cAAc,CAAC;YAChE,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACpC,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Tool } from './types.js';
2
+ export declare const GrepTool: Tool;
@@ -0,0 +1,64 @@
1
+ import { exec } from 'node:child_process';
2
+ import { resolve } from 'node:path';
3
+ export const GrepTool = {
4
+ name: 'grep',
5
+ description: 'Search file contents using a regex pattern (powered by ripgrep if available, else grep). Returns matching lines with file paths and line numbers.',
6
+ parameters: {
7
+ type: 'object',
8
+ properties: {
9
+ pattern: {
10
+ type: 'string',
11
+ description: 'Regex pattern to search for',
12
+ },
13
+ path: {
14
+ type: 'string',
15
+ description: 'Directory or file to search in (default: cwd)',
16
+ },
17
+ include: {
18
+ type: 'string',
19
+ description: 'Glob pattern for files to include (e.g. "*.ts")',
20
+ },
21
+ ignore_case: {
22
+ type: 'boolean',
23
+ description: 'Case-insensitive search (default false)',
24
+ },
25
+ max_results: {
26
+ type: 'number',
27
+ description: 'Max results to return (default 100)',
28
+ },
29
+ },
30
+ required: ['pattern'],
31
+ },
32
+ isReadOnly: true,
33
+ isDestructive: false,
34
+ async call(input, cwd) {
35
+ const pattern = input.pattern;
36
+ const searchPath = input.path ? resolve(cwd, input.path) : cwd;
37
+ const include = input.include;
38
+ const ignoreCase = input.ignore_case || false;
39
+ const maxResults = input.max_results || 100;
40
+ // Try ripgrep first, fall back to grep
41
+ const iFlag = ignoreCase ? '-i ' : '';
42
+ const globFlag = include ? `--glob "${include}" ` : '';
43
+ const rgCmd = `rg -n ${iFlag}${globFlag}--max-count ${maxResults} -- "${pattern.replace(/"/g, '\\"')}" "${searchPath}" 2>/dev/null`;
44
+ const grepCmd = `grep -rn ${iFlag}${include ? `--include="${include}" ` : ''}-- "${pattern.replace(/"/g, '\\"')}" "${searchPath}" 2>/dev/null | head -${maxResults}`;
45
+ return new Promise((res) => {
46
+ exec(rgCmd, { cwd, maxBuffer: 5 * 1024 * 1024, timeout: 30_000 }, (err, stdout) => {
47
+ if (stdout && stdout.trim()) {
48
+ res({ output: stdout.trim().slice(0, 80_000), isError: false });
49
+ return;
50
+ }
51
+ // Fallback to grep
52
+ exec(grepCmd, { cwd, maxBuffer: 5 * 1024 * 1024, timeout: 30_000 }, (_err2, stdout2) => {
53
+ if (stdout2 && stdout2.trim()) {
54
+ res({ output: stdout2.trim().slice(0, 80_000), isError: false });
55
+ }
56
+ else {
57
+ res({ output: 'No matches found.', isError: false });
58
+ }
59
+ });
60
+ });
61
+ });
62
+ },
63
+ };
64
+ //# sourceMappingURL=grep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../src/tools/grep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Tool } from './types.js';
2
+ export declare const ALL_TOOLS: Tool[];
3
+ export declare function getToolNames(): string[];
4
+ export declare function getToolByName(name: string): Tool | undefined;
5
+ export type { Tool, ToolResult } from './types.js';
@@ -0,0 +1,27 @@
1
+ import { BashTool } from './bash.js';
2
+ import { ReadTool } from './read.js';
3
+ import { WriteTool } from './write.js';
4
+ import { EditTool } from './edit.js';
5
+ import { GrepTool } from './grep.js';
6
+ import { GlobTool } from './glob.js';
7
+ import { WebFetchTool } from './web-fetch.js';
8
+ import { WebSearchTool } from './web-search.js';
9
+ import { ListDirTool } from './list-dir.js';
10
+ export const ALL_TOOLS = [
11
+ BashTool,
12
+ ReadTool,
13
+ WriteTool,
14
+ EditTool,
15
+ GrepTool,
16
+ GlobTool,
17
+ ListDirTool,
18
+ WebFetchTool,
19
+ WebSearchTool,
20
+ ];
21
+ export function getToolNames() {
22
+ return ALL_TOOLS.map((t) => t.name);
23
+ }
24
+ export function getToolByName(name) {
25
+ return ALL_TOOLS.find((t) => t.name === name);
26
+ }
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,CAAC,MAAM,SAAS,GAAW;IAC/B,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,aAAa;CACd,CAAC;AAEF,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Tool } from './types.js';
2
+ export declare const ListDirTool: Tool;
@@ -0,0 +1,51 @@
1
+ import { readdirSync, statSync } from 'node:fs';
2
+ import { resolve, join } from 'node:path';
3
+ export const ListDirTool = {
4
+ name: 'list_dir',
5
+ description: 'List files and directories at a given path. Shows type (file/dir), size, and name.',
6
+ parameters: {
7
+ type: 'object',
8
+ properties: {
9
+ path: {
10
+ type: 'string',
11
+ description: 'Directory path to list (default: cwd)',
12
+ },
13
+ },
14
+ required: [],
15
+ },
16
+ isReadOnly: true,
17
+ isDestructive: false,
18
+ async call(input, cwd) {
19
+ try {
20
+ const dirPath = input.path ? resolve(cwd, input.path) : cwd;
21
+ const entries = readdirSync(dirPath, { withFileTypes: true });
22
+ const lines = entries.slice(0, 500).map((entry) => {
23
+ const fullPath = join(dirPath, entry.name);
24
+ try {
25
+ const stat = statSync(fullPath);
26
+ if (entry.isDirectory()) {
27
+ return `[dir] ${entry.name}/`;
28
+ }
29
+ const size = formatSize(stat.size);
30
+ return `[file] ${entry.name} (${size})`;
31
+ }
32
+ catch {
33
+ return `[???] ${entry.name}`;
34
+ }
35
+ });
36
+ return { output: lines.join('\n') || '(empty directory)', isError: false };
37
+ }
38
+ catch (e) {
39
+ const msg = e instanceof Error ? e.message : String(e);
40
+ return { output: `Error listing directory: ${msg}`, isError: true };
41
+ }
42
+ },
43
+ };
44
+ function formatSize(bytes) {
45
+ if (bytes < 1024)
46
+ return `${bytes}B`;
47
+ if (bytes < 1024 * 1024)
48
+ return `${(bytes / 1024).toFixed(1)}KB`;
49
+ return `${(bytes / 1024 / 1024).toFixed(1)}MB`;
50
+ }
51
+ //# sourceMappingURL=list-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-dir.js","sourceRoot":"","sources":["../../src/tools/list-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,CAAC,MAAM,WAAW,GAAS;IAC/B,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,oFAAoF;IACjG,UAAU,EAAE;QACV,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uCAAuC;aACrD;SACF;QACD,QAAQ,EAAE,EAAE;KACb;IACD,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,KAAK;IAEpB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACtE,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;YAE9D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC3C,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAChC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;wBACxB,OAAO,UAAU,KAAK,CAAC,IAAI,GAAG,CAAC;oBACjC,CAAC;oBACD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACnC,OAAO,UAAU,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC;gBAC1C,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,UAAU,KAAK,CAAC,IAAI,EAAE,CAAC;gBAChC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,mBAAmB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC7E,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,EAAE,MAAM,EAAE,4BAA4B,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACtE,CAAC;IACH,CAAC;CACF,CAAC;AAEF,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { Tool } from './types.js';
2
+ export declare const ReadTool: Tool;