kairo-mcp 1.3.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.
Files changed (384) hide show
  1. package/CHANGELOG.md +1122 -0
  2. package/LICENSE +21 -0
  3. package/README.md +662 -0
  4. package/dist/cli/cli.d.ts +3 -0
  5. package/dist/cli/cli.d.ts.map +1 -0
  6. package/dist/cli/cli.js +226 -0
  7. package/dist/cli/cli.js.map +1 -0
  8. package/dist/cli/commands.d.ts +10 -0
  9. package/dist/cli/commands.d.ts.map +1 -0
  10. package/dist/cli/commands.js +938 -0
  11. package/dist/cli/commands.js.map +1 -0
  12. package/dist/cli/flags.d.ts +30 -0
  13. package/dist/cli/flags.d.ts.map +1 -0
  14. package/dist/cli/flags.js +90 -0
  15. package/dist/cli/flags.js.map +1 -0
  16. package/dist/cli/output.d.ts +69 -0
  17. package/dist/cli/output.d.ts.map +1 -0
  18. package/dist/cli/output.js +166 -0
  19. package/dist/cli/output.js.map +1 -0
  20. package/dist/cli/types.d.ts +34 -0
  21. package/dist/cli/types.d.ts.map +1 -0
  22. package/dist/cli/types.js +2 -0
  23. package/dist/cli/types.js.map +1 -0
  24. package/dist/contracts/migrations.d.ts +31 -0
  25. package/dist/contracts/migrations.d.ts.map +1 -0
  26. package/dist/contracts/migrations.js +71 -0
  27. package/dist/contracts/migrations.js.map +1 -0
  28. package/dist/contracts/schemas.d.ts +53 -0
  29. package/dist/contracts/schemas.d.ts.map +1 -0
  30. package/dist/contracts/schemas.js +27 -0
  31. package/dist/contracts/schemas.js.map +1 -0
  32. package/dist/contracts/stability.d.ts +32 -0
  33. package/dist/contracts/stability.d.ts.map +1 -0
  34. package/dist/contracts/stability.js +140 -0
  35. package/dist/contracts/stability.js.map +1 -0
  36. package/dist/contracts/zodSchemas.d.ts +811 -0
  37. package/dist/contracts/zodSchemas.d.ts.map +1 -0
  38. package/dist/contracts/zodSchemas.js +139 -0
  39. package/dist/contracts/zodSchemas.js.map +1 -0
  40. package/dist/core/brief/budget.d.ts +21 -0
  41. package/dist/core/brief/budget.d.ts.map +1 -0
  42. package/dist/core/brief/budget.js +42 -0
  43. package/dist/core/brief/budget.js.map +1 -0
  44. package/dist/core/checkpoint/checkpointManager.d.ts +29 -0
  45. package/dist/core/checkpoint/checkpointManager.d.ts.map +1 -0
  46. package/dist/core/checkpoint/checkpointManager.js +49 -0
  47. package/dist/core/checkpoint/checkpointManager.js.map +1 -0
  48. package/dist/core/compaction/compactor.d.ts +40 -0
  49. package/dist/core/compaction/compactor.d.ts.map +1 -0
  50. package/dist/core/compaction/compactor.js +168 -0
  51. package/dist/core/compaction/compactor.js.map +1 -0
  52. package/dist/core/continuation/continuationBuilder.d.ts +19 -0
  53. package/dist/core/continuation/continuationBuilder.d.ts.map +1 -0
  54. package/dist/core/continuation/continuationBuilder.js +184 -0
  55. package/dist/core/continuation/continuationBuilder.js.map +1 -0
  56. package/dist/core/coordination/coordinationManager.d.ts +34 -0
  57. package/dist/core/coordination/coordinationManager.d.ts.map +1 -0
  58. package/dist/core/coordination/coordinationManager.js +253 -0
  59. package/dist/core/coordination/coordinationManager.js.map +1 -0
  60. package/dist/core/coordination/types.d.ts +52 -0
  61. package/dist/core/coordination/types.d.ts.map +1 -0
  62. package/dist/core/coordination/types.js +6 -0
  63. package/dist/core/coordination/types.js.map +1 -0
  64. package/dist/core/github/changelog.d.ts +9 -0
  65. package/dist/core/github/changelog.d.ts.map +1 -0
  66. package/dist/core/github/changelog.js +41 -0
  67. package/dist/core/github/changelog.js.map +1 -0
  68. package/dist/core/github/commitMessage.d.ts +4 -0
  69. package/dist/core/github/commitMessage.d.ts.map +1 -0
  70. package/dist/core/github/commitMessage.js +125 -0
  71. package/dist/core/github/commitMessage.js.map +1 -0
  72. package/dist/core/github/gitContext.d.ts +3 -0
  73. package/dist/core/github/gitContext.d.ts.map +1 -0
  74. package/dist/core/github/gitContext.js +67 -0
  75. package/dist/core/github/gitContext.js.map +1 -0
  76. package/dist/core/github/releasePlan.d.ts +8 -0
  77. package/dist/core/github/releasePlan.d.ts.map +1 -0
  78. package/dist/core/github/releasePlan.js +56 -0
  79. package/dist/core/github/releasePlan.js.map +1 -0
  80. package/dist/core/github/semver.d.ts +11 -0
  81. package/dist/core/github/semver.d.ts.map +1 -0
  82. package/dist/core/github/semver.js +23 -0
  83. package/dist/core/github/semver.js.map +1 -0
  84. package/dist/core/github/types.d.ts +36 -0
  85. package/dist/core/github/types.d.ts.map +1 -0
  86. package/dist/core/github/types.js +2 -0
  87. package/dist/core/github/types.js.map +1 -0
  88. package/dist/core/graph/derived.d.ts +6 -0
  89. package/dist/core/graph/derived.d.ts.map +1 -0
  90. package/dist/core/graph/derived.js +133 -0
  91. package/dist/core/graph/derived.js.map +1 -0
  92. package/dist/core/graph/graphEngine.d.ts +11 -0
  93. package/dist/core/graph/graphEngine.d.ts.map +1 -0
  94. package/dist/core/graph/graphEngine.js +28 -0
  95. package/dist/core/graph/graphEngine.js.map +1 -0
  96. package/dist/core/graph/imports.d.ts +19 -0
  97. package/dist/core/graph/imports.d.ts.map +1 -0
  98. package/dist/core/graph/imports.js +0 -0
  99. package/dist/core/graph/imports.js.map +1 -0
  100. package/dist/core/graph/mermaid.d.ts +6 -0
  101. package/dist/core/graph/mermaid.d.ts.map +1 -0
  102. package/dist/core/graph/mermaid.js +40 -0
  103. package/dist/core/graph/mermaid.js.map +1 -0
  104. package/dist/core/graph/moduleGraph.d.ts +27 -0
  105. package/dist/core/graph/moduleGraph.d.ts.map +1 -0
  106. package/dist/core/graph/moduleGraph.js +186 -0
  107. package/dist/core/graph/moduleGraph.js.map +1 -0
  108. package/dist/core/graph/types.d.ts +32 -0
  109. package/dist/core/graph/types.d.ts.map +1 -0
  110. package/dist/core/graph/types.js +2 -0
  111. package/dist/core/graph/types.js.map +1 -0
  112. package/dist/core/query/queryEngine.d.ts +26 -0
  113. package/dist/core/query/queryEngine.d.ts.map +1 -0
  114. package/dist/core/query/queryEngine.js +258 -0
  115. package/dist/core/query/queryEngine.js.map +1 -0
  116. package/dist/core/query/types.d.ts +70 -0
  117. package/dist/core/query/types.d.ts.map +1 -0
  118. package/dist/core/query/types.js +6 -0
  119. package/dist/core/query/types.js.map +1 -0
  120. package/dist/core/repo/fingerprint.d.ts +0 -0
  121. package/dist/core/repo/fingerprint.d.ts.map +1 -0
  122. package/dist/core/repo/fingerprint.js +17 -0
  123. package/dist/core/repo/fingerprint.js.map +1 -0
  124. package/dist/core/repo/frameworkDetectors.d.ts +14 -0
  125. package/dist/core/repo/frameworkDetectors.d.ts.map +1 -0
  126. package/dist/core/repo/frameworkDetectors.js +151 -0
  127. package/dist/core/repo/frameworkDetectors.js.map +1 -0
  128. package/dist/core/repo/repoScanner.d.ts +20 -0
  129. package/dist/core/repo/repoScanner.d.ts.map +1 -0
  130. package/dist/core/repo/repoScanner.js +290 -0
  131. package/dist/core/repo/repoScanner.js.map +1 -0
  132. package/dist/core/repo/summary.d.ts +7 -0
  133. package/dist/core/repo/summary.d.ts.map +1 -0
  134. package/dist/core/repo/summary.js +34 -0
  135. package/dist/core/repo/summary.js.map +1 -0
  136. package/dist/core/repo/types.d.ts +62 -0
  137. package/dist/core/repo/types.d.ts.map +1 -0
  138. package/dist/core/repo/types.js +10 -0
  139. package/dist/core/repo/types.js.map +1 -0
  140. package/dist/core/risk/guardrail.d.ts +3 -0
  141. package/dist/core/risk/guardrail.d.ts.map +1 -0
  142. package/dist/core/risk/guardrail.js +47 -0
  143. package/dist/core/risk/guardrail.js.map +1 -0
  144. package/dist/core/risk/riskEngine.d.ts +8 -0
  145. package/dist/core/risk/riskEngine.d.ts.map +1 -0
  146. package/dist/core/risk/riskEngine.js +112 -0
  147. package/dist/core/risk/riskEngine.js.map +1 -0
  148. package/dist/core/risk/riskHeuristics.d.ts +4 -0
  149. package/dist/core/risk/riskHeuristics.d.ts.map +1 -0
  150. package/dist/core/risk/riskHeuristics.js +36 -0
  151. package/dist/core/risk/riskHeuristics.js.map +1 -0
  152. package/dist/core/salience/config.d.ts +14 -0
  153. package/dist/core/salience/config.d.ts.map +1 -0
  154. package/dist/core/salience/config.js +87 -0
  155. package/dist/core/salience/config.js.map +1 -0
  156. package/dist/core/salience/salienceEngine.d.ts +16 -0
  157. package/dist/core/salience/salienceEngine.d.ts.map +1 -0
  158. package/dist/core/salience/salienceEngine.js +64 -0
  159. package/dist/core/salience/salienceEngine.js.map +1 -0
  160. package/dist/core/salience/signals.d.ts +4 -0
  161. package/dist/core/salience/signals.d.ts.map +1 -0
  162. package/dist/core/salience/signals.js +143 -0
  163. package/dist/core/salience/signals.js.map +1 -0
  164. package/dist/core/salience/types.d.ts +69 -0
  165. package/dist/core/salience/types.d.ts.map +1 -0
  166. package/dist/core/salience/types.js +7 -0
  167. package/dist/core/salience/types.js.map +1 -0
  168. package/dist/core/session/eventPayloads.d.ts +92 -0
  169. package/dist/core/session/eventPayloads.d.ts.map +1 -0
  170. package/dist/core/session/eventPayloads.js +2 -0
  171. package/dist/core/session/eventPayloads.js.map +1 -0
  172. package/dist/core/session/reducer.d.ts +14 -0
  173. package/dist/core/session/reducer.d.ts.map +1 -0
  174. package/dist/core/session/reducer.js +181 -0
  175. package/dist/core/session/reducer.js.map +1 -0
  176. package/dist/core/session/sessionManager.d.ts +252 -0
  177. package/dist/core/session/sessionManager.d.ts.map +1 -0
  178. package/dist/core/session/sessionManager.js +655 -0
  179. package/dist/core/session/sessionManager.js.map +1 -0
  180. package/dist/core/telemetry/analytics.d.ts +24 -0
  181. package/dist/core/telemetry/analytics.d.ts.map +1 -0
  182. package/dist/core/telemetry/analytics.js +167 -0
  183. package/dist/core/telemetry/analytics.js.map +1 -0
  184. package/dist/core/telemetry/exporter.d.ts +17 -0
  185. package/dist/core/telemetry/exporter.d.ts.map +1 -0
  186. package/dist/core/telemetry/exporter.js +31 -0
  187. package/dist/core/telemetry/exporter.js.map +1 -0
  188. package/dist/core/telemetry/recorder.d.ts +19 -0
  189. package/dist/core/telemetry/recorder.d.ts.map +1 -0
  190. package/dist/core/telemetry/recorder.js +43 -0
  191. package/dist/core/telemetry/recorder.js.map +1 -0
  192. package/dist/core/telemetry/reports.d.ts +6 -0
  193. package/dist/core/telemetry/reports.d.ts.map +1 -0
  194. package/dist/core/telemetry/reports.js +84 -0
  195. package/dist/core/telemetry/reports.js.map +1 -0
  196. package/dist/core/telemetry/types.d.ts +82 -0
  197. package/dist/core/telemetry/types.d.ts.map +1 -0
  198. package/dist/core/telemetry/types.js +9 -0
  199. package/dist/core/telemetry/types.js.map +1 -0
  200. package/dist/core/vector/chunking/memoryChunker.d.ts +10 -0
  201. package/dist/core/vector/chunking/memoryChunker.d.ts.map +1 -0
  202. package/dist/core/vector/chunking/memoryChunker.js +202 -0
  203. package/dist/core/vector/chunking/memoryChunker.js.map +1 -0
  204. package/dist/core/vector/compression/architectureDigest.d.ts +12 -0
  205. package/dist/core/vector/compression/architectureDigest.d.ts.map +1 -0
  206. package/dist/core/vector/compression/architectureDigest.js +37 -0
  207. package/dist/core/vector/compression/architectureDigest.js.map +1 -0
  208. package/dist/core/vector/embedding/deterministicEmbedder.d.ts +10 -0
  209. package/dist/core/vector/embedding/deterministicEmbedder.d.ts.map +1 -0
  210. package/dist/core/vector/embedding/deterministicEmbedder.js +84 -0
  211. package/dist/core/vector/embedding/deterministicEmbedder.js.map +1 -0
  212. package/dist/core/vector/memory/memoryEngine.d.ts +56 -0
  213. package/dist/core/vector/memory/memoryEngine.d.ts.map +1 -0
  214. package/dist/core/vector/memory/memoryEngine.js +204 -0
  215. package/dist/core/vector/memory/memoryEngine.js.map +1 -0
  216. package/dist/core/vector/memory/memoryFingerprint.d.ts +12 -0
  217. package/dist/core/vector/memory/memoryFingerprint.d.ts.map +1 -0
  218. package/dist/core/vector/memory/memoryFingerprint.js +33 -0
  219. package/dist/core/vector/memory/memoryFingerprint.js.map +1 -0
  220. package/dist/core/vector/providers/deterministicProvider.d.ts +14 -0
  221. package/dist/core/vector/providers/deterministicProvider.d.ts.map +1 -0
  222. package/dist/core/vector/providers/deterministicProvider.js +22 -0
  223. package/dist/core/vector/providers/deterministicProvider.js.map +1 -0
  224. package/dist/core/vector/providers/httpEmbeddingProvider.d.ts +32 -0
  225. package/dist/core/vector/providers/httpEmbeddingProvider.d.ts.map +1 -0
  226. package/dist/core/vector/providers/httpEmbeddingProvider.js +93 -0
  227. package/dist/core/vector/providers/httpEmbeddingProvider.js.map +1 -0
  228. package/dist/core/vector/providers/registry.d.ts +9 -0
  229. package/dist/core/vector/providers/registry.d.ts.map +1 -0
  230. package/dist/core/vector/providers/registry.js +79 -0
  231. package/dist/core/vector/providers/registry.js.map +1 -0
  232. package/dist/core/vector/providers/types.d.ts +23 -0
  233. package/dist/core/vector/providers/types.d.ts.map +1 -0
  234. package/dist/core/vector/providers/types.js +2 -0
  235. package/dist/core/vector/providers/types.js.map +1 -0
  236. package/dist/core/vector/retrieval/hybridRetriever.d.ts +37 -0
  237. package/dist/core/vector/retrieval/hybridRetriever.d.ts.map +1 -0
  238. package/dist/core/vector/retrieval/hybridRetriever.js +131 -0
  239. package/dist/core/vector/retrieval/hybridRetriever.js.map +1 -0
  240. package/dist/core/vector/types.d.ts +87 -0
  241. package/dist/core/vector/types.d.ts.map +1 -0
  242. package/dist/core/vector/types.js +6 -0
  243. package/dist/core/vector/types.js.map +1 -0
  244. package/dist/index.d.ts +3 -0
  245. package/dist/index.d.ts.map +1 -0
  246. package/dist/index.js +30 -0
  247. package/dist/index.js.map +1 -0
  248. package/dist/inspect/cli.d.ts +3 -0
  249. package/dist/inspect/cli.d.ts.map +1 -0
  250. package/dist/inspect/cli.js +40 -0
  251. package/dist/inspect/cli.js.map +1 -0
  252. package/dist/inspect/projections.d.ts +141 -0
  253. package/dist/inspect/projections.d.ts.map +1 -0
  254. package/dist/inspect/projections.js +311 -0
  255. package/dist/inspect/projections.js.map +1 -0
  256. package/dist/inspect/render.d.ts +27 -0
  257. package/dist/inspect/render.d.ts.map +1 -0
  258. package/dist/inspect/render.js +325 -0
  259. package/dist/inspect/render.js.map +1 -0
  260. package/dist/inspect/server.d.ts +18 -0
  261. package/dist/inspect/server.d.ts.map +1 -0
  262. package/dist/inspect/server.js +112 -0
  263. package/dist/inspect/server.js.map +1 -0
  264. package/dist/perf/index.d.ts +24 -0
  265. package/dist/perf/index.d.ts.map +1 -0
  266. package/dist/perf/index.js +38 -0
  267. package/dist/perf/index.js.map +1 -0
  268. package/dist/perf/report.d.ts +8 -0
  269. package/dist/perf/report.d.ts.map +1 -0
  270. package/dist/perf/report.js +52 -0
  271. package/dist/perf/report.js.map +1 -0
  272. package/dist/perf/runner.d.ts +29 -0
  273. package/dist/perf/runner.d.ts.map +1 -0
  274. package/dist/perf/runner.js +74 -0
  275. package/dist/perf/runner.js.map +1 -0
  276. package/dist/perf/scenarios.d.ts +8 -0
  277. package/dist/perf/scenarios.d.ts.map +1 -0
  278. package/dist/perf/scenarios.js +119 -0
  279. package/dist/perf/scenarios.js.map +1 -0
  280. package/dist/perf/types.d.ts +32 -0
  281. package/dist/perf/types.d.ts.map +1 -0
  282. package/dist/perf/types.js +6 -0
  283. package/dist/perf/types.js.map +1 -0
  284. package/dist/plugins/loader.d.ts +78 -0
  285. package/dist/plugins/loader.d.ts.map +1 -0
  286. package/dist/plugins/loader.js +193 -0
  287. package/dist/plugins/loader.js.map +1 -0
  288. package/dist/plugins/types.d.ts +38 -0
  289. package/dist/plugins/types.d.ts.map +1 -0
  290. package/dist/plugins/types.js +10 -0
  291. package/dist/plugins/types.js.map +1 -0
  292. package/dist/pressure/pressureModel.d.ts +6 -0
  293. package/dist/pressure/pressureModel.d.ts.map +1 -0
  294. package/dist/pressure/pressureModel.js +102 -0
  295. package/dist/pressure/pressureModel.js.map +1 -0
  296. package/dist/prompts/continuityPrompt.d.ts +7 -0
  297. package/dist/prompts/continuityPrompt.d.ts.map +1 -0
  298. package/dist/prompts/continuityPrompt.js +43 -0
  299. package/dist/prompts/continuityPrompt.js.map +1 -0
  300. package/dist/sdk/index.d.ts +53 -0
  301. package/dist/sdk/index.d.ts.map +1 -0
  302. package/dist/sdk/index.js +130 -0
  303. package/dist/sdk/index.js.map +1 -0
  304. package/dist/security/patterns.d.ts +16 -0
  305. package/dist/security/patterns.d.ts.map +1 -0
  306. package/dist/security/patterns.js +61 -0
  307. package/dist/security/patterns.js.map +1 -0
  308. package/dist/security/redactor.d.ts +20 -0
  309. package/dist/security/redactor.d.ts.map +1 -0
  310. package/dist/security/redactor.js +58 -0
  311. package/dist/security/redactor.js.map +1 -0
  312. package/dist/server/createServer.d.ts +10 -0
  313. package/dist/server/createServer.d.ts.map +1 -0
  314. package/dist/server/createServer.js +60 -0
  315. package/dist/server/createServer.js.map +1 -0
  316. package/dist/server/registerTools.d.ts +4 -0
  317. package/dist/server/registerTools.d.ts.map +1 -0
  318. package/dist/server/registerTools.js +1086 -0
  319. package/dist/server/registerTools.js.map +1 -0
  320. package/dist/server/responses.d.ts +17 -0
  321. package/dist/server/responses.d.ts.map +1 -0
  322. package/dist/server/responses.js +21 -0
  323. package/dist/server/responses.js.map +1 -0
  324. package/dist/snapshot/export.d.ts +26 -0
  325. package/dist/snapshot/export.d.ts.map +1 -0
  326. package/dist/snapshot/export.js +164 -0
  327. package/dist/snapshot/export.js.map +1 -0
  328. package/dist/snapshot/import.d.ts +34 -0
  329. package/dist/snapshot/import.d.ts.map +1 -0
  330. package/dist/snapshot/import.js +114 -0
  331. package/dist/snapshot/import.js.map +1 -0
  332. package/dist/snapshot/types.d.ts +63 -0
  333. package/dist/snapshot/types.d.ts.map +1 -0
  334. package/dist/snapshot/types.js +2 -0
  335. package/dist/snapshot/types.js.map +1 -0
  336. package/dist/storage/faultAdapter.d.ts +64 -0
  337. package/dist/storage/faultAdapter.d.ts.map +1 -0
  338. package/dist/storage/faultAdapter.js +134 -0
  339. package/dist/storage/faultAdapter.js.map +1 -0
  340. package/dist/storage/fileStorageAdapter.d.ts +55 -0
  341. package/dist/storage/fileStorageAdapter.d.ts.map +1 -0
  342. package/dist/storage/fileStorageAdapter.js +219 -0
  343. package/dist/storage/fileStorageAdapter.js.map +1 -0
  344. package/dist/storage/paths.d.ts +30 -0
  345. package/dist/storage/paths.d.ts.map +1 -0
  346. package/dist/storage/paths.js +32 -0
  347. package/dist/storage/paths.js.map +1 -0
  348. package/dist/storage/quarantine.d.ts +36 -0
  349. package/dist/storage/quarantine.d.ts.map +1 -0
  350. package/dist/storage/quarantine.js +26 -0
  351. package/dist/storage/quarantine.js.map +1 -0
  352. package/dist/storage/redactingAdapter.d.ts +13 -0
  353. package/dist/storage/redactingAdapter.d.ts.map +1 -0
  354. package/dist/storage/redactingAdapter.js +91 -0
  355. package/dist/storage/redactingAdapter.js.map +1 -0
  356. package/dist/storage/storageAdapter.d.ts +46 -0
  357. package/dist/storage/storageAdapter.d.ts.map +1 -0
  358. package/dist/storage/storageAdapter.js +2 -0
  359. package/dist/storage/storageAdapter.js.map +1 -0
  360. package/dist/types/domain.d.ts +139 -0
  361. package/dist/types/domain.d.ts.map +1 -0
  362. package/dist/types/domain.js +9 -0
  363. package/dist/types/domain.js.map +1 -0
  364. package/dist/types/events.d.ts +28 -0
  365. package/dist/types/events.d.ts.map +1 -0
  366. package/dist/types/events.js +7 -0
  367. package/dist/types/events.js.map +1 -0
  368. package/dist/utils/errors.d.ts +6 -0
  369. package/dist/utils/errors.d.ts.map +1 -0
  370. package/dist/utils/errors.js +10 -0
  371. package/dist/utils/errors.js.map +1 -0
  372. package/dist/utils/ids.d.ts +7 -0
  373. package/dist/utils/ids.d.ts.map +1 -0
  374. package/dist/utils/ids.js +22 -0
  375. package/dist/utils/ids.js.map +1 -0
  376. package/dist/utils/logger.d.ts +7 -0
  377. package/dist/utils/logger.d.ts.map +1 -0
  378. package/dist/utils/logger.js +26 -0
  379. package/dist/utils/logger.js.map +1 -0
  380. package/dist/utils/time.d.ts +8 -0
  381. package/dist/utils/time.d.ts.map +1 -0
  382. package/dist/utils/time.js +11 -0
  383. package/dist/utils/time.js.map +1 -0
  384. package/package.json +79 -0
@@ -0,0 +1,64 @@
1
+ import type { StorageAdapter } from './storageAdapter.js';
2
+ import type { AuditEntry, KairoEvent } from '../types/events.js';
3
+ import type { Checkpoint, SessionState } from '../types/domain.js';
4
+ import type { RepoIntelligence } from '../core/repo/types.js';
5
+ import type { VectorIndex } from '../core/vector/types.js';
6
+ import type { TelemetryEvent } from '../core/telemetry/types.js';
7
+ /**
8
+ * Deterministic in-process fault injection for storage operations
9
+ * (ADR-0013). Tests configure rules; the adapter applies them.
10
+ *
11
+ * Honest scope: faults are *simulations*, not real disk failures. They
12
+ * prove the handler code is correct (e.g. the caller releases a lease on
13
+ * appendEvent error), not that the OS layer is correct. By convention this
14
+ * adapter is test-only — the constructor warns when NODE_ENV is not "test".
15
+ */
16
+ export type StorageMethod = 'init' | 'appendEvent' | 'readEvents' | 'saveSessionSnapshot' | 'loadSessionSnapshot' | 'saveCheckpoint' | 'loadCheckpoint' | 'loadLatestCheckpoint' | 'saveContinuation' | 'loadContinuation' | 'loadLatestContinuation' | 'saveIntelligence' | 'loadLatestIntelligence' | 'loadIntelligenceByFingerprint' | 'saveGraph' | 'saveVectorIndex' | 'loadVectorIndex' | 'audit' | 'readAudit' | 'appendTelemetry' | 'readTelemetry' | 'saveReport';
17
+ export interface FailRule {
18
+ /** Trigger on the Nth call (1-indexed). Default 1. */
19
+ afterN?: number;
20
+ /** Trigger on every call once `afterN` is reached. Default false. */
21
+ repeating?: boolean;
22
+ /** Error to throw. Defaults to a generic Error. */
23
+ error?: Error;
24
+ }
25
+ export declare class FaultInjector {
26
+ private readonly rules;
27
+ failOn(method: StorageMethod, rule?: FailRule): this;
28
+ reset(): void;
29
+ /**
30
+ * Test whether the next call to `method` should throw. Increments the
31
+ * internal counter for that method on every call (whether or not it
32
+ * fires).
33
+ */
34
+ shouldFail(method: StorageMethod): Error | undefined;
35
+ }
36
+ export declare class FaultInjectingAdapter implements StorageAdapter {
37
+ private readonly inner;
38
+ private readonly fi;
39
+ constructor(inner: StorageAdapter, fi: FaultInjector);
40
+ private maybeThrow;
41
+ init(): Promise<void>;
42
+ appendEvent(e: KairoEvent): Promise<void>;
43
+ readEvents(): Promise<KairoEvent[]>;
44
+ saveSessionSnapshot(s: SessionState): Promise<void>;
45
+ loadSessionSnapshot(id: string): Promise<SessionState | undefined>;
46
+ saveCheckpoint(c: Checkpoint): Promise<void>;
47
+ loadCheckpoint(id: string): Promise<Checkpoint | undefined>;
48
+ loadLatestCheckpoint(): Promise<Checkpoint | undefined>;
49
+ saveContinuation(name: string, md: string): Promise<string>;
50
+ loadContinuation(name: string): Promise<string | undefined>;
51
+ loadLatestContinuation(): Promise<string | undefined>;
52
+ saveIntelligence(i: RepoIntelligence): Promise<void>;
53
+ loadLatestIntelligence(): Promise<RepoIntelligence | undefined>;
54
+ loadIntelligenceByFingerprint(fp: string): Promise<RepoIntelligence | undefined>;
55
+ saveGraph(kind: string, md: string): Promise<void>;
56
+ saveVectorIndex(i: VectorIndex): Promise<void>;
57
+ loadVectorIndex(): Promise<VectorIndex | undefined>;
58
+ audit(e: AuditEntry): Promise<void>;
59
+ readAudit(): Promise<AuditEntry[]>;
60
+ appendTelemetry(e: TelemetryEvent): Promise<void>;
61
+ readTelemetry(): Promise<TelemetryEvent[]>;
62
+ saveReport(name: string, md: string): Promise<void>;
63
+ }
64
+ //# sourceMappingURL=faultAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faultAdapter.d.ts","sourceRoot":"","sources":["../../src/storage/faultAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ import { logger } from '../utils/logger.js';
2
+ export class FaultInjector {
3
+ rules = new Map();
4
+ failOn(method, rule = {}) {
5
+ this.rules.set(method, { rule, calls: 0, fired: false });
6
+ return this;
7
+ }
8
+ reset() {
9
+ this.rules.clear();
10
+ }
11
+ /**
12
+ * Test whether the next call to `method` should throw. Increments the
13
+ * internal counter for that method on every call (whether or not it
14
+ * fires).
15
+ */
16
+ shouldFail(method) {
17
+ const state = this.rules.get(method);
18
+ if (!state)
19
+ return undefined;
20
+ state.calls += 1;
21
+ const trigger = state.rule.afterN ?? 1;
22
+ if (state.calls < trigger)
23
+ return undefined;
24
+ if (state.fired && !state.rule.repeating)
25
+ return undefined;
26
+ state.fired = true;
27
+ return state.rule.error ?? new Error(`FaultInjector: simulated failure in ${method}`);
28
+ }
29
+ }
30
+ export class FaultInjectingAdapter {
31
+ inner;
32
+ fi;
33
+ constructor(inner, fi) {
34
+ this.inner = inner;
35
+ this.fi = fi;
36
+ if (process.env.NODE_ENV !== 'test' && process.env.VITEST !== 'true') {
37
+ logger.warn('FaultInjectingAdapter is test-only and should never wrap a production adapter.');
38
+ }
39
+ }
40
+ maybeThrow(m) {
41
+ const err = this.fi.shouldFail(m);
42
+ if (err)
43
+ throw err;
44
+ }
45
+ async init() {
46
+ this.maybeThrow('init');
47
+ return this.inner.init();
48
+ }
49
+ async appendEvent(e) {
50
+ this.maybeThrow('appendEvent');
51
+ return this.inner.appendEvent(e);
52
+ }
53
+ async readEvents() {
54
+ this.maybeThrow('readEvents');
55
+ return this.inner.readEvents();
56
+ }
57
+ async saveSessionSnapshot(s) {
58
+ this.maybeThrow('saveSessionSnapshot');
59
+ return this.inner.saveSessionSnapshot(s);
60
+ }
61
+ async loadSessionSnapshot(id) {
62
+ this.maybeThrow('loadSessionSnapshot');
63
+ return this.inner.loadSessionSnapshot(id);
64
+ }
65
+ async saveCheckpoint(c) {
66
+ this.maybeThrow('saveCheckpoint');
67
+ return this.inner.saveCheckpoint(c);
68
+ }
69
+ async loadCheckpoint(id) {
70
+ this.maybeThrow('loadCheckpoint');
71
+ return this.inner.loadCheckpoint(id);
72
+ }
73
+ async loadLatestCheckpoint() {
74
+ this.maybeThrow('loadLatestCheckpoint');
75
+ return this.inner.loadLatestCheckpoint();
76
+ }
77
+ async saveContinuation(name, md) {
78
+ this.maybeThrow('saveContinuation');
79
+ return this.inner.saveContinuation(name, md);
80
+ }
81
+ async loadContinuation(name) {
82
+ this.maybeThrow('loadContinuation');
83
+ return this.inner.loadContinuation(name);
84
+ }
85
+ async loadLatestContinuation() {
86
+ this.maybeThrow('loadLatestContinuation');
87
+ return this.inner.loadLatestContinuation();
88
+ }
89
+ async saveIntelligence(i) {
90
+ this.maybeThrow('saveIntelligence');
91
+ return this.inner.saveIntelligence(i);
92
+ }
93
+ async loadLatestIntelligence() {
94
+ this.maybeThrow('loadLatestIntelligence');
95
+ return this.inner.loadLatestIntelligence();
96
+ }
97
+ async loadIntelligenceByFingerprint(fp) {
98
+ this.maybeThrow('loadIntelligenceByFingerprint');
99
+ return this.inner.loadIntelligenceByFingerprint(fp);
100
+ }
101
+ async saveGraph(kind, md) {
102
+ this.maybeThrow('saveGraph');
103
+ return this.inner.saveGraph(kind, md);
104
+ }
105
+ async saveVectorIndex(i) {
106
+ this.maybeThrow('saveVectorIndex');
107
+ return this.inner.saveVectorIndex(i);
108
+ }
109
+ async loadVectorIndex() {
110
+ this.maybeThrow('loadVectorIndex');
111
+ return this.inner.loadVectorIndex();
112
+ }
113
+ async audit(e) {
114
+ this.maybeThrow('audit');
115
+ return this.inner.audit(e);
116
+ }
117
+ async readAudit() {
118
+ this.maybeThrow('readAudit');
119
+ return this.inner.readAudit();
120
+ }
121
+ async appendTelemetry(e) {
122
+ this.maybeThrow('appendTelemetry');
123
+ return this.inner.appendTelemetry(e);
124
+ }
125
+ async readTelemetry() {
126
+ this.maybeThrow('readTelemetry');
127
+ return this.inner.readTelemetry();
128
+ }
129
+ async saveReport(name, md) {
130
+ this.maybeThrow('saveReport');
131
+ return this.inner.saveReport(name, md);
132
+ }
133
+ }
134
+ //# sourceMappingURL=faultAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faultAdapter.js","sourceRoot":"","sources":["../../src/storage/faultAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { StorageAdapter } from './storageAdapter.js';
2
+ import type { AuditEntry, KairoEvent } from '../types/events.js';
3
+ import type { TelemetryEvent } from '../core/telemetry/types.js';
4
+ import type { Checkpoint, SessionState } from '../types/domain.js';
5
+ import type { RepoIntelligence } from '../core/repo/types.js';
6
+ import type { VectorIndex } from '../core/vector/types.js';
7
+ import { type QuarantineSink } from './quarantine.js';
8
+ /**
9
+ * Local-first, event-sourced file backend.
10
+ *
11
+ * - `events.jsonl` is append-only and authoritative.
12
+ * - Snapshots/checkpoints are written temp-then-rename so a crash never leaves a
13
+ * half-written JSON document.
14
+ * - `readEvents` tolerates a torn trailing line (e.g. crash mid-append) by discarding
15
+ * only that line, preserving all prior history.
16
+ */
17
+ export declare class FileStorageAdapter implements StorageAdapter {
18
+ private readonly paths;
19
+ private readonly quarantine;
20
+ constructor(projectRoot?: string, quarantine?: QuarantineSink);
21
+ init(): Promise<void>;
22
+ appendEvent(event: KairoEvent): Promise<void>;
23
+ readEvents(): Promise<KairoEvent[]>;
24
+ saveSessionSnapshot(state: SessionState): Promise<void>;
25
+ loadSessionSnapshot(id: string): Promise<SessionState | undefined>;
26
+ saveCheckpoint(checkpoint: Checkpoint): Promise<void>;
27
+ loadCheckpoint(id: string): Promise<Checkpoint | undefined>;
28
+ loadLatestCheckpoint(): Promise<Checkpoint | undefined>;
29
+ saveContinuation(name: string, markdown: string): Promise<string>;
30
+ loadContinuation(name: string): Promise<string | undefined>;
31
+ loadLatestContinuation(): Promise<string | undefined>;
32
+ saveIntelligence(intel: RepoIntelligence): Promise<void>;
33
+ loadLatestIntelligence(): Promise<RepoIntelligence | undefined>;
34
+ loadIntelligenceByFingerprint(fp: string): Promise<RepoIntelligence | undefined>;
35
+ saveGraph(kind: string, markdown: string): Promise<void>;
36
+ saveVectorIndex(index: VectorIndex): Promise<void>;
37
+ loadVectorIndex(): Promise<VectorIndex | undefined>;
38
+ audit(entry: AuditEntry): Promise<void>;
39
+ readAudit(): Promise<AuditEntry[]>;
40
+ appendTelemetry(event: TelemetryEvent): Promise<void>;
41
+ readTelemetry(): Promise<TelemetryEvent[]>;
42
+ saveReport(name: string, markdown: string): Promise<void>;
43
+ private writeAtomic;
44
+ private readFileOrEmpty;
45
+ /**
46
+ * Tolerant + validating JSONL reader (ADR-0012). Corrupt or invalid lines
47
+ * are quarantined to `.kairo/quarantine/{source}.jsonl` and the rest of
48
+ * the file is still read. A torn trailing line — the v0.1 crash-safety
49
+ * contract — remains silent.
50
+ */
51
+ private readValidatedJsonl;
52
+ private readJson;
53
+ private latestFile;
54
+ }
55
+ //# sourceMappingURL=fileStorageAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileStorageAdapter.d.ts","sourceRoot":"","sources":["../../src/storage/fileStorageAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAgB1E;;;;;;;;GAQG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;gBAEhC,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,cAAc;IAKvD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,UAAU,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAInC,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAWlE,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAK3D,oBAAoB,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAOvD,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKjE,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAQ3D,sBAAsB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAMrD,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxD,sBAAsB,IAAI,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAI/D,6BAA6B,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAIhF,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,eAAe,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAInD,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvC,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAIlC,eAAe,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,aAAa,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAI1C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAMjD,WAAW;YAMX,eAAe;IAQ7B;;;;;OAKG;YACW,kBAAkB;YAqDlB,QAAQ;YAQR,UAAU;CAQzB"}
@@ -0,0 +1,219 @@
1
+ import { mkdir, appendFile, writeFile, readFile, readdir, rename } from 'node:fs/promises';
2
+ import { join, basename } from 'node:path';
3
+ import { kairoPaths } from './paths.js';
4
+ import { logger } from '../utils/logger.js';
5
+ import { FileQuarantineSink } from './quarantine.js';
6
+ import { AuditEntryZ, KairoEventZ, SessionStateZ, TelemetryEventZ, } from '../contracts/zodSchemas.js';
7
+ import { migrateAudit, migrateCheckpoint, migrateEvent, migrateSession, migrateTelemetry, } from '../contracts/migrations.js';
8
+ /**
9
+ * Local-first, event-sourced file backend.
10
+ *
11
+ * - `events.jsonl` is append-only and authoritative.
12
+ * - Snapshots/checkpoints are written temp-then-rename so a crash never leaves a
13
+ * half-written JSON document.
14
+ * - `readEvents` tolerates a torn trailing line (e.g. crash mid-append) by discarding
15
+ * only that line, preserving all prior history.
16
+ */
17
+ export class FileStorageAdapter {
18
+ paths;
19
+ quarantine;
20
+ constructor(projectRoot, quarantine) {
21
+ this.paths = kairoPaths(projectRoot);
22
+ this.quarantine = quarantine ?? new FileQuarantineSink(this.paths.quarantineDir);
23
+ }
24
+ async init() {
25
+ for (const dir of [
26
+ this.paths.base,
27
+ this.paths.sessionsDir,
28
+ this.paths.checkpointsDir,
29
+ this.paths.continuationsDir,
30
+ this.paths.reportsDir,
31
+ this.paths.intelligenceDir,
32
+ this.paths.graphsDir,
33
+ this.paths.vectorDir,
34
+ this.paths.quarantineDir,
35
+ ]) {
36
+ await mkdir(dir, { recursive: true });
37
+ }
38
+ }
39
+ async appendEvent(event) {
40
+ await appendFile(this.paths.events, `${JSON.stringify(event)}\n`, 'utf8');
41
+ }
42
+ async readEvents() {
43
+ return this.readValidatedJsonl(this.paths.events, KairoEventZ, migrateEvent);
44
+ }
45
+ async saveSessionSnapshot(state) {
46
+ const tagged = state.schema ? state : { ...state, schema: 1 };
47
+ await this.writeAtomic(this.paths.sessionFile(state.id), JSON.stringify(tagged, null, 2));
48
+ }
49
+ async loadSessionSnapshot(id) {
50
+ const raw = await this.readJson(this.paths.sessionFile(id));
51
+ if (raw === undefined)
52
+ return undefined;
53
+ const parsed = SessionStateZ.safeParse(raw);
54
+ if (!parsed.success) {
55
+ logger.warn(`Session snapshot ${id} failed schema validation; using as-is`);
56
+ return migrateSession(raw);
57
+ }
58
+ return migrateSession(parsed.data);
59
+ }
60
+ async saveCheckpoint(checkpoint) {
61
+ const tagged = checkpoint.schema ? checkpoint : { ...checkpoint, schema: 1 };
62
+ await this.writeAtomic(this.paths.checkpointFile(checkpoint.id), JSON.stringify(tagged, null, 2));
63
+ }
64
+ async loadCheckpoint(id) {
65
+ const raw = await this.readJson(this.paths.checkpointFile(id));
66
+ return raw === undefined ? undefined : migrateCheckpoint(raw);
67
+ }
68
+ async loadLatestCheckpoint() {
69
+ const latest = await this.latestFile(this.paths.checkpointsDir, '.json');
70
+ if (!latest)
71
+ return undefined;
72
+ const raw = await this.readJson(join(this.paths.checkpointsDir, latest));
73
+ return raw === undefined ? undefined : migrateCheckpoint(raw);
74
+ }
75
+ async saveContinuation(name, markdown) {
76
+ await this.writeAtomic(this.paths.continuationFile(name), markdown);
77
+ return name;
78
+ }
79
+ async loadContinuation(name) {
80
+ try {
81
+ return await readFile(this.paths.continuationFile(name), 'utf8');
82
+ }
83
+ catch {
84
+ return undefined;
85
+ }
86
+ }
87
+ async loadLatestContinuation() {
88
+ const latest = await this.latestFile(this.paths.continuationsDir, '.md');
89
+ if (!latest)
90
+ return undefined;
91
+ return readFile(join(this.paths.continuationsDir, latest), 'utf8');
92
+ }
93
+ async saveIntelligence(intel) {
94
+ const body = JSON.stringify(intel, null, 2);
95
+ await this.writeAtomic(this.paths.intelligenceFile(intel.fingerprint), body);
96
+ await this.writeAtomic(this.paths.latestIntelligenceFile, body);
97
+ }
98
+ async loadLatestIntelligence() {
99
+ return this.readJson(this.paths.latestIntelligenceFile);
100
+ }
101
+ async loadIntelligenceByFingerprint(fp) {
102
+ return this.readJson(this.paths.intelligenceFile(fp));
103
+ }
104
+ async saveGraph(kind, markdown) {
105
+ await this.writeAtomic(this.paths.graphFile(kind), markdown);
106
+ }
107
+ async saveVectorIndex(index) {
108
+ await this.writeAtomic(this.paths.vectorIndexFile, JSON.stringify(index));
109
+ }
110
+ async loadVectorIndex() {
111
+ return this.readJson(this.paths.vectorIndexFile);
112
+ }
113
+ async audit(entry) {
114
+ const tagged = entry.schema ? entry : { ...entry, schema: 1 };
115
+ await appendFile(this.paths.audit, `${JSON.stringify(tagged)}\n`, 'utf8');
116
+ }
117
+ async readAudit() {
118
+ return this.readValidatedJsonl(this.paths.audit, AuditEntryZ, migrateAudit);
119
+ }
120
+ async appendTelemetry(event) {
121
+ await appendFile(this.paths.telemetry, `${JSON.stringify(event)}\n`, 'utf8');
122
+ }
123
+ async readTelemetry() {
124
+ return this.readValidatedJsonl(this.paths.telemetry, TelemetryEventZ, migrateTelemetry);
125
+ }
126
+ async saveReport(name, markdown) {
127
+ await this.writeAtomic(this.paths.reportFile(name), markdown);
128
+ }
129
+ // ── internals ────────────────────────────────────────────────────────────
130
+ async writeAtomic(path, content) {
131
+ const tmp = `${path}.${process.pid}.tmp`;
132
+ await writeFile(tmp, content, 'utf8');
133
+ await rename(tmp, path);
134
+ }
135
+ async readFileOrEmpty(path) {
136
+ try {
137
+ return await readFile(path, 'utf8');
138
+ }
139
+ catch {
140
+ return '';
141
+ }
142
+ }
143
+ /**
144
+ * Tolerant + validating JSONL reader (ADR-0012). Corrupt or invalid lines
145
+ * are quarantined to `.kairo/quarantine/{source}.jsonl` and the rest of
146
+ * the file is still read. A torn trailing line — the v0.1 crash-safety
147
+ * contract — remains silent.
148
+ */
149
+ async readValidatedJsonl(path, schema, migrate) {
150
+ const raw = await this.readFileOrEmpty(path);
151
+ if (raw.length === 0)
152
+ return [];
153
+ // Don't filter empty lines yet — we need 1-based line numbers that
154
+ // match the on-disk position for the quarantine record.
155
+ const allLines = raw.split('\n');
156
+ const source = basename(path);
157
+ const out = [];
158
+ for (let i = 0; i < allLines.length; i++) {
159
+ const line = allLines[i] ?? '';
160
+ if (line.trim().length === 0)
161
+ continue;
162
+ let parsed;
163
+ try {
164
+ parsed = JSON.parse(line);
165
+ }
166
+ catch {
167
+ const isTorn = i === allLines.length - 1 && !raw.endsWith('\n');
168
+ if (isTorn) {
169
+ logger.warn(`Discarding torn trailing line in ${source} (crash recovery)`);
170
+ }
171
+ else {
172
+ await this.quarantine.write({
173
+ detectedAt: new Date().toISOString(),
174
+ source,
175
+ line: i + 1,
176
+ reason: 'parse',
177
+ raw: line,
178
+ });
179
+ }
180
+ continue;
181
+ }
182
+ const result = schema.safeParse(parsed);
183
+ if (!result.success) {
184
+ await this.quarantine.write({
185
+ detectedAt: new Date().toISOString(),
186
+ source,
187
+ line: i + 1,
188
+ reason: 'validation',
189
+ detail: result.error.issues
190
+ .slice(0, 3)
191
+ .map((iss) => `${iss.path.join('.')}: ${iss.message}`)
192
+ .join('; '),
193
+ raw: line,
194
+ });
195
+ continue;
196
+ }
197
+ out.push(migrate(result.data));
198
+ }
199
+ return out;
200
+ }
201
+ async readJson(path) {
202
+ try {
203
+ return JSON.parse(await readFile(path, 'utf8'));
204
+ }
205
+ catch {
206
+ return undefined;
207
+ }
208
+ }
209
+ async latestFile(dir, ext) {
210
+ try {
211
+ const entries = (await readdir(dir)).filter((f) => f.endsWith(ext)).sort();
212
+ return entries.at(-1);
213
+ }
214
+ catch {
215
+ return undefined;
216
+ }
217
+ }
218
+ }
219
+ //# sourceMappingURL=fileStorageAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileStorageAdapter.js","sourceRoot":"","sources":["../../src/storage/fileStorageAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Resolves the per-project `.kairo/` layout. The project root is, in order of
3
+ * precedence: explicit argument → `KAIRO_PROJECT_ROOT` → current working directory.
4
+ */
5
+ export interface KairoPaths {
6
+ root: string;
7
+ base: string;
8
+ events: string;
9
+ audit: string;
10
+ telemetry: string;
11
+ sessionsDir: string;
12
+ checkpointsDir: string;
13
+ continuationsDir: string;
14
+ reportsDir: string;
15
+ intelligenceDir: string;
16
+ graphsDir: string;
17
+ vectorDir: string;
18
+ vectorIndexFile: string;
19
+ quarantineDir: string;
20
+ sessionFile: (id: string) => string;
21
+ checkpointFile: (id: string) => string;
22
+ continuationFile: (name: string) => string;
23
+ intelligenceFile: (fingerprint: string) => string;
24
+ latestIntelligenceFile: string;
25
+ graphFile: (kind: string) => string;
26
+ reportFile: (name: string) => string;
27
+ }
28
+ export declare function resolveProjectRoot(explicit?: string): string;
29
+ export declare function kairoPaths(explicitRoot?: string): KairoPaths;
30
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,gBAAgB,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACpC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACtC;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,UAAU,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,UAAU,CA0B5D"}
@@ -0,0 +1,32 @@
1
+ import { resolve, join } from 'node:path';
2
+ export function resolveProjectRoot(explicit) {
3
+ return resolve(explicit ?? process.env.KAIRO_PROJECT_ROOT ?? process.cwd());
4
+ }
5
+ export function kairoPaths(explicitRoot) {
6
+ const root = resolveProjectRoot(explicitRoot);
7
+ const base = join(root, '.kairo');
8
+ return {
9
+ root,
10
+ base,
11
+ events: join(base, 'events.jsonl'),
12
+ audit: join(base, 'audit.jsonl'),
13
+ telemetry: join(base, 'telemetry.jsonl'),
14
+ sessionsDir: join(base, 'sessions'),
15
+ checkpointsDir: join(base, 'checkpoints'),
16
+ continuationsDir: join(base, 'continuations'),
17
+ reportsDir: join(base, 'reports'),
18
+ intelligenceDir: join(base, 'intelligence'),
19
+ graphsDir: join(base, 'graphs'),
20
+ vectorDir: join(base, 'vector'),
21
+ vectorIndexFile: join(base, 'vector', 'index.json'),
22
+ quarantineDir: join(base, 'quarantine'),
23
+ sessionFile: (id) => join(base, 'sessions', `${id}.json`),
24
+ checkpointFile: (id) => join(base, 'checkpoints', `${id}.json`),
25
+ continuationFile: (name) => join(base, 'continuations', name),
26
+ intelligenceFile: (fp) => join(base, 'intelligence', `${fp}.json`),
27
+ latestIntelligenceFile: join(base, 'intelligence', 'latest.json'),
28
+ graphFile: (kind) => join(base, 'graphs', `${kind}.md`),
29
+ reportFile: (name) => join(base, 'reports', name),
30
+ };
31
+ }
32
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/storage/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA8B1C,MAAM,UAAU,kBAAkB,CAAC,QAAiB;IAClD,OAAO,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,YAAqB;IAC9C,MAAM,IAAI,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;QAClC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QAChC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC;QACxC,WAAW,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QACnC,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC;QACzC,gBAAgB,EAAE,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC;QAC7C,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QACjC,eAAe,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC;QAC3C,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC/B,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;QAC/B,eAAe,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC;QACnD,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC;QACvC,WAAW,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC;QACzD,cAAc,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,CAAC;QAC/D,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,CAAC;QAC7D,gBAAgB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,CAAC;QAClE,sBAAsB,EAAE,IAAI,CAAC,IAAI,EAAE,cAAc,EAAE,aAAa,CAAC;QACjE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,KAAK,CAAC;QACvD,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC;KAClD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Last-resort corruption recovery for append-only logs (ADR-0012).
3
+ *
4
+ * When a record fails to parse or validate, the raw line is written to
5
+ * `.kairo/quarantine/{file}.jsonl` along with metadata (line number, reason,
6
+ * timestamp). The reader continues with the rest of the file. Quarantined
7
+ * records are never reaped automatically.
8
+ */
9
+ export interface QuarantinedRecord {
10
+ /** ISO timestamp at which the corruption was detected. */
11
+ detectedAt: string;
12
+ /** Source filename, e.g. `events.jsonl`. */
13
+ source: string;
14
+ /** 1-based line number in the source file. */
15
+ line: number;
16
+ /** Human reason: 'parse' (JSON.parse failed) or 'validation' (zod failed). */
17
+ reason: 'parse' | 'validation';
18
+ /** Best-effort description of the validation failure. */
19
+ detail?: string;
20
+ /** The raw line contents, verbatim. */
21
+ raw: string;
22
+ }
23
+ export interface QuarantineSink {
24
+ write(record: QuarantinedRecord): Promise<void>;
25
+ }
26
+ export declare class FileQuarantineSink implements QuarantineSink {
27
+ private readonly base;
28
+ private ensured;
29
+ constructor(quarantineDir: string);
30
+ write(record: QuarantinedRecord): Promise<void>;
31
+ }
32
+ /** Used in tests / contexts where corruption should be a hard error. */
33
+ export declare class NoopQuarantineSink implements QuarantineSink {
34
+ write(_record: QuarantinedRecord): Promise<void>;
35
+ }
36
+ //# sourceMappingURL=quarantine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quarantine.d.ts","sourceRoot":"","sources":["../../src/storage/quarantine.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,8EAA8E;IAC9E,MAAM,EAAE,OAAO,GAAG,YAAY,CAAC;IAC/B,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD;AAED,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAS;gBACZ,aAAa,EAAE,MAAM;IAG3B,KAAK,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAStD;AAED,wEAAwE;AACxE,qBAAa,kBAAmB,YAAW,cAAc;IACjD,KAAK,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAGvD"}
@@ -0,0 +1,26 @@
1
+ import { appendFile, mkdir } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { logger } from '../utils/logger.js';
4
+ export class FileQuarantineSink {
5
+ base;
6
+ ensured = false;
7
+ constructor(quarantineDir) {
8
+ this.base = quarantineDir;
9
+ }
10
+ async write(record) {
11
+ if (!this.ensured) {
12
+ await mkdir(this.base, { recursive: true });
13
+ this.ensured = true;
14
+ }
15
+ const file = join(this.base, `${record.source}`);
16
+ await appendFile(file, `${JSON.stringify(record)}\n`, 'utf8');
17
+ logger.warn(`Quarantined ${record.source} line ${record.line} (${record.reason}); see ${file}`);
18
+ }
19
+ }
20
+ /** Used in tests / contexts where corruption should be a hard error. */
21
+ export class NoopQuarantineSink {
22
+ async write(_record) {
23
+ // Intentionally silent.
24
+ }
25
+ }
26
+ //# sourceMappingURL=quarantine.js.map