codehere 0.2.2 → 0.3.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -68
- package/dist/domain/entities/task.js +4 -4
- package/dist/error-handler.js +4 -9
- package/dist/index.js +253 -1219
- package/dist/infrastructure/config/product-context.js +7 -6
- package/dist/infrastructure/hooks/claude-sdk-hook.js +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/generic-cli-adapter.js +553 -0
- package/dist/infrastructure/orchestration/opencode-adapter.js +275 -0
- package/dist/infrastructure/orchestration/progress-aggregator.js +189 -0
- package/dist/infrastructure/orchestration/readiness.js +106 -0
- package/dist/infrastructure/orchestration/session-manager.js +272 -0
- package/dist/infrastructure/orchestration/session-persistence.js +109 -0
- package/dist/infrastructure/protocols/mcp-helpers.js +10 -30
- package/dist/infrastructure/protocols/mcp-server-impl.js +359 -21
- package/dist/infrastructure/protocols/ui-page.js +1827 -0
- package/dist/infrastructure/security/file-collection.js +115 -0
- package/dist/infrastructure/security/trust-scorer.js +301 -56
- package/dist/infrastructure/storage/task-repository.js +8 -7
- package/dist/monitoring.js +9 -38
- package/dist/presentation/cli/commands/help-command.js +96 -139
- package/dist/presentation/cli/commands/hook-command.js +17 -24
- package/dist/presentation/cli/commands/report-command.js +59 -72
- package/dist/presentation/cli/commands/setup-command.js +4 -4
- package/dist/presentation/cli/commands/status-command.js +321 -30
- package/dist/presentation/cli/commands/trust-command.js +84 -72
- package/dist/presentation/cli/error-display.js +17 -21
- package/dist/ui.js +11 -11
- package/package.json +24 -62
- package/dist/agents/base.js +0 -101
- package/dist/agents/orchestrator-model-driven.js +0 -141
- package/dist/agents/react-orchestrator-agent.js +0 -54
- package/dist/application/agents/execution-agent.js +0 -508
- package/dist/application/agents/multi-agent-orchestrator.js +0 -295
- package/dist/application/agents/planning-agent.js +0 -433
- package/dist/application/agents/validation-agent.js +0 -317
- package/dist/application/architectures/plan-and-act.js +0 -242
- package/dist/application/index.js +0 -12
- package/dist/application/services/agent-factory.js +0 -28
- package/dist/application/services/dependency-container.js +0 -596
- package/dist/application/services/git-context-service.js +0 -83
- package/dist/application/services/intelligent-router.js +0 -934
- package/dist/application/services/tool-executor-service.js +0 -94
- package/dist/application/use-cases/ask-question-use-case.js +0 -338
- package/dist/application/use-cases/edit-file-use-case.js +0 -830
- package/dist/application/use-cases/explain-file-use-case.js +0 -50
- package/dist/application/use-cases/index-codebase-use-case.js +0 -113
- package/dist/application/use-cases/planning-use-case.js +0 -276
- package/dist/application/use-cases/react-orchestration-use-case.js +0 -329
- package/dist/application/use-cases/reflexion-use-case.js +0 -30
- package/dist/application/workflows/deterministic-workflows.js +0 -189
- package/dist/ast-parser.js +0 -331
- package/dist/cache.js +0 -180
- package/dist/chat.js +0 -251
- package/dist/code-analysis.js +0 -327
- package/dist/context.js +0 -187
- package/dist/docs.js +0 -146
- package/dist/domain/entities/code-chunk.js +0 -6
- package/dist/domain/entities/decision.js +0 -9
- package/dist/domain/entities/edit.js +0 -6
- package/dist/domain/entities/knowledge-node.js +0 -9
- package/dist/domain/entities/knowledge-preservation.js +0 -10
- package/dist/domain/entities/memory.js +0 -6
- package/dist/domain/entities/pattern.js +0 -7
- package/dist/domain/entities/plan.js +0 -6
- package/dist/domain/entities/query.js +0 -6
- package/dist/domain/errors/embeddings-not-found-error.js +0 -13
- package/dist/domain/index.js +0 -19
- package/dist/domain/interfaces/ai-service.interface.js +0 -6
- package/dist/domain/interfaces/code-analyzer.interface.js +0 -6
- package/dist/domain/interfaces/decision-repository.interface.js +0 -9
- package/dist/domain/interfaces/embedding-repository.interface.js +0 -6
- package/dist/domain/interfaces/knowledge-graph-repository.interface.js +0 -9
- package/dist/domain/interfaces/knowledge-preservation-repository.interface.js +0 -8
- package/dist/domain/interfaces/memory-repository.interface.js +0 -6
- package/dist/domain/interfaces/pattern-repository.interface.js +0 -6
- package/dist/domain/interfaces/verification-service.interface.js +0 -6
- package/dist/domain/services/cross-team-pattern-sharing.js +0 -125
- package/dist/domain/services/decision-recorder.js +0 -223
- package/dist/domain/services/decision-retriever.js +0 -133
- package/dist/domain/services/environment-mode-manager.js +0 -22
- package/dist/domain/services/graded-memory-activation.js +0 -69
- package/dist/domain/services/knowledge-access.js +0 -132
- package/dist/domain/services/knowledge-extractor.js +0 -247
- package/dist/domain/services/knowledge-graph-builder.js +0 -268
- package/dist/domain/services/knowledge-graph-query.js +0 -187
- package/dist/domain/services/memory-retriever.js +0 -82
- package/dist/domain/services/memory-synthesizer.js +0 -91
- package/dist/domain/services/pattern-extractor.js +0 -442
- package/dist/domain/services/query-intent-classifier.js +0 -140
- package/dist/domain/services/react-loop.js +0 -186
- package/dist/domain/services/risk-tier-detector.js +0 -78
- package/dist/edit.js +0 -319
- package/dist/embed.js +0 -459
- package/dist/formatter.js +0 -168
- package/dist/git.js +0 -198
- package/dist/infrastructure/ai/cohere-ai-service.js +0 -607
- package/dist/infrastructure/ai/command-r-evaluation.js +0 -206
- package/dist/infrastructure/ai/model-config.js +0 -84
- package/dist/infrastructure/ai/provider-ai-service.js +0 -477
- package/dist/infrastructure/cache/embedding-cache.js +0 -175
- package/dist/infrastructure/cache/query-result-cache.js +0 -66
- package/dist/infrastructure/cache/response-cache.js +0 -48
- package/dist/infrastructure/cache/security-scan-cache.js +0 -47
- package/dist/infrastructure/chunking/ast-code-chunker.js +0 -19
- package/dist/infrastructure/chunking/code-aware-chunker.js +0 -397
- package/dist/infrastructure/context/context-compressor.js +0 -329
- package/dist/infrastructure/context/conversation-context.js +0 -128
- package/dist/infrastructure/context/session-manager.js +0 -94
- package/dist/infrastructure/cost/cost-tracker.js +0 -360
- package/dist/infrastructure/file-scanner/file-scanner.js +0 -106
- package/dist/infrastructure/governance/nist-ai-rmf.js +0 -292
- package/dist/infrastructure/governance/policy-as-code.js +0 -258
- package/dist/infrastructure/governance/prompt-to-code-lineage.js +0 -239
- package/dist/infrastructure/index.js +0 -7
- package/dist/infrastructure/observability/prompt-versioner.js +0 -145
- package/dist/infrastructure/protocols/a2a-metadata.js +0 -137
- package/dist/infrastructure/protocols/a2a-protocol.js +0 -314
- package/dist/infrastructure/protocols/mcp-oauth.js +0 -184
- package/dist/infrastructure/protocols/mcp-server.js +0 -333
- package/dist/infrastructure/protocols/streaming-handler.js +0 -103
- package/dist/infrastructure/providers/cohere-provider.js +0 -444
- package/dist/infrastructure/providers/fake-provider.js +0 -130
- package/dist/infrastructure/providers/local-llm-provider.js +0 -330
- package/dist/infrastructure/providers/model-config.types.js +0 -9
- package/dist/infrastructure/providers/model-provider.interface.js +0 -8
- package/dist/infrastructure/providers/openai-provider.js +0 -413
- package/dist/infrastructure/providers/openrouter-provider.js +0 -399
- package/dist/infrastructure/providers/operation-provider-resolver.js +0 -105
- package/dist/infrastructure/providers/provider-config-loader.js +0 -120
- package/dist/infrastructure/providers/provider-registry.js +0 -88
- package/dist/infrastructure/safety/pattern-detector.js +0 -133
- package/dist/infrastructure/security/ai-sast-scanner.js +0 -290
- package/dist/infrastructure/security/docker-sandbox.js +0 -178
- package/dist/infrastructure/security/enhanced-security-gate.js +0 -151
- package/dist/infrastructure/security/license-scanner.js +0 -167
- package/dist/infrastructure/security/provider-bias-detector.js +0 -164
- package/dist/infrastructure/security/sandbox-executor.js +0 -64
- package/dist/infrastructure/serialization/toon-serializer.js +0 -119
- package/dist/infrastructure/storage/memory-stream-service.js +0 -204
- package/dist/infrastructure/storage/plan-repository.js +0 -96
- package/dist/infrastructure/storage/sqlite-decision-repository.js +0 -232
- package/dist/infrastructure/storage/sqlite-embedding-repository.js +0 -311
- package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.js +0 -417
- package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.js +0 -230
- package/dist/infrastructure/storage/sqlite-memory-repository.js +0 -229
- package/dist/infrastructure/storage/sqlite-pattern-repository.js +0 -249
- package/dist/infrastructure/storage/task-helpers.js +0 -197
- package/dist/infrastructure/telemetry/telemetry-service.js +0 -167
- package/dist/infrastructure/ux/appropriate-friction.js +0 -213
- package/dist/infrastructure/ux/bi-directional-learning.js +0 -337
- package/dist/infrastructure/ux/capability-boundaries.js +0 -42
- package/dist/infrastructure/ux/comprehensive-formatter.js +0 -117
- package/dist/infrastructure/ux/contextual-feature-discovery.js +0 -10
- package/dist/infrastructure/ux/expectation-management.js +0 -327
- package/dist/infrastructure/ux/feature-discovery.js +0 -14
- package/dist/infrastructure/ux/feedback-prompt.js +0 -45
- package/dist/infrastructure/ux/hitl-validation.js +0 -297
- package/dist/infrastructure/ux/progress-indicator.js +0 -116
- package/dist/infrastructure/ux/progressive-disclosure.js +0 -236
- package/dist/infrastructure/ux/review-checkpoint.js +0 -72
- package/dist/infrastructure/ux/staged-feature-intro.js +0 -24
- package/dist/infrastructure/ux/stream-markdown.js +0 -151
- package/dist/infrastructure/ux/syntax-highlighter.js +0 -91
- package/dist/infrastructure/ux/team-standards.js +0 -196
- package/dist/infrastructure/ux/transparency.js +0 -71
- package/dist/infrastructure/validation/agent-feedback.js +0 -55
- package/dist/infrastructure/validation/agent-validation-helper.js +0 -137
- package/dist/infrastructure/validation/review-handler.js +0 -40
- package/dist/infrastructure/validation/summary-aggregator.js +0 -70
- package/dist/infrastructure/validation/summary-extractor.js +0 -45
- package/dist/infrastructure/validation/trace-summary.js +0 -52
- package/dist/infrastructure/verification/verification-service.js +0 -47
- package/dist/infrastructure/xai/attention-visualizer.js +0 -172
- package/dist/infrastructure/xai/cot-visualizer.js +0 -283
- package/dist/infrastructure/xai/decision-tree-log.js +0 -212
- package/dist/infrastructure/xai/interactive-xai.js +0 -260
- package/dist/infrastructure/xai/uncertainty-quantifier.js +0 -198
- package/dist/intelligent-retrieval.js +0 -272
- package/dist/intent/classifier.js +0 -2
- package/dist/intent/context.js +0 -2
- package/dist/iterative-refinement.js +0 -189
- package/dist/learning.js +0 -232
- package/dist/log.js +0 -31
- package/dist/migrate.js +0 -133
- package/dist/parallel-processor.js +0 -534
- package/dist/planner.js +0 -198
- package/dist/policy.js +0 -26
- package/dist/presentation/cli/commands/ask-command.js +0 -314
- package/dist/presentation/cli/commands/cost-command.js +0 -191
- package/dist/presentation/cli/commands/decision-command.js +0 -207
- package/dist/presentation/cli/commands/docs-command.js +0 -25
- package/dist/presentation/cli/commands/fix-command.js +0 -53
- package/dist/presentation/cli/commands/knowledge-command.js +0 -129
- package/dist/presentation/cli/commands/learning-dashboard-command.js +0 -183
- package/dist/presentation/cli/commands/models-command.js +0 -194
- package/dist/presentation/cli/commands/orchestrate-command.js +0 -207
- package/dist/presentation/cli/commands/plan-command.js +0 -246
- package/dist/presentation/cli/commands/product-command.js +0 -199
- package/dist/presentation/cli/commands/react-command.js +0 -181
- package/dist/presentation/cli/commands/review-command.js +0 -154
- package/dist/presentation/cli/commands/run-command.js +0 -188
- package/dist/presentation/cli/commands/smart-command.js +0 -395
- package/dist/presentation/cli/commands/suggest-command.js +0 -138
- package/dist/presentation/cli/commands/trace-command.js +0 -129
- package/dist/presentation/cli/commands/undo-command.js +0 -150
- package/dist/query-optimizer.js +0 -205
- package/dist/refactor.js +0 -116
- package/dist/review.js +0 -206
- package/dist/search.js +0 -163
- package/dist/session.js +0 -704
- package/dist/task-verification.js +0 -336
- package/dist/testgen.js +0 -166
- package/dist/token-optimizer.js +0 -277
- package/dist/tools/bash.js +0 -213
- package/dist/tools/edit.js +0 -235
- package/dist/tools/executor.js +0 -153
- package/dist/tools/git-tool.js +0 -292
- package/dist/tools/parser.js +0 -158
- package/dist/tools/registry.js +0 -302
- package/dist/tools/search.js +0 -100
- package/dist/types.js +0 -2
- package/dist/utils/check-api-status.js +0 -100
- package/dist/utils/diff-parser.js +0 -162
- package/dist/verification/backup.js +0 -259
- package/dist/verification/compiler.js +0 -264
- package/dist/verification/index.js +0 -273
- package/dist/verification/test-runner.js +0 -379
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Application Use Case: ExplainFileUseCase
|
|
3
|
-
* Explains a code file using AI
|
|
4
|
-
*/
|
|
5
|
-
import { GitContextService } from '../services/git-context-service.js';
|
|
6
|
-
export class ExplainFileUseCase {
|
|
7
|
-
aiService;
|
|
8
|
-
gitContextService;
|
|
9
|
-
constructor(aiService, cwd = process.cwd()) {
|
|
10
|
-
this.aiService = aiService;
|
|
11
|
-
this.gitContextService = new GitContextService(cwd);
|
|
12
|
-
}
|
|
13
|
-
async execute(request) {
|
|
14
|
-
const { readFileSync, existsSync } = await import('fs');
|
|
15
|
-
const { join } = await import('path');
|
|
16
|
-
const fullPath = join(process.cwd(), request.filepath);
|
|
17
|
-
if (!existsSync(fullPath)) {
|
|
18
|
-
throw new Error(`File not found: ${request.filepath}`);
|
|
19
|
-
}
|
|
20
|
-
const fileContent = readFileSync(fullPath, 'utf-8');
|
|
21
|
-
// Get Git context if requested (best practice: include recent changes for context)
|
|
22
|
-
let gitContext;
|
|
23
|
-
if (request.includeGitContext !== false) {
|
|
24
|
-
try {
|
|
25
|
-
gitContext = await this.gitContextService.getDiffSummary(request.filepath);
|
|
26
|
-
}
|
|
27
|
-
catch {
|
|
28
|
-
// Git context is optional - continue without it
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
// Create code chunk for context
|
|
32
|
-
const chunk = {
|
|
33
|
-
filepath: request.filepath,
|
|
34
|
-
content: fileContent,
|
|
35
|
-
score: 1.0,
|
|
36
|
-
};
|
|
37
|
-
// Build query with Git context if available
|
|
38
|
-
let query = `Explain this file: ${request.filepath}`;
|
|
39
|
-
if (gitContext) {
|
|
40
|
-
query += `\n\nRecent changes context:\n${gitContext}`;
|
|
41
|
-
}
|
|
42
|
-
const explanation = await this.aiService.chat(query, [chunk], []);
|
|
43
|
-
return {
|
|
44
|
-
explanation,
|
|
45
|
-
fileContent,
|
|
46
|
-
gitContext,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
//# sourceMappingURL=explain-file-use-case.js.map
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Application Use Case: IndexCodebaseUseCase
|
|
3
|
-
* Handles the "index" command - builds embeddings index
|
|
4
|
-
*/
|
|
5
|
-
import { findCodebaseRoot } from '../../domain/services/codebase-detector.js';
|
|
6
|
-
import { readFileSync, existsSync } from 'fs';
|
|
7
|
-
export class IndexCodebaseUseCase {
|
|
8
|
-
embeddingRepository;
|
|
9
|
-
fileScanner;
|
|
10
|
-
chunker;
|
|
11
|
-
aiService;
|
|
12
|
-
patternExtractor;
|
|
13
|
-
knowledgeExtractor;
|
|
14
|
-
constructor(embeddingRepository, fileScanner, chunker, aiService, patternExtractor, // Optional - for pattern extraction during indexing
|
|
15
|
-
knowledgeExtractor // Optional - for knowledge extraction during indexing (KnowledgeExtractor)
|
|
16
|
-
) {
|
|
17
|
-
this.embeddingRepository = embeddingRepository;
|
|
18
|
-
this.fileScanner = fileScanner;
|
|
19
|
-
this.chunker = chunker;
|
|
20
|
-
this.aiService = aiService;
|
|
21
|
-
this.patternExtractor = patternExtractor;
|
|
22
|
-
this.knowledgeExtractor = knowledgeExtractor;
|
|
23
|
-
}
|
|
24
|
-
async execute(request) {
|
|
25
|
-
const startTime = Date.now();
|
|
26
|
-
// 1. Scan repository for code files
|
|
27
|
-
const files = await this.fileScanner.scan(request.repoPath);
|
|
28
|
-
// 2. Process files in parallel
|
|
29
|
-
const chunks = [];
|
|
30
|
-
let indexed = 0;
|
|
31
|
-
let cached = 0;
|
|
32
|
-
// TODO: Implement parallel processing with caching
|
|
33
|
-
for (const file of files) {
|
|
34
|
-
// Check if already indexed
|
|
35
|
-
const isIndexed = await this.embeddingRepository.isIndexed(file);
|
|
36
|
-
if (isIndexed && request.options?.useCache) {
|
|
37
|
-
cached++;
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
// Read and chunk file
|
|
41
|
-
const fileChunks = await this.chunker.chunk(file);
|
|
42
|
-
// Generate embeddings
|
|
43
|
-
const contents = fileChunks.map(c => c.content);
|
|
44
|
-
const embeddings = await this.aiService.embed(contents);
|
|
45
|
-
// Create chunks with embeddings
|
|
46
|
-
const chunksWithEmbeddings = fileChunks.map((chunk, i) => ({
|
|
47
|
-
...chunk,
|
|
48
|
-
embedding: Array.isArray(embeddings[i])
|
|
49
|
-
? embeddings[i]
|
|
50
|
-
: embeddings,
|
|
51
|
-
}));
|
|
52
|
-
chunks.push(...chunksWithEmbeddings);
|
|
53
|
-
indexed++;
|
|
54
|
-
}
|
|
55
|
-
// 3. Store embeddings
|
|
56
|
-
if (chunks.length > 0) {
|
|
57
|
-
await this.embeddingRepository.store(chunks);
|
|
58
|
-
}
|
|
59
|
-
// 4. Extract patterns from indexed files (if pattern extractor available)
|
|
60
|
-
if (this.patternExtractor) {
|
|
61
|
-
try {
|
|
62
|
-
// Detect codebase context
|
|
63
|
-
const codebaseInfo = findCodebaseRoot(request.repoPath);
|
|
64
|
-
if (codebaseInfo && files.length > 0) {
|
|
65
|
-
// Extract patterns from newly indexed files (asynchronously, non-blocking)
|
|
66
|
-
// Only extract from files that were actually indexed (not cached)
|
|
67
|
-
const filesToExtract = files.slice(0, indexed); // Limit to newly indexed files
|
|
68
|
-
// Extract patterns in parallel (non-blocking)
|
|
69
|
-
Promise.all(filesToExtract.slice(0, 10).map(async (filepath) => {
|
|
70
|
-
try {
|
|
71
|
-
if (existsSync(filepath)) {
|
|
72
|
-
const content = readFileSync(filepath, 'utf-8');
|
|
73
|
-
// Extract patterns
|
|
74
|
-
if (this.patternExtractor) {
|
|
75
|
-
await this.patternExtractor.extractFromCode({
|
|
76
|
-
content,
|
|
77
|
-
filepath,
|
|
78
|
-
codebaseId: codebaseInfo.codebaseId,
|
|
79
|
-
codebasePath: codebaseInfo.rootPath,
|
|
80
|
-
source: 'code',
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
// Extract knowledge (from comments, structure)
|
|
84
|
-
if (this.knowledgeExtractor) {
|
|
85
|
-
await this.knowledgeExtractor.extractFromFile(filepath, codebaseInfo.codebaseId, codebaseInfo.rootPath);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
// Non-critical - extraction shouldn't fail indexing
|
|
91
|
-
console.warn(`Pattern/knowledge extraction failed for ${filepath} (non-critical):`, error);
|
|
92
|
-
}
|
|
93
|
-
})).catch(error => {
|
|
94
|
-
// Log but don't fail
|
|
95
|
-
console.warn('Pattern/knowledge extraction during indexing completed with some errors (non-critical):', error);
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
// Non-critical - pattern extraction shouldn't fail indexing
|
|
101
|
-
console.warn('Pattern extraction during indexing failed (non-critical):', error);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
const timeMs = Date.now() - startTime;
|
|
105
|
-
return {
|
|
106
|
-
indexed,
|
|
107
|
-
cached,
|
|
108
|
-
totalChunks: chunks.length,
|
|
109
|
-
timeMs,
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
//# sourceMappingURL=index-codebase-use-case.js.map
|
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Planning Use Case
|
|
3
|
-
* Synthesizes memories into hierarchical plans
|
|
4
|
-
* Memory-based hierarchical planning
|
|
5
|
-
*/
|
|
6
|
-
import { MemorySynthesizer } from '../../domain/services/memory-synthesizer.js';
|
|
7
|
-
import { findCodebaseRoot } from '../../domain/services/codebase-detector.js';
|
|
8
|
-
import { getPlanRepository } from '../../infrastructure/storage/plan-repository.js';
|
|
9
|
-
import { randomUUID } from 'crypto';
|
|
10
|
-
export class PlanningUseCase {
|
|
11
|
-
aiService;
|
|
12
|
-
patternExtractor;
|
|
13
|
-
memoryStream;
|
|
14
|
-
memorySynthesizer;
|
|
15
|
-
memoryRepository;
|
|
16
|
-
constructor(aiService, memoryStream, memoryRepository, patternExtractor) {
|
|
17
|
-
this.aiService = aiService;
|
|
18
|
-
this.patternExtractor = patternExtractor;
|
|
19
|
-
this.memoryStream = memoryStream;
|
|
20
|
-
this.memorySynthesizer = new MemorySynthesizer(patternExtractor);
|
|
21
|
-
this.memoryRepository = memoryRepository;
|
|
22
|
-
}
|
|
23
|
-
async execute(request) {
|
|
24
|
-
const startTime = Date.now();
|
|
25
|
-
// 1. Detect codebase context (for codebase-aware operations)
|
|
26
|
-
const currentDirectory = request.context?.currentDirectory || process.cwd();
|
|
27
|
-
const codebaseInfo = findCodebaseRoot(currentDirectory);
|
|
28
|
-
const codebaseId = codebaseInfo?.codebaseId;
|
|
29
|
-
const codebasePath = codebaseInfo?.rootPath;
|
|
30
|
-
// 2. Retrieve relevant memories (3-factor scoring: Recency × Importance × Relevance)
|
|
31
|
-
// Use codebase-aware retrieval if codebase detected
|
|
32
|
-
let recentMemories;
|
|
33
|
-
let relevantMemories;
|
|
34
|
-
if (codebaseId) {
|
|
35
|
-
recentMemories = await this.memoryRepository.findRecentByCodebase(codebaseId, 100);
|
|
36
|
-
relevantMemories = await this.memoryStream.retrieveByCodebase(request.goal, codebaseId, 50);
|
|
37
|
-
}
|
|
38
|
-
else {
|
|
39
|
-
// Fallback to global memory retrieval (backward compatibility)
|
|
40
|
-
recentMemories = await this.memoryRepository.findRecent(100);
|
|
41
|
-
relevantMemories = await this.memoryStream.retrieve(request.goal, 50);
|
|
42
|
-
}
|
|
43
|
-
// 2. Synthesize memories into reflections (with streaming progress)
|
|
44
|
-
if (request.streamHandler?.onProgress) {
|
|
45
|
-
request.streamHandler.onProgress('synthesizing', 'Analyzing memories and extracting insights...');
|
|
46
|
-
}
|
|
47
|
-
const reflections = await this.synthesizeMemories(recentMemories, request.goal);
|
|
48
|
-
// 3. Generate salient questions from memories
|
|
49
|
-
if (request.streamHandler?.onProgress) {
|
|
50
|
-
request.streamHandler.onProgress('questioning', 'Generating clarifying questions...');
|
|
51
|
-
}
|
|
52
|
-
const questions = await this.generateSalientQuestions(recentMemories);
|
|
53
|
-
// 4. Use reflections and memories to create hierarchical plan (with streaming)
|
|
54
|
-
if (request.streamHandler?.onProgress) {
|
|
55
|
-
request.streamHandler.onProgress('planning', 'Creating hierarchical plan...');
|
|
56
|
-
}
|
|
57
|
-
const plan = await this.createHierarchicalPlan(request, reflections, relevantMemories);
|
|
58
|
-
if (request.streamHandler?.onProgress) {
|
|
59
|
-
request.streamHandler.onProgress('finalizing', `Plan created with ${plan.subPlans.length} sub-plans`);
|
|
60
|
-
}
|
|
61
|
-
if (request.streamHandler?.onComplete) {
|
|
62
|
-
request.streamHandler.onComplete(plan);
|
|
63
|
-
}
|
|
64
|
-
const synthesisTime = Date.now() - startTime;
|
|
65
|
-
// 5. Extract patterns from memory reflections (if pattern extractor available)
|
|
66
|
-
if (this.patternExtractor && codebaseId && codebasePath && relevantMemories.length > 0) {
|
|
67
|
-
try {
|
|
68
|
-
// Extract patterns from memory reflections for pattern learning
|
|
69
|
-
await this.patternExtractor.extractFromMemory(relevantMemories, codebaseId, codebasePath);
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
// Non-critical - pattern extraction shouldn't fail planning
|
|
73
|
-
console.warn('Pattern extraction during planning failed (non-critical):', error);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// 6. Store plan in memory stream (with codebase context)
|
|
77
|
-
await this.memoryStream.recordObservation(`Plan created: ${request.goal}`, {
|
|
78
|
-
plan: plan.id,
|
|
79
|
-
goal: request.goal,
|
|
80
|
-
subPlans: plan.subPlans.length,
|
|
81
|
-
}, codebaseId, codebasePath);
|
|
82
|
-
// 7. Persist plan to repository for later execution
|
|
83
|
-
const planRepository = getPlanRepository();
|
|
84
|
-
const planId = await planRepository.save({
|
|
85
|
-
...plan,
|
|
86
|
-
id: plan.id || randomUUID(),
|
|
87
|
-
status: 'draft',
|
|
88
|
-
});
|
|
89
|
-
return {
|
|
90
|
-
plan: { ...plan, id: planId },
|
|
91
|
-
reflections,
|
|
92
|
-
memoriesUsed: relevantMemories.length,
|
|
93
|
-
synthesisTime,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
async synthesizeMemories(memories, goal) {
|
|
97
|
-
// Query LLM with recent memories to identify salient questions
|
|
98
|
-
const memoryContext = memories
|
|
99
|
-
.slice(0, 100)
|
|
100
|
-
.map((m, i) => `${i + 1}. ${m.description} (${m.timestamp})`)
|
|
101
|
-
.join('\n');
|
|
102
|
-
const prompt = `Given these recent memories from an AI coding agent, identify 5-10 salient, high-level questions that can be answered from these experiences.
|
|
103
|
-
|
|
104
|
-
Memories:
|
|
105
|
-
${memoryContext}
|
|
106
|
-
|
|
107
|
-
Goal: ${goal}
|
|
108
|
-
|
|
109
|
-
Generate questions that help understand patterns, successful strategies, common failures, and important insights. Format as a JSON array of strings.`;
|
|
110
|
-
const response = await this.aiService.chat(prompt, []);
|
|
111
|
-
try {
|
|
112
|
-
const jsonMatch = response.match(/\[[\s\S]*\]/);
|
|
113
|
-
if (jsonMatch) {
|
|
114
|
-
const questions = JSON.parse(jsonMatch[0]);
|
|
115
|
-
// For each question, retrieve relevant memories and extract insights
|
|
116
|
-
const reflections = [];
|
|
117
|
-
for (const question of questions) {
|
|
118
|
-
const relevant = await this.memoryStream.retrieve(question, 10);
|
|
119
|
-
const insight = await this.extractInsight(question, relevant);
|
|
120
|
-
reflections.push({
|
|
121
|
-
question,
|
|
122
|
-
insight,
|
|
123
|
-
evidence: relevant.map(m => m.id || ''),
|
|
124
|
-
timestamp: new Date(),
|
|
125
|
-
level: 1, // Higher-level reflection
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
return reflections;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
catch (e) {
|
|
132
|
-
// Fallback
|
|
133
|
-
}
|
|
134
|
-
return [];
|
|
135
|
-
}
|
|
136
|
-
async generateSalientQuestions(memories) {
|
|
137
|
-
// Already done in synthesizeMemories, but can be extracted separately
|
|
138
|
-
return [];
|
|
139
|
-
}
|
|
140
|
-
async extractInsight(question, memories) {
|
|
141
|
-
const memoryContext = memories
|
|
142
|
-
.map((m, i) => `${i + 1}. ${m.description}`)
|
|
143
|
-
.join('\n');
|
|
144
|
-
const prompt = `Based on these memories, answer this question and cite specific evidence:
|
|
145
|
-
|
|
146
|
-
Question: ${question}
|
|
147
|
-
|
|
148
|
-
Memories:
|
|
149
|
-
${memoryContext}
|
|
150
|
-
|
|
151
|
-
Provide a concise insight (2-3 sentences) that answers the question, citing which memory numbers support your answer.`;
|
|
152
|
-
const response = await this.aiService.chat(prompt, []);
|
|
153
|
-
return response;
|
|
154
|
-
}
|
|
155
|
-
async createHierarchicalPlan(request, reflections, memories) {
|
|
156
|
-
// Use AI to decompose goal into hierarchical sub-plans
|
|
157
|
-
const reflectionContext = reflections
|
|
158
|
-
.map((r, i) => `${i + 1}. ${r.question}: ${r.insight}`)
|
|
159
|
-
.join('\n');
|
|
160
|
-
const memoryContext = memories
|
|
161
|
-
.slice(0, 20)
|
|
162
|
-
.map((m, i) => `${i + 1}. ${m.description}`)
|
|
163
|
-
.join('\n');
|
|
164
|
-
const planningMode = request.planningMode || 'hybrid';
|
|
165
|
-
const prompt = `Create a hierarchical plan to achieve this goal, using insights from past experiences.
|
|
166
|
-
|
|
167
|
-
Goal: ${request.goal}
|
|
168
|
-
Planning Mode: ${planningMode}
|
|
169
|
-
Context: ${JSON.stringify(request.context || {})}
|
|
170
|
-
|
|
171
|
-
Past Insights (Reflections):
|
|
172
|
-
${reflectionContext}
|
|
173
|
-
|
|
174
|
-
Relevant Past Experiences:
|
|
175
|
-
${memoryContext}
|
|
176
|
-
|
|
177
|
-
Generate a hierarchical plan with:
|
|
178
|
-
1. Main goal broken into sub-plans
|
|
179
|
-
2. Each sub-plan has: type (search/edit/refactor/review/analyze/implement/test), description, dependencies
|
|
180
|
-
3. Dependencies between sub-plans (sequential/parallel/conditional)
|
|
181
|
-
4. Estimated steps for each sub-plan
|
|
182
|
-
|
|
183
|
-
Use Plan-then-Execute decomposition: generate the entire sequence upfront, but allow for iterative refinement.
|
|
184
|
-
|
|
185
|
-
Respond with valid JSON in this format:
|
|
186
|
-
{
|
|
187
|
-
"goal": "...",
|
|
188
|
-
"description": "...",
|
|
189
|
-
"subPlans": [
|
|
190
|
-
{
|
|
191
|
-
"id": "subplan_1",
|
|
192
|
-
"description": "...",
|
|
193
|
-
"type": "search|edit|refactor|review|analyze|implement|test",
|
|
194
|
-
"dependencies": [],
|
|
195
|
-
"estimatedSteps": 3
|
|
196
|
-
}
|
|
197
|
-
],
|
|
198
|
-
"dependencies": [
|
|
199
|
-
{
|
|
200
|
-
"from": "subplan_1",
|
|
201
|
-
"to": "subplan_2",
|
|
202
|
-
"type": "sequential|parallel|conditional",
|
|
203
|
-
"condition": "optional"
|
|
204
|
-
}
|
|
205
|
-
],
|
|
206
|
-
"complexity": "simple|medium|complex",
|
|
207
|
-
"estimatedDuration": 30
|
|
208
|
-
}`;
|
|
209
|
-
const response = await this.aiService.chat(prompt, []);
|
|
210
|
-
try {
|
|
211
|
-
const jsonMatch = response.match(/\{[\s\S]*\}/);
|
|
212
|
-
if (jsonMatch) {
|
|
213
|
-
const planData = JSON.parse(jsonMatch[0]);
|
|
214
|
-
const plan = {
|
|
215
|
-
goal: planData.goal || request.goal,
|
|
216
|
-
description: planData.description || '',
|
|
217
|
-
status: 'draft',
|
|
218
|
-
createdAt: new Date(),
|
|
219
|
-
updatedAt: new Date(),
|
|
220
|
-
subPlans: (planData.subPlans || []).map((sp, i) => ({
|
|
221
|
-
id: sp.id || `subplan_${i + 1}`,
|
|
222
|
-
description: sp.description,
|
|
223
|
-
type: sp.type || 'analyze',
|
|
224
|
-
status: 'pending',
|
|
225
|
-
dependencies: sp.dependencies || [],
|
|
226
|
-
estimatedSteps: sp.estimatedSteps || 1,
|
|
227
|
-
reflections: reflections.map(r => r.question), // Link reflections
|
|
228
|
-
})),
|
|
229
|
-
dependencies: (planData.dependencies || []).map((dep) => ({
|
|
230
|
-
from: dep.from,
|
|
231
|
-
to: dep.to,
|
|
232
|
-
type: dep.type || 'sequential',
|
|
233
|
-
condition: dep.condition,
|
|
234
|
-
})),
|
|
235
|
-
metadata: {
|
|
236
|
-
memoriesUsed: memories.map(m => m.id || ''),
|
|
237
|
-
reflections: reflections.map(r => r.question),
|
|
238
|
-
complexity: planData.complexity || 'medium',
|
|
239
|
-
estimatedDuration: planData.estimatedDuration,
|
|
240
|
-
priority: 5,
|
|
241
|
-
},
|
|
242
|
-
};
|
|
243
|
-
return plan;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
catch (e) {
|
|
247
|
-
// Fallback to basic plan
|
|
248
|
-
}
|
|
249
|
-
// Fallback: Create basic plan
|
|
250
|
-
return {
|
|
251
|
-
goal: request.goal,
|
|
252
|
-
description: `Plan to achieve: ${request.goal}`,
|
|
253
|
-
status: 'draft',
|
|
254
|
-
createdAt: new Date(),
|
|
255
|
-
updatedAt: new Date(),
|
|
256
|
-
subPlans: [
|
|
257
|
-
{
|
|
258
|
-
id: 'subplan_1',
|
|
259
|
-
description: `Analyze and plan: ${request.goal}`,
|
|
260
|
-
type: 'analyze',
|
|
261
|
-
status: 'pending',
|
|
262
|
-
dependencies: [],
|
|
263
|
-
estimatedSteps: 1,
|
|
264
|
-
},
|
|
265
|
-
],
|
|
266
|
-
dependencies: [],
|
|
267
|
-
metadata: {
|
|
268
|
-
memoriesUsed: [],
|
|
269
|
-
reflections: [],
|
|
270
|
-
complexity: 'medium',
|
|
271
|
-
priority: 5,
|
|
272
|
-
},
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
//# sourceMappingURL=planning-use-case.js.map
|