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.
- package/README.md +394 -0
- package/bin/anycode.js +2 -0
- package/bin/crowcoder.js +19 -0
- package/bin/ecc-hooks.cjs +138 -0
- package/dist/agents.d.ts +17 -0
- package/dist/agents.js +1603 -0
- package/dist/agents.js.map +1 -0
- package/dist/api.d.ts +16 -0
- package/dist/api.js +115 -0
- package/dist/api.js.map +1 -0
- package/dist/autonomous-loops.d.ts +108 -0
- package/dist/autonomous-loops.js +526 -0
- package/dist/autonomous-loops.js.map +1 -0
- package/dist/codemaps.d.ts +53 -0
- package/dist/codemaps.js +325 -0
- package/dist/codemaps.js.map +1 -0
- package/dist/compaction.d.ts +30 -0
- package/dist/compaction.js +125 -0
- package/dist/compaction.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +79 -0
- package/dist/config.js.map +1 -0
- package/dist/content-engine.d.ts +97 -0
- package/dist/content-engine.js +721 -0
- package/dist/content-engine.js.map +1 -0
- package/dist/cost-tracker.d.ts +49 -0
- package/dist/cost-tracker.js +150 -0
- package/dist/cost-tracker.js.map +1 -0
- package/dist/counter-button.d.ts +35 -0
- package/dist/counter-button.js +48 -0
- package/dist/counter-button.js.map +1 -0
- package/dist/counter.d.ts +21 -0
- package/dist/counter.js +31 -0
- package/dist/counter.js.map +1 -0
- package/dist/coverage.d.ts +23 -0
- package/dist/coverage.js +215 -0
- package/dist/coverage.js.map +1 -0
- package/dist/docs-sync.d.ts +23 -0
- package/dist/docs-sync.js +266 -0
- package/dist/docs-sync.js.map +1 -0
- package/dist/ecc.d.ts +41 -0
- package/dist/ecc.js +644 -0
- package/dist/ecc.js.map +1 -0
- package/dist/evaluation.d.ts +24 -0
- package/dist/evaluation.js +412 -0
- package/dist/evaluation.js.map +1 -0
- package/dist/export.d.ts +22 -0
- package/dist/export.js +109 -0
- package/dist/export.js.map +1 -0
- package/dist/git-workflow.d.ts +22 -0
- package/dist/git-workflow.js +197 -0
- package/dist/git-workflow.js.map +1 -0
- package/dist/hook-controls.d.ts +34 -0
- package/dist/hook-controls.js +90 -0
- package/dist/hook-controls.js.map +1 -0
- package/dist/hooks.d.ts +30 -0
- package/dist/hooks.js +130 -0
- package/dist/hooks.js.map +1 -0
- package/dist/html-parser.d.ts +18 -0
- package/dist/html-parser.js +101 -0
- package/dist/html-parser.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +1230 -0
- package/dist/index.js.map +1 -0
- package/dist/learning.d.ts +35 -0
- package/dist/learning.js +238 -0
- package/dist/learning.js.map +1 -0
- package/dist/login.d.ts +37 -0
- package/dist/login.js +191 -0
- package/dist/login.js.map +1 -0
- package/dist/memory.d.ts +39 -0
- package/dist/memory.js +183 -0
- package/dist/memory.js.map +1 -0
- package/dist/model-router.d.ts +23 -0
- package/dist/model-router.js +145 -0
- package/dist/model-router.js.map +1 -0
- package/dist/modes.d.ts +17 -0
- package/dist/modes.js +217 -0
- package/dist/modes.js.map +1 -0
- package/dist/orchestration.d.ts +37 -0
- package/dist/orchestration.js +139 -0
- package/dist/orchestration.js.map +1 -0
- package/dist/package-detect.d.ts +36 -0
- package/dist/package-detect.js +529 -0
- package/dist/package-detect.js.map +1 -0
- package/dist/permissions.d.ts +25 -0
- package/dist/permissions.js +50 -0
- package/dist/permissions.js.map +1 -0
- package/dist/pm2-manager.d.ts +40 -0
- package/dist/pm2-manager.js +127 -0
- package/dist/pm2-manager.js.map +1 -0
- package/dist/query.d.ts +15 -0
- package/dist/query.js +278 -0
- package/dist/query.js.map +1 -0
- package/dist/refactor.d.ts +22 -0
- package/dist/refactor.js +226 -0
- package/dist/refactor.js.map +1 -0
- package/dist/retry.d.ts +20 -0
- package/dist/retry.js +88 -0
- package/dist/retry.js.map +1 -0
- package/dist/rules.d.ts +34 -0
- package/dist/rules.js +942 -0
- package/dist/rules.js.map +1 -0
- package/dist/schema.d.ts +23 -0
- package/dist/schema.js +12 -0
- package/dist/schema.js.map +1 -0
- package/dist/search-first.d.ts +17 -0
- package/dist/search-first.js +301 -0
- package/dist/search-first.js.map +1 -0
- package/dist/security.d.ts +10 -0
- package/dist/security.js +145 -0
- package/dist/security.js.map +1 -0
- package/dist/sessions.d.ts +21 -0
- package/dist/sessions.js +112 -0
- package/dist/sessions.js.map +1 -0
- package/dist/skill-create.d.ts +38 -0
- package/dist/skill-create.js +389 -0
- package/dist/skill-create.js.map +1 -0
- package/dist/skills.d.ts +34 -0
- package/dist/skills.js +161 -0
- package/dist/skills.js.map +1 -0
- package/dist/strategic-compaction.d.ts +24 -0
- package/dist/strategic-compaction.js +144 -0
- package/dist/strategic-compaction.js.map +1 -0
- package/dist/system-prompt.d.ts +3 -0
- package/dist/system-prompt.js +101 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/theme.d.ts +60 -0
- package/dist/theme.js +220 -0
- package/dist/theme.js.map +1 -0
- package/dist/tools/bash.d.ts +2 -0
- package/dist/tools/bash.js +49 -0
- package/dist/tools/bash.js.map +1 -0
- package/dist/tools/edit.d.ts +2 -0
- package/dist/tools/edit.js +76 -0
- package/dist/tools/edit.js.map +1 -0
- package/dist/tools/glob.d.ts +2 -0
- package/dist/tools/glob.js +54 -0
- package/dist/tools/glob.js.map +1 -0
- package/dist/tools/grep.d.ts +2 -0
- package/dist/tools/grep.js +64 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/index.d.ts +5 -0
- package/dist/tools/index.js +27 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-dir.d.ts +2 -0
- package/dist/tools/list-dir.js +51 -0
- package/dist/tools/list-dir.js.map +1 -0
- package/dist/tools/read.d.ts +2 -0
- package/dist/tools/read.js +56 -0
- package/dist/tools/read.js.map +1 -0
- package/dist/tools/types.d.ts +45 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/web-fetch.d.ts +2 -0
- package/dist/tools/web-fetch.js +41 -0
- package/dist/tools/web-fetch.js.map +1 -0
- package/dist/tools/web-search.d.ts +27 -0
- package/dist/tools/web-search.js +139 -0
- package/dist/tools/web-search.js.map +1 -0
- package/dist/tools/write.d.ts +2 -0
- package/dist/tools/write.js +36 -0
- package/dist/tools/write.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.js +57 -0
- package/dist/types.js.map +1 -0
- package/dist/users.d.ts +51 -0
- package/dist/users.js +193 -0
- package/dist/users.js.map +1 -0
- package/dist/verification.d.ts +73 -0
- package/dist/verification.js +269 -0
- package/dist/verification.js.map +1 -0
- package/dist/walkthrough.d.ts +10 -0
- package/dist/walkthrough.js +121 -0
- package/dist/walkthrough.js.map +1 -0
- package/package.json +58 -0
- package/resources/ecc/agents/architect.json +16 -0
- package/resources/ecc/agents/architect.md +212 -0
- package/resources/ecc/agents/build-error-resolver.json +17 -0
- package/resources/ecc/agents/build-error-resolver.md +116 -0
- package/resources/ecc/agents/chief-of-staff.json +17 -0
- package/resources/ecc/agents/chief-of-staff.md +153 -0
- package/resources/ecc/agents/code-reviewer.json +16 -0
- package/resources/ecc/agents/code-reviewer.md +238 -0
- package/resources/ecc/agents/database-reviewer.json +16 -0
- package/resources/ecc/agents/database-reviewer.md +92 -0
- package/resources/ecc/agents/doc-updater.json +16 -0
- package/resources/ecc/agents/doc-updater.md +108 -0
- package/resources/ecc/agents/e2e-runner.json +17 -0
- package/resources/ecc/agents/e2e-runner.md +109 -0
- package/resources/ecc/agents/go-build-resolver.json +17 -0
- package/resources/ecc/agents/go-build-resolver.md +96 -0
- package/resources/ecc/agents/go-reviewer.json +16 -0
- package/resources/ecc/agents/go-reviewer.md +77 -0
- package/resources/ecc/agents/harness-optimizer.json +15 -0
- package/resources/ecc/agents/harness-optimizer.md +34 -0
- package/resources/ecc/agents/loop-operator.json +16 -0
- package/resources/ecc/agents/loop-operator.md +36 -0
- package/resources/ecc/agents/planner.json +15 -0
- package/resources/ecc/agents/planner.md +212 -0
- package/resources/ecc/agents/python-reviewer.json +16 -0
- package/resources/ecc/agents/python-reviewer.md +99 -0
- package/resources/ecc/agents/refactor-cleaner.json +17 -0
- package/resources/ecc/agents/refactor-cleaner.md +87 -0
- package/resources/ecc/agents/security-reviewer.json +16 -0
- package/resources/ecc/agents/security-reviewer.md +109 -0
- package/resources/ecc/agents/tdd-guide.json +17 -0
- package/resources/ecc/agents/tdd-guide.md +93 -0
- package/resources/ecc/commands/add-language-rules.md +39 -0
- package/resources/ecc/commands/database-migration.md +36 -0
- package/resources/ecc/commands/feature-development.md +38 -0
- package/resources/ecc/prompts/build-fix.prompt.md +47 -0
- package/resources/ecc/prompts/code-review.prompt.md +56 -0
- package/resources/ecc/prompts/plan.prompt.md +52 -0
- package/resources/ecc/prompts/refactor.prompt.md +50 -0
- package/resources/ecc/prompts/security-review.prompt.md +70 -0
- package/resources/ecc/prompts/tdd.prompt.md +47 -0
- package/resources/ecc/rules/common-agents.md +53 -0
- package/resources/ecc/rules/common-coding-style.md +52 -0
- package/resources/ecc/rules/common-development-workflow.md +33 -0
- package/resources/ecc/rules/common-git-workflow.md +28 -0
- package/resources/ecc/rules/common-hooks.md +34 -0
- package/resources/ecc/rules/common-patterns.md +35 -0
- package/resources/ecc/rules/common-performance.md +59 -0
- package/resources/ecc/rules/common-security.md +33 -0
- package/resources/ecc/rules/common-testing.md +33 -0
- package/resources/ecc/rules/golang-coding-style.md +31 -0
- package/resources/ecc/rules/golang-hooks.md +16 -0
- package/resources/ecc/rules/golang-patterns.md +44 -0
- package/resources/ecc/rules/golang-security.md +33 -0
- package/resources/ecc/rules/golang-testing.md +30 -0
- package/resources/ecc/rules/kotlin-coding-style.md +39 -0
- package/resources/ecc/rules/kotlin-hooks.md +16 -0
- package/resources/ecc/rules/kotlin-patterns.md +50 -0
- package/resources/ecc/rules/kotlin-security.md +58 -0
- package/resources/ecc/rules/kotlin-testing.md +38 -0
- package/resources/ecc/rules/php-coding-style.md +25 -0
- package/resources/ecc/rules/php-hooks.md +21 -0
- package/resources/ecc/rules/php-patterns.md +23 -0
- package/resources/ecc/rules/php-security.md +24 -0
- package/resources/ecc/rules/php-testing.md +26 -0
- package/resources/ecc/rules/python-coding-style.md +42 -0
- package/resources/ecc/rules/python-hooks.md +19 -0
- package/resources/ecc/rules/python-patterns.md +39 -0
- package/resources/ecc/rules/python-security.md +30 -0
- package/resources/ecc/rules/python-testing.md +38 -0
- package/resources/ecc/rules/swift-coding-style.md +47 -0
- package/resources/ecc/rules/swift-hooks.md +20 -0
- package/resources/ecc/rules/swift-patterns.md +66 -0
- package/resources/ecc/rules/swift-security.md +33 -0
- package/resources/ecc/rules/swift-testing.md +45 -0
- package/resources/ecc/rules/typescript-coding-style.md +63 -0
- package/resources/ecc/rules/typescript-hooks.md +20 -0
- package/resources/ecc/rules/typescript-patterns.md +50 -0
- package/resources/ecc/rules/typescript-security.md +26 -0
- package/resources/ecc/rules/typescript-testing.md +16 -0
- package/resources/ecc/skills/agent-introspection-debugging/SKILL.md +152 -0
- package/resources/ecc/skills/agent-introspection-debugging/agents/openai.yaml +7 -0
- package/resources/ecc/skills/agent-sort/SKILL.md +214 -0
- package/resources/ecc/skills/agent-sort/agents/openai.yaml +7 -0
- package/resources/ecc/skills/api-design/SKILL.md +522 -0
- package/resources/ecc/skills/api-design/agents/openai.yaml +7 -0
- package/resources/ecc/skills/article-writing/SKILL.md +78 -0
- package/resources/ecc/skills/article-writing/agents/openai.yaml +7 -0
- package/resources/ecc/skills/backend-patterns/SKILL.md +597 -0
- package/resources/ecc/skills/backend-patterns/agents/openai.yaml +7 -0
- package/resources/ecc/skills/brand-voice/SKILL.md +96 -0
- package/resources/ecc/skills/brand-voice/agents/openai.yaml +7 -0
- package/resources/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/resources/ecc/skills/bun-runtime/SKILL.md +83 -0
- package/resources/ecc/skills/bun-runtime/agents/openai.yaml +7 -0
- package/resources/ecc/skills/coding-standards/SKILL.md +548 -0
- package/resources/ecc/skills/coding-standards/agents/openai.yaml +7 -0
- package/resources/ecc/skills/content-engine/SKILL.md +130 -0
- package/resources/ecc/skills/content-engine/agents/openai.yaml +7 -0
- package/resources/ecc/skills/crosspost/SKILL.md +110 -0
- package/resources/ecc/skills/crosspost/agents/openai.yaml +7 -0
- package/resources/ecc/skills/deep-research/SKILL.md +154 -0
- package/resources/ecc/skills/deep-research/agents/openai.yaml +7 -0
- package/resources/ecc/skills/dmux-workflows/SKILL.md +143 -0
- package/resources/ecc/skills/dmux-workflows/agents/openai.yaml +7 -0
- package/resources/ecc/skills/documentation-lookup/SKILL.md +89 -0
- package/resources/ecc/skills/documentation-lookup/agents/openai.yaml +7 -0
- package/resources/ecc/skills/e2e-testing/SKILL.md +325 -0
- package/resources/ecc/skills/e2e-testing/agents/openai.yaml +7 -0
- package/resources/ecc/skills/eval-harness/SKILL.md +235 -0
- package/resources/ecc/skills/eval-harness/agents/openai.yaml +7 -0
- package/resources/ecc/skills/everything-claude-code/SKILL.md +442 -0
- package/resources/ecc/skills/everything-claude-code/agents/openai.yaml +7 -0
- package/resources/ecc/skills/exa-search/SKILL.md +169 -0
- package/resources/ecc/skills/exa-search/agents/openai.yaml +7 -0
- package/resources/ecc/skills/fal-ai-media/SKILL.md +276 -0
- package/resources/ecc/skills/fal-ai-media/agents/openai.yaml +7 -0
- package/resources/ecc/skills/frontend-patterns/SKILL.md +647 -0
- package/resources/ecc/skills/frontend-patterns/agents/openai.yaml +7 -0
- package/resources/ecc/skills/frontend-slides/SKILL.md +183 -0
- package/resources/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/resources/ecc/skills/frontend-slides/agents/openai.yaml +7 -0
- package/resources/ecc/skills/investor-materials/SKILL.md +95 -0
- package/resources/ecc/skills/investor-materials/agents/openai.yaml +7 -0
- package/resources/ecc/skills/investor-outreach/SKILL.md +90 -0
- package/resources/ecc/skills/investor-outreach/agents/openai.yaml +7 -0
- package/resources/ecc/skills/market-research/SKILL.md +74 -0
- package/resources/ecc/skills/market-research/agents/openai.yaml +7 -0
- package/resources/ecc/skills/mcp-server-patterns/SKILL.md +66 -0
- package/resources/ecc/skills/mcp-server-patterns/agents/openai.yaml +7 -0
- package/resources/ecc/skills/mle-workflow/SKILL.md +346 -0
- package/resources/ecc/skills/mle-workflow/agents/openai.yaml +7 -0
- package/resources/ecc/skills/nextjs-turbopack/SKILL.md +43 -0
- package/resources/ecc/skills/nextjs-turbopack/agents/openai.yaml +7 -0
- package/resources/ecc/skills/product-capability/SKILL.md +140 -0
- package/resources/ecc/skills/product-capability/agents/openai.yaml +7 -0
- package/resources/ecc/skills/security-review/SKILL.md +494 -0
- package/resources/ecc/skills/security-review/agents/openai.yaml +7 -0
- package/resources/ecc/skills/strategic-compact/SKILL.md +102 -0
- package/resources/ecc/skills/strategic-compact/agents/openai.yaml +7 -0
- package/resources/ecc/skills/tdd-workflow/SKILL.md +409 -0
- package/resources/ecc/skills/tdd-workflow/agents/openai.yaml +7 -0
- package/resources/ecc/skills/verification-loop/SKILL.md +125 -0
- package/resources/ecc/skills/verification-loop/agents/openai.yaml +7 -0
- package/resources/ecc/skills/video-editing/SKILL.md +307 -0
- package/resources/ecc/skills/video-editing/agents/openai.yaml +7 -0
- package/resources/ecc/skills/x-api/SKILL.md +229 -0
- 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,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,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":"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"}
|
|
@@ -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,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,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,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"}
|