codehere 0.2.2 → 0.3.0-rc.10

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