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,64 +0,0 @@
1
- /**
2
- * Infrastructure: Sandbox Executor
3
- * Main interface for secure code execution
4
- * Routes to appropriate sandbox implementation (Docker/WASM)
5
- */
6
- import { DockerSandbox } from './docker-sandbox.js';
7
- export class SandboxExecutor {
8
- dockerSandbox;
9
- useDocker = true; // Default to Docker
10
- constructor() {
11
- this.dockerSandbox = new DockerSandbox();
12
- this.initialize();
13
- }
14
- /**
15
- * Initialize sandbox executor
16
- * Check availability of Docker/WASM
17
- */
18
- async initialize() {
19
- const dockerAvailable = await this.dockerSandbox.isAvailable();
20
- if (!dockerAvailable) {
21
- console.warn('⚠️ Docker not available. Sandbox execution will be limited.');
22
- this.useDocker = false;
23
- }
24
- }
25
- /**
26
- * Execute code in secure sandbox
27
- */
28
- async execute(request) {
29
- if (!this.useDocker) {
30
- // Fallback: Return error if Docker not available
31
- return {
32
- success: false,
33
- output: '',
34
- error: 'Docker sandbox not available. Please install Docker to enable secure code execution.',
35
- exitCode: 1,
36
- duration: 0,
37
- };
38
- }
39
- // Route to Docker sandbox
40
- return await this.dockerSandbox.execute(request.code, request.language, request.options);
41
- }
42
- /**
43
- * Execute bash command in sandbox
44
- */
45
- async executeBash(command, options) {
46
- if (!this.useDocker) {
47
- return {
48
- success: false,
49
- output: '',
50
- error: 'Docker sandbox not available.',
51
- exitCode: 1,
52
- duration: 0,
53
- };
54
- }
55
- return await this.dockerSandbox.executeBash(command, options);
56
- }
57
- /**
58
- * Check if sandbox is available
59
- */
60
- async isAvailable() {
61
- return await this.dockerSandbox.isAvailable();
62
- }
63
- }
64
- //# sourceMappingURL=sandbox-executor.js.map
@@ -1,119 +0,0 @@
1
- /**
2
- * TOON (Token-Oriented Object Notation) Serializer
3
- *
4
- * Phase 1: Code Context Serialization for v1.0.0 MVP
5
- *
6
- * Benefits:
7
- * - 30-60% token reduction compared to JSON
8
- * - Better LLM parsing accuracy
9
- * - Self-documenting structure
10
- *
11
- * Feature Flag: CODEHERE_USE_TOON (default: false for v1.0.0)
12
- */
13
- let toonLib = null;
14
- /**
15
- * Lazy load TOON library (only if feature flag is enabled)
16
- */
17
- async function getToonLib() {
18
- if (toonLib === null) {
19
- try {
20
- // Dynamic import for ES modules - use eval to avoid TypeScript compile-time error when package isn't installed
21
- // This allows the code to compile even if @toon-format/toon is not installed
22
- const toonModulePath = '@toon-format/toon';
23
- // eslint-disable-next-line @typescript-eslint/no-implied-eval
24
- const toonModule = await import(/* @ts-ignore */ toonModulePath);
25
- toonLib = toonModule;
26
- }
27
- catch (error) {
28
- // TOON library not installed or feature disabled
29
- return null;
30
- }
31
- }
32
- return toonLib;
33
- }
34
- /**
35
- * Check if TOON is enabled via feature flag
36
- */
37
- function isToonEnabled() {
38
- return process.env.CODEHERE_USE_TOON === 'true' || process.env.CODEHERE_USE_TOON === '1';
39
- }
40
- /**
41
- * Serialize code chunks to TOON format
42
- *
43
- * TOON format for code chunks:
44
- * chunks[N]{filepath,content,score,lineStart,lineEnd}:
45
- * src/auth.ts,function authenticate() {...},0.95,10,60
46
- * src/utils.ts,export function helper() {...},0.87,5,35
47
- *
48
- * @param chunks Code chunks to serialize
49
- * @returns TOON-formatted string, or null if TOON is disabled or library unavailable
50
- */
51
- export async function serializeCodeChunksToToon(chunks) {
52
- if (!isToonEnabled() || chunks.length === 0) {
53
- return null;
54
- }
55
- const toon = await getToonLib();
56
- if (!toon) {
57
- return null;
58
- }
59
- try {
60
- // Convert code chunks to array of objects for TOON encoding
61
- const chunksData = chunks.map(chunk => ({
62
- filepath: chunk.filepath,
63
- content: chunk.content,
64
- score: chunk.score || 1.0,
65
- lineStart: chunk.lineStart || 0,
66
- lineEnd: chunk.lineEnd || 0,
67
- }));
68
- // Encode to TOON format
69
- // TOON library exports: { encode, decode } or default export
70
- const toonData = { chunks: chunksData };
71
- const encodeFn = toon.encode || toon.default?.encode || (typeof toon === 'function' ? toon : null);
72
- if (!encodeFn || typeof encodeFn !== 'function') {
73
- throw new Error('TOON encode function not found in module');
74
- }
75
- const toonString = encodeFn(toonData, { delimiter: '\t' });
76
- return toonString;
77
- }
78
- catch (error) {
79
- // If TOON encoding fails, return null to fall back to JSON
80
- console.warn('[TOON] Encoding failed, falling back to JSON:', error instanceof Error ? error.message : String(error));
81
- return null;
82
- }
83
- }
84
- /**
85
- * Serialize code chunks to traditional format (fallback)
86
- * Used when TOON is disabled or unavailable
87
- *
88
- * @param chunks Code chunks to serialize
89
- * @returns Traditional formatted string
90
- */
91
- export function serializeCodeChunksToTraditional(chunks) {
92
- return chunks
93
- .map((chunk, idx) => `[Chunk ${idx + 1} from ${chunk.filepath}]\n${chunk.content}`)
94
- .join('\n\n---\n\n');
95
- }
96
- /**
97
- * Serialize code chunks (TOON if enabled, traditional otherwise)
98
- *
99
- * @param chunks Code chunks to serialize
100
- * @returns Formatted string (TOON or traditional)
101
- */
102
- export async function serializeCodeChunks(chunks) {
103
- const toonResult = await serializeCodeChunksToToon(chunks);
104
- if (toonResult !== null) {
105
- return toonResult;
106
- }
107
- return serializeCodeChunksToTraditional(chunks);
108
- }
109
- /**
110
- * Check if TOON is available and enabled
111
- */
112
- export async function isToonAvailable() {
113
- if (!isToonEnabled()) {
114
- return false;
115
- }
116
- const lib = await getToonLib();
117
- return lib !== null;
118
- }
119
- //# sourceMappingURL=toon-serializer.js.map
@@ -1,204 +0,0 @@
1
- /**
2
- * Infrastructure: MemoryStreamService
3
- * Manages episodic memory with 3-factor scoring
4
- */
5
- import { MemoryRetriever } from '../../domain/services/memory-retriever.js';
6
- import { getEmbeddingCache } from '../cache/embedding-cache.js';
7
- export class MemoryStreamService {
8
- repository;
9
- retriever;
10
- aiService;
11
- embeddingCache = getEmbeddingCache();
12
- constructor(repository, aiService) {
13
- this.repository = repository;
14
- this.aiService = aiService;
15
- this.retriever = new MemoryRetriever(); // Pure domain service, no dependencies
16
- }
17
- /**
18
- * Store observation
19
- */
20
- async recordObservation(description, metadata, codebaseId, codebasePath) {
21
- const embedding = await this.aiService.embed(description);
22
- if (Array.isArray(embedding[0])) {
23
- throw new Error('Expected single embedding');
24
- }
25
- const memory = {
26
- type: 'observation',
27
- description,
28
- embedding: embedding,
29
- timestamp: new Date(),
30
- importance: this.calculateImportance(description),
31
- lastAccessed: new Date(),
32
- metadata: {
33
- ...metadata,
34
- ...(codebaseId && { codebaseId }),
35
- ...(codebasePath && { codebasePath }),
36
- },
37
- };
38
- await this.repository.store(memory);
39
- }
40
- /**
41
- * Store reflection
42
- */
43
- async recordReflection(description, trajectory, reward, errors, codebaseId, codebasePath) {
44
- const embedding = await this.aiService.embed(description);
45
- if (Array.isArray(embedding[0])) {
46
- throw new Error('Expected single embedding');
47
- }
48
- const memory = {
49
- type: 'reflection',
50
- description,
51
- embedding: embedding,
52
- timestamp: new Date(),
53
- importance: 8, // Reflections are high importance
54
- lastAccessed: new Date(),
55
- metadata: {
56
- trajectory,
57
- reward,
58
- errors,
59
- ...(codebaseId && { codebaseId }),
60
- ...(codebasePath && { codebasePath }),
61
- },
62
- };
63
- await this.repository.store(memory);
64
- }
65
- /**
66
- * Store plan
67
- */
68
- async recordPlan(description, plan, codebaseId, codebasePath) {
69
- const embedding = await this.aiService.embed(description);
70
- if (Array.isArray(embedding[0])) {
71
- throw new Error('Expected single embedding');
72
- }
73
- const memory = {
74
- type: 'plan',
75
- description,
76
- embedding: embedding,
77
- timestamp: new Date(),
78
- importance: 7,
79
- lastAccessed: new Date(),
80
- metadata: {
81
- plan,
82
- ...(codebaseId && { codebaseId }),
83
- ...(codebasePath && { codebasePath }),
84
- },
85
- };
86
- await this.repository.store(memory);
87
- }
88
- /**
89
- * Retrieve relevant memories with optional reranking
90
- * Uses two-stage retrieval: initial recall → rerank precision
91
- * Performance: Uses embedding cache to avoid redundant API calls
92
- */
93
- async retrieve(query, limit = 10, useRerank = true) {
94
- const allMemories = await this.repository.getAll();
95
- if (allMemories.length === 0) {
96
- return [];
97
- }
98
- // Check cache first to avoid redundant API calls
99
- let queryEmbedding = this.embeddingCache.get(query);
100
- if (!queryEmbedding) {
101
- const embedding = await this.aiService.embed(query);
102
- if (Array.isArray(embedding[0])) {
103
- throw new Error('Expected single embedding');
104
- }
105
- queryEmbedding = embedding;
106
- // Cache the embedding for future use
107
- this.embeddingCache.set(query, queryEmbedding);
108
- }
109
- // Ensure we have a valid embedding
110
- if (!queryEmbedding) {
111
- throw new Error('Failed to generate query embedding');
112
- }
113
- // Initial retrieval: Get more candidates than needed for reranking
114
- const initialLimit = useRerank ? Math.min(limit * 2, 50) : limit;
115
- const initialMemories = this.retriever.retrieve(allMemories, queryEmbedding, initialLimit);
116
- if (!useRerank || initialMemories.length === 0) {
117
- return initialMemories.slice(0, limit);
118
- }
119
- // Rerank: Use Cohere Rerank API to improve precision
120
- try {
121
- const documents = initialMemories.map(m => m.description);
122
- const rerankResults = await this.aiService.rerank(query, documents, limit);
123
- // Reorder memories based on rerank scores
124
- return rerankResults.map((result) => initialMemories[result.index]);
125
- }
126
- catch (error) {
127
- // Fallback to initial results if rerank fails
128
- console.warn('Memory rerank failed, using initial results:', error instanceof Error ? error.message : String(error));
129
- return initialMemories.slice(0, limit);
130
- }
131
- }
132
- /**
133
- * Retrieve relevant memories for a specific codebase
134
- * Filters memories by codebaseId before retrieval
135
- * Performance: Uses embedding cache to avoid redundant API calls
136
- */
137
- async retrieveByCodebase(query, codebaseId, limit = 10, useRerank = true) {
138
- // Get all memories for this codebase first
139
- const codebaseMemories = await this.repository.getAllByCodebase(codebaseId);
140
- if (codebaseMemories.length === 0) {
141
- return [];
142
- }
143
- // Check cache first to avoid redundant API calls
144
- let queryEmbedding = this.embeddingCache.get(query);
145
- if (!queryEmbedding) {
146
- const embedding = await this.aiService.embed(query);
147
- if (Array.isArray(embedding[0])) {
148
- throw new Error('Expected single embedding');
149
- }
150
- queryEmbedding = embedding;
151
- // Cache the embedding for future use
152
- this.embeddingCache.set(query, queryEmbedding);
153
- }
154
- // Ensure we have a valid embedding
155
- if (!queryEmbedding) {
156
- throw new Error('Failed to generate query embedding');
157
- }
158
- // Initial retrieval: Get more candidates than needed for reranking
159
- const initialLimit = useRerank ? Math.min(limit * 2, 50) : limit;
160
- const initialMemories = this.retriever.retrieve(codebaseMemories, queryEmbedding, initialLimit);
161
- if (!useRerank || initialMemories.length === 0) {
162
- return initialMemories.slice(0, limit);
163
- }
164
- // Rerank: Use Cohere Rerank API to improve precision
165
- try {
166
- const documents = initialMemories.map(m => m.description);
167
- const rerankResults = await this.aiService.rerank(query, documents, limit);
168
- // Reorder memories based on rerank scores
169
- return rerankResults.map((result) => initialMemories[result.index]);
170
- }
171
- catch (error) {
172
- // Fallback to initial results if rerank fails
173
- console.warn('Memory rerank failed, using initial results:', error instanceof Error ? error.message : String(error));
174
- return initialMemories.slice(0, limit);
175
- }
176
- }
177
- /**
178
- * Update memory access time
179
- */
180
- async updateAccess(memory) {
181
- memory.lastAccessed = new Date();
182
- await this.repository.update(memory);
183
- }
184
- /**
185
- * Calculate importance score (1-10)
186
- */
187
- calculateImportance(description) {
188
- const lower = description.toLowerCase();
189
- // High importance indicators
190
- if (lower.includes('error') || lower.includes('failed') || lower.includes('success')) {
191
- return 8;
192
- }
193
- if (lower.includes('test') || lower.includes('verification')) {
194
- return 7;
195
- }
196
- // Medium importance
197
- if (lower.includes('edit') || lower.includes('change') || lower.includes('modify')) {
198
- return 5;
199
- }
200
- // Default
201
- return 3;
202
- }
203
- }
204
- //# sourceMappingURL=memory-stream-service.js.map
@@ -1,96 +0,0 @@
1
- /**
2
- * Plan Repository
3
- * Persists and retrieves plans for execution across sessions
4
- *
5
- * Phase 1: v0.5.0-alpha.0
6
- */
7
- import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
8
- import { join, dirname } from 'path';
9
- import { fileURLToPath } from 'url';
10
- import { randomUUID } from 'crypto';
11
- const __filename = fileURLToPath(import.meta.url);
12
- const __dirname = dirname(__filename);
13
- function getPlansDir() {
14
- const agentDir = join(__dirname, '../../..');
15
- if (existsSync(join(agentDir, 'package.json'))) {
16
- return join(agentDir, 'data', 'plans');
17
- }
18
- return join(process.cwd(), '.codehere', 'plans');
19
- }
20
- export class FilePlanRepository {
21
- plansDir;
22
- constructor() {
23
- this.plansDir = getPlansDir();
24
- if (!existsSync(this.plansDir)) {
25
- mkdirSync(this.plansDir, { recursive: true });
26
- }
27
- }
28
- /**
29
- * Save a plan to disk
30
- */
31
- async save(plan) {
32
- const planId = plan.id || randomUUID();
33
- const planPath = join(this.plansDir, `${planId}.json`);
34
- const planToSave = {
35
- ...plan,
36
- id: planId,
37
- savedAt: new Date().toISOString(),
38
- };
39
- writeFileSync(planPath, JSON.stringify(planToSave, null, 2), 'utf-8');
40
- return planId;
41
- }
42
- /**
43
- * Get a plan by ID
44
- */
45
- async get(planId) {
46
- const planPath = join(this.plansDir, `${planId}.json`);
47
- if (!existsSync(planPath)) {
48
- return null;
49
- }
50
- try {
51
- const content = readFileSync(planPath, 'utf-8');
52
- return JSON.parse(content);
53
- }
54
- catch (error) {
55
- console.error(`Failed to read plan ${planId}:`, error);
56
- return null;
57
- }
58
- }
59
- /**
60
- * List recent plans
61
- */
62
- async list(limit = 10) {
63
- // In alpha, simple file-based listing
64
- // Can be enhanced later with proper sorting
65
- return [];
66
- }
67
- /**
68
- * Update a plan
69
- */
70
- async update(planId, updates) {
71
- const plan = await this.get(planId);
72
- if (!plan) {
73
- throw new Error(`Plan ${planId} not found`);
74
- }
75
- const updatedPlan = { ...plan, ...updates };
76
- await this.save(updatedPlan);
77
- }
78
- /**
79
- * Delete a plan
80
- */
81
- async delete(planId) {
82
- const planPath = join(this.plansDir, `${planId}.json`);
83
- if (existsSync(planPath)) {
84
- const { unlinkSync } = await import('fs');
85
- unlinkSync(planPath);
86
- }
87
- }
88
- }
89
- let instance = null;
90
- export function getPlanRepository() {
91
- if (!instance) {
92
- instance = new FilePlanRepository();
93
- }
94
- return instance;
95
- }
96
- //# sourceMappingURL=plan-repository.js.map