@jamesaphoenix/tx-core 0.4.1
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/dist/db.d.ts +42 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +46 -0
- package/dist/db.js.map +1 -0
- package/dist/errors.d.ts +231 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +139 -0
- package/dist/errors.js.map +1 -0
- package/dist/id.d.ts +6 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +21 -0
- package/dist/id.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/layer.d.ts +50 -0
- package/dist/layer.d.ts.map +1 -0
- package/dist/layer.js +155 -0
- package/dist/layer.js.map +1 -0
- package/dist/mappers/anchor.d.ts +14 -0
- package/dist/mappers/anchor.d.ts.map +1 -0
- package/dist/mappers/anchor.js +38 -0
- package/dist/mappers/anchor.js.map +1 -0
- package/dist/mappers/attempt.d.ts +15 -0
- package/dist/mappers/attempt.d.ts.map +1 -0
- package/dist/mappers/attempt.js +23 -0
- package/dist/mappers/attempt.js.map +1 -0
- package/dist/mappers/candidate.d.ts +23 -0
- package/dist/mappers/candidate.d.ts.map +1 -0
- package/dist/mappers/candidate.js +53 -0
- package/dist/mappers/candidate.js.map +1 -0
- package/dist/mappers/claim.d.ts +30 -0
- package/dist/mappers/claim.d.ts.map +1 -0
- package/dist/mappers/claim.js +32 -0
- package/dist/mappers/claim.js.map +1 -0
- package/dist/mappers/deduplication.d.ts +39 -0
- package/dist/mappers/deduplication.d.ts.map +1 -0
- package/dist/mappers/deduplication.js +53 -0
- package/dist/mappers/deduplication.js.map +1 -0
- package/dist/mappers/edge.d.ts +10 -0
- package/dist/mappers/edge.d.ts.map +1 -0
- package/dist/mappers/edge.js +19 -0
- package/dist/mappers/edge.js.map +1 -0
- package/dist/mappers/file-learning.d.ts +14 -0
- package/dist/mappers/file-learning.d.ts.map +1 -0
- package/dist/mappers/file-learning.js +75 -0
- package/dist/mappers/file-learning.js.map +1 -0
- package/dist/mappers/index.d.ts +17 -0
- package/dist/mappers/index.d.ts.map +1 -0
- package/dist/mappers/index.js +30 -0
- package/dist/mappers/index.js.map +1 -0
- package/dist/mappers/learning.d.ts +19 -0
- package/dist/mappers/learning.d.ts.map +1 -0
- package/dist/mappers/learning.js +41 -0
- package/dist/mappers/learning.js.map +1 -0
- package/dist/mappers/orchestrator-state.d.ts +33 -0
- package/dist/mappers/orchestrator-state.d.ts.map +1 -0
- package/dist/mappers/orchestrator-state.js +34 -0
- package/dist/mappers/orchestrator-state.js.map +1 -0
- package/dist/mappers/run.d.ts +32 -0
- package/dist/mappers/run.d.ts.map +1 -0
- package/dist/mappers/run.js +64 -0
- package/dist/mappers/run.js.map +1 -0
- package/dist/mappers/task.d.ts +23 -0
- package/dist/mappers/task.d.ts.map +1 -0
- package/dist/mappers/task.js +54 -0
- package/dist/mappers/task.js.map +1 -0
- package/dist/mappers/tracked-project.d.ts +15 -0
- package/dist/mappers/tracked-project.d.ts.map +1 -0
- package/dist/mappers/tracked-project.js +23 -0
- package/dist/mappers/tracked-project.js.map +1 -0
- package/dist/mappers/worker.d.ts +33 -0
- package/dist/mappers/worker.d.ts.map +1 -0
- package/dist/mappers/worker.js +35 -0
- package/dist/mappers/worker.js.map +1 -0
- package/dist/repo/anchor-repo.d.ts +52 -0
- package/dist/repo/anchor-repo.d.ts.map +1 -0
- package/dist/repo/anchor-repo.js +204 -0
- package/dist/repo/anchor-repo.js.map +1 -0
- package/dist/repo/attempt-repo.d.ts +25 -0
- package/dist/repo/attempt-repo.d.ts.map +1 -0
- package/dist/repo/attempt-repo.js +78 -0
- package/dist/repo/attempt-repo.js.map +1 -0
- package/dist/repo/candidate-repo.d.ts +16 -0
- package/dist/repo/candidate-repo.d.ts.map +1 -0
- package/dist/repo/candidate-repo.js +143 -0
- package/dist/repo/candidate-repo.js.map +1 -0
- package/dist/repo/claim-repo.d.ts +17 -0
- package/dist/repo/claim-repo.d.ts.map +1 -0
- package/dist/repo/claim-repo.js +62 -0
- package/dist/repo/claim-repo.js.map +1 -0
- package/dist/repo/deduplication-repo.d.ts +37 -0
- package/dist/repo/deduplication-repo.d.ts.map +1 -0
- package/dist/repo/deduplication-repo.js +133 -0
- package/dist/repo/deduplication-repo.js.map +1 -0
- package/dist/repo/dep-repo.d.ts +19 -0
- package/dist/repo/dep-repo.d.ts.map +1 -0
- package/dist/repo/dep-repo.js +104 -0
- package/dist/repo/dep-repo.js.map +1 -0
- package/dist/repo/edge-repo.d.ts +26 -0
- package/dist/repo/edge-repo.d.ts.map +1 -0
- package/dist/repo/edge-repo.js +227 -0
- package/dist/repo/edge-repo.js.map +1 -0
- package/dist/repo/file-learning-repo.d.ts +17 -0
- package/dist/repo/file-learning-repo.d.ts.map +1 -0
- package/dist/repo/file-learning-repo.js +60 -0
- package/dist/repo/file-learning-repo.js.map +1 -0
- package/dist/repo/index.d.ts +18 -0
- package/dist/repo/index.d.ts.map +1 -0
- package/dist/repo/index.js +18 -0
- package/dist/repo/index.js.map +1 -0
- package/dist/repo/learning-repo.d.ts +31 -0
- package/dist/repo/learning-repo.d.ts.map +1 -0
- package/dist/repo/learning-repo.js +165 -0
- package/dist/repo/learning-repo.js.map +1 -0
- package/dist/repo/orchestrator-state-repo.d.ts +27 -0
- package/dist/repo/orchestrator-state-repo.d.ts.map +1 -0
- package/dist/repo/orchestrator-state-repo.js +96 -0
- package/dist/repo/orchestrator-state-repo.js.map +1 -0
- package/dist/repo/run-repo.d.ts +31 -0
- package/dist/repo/run-repo.d.ts.map +1 -0
- package/dist/repo/run-repo.js +132 -0
- package/dist/repo/run-repo.js.map +1 -0
- package/dist/repo/task-repo.d.ts +21 -0
- package/dist/repo/task-repo.d.ts.map +1 -0
- package/dist/repo/task-repo.js +169 -0
- package/dist/repo/task-repo.js.map +1 -0
- package/dist/repo/tracked-project-repo.d.ts +16 -0
- package/dist/repo/tracked-project-repo.d.ts.map +1 -0
- package/dist/repo/tracked-project-repo.js +54 -0
- package/dist/repo/tracked-project-repo.js.map +1 -0
- package/dist/repo/worker-repo.d.ts +19 -0
- package/dist/repo/worker-repo.d.ts.map +1 -0
- package/dist/repo/worker-repo.js +72 -0
- package/dist/repo/worker-repo.js.map +1 -0
- package/dist/schemas/index.d.ts +8 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +7 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/sync.d.ts +296 -0
- package/dist/schemas/sync.d.ts.map +1 -0
- package/dist/schemas/sync.js +146 -0
- package/dist/schemas/sync.js.map +1 -0
- package/dist/schemas/worker.d.ts +77 -0
- package/dist/schemas/worker.d.ts.map +1 -0
- package/dist/schemas/worker.js +80 -0
- package/dist/schemas/worker.js.map +1 -0
- package/dist/services/anchor-service.d.ts +147 -0
- package/dist/services/anchor-service.d.ts.map +1 -0
- package/dist/services/anchor-service.js +540 -0
- package/dist/services/anchor-service.js.map +1 -0
- package/dist/services/anchor-verification.d.ts +94 -0
- package/dist/services/anchor-verification.d.ts.map +1 -0
- package/dist/services/anchor-verification.js +617 -0
- package/dist/services/anchor-verification.js.map +1 -0
- package/dist/services/ast-grep-service.d.ts +58 -0
- package/dist/services/ast-grep-service.d.ts.map +1 -0
- package/dist/services/ast-grep-service.js +356 -0
- package/dist/services/ast-grep-service.js.map +1 -0
- package/dist/services/attempt-service.d.ts +24 -0
- package/dist/services/attempt-service.d.ts.map +1 -0
- package/dist/services/attempt-service.js +55 -0
- package/dist/services/attempt-service.js.map +1 -0
- package/dist/services/auto-sync-service.d.ts +56 -0
- package/dist/services/auto-sync-service.d.ts.map +1 -0
- package/dist/services/auto-sync-service.js +66 -0
- package/dist/services/auto-sync-service.js.map +1 -0
- package/dist/services/candidate-extractor-service.d.ts +56 -0
- package/dist/services/candidate-extractor-service.d.ts.map +1 -0
- package/dist/services/candidate-extractor-service.js +365 -0
- package/dist/services/candidate-extractor-service.js.map +1 -0
- package/dist/services/claim-service.d.ts +52 -0
- package/dist/services/claim-service.d.ts.map +1 -0
- package/dist/services/claim-service.js +134 -0
- package/dist/services/claim-service.js.map +1 -0
- package/dist/services/daemon-service.d.ts +214 -0
- package/dist/services/daemon-service.d.ts.map +1 -0
- package/dist/services/daemon-service.js +522 -0
- package/dist/services/daemon-service.js.map +1 -0
- package/dist/services/deduplication-service.d.ts +67 -0
- package/dist/services/deduplication-service.d.ts.map +1 -0
- package/dist/services/deduplication-service.js +145 -0
- package/dist/services/deduplication-service.js.map +1 -0
- package/dist/services/dep-service.d.ts +14 -0
- package/dist/services/dep-service.d.ts.map +1 -0
- package/dist/services/dep-service.js +34 -0
- package/dist/services/dep-service.js.map +1 -0
- package/dist/services/diversifier-service.d.ts +46 -0
- package/dist/services/diversifier-service.d.ts.map +1 -0
- package/dist/services/diversifier-service.js +197 -0
- package/dist/services/diversifier-service.js.map +1 -0
- package/dist/services/edge-service.d.ts +78 -0
- package/dist/services/edge-service.d.ts.map +1 -0
- package/dist/services/edge-service.js +158 -0
- package/dist/services/edge-service.js.map +1 -0
- package/dist/services/embedding-service.d.ts +138 -0
- package/dist/services/embedding-service.d.ts.map +1 -0
- package/dist/services/embedding-service.js +318 -0
- package/dist/services/embedding-service.js.map +1 -0
- package/dist/services/feedback-tracker.d.ts +64 -0
- package/dist/services/feedback-tracker.d.ts.map +1 -0
- package/dist/services/feedback-tracker.js +110 -0
- package/dist/services/feedback-tracker.js.map +1 -0
- package/dist/services/file-learning-service.d.ts +17 -0
- package/dist/services/file-learning-service.d.ts.map +1 -0
- package/dist/services/file-learning-service.js +41 -0
- package/dist/services/file-learning-service.js.map +1 -0
- package/dist/services/file-watcher-service.d.ts +141 -0
- package/dist/services/file-watcher-service.d.ts.map +1 -0
- package/dist/services/file-watcher-service.js +278 -0
- package/dist/services/file-watcher-service.js.map +1 -0
- package/dist/services/graph-expansion.d.ts +155 -0
- package/dist/services/graph-expansion.d.ts.map +1 -0
- package/dist/services/graph-expansion.js +466 -0
- package/dist/services/graph-expansion.js.map +1 -0
- package/dist/services/hierarchy-service.d.ts +16 -0
- package/dist/services/hierarchy-service.d.ts.map +1 -0
- package/dist/services/hierarchy-service.js +66 -0
- package/dist/services/hierarchy-service.js.map +1 -0
- package/dist/services/index.d.ts +36 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +36 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/learning-service.d.ts +39 -0
- package/dist/services/learning-service.d.ts.map +1 -0
- package/dist/services/learning-service.js +151 -0
- package/dist/services/learning-service.js.map +1 -0
- package/dist/services/migration-service.d.ts +67 -0
- package/dist/services/migration-service.d.ts.map +1 -0
- package/dist/services/migration-service.js +144 -0
- package/dist/services/migration-service.js.map +1 -0
- package/dist/services/orchestrator-service.d.ts +52 -0
- package/dist/services/orchestrator-service.d.ts.map +1 -0
- package/dist/services/orchestrator-service.js +203 -0
- package/dist/services/orchestrator-service.js.map +1 -0
- package/dist/services/promotion-service.d.ts +67 -0
- package/dist/services/promotion-service.d.ts.map +1 -0
- package/dist/services/promotion-service.js +151 -0
- package/dist/services/promotion-service.js.map +1 -0
- package/dist/services/query-expansion-service.d.ts +55 -0
- package/dist/services/query-expansion-service.d.ts.map +1 -0
- package/dist/services/query-expansion-service.js +174 -0
- package/dist/services/query-expansion-service.js.map +1 -0
- package/dist/services/ready-service.d.ts +16 -0
- package/dist/services/ready-service.d.ts.map +1 -0
- package/dist/services/ready-service.js +70 -0
- package/dist/services/ready-service.js.map +1 -0
- package/dist/services/reranker-service.d.ts +51 -0
- package/dist/services/reranker-service.d.ts.map +1 -0
- package/dist/services/reranker-service.js +128 -0
- package/dist/services/reranker-service.js.map +1 -0
- package/dist/services/retriever-service.d.ts +49 -0
- package/dist/services/retriever-service.d.ts.map +1 -0
- package/dist/services/retriever-service.js +419 -0
- package/dist/services/retriever-service.js.map +1 -0
- package/dist/services/score-service.d.ts +43 -0
- package/dist/services/score-service.d.ts.map +1 -0
- package/dist/services/score-service.js +82 -0
- package/dist/services/score-service.js.map +1 -0
- package/dist/services/swarm-verification.d.ts +104 -0
- package/dist/services/swarm-verification.d.ts.map +1 -0
- package/dist/services/swarm-verification.js +400 -0
- package/dist/services/swarm-verification.js.map +1 -0
- package/dist/services/sync-service.d.ts +115 -0
- package/dist/services/sync-service.d.ts.map +1 -0
- package/dist/services/sync-service.js +350 -0
- package/dist/services/sync-service.js.map +1 -0
- package/dist/services/task-service.d.ts +22 -0
- package/dist/services/task-service.d.ts.map +1 -0
- package/dist/services/task-service.js +221 -0
- package/dist/services/task-service.js.map +1 -0
- package/dist/services/worker-process.d.ts +41 -0
- package/dist/services/worker-process.d.ts.map +1 -0
- package/dist/services/worker-process.js +280 -0
- package/dist/services/worker-process.js.map +1 -0
- package/dist/services/worker-service.d.ts +74 -0
- package/dist/services/worker-service.d.ts.map +1 -0
- package/dist/services/worker-service.js +148 -0
- package/dist/services/worker-service.js.map +1 -0
- package/dist/utils/glob.d.ts +15 -0
- package/dist/utils/glob.d.ts.map +1 -0
- package/dist/utils/glob.js +27 -0
- package/dist/utils/glob.js.map +1 -0
- package/dist/utils/math.d.ts +6 -0
- package/dist/utils/math.d.ts.map +1 -0
- package/dist/utils/math.js +21 -0
- package/dist/utils/math.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError, EdgeNotFoundError } from "../errors.js";
|
|
4
|
+
import { rowToEdge } from "../mappers/edge.js";
|
|
5
|
+
export class EdgeRepository extends Context.Tag("EdgeRepository")() {
|
|
6
|
+
}
|
|
7
|
+
export const EdgeRepositoryLive = Layer.effect(EdgeRepository, Effect.gen(function* () {
|
|
8
|
+
const db = yield* SqliteClient;
|
|
9
|
+
return {
|
|
10
|
+
create: (input) => Effect.try({
|
|
11
|
+
try: () => {
|
|
12
|
+
const result = db.prepare(`INSERT INTO learning_edges
|
|
13
|
+
(edge_type, source_type, source_id, target_type, target_id, weight, metadata)
|
|
14
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`).run(input.edgeType, input.sourceType, input.sourceId, input.targetType, input.targetId, input.weight ?? 1.0, JSON.stringify(input.metadata ?? {}));
|
|
15
|
+
const row = db.prepare("SELECT * FROM learning_edges WHERE id = ?").get(result.lastInsertRowid);
|
|
16
|
+
return rowToEdge(row);
|
|
17
|
+
},
|
|
18
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
19
|
+
}),
|
|
20
|
+
findById: (id) => Effect.try({
|
|
21
|
+
try: () => {
|
|
22
|
+
const row = db.prepare("SELECT * FROM learning_edges WHERE id = ? AND invalidated_at IS NULL").get(id);
|
|
23
|
+
return row ? rowToEdge(row) : null;
|
|
24
|
+
},
|
|
25
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
26
|
+
}),
|
|
27
|
+
findBySource: (sourceType, sourceId) => Effect.try({
|
|
28
|
+
try: () => {
|
|
29
|
+
const rows = db.prepare(`SELECT * FROM learning_edges
|
|
30
|
+
WHERE source_type = ? AND source_id = ? AND invalidated_at IS NULL
|
|
31
|
+
ORDER BY created_at ASC`).all(sourceType, sourceId);
|
|
32
|
+
return rows.map(rowToEdge);
|
|
33
|
+
},
|
|
34
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
35
|
+
}),
|
|
36
|
+
findByTarget: (targetType, targetId) => Effect.try({
|
|
37
|
+
try: () => {
|
|
38
|
+
const rows = db.prepare(`SELECT * FROM learning_edges
|
|
39
|
+
WHERE target_type = ? AND target_id = ? AND invalidated_at IS NULL
|
|
40
|
+
ORDER BY created_at ASC`).all(targetType, targetId);
|
|
41
|
+
return rows.map(rowToEdge);
|
|
42
|
+
},
|
|
43
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
44
|
+
}),
|
|
45
|
+
findByMultipleSources: (sourceType, sourceIds) => Effect.try({
|
|
46
|
+
try: () => {
|
|
47
|
+
// Return empty map for empty input
|
|
48
|
+
if (sourceIds.length === 0) {
|
|
49
|
+
return new Map();
|
|
50
|
+
}
|
|
51
|
+
// Build IN clause with placeholders
|
|
52
|
+
const placeholders = sourceIds.map(() => "?").join(", ");
|
|
53
|
+
const rows = db.prepare(`SELECT * FROM learning_edges
|
|
54
|
+
WHERE source_type = ? AND source_id IN (${placeholders}) AND invalidated_at IS NULL
|
|
55
|
+
ORDER BY weight DESC, created_at ASC`).all(sourceType, ...sourceIds);
|
|
56
|
+
// Group edges by source_id
|
|
57
|
+
const result = new Map();
|
|
58
|
+
// Initialize all requested sourceIds with empty arrays
|
|
59
|
+
for (const sourceId of sourceIds) {
|
|
60
|
+
result.set(sourceId, []);
|
|
61
|
+
}
|
|
62
|
+
// Populate with actual edges
|
|
63
|
+
for (const row of rows) {
|
|
64
|
+
const edge = rowToEdge(row);
|
|
65
|
+
const existing = result.get(row.source_id);
|
|
66
|
+
if (existing) {
|
|
67
|
+
existing.push(edge);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return result;
|
|
71
|
+
},
|
|
72
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
73
|
+
}),
|
|
74
|
+
findByEdgeType: (edgeType) => Effect.try({
|
|
75
|
+
try: () => {
|
|
76
|
+
const rows = db.prepare(`SELECT * FROM learning_edges
|
|
77
|
+
WHERE edge_type = ? AND invalidated_at IS NULL
|
|
78
|
+
ORDER BY weight DESC, created_at ASC`).all(edgeType);
|
|
79
|
+
return rows.map(rowToEdge);
|
|
80
|
+
},
|
|
81
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
82
|
+
}),
|
|
83
|
+
countByType: () => Effect.try({
|
|
84
|
+
try: () => {
|
|
85
|
+
const rows = db.prepare(`SELECT edge_type, COUNT(*) as count FROM learning_edges
|
|
86
|
+
WHERE invalidated_at IS NULL
|
|
87
|
+
GROUP BY edge_type`).all();
|
|
88
|
+
const result = new Map();
|
|
89
|
+
for (const row of rows) {
|
|
90
|
+
result.set(row.edge_type, row.count);
|
|
91
|
+
}
|
|
92
|
+
return result;
|
|
93
|
+
},
|
|
94
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
95
|
+
}),
|
|
96
|
+
findNeighbors: (nodeType, nodeId, options = {}) => Effect.try({
|
|
97
|
+
try: () => {
|
|
98
|
+
const direction = options.direction ?? "both";
|
|
99
|
+
const edgeTypes = options.edgeTypes;
|
|
100
|
+
const neighbors = [];
|
|
101
|
+
// Build edge type filter clause
|
|
102
|
+
const edgeTypeFilter = edgeTypes && edgeTypes.length > 0
|
|
103
|
+
? `AND edge_type IN (${edgeTypes.map(() => "?").join(", ")})`
|
|
104
|
+
: "";
|
|
105
|
+
const edgeTypeParams = edgeTypes ?? [];
|
|
106
|
+
// Outgoing edges (this node is the source)
|
|
107
|
+
if (direction === "outgoing" || direction === "both") {
|
|
108
|
+
const outgoingRows = db.prepare(`SELECT * FROM learning_edges
|
|
109
|
+
WHERE source_type = ? AND source_id = ? AND invalidated_at IS NULL
|
|
110
|
+
${edgeTypeFilter}
|
|
111
|
+
ORDER BY weight DESC, created_at ASC`).all(nodeType, nodeId, ...edgeTypeParams);
|
|
112
|
+
for (const row of outgoingRows) {
|
|
113
|
+
neighbors.push({
|
|
114
|
+
nodeType: row.target_type,
|
|
115
|
+
nodeId: row.target_id,
|
|
116
|
+
edgeType: row.edge_type,
|
|
117
|
+
weight: row.weight,
|
|
118
|
+
direction: "outgoing"
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Incoming edges (this node is the target)
|
|
123
|
+
if (direction === "incoming" || direction === "both") {
|
|
124
|
+
const incomingRows = db.prepare(`SELECT * FROM learning_edges
|
|
125
|
+
WHERE target_type = ? AND target_id = ? AND invalidated_at IS NULL
|
|
126
|
+
${edgeTypeFilter}
|
|
127
|
+
ORDER BY weight DESC, created_at ASC`).all(nodeType, nodeId, ...edgeTypeParams);
|
|
128
|
+
for (const row of incomingRows) {
|
|
129
|
+
neighbors.push({
|
|
130
|
+
nodeType: row.source_type,
|
|
131
|
+
nodeId: row.source_id,
|
|
132
|
+
edgeType: row.edge_type,
|
|
133
|
+
weight: row.weight,
|
|
134
|
+
direction: "incoming"
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return neighbors;
|
|
139
|
+
},
|
|
140
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
141
|
+
}),
|
|
142
|
+
findPath: (fromType, fromId, toType, toId, maxDepth = 5) => Effect.try({
|
|
143
|
+
try: () => {
|
|
144
|
+
// BFS for shortest path
|
|
145
|
+
const visited = new Set([`${fromType}:${fromId}`]);
|
|
146
|
+
let frontier = [{ type: fromType, id: fromId, path: [] }];
|
|
147
|
+
for (let depth = 0; depth < maxDepth; depth++) {
|
|
148
|
+
const nextFrontier = [];
|
|
149
|
+
for (const { type, id, path } of frontier) {
|
|
150
|
+
// Get outgoing edges
|
|
151
|
+
const rows = db.prepare(`SELECT * FROM learning_edges
|
|
152
|
+
WHERE source_type = ? AND source_id = ? AND invalidated_at IS NULL`).all(type, id);
|
|
153
|
+
for (const row of rows) {
|
|
154
|
+
const edge = rowToEdge(row);
|
|
155
|
+
// Found target
|
|
156
|
+
if (row.target_type === toType && row.target_id === toId) {
|
|
157
|
+
return [...path, edge];
|
|
158
|
+
}
|
|
159
|
+
const key = `${row.target_type}:${row.target_id}`;
|
|
160
|
+
if (!visited.has(key)) {
|
|
161
|
+
visited.add(key);
|
|
162
|
+
nextFrontier.push({
|
|
163
|
+
type: row.target_type,
|
|
164
|
+
id: row.target_id,
|
|
165
|
+
path: [...path, edge]
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
frontier = nextFrontier;
|
|
171
|
+
if (frontier.length === 0)
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
return null; // No path found
|
|
175
|
+
},
|
|
176
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
177
|
+
}),
|
|
178
|
+
update: (id, input) => Effect.try({
|
|
179
|
+
try: () => {
|
|
180
|
+
const updates = [];
|
|
181
|
+
const values = [];
|
|
182
|
+
if (input.weight !== undefined) {
|
|
183
|
+
updates.push("weight = ?");
|
|
184
|
+
values.push(input.weight);
|
|
185
|
+
}
|
|
186
|
+
if (input.metadata !== undefined) {
|
|
187
|
+
updates.push("metadata = ?");
|
|
188
|
+
values.push(JSON.stringify(input.metadata));
|
|
189
|
+
}
|
|
190
|
+
if (updates.length === 0) {
|
|
191
|
+
const row = db.prepare("SELECT * FROM learning_edges WHERE id = ? AND invalidated_at IS NULL").get(id);
|
|
192
|
+
return row ? rowToEdge(row) : null;
|
|
193
|
+
}
|
|
194
|
+
values.push(id);
|
|
195
|
+
const result = db.prepare(`UPDATE learning_edges SET ${updates.join(", ")} WHERE id = ? AND invalidated_at IS NULL`).run(...values);
|
|
196
|
+
if (result.changes === 0) {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
const row = db.prepare("SELECT * FROM learning_edges WHERE id = ?").get(id);
|
|
200
|
+
return rowToEdge(row);
|
|
201
|
+
},
|
|
202
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
203
|
+
}),
|
|
204
|
+
invalidate: (id) => Effect.try({
|
|
205
|
+
try: () => {
|
|
206
|
+
const result = db.prepare("UPDATE learning_edges SET invalidated_at = datetime('now') WHERE id = ? AND invalidated_at IS NULL").run(id);
|
|
207
|
+
if (result.changes === 0) {
|
|
208
|
+
throw new EdgeNotFoundError({ id });
|
|
209
|
+
}
|
|
210
|
+
return true;
|
|
211
|
+
},
|
|
212
|
+
catch: (cause) => {
|
|
213
|
+
if (cause instanceof EdgeNotFoundError)
|
|
214
|
+
throw cause;
|
|
215
|
+
throw new DatabaseError({ cause });
|
|
216
|
+
}
|
|
217
|
+
}),
|
|
218
|
+
findAll: () => Effect.try({
|
|
219
|
+
try: () => {
|
|
220
|
+
const rows = db.prepare("SELECT * FROM learning_edges WHERE invalidated_at IS NULL ORDER BY created_at ASC").all();
|
|
221
|
+
return rows.map(rowToEdge);
|
|
222
|
+
},
|
|
223
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
224
|
+
})
|
|
225
|
+
};
|
|
226
|
+
}));
|
|
227
|
+
//# sourceMappingURL=edge-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge-repo.js","sourceRoot":"","sources":["../../src/repo/edge-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import type { FileLearning, CreateFileLearningInput } from "@jamesaphoenix/tx-types";
|
|
5
|
+
declare const FileLearningRepository_base: Context.TagClass<FileLearningRepository, "FileLearningRepository", {
|
|
6
|
+
readonly insert: (input: CreateFileLearningInput) => Effect.Effect<FileLearning, DatabaseError>;
|
|
7
|
+
readonly findById: (id: number) => Effect.Effect<FileLearning | null, DatabaseError>;
|
|
8
|
+
readonly findAll: () => Effect.Effect<readonly FileLearning[], DatabaseError>;
|
|
9
|
+
readonly findByPath: (path: string) => Effect.Effect<readonly FileLearning[], DatabaseError>;
|
|
10
|
+
readonly remove: (id: number) => Effect.Effect<void, DatabaseError>;
|
|
11
|
+
readonly count: () => Effect.Effect<number, DatabaseError>;
|
|
12
|
+
}>;
|
|
13
|
+
export declare class FileLearningRepository extends FileLearningRepository_base {
|
|
14
|
+
}
|
|
15
|
+
export declare const FileLearningRepositoryLive: Layer.Layer<FileLearningRepository, never, SqliteClient>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=file-learning-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-learning-repo.d.ts","sourceRoot":"","sources":["../../src/repo/file-learning-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAmB,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;;qBAKhF,CAAC,KAAK,EAAE,uBAAuB,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,aAAa,CAAC;uBAC5E,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,EAAE,aAAa,CAAC;sBAClE,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;yBACxD,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;qBAC3E,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;oBACnD,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;;AAR9D,qBAAa,sBAAuB,SAAQ,2BAUzC;CAAG;AAEN,eAAO,MAAM,0BAA0B,0DA+EtC,CAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import { rowToFileLearning, matchesPattern } from "../mappers/file-learning.js";
|
|
5
|
+
export class FileLearningRepository extends Context.Tag("FileLearningRepository")() {
|
|
6
|
+
}
|
|
7
|
+
export const FileLearningRepositoryLive = Layer.effect(FileLearningRepository, Effect.gen(function* () {
|
|
8
|
+
const db = yield* SqliteClient;
|
|
9
|
+
return {
|
|
10
|
+
insert: (input) => Effect.try({
|
|
11
|
+
try: () => {
|
|
12
|
+
const now = new Date().toISOString();
|
|
13
|
+
const result = db.prepare(`INSERT INTO file_learnings (file_pattern, note, task_id, created_at)
|
|
14
|
+
VALUES (?, ?, ?, ?)`).run(input.filePattern, input.note, input.taskId ?? null, now);
|
|
15
|
+
// Fetch the inserted row
|
|
16
|
+
const row = db.prepare("SELECT * FROM file_learnings WHERE id = ?").get(result.lastInsertRowid);
|
|
17
|
+
return rowToFileLearning(row);
|
|
18
|
+
},
|
|
19
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
20
|
+
}),
|
|
21
|
+
findById: (id) => Effect.try({
|
|
22
|
+
try: () => {
|
|
23
|
+
const row = db.prepare("SELECT * FROM file_learnings WHERE id = ?").get(id);
|
|
24
|
+
return row ? rowToFileLearning(row) : null;
|
|
25
|
+
},
|
|
26
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
27
|
+
}),
|
|
28
|
+
findAll: () => Effect.try({
|
|
29
|
+
try: () => {
|
|
30
|
+
const rows = db.prepare(`SELECT * FROM file_learnings ORDER BY created_at DESC`).all();
|
|
31
|
+
return rows.map(rowToFileLearning);
|
|
32
|
+
},
|
|
33
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
34
|
+
}),
|
|
35
|
+
findByPath: (path) => Effect.try({
|
|
36
|
+
try: () => {
|
|
37
|
+
// Get all file learnings and filter by pattern matching
|
|
38
|
+
const rows = db.prepare(`SELECT * FROM file_learnings ORDER BY created_at DESC`).all();
|
|
39
|
+
return rows
|
|
40
|
+
.filter(row => matchesPattern(row.file_pattern, path))
|
|
41
|
+
.map(rowToFileLearning);
|
|
42
|
+
},
|
|
43
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
44
|
+
}),
|
|
45
|
+
remove: (id) => Effect.try({
|
|
46
|
+
try: () => {
|
|
47
|
+
db.prepare("DELETE FROM file_learnings WHERE id = ?").run(id);
|
|
48
|
+
},
|
|
49
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
50
|
+
}),
|
|
51
|
+
count: () => Effect.try({
|
|
52
|
+
try: () => {
|
|
53
|
+
const result = db.prepare("SELECT COUNT(*) as cnt FROM file_learnings").get();
|
|
54
|
+
return result.cnt;
|
|
55
|
+
},
|
|
56
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
57
|
+
})
|
|
58
|
+
};
|
|
59
|
+
}));
|
|
60
|
+
//# sourceMappingURL=file-learning-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-learning-repo.js","sourceRoot":"","sources":["../../src/repo/file-learning-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tx/core/repo - Repository exports
|
|
3
|
+
*/
|
|
4
|
+
export { TaskRepository, TaskRepositoryLive } from "./task-repo.js";
|
|
5
|
+
export { DependencyRepository, DependencyRepositoryLive } from "./dep-repo.js";
|
|
6
|
+
export { LearningRepository, LearningRepositoryLive, type BM25Result } from "./learning-repo.js";
|
|
7
|
+
export { FileLearningRepository, FileLearningRepositoryLive } from "./file-learning-repo.js";
|
|
8
|
+
export { AttemptRepository, AttemptRepositoryLive } from "./attempt-repo.js";
|
|
9
|
+
export { RunRepository, RunRepositoryLive } from "./run-repo.js";
|
|
10
|
+
export { AnchorRepository, AnchorRepositoryLive } from "./anchor-repo.js";
|
|
11
|
+
export { EdgeRepository, EdgeRepositoryLive } from "./edge-repo.js";
|
|
12
|
+
export { DeduplicationRepository, DeduplicationRepositoryLive } from "./deduplication-repo.js";
|
|
13
|
+
export { CandidateRepository, CandidateRepositoryLive } from "./candidate-repo.js";
|
|
14
|
+
export { TrackedProjectRepository, TrackedProjectRepositoryLive } from "./tracked-project-repo.js";
|
|
15
|
+
export { WorkerRepository, WorkerRepositoryLive } from "./worker-repo.js";
|
|
16
|
+
export { ClaimRepository, ClaimRepositoryLive } from "./claim-repo.js";
|
|
17
|
+
export { OrchestratorStateRepository, OrchestratorStateRepositoryLive, type OrchestratorStateUpdate } from "./orchestrator-state-repo.js";
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repo/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAChG,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAC5F,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAC9F,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAClF,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAClG,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACtE,OAAO,EAAE,2BAA2B,EAAE,+BAA+B,EAAE,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tx/core/repo - Repository exports
|
|
3
|
+
*/
|
|
4
|
+
export { TaskRepository, TaskRepositoryLive } from "./task-repo.js";
|
|
5
|
+
export { DependencyRepository, DependencyRepositoryLive } from "./dep-repo.js";
|
|
6
|
+
export { LearningRepository, LearningRepositoryLive } from "./learning-repo.js";
|
|
7
|
+
export { FileLearningRepository, FileLearningRepositoryLive } from "./file-learning-repo.js";
|
|
8
|
+
export { AttemptRepository, AttemptRepositoryLive } from "./attempt-repo.js";
|
|
9
|
+
export { RunRepository, RunRepositoryLive } from "./run-repo.js";
|
|
10
|
+
export { AnchorRepository, AnchorRepositoryLive } from "./anchor-repo.js";
|
|
11
|
+
export { EdgeRepository, EdgeRepositoryLive } from "./edge-repo.js";
|
|
12
|
+
export { DeduplicationRepository, DeduplicationRepositoryLive } from "./deduplication-repo.js";
|
|
13
|
+
export { CandidateRepository, CandidateRepositoryLive } from "./candidate-repo.js";
|
|
14
|
+
export { TrackedProjectRepository, TrackedProjectRepositoryLive } from "./tracked-project-repo.js";
|
|
15
|
+
export { WorkerRepository, WorkerRepositoryLive } from "./worker-repo.js";
|
|
16
|
+
export { ClaimRepository, ClaimRepositoryLive } from "./claim-repo.js";
|
|
17
|
+
export { OrchestratorStateRepository, OrchestratorStateRepositoryLive } from "./orchestrator-state-repo.js";
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/repo/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAmB,MAAM,oBAAoB,CAAA;AAChG,OAAO,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAC5F,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAChE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACnE,OAAO,EAAE,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAC9F,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AAClF,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAClG,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACtE,OAAO,EAAE,2BAA2B,EAAE,+BAA+B,EAAgC,MAAM,8BAA8B,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import type { Learning, CreateLearningInput } from "@jamesaphoenix/tx-types";
|
|
5
|
+
/** Scored learning result from BM25 search */
|
|
6
|
+
export interface BM25Result {
|
|
7
|
+
learning: Learning;
|
|
8
|
+
score: number;
|
|
9
|
+
}
|
|
10
|
+
declare const LearningRepository_base: Context.TagClass<LearningRepository, "LearningRepository", {
|
|
11
|
+
readonly insert: (input: CreateLearningInput) => Effect.Effect<Learning, DatabaseError>;
|
|
12
|
+
readonly findById: (id: number) => Effect.Effect<Learning | null, DatabaseError>;
|
|
13
|
+
readonly findAll: () => Effect.Effect<readonly Learning[], DatabaseError>;
|
|
14
|
+
readonly findRecent: (limit: number) => Effect.Effect<readonly Learning[], DatabaseError>;
|
|
15
|
+
readonly bm25Search: (query: string, limit: number) => Effect.Effect<readonly BM25Result[], DatabaseError>;
|
|
16
|
+
/** Find learnings that have embeddings (for vector search) */
|
|
17
|
+
readonly findWithEmbeddings: (limit: number) => Effect.Effect<readonly Learning[], DatabaseError>;
|
|
18
|
+
readonly incrementUsage: (id: number) => Effect.Effect<void, DatabaseError>;
|
|
19
|
+
readonly incrementUsageMany: (ids: readonly number[]) => Effect.Effect<void, DatabaseError>;
|
|
20
|
+
readonly updateOutcomeScore: (id: number, score: number) => Effect.Effect<void, DatabaseError>;
|
|
21
|
+
readonly updateEmbedding: (id: number, embedding: Float32Array) => Effect.Effect<void, DatabaseError>;
|
|
22
|
+
readonly remove: (id: number) => Effect.Effect<void, DatabaseError>;
|
|
23
|
+
readonly count: () => Effect.Effect<number, DatabaseError>;
|
|
24
|
+
readonly countWithEmbeddings: () => Effect.Effect<number, DatabaseError>;
|
|
25
|
+
readonly getConfig: (key: string) => Effect.Effect<string | null, DatabaseError>;
|
|
26
|
+
}>;
|
|
27
|
+
export declare class LearningRepository extends LearningRepository_base {
|
|
28
|
+
}
|
|
29
|
+
export declare const LearningRepositoryLive: Layer.Layer<LearningRepository, never, SqliteClient>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=learning-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-repo.d.ts","sourceRoot":"","sources":["../../src/repo/learning-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,KAAK,EAAE,QAAQ,EAAoC,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAE9G,8CAA8C;AAC9C,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;;qBAKoB,CAAC,KAAK,EAAE,mBAAmB,KAAK,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;uBACpE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,EAAE,aAAa,CAAC;sBAC9D,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,QAAQ,EAAE,EAAE,aAAa,CAAC;yBACpD,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,QAAQ,EAAE,EAAE,aAAa,CAAC;yBACpE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,UAAU,EAAE,EAAE,aAAa,CAAC;IAC1G,8DAA8D;iCACjC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,QAAQ,EAAE,EAAE,aAAa,CAAC;6BACxE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;iCAC9C,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;iCAC9D,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;8BACpE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;qBACpF,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;oBACnD,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;kCAC5B,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;wBACpD,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,EAAE,aAAa,CAAC;;AAjBpF,qBAAa,kBAAmB,SAAQ,uBAmBrC;CAAG;AA0CN,eAAO,MAAM,sBAAsB,sDAkLlC,CAAA"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import { rowToLearning, float32ArrayToBuffer } from "../mappers/learning.js";
|
|
5
|
+
export class LearningRepository extends Context.Tag("LearningRepository")() {
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Build a three-tier FTS5 query for optimal relevance:
|
|
9
|
+
* 1. Exact phrase match (highest priority)
|
|
10
|
+
* 2. Proximity match with NEAR (terms close together)
|
|
11
|
+
* 3. OR match (any term matches)
|
|
12
|
+
*
|
|
13
|
+
* Adapted from qmd search implementation.
|
|
14
|
+
*/
|
|
15
|
+
const buildFTS5Query = (query) => {
|
|
16
|
+
// Sanitize query: remove special chars except apostrophes
|
|
17
|
+
const sanitized = query.replace(/[^\w\s']/g, "").trim();
|
|
18
|
+
// Extract terms (at least 2 chars)
|
|
19
|
+
const terms = query
|
|
20
|
+
.split(/\s+/)
|
|
21
|
+
.map(t => t.replace(/[^\w']/g, ""))
|
|
22
|
+
.filter(t => t.length >= 2);
|
|
23
|
+
if (terms.length === 0)
|
|
24
|
+
return "";
|
|
25
|
+
if (terms.length === 1) {
|
|
26
|
+
// Single term: just escape it
|
|
27
|
+
return `"${terms[0].replace(/"/g, '""')}"`;
|
|
28
|
+
}
|
|
29
|
+
// Quote each term for safety
|
|
30
|
+
const quoted = terms.map(t => `"${t.replace(/"/g, '""')}"`);
|
|
31
|
+
// Three-tier query:
|
|
32
|
+
// 1. Exact phrase (highest relevance)
|
|
33
|
+
const phrase = `"${sanitized.replace(/"/g, '""')}"`;
|
|
34
|
+
// 2. NEAR proximity (terms within 10 words)
|
|
35
|
+
const near = `NEAR(${quoted.join(" ")}, 10)`;
|
|
36
|
+
// 3. OR match (any term)
|
|
37
|
+
const or = quoted.join(" OR ");
|
|
38
|
+
return `(${phrase}) OR (${near}) OR (${or})`;
|
|
39
|
+
};
|
|
40
|
+
export const LearningRepositoryLive = Layer.effect(LearningRepository, Effect.gen(function* () {
|
|
41
|
+
const db = yield* SqliteClient;
|
|
42
|
+
return {
|
|
43
|
+
insert: (input) => Effect.try({
|
|
44
|
+
try: () => {
|
|
45
|
+
const now = new Date().toISOString();
|
|
46
|
+
const result = db.prepare(`INSERT INTO learnings (content, source_type, source_ref, created_at, keywords, category)
|
|
47
|
+
VALUES (?, ?, ?, ?, ?, ?)`).run(input.content, input.sourceType ?? "manual", input.sourceRef ?? null, now, input.keywords ? JSON.stringify(input.keywords) : null, input.category ?? null);
|
|
48
|
+
// Fetch the inserted row
|
|
49
|
+
const row = db.prepare("SELECT * FROM learnings WHERE id = ?").get(result.lastInsertRowid);
|
|
50
|
+
return rowToLearning(row);
|
|
51
|
+
},
|
|
52
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
53
|
+
}),
|
|
54
|
+
findById: (id) => Effect.try({
|
|
55
|
+
try: () => {
|
|
56
|
+
const row = db.prepare("SELECT * FROM learnings WHERE id = ?").get(id);
|
|
57
|
+
return row ? rowToLearning(row) : null;
|
|
58
|
+
},
|
|
59
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
60
|
+
}),
|
|
61
|
+
findAll: () => Effect.try({
|
|
62
|
+
try: () => {
|
|
63
|
+
const rows = db.prepare(`SELECT * FROM learnings ORDER BY created_at ASC`).all();
|
|
64
|
+
return rows.map(rowToLearning);
|
|
65
|
+
},
|
|
66
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
67
|
+
}),
|
|
68
|
+
findRecent: (limit) => Effect.try({
|
|
69
|
+
try: () => {
|
|
70
|
+
const rows = db.prepare(`SELECT * FROM learnings ORDER BY created_at DESC LIMIT ?`).all(limit);
|
|
71
|
+
return rows.map(rowToLearning);
|
|
72
|
+
},
|
|
73
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
74
|
+
}),
|
|
75
|
+
bm25Search: (query, limit) => Effect.try({
|
|
76
|
+
try: () => {
|
|
77
|
+
const ftsQuery = buildFTS5Query(query);
|
|
78
|
+
if (!ftsQuery)
|
|
79
|
+
return [];
|
|
80
|
+
// FTS5 BM25 returns negative scores; lower (more negative) = better match
|
|
81
|
+
const rows = db.prepare(`
|
|
82
|
+
SELECT l.*, bm25(learnings_fts) as bm25_score
|
|
83
|
+
FROM learnings l
|
|
84
|
+
JOIN learnings_fts ON l.id = learnings_fts.rowid
|
|
85
|
+
WHERE learnings_fts MATCH ?
|
|
86
|
+
ORDER BY bm25_score
|
|
87
|
+
LIMIT ?
|
|
88
|
+
`).all(ftsQuery, limit * 3);
|
|
89
|
+
if (rows.length === 0)
|
|
90
|
+
return [];
|
|
91
|
+
// Use rank-based scoring: results are already sorted by relevance
|
|
92
|
+
// Best match gets 1.0, decays with rank
|
|
93
|
+
// Formula: score = 1.0 / (1 + rank * 0.1) gives 1.0, 0.91, 0.83, ...
|
|
94
|
+
return rows.map((row, rank) => ({
|
|
95
|
+
learning: rowToLearning(row),
|
|
96
|
+
score: 1.0 / (1 + rank * 0.1)
|
|
97
|
+
}));
|
|
98
|
+
},
|
|
99
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
100
|
+
}),
|
|
101
|
+
findWithEmbeddings: (limit) => Effect.try({
|
|
102
|
+
try: () => {
|
|
103
|
+
const rows = db.prepare(`SELECT * FROM learnings WHERE embedding IS NOT NULL ORDER BY created_at DESC LIMIT ?`).all(limit);
|
|
104
|
+
return rows.map(rowToLearning);
|
|
105
|
+
},
|
|
106
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
107
|
+
}),
|
|
108
|
+
incrementUsage: (id) => Effect.try({
|
|
109
|
+
try: () => {
|
|
110
|
+
db.prepare(`UPDATE learnings SET usage_count = usage_count + 1, last_used_at = ? WHERE id = ?`).run(new Date().toISOString(), id);
|
|
111
|
+
},
|
|
112
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
113
|
+
}),
|
|
114
|
+
incrementUsageMany: (ids) => Effect.try({
|
|
115
|
+
try: () => {
|
|
116
|
+
if (ids.length === 0)
|
|
117
|
+
return;
|
|
118
|
+
const now = new Date().toISOString();
|
|
119
|
+
const placeholders = ids.map(() => "?").join(", ");
|
|
120
|
+
db.prepare(`UPDATE learnings SET usage_count = usage_count + 1, last_used_at = ? WHERE id IN (${placeholders})`).run(now, ...ids);
|
|
121
|
+
},
|
|
122
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
123
|
+
}),
|
|
124
|
+
updateOutcomeScore: (id, score) => Effect.try({
|
|
125
|
+
try: () => {
|
|
126
|
+
db.prepare(`UPDATE learnings SET outcome_score = ? WHERE id = ?`).run(score, id);
|
|
127
|
+
},
|
|
128
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
129
|
+
}),
|
|
130
|
+
updateEmbedding: (id, embedding) => Effect.try({
|
|
131
|
+
try: () => {
|
|
132
|
+
db.prepare(`UPDATE learnings SET embedding = ? WHERE id = ?`).run(float32ArrayToBuffer(embedding), id);
|
|
133
|
+
},
|
|
134
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
135
|
+
}),
|
|
136
|
+
remove: (id) => Effect.try({
|
|
137
|
+
try: () => {
|
|
138
|
+
db.prepare("DELETE FROM learnings WHERE id = ?").run(id);
|
|
139
|
+
},
|
|
140
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
141
|
+
}),
|
|
142
|
+
count: () => Effect.try({
|
|
143
|
+
try: () => {
|
|
144
|
+
const result = db.prepare("SELECT COUNT(*) as cnt FROM learnings").get();
|
|
145
|
+
return result.cnt;
|
|
146
|
+
},
|
|
147
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
148
|
+
}),
|
|
149
|
+
countWithEmbeddings: () => Effect.try({
|
|
150
|
+
try: () => {
|
|
151
|
+
const result = db.prepare("SELECT COUNT(*) as cnt FROM learnings WHERE embedding IS NOT NULL").get();
|
|
152
|
+
return result.cnt;
|
|
153
|
+
},
|
|
154
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
155
|
+
}),
|
|
156
|
+
getConfig: (key) => Effect.try({
|
|
157
|
+
try: () => {
|
|
158
|
+
const row = db.prepare("SELECT value FROM learnings_config WHERE key = ?").get(key);
|
|
159
|
+
return row?.value ?? null;
|
|
160
|
+
},
|
|
161
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
162
|
+
})
|
|
163
|
+
};
|
|
164
|
+
}));
|
|
165
|
+
//# sourceMappingURL=learning-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"learning-repo.js","sourceRoot":"","sources":["../../src/repo/learning-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError } from "../errors.js";
|
|
4
|
+
import type { OrchestratorState } from "../schemas/worker.js";
|
|
5
|
+
/**
|
|
6
|
+
* Partial update type for OrchestratorState (all fields optional).
|
|
7
|
+
*/
|
|
8
|
+
export type OrchestratorStateUpdate = Partial<Omit<OrchestratorState, "metadata">> & {
|
|
9
|
+
metadata?: Record<string, unknown>;
|
|
10
|
+
};
|
|
11
|
+
declare const OrchestratorStateRepository_base: Context.TagClass<OrchestratorStateRepository, "OrchestratorStateRepository", {
|
|
12
|
+
/**
|
|
13
|
+
* Get the singleton orchestrator state.
|
|
14
|
+
* Initializes the state if it doesn't exist (should never happen with proper migration).
|
|
15
|
+
*/
|
|
16
|
+
readonly get: () => Effect.Effect<OrchestratorState, DatabaseError>;
|
|
17
|
+
/**
|
|
18
|
+
* Update the singleton orchestrator state.
|
|
19
|
+
* Only updates the fields provided in the partial update.
|
|
20
|
+
*/
|
|
21
|
+
readonly update: (partial: OrchestratorStateUpdate) => Effect.Effect<void, DatabaseError>;
|
|
22
|
+
}>;
|
|
23
|
+
export declare class OrchestratorStateRepository extends OrchestratorStateRepository_base {
|
|
24
|
+
}
|
|
25
|
+
export declare const OrchestratorStateRepositoryLive: Layer.Layer<OrchestratorStateRepository, never, SqliteClient>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=orchestrator-state-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator-state-repo.d.ts","sourceRoot":"","sources":["../../src/repo/orchestrator-state-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAE7D;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC,GAAG;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC,CAAA;;IAKG;;;OAGG;kBACW,MAAM,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC;IACnE;;;OAGG;qBACc,CAAC,OAAO,EAAE,uBAAuB,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;;AAZ7F,qBAAa,2BAA4B,SAAQ,gCAc9C;CAAG;AAiBN,eAAO,MAAM,+BAA+B,+DAuG3C,CAAA"}
|