@jamesaphoenix/tx-core 0.4.2 → 0.4.3

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 (330) hide show
  1. package/README.md +480 -0
  2. package/dist/db.d.ts +28 -14
  3. package/dist/db.d.ts.map +1 -1
  4. package/dist/db.js +102 -14
  5. package/dist/db.js.map +1 -1
  6. package/dist/errors.d.ts +178 -34
  7. package/dist/errors.d.ts.map +1 -1
  8. package/dist/errors.js +119 -26
  9. package/dist/errors.js.map +1 -1
  10. package/dist/id.d.ts +10 -0
  11. package/dist/id.d.ts.map +1 -1
  12. package/dist/id.js +17 -1
  13. package/dist/id.js.map +1 -1
  14. package/dist/index.d.ts +15 -7
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +62 -8
  17. package/dist/index.js.map +1 -1
  18. package/dist/layer.d.ts +23 -14
  19. package/dist/layer.d.ts.map +1 -1
  20. package/dist/layer.js +75 -76
  21. package/dist/layer.js.map +1 -1
  22. package/dist/mappers/anchor.d.ts +15 -1
  23. package/dist/mappers/anchor.d.ts.map +1 -1
  24. package/dist/mappers/anchor.js +95 -28
  25. package/dist/mappers/anchor.js.map +1 -1
  26. package/dist/mappers/attempt.d.ts +3 -1
  27. package/dist/mappers/attempt.d.ts.map +1 -1
  28. package/dist/mappers/attempt.js +23 -9
  29. package/dist/mappers/attempt.js.map +1 -1
  30. package/dist/mappers/candidate.d.ts +3 -1
  31. package/dist/mappers/candidate.d.ts.map +1 -1
  32. package/dist/mappers/candidate.js +46 -16
  33. package/dist/mappers/candidate.js.map +1 -1
  34. package/dist/mappers/claim.d.ts +1 -1
  35. package/dist/mappers/claim.d.ts.map +1 -1
  36. package/dist/mappers/claim.js +11 -4
  37. package/dist/mappers/claim.js.map +1 -1
  38. package/dist/mappers/deduplication.d.ts +13 -1
  39. package/dist/mappers/deduplication.d.ts.map +1 -1
  40. package/dist/mappers/deduplication.js +22 -3
  41. package/dist/mappers/deduplication.js.map +1 -1
  42. package/dist/mappers/doc.d.ts +24 -0
  43. package/dist/mappers/doc.d.ts.map +1 -0
  44. package/dist/mappers/doc.js +161 -0
  45. package/dist/mappers/doc.js.map +1 -0
  46. package/dist/mappers/edge.d.ts +10 -1
  47. package/dist/mappers/edge.d.ts.map +1 -1
  48. package/dist/mappers/edge.js +74 -12
  49. package/dist/mappers/edge.js.map +1 -1
  50. package/dist/mappers/file-learning.d.ts.map +1 -1
  51. package/dist/mappers/file-learning.js +2 -1
  52. package/dist/mappers/file-learning.js.map +1 -1
  53. package/dist/mappers/index.d.ts +6 -7
  54. package/dist/mappers/index.d.ts.map +1 -1
  55. package/dist/mappers/index.js +10 -12
  56. package/dist/mappers/index.js.map +1 -1
  57. package/dist/mappers/learning.d.ts +9 -1
  58. package/dist/mappers/learning.d.ts.map +1 -1
  59. package/dist/mappers/learning.js +94 -14
  60. package/dist/mappers/learning.js.map +1 -1
  61. package/dist/mappers/orchestrator-state.d.ts +1 -1
  62. package/dist/mappers/orchestrator-state.d.ts.map +1 -1
  63. package/dist/mappers/orchestrator-state.js +31 -5
  64. package/dist/mappers/orchestrator-state.js.map +1 -1
  65. package/dist/mappers/parse-date.d.ts +11 -0
  66. package/dist/mappers/parse-date.d.ts.map +1 -0
  67. package/dist/mappers/parse-date.js +18 -0
  68. package/dist/mappers/parse-date.js.map +1 -0
  69. package/dist/mappers/run.d.ts +14 -4
  70. package/dist/mappers/run.d.ts.map +1 -1
  71. package/dist/mappers/run.js +49 -18
  72. package/dist/mappers/run.js.map +1 -1
  73. package/dist/mappers/task.d.ts +5 -1
  74. package/dist/mappers/task.d.ts.map +1 -1
  75. package/dist/mappers/task.js +66 -16
  76. package/dist/mappers/task.js.map +1 -1
  77. package/dist/mappers/tracked-project.d.ts +3 -1
  78. package/dist/mappers/tracked-project.d.ts.map +1 -1
  79. package/dist/mappers/tracked-project.js +23 -9
  80. package/dist/mappers/tracked-project.js.map +1 -1
  81. package/dist/mappers/worker.d.ts +1 -1
  82. package/dist/mappers/worker.d.ts.map +1 -1
  83. package/dist/mappers/worker.js +44 -6
  84. package/dist/mappers/worker.js.map +1 -1
  85. package/dist/repo/anchor-repo.d.ts +2 -2
  86. package/dist/repo/anchor-repo.d.ts.map +1 -1
  87. package/dist/repo/anchor-repo.js +46 -5
  88. package/dist/repo/anchor-repo.js.map +1 -1
  89. package/dist/repo/attempt-repo.d.ts +2 -2
  90. package/dist/repo/attempt-repo.d.ts.map +1 -1
  91. package/dist/repo/attempt-repo.js +16 -6
  92. package/dist/repo/attempt-repo.js.map +1 -1
  93. package/dist/repo/candidate-repo.d.ts.map +1 -1
  94. package/dist/repo/candidate-repo.js +22 -1
  95. package/dist/repo/candidate-repo.js.map +1 -1
  96. package/dist/repo/claim-repo.d.ts +46 -2
  97. package/dist/repo/claim-repo.d.ts.map +1 -1
  98. package/dist/repo/claim-repo.js +113 -6
  99. package/dist/repo/claim-repo.js.map +1 -1
  100. package/dist/repo/compaction-repo.d.ts +41 -0
  101. package/dist/repo/compaction-repo.d.ts.map +1 -0
  102. package/dist/repo/compaction-repo.js +84 -0
  103. package/dist/repo/compaction-repo.js.map +1 -0
  104. package/dist/repo/deduplication-repo.d.ts +9 -1
  105. package/dist/repo/deduplication-repo.d.ts.map +1 -1
  106. package/dist/repo/deduplication-repo.js +46 -9
  107. package/dist/repo/deduplication-repo.js.map +1 -1
  108. package/dist/repo/dep-repo.d.ts +27 -3
  109. package/dist/repo/dep-repo.d.ts.map +1 -1
  110. package/dist/repo/dep-repo.js +166 -39
  111. package/dist/repo/dep-repo.js.map +1 -1
  112. package/dist/repo/doc-repo.d.ts +59 -0
  113. package/dist/repo/doc-repo.d.ts.map +1 -0
  114. package/dist/repo/doc-repo.js +276 -0
  115. package/dist/repo/doc-repo.js.map +1 -0
  116. package/dist/repo/edge-repo.d.ts +1 -1
  117. package/dist/repo/edge-repo.d.ts.map +1 -1
  118. package/dist/repo/edge-repo.js +65 -34
  119. package/dist/repo/edge-repo.js.map +1 -1
  120. package/dist/repo/file-learning-repo.d.ts +3 -3
  121. package/dist/repo/file-learning-repo.d.ts.map +1 -1
  122. package/dist/repo/file-learning-repo.js +19 -8
  123. package/dist/repo/file-learning-repo.js.map +1 -1
  124. package/dist/repo/index.d.ts +4 -6
  125. package/dist/repo/index.d.ts.map +1 -1
  126. package/dist/repo/index.js +3 -5
  127. package/dist/repo/index.js.map +1 -1
  128. package/dist/repo/learning-repo.d.ts +10 -3
  129. package/dist/repo/learning-repo.d.ts.map +1 -1
  130. package/dist/repo/learning-repo.js +68 -11
  131. package/dist/repo/learning-repo.js.map +1 -1
  132. package/dist/repo/orchestrator-state-repo.d.ts.map +1 -1
  133. package/dist/repo/orchestrator-state-repo.js +8 -1
  134. package/dist/repo/orchestrator-state-repo.js.map +1 -1
  135. package/dist/repo/run-repo.d.ts +3 -3
  136. package/dist/repo/run-repo.d.ts.map +1 -1
  137. package/dist/repo/run-repo.js +40 -19
  138. package/dist/repo/run-repo.js.map +1 -1
  139. package/dist/repo/task-repo.d.ts +14 -3
  140. package/dist/repo/task-repo.d.ts.map +1 -1
  141. package/dist/repo/task-repo.js +194 -20
  142. package/dist/repo/task-repo.js.map +1 -1
  143. package/dist/repo/tracked-project-repo.d.ts.map +1 -1
  144. package/dist/repo/tracked-project-repo.js +15 -1
  145. package/dist/repo/tracked-project-repo.js.map +1 -1
  146. package/dist/repo/worker-repo.d.ts +3 -2
  147. package/dist/repo/worker-repo.d.ts.map +1 -1
  148. package/dist/repo/worker-repo.js +54 -8
  149. package/dist/repo/worker-repo.js.map +1 -1
  150. package/dist/schemas/sync.js +2 -2
  151. package/dist/schemas/sync.js.map +1 -1
  152. package/dist/schemas/worker.d.ts +1 -0
  153. package/dist/schemas/worker.d.ts.map +1 -1
  154. package/dist/schemas/worker.js +1 -0
  155. package/dist/schemas/worker.js.map +1 -1
  156. package/dist/services/agent-service.d.ts +57 -0
  157. package/dist/services/agent-service.d.ts.map +1 -0
  158. package/dist/services/agent-service.js +81 -0
  159. package/dist/services/agent-service.js.map +1 -0
  160. package/dist/services/anchor-service.js +1 -1
  161. package/dist/services/anchor-service.js.map +1 -1
  162. package/dist/services/anchor-verification.d.ts +8 -0
  163. package/dist/services/anchor-verification.d.ts.map +1 -1
  164. package/dist/services/anchor-verification.js +237 -37
  165. package/dist/services/anchor-verification.js.map +1 -1
  166. package/dist/services/ast-grep-service.d.ts.map +1 -1
  167. package/dist/services/ast-grep-service.js +93 -22
  168. package/dist/services/ast-grep-service.js.map +1 -1
  169. package/dist/services/attempt-service.d.ts.map +1 -1
  170. package/dist/services/attempt-service.js +1 -4
  171. package/dist/services/attempt-service.js.map +1 -1
  172. package/dist/services/auto-sync-service.d.ts +1 -1
  173. package/dist/services/auto-sync-service.d.ts.map +1 -1
  174. package/dist/services/auto-sync-service.js +18 -10
  175. package/dist/services/auto-sync-service.js.map +1 -1
  176. package/dist/services/claim-service.d.ts +8 -2
  177. package/dist/services/claim-service.d.ts.map +1 -1
  178. package/dist/services/claim-service.js +37 -23
  179. package/dist/services/claim-service.js.map +1 -1
  180. package/dist/services/compaction-service.d.ts +105 -0
  181. package/dist/services/compaction-service.d.ts.map +1 -0
  182. package/dist/services/compaction-service.js +369 -0
  183. package/dist/services/compaction-service.js.map +1 -0
  184. package/dist/services/cycle-scan-service.d.ts +32 -0
  185. package/dist/services/cycle-scan-service.d.ts.map +1 -0
  186. package/dist/services/cycle-scan-service.js +542 -0
  187. package/dist/services/cycle-scan-service.js.map +1 -0
  188. package/dist/services/daemon-service.d.ts +40 -2
  189. package/dist/services/daemon-service.d.ts.map +1 -1
  190. package/dist/services/daemon-service.js +199 -52
  191. package/dist/services/daemon-service.js.map +1 -1
  192. package/dist/services/deduplication-service.d.ts +8 -4
  193. package/dist/services/deduplication-service.d.ts.map +1 -1
  194. package/dist/services/deduplication-service.js +79 -25
  195. package/dist/services/deduplication-service.js.map +1 -1
  196. package/dist/services/dep-service.d.ts +2 -2
  197. package/dist/services/dep-service.d.ts.map +1 -1
  198. package/dist/services/dep-service.js +9 -5
  199. package/dist/services/dep-service.js.map +1 -1
  200. package/dist/services/diversifier-service.d.ts +2 -1
  201. package/dist/services/diversifier-service.d.ts.map +1 -1
  202. package/dist/services/diversifier-service.js +37 -43
  203. package/dist/services/diversifier-service.js.map +1 -1
  204. package/dist/services/doc-service.d.ts +49 -0
  205. package/dist/services/doc-service.d.ts.map +1 -0
  206. package/dist/services/doc-service.js +605 -0
  207. package/dist/services/doc-service.js.map +1 -0
  208. package/dist/services/edge-service.js +2 -2
  209. package/dist/services/edge-service.js.map +1 -1
  210. package/dist/services/embedding-service.d.ts +66 -2
  211. package/dist/services/embedding-service.d.ts.map +1 -1
  212. package/dist/services/embedding-service.js +138 -24
  213. package/dist/services/embedding-service.js.map +1 -1
  214. package/dist/services/file-learning-service.d.ts.map +1 -1
  215. package/dist/services/file-learning-service.js +8 -7
  216. package/dist/services/file-learning-service.js.map +1 -1
  217. package/dist/services/file-watcher-service.d.ts.map +1 -1
  218. package/dist/services/file-watcher-service.js +58 -11
  219. package/dist/services/file-watcher-service.js.map +1 -1
  220. package/dist/services/graph-expansion.d.ts +3 -0
  221. package/dist/services/graph-expansion.d.ts.map +1 -1
  222. package/dist/services/graph-expansion.js +28 -7
  223. package/dist/services/graph-expansion.js.map +1 -1
  224. package/dist/services/hierarchy-service.d.ts +1 -1
  225. package/dist/services/hierarchy-service.d.ts.map +1 -1
  226. package/dist/services/hierarchy-service.js +50 -32
  227. package/dist/services/hierarchy-service.js.map +1 -1
  228. package/dist/services/index.d.ts +13 -15
  229. package/dist/services/index.d.ts.map +1 -1
  230. package/dist/services/index.js +13 -15
  231. package/dist/services/index.js.map +1 -1
  232. package/dist/services/learning-service.d.ts +4 -4
  233. package/dist/services/learning-service.d.ts.map +1 -1
  234. package/dist/services/learning-service.js +75 -42
  235. package/dist/services/learning-service.js.map +1 -1
  236. package/dist/services/llm-service.d.ts +62 -0
  237. package/dist/services/llm-service.d.ts.map +1 -0
  238. package/dist/services/llm-service.js +172 -0
  239. package/dist/services/llm-service.js.map +1 -0
  240. package/dist/services/migration-service.d.ts +1 -1
  241. package/dist/services/migration-service.d.ts.map +1 -1
  242. package/dist/services/migration-service.js +18 -7
  243. package/dist/services/migration-service.js.map +1 -1
  244. package/dist/services/orchestrator-service.d.ts +4 -3
  245. package/dist/services/orchestrator-service.d.ts.map +1 -1
  246. package/dist/services/orchestrator-service.js +67 -29
  247. package/dist/services/orchestrator-service.js.map +1 -1
  248. package/dist/services/promotion-service.d.ts +1 -1
  249. package/dist/services/promotion-service.js +1 -1
  250. package/dist/services/promotion-service.js.map +1 -1
  251. package/dist/services/query-expansion-service.d.ts +30 -9
  252. package/dist/services/query-expansion-service.d.ts.map +1 -1
  253. package/dist/services/query-expansion-service.js +54 -63
  254. package/dist/services/query-expansion-service.js.map +1 -1
  255. package/dist/services/ready-service.d.ts +21 -1
  256. package/dist/services/ready-service.d.ts.map +1 -1
  257. package/dist/services/ready-service.js +44 -21
  258. package/dist/services/ready-service.js.map +1 -1
  259. package/dist/services/retriever-service.d.ts +10 -10
  260. package/dist/services/retriever-service.d.ts.map +1 -1
  261. package/dist/services/retriever-service.js +53 -161
  262. package/dist/services/retriever-service.js.map +1 -1
  263. package/dist/services/swarm-verification.d.ts +2 -2
  264. package/dist/services/swarm-verification.d.ts.map +1 -1
  265. package/dist/services/swarm-verification.js +12 -6
  266. package/dist/services/swarm-verification.js.map +1 -1
  267. package/dist/services/sync-service.d.ts +17 -4
  268. package/dist/services/sync-service.d.ts.map +1 -1
  269. package/dist/services/sync-service.js +378 -114
  270. package/dist/services/sync-service.js.map +1 -1
  271. package/dist/services/task-service.d.ts +6 -4
  272. package/dist/services/task-service.d.ts.map +1 -1
  273. package/dist/services/task-service.js +162 -33
  274. package/dist/services/task-service.js.map +1 -1
  275. package/dist/services/tracing-service.d.ts +55 -0
  276. package/dist/services/tracing-service.d.ts.map +1 -0
  277. package/dist/services/tracing-service.js +99 -0
  278. package/dist/services/tracing-service.js.map +1 -0
  279. package/dist/services/transcript-adapter.d.ts +99 -0
  280. package/dist/services/transcript-adapter.d.ts.map +1 -0
  281. package/dist/services/transcript-adapter.js +283 -0
  282. package/dist/services/transcript-adapter.js.map +1 -0
  283. package/dist/services/validation-service.d.ts +85 -0
  284. package/dist/services/validation-service.d.ts.map +1 -0
  285. package/dist/services/validation-service.js +289 -0
  286. package/dist/services/validation-service.js.map +1 -0
  287. package/dist/services/worker-process.d.ts +23 -4
  288. package/dist/services/worker-process.d.ts.map +1 -1
  289. package/dist/services/worker-process.js +159 -70
  290. package/dist/services/worker-process.js.map +1 -1
  291. package/dist/services/worker-service.d.ts.map +1 -1
  292. package/dist/services/worker-service.js +7 -12
  293. package/dist/services/worker-service.js.map +1 -1
  294. package/dist/sync/claude-task-writer.d.ts +49 -0
  295. package/dist/sync/claude-task-writer.d.ts.map +1 -0
  296. package/dist/sync/claude-task-writer.js +135 -0
  297. package/dist/sync/claude-task-writer.js.map +1 -0
  298. package/dist/utils/doc-hash.d.ts +10 -0
  299. package/dist/utils/doc-hash.d.ts.map +1 -0
  300. package/dist/utils/doc-hash.js +14 -0
  301. package/dist/utils/doc-hash.js.map +1 -0
  302. package/dist/utils/doc-renderer.d.ts +44 -0
  303. package/dist/utils/doc-renderer.d.ts.map +1 -0
  304. package/dist/utils/doc-renderer.js +202 -0
  305. package/dist/utils/doc-renderer.js.map +1 -0
  306. package/dist/utils/math.d.ts +5 -1
  307. package/dist/utils/math.d.ts.map +1 -1
  308. package/dist/utils/math.js +12 -4
  309. package/dist/utils/math.js.map +1 -1
  310. package/dist/utils/sql.d.ts +9 -0
  311. package/dist/utils/sql.d.ts.map +1 -0
  312. package/dist/utils/sql.js +9 -0
  313. package/dist/utils/sql.js.map +1 -0
  314. package/dist/utils/toml-config.d.ts +22 -0
  315. package/dist/utils/toml-config.d.ts.map +1 -0
  316. package/dist/utils/toml-config.js +75 -0
  317. package/dist/utils/toml-config.js.map +1 -0
  318. package/dist/worker/hooks.d.ts +102 -0
  319. package/dist/worker/hooks.d.ts.map +1 -0
  320. package/dist/worker/hooks.js +11 -0
  321. package/dist/worker/hooks.js.map +1 -0
  322. package/dist/worker/index.d.ts +9 -0
  323. package/dist/worker/index.d.ts.map +1 -0
  324. package/dist/worker/index.js +8 -0
  325. package/dist/worker/index.js.map +1 -0
  326. package/dist/worker/run-worker.d.ts +33 -0
  327. package/dist/worker/run-worker.d.ts.map +1 -0
  328. package/dist/worker/run-worker.js +265 -0
  329. package/dist/worker/run-worker.js.map +1 -0
  330. package/package.json +14 -12
@@ -0,0 +1,99 @@
1
+ /**
2
+ * TranscriptAdapter - Abstracts parsing of LLM transcript formats.
3
+ *
4
+ * Different LLM tools produce different transcript formats:
5
+ * - Claude Code: JSONL with stream-json format
6
+ * - Future: Codex, Cursor, custom agents
7
+ *
8
+ * Adapters provide a unified interface for extracting tool calls
9
+ * and messages regardless of the source format.
10
+ *
11
+ * → DD-019: Primitive 3 (Transcript Adapters)
12
+ */
13
+ /**
14
+ * Represents a parsed tool call from a transcript.
15
+ */
16
+ export interface ToolCall {
17
+ /** ISO timestamp of when the tool call occurred */
18
+ readonly timestamp: string;
19
+ /** Name of the tool (e.g., "Read", "Bash", "Edit") */
20
+ readonly name: string;
21
+ /** Input parameters passed to the tool */
22
+ readonly input: Record<string, unknown>;
23
+ /** Tool call ID for correlation with results */
24
+ readonly id?: string;
25
+ /** Result of the tool call, if available */
26
+ readonly result?: string;
27
+ }
28
+ /**
29
+ * Represents a parsed message from a transcript.
30
+ */
31
+ export interface Message {
32
+ /** ISO timestamp of when the message occurred */
33
+ readonly timestamp: string;
34
+ /** Role of the message sender */
35
+ readonly role: "user" | "assistant";
36
+ /** Text content of the message */
37
+ readonly content: string;
38
+ }
39
+ /**
40
+ * Interface for adapters that parse different transcript formats.
41
+ * Implement this to support new LLM tools.
42
+ */
43
+ export interface TranscriptAdapter {
44
+ /**
45
+ * Parse tool calls from transcript lines.
46
+ * @param lines - Raw JSONL lines from the transcript file
47
+ * @returns Array of parsed tool calls
48
+ */
49
+ readonly parseToolCalls: (lines: readonly string[]) => readonly ToolCall[];
50
+ /**
51
+ * Parse messages from transcript lines.
52
+ * @param lines - Raw JSONL lines from the transcript file
53
+ * @returns Array of parsed messages
54
+ */
55
+ readonly parseMessages: (lines: readonly string[]) => readonly Message[];
56
+ /**
57
+ * Check if this adapter can handle the given agent type.
58
+ * Used for adapter registry selection.
59
+ * @param agentType - The agent type from runs.agent column
60
+ * @returns true if this adapter can parse transcripts from this agent
61
+ */
62
+ readonly canHandle: (agentType: string) => boolean;
63
+ }
64
+ /**
65
+ * ClaudeCodeAdapter - Parses Claude Code's --output-format stream-json.
66
+ *
67
+ * Format details:
68
+ * - Each line is a JSON object with a top-level `type` field
69
+ * - Tool calls: type="assistant" with message.content[].type="tool_use"
70
+ * - Messages: type="user" or type="assistant"
71
+ * - Timestamps are at the top level
72
+ */
73
+ export declare const ClaudeCodeAdapter: TranscriptAdapter;
74
+ /**
75
+ * GenericJSONLAdapter - Fallback adapter for unknown JSONL formats.
76
+ *
77
+ * Attempts to parse common patterns:
78
+ * - Tool calls: entries with `tool`, `name`, or `function` fields
79
+ * - Messages: entries with `role` or `type` indicating user/assistant
80
+ *
81
+ * Less strict parsing to handle various custom formats.
82
+ */
83
+ export declare const GenericJSONLAdapter: TranscriptAdapter;
84
+ /**
85
+ * Get the appropriate adapter for the given agent type.
86
+ * Returns GenericJSONLAdapter if no specific adapter matches.
87
+ *
88
+ * @param agentType - The agent type from runs.agent column
89
+ * @returns The adapter to use for parsing transcripts
90
+ */
91
+ export declare function getAdapter(agentType: string): TranscriptAdapter;
92
+ /**
93
+ * Register a custom adapter at the beginning of the registry.
94
+ * Custom adapters take precedence over built-in ones.
95
+ *
96
+ * @param adapter - The adapter to register
97
+ */
98
+ export declare function registerAdapter(adapter: TranscriptAdapter): void;
99
+ //# sourceMappingURL=transcript-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-adapter.d.ts","sourceRoot":"","sources":["../../src/services/transcript-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,mDAAmD;IACnD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACvC,gDAAgD;IAChD,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,iDAAiD;IACjD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAA;IACnC,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,QAAQ,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,SAAS,QAAQ,EAAE,CAAA;IAE1E;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,SAAS,OAAO,EAAE,CAAA;IAExE;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;CACnD;AAkDD;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,EAAE,iBA6I/B,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,EAAE,iBAoEjC,CAAA;AAaD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAGhE"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * TranscriptAdapter - Abstracts parsing of LLM transcript formats.
3
+ *
4
+ * Different LLM tools produce different transcript formats:
5
+ * - Claude Code: JSONL with stream-json format
6
+ * - Future: Codex, Cursor, custom agents
7
+ *
8
+ * Adapters provide a unified interface for extracting tool calls
9
+ * and messages regardless of the source format.
10
+ *
11
+ * → DD-019: Primitive 3 (Transcript Adapters)
12
+ */
13
+ /**
14
+ * Helper to safely parse a JSON line, returning null for empty or non-JSON lines.
15
+ * Only catches SyntaxError from JSON.parse; unexpected errors are re-thrown.
16
+ */
17
+ const safeParseJson = (line) => {
18
+ const trimmed = line.trim();
19
+ if (!trimmed)
20
+ return null;
21
+ try {
22
+ return JSON.parse(trimmed);
23
+ }
24
+ catch (error) {
25
+ if (error instanceof SyntaxError) {
26
+ return null;
27
+ }
28
+ // eslint-disable-next-line tx/no-throw-in-services -- Re-throw unexpected non-SyntaxError; this is a non-Effect utility helper
29
+ throw error;
30
+ }
31
+ };
32
+ /**
33
+ * Extract text content from Claude Code message content array.
34
+ * Content can be a string or an array of content blocks.
35
+ */
36
+ const extractTextContent = (content) => {
37
+ if (typeof content === "string") {
38
+ return content;
39
+ }
40
+ if (Array.isArray(content)) {
41
+ return content
42
+ .filter((block) => typeof block === "object" && block !== null)
43
+ .map((block) => {
44
+ if (block.type === "text" && typeof block.text === "string") {
45
+ return block.text;
46
+ }
47
+ if (block.type === "thinking" && typeof block.thinking === "string") {
48
+ return block.thinking;
49
+ }
50
+ return "";
51
+ })
52
+ .filter(Boolean)
53
+ .join("\n");
54
+ }
55
+ return "";
56
+ };
57
+ /**
58
+ * ClaudeCodeAdapter - Parses Claude Code's --output-format stream-json.
59
+ *
60
+ * Format details:
61
+ * - Each line is a JSON object with a top-level `type` field
62
+ * - Tool calls: type="assistant" with message.content[].type="tool_use"
63
+ * - Messages: type="user" or type="assistant"
64
+ * - Timestamps are at the top level
65
+ */
66
+ export const ClaudeCodeAdapter = {
67
+ canHandle: (agentType) => agentType.includes("claude") ||
68
+ agentType.includes("tx-") ||
69
+ agentType === "claude-code",
70
+ parseToolCalls: (lines) => {
71
+ const toolCalls = [];
72
+ const toolResults = new Map();
73
+ // First pass: collect tool results
74
+ for (const line of lines) {
75
+ const entry = safeParseJson(line);
76
+ if (!entry)
77
+ continue;
78
+ // Tool results come as type="user" with content[].type="tool_result"
79
+ if (entry.type === "user") {
80
+ const message = entry.message;
81
+ const content = message?.content;
82
+ if (Array.isArray(content)) {
83
+ for (const block of content) {
84
+ if (typeof block === "object" &&
85
+ block !== null &&
86
+ block.type === "tool_result") {
87
+ const toolResult = block;
88
+ const toolUseId = toolResult.tool_use_id;
89
+ const resultContent = toolResult.content;
90
+ if (toolUseId && typeof resultContent === "string") {
91
+ toolResults.set(toolUseId, resultContent);
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ // Second pass: collect tool calls
99
+ for (const line of lines) {
100
+ const entry = safeParseJson(line);
101
+ if (!entry)
102
+ continue;
103
+ // Tool calls come as type="assistant" with content[].type="tool_use"
104
+ if (entry.type === "assistant") {
105
+ const timestamp = entry.timestamp ?? new Date().toISOString();
106
+ const message = entry.message;
107
+ const content = message?.content;
108
+ if (Array.isArray(content)) {
109
+ for (const block of content) {
110
+ if (typeof block === "object" &&
111
+ block !== null &&
112
+ block.type === "tool_use") {
113
+ const toolUse = block;
114
+ const id = toolUse.id;
115
+ const name = toolUse.name;
116
+ const input = toolUse.input ?? {};
117
+ if (name) {
118
+ toolCalls.push({
119
+ timestamp,
120
+ name,
121
+ input,
122
+ id,
123
+ result: id ? toolResults.get(id) : undefined
124
+ });
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
130
+ }
131
+ return toolCalls;
132
+ },
133
+ parseMessages: (lines) => {
134
+ const messages = [];
135
+ for (const line of lines) {
136
+ const entry = safeParseJson(line);
137
+ if (!entry)
138
+ continue;
139
+ const timestamp = entry.timestamp ?? new Date().toISOString();
140
+ if (entry.type === "user") {
141
+ const message = entry.message;
142
+ if (!message)
143
+ continue;
144
+ // Skip tool results - those are handled in parseToolCalls
145
+ const content = message.content;
146
+ if (Array.isArray(content)) {
147
+ const hasOnlyToolResults = content.every((block) => typeof block === "object" &&
148
+ block !== null &&
149
+ block.type === "tool_result");
150
+ if (hasOnlyToolResults)
151
+ continue;
152
+ }
153
+ const text = extractTextContent(message.content);
154
+ if (text) {
155
+ messages.push({
156
+ timestamp,
157
+ role: "user",
158
+ content: text
159
+ });
160
+ }
161
+ }
162
+ else if (entry.type === "assistant") {
163
+ const message = entry.message;
164
+ if (!message)
165
+ continue;
166
+ // Skip entries that only contain tool_use blocks
167
+ const content = message.content;
168
+ if (Array.isArray(content)) {
169
+ const hasOnlyToolUse = content.every((block) => typeof block === "object" &&
170
+ block !== null &&
171
+ block.type === "tool_use");
172
+ if (hasOnlyToolUse)
173
+ continue;
174
+ }
175
+ const text = extractTextContent(message.content);
176
+ if (text) {
177
+ messages.push({
178
+ timestamp,
179
+ role: "assistant",
180
+ content: text
181
+ });
182
+ }
183
+ }
184
+ }
185
+ return messages;
186
+ }
187
+ };
188
+ /**
189
+ * GenericJSONLAdapter - Fallback adapter for unknown JSONL formats.
190
+ *
191
+ * Attempts to parse common patterns:
192
+ * - Tool calls: entries with `tool`, `name`, or `function` fields
193
+ * - Messages: entries with `role` or `type` indicating user/assistant
194
+ *
195
+ * Less strict parsing to handle various custom formats.
196
+ */
197
+ export const GenericJSONLAdapter = {
198
+ canHandle: () => true, // Always matches as fallback
199
+ parseToolCalls: (lines) => {
200
+ const toolCalls = [];
201
+ for (const line of lines) {
202
+ const entry = safeParseJson(line);
203
+ if (!entry)
204
+ continue;
205
+ // Look for common tool call patterns
206
+ const name = entry.tool ??
207
+ entry.name ??
208
+ entry.function ??
209
+ entry.tool_call?.name;
210
+ if (name) {
211
+ toolCalls.push({
212
+ timestamp: entry.timestamp ?? new Date().toISOString(),
213
+ name,
214
+ input: entry.input ??
215
+ entry.args ??
216
+ entry.arguments ??
217
+ entry.tool_call
218
+ ?.arguments ??
219
+ {},
220
+ id: entry.id,
221
+ result: entry.result
222
+ });
223
+ }
224
+ }
225
+ return toolCalls;
226
+ },
227
+ parseMessages: (lines) => {
228
+ const messages = [];
229
+ for (const line of lines) {
230
+ const entry = safeParseJson(line);
231
+ if (!entry)
232
+ continue;
233
+ // Determine role from common patterns
234
+ const role = entry.role ??
235
+ entry.type ??
236
+ entry.sender;
237
+ if (role === "user" || role === "assistant") {
238
+ const content = entry.content ??
239
+ entry.text ??
240
+ entry.message;
241
+ if (content) {
242
+ messages.push({
243
+ timestamp: entry.timestamp ?? new Date().toISOString(),
244
+ role,
245
+ content
246
+ });
247
+ }
248
+ }
249
+ }
250
+ return messages;
251
+ }
252
+ };
253
+ /**
254
+ * Registry of available transcript adapters.
255
+ * Order matters - first matching adapter is used.
256
+ * Mutable array to allow runtime registration of custom adapters.
257
+ */
258
+ const adapters = [
259
+ ClaudeCodeAdapter,
260
+ // Future: CodexAdapter, CursorAdapter, etc.
261
+ GenericJSONLAdapter // Fallback - always matches
262
+ ];
263
+ /**
264
+ * Get the appropriate adapter for the given agent type.
265
+ * Returns GenericJSONLAdapter if no specific adapter matches.
266
+ *
267
+ * @param agentType - The agent type from runs.agent column
268
+ * @returns The adapter to use for parsing transcripts
269
+ */
270
+ export function getAdapter(agentType) {
271
+ return adapters.find((a) => a.canHandle(agentType)) ?? GenericJSONLAdapter;
272
+ }
273
+ /**
274
+ * Register a custom adapter at the beginning of the registry.
275
+ * Custom adapters take precedence over built-in ones.
276
+ *
277
+ * @param adapter - The adapter to register
278
+ */
279
+ export function registerAdapter(adapter) {
280
+ // Insert at the beginning, before GenericJSONLAdapter fallback
281
+ adapters.unshift(adapter);
282
+ }
283
+ //# sourceMappingURL=transcript-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript-adapter.js","sourceRoot":"","sources":["../../src/services/transcript-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import { Context, Effect, Layer } from "effect";
2
+ import { SqliteClient } from "../db.js";
3
+ import { DatabaseError } from "../errors.js";
4
+ /**
5
+ * Severity level for validation issues.
6
+ */
7
+ export type ValidationSeverity = "error" | "warning" | "info";
8
+ /**
9
+ * A single validation issue found during validation.
10
+ */
11
+ export interface ValidationIssue {
12
+ readonly check: string;
13
+ readonly severity: ValidationSeverity;
14
+ readonly message: string;
15
+ readonly details?: Record<string, unknown>;
16
+ }
17
+ /**
18
+ * Result of a single validation check.
19
+ */
20
+ export interface CheckResult {
21
+ readonly name: string;
22
+ readonly passed: boolean;
23
+ readonly issues: readonly ValidationIssue[];
24
+ readonly fixable: boolean;
25
+ readonly fixed?: number;
26
+ }
27
+ /**
28
+ * Overall validation result.
29
+ */
30
+ export interface ValidationResult {
31
+ readonly valid: boolean;
32
+ readonly checks: readonly CheckResult[];
33
+ readonly issueCount: {
34
+ readonly error: number;
35
+ readonly warning: number;
36
+ readonly info: number;
37
+ };
38
+ readonly fixedCount: number;
39
+ }
40
+ /**
41
+ * Options for running validation.
42
+ */
43
+ export interface ValidateOptions {
44
+ readonly fix?: boolean;
45
+ }
46
+ declare const ValidationService_base: Context.TagClass<ValidationService, "ValidationService", {
47
+ /**
48
+ * Run all validation checks.
49
+ * Returns a summary of issues found.
50
+ */
51
+ readonly validate: (options?: ValidateOptions) => Effect.Effect<ValidationResult, DatabaseError>;
52
+ /**
53
+ * Run SQLite integrity check.
54
+ */
55
+ readonly checkIntegrity: () => Effect.Effect<CheckResult, DatabaseError>;
56
+ /**
57
+ * Verify schema version matches latest migration.
58
+ */
59
+ readonly checkSchemaVersion: () => Effect.Effect<CheckResult, DatabaseError>;
60
+ /**
61
+ * Check foreign key constraints.
62
+ */
63
+ readonly checkForeignKeys: () => Effect.Effect<CheckResult, DatabaseError>;
64
+ /**
65
+ * Detect orphaned dependencies (referencing non-existent tasks).
66
+ */
67
+ readonly checkOrphanedDependencies: (fix?: boolean) => Effect.Effect<CheckResult, DatabaseError>;
68
+ /**
69
+ * Scan for invalid status values.
70
+ */
71
+ readonly checkInvalidStatuses: (fix?: boolean) => Effect.Effect<CheckResult, DatabaseError>;
72
+ /**
73
+ * Check for missing task references in parent_id.
74
+ */
75
+ readonly checkMissingParentRefs: (fix?: boolean) => Effect.Effect<CheckResult, DatabaseError>;
76
+ }>;
77
+ /**
78
+ * ValidationService performs pre-flight database checks.
79
+ * Follows Effect-TS patterns per DD-002.
80
+ */
81
+ export declare class ValidationService extends ValidationService_base {
82
+ }
83
+ export declare const ValidationServiceLive: Layer.Layer<ValidationService, never, SqliteClient>;
84
+ export {};
85
+ //# sourceMappingURL=validation-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-service.d.ts","sourceRoot":"","sources":["../../src/services/validation-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAI5C;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAA;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAA;IAC3C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAA;IACvC,QAAQ,CAAC,UAAU,EAAE;QACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KACtB,CAAA;IACD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CACvB;;IASG;;;OAGG;uBACgB,CAAC,OAAO,CAAC,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,aAAa,CAAC;IAEhG;;OAEG;6BACsB,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;IAExE;;OAEG;iCAC0B,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;IAE5E;;OAEG;+BACwB,MAAM,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;IAE1E;;OAEG;wCACiC,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;IAEhG;;OAEG;mCAC4B,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;IAE3F;;OAEG;qCAC8B,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,aAAa,CAAC;;AAzCjG;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,sBAuCpC;CAAG;AAEN,eAAO,MAAM,qBAAqB,qDAyUjC,CAAA"}