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.
- package/README.md +88 -68
- package/dist/domain/entities/task.js +4 -4
- package/dist/error-handler.js +4 -9
- package/dist/index.js +261 -1224
- package/dist/infrastructure/config/product-context.js +7 -6
- package/dist/infrastructure/hooks/claude-sdk-hook.js +348 -72
- 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/conductor-adapter.js +340 -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 +278 -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/probe-port.js +36 -0
- 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/presentation/cli/repl.js +474 -0
- 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
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Intelligent Context Retrieval System
|
|
3
|
-
* 10X effectiveness through smart context selection
|
|
4
|
-
*/
|
|
5
|
-
import { parseFile, findCallers, findCallees, buildCallGraph } from './ast-parser.js';
|
|
6
|
-
import { readFileSync, existsSync } from 'fs';
|
|
7
|
-
import { join } from 'path';
|
|
8
|
-
/**
|
|
9
|
-
* Classify query intent
|
|
10
|
-
*/
|
|
11
|
-
export function classifyQueryIntent(query) {
|
|
12
|
-
const lowerQuery = query.toLowerCase();
|
|
13
|
-
// Refactor intent
|
|
14
|
-
if (lowerQuery.includes('refactor') || lowerQuery.includes('rename') ||
|
|
15
|
-
lowerQuery.includes('extract') || lowerQuery.includes('move') ||
|
|
16
|
-
lowerQuery.includes('restructure')) {
|
|
17
|
-
return 'refactor';
|
|
18
|
-
}
|
|
19
|
-
// Debug intent
|
|
20
|
-
if (lowerQuery.includes('bug') || lowerQuery.includes('error') ||
|
|
21
|
-
lowerQuery.includes('fix') || lowerQuery.includes('issue') ||
|
|
22
|
-
lowerQuery.includes('problem') || lowerQuery.includes('wrong')) {
|
|
23
|
-
return 'debug';
|
|
24
|
-
}
|
|
25
|
-
// Implement intent
|
|
26
|
-
if (lowerQuery.includes('implement') || lowerQuery.includes('create') ||
|
|
27
|
-
lowerQuery.includes('add') || lowerQuery.includes('write') ||
|
|
28
|
-
lowerQuery.includes('build')) {
|
|
29
|
-
return 'implement';
|
|
30
|
-
}
|
|
31
|
-
// Find intent
|
|
32
|
-
if (lowerQuery.includes('find') || lowerQuery.includes('where') ||
|
|
33
|
-
lowerQuery.includes('locate') || lowerQuery.includes('search')) {
|
|
34
|
-
return 'find';
|
|
35
|
-
}
|
|
36
|
-
// Modify intent
|
|
37
|
-
if (lowerQuery.includes('modify') || lowerQuery.includes('change') ||
|
|
38
|
-
lowerQuery.includes('update') || lowerQuery.includes('edit')) {
|
|
39
|
-
return 'modify';
|
|
40
|
-
}
|
|
41
|
-
// Understand/Explain intent (default)
|
|
42
|
-
if (lowerQuery.includes('how') || lowerQuery.includes('what') ||
|
|
43
|
-
lowerQuery.includes('explain') || lowerQuery.includes('understand') ||
|
|
44
|
-
lowerQuery.includes('does') || lowerQuery.includes('work')) {
|
|
45
|
-
return 'explain';
|
|
46
|
-
}
|
|
47
|
-
return 'understand';
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Extract function/class names from query
|
|
51
|
-
*/
|
|
52
|
-
export function extractSymbolNames(query) {
|
|
53
|
-
// Look for function/class names (capitalized words, camelCase, etc.)
|
|
54
|
-
const patterns = [
|
|
55
|
-
/function\s+(\w+)/gi,
|
|
56
|
-
/class\s+(\w+)/gi,
|
|
57
|
-
/interface\s+(\w+)/gi,
|
|
58
|
-
/type\s+(\w+)/gi,
|
|
59
|
-
/const\s+(\w+)/gi,
|
|
60
|
-
/let\s+(\w+)/gi,
|
|
61
|
-
/var\s+(\w+)/gi,
|
|
62
|
-
/([A-Z][a-zA-Z0-9]+)/g, // Capitalized words (likely class names)
|
|
63
|
-
/([a-z][a-zA-Z0-9]*\(\))/g, // camelCase followed by () (likely function calls)
|
|
64
|
-
];
|
|
65
|
-
const symbols = new Set();
|
|
66
|
-
for (const pattern of patterns) {
|
|
67
|
-
const matches = query.matchAll(pattern);
|
|
68
|
-
for (const match of matches) {
|
|
69
|
-
if (match[1]) {
|
|
70
|
-
symbols.add(match[1]);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return Array.from(symbols);
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Get intelligent context based on query intent and code structure
|
|
78
|
-
*/
|
|
79
|
-
export async function getIntelligentContext(query, options = {}) {
|
|
80
|
-
const { maxTokens = 2000, baseDir = process.cwd() } = options;
|
|
81
|
-
// Classify query intent
|
|
82
|
-
const intent = classifyQueryIntent(query);
|
|
83
|
-
// Extract symbol names from query
|
|
84
|
-
const symbolNames = extractSymbolNames(query);
|
|
85
|
-
// Get initial search results (more than needed, we'll filter)
|
|
86
|
-
// Use searchSimilar directly - it's imported at top level now
|
|
87
|
-
const { searchSimilar } = await import('./search.js');
|
|
88
|
-
const initialResults = await searchSimilar(query, 30);
|
|
89
|
-
if (initialResults.length === 0) {
|
|
90
|
-
return {
|
|
91
|
-
primaryChunks: [],
|
|
92
|
-
relatedChunks: [],
|
|
93
|
-
codeStructure: { symbols: [], relationships: [] },
|
|
94
|
-
relevance: new Map(),
|
|
95
|
-
tokenEstimate: 0,
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
// Get unique filepaths
|
|
99
|
-
const filepaths = [...new Set(initialResults.map(r => r.filepath))];
|
|
100
|
-
// Parse files to get code structure
|
|
101
|
-
const analyses = [];
|
|
102
|
-
const filepathToAnalysis = new Map();
|
|
103
|
-
for (const filepath of filepaths.slice(0, 10)) { // Limit to 10 files for performance
|
|
104
|
-
const fullPath = join(baseDir, filepath);
|
|
105
|
-
if (existsSync(fullPath)) {
|
|
106
|
-
const analysis = parseFile(fullPath);
|
|
107
|
-
if (analysis) {
|
|
108
|
-
analyses.push(analysis);
|
|
109
|
-
filepathToAnalysis.set(filepath, analysis);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
// Build call graph
|
|
114
|
-
const callGraph = buildCallGraph(analyses);
|
|
115
|
-
// Find relevant symbols
|
|
116
|
-
const relevantSymbols = new Set();
|
|
117
|
-
for (const symbolName of symbolNames) {
|
|
118
|
-
relevantSymbols.add(symbolName);
|
|
119
|
-
// Add callers and callees
|
|
120
|
-
const callers = findCallers(symbolName, callGraph);
|
|
121
|
-
const callees = findCallees(symbolName, callGraph);
|
|
122
|
-
callers.forEach(c => relevantSymbols.add(c));
|
|
123
|
-
callees.forEach(c => relevantSymbols.add(c));
|
|
124
|
-
}
|
|
125
|
-
// Calculate relevance scores
|
|
126
|
-
const relevance = new Map();
|
|
127
|
-
for (const result of initialResults) {
|
|
128
|
-
let score = result.score; // Base similarity score
|
|
129
|
-
// Boost if file contains relevant symbols
|
|
130
|
-
const analysis = filepathToAnalysis.get(result.filepath);
|
|
131
|
-
if (analysis) {
|
|
132
|
-
const hasRelevantSymbol = analysis.symbols.some(s => relevantSymbols.has(s.name) ||
|
|
133
|
-
symbolNames.some(sn => s.name.includes(sn) || sn.includes(s.name)));
|
|
134
|
-
if (hasRelevantSymbol) {
|
|
135
|
-
score *= 1.5; // Boost relevance
|
|
136
|
-
}
|
|
137
|
-
// Boost if chunk contains symbol names
|
|
138
|
-
const chunkHasSymbol = symbolNames.some(sn => result.content.toLowerCase().includes(sn.toLowerCase()));
|
|
139
|
-
if (chunkHasSymbol) {
|
|
140
|
-
score *= 1.3;
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
// Intent-based scoring
|
|
144
|
-
if (intent === 'refactor' || intent === 'modify') {
|
|
145
|
-
// Prefer chunks with function/class definitions
|
|
146
|
-
if (result.content.match(/(function|class|interface|type)\s+\w+/)) {
|
|
147
|
-
score *= 1.2;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
if (intent === 'debug') {
|
|
151
|
-
// Prefer chunks with error handling, try-catch, etc.
|
|
152
|
-
if (result.content.match(/(try|catch|error|throw|if.*error)/i)) {
|
|
153
|
-
score *= 1.2;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
relevance.set(result.filepath, score);
|
|
157
|
-
}
|
|
158
|
-
// Sort by relevance with source file priority
|
|
159
|
-
const sortedResults = initialResults.sort((a, b) => {
|
|
160
|
-
const scoreA = relevance.get(a.filepath) || a.score;
|
|
161
|
-
const scoreB = relevance.get(b.filepath) || b.score;
|
|
162
|
-
// Boost source files over documentation
|
|
163
|
-
const isSourceA = /\.(ts|tsx|js|jsx)$/.test(a.filepath) && !/\.(md|txt)$/.test(a.filepath);
|
|
164
|
-
const isSourceB = /\.(ts|tsx|js|jsx)$/.test(b.filepath) && !/\.(md|txt)$/.test(b.filepath);
|
|
165
|
-
if (isSourceA && !isSourceB)
|
|
166
|
-
return -1; // A is source, B is not
|
|
167
|
-
if (!isSourceA && isSourceB)
|
|
168
|
-
return 1; // B is source, A is not
|
|
169
|
-
return scoreB - scoreA;
|
|
170
|
-
});
|
|
171
|
-
// Filter and optimize chunks based on intent
|
|
172
|
-
const optimizedChunks = await optimizeChunks(sortedResults, intent, symbolNames, analyses, maxTokens);
|
|
173
|
-
// Split into primary and related
|
|
174
|
-
const primaryChunks = optimizedChunks.slice(0, Math.min(10, optimizedChunks.length));
|
|
175
|
-
const relatedChunks = optimizedChunks.slice(primaryChunks.length);
|
|
176
|
-
// Extract code structure info
|
|
177
|
-
const allSymbols = analyses.flatMap(a => a.symbols.map(s => ({
|
|
178
|
-
name: s.name,
|
|
179
|
-
filepath: a.filepath,
|
|
180
|
-
line: s.line,
|
|
181
|
-
kind: s.kind,
|
|
182
|
-
})));
|
|
183
|
-
const allRelationships = analyses.flatMap(a => a.relationships.map(r => ({
|
|
184
|
-
from: r.from,
|
|
185
|
-
to: r.to,
|
|
186
|
-
type: r.type,
|
|
187
|
-
})));
|
|
188
|
-
// Estimate tokens (rough: 1 token ≈ 4 characters)
|
|
189
|
-
const tokenEstimate = optimizedChunks.reduce((sum, chunk) => sum + Math.ceil(chunk.content.length / 4), 0);
|
|
190
|
-
return {
|
|
191
|
-
primaryChunks,
|
|
192
|
-
relatedChunks,
|
|
193
|
-
codeStructure: {
|
|
194
|
-
symbols: allSymbols,
|
|
195
|
-
relationships: allRelationships,
|
|
196
|
-
},
|
|
197
|
-
relevance,
|
|
198
|
-
tokenEstimate,
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Optimize chunks based on intent and token limit
|
|
203
|
-
*/
|
|
204
|
-
async function optimizeChunks(results, intent, symbolNames, analyses, maxTokens) {
|
|
205
|
-
const optimized = [];
|
|
206
|
-
let currentTokens = 0;
|
|
207
|
-
// Create filepath to analysis map
|
|
208
|
-
const filepathToAnalysis = new Map();
|
|
209
|
-
for (const analysis of analyses) {
|
|
210
|
-
filepathToAnalysis.set(analysis.filepath, analysis);
|
|
211
|
-
}
|
|
212
|
-
for (const result of results) {
|
|
213
|
-
if (currentTokens >= maxTokens)
|
|
214
|
-
break;
|
|
215
|
-
const analysis = filepathToAnalysis.get(result.filepath);
|
|
216
|
-
// For function/class queries, extract just the relevant function/class
|
|
217
|
-
if (symbolNames.length > 0 && analysis) {
|
|
218
|
-
const relevantSymbol = analysis.symbols.find(s => symbolNames.some(sn => s.name === sn || s.name.includes(sn)));
|
|
219
|
-
if (relevantSymbol) {
|
|
220
|
-
// Extract just the function/class, not the entire chunk
|
|
221
|
-
const optimizedChunk = extractSymbolCode(result.filepath, relevantSymbol.line, relevantSymbol.kind);
|
|
222
|
-
if (optimizedChunk) {
|
|
223
|
-
const chunkTokens = Math.ceil(optimizedChunk.length / 4);
|
|
224
|
-
if (currentTokens + chunkTokens <= maxTokens) {
|
|
225
|
-
optimized.push({
|
|
226
|
-
...result,
|
|
227
|
-
content: optimizedChunk,
|
|
228
|
-
});
|
|
229
|
-
currentTokens += chunkTokens;
|
|
230
|
-
continue;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
// Otherwise, use the chunk but truncate if needed
|
|
236
|
-
const chunkTokens = Math.ceil(result.content.length / 4);
|
|
237
|
-
const remainingTokens = maxTokens - currentTokens;
|
|
238
|
-
if (chunkTokens <= remainingTokens) {
|
|
239
|
-
optimized.push(result);
|
|
240
|
-
currentTokens += chunkTokens;
|
|
241
|
-
}
|
|
242
|
-
else if (remainingTokens > 100) {
|
|
243
|
-
// Truncate chunk to fit
|
|
244
|
-
const truncatedContent = result.content.substring(0, remainingTokens * 4);
|
|
245
|
-
optimized.push({
|
|
246
|
-
...result,
|
|
247
|
-
content: truncatedContent + '...',
|
|
248
|
-
});
|
|
249
|
-
currentTokens = maxTokens;
|
|
250
|
-
break;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
return optimized;
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Extract code for a specific symbol (function, class, etc.)
|
|
257
|
-
*/
|
|
258
|
-
function extractSymbolCode(filepath, line, kind) {
|
|
259
|
-
try {
|
|
260
|
-
const content = readFileSync(filepath, 'utf-8');
|
|
261
|
-
const lines = content.split('\n');
|
|
262
|
-
// For now, return a window around the symbol
|
|
263
|
-
// TODO: Use AST to extract exact symbol boundaries
|
|
264
|
-
const start = Math.max(0, line - 5);
|
|
265
|
-
const end = Math.min(lines.length, line + 50);
|
|
266
|
-
return lines.slice(start, end).join('\n');
|
|
267
|
-
}
|
|
268
|
-
catch {
|
|
269
|
-
return null;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
//# sourceMappingURL=intelligent-retrieval.js.map
|
package/dist/intent/context.js
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Iterative Refinement System
|
|
3
|
-
* Feedback loop, self-correction, validation and retry, learn from mistakes
|
|
4
|
-
*/
|
|
5
|
-
import { verifyTask } from './task-verification.js';
|
|
6
|
-
import { generateDiff } from './chat.js';
|
|
7
|
-
import { applyUnifiedDiff } from './edit.js';
|
|
8
|
-
import { readFileSync, writeFileSync } from 'fs';
|
|
9
|
-
import { container } from './application/services/dependency-container.js';
|
|
10
|
-
/**
|
|
11
|
-
* Refine task iteratively until it passes verification
|
|
12
|
-
*/
|
|
13
|
-
export async function refineTask(filepath, instruction, requirements, maxIterations = 3) {
|
|
14
|
-
const corrections = [];
|
|
15
|
-
let currentContent = readFileSync(filepath, 'utf-8');
|
|
16
|
-
let iteration = 0;
|
|
17
|
-
while (iteration < maxIterations) {
|
|
18
|
-
iteration++;
|
|
19
|
-
// Generate diff
|
|
20
|
-
const diff = await generateDiff(currentContent, instruction, filepath);
|
|
21
|
-
// Apply diff
|
|
22
|
-
const modifiedContent = applyDiff(currentContent, diff);
|
|
23
|
-
// Create context
|
|
24
|
-
const context = {
|
|
25
|
-
filepath,
|
|
26
|
-
originalContent: readFileSync(filepath, 'utf-8'), // Keep original
|
|
27
|
-
modifiedContent,
|
|
28
|
-
diff,
|
|
29
|
-
instruction,
|
|
30
|
-
requirements,
|
|
31
|
-
};
|
|
32
|
-
// Temporarily write modified content
|
|
33
|
-
writeFileSync(filepath, modifiedContent, 'utf-8');
|
|
34
|
-
try {
|
|
35
|
-
// Verify
|
|
36
|
-
const result = await verifyTask(context);
|
|
37
|
-
if (result.success) {
|
|
38
|
-
// Success!
|
|
39
|
-
return {
|
|
40
|
-
success: true,
|
|
41
|
-
iterations: iteration,
|
|
42
|
-
finalResult: result,
|
|
43
|
-
corrections,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
// Failed - extract errors and try to correct
|
|
47
|
-
const errors = result.errors.join('; ');
|
|
48
|
-
// Use Reflexion to generate learning
|
|
49
|
-
const reflexionUseCase = container.reflexionUseCase;
|
|
50
|
-
const reflexionResult = await reflexionUseCase.execute({
|
|
51
|
-
trajectory: {
|
|
52
|
-
query: instruction,
|
|
53
|
-
steps: corrections.map((c, i) => ({
|
|
54
|
-
thought: { content: `Iteration ${i + 1}`, reasoning: c.correction },
|
|
55
|
-
action: { type: 'tool', name: 'edit', parameters: {} },
|
|
56
|
-
observation: { result: null, success: false, error: c.error },
|
|
57
|
-
timestamp: new Date(),
|
|
58
|
-
})),
|
|
59
|
-
success: false,
|
|
60
|
-
},
|
|
61
|
-
reward: 0,
|
|
62
|
-
errors: result.errors,
|
|
63
|
-
});
|
|
64
|
-
const correction = await generateCorrection(currentContent, modifiedContent, instruction, errors, requirements);
|
|
65
|
-
corrections.push({
|
|
66
|
-
iteration,
|
|
67
|
-
error: errors,
|
|
68
|
-
correction: reflexionResult.reflection || correction,
|
|
69
|
-
});
|
|
70
|
-
// Update instruction with reflection-based learning
|
|
71
|
-
instruction = `${instruction}\n\nPrevious attempt failed with: ${errors}\nReflection: ${reflexionResult.reflection}\nCorrection: ${correction}`;
|
|
72
|
-
currentContent = modifiedContent; // Use current as base for next iteration
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
// Error during verification - rollback and try again
|
|
76
|
-
writeFileSync(filepath, currentContent, 'utf-8');
|
|
77
|
-
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
78
|
-
const correction = await generateCorrection(currentContent, modifiedContent, instruction, errorMsg, requirements);
|
|
79
|
-
corrections.push({
|
|
80
|
-
iteration,
|
|
81
|
-
error: errorMsg,
|
|
82
|
-
correction,
|
|
83
|
-
});
|
|
84
|
-
instruction = `${instruction}\n\nError: ${errorMsg}\nCorrection: ${correction}`;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
// Max iterations reached - rollback
|
|
88
|
-
writeFileSync(filepath, currentContent, 'utf-8');
|
|
89
|
-
return {
|
|
90
|
-
success: false,
|
|
91
|
-
iterations: iteration,
|
|
92
|
-
finalResult: {
|
|
93
|
-
success: false,
|
|
94
|
-
compiled: false,
|
|
95
|
-
testsPassed: false,
|
|
96
|
-
requirementsMet: false,
|
|
97
|
-
errors: ['Max iterations reached'],
|
|
98
|
-
warnings: [],
|
|
99
|
-
rollbackRequired: true,
|
|
100
|
-
},
|
|
101
|
-
corrections,
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Apply diff to content (uses edit.ts function)
|
|
106
|
-
*/
|
|
107
|
-
function applyDiff(originalContent, diff) {
|
|
108
|
-
return applyUnifiedDiff(originalContent, diff);
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Generate correction based on errors
|
|
112
|
-
*/
|
|
113
|
-
async function generateCorrection(originalContent, modifiedContent, instruction, errors, requirements) {
|
|
114
|
-
// Use AI to generate correction
|
|
115
|
-
const { chatWithContext } = await import('./chat.js');
|
|
116
|
-
const prompt = `The following code modification failed with errors:
|
|
117
|
-
|
|
118
|
-
Original instruction: ${instruction}
|
|
119
|
-
${requirements ? `Requirements: ${requirements.join(', ')}` : ''}
|
|
120
|
-
|
|
121
|
-
Errors encountered:
|
|
122
|
-
${errors}
|
|
123
|
-
|
|
124
|
-
Original code:
|
|
125
|
-
\`\`\`
|
|
126
|
-
${originalContent.substring(0, 1000)}
|
|
127
|
-
\`\`\`
|
|
128
|
-
|
|
129
|
-
Modified code (that failed):
|
|
130
|
-
\`\`\`
|
|
131
|
-
${modifiedContent.substring(0, 1000)}
|
|
132
|
-
\`\`\`
|
|
133
|
-
|
|
134
|
-
Please provide a brief correction strategy to fix these errors. Be specific about what needs to change.`;
|
|
135
|
-
const correction = await chatWithContext(prompt, [{
|
|
136
|
-
filepath: 'correction',
|
|
137
|
-
content: prompt,
|
|
138
|
-
score: 1.0,
|
|
139
|
-
}]);
|
|
140
|
-
return correction;
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Learn from corrections and improve
|
|
144
|
-
*/
|
|
145
|
-
export function learnFromCorrections(corrections) {
|
|
146
|
-
const errorPatterns = new Map();
|
|
147
|
-
const correctionPatterns = new Map();
|
|
148
|
-
for (const correction of corrections) {
|
|
149
|
-
// Extract error patterns
|
|
150
|
-
const errorLower = correction.error.toLowerCase();
|
|
151
|
-
if (errorLower.includes('type'))
|
|
152
|
-
errorPatterns.set('type', (errorPatterns.get('type') || 0) + 1);
|
|
153
|
-
if (errorLower.includes('syntax'))
|
|
154
|
-
errorPatterns.set('syntax', (errorPatterns.get('syntax') || 0) + 1);
|
|
155
|
-
if (errorLower.includes('undefined'))
|
|
156
|
-
errorPatterns.set('undefined', (errorPatterns.get('undefined') || 0) + 1);
|
|
157
|
-
if (errorLower.includes('import'))
|
|
158
|
-
errorPatterns.set('import', (errorPatterns.get('import') || 0) + 1);
|
|
159
|
-
// Extract correction patterns
|
|
160
|
-
const correctionLower = correction.correction.toLowerCase();
|
|
161
|
-
if (correctionLower.includes('add'))
|
|
162
|
-
correctionPatterns.set('add', (correctionPatterns.get('add') || 0) + 1);
|
|
163
|
-
if (correctionLower.includes('remove'))
|
|
164
|
-
correctionPatterns.set('remove', (correctionPatterns.get('remove') || 0) + 1);
|
|
165
|
-
if (correctionLower.includes('change'))
|
|
166
|
-
correctionPatterns.set('change', (correctionPatterns.get('change') || 0) + 1);
|
|
167
|
-
if (correctionLower.includes('fix'))
|
|
168
|
-
correctionPatterns.set('fix', (correctionPatterns.get('fix') || 0) + 1);
|
|
169
|
-
}
|
|
170
|
-
const commonErrors = Array.from(errorPatterns.entries())
|
|
171
|
-
.sort((a, b) => b[1] - a[1])
|
|
172
|
-
.slice(0, 5)
|
|
173
|
-
.map(([error]) => error);
|
|
174
|
-
const improvementSuggestions = [];
|
|
175
|
-
if (errorPatterns.get('type') && errorPatterns.get('type') > 1) {
|
|
176
|
-
improvementSuggestions.push('Pay more attention to type definitions and type safety');
|
|
177
|
-
}
|
|
178
|
-
if (errorPatterns.get('syntax') && errorPatterns.get('syntax') > 1) {
|
|
179
|
-
improvementSuggestions.push('Double-check syntax before generating code');
|
|
180
|
-
}
|
|
181
|
-
if (errorPatterns.get('import') && errorPatterns.get('import') > 1) {
|
|
182
|
-
improvementSuggestions.push('Verify all imports are correct and available');
|
|
183
|
-
}
|
|
184
|
-
return {
|
|
185
|
-
commonErrors,
|
|
186
|
-
improvementSuggestions,
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
//# sourceMappingURL=iterative-refinement.js.map
|