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.
Files changed (235) hide show
  1. package/README.md +88 -68
  2. package/dist/domain/entities/task.js +4 -4
  3. package/dist/error-handler.js +4 -9
  4. package/dist/index.js +253 -1219
  5. package/dist/infrastructure/config/product-context.js +7 -6
  6. package/dist/infrastructure/hooks/claude-sdk-hook.js +335 -63
  7. package/dist/infrastructure/observability/execution-tracer.js +11 -6
  8. package/dist/infrastructure/orchestration/agent-adapter.js +13 -0
  9. package/dist/infrastructure/orchestration/agent-installer.js +101 -0
  10. package/dist/infrastructure/orchestration/agents-config-seed.js +56 -0
  11. package/dist/infrastructure/orchestration/aider-adapter.js +319 -0
  12. package/dist/infrastructure/orchestration/artifacts-extractor.js +175 -0
  13. package/dist/infrastructure/orchestration/claude-code-adapter.js +352 -0
  14. package/dist/infrastructure/orchestration/codex-adapter.js +310 -0
  15. package/dist/infrastructure/orchestration/generic-cli-adapter.js +553 -0
  16. package/dist/infrastructure/orchestration/opencode-adapter.js +275 -0
  17. package/dist/infrastructure/orchestration/progress-aggregator.js +189 -0
  18. package/dist/infrastructure/orchestration/readiness.js +106 -0
  19. package/dist/infrastructure/orchestration/session-manager.js +272 -0
  20. package/dist/infrastructure/orchestration/session-persistence.js +109 -0
  21. package/dist/infrastructure/protocols/mcp-helpers.js +10 -30
  22. package/dist/infrastructure/protocols/mcp-server-impl.js +359 -21
  23. package/dist/infrastructure/protocols/ui-page.js +1827 -0
  24. package/dist/infrastructure/security/file-collection.js +115 -0
  25. package/dist/infrastructure/security/trust-scorer.js +301 -56
  26. package/dist/infrastructure/storage/task-repository.js +8 -7
  27. package/dist/monitoring.js +9 -38
  28. package/dist/presentation/cli/commands/help-command.js +96 -139
  29. package/dist/presentation/cli/commands/hook-command.js +17 -24
  30. package/dist/presentation/cli/commands/report-command.js +59 -72
  31. package/dist/presentation/cli/commands/setup-command.js +4 -4
  32. package/dist/presentation/cli/commands/status-command.js +321 -30
  33. package/dist/presentation/cli/commands/trust-command.js +84 -72
  34. package/dist/presentation/cli/error-display.js +17 -21
  35. package/dist/ui.js +11 -11
  36. package/package.json +24 -62
  37. package/dist/agents/base.js +0 -101
  38. package/dist/agents/orchestrator-model-driven.js +0 -141
  39. package/dist/agents/react-orchestrator-agent.js +0 -54
  40. package/dist/application/agents/execution-agent.js +0 -508
  41. package/dist/application/agents/multi-agent-orchestrator.js +0 -295
  42. package/dist/application/agents/planning-agent.js +0 -433
  43. package/dist/application/agents/validation-agent.js +0 -317
  44. package/dist/application/architectures/plan-and-act.js +0 -242
  45. package/dist/application/index.js +0 -12
  46. package/dist/application/services/agent-factory.js +0 -28
  47. package/dist/application/services/dependency-container.js +0 -596
  48. package/dist/application/services/git-context-service.js +0 -83
  49. package/dist/application/services/intelligent-router.js +0 -934
  50. package/dist/application/services/tool-executor-service.js +0 -94
  51. package/dist/application/use-cases/ask-question-use-case.js +0 -338
  52. package/dist/application/use-cases/edit-file-use-case.js +0 -830
  53. package/dist/application/use-cases/explain-file-use-case.js +0 -50
  54. package/dist/application/use-cases/index-codebase-use-case.js +0 -113
  55. package/dist/application/use-cases/planning-use-case.js +0 -276
  56. package/dist/application/use-cases/react-orchestration-use-case.js +0 -329
  57. package/dist/application/use-cases/reflexion-use-case.js +0 -30
  58. package/dist/application/workflows/deterministic-workflows.js +0 -189
  59. package/dist/ast-parser.js +0 -331
  60. package/dist/cache.js +0 -180
  61. package/dist/chat.js +0 -251
  62. package/dist/code-analysis.js +0 -327
  63. package/dist/context.js +0 -187
  64. package/dist/docs.js +0 -146
  65. package/dist/domain/entities/code-chunk.js +0 -6
  66. package/dist/domain/entities/decision.js +0 -9
  67. package/dist/domain/entities/edit.js +0 -6
  68. package/dist/domain/entities/knowledge-node.js +0 -9
  69. package/dist/domain/entities/knowledge-preservation.js +0 -10
  70. package/dist/domain/entities/memory.js +0 -6
  71. package/dist/domain/entities/pattern.js +0 -7
  72. package/dist/domain/entities/plan.js +0 -6
  73. package/dist/domain/entities/query.js +0 -6
  74. package/dist/domain/errors/embeddings-not-found-error.js +0 -13
  75. package/dist/domain/index.js +0 -19
  76. package/dist/domain/interfaces/ai-service.interface.js +0 -6
  77. package/dist/domain/interfaces/code-analyzer.interface.js +0 -6
  78. package/dist/domain/interfaces/decision-repository.interface.js +0 -9
  79. package/dist/domain/interfaces/embedding-repository.interface.js +0 -6
  80. package/dist/domain/interfaces/knowledge-graph-repository.interface.js +0 -9
  81. package/dist/domain/interfaces/knowledge-preservation-repository.interface.js +0 -8
  82. package/dist/domain/interfaces/memory-repository.interface.js +0 -6
  83. package/dist/domain/interfaces/pattern-repository.interface.js +0 -6
  84. package/dist/domain/interfaces/verification-service.interface.js +0 -6
  85. package/dist/domain/services/cross-team-pattern-sharing.js +0 -125
  86. package/dist/domain/services/decision-recorder.js +0 -223
  87. package/dist/domain/services/decision-retriever.js +0 -133
  88. package/dist/domain/services/environment-mode-manager.js +0 -22
  89. package/dist/domain/services/graded-memory-activation.js +0 -69
  90. package/dist/domain/services/knowledge-access.js +0 -132
  91. package/dist/domain/services/knowledge-extractor.js +0 -247
  92. package/dist/domain/services/knowledge-graph-builder.js +0 -268
  93. package/dist/domain/services/knowledge-graph-query.js +0 -187
  94. package/dist/domain/services/memory-retriever.js +0 -82
  95. package/dist/domain/services/memory-synthesizer.js +0 -91
  96. package/dist/domain/services/pattern-extractor.js +0 -442
  97. package/dist/domain/services/query-intent-classifier.js +0 -140
  98. package/dist/domain/services/react-loop.js +0 -186
  99. package/dist/domain/services/risk-tier-detector.js +0 -78
  100. package/dist/edit.js +0 -319
  101. package/dist/embed.js +0 -459
  102. package/dist/formatter.js +0 -168
  103. package/dist/git.js +0 -198
  104. package/dist/infrastructure/ai/cohere-ai-service.js +0 -607
  105. package/dist/infrastructure/ai/command-r-evaluation.js +0 -206
  106. package/dist/infrastructure/ai/model-config.js +0 -84
  107. package/dist/infrastructure/ai/provider-ai-service.js +0 -477
  108. package/dist/infrastructure/cache/embedding-cache.js +0 -175
  109. package/dist/infrastructure/cache/query-result-cache.js +0 -66
  110. package/dist/infrastructure/cache/response-cache.js +0 -48
  111. package/dist/infrastructure/cache/security-scan-cache.js +0 -47
  112. package/dist/infrastructure/chunking/ast-code-chunker.js +0 -19
  113. package/dist/infrastructure/chunking/code-aware-chunker.js +0 -397
  114. package/dist/infrastructure/context/context-compressor.js +0 -329
  115. package/dist/infrastructure/context/conversation-context.js +0 -128
  116. package/dist/infrastructure/context/session-manager.js +0 -94
  117. package/dist/infrastructure/cost/cost-tracker.js +0 -360
  118. package/dist/infrastructure/file-scanner/file-scanner.js +0 -106
  119. package/dist/infrastructure/governance/nist-ai-rmf.js +0 -292
  120. package/dist/infrastructure/governance/policy-as-code.js +0 -258
  121. package/dist/infrastructure/governance/prompt-to-code-lineage.js +0 -239
  122. package/dist/infrastructure/index.js +0 -7
  123. package/dist/infrastructure/observability/prompt-versioner.js +0 -145
  124. package/dist/infrastructure/protocols/a2a-metadata.js +0 -137
  125. package/dist/infrastructure/protocols/a2a-protocol.js +0 -314
  126. package/dist/infrastructure/protocols/mcp-oauth.js +0 -184
  127. package/dist/infrastructure/protocols/mcp-server.js +0 -333
  128. package/dist/infrastructure/protocols/streaming-handler.js +0 -103
  129. package/dist/infrastructure/providers/cohere-provider.js +0 -444
  130. package/dist/infrastructure/providers/fake-provider.js +0 -130
  131. package/dist/infrastructure/providers/local-llm-provider.js +0 -330
  132. package/dist/infrastructure/providers/model-config.types.js +0 -9
  133. package/dist/infrastructure/providers/model-provider.interface.js +0 -8
  134. package/dist/infrastructure/providers/openai-provider.js +0 -413
  135. package/dist/infrastructure/providers/openrouter-provider.js +0 -399
  136. package/dist/infrastructure/providers/operation-provider-resolver.js +0 -105
  137. package/dist/infrastructure/providers/provider-config-loader.js +0 -120
  138. package/dist/infrastructure/providers/provider-registry.js +0 -88
  139. package/dist/infrastructure/safety/pattern-detector.js +0 -133
  140. package/dist/infrastructure/security/ai-sast-scanner.js +0 -290
  141. package/dist/infrastructure/security/docker-sandbox.js +0 -178
  142. package/dist/infrastructure/security/enhanced-security-gate.js +0 -151
  143. package/dist/infrastructure/security/license-scanner.js +0 -167
  144. package/dist/infrastructure/security/provider-bias-detector.js +0 -164
  145. package/dist/infrastructure/security/sandbox-executor.js +0 -64
  146. package/dist/infrastructure/serialization/toon-serializer.js +0 -119
  147. package/dist/infrastructure/storage/memory-stream-service.js +0 -204
  148. package/dist/infrastructure/storage/plan-repository.js +0 -96
  149. package/dist/infrastructure/storage/sqlite-decision-repository.js +0 -232
  150. package/dist/infrastructure/storage/sqlite-embedding-repository.js +0 -311
  151. package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.js +0 -417
  152. package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.js +0 -230
  153. package/dist/infrastructure/storage/sqlite-memory-repository.js +0 -229
  154. package/dist/infrastructure/storage/sqlite-pattern-repository.js +0 -249
  155. package/dist/infrastructure/storage/task-helpers.js +0 -197
  156. package/dist/infrastructure/telemetry/telemetry-service.js +0 -167
  157. package/dist/infrastructure/ux/appropriate-friction.js +0 -213
  158. package/dist/infrastructure/ux/bi-directional-learning.js +0 -337
  159. package/dist/infrastructure/ux/capability-boundaries.js +0 -42
  160. package/dist/infrastructure/ux/comprehensive-formatter.js +0 -117
  161. package/dist/infrastructure/ux/contextual-feature-discovery.js +0 -10
  162. package/dist/infrastructure/ux/expectation-management.js +0 -327
  163. package/dist/infrastructure/ux/feature-discovery.js +0 -14
  164. package/dist/infrastructure/ux/feedback-prompt.js +0 -45
  165. package/dist/infrastructure/ux/hitl-validation.js +0 -297
  166. package/dist/infrastructure/ux/progress-indicator.js +0 -116
  167. package/dist/infrastructure/ux/progressive-disclosure.js +0 -236
  168. package/dist/infrastructure/ux/review-checkpoint.js +0 -72
  169. package/dist/infrastructure/ux/staged-feature-intro.js +0 -24
  170. package/dist/infrastructure/ux/stream-markdown.js +0 -151
  171. package/dist/infrastructure/ux/syntax-highlighter.js +0 -91
  172. package/dist/infrastructure/ux/team-standards.js +0 -196
  173. package/dist/infrastructure/ux/transparency.js +0 -71
  174. package/dist/infrastructure/validation/agent-feedback.js +0 -55
  175. package/dist/infrastructure/validation/agent-validation-helper.js +0 -137
  176. package/dist/infrastructure/validation/review-handler.js +0 -40
  177. package/dist/infrastructure/validation/summary-aggregator.js +0 -70
  178. package/dist/infrastructure/validation/summary-extractor.js +0 -45
  179. package/dist/infrastructure/validation/trace-summary.js +0 -52
  180. package/dist/infrastructure/verification/verification-service.js +0 -47
  181. package/dist/infrastructure/xai/attention-visualizer.js +0 -172
  182. package/dist/infrastructure/xai/cot-visualizer.js +0 -283
  183. package/dist/infrastructure/xai/decision-tree-log.js +0 -212
  184. package/dist/infrastructure/xai/interactive-xai.js +0 -260
  185. package/dist/infrastructure/xai/uncertainty-quantifier.js +0 -198
  186. package/dist/intelligent-retrieval.js +0 -272
  187. package/dist/intent/classifier.js +0 -2
  188. package/dist/intent/context.js +0 -2
  189. package/dist/iterative-refinement.js +0 -189
  190. package/dist/learning.js +0 -232
  191. package/dist/log.js +0 -31
  192. package/dist/migrate.js +0 -133
  193. package/dist/parallel-processor.js +0 -534
  194. package/dist/planner.js +0 -198
  195. package/dist/policy.js +0 -26
  196. package/dist/presentation/cli/commands/ask-command.js +0 -314
  197. package/dist/presentation/cli/commands/cost-command.js +0 -191
  198. package/dist/presentation/cli/commands/decision-command.js +0 -207
  199. package/dist/presentation/cli/commands/docs-command.js +0 -25
  200. package/dist/presentation/cli/commands/fix-command.js +0 -53
  201. package/dist/presentation/cli/commands/knowledge-command.js +0 -129
  202. package/dist/presentation/cli/commands/learning-dashboard-command.js +0 -183
  203. package/dist/presentation/cli/commands/models-command.js +0 -194
  204. package/dist/presentation/cli/commands/orchestrate-command.js +0 -207
  205. package/dist/presentation/cli/commands/plan-command.js +0 -246
  206. package/dist/presentation/cli/commands/product-command.js +0 -199
  207. package/dist/presentation/cli/commands/react-command.js +0 -181
  208. package/dist/presentation/cli/commands/review-command.js +0 -154
  209. package/dist/presentation/cli/commands/run-command.js +0 -188
  210. package/dist/presentation/cli/commands/smart-command.js +0 -395
  211. package/dist/presentation/cli/commands/suggest-command.js +0 -138
  212. package/dist/presentation/cli/commands/trace-command.js +0 -129
  213. package/dist/presentation/cli/commands/undo-command.js +0 -150
  214. package/dist/query-optimizer.js +0 -205
  215. package/dist/refactor.js +0 -116
  216. package/dist/review.js +0 -206
  217. package/dist/search.js +0 -163
  218. package/dist/session.js +0 -704
  219. package/dist/task-verification.js +0 -336
  220. package/dist/testgen.js +0 -166
  221. package/dist/token-optimizer.js +0 -277
  222. package/dist/tools/bash.js +0 -213
  223. package/dist/tools/edit.js +0 -235
  224. package/dist/tools/executor.js +0 -153
  225. package/dist/tools/git-tool.js +0 -292
  226. package/dist/tools/parser.js +0 -158
  227. package/dist/tools/registry.js +0 -302
  228. package/dist/tools/search.js +0 -100
  229. package/dist/types.js +0 -2
  230. package/dist/utils/check-api-status.js +0 -100
  231. package/dist/utils/diff-parser.js +0 -162
  232. package/dist/verification/backup.js +0 -259
  233. package/dist/verification/compiler.js +0 -264
  234. package/dist/verification/index.js +0 -273
  235. package/dist/verification/test-runner.js +0 -379
@@ -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
@@ -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