codehere 0.2.2 → 0.3.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -68
- package/dist/domain/entities/task.js +4 -4
- package/dist/error-handler.js +4 -9
- package/dist/index.js +253 -1219
- package/dist/infrastructure/config/product-context.js +7 -6
- package/dist/infrastructure/hooks/claude-sdk-hook.js +348 -72
- package/dist/infrastructure/observability/execution-tracer.js +11 -6
- package/dist/infrastructure/orchestration/agent-adapter.js +13 -0
- package/dist/infrastructure/orchestration/agent-installer.js +101 -0
- package/dist/infrastructure/orchestration/agents-config-seed.js +56 -0
- package/dist/infrastructure/orchestration/aider-adapter.js +319 -0
- package/dist/infrastructure/orchestration/artifacts-extractor.js +175 -0
- package/dist/infrastructure/orchestration/claude-code-adapter.js +352 -0
- package/dist/infrastructure/orchestration/codex-adapter.js +310 -0
- package/dist/infrastructure/orchestration/generic-cli-adapter.js +553 -0
- package/dist/infrastructure/orchestration/opencode-adapter.js +275 -0
- package/dist/infrastructure/orchestration/progress-aggregator.js +189 -0
- package/dist/infrastructure/orchestration/readiness.js +106 -0
- package/dist/infrastructure/orchestration/session-manager.js +272 -0
- package/dist/infrastructure/orchestration/session-persistence.js +109 -0
- package/dist/infrastructure/protocols/mcp-helpers.js +10 -30
- package/dist/infrastructure/protocols/mcp-server-impl.js +359 -21
- package/dist/infrastructure/protocols/ui-page.js +1827 -0
- package/dist/infrastructure/security/file-collection.js +115 -0
- package/dist/infrastructure/security/trust-scorer.js +301 -56
- package/dist/infrastructure/storage/task-repository.js +8 -7
- package/dist/monitoring.js +9 -38
- package/dist/presentation/cli/commands/help-command.js +96 -139
- package/dist/presentation/cli/commands/hook-command.js +17 -24
- package/dist/presentation/cli/commands/report-command.js +59 -72
- package/dist/presentation/cli/commands/setup-command.js +4 -4
- package/dist/presentation/cli/commands/status-command.js +321 -30
- package/dist/presentation/cli/commands/trust-command.js +84 -72
- package/dist/presentation/cli/error-display.js +17 -21
- package/dist/ui.js +11 -11
- package/package.json +24 -62
- package/dist/agents/base.js +0 -101
- package/dist/agents/orchestrator-model-driven.js +0 -141
- package/dist/agents/react-orchestrator-agent.js +0 -54
- package/dist/application/agents/execution-agent.js +0 -508
- package/dist/application/agents/multi-agent-orchestrator.js +0 -295
- package/dist/application/agents/planning-agent.js +0 -433
- package/dist/application/agents/validation-agent.js +0 -317
- package/dist/application/architectures/plan-and-act.js +0 -242
- package/dist/application/index.js +0 -12
- package/dist/application/services/agent-factory.js +0 -28
- package/dist/application/services/dependency-container.js +0 -596
- package/dist/application/services/git-context-service.js +0 -83
- package/dist/application/services/intelligent-router.js +0 -934
- package/dist/application/services/tool-executor-service.js +0 -94
- package/dist/application/use-cases/ask-question-use-case.js +0 -338
- package/dist/application/use-cases/edit-file-use-case.js +0 -830
- package/dist/application/use-cases/explain-file-use-case.js +0 -50
- package/dist/application/use-cases/index-codebase-use-case.js +0 -113
- package/dist/application/use-cases/planning-use-case.js +0 -276
- package/dist/application/use-cases/react-orchestration-use-case.js +0 -329
- package/dist/application/use-cases/reflexion-use-case.js +0 -30
- package/dist/application/workflows/deterministic-workflows.js +0 -189
- package/dist/ast-parser.js +0 -331
- package/dist/cache.js +0 -180
- package/dist/chat.js +0 -251
- package/dist/code-analysis.js +0 -327
- package/dist/context.js +0 -187
- package/dist/docs.js +0 -146
- package/dist/domain/entities/code-chunk.js +0 -6
- package/dist/domain/entities/decision.js +0 -9
- package/dist/domain/entities/edit.js +0 -6
- package/dist/domain/entities/knowledge-node.js +0 -9
- package/dist/domain/entities/knowledge-preservation.js +0 -10
- package/dist/domain/entities/memory.js +0 -6
- package/dist/domain/entities/pattern.js +0 -7
- package/dist/domain/entities/plan.js +0 -6
- package/dist/domain/entities/query.js +0 -6
- package/dist/domain/errors/embeddings-not-found-error.js +0 -13
- package/dist/domain/index.js +0 -19
- package/dist/domain/interfaces/ai-service.interface.js +0 -6
- package/dist/domain/interfaces/code-analyzer.interface.js +0 -6
- package/dist/domain/interfaces/decision-repository.interface.js +0 -9
- package/dist/domain/interfaces/embedding-repository.interface.js +0 -6
- package/dist/domain/interfaces/knowledge-graph-repository.interface.js +0 -9
- package/dist/domain/interfaces/knowledge-preservation-repository.interface.js +0 -8
- package/dist/domain/interfaces/memory-repository.interface.js +0 -6
- package/dist/domain/interfaces/pattern-repository.interface.js +0 -6
- package/dist/domain/interfaces/verification-service.interface.js +0 -6
- package/dist/domain/services/cross-team-pattern-sharing.js +0 -125
- package/dist/domain/services/decision-recorder.js +0 -223
- package/dist/domain/services/decision-retriever.js +0 -133
- package/dist/domain/services/environment-mode-manager.js +0 -22
- package/dist/domain/services/graded-memory-activation.js +0 -69
- package/dist/domain/services/knowledge-access.js +0 -132
- package/dist/domain/services/knowledge-extractor.js +0 -247
- package/dist/domain/services/knowledge-graph-builder.js +0 -268
- package/dist/domain/services/knowledge-graph-query.js +0 -187
- package/dist/domain/services/memory-retriever.js +0 -82
- package/dist/domain/services/memory-synthesizer.js +0 -91
- package/dist/domain/services/pattern-extractor.js +0 -442
- package/dist/domain/services/query-intent-classifier.js +0 -140
- package/dist/domain/services/react-loop.js +0 -186
- package/dist/domain/services/risk-tier-detector.js +0 -78
- package/dist/edit.js +0 -319
- package/dist/embed.js +0 -459
- package/dist/formatter.js +0 -168
- package/dist/git.js +0 -198
- package/dist/infrastructure/ai/cohere-ai-service.js +0 -607
- package/dist/infrastructure/ai/command-r-evaluation.js +0 -206
- package/dist/infrastructure/ai/model-config.js +0 -84
- package/dist/infrastructure/ai/provider-ai-service.js +0 -477
- package/dist/infrastructure/cache/embedding-cache.js +0 -175
- package/dist/infrastructure/cache/query-result-cache.js +0 -66
- package/dist/infrastructure/cache/response-cache.js +0 -48
- package/dist/infrastructure/cache/security-scan-cache.js +0 -47
- package/dist/infrastructure/chunking/ast-code-chunker.js +0 -19
- package/dist/infrastructure/chunking/code-aware-chunker.js +0 -397
- package/dist/infrastructure/context/context-compressor.js +0 -329
- package/dist/infrastructure/context/conversation-context.js +0 -128
- package/dist/infrastructure/context/session-manager.js +0 -94
- package/dist/infrastructure/cost/cost-tracker.js +0 -360
- package/dist/infrastructure/file-scanner/file-scanner.js +0 -106
- package/dist/infrastructure/governance/nist-ai-rmf.js +0 -292
- package/dist/infrastructure/governance/policy-as-code.js +0 -258
- package/dist/infrastructure/governance/prompt-to-code-lineage.js +0 -239
- package/dist/infrastructure/index.js +0 -7
- package/dist/infrastructure/observability/prompt-versioner.js +0 -145
- package/dist/infrastructure/protocols/a2a-metadata.js +0 -137
- package/dist/infrastructure/protocols/a2a-protocol.js +0 -314
- package/dist/infrastructure/protocols/mcp-oauth.js +0 -184
- package/dist/infrastructure/protocols/mcp-server.js +0 -333
- package/dist/infrastructure/protocols/streaming-handler.js +0 -103
- package/dist/infrastructure/providers/cohere-provider.js +0 -444
- package/dist/infrastructure/providers/fake-provider.js +0 -130
- package/dist/infrastructure/providers/local-llm-provider.js +0 -330
- package/dist/infrastructure/providers/model-config.types.js +0 -9
- package/dist/infrastructure/providers/model-provider.interface.js +0 -8
- package/dist/infrastructure/providers/openai-provider.js +0 -413
- package/dist/infrastructure/providers/openrouter-provider.js +0 -399
- package/dist/infrastructure/providers/operation-provider-resolver.js +0 -105
- package/dist/infrastructure/providers/provider-config-loader.js +0 -120
- package/dist/infrastructure/providers/provider-registry.js +0 -88
- package/dist/infrastructure/safety/pattern-detector.js +0 -133
- package/dist/infrastructure/security/ai-sast-scanner.js +0 -290
- package/dist/infrastructure/security/docker-sandbox.js +0 -178
- package/dist/infrastructure/security/enhanced-security-gate.js +0 -151
- package/dist/infrastructure/security/license-scanner.js +0 -167
- package/dist/infrastructure/security/provider-bias-detector.js +0 -164
- package/dist/infrastructure/security/sandbox-executor.js +0 -64
- package/dist/infrastructure/serialization/toon-serializer.js +0 -119
- package/dist/infrastructure/storage/memory-stream-service.js +0 -204
- package/dist/infrastructure/storage/plan-repository.js +0 -96
- package/dist/infrastructure/storage/sqlite-decision-repository.js +0 -232
- package/dist/infrastructure/storage/sqlite-embedding-repository.js +0 -311
- package/dist/infrastructure/storage/sqlite-knowledge-graph-repository.js +0 -417
- package/dist/infrastructure/storage/sqlite-knowledge-preservation-repository.js +0 -230
- package/dist/infrastructure/storage/sqlite-memory-repository.js +0 -229
- package/dist/infrastructure/storage/sqlite-pattern-repository.js +0 -249
- package/dist/infrastructure/storage/task-helpers.js +0 -197
- package/dist/infrastructure/telemetry/telemetry-service.js +0 -167
- package/dist/infrastructure/ux/appropriate-friction.js +0 -213
- package/dist/infrastructure/ux/bi-directional-learning.js +0 -337
- package/dist/infrastructure/ux/capability-boundaries.js +0 -42
- package/dist/infrastructure/ux/comprehensive-formatter.js +0 -117
- package/dist/infrastructure/ux/contextual-feature-discovery.js +0 -10
- package/dist/infrastructure/ux/expectation-management.js +0 -327
- package/dist/infrastructure/ux/feature-discovery.js +0 -14
- package/dist/infrastructure/ux/feedback-prompt.js +0 -45
- package/dist/infrastructure/ux/hitl-validation.js +0 -297
- package/dist/infrastructure/ux/progress-indicator.js +0 -116
- package/dist/infrastructure/ux/progressive-disclosure.js +0 -236
- package/dist/infrastructure/ux/review-checkpoint.js +0 -72
- package/dist/infrastructure/ux/staged-feature-intro.js +0 -24
- package/dist/infrastructure/ux/stream-markdown.js +0 -151
- package/dist/infrastructure/ux/syntax-highlighter.js +0 -91
- package/dist/infrastructure/ux/team-standards.js +0 -196
- package/dist/infrastructure/ux/transparency.js +0 -71
- package/dist/infrastructure/validation/agent-feedback.js +0 -55
- package/dist/infrastructure/validation/agent-validation-helper.js +0 -137
- package/dist/infrastructure/validation/review-handler.js +0 -40
- package/dist/infrastructure/validation/summary-aggregator.js +0 -70
- package/dist/infrastructure/validation/summary-extractor.js +0 -45
- package/dist/infrastructure/validation/trace-summary.js +0 -52
- package/dist/infrastructure/verification/verification-service.js +0 -47
- package/dist/infrastructure/xai/attention-visualizer.js +0 -172
- package/dist/infrastructure/xai/cot-visualizer.js +0 -283
- package/dist/infrastructure/xai/decision-tree-log.js +0 -212
- package/dist/infrastructure/xai/interactive-xai.js +0 -260
- package/dist/infrastructure/xai/uncertainty-quantifier.js +0 -198
- package/dist/intelligent-retrieval.js +0 -272
- package/dist/intent/classifier.js +0 -2
- package/dist/intent/context.js +0 -2
- package/dist/iterative-refinement.js +0 -189
- package/dist/learning.js +0 -232
- package/dist/log.js +0 -31
- package/dist/migrate.js +0 -133
- package/dist/parallel-processor.js +0 -534
- package/dist/planner.js +0 -198
- package/dist/policy.js +0 -26
- package/dist/presentation/cli/commands/ask-command.js +0 -314
- package/dist/presentation/cli/commands/cost-command.js +0 -191
- package/dist/presentation/cli/commands/decision-command.js +0 -207
- package/dist/presentation/cli/commands/docs-command.js +0 -25
- package/dist/presentation/cli/commands/fix-command.js +0 -53
- package/dist/presentation/cli/commands/knowledge-command.js +0 -129
- package/dist/presentation/cli/commands/learning-dashboard-command.js +0 -183
- package/dist/presentation/cli/commands/models-command.js +0 -194
- package/dist/presentation/cli/commands/orchestrate-command.js +0 -207
- package/dist/presentation/cli/commands/plan-command.js +0 -246
- package/dist/presentation/cli/commands/product-command.js +0 -199
- package/dist/presentation/cli/commands/react-command.js +0 -181
- package/dist/presentation/cli/commands/review-command.js +0 -154
- package/dist/presentation/cli/commands/run-command.js +0 -188
- package/dist/presentation/cli/commands/smart-command.js +0 -395
- package/dist/presentation/cli/commands/suggest-command.js +0 -138
- package/dist/presentation/cli/commands/trace-command.js +0 -129
- package/dist/presentation/cli/commands/undo-command.js +0 -150
- package/dist/query-optimizer.js +0 -205
- package/dist/refactor.js +0 -116
- package/dist/review.js +0 -206
- package/dist/search.js +0 -163
- package/dist/session.js +0 -704
- package/dist/task-verification.js +0 -336
- package/dist/testgen.js +0 -166
- package/dist/token-optimizer.js +0 -277
- package/dist/tools/bash.js +0 -213
- package/dist/tools/edit.js +0 -235
- package/dist/tools/executor.js +0 -153
- package/dist/tools/git-tool.js +0 -292
- package/dist/tools/parser.js +0 -158
- package/dist/tools/registry.js +0 -302
- package/dist/tools/search.js +0 -100
- package/dist/types.js +0 -2
- package/dist/utils/check-api-status.js +0 -100
- package/dist/utils/diff-parser.js +0 -162
- package/dist/verification/backup.js +0 -259
- package/dist/verification/compiler.js +0 -264
- package/dist/verification/index.js +0 -273
- package/dist/verification/test-runner.js +0 -379
|
@@ -1,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
|