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,229 +0,0 @@
1
- /**
2
- * Infrastructure: SQLiteMemoryRepository
3
- * Implements IMemoryRepository using SQLite
4
- */
5
- import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
6
- import { join, dirname } from 'path';
7
- import { fileURLToPath } from 'url';
8
- import initSqlJs from 'sql.js';
9
- import { randomUUID } from 'crypto';
10
- function getDbPath() {
11
- const __filename = fileURLToPath(import.meta.url);
12
- const __dirname = dirname(__filename);
13
- const agentDir = join(__dirname, '../../..');
14
- if (existsSync(join(agentDir, 'package.json'))) {
15
- return join(agentDir, 'data', 'memory_stream.sqlite');
16
- }
17
- return join(process.cwd(), 'agent', 'data', 'memory_stream.sqlite');
18
- }
19
- export class SQLiteMemoryRepository {
20
- dbPath;
21
- db = null;
22
- constructor() {
23
- this.dbPath = getDbPath();
24
- }
25
- async getDb() {
26
- if (this.db)
27
- return this.db;
28
- const SQL = await initSqlJs();
29
- const dbDir = dirname(this.dbPath);
30
- if (!existsSync(dbDir)) {
31
- mkdirSync(dbDir, { recursive: true });
32
- }
33
- if (existsSync(this.dbPath)) {
34
- const buffer = readFileSync(this.dbPath);
35
- this.db = new SQL.Database(buffer);
36
- }
37
- else {
38
- this.db = new SQL.Database();
39
- }
40
- this.db.run(`
41
- CREATE TABLE IF NOT EXISTS memory_stream (
42
- id TEXT PRIMARY KEY,
43
- type TEXT NOT NULL,
44
- description TEXT NOT NULL,
45
- embedding TEXT NOT NULL,
46
- timestamp INTEGER NOT NULL,
47
- importance INTEGER NOT NULL,
48
- lastAccessed INTEGER NOT NULL,
49
- metadata TEXT
50
- )
51
- `);
52
- this.db.run(`
53
- CREATE INDEX IF NOT EXISTS idx_timestamp ON memory_stream(timestamp)
54
- `);
55
- this.db.run(`
56
- CREATE INDEX IF NOT EXISTS idx_type ON memory_stream(type)
57
- `);
58
- // Add index on metadata for codebase filtering (metadata stored as JSON)
59
- // We'll query using JSON functions if supported, or parse in memory
60
- // For now, we can filter in memory after retrieval
61
- return this.db;
62
- }
63
- async store(memory) {
64
- const db = await this.getDb();
65
- const id = memory.id || randomUUID();
66
- const stmt = db.prepare(`
67
- INSERT OR REPLACE INTO memory_stream
68
- (id, type, description, embedding, timestamp, importance, lastAccessed, metadata)
69
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
70
- `);
71
- stmt.run([
72
- id,
73
- memory.type,
74
- memory.description,
75
- JSON.stringify(memory.embedding),
76
- memory.timestamp.getTime(),
77
- memory.importance,
78
- memory.lastAccessed.getTime(),
79
- JSON.stringify(memory.metadata || {}),
80
- ]);
81
- stmt.free();
82
- this.saveDb();
83
- }
84
- async retrieve(query, limit) {
85
- // This will be enhanced with embedding-based search
86
- // For now, return recent memories
87
- const db = await this.getDb();
88
- const stmt = db.prepare(`
89
- SELECT * FROM memory_stream
90
- ORDER BY timestamp DESC
91
- LIMIT ?
92
- `);
93
- stmt.bind([limit]);
94
- const memories = [];
95
- while (stmt.step()) {
96
- const row = stmt.getAsObject();
97
- memories.push({
98
- id: row.id,
99
- type: row.type,
100
- description: row.description,
101
- embedding: JSON.parse(row.embedding),
102
- timestamp: new Date(row.timestamp),
103
- importance: row.importance,
104
- lastAccessed: new Date(row.lastAccessed),
105
- metadata: JSON.parse(row.metadata || '{}'),
106
- });
107
- }
108
- stmt.free();
109
- return memories;
110
- }
111
- async getById(id) {
112
- const db = await this.getDb();
113
- const stmt = db.prepare('SELECT * FROM memory_stream WHERE id = ?');
114
- stmt.bind([id]);
115
- if (!stmt.step()) {
116
- stmt.free();
117
- return null;
118
- }
119
- const row = stmt.getAsObject();
120
- stmt.free();
121
- return {
122
- id: row.id,
123
- type: row.type,
124
- description: row.description,
125
- embedding: JSON.parse(row.embedding),
126
- timestamp: new Date(row.timestamp),
127
- importance: row.importance,
128
- lastAccessed: new Date(row.lastAccessed),
129
- metadata: JSON.parse(row.metadata || '{}'),
130
- };
131
- }
132
- async update(memory) {
133
- await this.store(memory);
134
- }
135
- async clear() {
136
- const db = await this.getDb();
137
- db.run('DELETE FROM memory_stream');
138
- this.saveDb();
139
- }
140
- /**
141
- * Find recent memories (ordered by timestamp DESC)
142
- */
143
- async findRecent(limit = 100) {
144
- const db = await this.getDb();
145
- const stmt = db.prepare(`
146
- SELECT * FROM memory_stream
147
- ORDER BY timestamp DESC
148
- LIMIT ?
149
- `);
150
- stmt.bind([limit]);
151
- const memories = [];
152
- while (stmt.step()) {
153
- const row = stmt.getAsObject();
154
- memories.push({
155
- id: row.id,
156
- type: row.type,
157
- description: row.description,
158
- embedding: JSON.parse(row.embedding),
159
- timestamp: new Date(row.timestamp),
160
- importance: row.importance,
161
- lastAccessed: new Date(row.lastAccessed),
162
- metadata: JSON.parse(row.metadata || '{}'),
163
- });
164
- }
165
- stmt.free();
166
- return memories;
167
- }
168
- /**
169
- * Retrieve all memories (for MemoryRetriever to score)
170
- */
171
- async getAll() {
172
- const db = await this.getDb();
173
- const stmt = db.prepare('SELECT * FROM memory_stream');
174
- const memories = [];
175
- while (stmt.step()) {
176
- const row = stmt.getAsObject();
177
- memories.push({
178
- id: row.id,
179
- type: row.type,
180
- description: row.description,
181
- embedding: JSON.parse(row.embedding),
182
- timestamp: new Date(row.timestamp),
183
- importance: row.importance,
184
- lastAccessed: new Date(row.lastAccessed),
185
- metadata: JSON.parse(row.metadata || '{}'),
186
- });
187
- }
188
- stmt.free();
189
- return memories;
190
- }
191
- /**
192
- * Find recent memories for a specific codebase
193
- */
194
- async findRecentByCodebase(codebaseId, limit) {
195
- const allRecent = await this.findRecent(limit * 2); // Get more to filter
196
- const filtered = allRecent.filter((memory) => {
197
- return memory.metadata?.codebaseId === codebaseId;
198
- });
199
- return filtered.slice(0, limit);
200
- }
201
- /**
202
- * Retrieve memories filtered by codebase
203
- * Note: This filters after retrieval since we store codebaseId in metadata
204
- */
205
- async retrieveByCodebase(query, codebaseId, limit) {
206
- const allMemories = await this.retrieve(query, limit * 2); // Get more to filter
207
- const filtered = allMemories.filter((memory) => {
208
- return memory.metadata?.codebaseId === codebaseId;
209
- });
210
- return filtered.slice(0, limit);
211
- }
212
- /**
213
- * Get all memories for a specific codebase
214
- */
215
- async getAllByCodebase(codebaseId) {
216
- const allMemories = await this.getAll();
217
- return allMemories.filter((memory) => {
218
- return memory.metadata?.codebaseId === codebaseId;
219
- });
220
- }
221
- saveDb() {
222
- if (!this.db)
223
- return;
224
- const data = this.db.export();
225
- const buffer = Buffer.from(data);
226
- writeFileSync(this.dbPath, buffer);
227
- }
228
- }
229
- //# sourceMappingURL=sqlite-memory-repository.js.map
@@ -1,249 +0,0 @@
1
- /**
2
- * Infrastructure: SQLitePatternRepository
3
- * Implements IPatternRepository using SQLite
4
- */
5
- import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
6
- import { join, dirname } from 'path';
7
- import { fileURLToPath } from 'url';
8
- import initSqlJs from 'sql.js';
9
- import { randomUUID } from 'crypto';
10
- function getDbPath() {
11
- const __filename = fileURLToPath(import.meta.url);
12
- const __dirname = dirname(__filename);
13
- const agentDir = join(__dirname, '../../..');
14
- if (existsSync(join(agentDir, 'package.json'))) {
15
- return join(agentDir, 'data', 'patterns.sqlite');
16
- }
17
- return join(process.cwd(), 'agent', 'data', 'patterns.sqlite');
18
- }
19
- export class SQLitePatternRepository {
20
- dbPath;
21
- db = null;
22
- constructor() {
23
- this.dbPath = getDbPath();
24
- }
25
- async getDb() {
26
- if (this.db)
27
- return this.db;
28
- const SQL = await initSqlJs();
29
- const dbDir = dirname(this.dbPath);
30
- if (!existsSync(dbDir)) {
31
- mkdirSync(dbDir, { recursive: true });
32
- }
33
- if (existsSync(this.dbPath)) {
34
- const buffer = readFileSync(this.dbPath);
35
- this.db = new SQL.Database(buffer);
36
- }
37
- else {
38
- this.db = new SQL.Database();
39
- }
40
- // Create patterns table
41
- this.db.run(`
42
- CREATE TABLE IF NOT EXISTS patterns (
43
- id TEXT PRIMARY KEY,
44
- codebaseId TEXT NOT NULL,
45
- type TEXT NOT NULL,
46
- name TEXT NOT NULL,
47
- description TEXT NOT NULL,
48
- codeExample TEXT,
49
- filepath TEXT,
50
- lineStart INTEGER,
51
- lineEnd INTEGER,
52
- metadata TEXT,
53
- createdAt INTEGER NOT NULL,
54
- lastUsed INTEGER,
55
- usageCount INTEGER NOT NULL DEFAULT 0
56
- )
57
- `);
58
- // Create indexes for efficient queries
59
- this.db.run(`
60
- CREATE INDEX IF NOT EXISTS idx_codebase ON patterns(codebaseId)
61
- `);
62
- this.db.run(`
63
- CREATE INDEX IF NOT EXISTS idx_type ON patterns(codebaseId, type)
64
- `);
65
- this.db.run(`
66
- CREATE INDEX IF NOT EXISTS idx_usage ON patterns(codebaseId, usageCount DESC)
67
- `);
68
- this.db.run(`
69
- CREATE INDEX IF NOT EXISTS idx_created ON patterns(codebaseId, createdAt DESC)
70
- `);
71
- return this.db;
72
- }
73
- async store(pattern) {
74
- const db = await this.getDb();
75
- // Ensure pattern has an ID
76
- if (!pattern.id) {
77
- pattern.id = randomUUID();
78
- }
79
- const stmt = db.prepare(`
80
- INSERT OR REPLACE INTO patterns
81
- (id, codebaseId, type, name, description, codeExample, filepath,
82
- lineStart, lineEnd, metadata, createdAt, lastUsed, usageCount)
83
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
84
- `);
85
- // Ensure all values are properly typed (no undefined)
86
- stmt.run([
87
- pattern.id,
88
- pattern.codebaseId,
89
- pattern.type,
90
- pattern.name,
91
- pattern.description,
92
- pattern.codeExample ?? null,
93
- pattern.filepath ?? null,
94
- pattern.lineNumbers?.start ?? null,
95
- pattern.lineNumbers?.end ?? null,
96
- JSON.stringify(pattern.metadata || {}),
97
- pattern.createdAt.getTime(),
98
- pattern.lastUsed ? pattern.lastUsed.getTime() : null,
99
- pattern.usageCount ?? 0,
100
- ]);
101
- stmt.free();
102
- this.saveDb();
103
- }
104
- async getById(id) {
105
- const db = await this.getDb();
106
- const stmt = db.prepare('SELECT * FROM patterns WHERE id = ?');
107
- stmt.bind([id]);
108
- if (!stmt.step()) {
109
- stmt.free();
110
- return null;
111
- }
112
- const row = stmt.getAsObject();
113
- stmt.free();
114
- return this.rowToPattern(row);
115
- }
116
- async findByCodebase(codebaseId) {
117
- const db = await this.getDb();
118
- const stmt = db.prepare(`
119
- SELECT * FROM patterns
120
- WHERE codebaseId = ?
121
- ORDER BY createdAt DESC
122
- `);
123
- stmt.bind([codebaseId]);
124
- const patterns = [];
125
- while (stmt.step()) {
126
- const row = stmt.getAsObject();
127
- patterns.push(this.rowToPattern(row));
128
- }
129
- stmt.free();
130
- return patterns;
131
- }
132
- async findByType(codebaseId, type) {
133
- const db = await this.getDb();
134
- const stmt = db.prepare(`
135
- SELECT * FROM patterns
136
- WHERE codebaseId = ? AND type = ?
137
- ORDER BY createdAt DESC
138
- `);
139
- stmt.bind([codebaseId, type]);
140
- const patterns = [];
141
- while (stmt.step()) {
142
- const row = stmt.getAsObject();
143
- patterns.push(this.rowToPattern(row));
144
- }
145
- stmt.free();
146
- return patterns;
147
- }
148
- async search(codebaseId, query, limit = 10) {
149
- const db = await this.getDb();
150
- const searchTerm = `%${query.toLowerCase()}%`;
151
- const stmt = db.prepare(`
152
- SELECT * FROM patterns
153
- WHERE codebaseId = ?
154
- AND (LOWER(name) LIKE ? OR LOWER(description) LIKE ?)
155
- ORDER BY usageCount DESC, createdAt DESC
156
- LIMIT ?
157
- `);
158
- stmt.bind([codebaseId, searchTerm, searchTerm, limit]);
159
- const patterns = [];
160
- while (stmt.step()) {
161
- const row = stmt.getAsObject();
162
- patterns.push(this.rowToPattern(row));
163
- }
164
- stmt.free();
165
- return patterns;
166
- }
167
- async update(pattern) {
168
- await this.store(pattern);
169
- }
170
- async delete(id) {
171
- const db = await this.getDb();
172
- const stmt = db.prepare('DELETE FROM patterns WHERE id = ?');
173
- stmt.bind([id]);
174
- stmt.step();
175
- stmt.free();
176
- this.saveDb();
177
- }
178
- async getMostUsed(codebaseId, limit = 10) {
179
- const db = await this.getDb();
180
- const stmt = db.prepare(`
181
- SELECT * FROM patterns
182
- WHERE codebaseId = ?
183
- ORDER BY usageCount DESC, createdAt DESC
184
- LIMIT ?
185
- `);
186
- stmt.bind([codebaseId, limit]);
187
- const patterns = [];
188
- while (stmt.step()) {
189
- const row = stmt.getAsObject();
190
- patterns.push(this.rowToPattern(row));
191
- }
192
- stmt.free();
193
- return patterns;
194
- }
195
- async getRecent(codebaseId, limit = 10) {
196
- const db = await this.getDb();
197
- const stmt = db.prepare(`
198
- SELECT * FROM patterns
199
- WHERE codebaseId = ?
200
- ORDER BY createdAt DESC
201
- LIMIT ?
202
- `);
203
- stmt.bind([codebaseId, limit]);
204
- const patterns = [];
205
- while (stmt.step()) {
206
- const row = stmt.getAsObject();
207
- patterns.push(this.rowToPattern(row));
208
- }
209
- stmt.free();
210
- return patterns;
211
- }
212
- async getByTags(codebaseId, tags) {
213
- // SQLite doesn't have great JSON support, so we'll filter in memory
214
- // For production, consider storing tags in a separate table
215
- const allPatterns = await this.findByCodebase(codebaseId);
216
- return allPatterns.filter(pattern => {
217
- const patternTags = pattern.metadata?.tags || [];
218
- return tags.some(tag => patternTags.includes(tag));
219
- });
220
- }
221
- rowToPattern(row) {
222
- const metadata = JSON.parse(row.metadata || '{}');
223
- return {
224
- id: row.id,
225
- codebaseId: row.codebaseId,
226
- type: row.type,
227
- name: row.name,
228
- description: row.description,
229
- codeExample: row.codeExample || undefined,
230
- filepath: row.filepath || undefined,
231
- lineNumbers: row.lineStart && row.lineEnd ? {
232
- start: row.lineStart,
233
- end: row.lineEnd,
234
- } : undefined,
235
- metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
236
- createdAt: new Date(row.createdAt),
237
- lastUsed: row.lastUsed ? new Date(row.lastUsed) : undefined,
238
- usageCount: row.usageCount || 0,
239
- };
240
- }
241
- saveDb() {
242
- if (!this.db)
243
- return;
244
- const data = this.db.export();
245
- const buffer = Buffer.from(data);
246
- writeFileSync(this.dbPath, buffer);
247
- }
248
- }
249
- //# sourceMappingURL=sqlite-pattern-repository.js.map
@@ -1,197 +0,0 @@
1
- /**
2
- * Infrastructure: Task Helpers
3
- * Helper functions for creating and updating tasks (non-breaking)
4
- *
5
- * Phase 1: v0.5.0-alpha
6
- * See: .internal/ARCHITECTURE.md (internal docs)
7
- */
8
- import { getTaskRepository } from './task-repository.js';
9
- import { TaskMode, TaskStatus, RiskTier, ReviewStatus } from '../../domain/entities/task.js';
10
- import { getCurrentEnvironmentMode } from '../../domain/services/environment-mode-manager.js';
11
- import { detectRiskTier, detectRiskTierFromPlan } from '../../domain/services/risk-tier-detector.js';
12
- import { randomUUID } from 'crypto';
13
- /**
14
- * Create task for plan command
15
- * Non-breaking: silent failure, doesn't affect user workflow
16
- */
17
- export async function createPlanTask(options) {
18
- const { goal, plan, codebaseInfo, runId } = options;
19
- try {
20
- const taskRepo = getTaskRepository();
21
- const environment = getCurrentEnvironmentMode();
22
- const riskTier = detectRiskTierFromPlan(plan);
23
- const taskId = `task-${randomUUID()}`;
24
- await taskRepo.create({
25
- id: taskId,
26
- createdAt: Date.now(),
27
- updatedAt: Date.now(),
28
- codebaseId: codebaseInfo?.codebaseId || codebaseInfo?.rootPath || process.cwd(),
29
- cwd: process.cwd(),
30
- mode: TaskMode.PLAN,
31
- goal,
32
- command: 'plan',
33
- status: TaskStatus.PLANNED,
34
- riskTier,
35
- environment,
36
- planId: plan.id,
37
- plan: plan, // Store serialized plan
38
- traceSummaryId: runId,
39
- });
40
- return taskId;
41
- }
42
- catch {
43
- // Silent failure - task creation is optional
44
- return null;
45
- }
46
- }
47
- /**
48
- * Create task for suggest command
49
- * Non-breaking: silent failure, doesn't affect user workflow
50
- * Suggest tasks are ephemeral (T1, always low risk)
51
- */
52
- export async function createSuggestTask(options) {
53
- const { query, filePath, codebaseInfo, runId } = options;
54
- try {
55
- const taskRepo = getTaskRepository();
56
- const environment = getCurrentEnvironmentMode();
57
- // Suggest mode is always T1 (low risk, read-only)
58
- const taskId = `task-${randomUUID()}`;
59
- const fullQuery = filePath ? `${query} (file: ${filePath})` : query;
60
- await taskRepo.create({
61
- id: taskId,
62
- createdAt: Date.now(),
63
- updatedAt: Date.now(),
64
- codebaseId: codebaseInfo?.codebaseId || codebaseInfo?.rootPath || process.cwd(),
65
- cwd: process.cwd(),
66
- mode: TaskMode.SUGGEST,
67
- goal: fullQuery,
68
- command: 'suggest',
69
- status: TaskStatus.CREATED,
70
- riskTier: RiskTier.T1, // Always low risk for read-only operations
71
- environment,
72
- traceSummaryId: runId,
73
- });
74
- return taskId;
75
- }
76
- catch {
77
- // Silent failure - task creation is optional
78
- return null;
79
- }
80
- }
81
- /**
82
- * Create task for fix/run command
83
- * Non-breaking: silent failure, doesn't affect user workflow
84
- */
85
- export async function createRunTask(options) {
86
- const { goal, filePath, codebaseInfo, runId, files = [] } = options;
87
- try {
88
- const taskRepo = getTaskRepository();
89
- const environment = getCurrentEnvironmentMode();
90
- const riskTier = detectRiskTier(files);
91
- const taskId = `task-${randomUUID()}`;
92
- const fullGoal = filePath ? `${goal} (file: ${filePath})` : goal;
93
- await taskRepo.create({
94
- id: taskId,
95
- createdAt: Date.now(),
96
- updatedAt: Date.now(),
97
- codebaseId: codebaseInfo?.codebaseId || codebaseInfo?.rootPath || process.cwd(),
98
- cwd: process.cwd(),
99
- mode: TaskMode.RUN,
100
- goal: fullGoal,
101
- command: filePath ? 'fix' : 'run',
102
- status: TaskStatus.CREATED,
103
- riskTier,
104
- environment,
105
- filesChanged: files.length > 0 ? files : undefined,
106
- traceSummaryId: runId,
107
- });
108
- return taskId;
109
- }
110
- catch {
111
- // Silent failure - task creation is optional
112
- return null;
113
- }
114
- }
115
- /**
116
- * Update task status
117
- * Non-breaking: silent failure
118
- */
119
- export async function updateTaskStatus(taskId, status, updates) {
120
- if (!taskId) {
121
- return;
122
- }
123
- try {
124
- const taskRepo = getTaskRepository();
125
- const existing = await taskRepo.getById(taskId);
126
- if (!existing) {
127
- return;
128
- }
129
- await taskRepo.update({
130
- ...existing,
131
- ...updates,
132
- status,
133
- updatedAt: Date.now(),
134
- });
135
- }
136
- catch {
137
- // Silent failure
138
- }
139
- }
140
- /**
141
- * Update task with execution results
142
- * Non-breaking: silent failure
143
- */
144
- export async function updateTaskWithResults(taskId, results) {
145
- if (!taskId) {
146
- return;
147
- }
148
- try {
149
- const taskRepo = getTaskRepository();
150
- const existing = await taskRepo.getById(taskId);
151
- if (!existing) {
152
- return;
153
- }
154
- await taskRepo.update({
155
- ...existing,
156
- ...results,
157
- updatedAt: Date.now(),
158
- });
159
- }
160
- catch {
161
- // Silent failure
162
- }
163
- }
164
- /**
165
- * Update task review status
166
- * Non-breaking: silent failure
167
- */
168
- export async function updateTaskReview(taskId, reviewStatus, reviewedBy, comments) {
169
- if (!taskId) {
170
- return;
171
- }
172
- try {
173
- const taskRepo = getTaskRepository();
174
- const existing = await taskRepo.getById(taskId);
175
- if (!existing) {
176
- return;
177
- }
178
- const newStatus = reviewStatus === ReviewStatus.APPROVED
179
- ? TaskStatus.APPROVED
180
- : reviewStatus === ReviewStatus.REJECTED
181
- ? TaskStatus.REJECTED
182
- : existing.status;
183
- await taskRepo.update({
184
- ...existing,
185
- reviewStatus,
186
- reviewedAt: Date.now(),
187
- reviewedBy,
188
- reviewComments: comments,
189
- status: newStatus,
190
- updatedAt: Date.now(),
191
- });
192
- }
193
- catch {
194
- // Silent failure
195
- }
196
- }
197
- //# sourceMappingURL=task-helpers.js.map