@jamesaphoenix/tx-core 0.4.5 → 0.5.0
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 +4 -9
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +6 -80
- package/dist/db.js.map +1 -1
- package/dist/errors.d.ts +67 -10
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +44 -10
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +12 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -28
- package/dist/index.js.map +1 -1
- package/dist/layer.d.ts +22 -10
- package/dist/layer.d.ts.map +1 -1
- package/dist/layer.js +97 -39
- package/dist/layer.js.map +1 -1
- package/dist/mappers/anchor.d.ts +28 -0
- package/dist/mappers/anchor.d.ts.map +1 -0
- package/dist/mappers/anchor.js +105 -0
- package/dist/mappers/anchor.js.map +1 -0
- package/dist/mappers/candidate.d.ts +25 -0
- package/dist/mappers/candidate.d.ts.map +1 -0
- package/dist/mappers/candidate.js +83 -0
- package/dist/mappers/candidate.js.map +1 -0
- package/dist/mappers/doc.d.ts +2 -4
- package/dist/mappers/doc.d.ts.map +1 -1
- package/dist/mappers/doc.js +7 -4
- package/dist/mappers/doc.js.map +1 -1
- package/dist/mappers/edge.d.ts +19 -0
- package/dist/mappers/edge.d.ts.map +1 -0
- package/dist/mappers/edge.js +81 -0
- package/dist/mappers/edge.js.map +1 -0
- package/dist/mappers/index.d.ts +7 -3
- package/dist/mappers/index.d.ts.map +1 -1
- package/dist/mappers/index.js +14 -6
- package/dist/mappers/index.js.map +1 -1
- package/dist/mappers/message.d.ts +15 -0
- package/dist/mappers/message.d.ts.map +1 -0
- package/dist/mappers/message.js +58 -0
- package/dist/mappers/message.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 +245 -0
- package/dist/repo/anchor-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 +164 -0
- package/dist/repo/candidate-repo.js.map +1 -0
- package/dist/repo/compaction-repo.d.ts +41 -0
- package/dist/repo/compaction-repo.d.ts.map +1 -0
- package/dist/repo/compaction-repo.js +84 -0
- package/dist/repo/compaction-repo.js.map +1 -0
- package/dist/repo/doc-repo.d.ts +68 -51
- package/dist/repo/doc-repo.d.ts.map +1 -1
- package/dist/repo/doc-repo.js +120 -54
- package/dist/repo/doc-repo.js.map +1 -1
- 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 +258 -0
- package/dist/repo/edge-repo.js.map +1 -0
- package/dist/repo/index.d.ts +8 -3
- package/dist/repo/index.d.ts.map +1 -1
- package/dist/repo/index.js +7 -2
- package/dist/repo/index.js.map +1 -1
- package/dist/repo/message-repo.d.ts +55 -0
- package/dist/repo/message-repo.d.ts.map +1 -0
- package/dist/repo/message-repo.js +132 -0
- package/dist/repo/message-repo.js.map +1 -0
- package/dist/services/agent-service.d.ts +18 -23
- package/dist/services/agent-service.d.ts.map +1 -1
- package/dist/services/agent-service.js +9 -0
- package/dist/services/agent-service.js.map +1 -1
- 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 +102 -0
- package/dist/services/anchor-verification.d.ts.map +1 -0
- package/dist/services/anchor-verification.js +817 -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 +427 -0
- package/dist/services/ast-grep-service.js.map +1 -0
- package/dist/services/attempt-service.d.ts.map +1 -1
- package/dist/services/attempt-service.js +4 -1
- package/dist/services/attempt-service.js.map +1 -1
- package/dist/services/auto-sync-service.d.ts.map +1 -1
- package/dist/services/auto-sync-service.js +7 -7
- package/dist/services/auto-sync-service.js.map +1 -1
- package/dist/services/candidate-extractor-service.d.ts +44 -0
- package/dist/services/candidate-extractor-service.d.ts.map +1 -0
- package/dist/services/candidate-extractor-service.js +175 -0
- package/dist/services/candidate-extractor-service.js.map +1 -0
- package/dist/services/claim-service.d.ts.map +1 -1
- package/dist/services/claim-service.js +0 -8
- package/dist/services/claim-service.js.map +1 -1
- package/dist/services/compaction-service.d.ts +105 -0
- package/dist/services/compaction-service.d.ts.map +1 -0
- package/dist/services/compaction-service.js +281 -0
- package/dist/services/compaction-service.js.map +1 -0
- package/dist/services/cycle-scan-service.d.ts +1 -5
- package/dist/services/cycle-scan-service.d.ts.map +1 -1
- package/dist/services/cycle-scan-service.js +49 -19
- package/dist/services/cycle-scan-service.js.map +1 -1
- package/dist/services/daemon-service.d.ts +2 -8
- package/dist/services/daemon-service.d.ts.map +1 -1
- package/dist/services/daemon-service.js +21 -35
- package/dist/services/daemon-service.js.map +1 -1
- package/dist/services/doc-service.d.ts +25 -32
- package/dist/services/doc-service.d.ts.map +1 -1
- package/dist/services/doc-service.js +206 -190
- package/dist/services/doc-service.js.map +1 -1
- 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 +2 -2
- package/dist/services/embedding-service.d.ts.map +1 -1
- package/dist/services/embedding-service.js +7 -13
- package/dist/services/embedding-service.js.map +1 -1
- 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-watcher-service.d.ts.map +1 -1
- package/dist/services/file-watcher-service.js +1 -3
- package/dist/services/file-watcher-service.js.map +1 -1
- package/dist/services/graph-expansion.d.ts +158 -0
- package/dist/services/graph-expansion.d.ts.map +1 -0
- package/dist/services/graph-expansion.js +487 -0
- package/dist/services/graph-expansion.js.map +1 -0
- package/dist/services/index.d.ts +19 -8
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +18 -7
- package/dist/services/index.js.map +1 -1
- package/dist/services/learning-service.d.ts.map +1 -1
- package/dist/services/learning-service.js +22 -14
- package/dist/services/learning-service.js.map +1 -1
- package/dist/services/llm-service.d.ts +61 -39
- package/dist/services/llm-service.d.ts.map +1 -1
- package/dist/services/llm-service.js +199 -113
- package/dist/services/llm-service.js.map +1 -1
- package/dist/services/message-service.d.ts +57 -0
- package/dist/services/message-service.d.ts.map +1 -0
- package/dist/services/message-service.js +78 -0
- package/dist/services/message-service.js.map +1 -0
- package/dist/services/orchestrator-service.d.ts.map +1 -1
- package/dist/services/orchestrator-service.js +19 -20
- package/dist/services/orchestrator-service.js.map +1 -1
- 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 +7 -22
- package/dist/services/query-expansion-service.d.ts.map +1 -1
- package/dist/services/query-expansion-service.js +41 -75
- package/dist/services/query-expansion-service.js.map +1 -1
- package/dist/services/retriever-service.d.ts +8 -5
- package/dist/services/retriever-service.d.ts.map +1 -1
- package/dist/services/retriever-service.js +150 -15
- package/dist/services/retriever-service.js.map +1 -1
- 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 +406 -0
- package/dist/services/swarm-verification.js.map +1 -0
- package/dist/services/sync-service.d.ts.map +1 -1
- package/dist/services/sync-service.js +8 -9
- package/dist/services/sync-service.js.map +1 -1
- package/dist/services/task-service.d.ts.map +1 -1
- package/dist/services/task-service.js +3 -8
- package/dist/services/task-service.js.map +1 -1
- package/dist/services/tracing-service.js +6 -6
- package/dist/services/tracing-service.js.map +1 -1
- package/dist/services/transcript-adapter.d.ts.map +1 -1
- package/dist/services/transcript-adapter.js +1 -1
- package/dist/services/transcript-adapter.js.map +1 -1
- package/dist/services/worker-process.d.ts.map +1 -1
- package/dist/services/worker-process.js +8 -30
- package/dist/services/worker-process.js.map +1 -1
- package/dist/utils/doc-hash.d.ts +0 -4
- package/dist/utils/doc-hash.d.ts.map +1 -1
- package/dist/utils/doc-hash.js.map +1 -1
- package/dist/utils/doc-renderer.d.ts +31 -26
- package/dist/utils/doc-renderer.d.ts.map +1 -1
- package/dist/utils/doc-renderer.js +0 -7
- package/dist/utils/doc-renderer.js.map +1 -1
- package/dist/utils/llm-json.d.ts +17 -0
- package/dist/utils/llm-json.d.ts.map +1 -0
- package/dist/utils/llm-json.js +51 -0
- package/dist/utils/llm-json.js.map +1 -0
- package/dist/utils/toml-config.d.ts +10 -16
- package/dist/utils/toml-config.d.ts.map +1 -1
- package/dist/utils/toml-config.js +3 -1
- package/dist/utils/toml-config.js.map +1 -1
- package/dist/worker/run-worker.d.ts.map +1 -1
- package/dist/worker/run-worker.js +2 -7
- package/dist/worker/run-worker.js.map +1 -1
- package/package.json +9 -8
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError, EdgeNotFoundError } from "../errors.js";
|
|
4
|
+
import type { Edge, NodeType, EdgeType, CreateEdgeInput, UpdateEdgeInput, NeighborNode } from "@jamesaphoenix/tx-types";
|
|
5
|
+
declare const EdgeRepository_base: Context.TagClass<EdgeRepository, "EdgeRepository", {
|
|
6
|
+
readonly create: (input: CreateEdgeInput) => Effect.Effect<Edge, DatabaseError>;
|
|
7
|
+
readonly findById: (id: number) => Effect.Effect<Edge | null, DatabaseError>;
|
|
8
|
+
readonly findBySource: (sourceType: NodeType, sourceId: string) => Effect.Effect<readonly Edge[], DatabaseError>;
|
|
9
|
+
readonly findByTarget: (targetType: NodeType, targetId: string) => Effect.Effect<readonly Edge[], DatabaseError>;
|
|
10
|
+
readonly findByMultipleSources: (sourceType: NodeType, sourceIds: readonly string[]) => Effect.Effect<ReadonlyMap<string, readonly Edge[]>, DatabaseError>;
|
|
11
|
+
readonly findByEdgeType: (edgeType: EdgeType) => Effect.Effect<readonly Edge[], DatabaseError>;
|
|
12
|
+
readonly countByType: () => Effect.Effect<ReadonlyMap<EdgeType, number>, DatabaseError>;
|
|
13
|
+
readonly findNeighbors: (nodeType: NodeType, nodeId: string, options?: {
|
|
14
|
+
direction?: "outgoing" | "incoming" | "both";
|
|
15
|
+
edgeTypes?: readonly EdgeType[];
|
|
16
|
+
}) => Effect.Effect<readonly NeighborNode[], DatabaseError>;
|
|
17
|
+
readonly findPath: (fromType: NodeType, fromId: string, toType: NodeType, toId: string, maxDepth?: number) => Effect.Effect<readonly Edge[] | null, DatabaseError>;
|
|
18
|
+
readonly update: (id: number, input: UpdateEdgeInput) => Effect.Effect<Edge | null, DatabaseError>;
|
|
19
|
+
readonly invalidate: (id: number) => Effect.Effect<boolean, EdgeNotFoundError | DatabaseError>;
|
|
20
|
+
readonly findAll: (limit?: number) => Effect.Effect<readonly Edge[], DatabaseError>;
|
|
21
|
+
}>;
|
|
22
|
+
export declare class EdgeRepository extends EdgeRepository_base {
|
|
23
|
+
}
|
|
24
|
+
export declare const EdgeRepositoryLive: Layer.Layer<EdgeRepository, never, SqliteClient>;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=edge-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge-repo.d.ts","sourceRoot":"","sources":["../../src/repo/edge-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,iBAAiB,EAAoB,MAAM,cAAc,CAAA;AAGjF,OAAO,KAAK,EACV,IAAI,EAEJ,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,eAAe,EACf,YAAY,EACb,MAAM,yBAAyB,CAAA;;qBAKX,CAAC,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC;uBAC5D,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,EAAE,aAAa,CAAC;2BACrD,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;2BACzF,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;oCAChF,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC;6BACjI,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;0BACxE,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,aAAa,CAAC;4BAC/D,CACtB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAA;QAC5C,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAA;KAChC,KACE,MAAM,CAAC,MAAM,CAAC,SAAS,YAAY,EAAE,EAAE,aAAa,CAAC;uBACvC,CACjB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,QAAQ,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,GAAG,IAAI,EAAE,aAAa,CAAC;qBACxC,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,EAAE,aAAa,CAAC;yBAC7E,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,GAAG,aAAa,CAAC;sBAC5E,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,aAAa,CAAC;;AA3BvF,qBAAa,cAAe,SAAQ,mBA6BjC;CAAG;AAEN,eAAO,MAAM,kBAAkB,kDA2U9B,CAAA"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { Context, Effect, Layer } from "effect";
|
|
2
|
+
import { SqliteClient } from "../db.js";
|
|
3
|
+
import { DatabaseError, EdgeNotFoundError, EntityFetchError } from "../errors.js";
|
|
4
|
+
import { rowToEdge } from "../mappers/edge.js";
|
|
5
|
+
import { DEFAULT_QUERY_LIMIT } from "../utils/sql.js";
|
|
6
|
+
export class EdgeRepository extends Context.Tag("EdgeRepository")() {
|
|
7
|
+
}
|
|
8
|
+
export const EdgeRepositoryLive = Layer.effect(EdgeRepository, Effect.gen(function* () {
|
|
9
|
+
const db = yield* SqliteClient;
|
|
10
|
+
return {
|
|
11
|
+
create: (input) => Effect.try({
|
|
12
|
+
try: () => {
|
|
13
|
+
const result = db.prepare(`INSERT INTO learning_edges
|
|
14
|
+
(edge_type, source_type, source_id, target_type, target_id, weight, metadata)
|
|
15
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`).run(input.edgeType, input.sourceType, input.sourceId, input.targetType, input.targetId, input.weight ?? 1.0, JSON.stringify(input.metadata ?? {}));
|
|
16
|
+
const row = db.prepare("SELECT * FROM learning_edges WHERE id = ?").get(result.lastInsertRowid);
|
|
17
|
+
if (!row) {
|
|
18
|
+
throw new EntityFetchError({
|
|
19
|
+
entity: "edge",
|
|
20
|
+
id: result.lastInsertRowid,
|
|
21
|
+
operation: "insert"
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return rowToEdge(row);
|
|
25
|
+
},
|
|
26
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
27
|
+
}),
|
|
28
|
+
findById: (id) => Effect.try({
|
|
29
|
+
try: () => {
|
|
30
|
+
const row = db.prepare("SELECT * FROM learning_edges WHERE id = ? AND invalidated_at IS NULL").get(id);
|
|
31
|
+
return row ? rowToEdge(row) : null;
|
|
32
|
+
},
|
|
33
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
34
|
+
}),
|
|
35
|
+
findBySource: (sourceType, sourceId) => Effect.try({
|
|
36
|
+
try: () => {
|
|
37
|
+
const rows = db.prepare(`SELECT * FROM learning_edges
|
|
38
|
+
WHERE source_type = ? AND source_id = ? AND invalidated_at IS NULL
|
|
39
|
+
ORDER BY created_at ASC`).all(sourceType, sourceId);
|
|
40
|
+
return rows.map(rowToEdge);
|
|
41
|
+
},
|
|
42
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
43
|
+
}),
|
|
44
|
+
findByTarget: (targetType, targetId) => Effect.try({
|
|
45
|
+
try: () => {
|
|
46
|
+
const rows = db.prepare(`SELECT * FROM learning_edges
|
|
47
|
+
WHERE target_type = ? AND target_id = ? AND invalidated_at IS NULL
|
|
48
|
+
ORDER BY created_at ASC`).all(targetType, targetId);
|
|
49
|
+
return rows.map(rowToEdge);
|
|
50
|
+
},
|
|
51
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
52
|
+
}),
|
|
53
|
+
findByMultipleSources: (sourceType, sourceIds) => Effect.try({
|
|
54
|
+
try: () => {
|
|
55
|
+
// Return empty map for empty input
|
|
56
|
+
if (sourceIds.length === 0) {
|
|
57
|
+
return new Map();
|
|
58
|
+
}
|
|
59
|
+
// Build IN clause with placeholders
|
|
60
|
+
const placeholders = sourceIds.map(() => "?").join(", ");
|
|
61
|
+
const rows = db.prepare(`SELECT * FROM learning_edges
|
|
62
|
+
WHERE source_type = ? AND source_id IN (${placeholders}) AND invalidated_at IS NULL
|
|
63
|
+
ORDER BY weight DESC, created_at ASC`).all(sourceType, ...sourceIds);
|
|
64
|
+
// Group edges by source_id
|
|
65
|
+
const result = new Map();
|
|
66
|
+
// Initialize all requested sourceIds with empty arrays
|
|
67
|
+
for (const sourceId of sourceIds) {
|
|
68
|
+
result.set(sourceId, []);
|
|
69
|
+
}
|
|
70
|
+
// Populate with actual edges
|
|
71
|
+
for (const row of rows) {
|
|
72
|
+
const edge = rowToEdge(row);
|
|
73
|
+
const existing = result.get(row.source_id);
|
|
74
|
+
if (existing) {
|
|
75
|
+
existing.push(edge);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
},
|
|
80
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
81
|
+
}),
|
|
82
|
+
findByEdgeType: (edgeType) => Effect.try({
|
|
83
|
+
try: () => {
|
|
84
|
+
const rows = db.prepare(`SELECT * FROM learning_edges
|
|
85
|
+
WHERE edge_type = ? AND invalidated_at IS NULL
|
|
86
|
+
ORDER BY weight DESC, created_at ASC`).all(edgeType);
|
|
87
|
+
return rows.map(rowToEdge);
|
|
88
|
+
},
|
|
89
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
90
|
+
}),
|
|
91
|
+
countByType: () => Effect.try({
|
|
92
|
+
try: () => {
|
|
93
|
+
const rows = db.prepare(`SELECT edge_type, COUNT(*) as count FROM learning_edges
|
|
94
|
+
WHERE invalidated_at IS NULL
|
|
95
|
+
GROUP BY edge_type`).all();
|
|
96
|
+
const result = new Map();
|
|
97
|
+
for (const row of rows) {
|
|
98
|
+
result.set(row.edge_type, row.count);
|
|
99
|
+
}
|
|
100
|
+
return result;
|
|
101
|
+
},
|
|
102
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
103
|
+
}),
|
|
104
|
+
findNeighbors: (nodeType, nodeId, options = {}) => Effect.try({
|
|
105
|
+
try: () => {
|
|
106
|
+
const direction = options.direction ?? "both";
|
|
107
|
+
const edgeTypes = options.edgeTypes;
|
|
108
|
+
const neighbors = [];
|
|
109
|
+
// Build edge type filter clause
|
|
110
|
+
const edgeTypeFilter = edgeTypes && edgeTypes.length > 0
|
|
111
|
+
? `AND edge_type IN (${edgeTypes.map(() => "?").join(", ")})`
|
|
112
|
+
: "";
|
|
113
|
+
const edgeTypeParams = edgeTypes ?? [];
|
|
114
|
+
// Outgoing edges (this node is the source)
|
|
115
|
+
if (direction === "outgoing" || direction === "both") {
|
|
116
|
+
const outgoingRows = db.prepare(`SELECT * FROM learning_edges
|
|
117
|
+
WHERE source_type = ? AND source_id = ? AND invalidated_at IS NULL
|
|
118
|
+
${edgeTypeFilter}
|
|
119
|
+
ORDER BY weight DESC, created_at ASC`).all(nodeType, nodeId, ...edgeTypeParams);
|
|
120
|
+
for (const row of outgoingRows) {
|
|
121
|
+
neighbors.push({
|
|
122
|
+
nodeType: row.target_type,
|
|
123
|
+
nodeId: row.target_id,
|
|
124
|
+
edgeType: row.edge_type,
|
|
125
|
+
weight: row.weight,
|
|
126
|
+
direction: "outgoing"
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Incoming edges (this node is the target)
|
|
131
|
+
if (direction === "incoming" || direction === "both") {
|
|
132
|
+
const incomingRows = db.prepare(`SELECT * FROM learning_edges
|
|
133
|
+
WHERE target_type = ? AND target_id = ? AND invalidated_at IS NULL
|
|
134
|
+
${edgeTypeFilter}
|
|
135
|
+
ORDER BY weight DESC, created_at ASC`).all(nodeType, nodeId, ...edgeTypeParams);
|
|
136
|
+
for (const row of incomingRows) {
|
|
137
|
+
neighbors.push({
|
|
138
|
+
nodeType: row.source_type,
|
|
139
|
+
nodeId: row.source_id,
|
|
140
|
+
edgeType: row.edge_type,
|
|
141
|
+
weight: row.weight,
|
|
142
|
+
direction: "incoming"
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return neighbors;
|
|
147
|
+
},
|
|
148
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
149
|
+
}),
|
|
150
|
+
findPath: (fromType, fromId, toType, toId, maxDepth = 5) => Effect.try({
|
|
151
|
+
try: () => {
|
|
152
|
+
// Recursive CTE performs BFS in a single query (eliminates N+1 pattern)
|
|
153
|
+
// Uses UNION ALL with delimiter-based visited tracking to prevent cycles
|
|
154
|
+
// Similar pattern to hasPath CTE in dep-repo.ts
|
|
155
|
+
const result = db.prepare(`
|
|
156
|
+
WITH RECURSIVE bfs(node_type, node_id, depth, edge_path, visited) AS (
|
|
157
|
+
-- Base case: starting node at depth 0
|
|
158
|
+
SELECT ?, ?, 0, '',
|
|
159
|
+
'|' || ? || ':' || ? || '|'
|
|
160
|
+
|
|
161
|
+
UNION ALL
|
|
162
|
+
|
|
163
|
+
-- Recursive case: follow outgoing edges from current frontier
|
|
164
|
+
SELECT
|
|
165
|
+
e.target_type,
|
|
166
|
+
e.target_id,
|
|
167
|
+
b.depth + 1,
|
|
168
|
+
CASE WHEN b.edge_path = ''
|
|
169
|
+
THEN CAST(e.id AS TEXT)
|
|
170
|
+
ELSE b.edge_path || ',' || CAST(e.id AS TEXT)
|
|
171
|
+
END,
|
|
172
|
+
b.visited || e.target_type || ':' || e.target_id || '|'
|
|
173
|
+
FROM learning_edges e
|
|
174
|
+
JOIN bfs b ON e.source_type = b.node_type
|
|
175
|
+
AND e.source_id = b.node_id
|
|
176
|
+
WHERE e.invalidated_at IS NULL
|
|
177
|
+
AND b.depth < ?
|
|
178
|
+
AND instr(b.visited, '|' || e.target_type || ':' || e.target_id || '|') = 0
|
|
179
|
+
)
|
|
180
|
+
SELECT edge_path FROM bfs
|
|
181
|
+
WHERE node_type = ? AND node_id = ?
|
|
182
|
+
AND edge_path != ''
|
|
183
|
+
ORDER BY depth ASC
|
|
184
|
+
LIMIT 1
|
|
185
|
+
`).get(fromType, fromId, // CTE base: starting node
|
|
186
|
+
fromType, fromId, // CTE base: initial visited set
|
|
187
|
+
maxDepth, // depth limit
|
|
188
|
+
toType, toId // final filter: target node
|
|
189
|
+
);
|
|
190
|
+
if (!result)
|
|
191
|
+
return null;
|
|
192
|
+
// Fetch full edge objects in a single query
|
|
193
|
+
const edgeIds = result.edge_path.split(',').map(Number);
|
|
194
|
+
const placeholders = edgeIds.map(() => '?').join(', ');
|
|
195
|
+
const edgeRows = db.prepare(`SELECT * FROM learning_edges WHERE id IN (${placeholders})`).all(...edgeIds);
|
|
196
|
+
// Maintain path order from CTE traversal
|
|
197
|
+
const edgeMap = new Map(edgeRows.map(row => [row.id, rowToEdge(row)]));
|
|
198
|
+
return edgeIds.map(id => edgeMap.get(id)).filter((e) => e != null);
|
|
199
|
+
},
|
|
200
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
201
|
+
}),
|
|
202
|
+
update: (id, input) => Effect.try({
|
|
203
|
+
try: () => {
|
|
204
|
+
const updates = [];
|
|
205
|
+
const values = [];
|
|
206
|
+
if (input.weight !== undefined) {
|
|
207
|
+
updates.push("weight = ?");
|
|
208
|
+
values.push(input.weight);
|
|
209
|
+
}
|
|
210
|
+
if (input.metadata !== undefined) {
|
|
211
|
+
updates.push("metadata = ?");
|
|
212
|
+
values.push(JSON.stringify(input.metadata));
|
|
213
|
+
}
|
|
214
|
+
if (updates.length === 0) {
|
|
215
|
+
const row = db.prepare("SELECT * FROM learning_edges WHERE id = ? AND invalidated_at IS NULL").get(id);
|
|
216
|
+
return row ? rowToEdge(row) : null;
|
|
217
|
+
}
|
|
218
|
+
values.push(id);
|
|
219
|
+
const result = db.prepare(`UPDATE learning_edges SET ${updates.join(", ")} WHERE id = ? AND invalidated_at IS NULL`).run(...values);
|
|
220
|
+
if (result.changes === 0) {
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
const row = db.prepare("SELECT * FROM learning_edges WHERE id = ?").get(id);
|
|
224
|
+
if (!row) {
|
|
225
|
+
throw new EntityFetchError({
|
|
226
|
+
entity: "edge",
|
|
227
|
+
id,
|
|
228
|
+
operation: "update"
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
return rowToEdge(row);
|
|
232
|
+
},
|
|
233
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
234
|
+
}),
|
|
235
|
+
invalidate: (id) => Effect.try({
|
|
236
|
+
try: () => {
|
|
237
|
+
const result = db.prepare("UPDATE learning_edges SET invalidated_at = datetime('now') WHERE id = ? AND invalidated_at IS NULL").run(id);
|
|
238
|
+
if (result.changes === 0) {
|
|
239
|
+
throw new EdgeNotFoundError({ id });
|
|
240
|
+
}
|
|
241
|
+
return true;
|
|
242
|
+
},
|
|
243
|
+
catch: (cause) => {
|
|
244
|
+
if (cause instanceof EdgeNotFoundError)
|
|
245
|
+
throw cause;
|
|
246
|
+
throw new DatabaseError({ cause });
|
|
247
|
+
}
|
|
248
|
+
}),
|
|
249
|
+
findAll: (limit) => Effect.try({
|
|
250
|
+
try: () => {
|
|
251
|
+
const rows = db.prepare("SELECT * FROM learning_edges WHERE invalidated_at IS NULL ORDER BY created_at ASC LIMIT ?").all(limit ?? DEFAULT_QUERY_LIMIT);
|
|
252
|
+
return rows.map(rowToEdge);
|
|
253
|
+
},
|
|
254
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
255
|
+
})
|
|
256
|
+
};
|
|
257
|
+
}));
|
|
258
|
+
//# sourceMappingURL=edge-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edge-repo.js","sourceRoot":"","sources":["../../src/repo/edge-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,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAWrD,MAAM,OAAO,cAAe,SAAQ,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EA6B9D;CAAG;AAEN,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAC5C,cAAc,EACd,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,YAAY,CAAA;IAE9B,OAAO;QACL,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAChB,MAAM,CAAC,GAAG,CAAC;YACT,GAAG,EAAE,GAAG,EAAE;gBACR,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB;;4CAE8B,CAC/B,CAAC,GAAG,CACH,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,MAAM,IAAI,GAAG,EACnB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC,CACrC,CAAA;gBACD,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,CAAwB,CAAA;gBACtH,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,MAAM,IAAI,gBAAgB,CAAC;wBACzB,MAAM,EAAE,MAAM;wBACd,EAAE,EAAE,MAAM,CAAC,eAAyB;wBACpC,SAAS,EAAE,QAAQ;qBACpB,CAAC,CAAA;gBACJ,CAAC;gBACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAA;YACvB,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;SAC/C,CAAC;QAEJ,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CACf,MAAM,CAAC,GAAG,CAAC;YACT,GAAG,EAAE,GAAG,EAAE;gBACR,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,sEAAsE,CACvE,CAAC,GAAG,CAAC,EAAE,CAAwB,CAAA;gBAChC,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACpC,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;SAC/C,CAAC;QAEJ,YAAY,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CACrC,MAAM,CAAC,GAAG,CAAC;YACT,GAAG,EAAE,GAAG,EAAE;gBACR,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;uCAEyB,CAC1B,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAc,CAAA;gBACxC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAC5B,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;SAC/C,CAAC;QAEJ,YAAY,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,EAAE,CACrC,MAAM,CAAC,GAAG,CAAC;YACT,GAAG,EAAE,GAAG,EAAE;gBACR,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;uCAEyB,CAC1B,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAc,CAAA;gBACxC,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAC5B,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;SAC/C,CAAC;QAEJ,qBAAqB,EAAE,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,CAC/C,MAAM,CAAC,GAAG,CAAC;YACT,GAAG,EAAE,GAAG,EAAE;gBACR,mCAAmC;gBACnC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC3B,OAAO,IAAI,GAAG,EAA2B,CAAA;gBAC3C,CAAC;gBAED,oCAAoC;gBACpC,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACxD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;yDAC2C,YAAY;oDACjB,CACvC,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,SAAS,CAAc,CAAA;gBAE5C,2BAA2B;gBAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;gBAExC,uDAAuD;gBACvD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;gBAC1B,CAAC;gBAED,6BAA6B;gBAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;oBAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;oBAC1C,IAAI,QAAQ,EAAE,CAAC;wBACb,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;oBACrB,CAAC;gBACH,CAAC;gBAED,OAAO,MAA8C,CAAA;YACvD,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;SAC/C,CAAC;QAEJ,cAAc,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC3B,MAAM,CAAC,GAAG,CAAC;YACT,GAAG,EAAE,GAAG,EAAE;gBACR,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;oDAEsC,CACvC,CAAC,GAAG,CAAC,QAAQ,CAAc,CAAA;gBAC5B,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAC5B,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;SAC/C,CAAC;QAEJ,WAAW,EAAE,GAAG,EAAE,CAChB,MAAM,CAAC,GAAG,CAAC;YACT,GAAG,EAAE,GAAG,EAAE;gBACR,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB;;kCAEoB,CACrB,CAAC,GAAG,EAAiD,CAAA;gBAEtD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAA;gBAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBACvB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,SAAqB,EAAE,GAAG,CAAC,KAAK,CAAC,CAAA;gBAClD,CAAC;gBACD,OAAO,MAAuC,CAAA;YAChD,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;SAC/C,CAAC;QAEJ,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE,CAChD,MAAM,CAAC,GAAG,CAAC;YACT,GAAG,EAAE,GAAG,EAAE;gBACR,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAA;gBAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;gBACnC,MAAM,SAAS,GAAmB,EAAE,CAAA;gBAEpC,gCAAgC;gBAChC,MAAM,cAAc,GAAG,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;oBACtD,CAAC,CAAC,qBAAqB,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;oBAC7D,CAAC,CAAC,EAAE,CAAA;gBACN,MAAM,cAAc,GAAG,SAAS,IAAI,EAAE,CAAA;gBAEtC,2CAA2C;gBAC3C,IAAI,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;oBACrD,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAC7B;;mBAEG,cAAc;sDACqB,CACvC,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,cAAc,CAAc,CAAA;oBAEvD,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;wBAC/B,SAAS,CAAC,IAAI,CAAC;4BACb,QAAQ,EAAE,GAAG,CAAC,WAAuB;4BACrC,MAAM,EAAE,GAAG,CAAC,SAAS;4BACrB,QAAQ,EAAE,GAAG,CAAC,SAAqB;4BACnC,MAAM,EAAE,GAAG,CAAC,MAAM;4BAClB,SAAS,EAAE,UAAU;yBACtB,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;gBAED,2CAA2C;gBAC3C,IAAI,SAAS,KAAK,UAAU,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;oBACrD,MAAM,YAAY,GAAG,EAAE,CAAC,OAAO,CAC7B;;mBAEG,cAAc;sDACqB,CACvC,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,cAAc,CAAc,CAAA;oBAEvD,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;wBAC/B,SAAS,CAAC,IAAI,CAAC;4BACb,QAAQ,EAAE,GAAG,CAAC,WAAuB;4BACrC,MAAM,EAAE,GAAG,CAAC,SAAS;4BACrB,QAAQ,EAAE,GAAG,CAAC,SAAqB;4BACnC,MAAM,EAAE,GAAG,CAAC,MAAM;4BAClB,SAAS,EAAE,UAAU;yBACtB,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;gBAED,OAAO,SAAS,CAAA;YAClB,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;SAC/C,CAAC;QAEJ,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,CAAC,EAAE,EAAE,CACzD,MAAM,CAAC,GAAG,CAAC;YACT,GAAG,EAAE,GAAG,EAAE;gBACR,wEAAwE;gBACxE,yEAAyE;gBACzE,gDAAgD;gBAChD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8BzB,CAAC,CAAC,GAAG,CACJ,QAAQ,EAAE,MAAM,EAAI,0BAA0B;gBAC9C,QAAQ,EAAE,MAAM,EAAI,gCAAgC;gBACpD,QAAQ,EAAY,cAAc;gBAClC,MAAM,EAAE,IAAI,CAAQ,4BAA4B;iBACZ,CAAA;gBAEtC,IAAI,CAAC,MAAM;oBAAE,OAAO,IAAI,CAAA;gBAExB,4CAA4C;gBAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;gBACvD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACtD,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CACzB,6CAA6C,YAAY,GAAG,CAC7D,CAAC,GAAG,CAAC,GAAG,OAAO,CAAc,CAAA;gBAE9B,yCAAyC;gBACzC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;gBACtE,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAa,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAA;YAC/E,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;SAC/C,CAAC;QAEJ,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CACpB,MAAM,CAAC,GAAG,CAAC;YACT,GAAG,EAAE,GAAG,EAAE;gBACR,MAAM,OAAO,GAAa,EAAE,CAAA;gBAC5B,MAAM,MAAM,GAAc,EAAE,CAAA;gBAE5B,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC/B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;oBAC1B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBAC3B,CAAC;gBACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;oBACjC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;oBAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAA;gBAC7C,CAAC;gBAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,sEAAsE,CACvE,CAAC,GAAG,CAAC,EAAE,CAAwB,CAAA;oBAChC,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;gBACpC,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBACf,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,6BAA6B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,0CAA0C,CAC1F,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAA;gBAEhB,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAA;gBACb,CAAC;gBAED,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,EAAE,CAAwB,CAAA;gBAClG,IAAI,CAAC,GAAG,EAAE,CAAC;oBACT,MAAM,IAAI,gBAAgB,CAAC;wBACzB,MAAM,EAAE,MAAM;wBACd,EAAE;wBACF,SAAS,EAAE,QAAQ;qBACpB,CAAC,CAAA;gBACJ,CAAC;gBACD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAA;YACvB,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;SAC/C,CAAC;QAEJ,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CACjB,MAAM,CAAC,GAAG,CAAC;YACT,GAAG,EAAE,GAAG,EAAE;gBACR,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,oGAAoG,CACrG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBACT,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,IAAI,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;gBACrC,CAAC;gBACD,OAAO,IAAI,CAAA;YACb,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACf,IAAI,KAAK,YAAY,iBAAiB;oBAAE,MAAM,KAAK,CAAA;gBACnD,MAAM,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;YACpC,CAAC;SACF,CAAC;QAEJ,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CACjB,MAAM,CAAC,GAAG,CAAC;YACT,GAAG,EAAE,GAAG,EAAE;gBACR,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,2FAA2F,CAC5F,CAAC,GAAG,CAAC,KAAK,IAAI,mBAAmB,CAAc,CAAA;gBAChD,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAC5B,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC;SAC/C,CAAC;KACL,CAAA;AACH,CAAC,CAAC,CACH,CAAA"}
|
package/dist/repo/index.d.ts
CHANGED
|
@@ -7,10 +7,15 @@ export { LearningRepository, LearningRepositoryLive, type BM25Result } from "./l
|
|
|
7
7
|
export { FileLearningRepository, FileLearningRepositoryLive } from "./file-learning-repo.js";
|
|
8
8
|
export { AttemptRepository, AttemptRepositoryLive } from "./attempt-repo.js";
|
|
9
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";
|
|
10
15
|
export { WorkerRepository, WorkerRepositoryLive } from "./worker-repo.js";
|
|
11
16
|
export { ClaimRepository, ClaimRepositoryLive, type AtomicInsertResult, type AtomicRenewResult } from "./claim-repo.js";
|
|
12
17
|
export { OrchestratorStateRepository, OrchestratorStateRepositoryLive, type OrchestratorStateUpdate } from "./orchestrator-state-repo.js";
|
|
13
|
-
export {
|
|
14
|
-
export {
|
|
15
|
-
export { DocRepository, DocRepositoryLive
|
|
18
|
+
export { CompactionRepository, CompactionRepositoryLive, type CompactionLogEntry, type CreateCompactionLogInput } from "./compaction-repo.js";
|
|
19
|
+
export { MessageRepository, MessageRepositoryLive } from "./message-repo.js";
|
|
20
|
+
export { DocRepository, DocRepositoryLive } from "./doc-repo.js";
|
|
16
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/repo/index.d.ts.map
CHANGED
|
@@ -1 +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,eAAe,EAAE,mBAAmB,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACvH,OAAO,EAAE,2BAA2B,EAAE,+BAA+B,EAAE,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACzI,OAAO,EAAE,
|
|
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,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACvH,OAAO,EAAE,2BAA2B,EAAE,+BAA+B,EAAE,KAAK,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACzI,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,KAAK,kBAAkB,EAAE,KAAK,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAC7I,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA"}
|
package/dist/repo/index.js
CHANGED
|
@@ -7,10 +7,15 @@ export { LearningRepository, LearningRepositoryLive } from "./learning-repo.js";
|
|
|
7
7
|
export { FileLearningRepository, FileLearningRepositoryLive } from "./file-learning-repo.js";
|
|
8
8
|
export { AttemptRepository, AttemptRepositoryLive } from "./attempt-repo.js";
|
|
9
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";
|
|
10
15
|
export { WorkerRepository, WorkerRepositoryLive } from "./worker-repo.js";
|
|
11
16
|
export { ClaimRepository, ClaimRepositoryLive } from "./claim-repo.js";
|
|
12
17
|
export { OrchestratorStateRepository, OrchestratorStateRepositoryLive } from "./orchestrator-state-repo.js";
|
|
13
|
-
export {
|
|
14
|
-
export {
|
|
18
|
+
export { CompactionRepository, CompactionRepositoryLive } from "./compaction-repo.js";
|
|
19
|
+
export { MessageRepository, MessageRepositoryLive } from "./message-repo.js";
|
|
15
20
|
export { DocRepository, DocRepositoryLive } from "./doc-repo.js";
|
|
16
21
|
//# sourceMappingURL=index.js.map
|
package/dist/repo/index.js.map
CHANGED
|
@@ -1 +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,eAAe,EAAE,mBAAmB,EAAmD,MAAM,iBAAiB,CAAA;AACvH,OAAO,EAAE,2BAA2B,EAAE,+BAA+B,EAAgC,MAAM,8BAA8B,CAAA;AACzI,OAAO,EAAE,
|
|
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,EAAmD,MAAM,iBAAiB,CAAA;AACvH,OAAO,EAAE,2BAA2B,EAAE,+BAA+B,EAAgC,MAAM,8BAA8B,CAAA;AACzI,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAA0D,MAAM,sBAAsB,CAAA;AAC7I,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC5E,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MessageRepository - PRD-024 Agent Outbox
|
|
3
|
+
*
|
|
4
|
+
* Repository for outbox_messages table.
|
|
5
|
+
* Provides channel-based agent-to-agent messaging with cursor support.
|
|
6
|
+
*/
|
|
7
|
+
import { Context, Effect, Layer } from "effect";
|
|
8
|
+
import { SqliteClient } from "../db.js";
|
|
9
|
+
import { DatabaseError } from "../errors.js";
|
|
10
|
+
import type { Message } from "@jamesaphoenix/tx-types";
|
|
11
|
+
declare const MessageRepository_base: Context.TagClass<MessageRepository, "MessageRepository", {
|
|
12
|
+
/** Insert a new message into the outbox. */
|
|
13
|
+
readonly insert: (params: {
|
|
14
|
+
channel: string;
|
|
15
|
+
sender: string;
|
|
16
|
+
content: string;
|
|
17
|
+
correlationId: string | null;
|
|
18
|
+
taskId: string | null;
|
|
19
|
+
metadata: string;
|
|
20
|
+
createdAt: string;
|
|
21
|
+
expiresAt: string | null;
|
|
22
|
+
}) => Effect.Effect<Message, DatabaseError>;
|
|
23
|
+
/**
|
|
24
|
+
* Find messages by channel with cursor-based pagination.
|
|
25
|
+
* Read-only: does NOT modify message status.
|
|
26
|
+
*/
|
|
27
|
+
readonly findByChannel: (params: {
|
|
28
|
+
channel: string;
|
|
29
|
+
afterId?: number;
|
|
30
|
+
limit?: number;
|
|
31
|
+
sender?: string;
|
|
32
|
+
correlationId?: string;
|
|
33
|
+
includeAcked?: boolean;
|
|
34
|
+
excludeExpired?: boolean;
|
|
35
|
+
}) => Effect.Effect<readonly Message[], DatabaseError>;
|
|
36
|
+
/** Find a single message by ID. */
|
|
37
|
+
readonly findById: (id: number) => Effect.Effect<Message | null, DatabaseError>;
|
|
38
|
+
/** Mark a single message as acked. */
|
|
39
|
+
readonly markAcked: (id: number, ackedAt: string) => Effect.Effect<boolean, DatabaseError>;
|
|
40
|
+
/** Mark all pending messages on a channel as acked. */
|
|
41
|
+
readonly markAckedByChannel: (channel: string, ackedAt: string) => Effect.Effect<number, DatabaseError>;
|
|
42
|
+
/** Find messages by correlation ID (for request/reply pattern). */
|
|
43
|
+
readonly findByCorrelationId: (correlationId: string) => Effect.Effect<readonly Message[], DatabaseError>;
|
|
44
|
+
/** Delete expired messages (TTL cleanup). */
|
|
45
|
+
readonly deleteExpired: (now: string) => Effect.Effect<number, DatabaseError>;
|
|
46
|
+
/** Delete acked messages older than a given date. */
|
|
47
|
+
readonly deleteAcked: (olderThan: string) => Effect.Effect<number, DatabaseError>;
|
|
48
|
+
/** Count pending messages on a channel. */
|
|
49
|
+
readonly countPending: (channel: string) => Effect.Effect<number, DatabaseError>;
|
|
50
|
+
}>;
|
|
51
|
+
export declare class MessageRepository extends MessageRepository_base {
|
|
52
|
+
}
|
|
53
|
+
export declare const MessageRepositoryLive: Layer.Layer<MessageRepository, never, SqliteClient>;
|
|
54
|
+
export {};
|
|
55
|
+
//# sourceMappingURL=message-repo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-repo.d.ts","sourceRoot":"","sources":["../../src/repo/message-repo.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAoB,MAAM,cAAc,CAAA;AAE9D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;;IAKlD,4CAA4C;qBAC3B,CAAC,MAAM,EAAE;QACxB,OAAO,EAAE,MAAM,CAAA;QACf,MAAM,EAAE,MAAM,CAAA;QACd,OAAO,EAAE,MAAM,CAAA;QACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;QAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;QACrB,QAAQ,EAAE,MAAM,CAAA;QAChB,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KACzB,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;IAE3C;;;OAGG;4BACqB,CAAC,MAAM,EAAE;QAC/B,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,aAAa,CAAC,EAAE,MAAM,CAAA;QACtB,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,cAAc,CAAC,EAAE,OAAO,CAAA;KACzB,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,OAAO,EAAE,EAAE,aAAa,CAAC;IAEtD,mCAAmC;uBAChB,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,EAAE,aAAa,CAAC;IAE/E,sCAAsC;wBAClB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;IAE1F,uDAAuD;iCAC1B,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAEvG,mEAAmE;kCACrC,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,OAAO,EAAE,EAAE,aAAa,CAAC;IAEzG,6CAA6C;4BACrB,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAE7E,qDAAqD;0BAC/B,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;IAEjF,2CAA2C;2BACpB,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC;;AAhDpF,qBAAa,iBAAkB,SAAQ,sBAkDpC;CAAG;AAEN,eAAO,MAAM,qBAAqB,qDA8KjC,CAAA"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MessageRepository - PRD-024 Agent Outbox
|
|
3
|
+
*
|
|
4
|
+
* Repository for outbox_messages table.
|
|
5
|
+
* Provides channel-based agent-to-agent messaging with cursor support.
|
|
6
|
+
*/
|
|
7
|
+
import { Context, Effect, Layer } from "effect";
|
|
8
|
+
import { SqliteClient } from "../db.js";
|
|
9
|
+
import { DatabaseError, EntityFetchError } from "../errors.js";
|
|
10
|
+
import { rowToMessage } from "../mappers/message.js";
|
|
11
|
+
export class MessageRepository extends Context.Tag("MessageRepository")() {
|
|
12
|
+
}
|
|
13
|
+
export const MessageRepositoryLive = Layer.effect(MessageRepository, Effect.gen(function* () {
|
|
14
|
+
const db = yield* SqliteClient;
|
|
15
|
+
return {
|
|
16
|
+
insert: (params) => Effect.try({
|
|
17
|
+
try: () => {
|
|
18
|
+
const result = db.prepare(`INSERT INTO outbox_messages
|
|
19
|
+
(channel, sender, content, correlation_id, task_id, metadata, created_at, expires_at)
|
|
20
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(params.channel, params.sender, params.content, params.correlationId, params.taskId, params.metadata, params.createdAt, params.expiresAt);
|
|
21
|
+
const row = db.prepare("SELECT * FROM outbox_messages WHERE id = ?").get(result.lastInsertRowid);
|
|
22
|
+
if (!row) {
|
|
23
|
+
throw new EntityFetchError({
|
|
24
|
+
entity: "message",
|
|
25
|
+
id: result.lastInsertRowid,
|
|
26
|
+
operation: "insert"
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return rowToMessage(row);
|
|
30
|
+
},
|
|
31
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
32
|
+
}),
|
|
33
|
+
findByChannel: (params) => Effect.try({
|
|
34
|
+
try: () => {
|
|
35
|
+
const conditions = ["channel = ?"];
|
|
36
|
+
const values = [params.channel];
|
|
37
|
+
// Cursor: only return messages after this ID
|
|
38
|
+
if (params.afterId !== undefined) {
|
|
39
|
+
conditions.push("id > ?");
|
|
40
|
+
values.push(params.afterId);
|
|
41
|
+
}
|
|
42
|
+
// Filter by status (default: pending only)
|
|
43
|
+
if (!params.includeAcked) {
|
|
44
|
+
conditions.push("status = 'pending'");
|
|
45
|
+
}
|
|
46
|
+
// Exclude expired messages (default: true)
|
|
47
|
+
if (params.excludeExpired !== false) {
|
|
48
|
+
conditions.push("(expires_at IS NULL OR expires_at > ?)");
|
|
49
|
+
values.push(new Date().toISOString());
|
|
50
|
+
}
|
|
51
|
+
// Filter by sender
|
|
52
|
+
if (params.sender) {
|
|
53
|
+
conditions.push("sender = ?");
|
|
54
|
+
values.push(params.sender);
|
|
55
|
+
}
|
|
56
|
+
// Filter by correlation ID
|
|
57
|
+
if (params.correlationId) {
|
|
58
|
+
conditions.push("correlation_id = ?");
|
|
59
|
+
values.push(params.correlationId);
|
|
60
|
+
}
|
|
61
|
+
const limit = params.limit ?? 50;
|
|
62
|
+
values.push(limit);
|
|
63
|
+
const sql = `SELECT * FROM outbox_messages
|
|
64
|
+
WHERE ${conditions.join(" AND ")}
|
|
65
|
+
ORDER BY id ASC
|
|
66
|
+
LIMIT ?`;
|
|
67
|
+
const rows = db.prepare(sql).all(...values);
|
|
68
|
+
return rows.map(rowToMessage);
|
|
69
|
+
},
|
|
70
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
71
|
+
}),
|
|
72
|
+
findById: (id) => Effect.try({
|
|
73
|
+
try: () => {
|
|
74
|
+
const row = db.prepare("SELECT * FROM outbox_messages WHERE id = ?").get(id);
|
|
75
|
+
return row ? rowToMessage(row) : null;
|
|
76
|
+
},
|
|
77
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
78
|
+
}),
|
|
79
|
+
markAcked: (id, ackedAt) => Effect.try({
|
|
80
|
+
try: () => {
|
|
81
|
+
const result = db.prepare(`UPDATE outbox_messages SET status = 'acked', acked_at = ?
|
|
82
|
+
WHERE id = ? AND status = 'pending'`).run(ackedAt, id);
|
|
83
|
+
return result.changes > 0;
|
|
84
|
+
},
|
|
85
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
86
|
+
}),
|
|
87
|
+
markAckedByChannel: (channel, ackedAt) => Effect.try({
|
|
88
|
+
try: () => {
|
|
89
|
+
const result = db.prepare(`UPDATE outbox_messages SET status = 'acked', acked_at = ?
|
|
90
|
+
WHERE channel = ? AND status = 'pending'`).run(ackedAt, channel);
|
|
91
|
+
return result.changes;
|
|
92
|
+
},
|
|
93
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
94
|
+
}),
|
|
95
|
+
findByCorrelationId: (correlationId) => Effect.try({
|
|
96
|
+
try: () => {
|
|
97
|
+
const rows = db.prepare(`SELECT * FROM outbox_messages
|
|
98
|
+
WHERE correlation_id = ?
|
|
99
|
+
ORDER BY id ASC`).all(correlationId);
|
|
100
|
+
return rows.map(rowToMessage);
|
|
101
|
+
},
|
|
102
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
103
|
+
}),
|
|
104
|
+
deleteExpired: (now) => Effect.try({
|
|
105
|
+
try: () => {
|
|
106
|
+
const result = db.prepare(`DELETE FROM outbox_messages
|
|
107
|
+
WHERE expires_at IS NOT NULL AND expires_at <= ?`).run(now);
|
|
108
|
+
return result.changes;
|
|
109
|
+
},
|
|
110
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
111
|
+
}),
|
|
112
|
+
deleteAcked: (olderThan) => Effect.try({
|
|
113
|
+
try: () => {
|
|
114
|
+
const result = db.prepare(`DELETE FROM outbox_messages
|
|
115
|
+
WHERE status = 'acked' AND acked_at IS NOT NULL AND acked_at <= ?`).run(olderThan);
|
|
116
|
+
return result.changes;
|
|
117
|
+
},
|
|
118
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
119
|
+
}),
|
|
120
|
+
countPending: (channel) => Effect.try({
|
|
121
|
+
try: () => {
|
|
122
|
+
const now = new Date().toISOString();
|
|
123
|
+
const row = db.prepare(`SELECT COUNT(*) as count FROM outbox_messages
|
|
124
|
+
WHERE channel = ? AND status = 'pending'
|
|
125
|
+
AND (expires_at IS NULL OR expires_at > ?)`).get(channel, now);
|
|
126
|
+
return row.count;
|
|
127
|
+
},
|
|
128
|
+
catch: (cause) => new DatabaseError({ cause })
|
|
129
|
+
})
|
|
130
|
+
};
|
|
131
|
+
}));
|
|
132
|
+
//# sourceMappingURL=message-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-repo.js","sourceRoot":"","sources":["../../src/repo/message-repo.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,33 +10,28 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { Context, Effect, Layer } from "effect";
|
|
12
12
|
import { AgentError } from "../errors.js";
|
|
13
|
-
interface AgentSdkQueryOptions {
|
|
14
|
-
tools?: string[];
|
|
15
|
-
permissionMode?: string;
|
|
16
|
-
allowDangerouslySkipPermissions?: boolean;
|
|
17
|
-
model?: string;
|
|
18
|
-
maxTurns?: number;
|
|
19
|
-
persistSession?: boolean;
|
|
20
|
-
outputFormat?: {
|
|
21
|
-
type: "json_schema";
|
|
22
|
-
schema: unknown;
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
/** Configuration for a single agent run. */
|
|
26
13
|
export interface AgentRunConfig {
|
|
27
|
-
prompt: string;
|
|
28
|
-
options
|
|
14
|
+
readonly prompt: string;
|
|
15
|
+
readonly options?: {
|
|
16
|
+
readonly tools?: readonly string[];
|
|
17
|
+
readonly permissionMode?: string;
|
|
18
|
+
readonly allowDangerouslySkipPermissions?: boolean;
|
|
19
|
+
readonly model?: string;
|
|
20
|
+
readonly maxTurns?: number;
|
|
21
|
+
readonly persistSession?: boolean;
|
|
22
|
+
readonly outputFormat?: {
|
|
23
|
+
readonly type: string;
|
|
24
|
+
readonly schema: Record<string, unknown>;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
29
27
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
text: string;
|
|
34
|
-
/** Parsed structured output, if outputFormat was specified */
|
|
35
|
-
structuredOutput: unknown | null;
|
|
28
|
+
export interface AgentRunResult {
|
|
29
|
+
readonly text: string;
|
|
30
|
+
readonly structuredOutput: Record<string, unknown> | null;
|
|
36
31
|
}
|
|
32
|
+
export type AgentMessageCallback = (message: unknown) => void;
|
|
37
33
|
declare const AgentService_base: Context.TagClass<AgentService, "AgentService", {
|
|
38
|
-
|
|
39
|
-
readonly run: (config: AgentRunConfig, onMessage?: (msg: unknown) => void) => Effect.Effect<AgentResult, AgentError>;
|
|
34
|
+
readonly run: (config: AgentRunConfig, onMessage?: AgentMessageCallback) => Effect.Effect<AgentRunResult, AgentError>;
|
|
40
35
|
}>;
|
|
41
36
|
/**
|
|
42
37
|
* AgentService dispatches sub-agents via the Claude Agent SDK.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-service.d.ts","sourceRoot":"","sources":["../../src/services/agent-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"agent-service.d.ts","sourceRoot":"","sources":["../../src/services/agent-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAMzC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE;QACjB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;QAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;QAChC,QAAQ,CAAC,+BAA+B,CAAC,EAAE,OAAO,CAAA;QAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;QACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;QAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;QACjC,QAAQ,CAAC,YAAY,CAAC,EAAE;YACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;YACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SACzC,CAAA;KACF,CAAA;CACF;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAC1D;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;;kBAY3C,CACZ,MAAM,EAAE,cAAc,EACtB,SAAS,CAAC,EAAE,oBAAoB,KAC7B,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,UAAU,CAAC;;AATlD;;GAEG;AACH,qBAAa,YAAa,SAAQ,iBAQ/B;CAAG;AAMN;;;GAGG;AACH,eAAO,MAAM,gBAAgB,8CAoE5B,CAAA;AAMD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,yCAG3B,CAAA"}
|