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,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