@jamesaphoenix/tx-core 0.4.5 → 0.5.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.
Files changed (204) hide show
  1. package/README.md +154 -299
  2. package/dist/db.d.ts +4 -9
  3. package/dist/db.d.ts.map +1 -1
  4. package/dist/db.js +6 -80
  5. package/dist/db.js.map +1 -1
  6. package/dist/errors.d.ts +67 -10
  7. package/dist/errors.d.ts.map +1 -1
  8. package/dist/errors.js +44 -10
  9. package/dist/errors.js.map +1 -1
  10. package/dist/index.d.ts +12 -7
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +23 -29
  13. package/dist/index.js.map +1 -1
  14. package/dist/layer.d.ts +32 -10
  15. package/dist/layer.d.ts.map +1 -1
  16. package/dist/layer.js +126 -47
  17. package/dist/layer.js.map +1 -1
  18. package/dist/mappers/anchor.d.ts +28 -0
  19. package/dist/mappers/anchor.d.ts.map +1 -0
  20. package/dist/mappers/anchor.js +105 -0
  21. package/dist/mappers/anchor.js.map +1 -0
  22. package/dist/mappers/candidate.d.ts +25 -0
  23. package/dist/mappers/candidate.d.ts.map +1 -0
  24. package/dist/mappers/candidate.js +83 -0
  25. package/dist/mappers/candidate.js.map +1 -0
  26. package/dist/mappers/doc.d.ts +2 -4
  27. package/dist/mappers/doc.d.ts.map +1 -1
  28. package/dist/mappers/doc.js +7 -4
  29. package/dist/mappers/doc.js.map +1 -1
  30. package/dist/mappers/edge.d.ts +19 -0
  31. package/dist/mappers/edge.d.ts.map +1 -0
  32. package/dist/mappers/edge.js +81 -0
  33. package/dist/mappers/edge.js.map +1 -0
  34. package/dist/mappers/index.d.ts +7 -3
  35. package/dist/mappers/index.d.ts.map +1 -1
  36. package/dist/mappers/index.js +14 -6
  37. package/dist/mappers/index.js.map +1 -1
  38. package/dist/mappers/message.d.ts +15 -0
  39. package/dist/mappers/message.d.ts.map +1 -0
  40. package/dist/mappers/message.js +58 -0
  41. package/dist/mappers/message.js.map +1 -0
  42. package/dist/repo/anchor-repo.d.ts +52 -0
  43. package/dist/repo/anchor-repo.d.ts.map +1 -0
  44. package/dist/repo/anchor-repo.js +245 -0
  45. package/dist/repo/anchor-repo.js.map +1 -0
  46. package/dist/repo/candidate-repo.d.ts +16 -0
  47. package/dist/repo/candidate-repo.d.ts.map +1 -0
  48. package/dist/repo/candidate-repo.js +164 -0
  49. package/dist/repo/candidate-repo.js.map +1 -0
  50. package/dist/repo/compaction-repo.d.ts +41 -0
  51. package/dist/repo/compaction-repo.d.ts.map +1 -0
  52. package/dist/repo/compaction-repo.js +84 -0
  53. package/dist/repo/compaction-repo.js.map +1 -0
  54. package/dist/repo/doc-repo.d.ts +68 -51
  55. package/dist/repo/doc-repo.d.ts.map +1 -1
  56. package/dist/repo/doc-repo.js +120 -54
  57. package/dist/repo/doc-repo.js.map +1 -1
  58. package/dist/repo/edge-repo.d.ts +26 -0
  59. package/dist/repo/edge-repo.d.ts.map +1 -0
  60. package/dist/repo/edge-repo.js +258 -0
  61. package/dist/repo/edge-repo.js.map +1 -0
  62. package/dist/repo/index.d.ts +8 -3
  63. package/dist/repo/index.d.ts.map +1 -1
  64. package/dist/repo/index.js +7 -2
  65. package/dist/repo/index.js.map +1 -1
  66. package/dist/repo/message-repo.d.ts +55 -0
  67. package/dist/repo/message-repo.d.ts.map +1 -0
  68. package/dist/repo/message-repo.js +132 -0
  69. package/dist/repo/message-repo.js.map +1 -0
  70. package/dist/services/agent-service.d.ts +18 -23
  71. package/dist/services/agent-service.d.ts.map +1 -1
  72. package/dist/services/agent-service.js +9 -0
  73. package/dist/services/agent-service.js.map +1 -1
  74. package/dist/services/anchor-service.d.ts +147 -0
  75. package/dist/services/anchor-service.d.ts.map +1 -0
  76. package/dist/services/anchor-service.js +540 -0
  77. package/dist/services/anchor-service.js.map +1 -0
  78. package/dist/services/anchor-verification.d.ts +102 -0
  79. package/dist/services/anchor-verification.d.ts.map +1 -0
  80. package/dist/services/anchor-verification.js +817 -0
  81. package/dist/services/anchor-verification.js.map +1 -0
  82. package/dist/services/ast-grep-service.d.ts +58 -0
  83. package/dist/services/ast-grep-service.d.ts.map +1 -0
  84. package/dist/services/ast-grep-service.js +427 -0
  85. package/dist/services/ast-grep-service.js.map +1 -0
  86. package/dist/services/attempt-service.d.ts.map +1 -1
  87. package/dist/services/attempt-service.js +4 -1
  88. package/dist/services/attempt-service.js.map +1 -1
  89. package/dist/services/auto-sync-service.d.ts.map +1 -1
  90. package/dist/services/auto-sync-service.js +7 -7
  91. package/dist/services/auto-sync-service.js.map +1 -1
  92. package/dist/services/candidate-extractor-service.d.ts +44 -0
  93. package/dist/services/candidate-extractor-service.d.ts.map +1 -0
  94. package/dist/services/candidate-extractor-service.js +175 -0
  95. package/dist/services/candidate-extractor-service.js.map +1 -0
  96. package/dist/services/claim-service.d.ts.map +1 -1
  97. package/dist/services/claim-service.js +0 -8
  98. package/dist/services/claim-service.js.map +1 -1
  99. package/dist/services/compaction-service.d.ts +105 -0
  100. package/dist/services/compaction-service.d.ts.map +1 -0
  101. package/dist/services/compaction-service.js +281 -0
  102. package/dist/services/compaction-service.js.map +1 -0
  103. package/dist/services/cycle-scan-service.d.ts +1 -5
  104. package/dist/services/cycle-scan-service.d.ts.map +1 -1
  105. package/dist/services/cycle-scan-service.js +49 -19
  106. package/dist/services/cycle-scan-service.js.map +1 -1
  107. package/dist/services/daemon-service.d.ts +2 -8
  108. package/dist/services/daemon-service.d.ts.map +1 -1
  109. package/dist/services/daemon-service.js +21 -35
  110. package/dist/services/daemon-service.js.map +1 -1
  111. package/dist/services/doc-service.d.ts +25 -32
  112. package/dist/services/doc-service.d.ts.map +1 -1
  113. package/dist/services/doc-service.js +206 -190
  114. package/dist/services/doc-service.js.map +1 -1
  115. package/dist/services/edge-service.d.ts +78 -0
  116. package/dist/services/edge-service.d.ts.map +1 -0
  117. package/dist/services/edge-service.js +158 -0
  118. package/dist/services/edge-service.js.map +1 -0
  119. package/dist/services/embedding-service.d.ts +3 -3
  120. package/dist/services/embedding-service.d.ts.map +1 -1
  121. package/dist/services/embedding-service.js +8 -14
  122. package/dist/services/embedding-service.js.map +1 -1
  123. package/dist/services/feedback-tracker.d.ts +64 -0
  124. package/dist/services/feedback-tracker.d.ts.map +1 -0
  125. package/dist/services/feedback-tracker.js +110 -0
  126. package/dist/services/feedback-tracker.js.map +1 -0
  127. package/dist/services/file-watcher-service.d.ts.map +1 -1
  128. package/dist/services/file-watcher-service.js +1 -3
  129. package/dist/services/file-watcher-service.js.map +1 -1
  130. package/dist/services/graph-expansion.d.ts +158 -0
  131. package/dist/services/graph-expansion.d.ts.map +1 -0
  132. package/dist/services/graph-expansion.js +487 -0
  133. package/dist/services/graph-expansion.js.map +1 -0
  134. package/dist/services/index.d.ts +19 -8
  135. package/dist/services/index.d.ts.map +1 -1
  136. package/dist/services/index.js +18 -7
  137. package/dist/services/index.js.map +1 -1
  138. package/dist/services/learning-service.d.ts.map +1 -1
  139. package/dist/services/learning-service.js +22 -14
  140. package/dist/services/learning-service.js.map +1 -1
  141. package/dist/services/llm-service.d.ts +60 -38
  142. package/dist/services/llm-service.d.ts.map +1 -1
  143. package/dist/services/llm-service.js +201 -113
  144. package/dist/services/llm-service.js.map +1 -1
  145. package/dist/services/message-service.d.ts +57 -0
  146. package/dist/services/message-service.d.ts.map +1 -0
  147. package/dist/services/message-service.js +78 -0
  148. package/dist/services/message-service.js.map +1 -0
  149. package/dist/services/orchestrator-service.d.ts.map +1 -1
  150. package/dist/services/orchestrator-service.js +19 -20
  151. package/dist/services/orchestrator-service.js.map +1 -1
  152. package/dist/services/promotion-service.d.ts +67 -0
  153. package/dist/services/promotion-service.d.ts.map +1 -0
  154. package/dist/services/promotion-service.js +151 -0
  155. package/dist/services/promotion-service.js.map +1 -0
  156. package/dist/services/query-expansion-service.d.ts +7 -22
  157. package/dist/services/query-expansion-service.d.ts.map +1 -1
  158. package/dist/services/query-expansion-service.js +41 -75
  159. package/dist/services/query-expansion-service.js.map +1 -1
  160. package/dist/services/reranker-service.d.ts +1 -1
  161. package/dist/services/reranker-service.d.ts.map +1 -1
  162. package/dist/services/reranker-service.js +8 -10
  163. package/dist/services/reranker-service.js.map +1 -1
  164. package/dist/services/retriever-service.d.ts +8 -5
  165. package/dist/services/retriever-service.d.ts.map +1 -1
  166. package/dist/services/retriever-service.js +150 -15
  167. package/dist/services/retriever-service.js.map +1 -1
  168. package/dist/services/swarm-verification.d.ts +104 -0
  169. package/dist/services/swarm-verification.d.ts.map +1 -0
  170. package/dist/services/swarm-verification.js +406 -0
  171. package/dist/services/swarm-verification.js.map +1 -0
  172. package/dist/services/sync-service.d.ts.map +1 -1
  173. package/dist/services/sync-service.js +8 -9
  174. package/dist/services/sync-service.js.map +1 -1
  175. package/dist/services/task-service.d.ts.map +1 -1
  176. package/dist/services/task-service.js +3 -8
  177. package/dist/services/task-service.js.map +1 -1
  178. package/dist/services/tracing-service.js +6 -6
  179. package/dist/services/tracing-service.js.map +1 -1
  180. package/dist/services/transcript-adapter.d.ts.map +1 -1
  181. package/dist/services/transcript-adapter.js +1 -1
  182. package/dist/services/transcript-adapter.js.map +1 -1
  183. package/dist/services/worker-process.d.ts.map +1 -1
  184. package/dist/services/worker-process.js +8 -30
  185. package/dist/services/worker-process.js.map +1 -1
  186. package/dist/utils/doc-hash.d.ts +0 -4
  187. package/dist/utils/doc-hash.d.ts.map +1 -1
  188. package/dist/utils/doc-hash.js.map +1 -1
  189. package/dist/utils/doc-renderer.d.ts +31 -26
  190. package/dist/utils/doc-renderer.d.ts.map +1 -1
  191. package/dist/utils/doc-renderer.js +0 -7
  192. package/dist/utils/doc-renderer.js.map +1 -1
  193. package/dist/utils/llm-json.d.ts +17 -0
  194. package/dist/utils/llm-json.d.ts.map +1 -0
  195. package/dist/utils/llm-json.js +51 -0
  196. package/dist/utils/llm-json.js.map +1 -0
  197. package/dist/utils/toml-config.d.ts +10 -16
  198. package/dist/utils/toml-config.d.ts.map +1 -1
  199. package/dist/utils/toml-config.js +3 -1
  200. package/dist/utils/toml-config.js.map +1 -1
  201. package/dist/worker/run-worker.d.ts.map +1 -1
  202. package/dist/worker/run-worker.js +2 -7
  203. package/dist/worker/run-worker.js.map +1 -1
  204. 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":"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"}
@@ -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 { DeduplicationRepository, DeduplicationRepositoryLive } from "./deduplication-repo.js";
14
- export { TrackedProjectRepository, TrackedProjectRepositoryLive } from "./tracked-project-repo.js";
15
- export { DocRepository, DocRepositoryLive, type InsertDocInput, type UpdateDocInput } from "./doc-repo.js";
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
@@ -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,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAC9F,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAClG,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA"}
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"}
@@ -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 { DeduplicationRepository, DeduplicationRepositoryLive } from "./deduplication-repo.js";
14
- export { TrackedProjectRepository, TrackedProjectRepositoryLive } from "./tracked-project-repo.js";
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
@@ -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,uBAAuB,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAC9F,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AAClG,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAA4C,MAAM,eAAe,CAAA"}
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: AgentSdkQueryOptions;
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
- /** Result from a completed agent run. */
31
- export interface AgentResult {
32
- /** Raw text result from the agent */
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
- /** Run a sub-agent with the given config and optional message callback. */
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;AAazC,UAAU,oBAAoB;IAC5B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,+BAA+B,CAAC,EAAE,OAAO,CAAA;IACzC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,YAAY,CAAC,EAAE;QACb,IAAI,EAAE,aAAa,CAAA;QACnB,MAAM,EAAE,OAAO,CAAA;KAChB,CAAA;CACF;AAED,4CAA4C;AAE5C,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,oBAAoB,CAAA;CAC9B;AAED,yCAAyC;AAEzC,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAA;IACZ,8DAA8D;IAC9D,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAA;CACjC;;IAQG,2EAA2E;kBAC7D,CACZ,MAAM,EAAE,cAAc,EACtB,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,KAC/B,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC;;AAV/C;;GAEG;AACH,qBAAa,YAAa,SAAQ,iBAS/B;CAAG;AAEN;;;GAGG;AACH,eAAO,MAAM,gBAAgB,8CAgE5B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,yCAG3B,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"}