codehere 0.2.2 → 0.3.0-rc.1
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 +88 -68
- package/dist/domain/entities/task.js +4 -4
- package/dist/error-handler.js +4 -9
- package/dist/index.js +253 -1219
- package/dist/infrastructure/config/product-context.js +7 -6
- package/dist/infrastructure/hooks/claude-sdk-hook.js +335 -63
- package/dist/infrastructure/observability/execution-tracer.js +11 -6
- package/dist/infrastructure/orchestration/agent-adapter.js +13 -0
- package/dist/infrastructure/orchestration/agent-installer.js +101 -0
- package/dist/infrastructure/orchestration/agents-config-seed.js +56 -0
- package/dist/infrastructure/orchestration/aider-adapter.js +319 -0
- package/dist/infrastructure/orchestration/artifacts-extractor.js +175 -0
- package/dist/infrastructure/orchestration/claude-code-adapter.js +352 -0
- package/dist/infrastructure/orchestration/codex-adapter.js +310 -0
- package/dist/infrastructure/orchestration/generic-cli-adapter.js +553 -0
- package/dist/infrastructure/orchestration/opencode-adapter.js +275 -0
- package/dist/infrastructure/orchestration/progress-aggregator.js +189 -0
- package/dist/infrastructure/orchestration/readiness.js +106 -0
- package/dist/infrastructure/orchestration/session-manager.js +272 -0
- package/dist/infrastructure/orchestration/session-persistence.js +109 -0
- package/dist/infrastructure/protocols/mcp-helpers.js +10 -30
- package/dist/infrastructure/protocols/mcp-server-impl.js +359 -21
- package/dist/infrastructure/protocols/ui-page.js +1827 -0
- package/dist/infrastructure/security/file-collection.js +115 -0
- package/dist/infrastructure/security/trust-scorer.js +301 -56
- package/dist/infrastructure/storage/task-repository.js +8 -7
- package/dist/monitoring.js +9 -38
- package/dist/presentation/cli/commands/help-command.js +96 -139
- package/dist/presentation/cli/commands/hook-command.js +17 -24
- package/dist/presentation/cli/commands/report-command.js +59 -72
- package/dist/presentation/cli/commands/setup-command.js +4 -4
- package/dist/presentation/cli/commands/status-command.js +321 -30
- package/dist/presentation/cli/commands/trust-command.js +84 -72
- package/dist/presentation/cli/error-display.js +17 -21
- package/dist/ui.js +11 -11
- package/package.json +24 -62
- package/dist/agents/base.js +0 -101
- package/dist/agents/orchestrator-model-driven.js +0 -141
- package/dist/agents/react-orchestrator-agent.js +0 -54
- package/dist/application/agents/execution-agent.js +0 -508
- package/dist/application/agents/multi-agent-orchestrator.js +0 -295
- package/dist/application/agents/planning-agent.js +0 -433
- package/dist/application/agents/validation-agent.js +0 -317
- package/dist/application/architectures/plan-and-act.js +0 -242
- package/dist/application/index.js +0 -12
- package/dist/application/services/agent-factory.js +0 -28
- package/dist/application/services/dependency-container.js +0 -596
- package/dist/application/services/git-context-service.js +0 -83
- package/dist/application/services/intelligent-router.js +0 -934
- package/dist/application/services/tool-executor-service.js +0 -94
- package/dist/application/use-cases/ask-question-use-case.js +0 -338
- package/dist/application/use-cases/edit-file-use-case.js +0 -830
- package/dist/application/use-cases/explain-file-use-case.js +0 -50
- package/dist/application/use-cases/index-codebase-use-case.js +0 -113
- package/dist/application/use-cases/planning-use-case.js +0 -276
- package/dist/application/use-cases/react-orchestration-use-case.js +0 -329
- package/dist/application/use-cases/reflexion-use-case.js +0 -30
- package/dist/application/workflows/deterministic-workflows.js +0 -189
- package/dist/ast-parser.js +0 -331
- package/dist/cache.js +0 -180
- package/dist/chat.js +0 -251
- package/dist/code-analysis.js +0 -327
- package/dist/context.js +0 -187
- package/dist/docs.js +0 -146
- package/dist/domain/entities/code-chunk.js +0 -6
- package/dist/domain/entities/decision.js +0 -9
- package/dist/domain/entities/edit.js +0 -6
- package/dist/domain/entities/knowledge-node.js +0 -9
- package/dist/domain/entities/knowledge-preservation.js +0 -10
- package/dist/domain/entities/memory.js +0 -6
- package/dist/domain/entities/pattern.js +0 -7
- package/dist/domain/entities/plan.js +0 -6
- package/dist/domain/entities/query.js +0 -6
- package/dist/domain/errors/embeddings-not-found-error.js +0 -13
- package/dist/domain/index.js +0 -19
- package/dist/domain/interfaces/ai-service.interface.js +0 -6
- package/dist/domain/interfaces/code-analyzer.interface.js +0 -6
- package/dist/domain/interfaces/decision-repository.interface.js +0 -9
- package/dist/domain/interfaces/embedding-repository.interface.js +0 -6
- package/dist/domain/interfaces/knowledge-graph-repository.interface.js +0 -9
- package/dist/domain/interfaces/knowledge-preservation-repository.interface.js +0 -8
- package/dist/domain/interfaces/memory-repository.interface.js +0 -6
- package/dist/domain/interfaces/pattern-repository.interface.js +0 -6
- package/dist/domain/interfaces/verification-service.interface.js +0 -6
- package/dist/domain/services/cross-team-pattern-sharing.js +0 -125
- package/dist/domain/services/decision-recorder.js +0 -223
- package/dist/domain/services/decision-retriever.js +0 -133
- package/dist/domain/services/environment-mode-manager.js +0 -22
- package/dist/domain/services/graded-memory-activation.js +0 -69
- package/dist/domain/services/knowledge-access.js +0 -132
- package/dist/domain/services/knowledge-extractor.js +0 -247
- package/dist/domain/services/knowledge-graph-builder.js +0 -268
- package/dist/domain/services/knowledge-graph-query.js +0 -187
- package/dist/domain/services/memory-retriever.js +0 -82
- package/dist/domain/services/memory-synthesizer.js +0 -91
- package/dist/domain/services/pattern-extractor.js +0 -442
- package/dist/domain/services/query-intent-classifier.js +0 -140
- package/dist/domain/services/react-loop.js +0 -186
- package/dist/domain/services/risk-tier-detector.js +0 -78
- package/dist/edit.js +0 -319
- package/dist/embed.js +0 -459
- package/dist/formatter.js +0 -168
- package/dist/git.js +0 -198
- package/dist/infrastructure/ai/cohere-ai-service.js +0 -607
- package/dist/infrastructure/ai/command-r-evaluation.js +0 -206
- package/dist/infrastructure/ai/model-config.js +0 -84
- package/dist/infrastructure/ai/provider-ai-service.js +0 -477
- package/dist/infrastructure/cache/embedding-cache.js +0 -175
- package/dist/infrastructure/cache/query-result-cache.js +0 -66
- package/dist/infrastructure/cache/response-cache.js +0 -48
- package/dist/infrastructure/cache/security-scan-cache.js +0 -47
- package/dist/infrastructure/chunking/ast-code-chunker.js +0 -19
- package/dist/infrastructure/chunking/code-aware-chunker.js +0 -397
- package/dist/infrastructure/context/context-compressor.js +0 -329
- package/dist/infrastructure/context/conversation-context.js +0 -128
- package/dist/infrastructure/context/session-manager.js +0 -94
- package/dist/infrastructure/cost/cost-tracker.js +0 -360
- package/dist/infrastructure/file-scanner/file-scanner.js +0 -106
- package/dist/infrastructure/governance/nist-ai-rmf.js +0 -292
- package/dist/infrastructure/governance/policy-as-code.js +0 -258
- package/dist/infrastructure/governance/prompt-to-code-lineage.js +0 -239
- package/dist/infrastructure/index.js +0 -7
- package/dist/infrastructure/observability/prompt-versioner.js +0 -145
- package/dist/infrastructure/protocols/a2a-metadata.js +0 -137
- package/dist/infrastructure/protocols/a2a-protocol.js +0 -314
- package/dist/infrastructure/protocols/mcp-oauth.js +0 -184
- package/dist/infrastructure/protocols/mcp-server.js +0 -333
- package/dist/infrastructure/protocols/streaming-handler.js +0 -103
- package/dist/infrastructure/providers/cohere-provider.js +0 -444
- package/dist/infrastructure/providers/fake-provider.js +0 -130
- package/dist/infrastructure/providers/local-llm-provider.js +0 -330
- package/dist/infrastructure/providers/model-config.types.js +0 -9
- package/dist/infrastructure/providers/model-provider.interface.js +0 -8
- package/dist/infrastructure/providers/openai-provider.js +0 -413
- package/dist/infrastructure/providers/openrouter-provider.js +0 -399
- package/dist/infrastructure/providers/operation-provider-resolver.js +0 -105
- package/dist/infrastructure/providers/provider-config-loader.js +0 -120
- package/dist/infrastructure/providers/provider-registry.js +0 -88
- package/dist/infrastructure/safety/pattern-detector.js +0 -133
- package/dist/infrastructure/security/ai-sast-scanner.js +0 -290
- package/dist/infrastructure/security/docker-sandbox.js +0 -178
- package/dist/infrastructure/security/enhanced-security-gate.js +0 -151
- package/dist/infrastructure/security/license-scanner.js +0 -167
- package/dist/infrastructure/security/provider-bias-detector.js +0 -164
- package/dist/infrastructure/security/sandbox-executor.js +0 -64
- package/dist/infrastructure/serialization/toon-serializer.js +0 -119
- package/dist/infrastructure/storage/memory-stream-service.js +0 -204
- package/dist/infrastructure/storage/plan-repository.js +0 -96
- package/dist/infrastructure/storage/sqlite-decision-repository.js +0 -232
- package/dist/infrastructure/storage/sqlite-embedding-repository.js +0 -311
- package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.js +0 -417
- package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.js +0 -230
- package/dist/infrastructure/storage/sqlite-memory-repository.js +0 -229
- package/dist/infrastructure/storage/sqlite-pattern-repository.js +0 -249
- package/dist/infrastructure/storage/task-helpers.js +0 -197
- package/dist/infrastructure/telemetry/telemetry-service.js +0 -167
- package/dist/infrastructure/ux/appropriate-friction.js +0 -213
- package/dist/infrastructure/ux/bi-directional-learning.js +0 -337
- package/dist/infrastructure/ux/capability-boundaries.js +0 -42
- package/dist/infrastructure/ux/comprehensive-formatter.js +0 -117
- package/dist/infrastructure/ux/contextual-feature-discovery.js +0 -10
- package/dist/infrastructure/ux/expectation-management.js +0 -327
- package/dist/infrastructure/ux/feature-discovery.js +0 -14
- package/dist/infrastructure/ux/feedback-prompt.js +0 -45
- package/dist/infrastructure/ux/hitl-validation.js +0 -297
- package/dist/infrastructure/ux/progress-indicator.js +0 -116
- package/dist/infrastructure/ux/progressive-disclosure.js +0 -236
- package/dist/infrastructure/ux/review-checkpoint.js +0 -72
- package/dist/infrastructure/ux/staged-feature-intro.js +0 -24
- package/dist/infrastructure/ux/stream-markdown.js +0 -151
- package/dist/infrastructure/ux/syntax-highlighter.js +0 -91
- package/dist/infrastructure/ux/team-standards.js +0 -196
- package/dist/infrastructure/ux/transparency.js +0 -71
- package/dist/infrastructure/validation/agent-feedback.js +0 -55
- package/dist/infrastructure/validation/agent-validation-helper.js +0 -137
- package/dist/infrastructure/validation/review-handler.js +0 -40
- package/dist/infrastructure/validation/summary-aggregator.js +0 -70
- package/dist/infrastructure/validation/summary-extractor.js +0 -45
- package/dist/infrastructure/validation/trace-summary.js +0 -52
- package/dist/infrastructure/verification/verification-service.js +0 -47
- package/dist/infrastructure/xai/attention-visualizer.js +0 -172
- package/dist/infrastructure/xai/cot-visualizer.js +0 -283
- package/dist/infrastructure/xai/decision-tree-log.js +0 -212
- package/dist/infrastructure/xai/interactive-xai.js +0 -260
- package/dist/infrastructure/xai/uncertainty-quantifier.js +0 -198
- package/dist/intelligent-retrieval.js +0 -272
- package/dist/intent/classifier.js +0 -2
- package/dist/intent/context.js +0 -2
- package/dist/iterative-refinement.js +0 -189
- package/dist/learning.js +0 -232
- package/dist/log.js +0 -31
- package/dist/migrate.js +0 -133
- package/dist/parallel-processor.js +0 -534
- package/dist/planner.js +0 -198
- package/dist/policy.js +0 -26
- package/dist/presentation/cli/commands/ask-command.js +0 -314
- package/dist/presentation/cli/commands/cost-command.js +0 -191
- package/dist/presentation/cli/commands/decision-command.js +0 -207
- package/dist/presentation/cli/commands/docs-command.js +0 -25
- package/dist/presentation/cli/commands/fix-command.js +0 -53
- package/dist/presentation/cli/commands/knowledge-command.js +0 -129
- package/dist/presentation/cli/commands/learning-dashboard-command.js +0 -183
- package/dist/presentation/cli/commands/models-command.js +0 -194
- package/dist/presentation/cli/commands/orchestrate-command.js +0 -207
- package/dist/presentation/cli/commands/plan-command.js +0 -246
- package/dist/presentation/cli/commands/product-command.js +0 -199
- package/dist/presentation/cli/commands/react-command.js +0 -181
- package/dist/presentation/cli/commands/review-command.js +0 -154
- package/dist/presentation/cli/commands/run-command.js +0 -188
- package/dist/presentation/cli/commands/smart-command.js +0 -395
- package/dist/presentation/cli/commands/suggest-command.js +0 -138
- package/dist/presentation/cli/commands/trace-command.js +0 -129
- package/dist/presentation/cli/commands/undo-command.js +0 -150
- package/dist/query-optimizer.js +0 -205
- package/dist/refactor.js +0 -116
- package/dist/review.js +0 -206
- package/dist/search.js +0 -163
- package/dist/session.js +0 -704
- package/dist/task-verification.js +0 -336
- package/dist/testgen.js +0 -166
- package/dist/token-optimizer.js +0 -277
- package/dist/tools/bash.js +0 -213
- package/dist/tools/edit.js +0 -235
- package/dist/tools/executor.js +0 -153
- package/dist/tools/git-tool.js +0 -292
- package/dist/tools/parser.js +0 -158
- package/dist/tools/registry.js +0 -302
- package/dist/tools/search.js +0 -100
- package/dist/types.js +0 -2
- package/dist/utils/check-api-status.js +0 -100
- package/dist/utils/diff-parser.js +0 -162
- package/dist/verification/backup.js +0 -259
- package/dist/verification/compiler.js +0 -264
- package/dist/verification/index.js +0 -273
- package/dist/verification/test-runner.js +0 -379
package/dist/token-optimizer.js
DELETED
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Token Optimization System
|
|
3
|
-
* 80-90% token reduction through smart compression
|
|
4
|
-
*/
|
|
5
|
-
import { encoding_for_model } from 'tiktoken';
|
|
6
|
-
const enc = encoding_for_model('gpt-3.5-turbo');
|
|
7
|
-
/**
|
|
8
|
-
* Optimize context to minimize tokens while preserving relevance
|
|
9
|
-
*/
|
|
10
|
-
export function optimizeContext(chunks, query, maxTokens, strategy = 'relevant-only') {
|
|
11
|
-
const originalTokens = chunks.reduce((sum, chunk) => sum + enc.encode(chunk.content).length, 0);
|
|
12
|
-
let optimized;
|
|
13
|
-
switch (strategy) {
|
|
14
|
-
case 'function-level':
|
|
15
|
-
optimized = optimizeFunctionLevel(chunks, query, maxTokens);
|
|
16
|
-
break;
|
|
17
|
-
case 'file-level':
|
|
18
|
-
optimized = optimizeFileLevel(chunks, query, maxTokens);
|
|
19
|
-
break;
|
|
20
|
-
case 'relevant-only':
|
|
21
|
-
optimized = optimizeRelevantOnly(chunks, query, maxTokens);
|
|
22
|
-
break;
|
|
23
|
-
case 'compressed':
|
|
24
|
-
optimized = optimizeCompressed(chunks, query, maxTokens);
|
|
25
|
-
break;
|
|
26
|
-
default:
|
|
27
|
-
optimized = optimizeRelevantOnly(chunks, query, maxTokens);
|
|
28
|
-
}
|
|
29
|
-
const optimizedTokens = optimized.reduce((sum, chunk) => sum + enc.encode(chunk.content).length, 0);
|
|
30
|
-
const reductionPercent = originalTokens > 0
|
|
31
|
-
? ((originalTokens - optimizedTokens) / originalTokens) * 100
|
|
32
|
-
: 0;
|
|
33
|
-
return {
|
|
34
|
-
chunks: optimized,
|
|
35
|
-
totalTokens: optimizedTokens,
|
|
36
|
-
reductionPercent,
|
|
37
|
-
strategy,
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Extract only relevant functions/classes from chunks
|
|
42
|
-
*/
|
|
43
|
-
function optimizeFunctionLevel(chunks, query, maxTokens) {
|
|
44
|
-
const optimized = [];
|
|
45
|
-
let currentTokens = 0;
|
|
46
|
-
// Extract function/class names from query
|
|
47
|
-
const querySymbols = extractSymbolsFromQuery(query);
|
|
48
|
-
for (const chunk of chunks) {
|
|
49
|
-
if (currentTokens >= maxTokens)
|
|
50
|
-
break;
|
|
51
|
-
// Try to extract relevant functions/classes
|
|
52
|
-
const relevantCode = extractRelevantCode(chunk.content, querySymbols);
|
|
53
|
-
if (relevantCode) {
|
|
54
|
-
const tokens = enc.encode(relevantCode).length;
|
|
55
|
-
if (currentTokens + tokens <= maxTokens) {
|
|
56
|
-
optimized.push({
|
|
57
|
-
...chunk,
|
|
58
|
-
content: relevantCode,
|
|
59
|
-
});
|
|
60
|
-
currentTokens += tokens;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
else {
|
|
64
|
-
// Fallback: use chunk but truncate
|
|
65
|
-
const tokens = enc.encode(chunk.content).length;
|
|
66
|
-
const remaining = maxTokens - currentTokens;
|
|
67
|
-
if (tokens <= remaining) {
|
|
68
|
-
optimized.push(chunk);
|
|
69
|
-
currentTokens += tokens;
|
|
70
|
-
}
|
|
71
|
-
else if (remaining > 100) {
|
|
72
|
-
const truncated = truncateToTokens(chunk.content, remaining);
|
|
73
|
-
optimized.push({
|
|
74
|
-
...chunk,
|
|
75
|
-
content: truncated,
|
|
76
|
-
});
|
|
77
|
-
currentTokens = maxTokens;
|
|
78
|
-
break;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return optimized;
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Deduplicate and keep only unique files
|
|
86
|
-
*/
|
|
87
|
-
function optimizeFileLevel(chunks, query, maxTokens) {
|
|
88
|
-
// Group by file
|
|
89
|
-
const fileGroups = new Map();
|
|
90
|
-
for (const chunk of chunks) {
|
|
91
|
-
if (!fileGroups.has(chunk.filepath)) {
|
|
92
|
-
fileGroups.set(chunk.filepath, []);
|
|
93
|
-
}
|
|
94
|
-
fileGroups.get(chunk.filepath).push(chunk);
|
|
95
|
-
}
|
|
96
|
-
// Keep best chunk per file
|
|
97
|
-
const optimized = [];
|
|
98
|
-
let currentTokens = 0;
|
|
99
|
-
for (const [filepath, fileChunks] of fileGroups.entries()) {
|
|
100
|
-
if (currentTokens >= maxTokens)
|
|
101
|
-
break;
|
|
102
|
-
// Sort by score and take best
|
|
103
|
-
const bestChunk = fileChunks.sort((a, b) => b.score - a.score)[0];
|
|
104
|
-
const tokens = enc.encode(bestChunk.content).length;
|
|
105
|
-
if (currentTokens + tokens <= maxTokens) {
|
|
106
|
-
optimized.push(bestChunk);
|
|
107
|
-
currentTokens += tokens;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return optimized;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Keep only most relevant chunks
|
|
114
|
-
*/
|
|
115
|
-
function optimizeRelevantOnly(chunks, query, maxTokens) {
|
|
116
|
-
// Sort by relevance (score)
|
|
117
|
-
const sorted = [...chunks].sort((a, b) => b.score - a.score);
|
|
118
|
-
const optimized = [];
|
|
119
|
-
let currentTokens = 0;
|
|
120
|
-
for (const chunk of sorted) {
|
|
121
|
-
if (currentTokens >= maxTokens)
|
|
122
|
-
break;
|
|
123
|
-
const tokens = enc.encode(chunk.content).length;
|
|
124
|
-
const remaining = maxTokens - currentTokens;
|
|
125
|
-
if (tokens <= remaining) {
|
|
126
|
-
optimized.push(chunk);
|
|
127
|
-
currentTokens += tokens;
|
|
128
|
-
}
|
|
129
|
-
else if (remaining > 100) {
|
|
130
|
-
// Truncate to fit
|
|
131
|
-
const truncated = truncateToTokens(chunk.content, remaining);
|
|
132
|
-
optimized.push({
|
|
133
|
-
...chunk,
|
|
134
|
-
content: truncated,
|
|
135
|
-
});
|
|
136
|
-
currentTokens = maxTokens;
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
return optimized;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Compress chunks by removing comments and whitespace
|
|
144
|
-
*/
|
|
145
|
-
function optimizeCompressed(chunks, query, maxTokens) {
|
|
146
|
-
const optimized = [];
|
|
147
|
-
let currentTokens = 0;
|
|
148
|
-
for (const chunk of chunks) {
|
|
149
|
-
if (currentTokens >= maxTokens)
|
|
150
|
-
break;
|
|
151
|
-
// Remove comments and excessive whitespace
|
|
152
|
-
const compressed = compressCode(chunk.content);
|
|
153
|
-
const tokens = enc.encode(compressed).length;
|
|
154
|
-
const remaining = maxTokens - currentTokens;
|
|
155
|
-
if (tokens <= remaining) {
|
|
156
|
-
optimized.push({
|
|
157
|
-
...chunk,
|
|
158
|
-
content: compressed,
|
|
159
|
-
});
|
|
160
|
-
currentTokens += tokens;
|
|
161
|
-
}
|
|
162
|
-
else if (remaining > 100) {
|
|
163
|
-
const truncated = truncateToTokens(compressed, remaining);
|
|
164
|
-
optimized.push({
|
|
165
|
-
...chunk,
|
|
166
|
-
content: truncated,
|
|
167
|
-
});
|
|
168
|
-
currentTokens = maxTokens;
|
|
169
|
-
break;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
return optimized;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Extract relevant code (functions/classes) from chunk
|
|
176
|
-
*/
|
|
177
|
-
function extractRelevantCode(content, symbols) {
|
|
178
|
-
if (symbols.length === 0)
|
|
179
|
-
return null;
|
|
180
|
-
const lines = content.split('\n');
|
|
181
|
-
const relevant = [];
|
|
182
|
-
let inRelevantBlock = false;
|
|
183
|
-
let braceCount = 0;
|
|
184
|
-
for (let i = 0; i < lines.length; i++) {
|
|
185
|
-
const line = lines[i];
|
|
186
|
-
// Check if line contains a symbol we're looking for
|
|
187
|
-
const hasSymbol = symbols.some(symbol => line.includes(symbol) &&
|
|
188
|
-
(line.match(/(function|class|interface|type|const|let|var)\s+/)));
|
|
189
|
-
if (hasSymbol) {
|
|
190
|
-
inRelevantBlock = true;
|
|
191
|
-
braceCount = 0;
|
|
192
|
-
}
|
|
193
|
-
if (inRelevantBlock) {
|
|
194
|
-
relevant.push(line);
|
|
195
|
-
// Count braces to find end of block
|
|
196
|
-
braceCount += (line.match(/{/g) || []).length;
|
|
197
|
-
braceCount -= (line.match(/}/g) || []).length;
|
|
198
|
-
if (braceCount === 0 && relevant.length > 1) {
|
|
199
|
-
// End of block
|
|
200
|
-
return relevant.join('\n');
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
return relevant.length > 0 ? relevant.join('\n') : null;
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Extract symbol names from query
|
|
208
|
-
*/
|
|
209
|
-
function extractSymbolsFromQuery(query) {
|
|
210
|
-
const patterns = [
|
|
211
|
-
/function\s+(\w+)/gi,
|
|
212
|
-
/class\s+(\w+)/gi,
|
|
213
|
-
/interface\s+(\w+)/gi,
|
|
214
|
-
/type\s+(\w+)/gi,
|
|
215
|
-
/([A-Z][a-zA-Z0-9]+)/g,
|
|
216
|
-
/([a-z][a-zA-Z0-9]*\(\))/g,
|
|
217
|
-
];
|
|
218
|
-
const symbols = new Set();
|
|
219
|
-
for (const pattern of patterns) {
|
|
220
|
-
const matches = query.matchAll(pattern);
|
|
221
|
-
for (const match of matches) {
|
|
222
|
-
if (match[1]) {
|
|
223
|
-
symbols.add(match[1]);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
return Array.from(symbols);
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Compress code by removing comments and whitespace
|
|
231
|
-
*/
|
|
232
|
-
function compressCode(code) {
|
|
233
|
-
return code
|
|
234
|
-
// Remove single-line comments
|
|
235
|
-
.replace(/\/\/.*$/gm, '')
|
|
236
|
-
// Remove multi-line comments
|
|
237
|
-
.replace(/\/\*[\s\S]*?\*\//g, '')
|
|
238
|
-
// Remove excessive whitespace
|
|
239
|
-
.replace(/\n\s*\n\s*\n/g, '\n\n')
|
|
240
|
-
// Trim lines
|
|
241
|
-
.split('\n')
|
|
242
|
-
.map(line => line.trim())
|
|
243
|
-
.filter(line => line.length > 0)
|
|
244
|
-
.join('\n');
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Truncate text to fit token limit
|
|
248
|
-
*/
|
|
249
|
-
function truncateToTokens(text, maxTokens) {
|
|
250
|
-
const tokens = enc.encode(text);
|
|
251
|
-
if (tokens.length <= maxTokens) {
|
|
252
|
-
return text;
|
|
253
|
-
}
|
|
254
|
-
const truncatedTokens = tokens.slice(0, maxTokens - 10); // Leave room for "..."
|
|
255
|
-
const decoded = enc.decode(truncatedTokens);
|
|
256
|
-
const decodedText = typeof decoded === 'string'
|
|
257
|
-
? decoded
|
|
258
|
-
: new TextDecoder().decode(decoded);
|
|
259
|
-
return decodedText + '...';
|
|
260
|
-
}
|
|
261
|
-
/**
|
|
262
|
-
* Deduplicate chunks
|
|
263
|
-
*/
|
|
264
|
-
export function deduplicateChunks(chunks) {
|
|
265
|
-
const seen = new Set();
|
|
266
|
-
const unique = [];
|
|
267
|
-
for (const chunk of chunks) {
|
|
268
|
-
// Create a key from filepath and content hash
|
|
269
|
-
const key = `${chunk.filepath}:${chunk.content.substring(0, 100)}`;
|
|
270
|
-
if (!seen.has(key)) {
|
|
271
|
-
seen.add(key);
|
|
272
|
-
unique.push(chunk);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
return unique;
|
|
276
|
-
}
|
|
277
|
-
//# sourceMappingURL=token-optimizer.js.map
|
package/dist/tools/bash.js
DELETED
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Bash Tool
|
|
3
|
-
* Execute shell commands safely with detailed descriptions for the model
|
|
4
|
-
* Following Claude Code approach: detailed tool descriptions, error-proofing
|
|
5
|
-
*
|
|
6
|
-
* SECURITY: Uses Docker sandbox when available for isolated execution
|
|
7
|
-
*/
|
|
8
|
-
import { exec } from 'child_process';
|
|
9
|
-
import { promisify } from 'util';
|
|
10
|
-
import { resolve } from 'path';
|
|
11
|
-
import { existsSync } from 'fs';
|
|
12
|
-
import { SandboxExecutor } from '../infrastructure/security/sandbox-executor.js';
|
|
13
|
-
const execAsync = promisify(exec);
|
|
14
|
-
// Singleton sandbox executor instance
|
|
15
|
-
let sandboxExecutor = null;
|
|
16
|
-
/**
|
|
17
|
-
* Get or create sandbox executor instance
|
|
18
|
-
*/
|
|
19
|
-
function getSandboxExecutor() {
|
|
20
|
-
if (!sandboxExecutor) {
|
|
21
|
-
sandboxExecutor = new SandboxExecutor();
|
|
22
|
-
}
|
|
23
|
-
return sandboxExecutor;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Execute a bash command safely
|
|
27
|
-
*
|
|
28
|
-
* SECURITY & ERROR-PROOFING:
|
|
29
|
-
* - All paths are resolved to absolute paths
|
|
30
|
-
* - Commands are executed in Docker sandbox when available (MANDATORY for production)
|
|
31
|
-
* - Falls back to direct execution with warning if sandbox unavailable
|
|
32
|
-
* - Timeout protection prevents hanging
|
|
33
|
-
* - Output size limits prevent memory issues
|
|
34
|
-
* - Command injection attempts are logged
|
|
35
|
-
*/
|
|
36
|
-
export async function executeBash(command, options = {}) {
|
|
37
|
-
const startTime = Date.now();
|
|
38
|
-
// Resolve working directory to absolute path
|
|
39
|
-
const cwd = options.cwd
|
|
40
|
-
? resolve(options.cwd)
|
|
41
|
-
: process.cwd();
|
|
42
|
-
// Verify directory exists
|
|
43
|
-
if (!existsSync(cwd)) {
|
|
44
|
-
throw new Error(`Working directory does not exist: ${cwd}`);
|
|
45
|
-
}
|
|
46
|
-
// Security: Log suspicious patterns (but don't block - let model decide)
|
|
47
|
-
const suspiciousPatterns = [
|
|
48
|
-
/rm\s+-rf\s+\//, // Dangerous rm -rf /
|
|
49
|
-
/format\s+c:/i, // Windows format
|
|
50
|
-
/mkfs/, // Filesystem creation
|
|
51
|
-
/dd\s+if=/, // Disk operations
|
|
52
|
-
];
|
|
53
|
-
for (const pattern of suspiciousPatterns) {
|
|
54
|
-
if (pattern.test(command)) {
|
|
55
|
-
console.warn(`⚠️ Warning: Potentially dangerous command detected: ${command}`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
// Try to use sandbox first (MANDATORY for production security)
|
|
59
|
-
const sandbox = getSandboxExecutor();
|
|
60
|
-
const sandboxAvailable = await sandbox.isAvailable();
|
|
61
|
-
if (sandboxAvailable) {
|
|
62
|
-
try {
|
|
63
|
-
// Execute in sandbox
|
|
64
|
-
const sandboxOptions = {
|
|
65
|
-
timeout: options.timeout || 30000,
|
|
66
|
-
memoryLimit: '512m',
|
|
67
|
-
cpuLimit: '0.5',
|
|
68
|
-
networkAccess: false, // No network access by default
|
|
69
|
-
};
|
|
70
|
-
const sandboxResult = await sandbox.executeBash(command, sandboxOptions);
|
|
71
|
-
const duration = Date.now() - startTime;
|
|
72
|
-
return {
|
|
73
|
-
exitCode: sandboxResult.exitCode || (sandboxResult.success ? 0 : 1),
|
|
74
|
-
stdout: sandboxResult.output || '',
|
|
75
|
-
stderr: sandboxResult.error || '',
|
|
76
|
-
command,
|
|
77
|
-
duration,
|
|
78
|
-
success: sandboxResult.success,
|
|
79
|
-
sandboxed: true,
|
|
80
|
-
sandboxStatus: 'Executed in Docker sandbox (secure)',
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
catch (sandboxError) {
|
|
84
|
-
// If sandbox execution fails, fall through to direct execution with warning
|
|
85
|
-
console.warn(`⚠️ Sandbox execution failed, falling back to direct execution: ${sandboxError.message}`);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
// Sandbox not available - use direct execution with warning
|
|
90
|
-
console.warn(`⚠️ WARNING: Docker sandbox not available. Executing command directly (less secure).`);
|
|
91
|
-
console.warn(`⚠️ For production use, please install Docker to enable secure sandbox execution.`);
|
|
92
|
-
}
|
|
93
|
-
// Fallback: Direct execution (with security warning)
|
|
94
|
-
const timeout = options.timeout || 30000; // 30 seconds
|
|
95
|
-
const maxOutputSize = options.maxOutputSize || 1024 * 1024; // 1MB
|
|
96
|
-
// Merge environment variables
|
|
97
|
-
const env = {
|
|
98
|
-
...process.env,
|
|
99
|
-
...options.env,
|
|
100
|
-
};
|
|
101
|
-
try {
|
|
102
|
-
// Execute command with timeout
|
|
103
|
-
const { stdout, stderr } = await Promise.race([
|
|
104
|
-
execAsync(command, {
|
|
105
|
-
cwd,
|
|
106
|
-
env,
|
|
107
|
-
maxBuffer: maxOutputSize,
|
|
108
|
-
}),
|
|
109
|
-
new Promise((_, reject) => {
|
|
110
|
-
setTimeout(() => {
|
|
111
|
-
reject(new Error(`Command timed out after ${timeout}ms`));
|
|
112
|
-
}, timeout);
|
|
113
|
-
}),
|
|
114
|
-
]);
|
|
115
|
-
const duration = Date.now() - startTime;
|
|
116
|
-
// Check output size
|
|
117
|
-
const totalSize = (stdout?.length || 0) + (stderr?.length || 0);
|
|
118
|
-
if (totalSize > maxOutputSize) {
|
|
119
|
-
console.warn(`⚠️ Warning: Command output exceeds ${maxOutputSize} bytes, truncated`);
|
|
120
|
-
}
|
|
121
|
-
return {
|
|
122
|
-
exitCode: 0,
|
|
123
|
-
stdout: stdout || '',
|
|
124
|
-
stderr: stderr || '',
|
|
125
|
-
command,
|
|
126
|
-
duration,
|
|
127
|
-
success: true,
|
|
128
|
-
sandboxed: false,
|
|
129
|
-
sandboxStatus: sandboxAvailable
|
|
130
|
-
? 'Sandbox available but execution failed, used direct execution'
|
|
131
|
-
: 'Docker sandbox not available, used direct execution (less secure)',
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
catch (error) {
|
|
135
|
-
const duration = Date.now() - startTime;
|
|
136
|
-
// Extract exit code from error
|
|
137
|
-
const exitCode = error.code || (error.signal ? 128 : 1);
|
|
138
|
-
return {
|
|
139
|
-
exitCode,
|
|
140
|
-
stdout: error.stdout || '',
|
|
141
|
-
stderr: error.stderr || error.message || '',
|
|
142
|
-
command,
|
|
143
|
-
duration,
|
|
144
|
-
success: exitCode === 0,
|
|
145
|
-
sandboxed: false,
|
|
146
|
-
sandboxStatus: sandboxAvailable
|
|
147
|
-
? 'Sandbox available but execution failed, used direct execution'
|
|
148
|
-
: 'Docker sandbox not available, used direct execution (less secure)',
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Tool description for the model
|
|
154
|
-
* This is critical - the model needs to understand how to use this tool
|
|
155
|
-
*/
|
|
156
|
-
export const BASH_TOOL_DESCRIPTION = `
|
|
157
|
-
Bash Tool - Execute shell commands
|
|
158
|
-
|
|
159
|
-
DESCRIPTION:
|
|
160
|
-
Execute bash/shell commands in a controlled environment. All paths are automatically resolved to absolute paths.
|
|
161
|
-
|
|
162
|
-
AVAILABLE COMMANDS:
|
|
163
|
-
- Any valid bash/shell command
|
|
164
|
-
- Commands run in the project directory by default
|
|
165
|
-
- Working directory can be specified
|
|
166
|
-
|
|
167
|
-
IMPORTANT CONSTRAINTS:
|
|
168
|
-
1. **Absolute Paths Required**: Always use absolute paths or paths relative to the working directory
|
|
169
|
-
2. **No Internet Access**: Commands run in isolated environment (no network access)
|
|
170
|
-
3. **Available Packages**: Standard Unix utilities (ls, cat, grep, find, etc.)
|
|
171
|
-
4. **Timeout**: Commands timeout after 30 seconds (configurable)
|
|
172
|
-
5. **Output Limit**: Maximum 1MB output (configurable)
|
|
173
|
-
|
|
174
|
-
ESCAPING:
|
|
175
|
-
- Use single quotes for strings: 'string with spaces'
|
|
176
|
-
- Escape special characters: Use backslash before $, backtick, or double quote
|
|
177
|
-
- For complex commands, consider breaking into multiple steps
|
|
178
|
-
|
|
179
|
-
BACKGROUND PROCESSES:
|
|
180
|
-
- Background processes (&) are NOT supported
|
|
181
|
-
- Use sequential commands instead
|
|
182
|
-
|
|
183
|
-
PATH HANDLING:
|
|
184
|
-
- All paths are resolved to absolute paths automatically
|
|
185
|
-
- Use resolve() or absolute paths to avoid relative path issues
|
|
186
|
-
- Example: /Users/username/project/file.txt (absolute)
|
|
187
|
-
- Example: ./file.txt (relative to cwd)
|
|
188
|
-
|
|
189
|
-
ERROR HANDLING:
|
|
190
|
-
- Exit code 0 = success
|
|
191
|
-
- Exit code != 0 = failure
|
|
192
|
-
- Check stderr for error messages
|
|
193
|
-
- Timeout errors are reported in stderr
|
|
194
|
-
|
|
195
|
-
EXAMPLES:
|
|
196
|
-
- executeBash('ls -la', { cwd: '/path/to/dir' })
|
|
197
|
-
- executeBash('grep -r "pattern" .', { cwd: '/path/to/project' })
|
|
198
|
-
- executeBash('cat /absolute/path/to/file.txt')
|
|
199
|
-
- executeBash('find . -name "*.ts" -type f', { cwd: '/path/to/project' })
|
|
200
|
-
|
|
201
|
-
SECURITY NOTES:
|
|
202
|
-
- Commands execute in Docker sandbox when available (MANDATORY for production)
|
|
203
|
-
- Falls back to direct execution with warning if Docker unavailable
|
|
204
|
-
- Potentially dangerous commands are logged but not blocked
|
|
205
|
-
- Use with caution for destructive operations
|
|
206
|
-
- Always verify paths before executing
|
|
207
|
-
|
|
208
|
-
SANDBOX STATUS:
|
|
209
|
-
- Check result.sandboxed to see if command ran in sandbox
|
|
210
|
-
- Check result.sandboxStatus for sandbox availability information
|
|
211
|
-
- Production deployments should always have Docker available
|
|
212
|
-
`;
|
|
213
|
-
//# sourceMappingURL=bash.js.map
|