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 @@
1
+ {"version":3,"file":"imports.js","sourceRoot":"","sources":["../../../src/core/graph/imports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { RepoGraph } from './types.js';
2
+ /** Render a graph as deterministic Mermaid `flowchart` source (no code fence). */
3
+ export declare function renderMermaid(graph: RepoGraph): string;
4
+ /** Human/agent-readable markdown mirror written under `.kairo/graphs/`. */
5
+ export declare function renderGraphMarkdown(graph: RepoGraph): string;
6
+ //# sourceMappingURL=mermaid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.d.ts","sourceRoot":"","sources":["../../../src/core/graph/mermaid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAe5C,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAqBtD;AAED,2EAA2E;AAC3E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAK5D"}
@@ -0,0 +1,40 @@
1
+ /** Escape a label for safe use inside a Mermaid `["..."]` node. */
2
+ function esc(label) {
3
+ return label
4
+ .replace(/"/g, '#quot;')
5
+ .replace(/[[\]{}]/g, '')
6
+ .replace(/\r?\n/g, '<br/>')
7
+ .trim();
8
+ }
9
+ function classId(group) {
10
+ return `g_${group.replace(/[^A-Za-z0-9_]/g, '_')}`;
11
+ }
12
+ /** Render a graph as deterministic Mermaid `flowchart` source (no code fence). */
13
+ export function renderMermaid(graph) {
14
+ const lines = ['flowchart TD'];
15
+ for (const n of graph.nodes) {
16
+ lines.push(` ${n.id}["${esc(n.label)}"]`);
17
+ }
18
+ for (const e of graph.edges) {
19
+ const label = e.label ?? (e.weight && e.weight > 1 ? `×${e.weight}` : undefined);
20
+ lines.push(label ? ` ${e.from} -->|${esc(label)}| ${e.to}` : ` ${e.from} --> ${e.to}`);
21
+ }
22
+ const groups = [...new Set(graph.nodes.map((n) => n.group).filter((g) => !!g))];
23
+ for (const g of groups.sort()) {
24
+ lines.push(` classDef ${classId(g)} stroke-width:1px;`);
25
+ }
26
+ for (const n of graph.nodes) {
27
+ if (n.group)
28
+ lines.push(` class ${n.id} ${classId(n.group)};`);
29
+ }
30
+ return lines.join('\n');
31
+ }
32
+ /** Human/agent-readable markdown mirror written under `.kairo/graphs/`. */
33
+ export function renderGraphMarkdown(graph) {
34
+ const lines = [`# ${graph.title}`, '', `> ${graph.note}`];
35
+ if (graph.truncated)
36
+ lines.push('>', '> ⚠️ Truncated — partial view (node/edge cap hit).');
37
+ lines.push('', '```mermaid', renderMermaid(graph), '```', '');
38
+ return lines.join('\n');
39
+ }
40
+ //# sourceMappingURL=mermaid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mermaid.js","sourceRoot":"","sources":["../../../src/core/graph/mermaid.ts"],"names":[],"mappings":"AAEA,mEAAmE;AACnE,SAAS,GAAG,CAAC,KAAa;IACxB,OAAO,KAAK;SACT,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC;SAC1B,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,KAAa;IAC5B,OAAO,KAAK,KAAK,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC;AACrD,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,KAAgB;IAC5C,MAAM,KAAK,GAAa,CAAC,cAAc,CAAC,CAAC;IAEzC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACjF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,QAAQ,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAC3D,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,mBAAmB,CAAC,KAAgB;IAClD,MAAM,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,KAAK,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,oDAAoD,CAAC,CAAC;IAC3F,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { RepoGraph } from './types.js';
2
+ import type { SalienceConfig, SalienceContext } from '../salience/types.js';
3
+ export interface ModuleGraphOptions {
4
+ /** Directory depth to collapse files to (under a `src/`-style root). */
5
+ groupDepth?: number;
6
+ /** Hard cap on rendered nodes; above this the graph auto-collapses shallower. */
7
+ maxNodes?: number;
8
+ /**
9
+ * Salience inputs. When provided, truncation keeps the most *architecturally
10
+ * salient* groups (see ADR-0004) instead of merely the highest-degree ones.
11
+ */
12
+ salience?: {
13
+ context: SalienceContext;
14
+ config: SalienceConfig;
15
+ };
16
+ }
17
+ /** Exposed so callers (the scanner) can map entry-point paths to graph groups. */
18
+ export declare function pathToGroup(rel: string, depth: number): string;
19
+ /**
20
+ * Collapse file-level internal edges into a readable directory-granularity graph.
21
+ * If the chosen depth produces too many nodes we auto-collapse one level shallower;
22
+ * if still over the cap we keep the most *salient* groups (ADR-0004) — first-party
23
+ * production architecture and real dependency centres over examples/docs/fixtures —
24
+ * and flag the graph truncated honestly.
25
+ */
26
+ export declare function buildModuleGraph(fileEdges: Array<[string, string]>, sourceFiles: string[], opts?: ModuleGraphOptions): RepoGraph;
27
+ //# sourceMappingURL=moduleGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moduleGraph.d.ts","sourceRoot":"","sources":["../../../src/core/graph/moduleGraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,SAAS,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAgB,MAAM,sBAAsB,CAAC;AAG1F,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,eAAe,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,CAAC;CACjE;AA4CD,kFAAkF;AAClF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9D;AAoCD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAClC,WAAW,EAAE,MAAM,EAAE,EACrB,IAAI,GAAE,kBAAuB,GAC5B,SAAS,CA6GX"}
@@ -0,0 +1,186 @@
1
+ import { rankAndSelect } from '../salience/salienceEngine.js';
2
+ const DEFAULTS = { groupDepth: 2, maxNodes: 40 };
3
+ const SOURCE_SEGMENTS = new Set(['src', 'lib', 'app', 'sources']);
4
+ const MONOREPO_CONTAINERS = new Set(['packages', 'apps', 'libs', 'modules']);
5
+ /**
6
+ * Collapse a file path to a readable group label.
7
+ *
8
+ * The naive "strip a known prefix" approach is wrong for the two commonest real
9
+ * layouts: monorepos (`packages/<pkg>/src/**`) and nested source roots — it collapses
10
+ * an entire package to one node so every intra-package edge becomes a dropped
11
+ * self-edge (observed in dogfood: zod 504 file-edges → 6). Instead we locate the
12
+ * DEEPEST source segment and group by the owning package plus the directories *under*
13
+ * that source root, so a package's internal structure (and its edges) survives.
14
+ */
15
+ function groupOf(rel, depth) {
16
+ const all = rel.split('/');
17
+ const dirs = all.slice(0, -1); // drop filename
18
+ if (dirs.length === 0)
19
+ return '(root)';
20
+ let srcIdx = -1;
21
+ for (let i = 0; i < dirs.length; i++) {
22
+ if (SOURCE_SEGMENTS.has(dirs[i]))
23
+ srcIdx = i;
24
+ }
25
+ if (srcIdx >= 0) {
26
+ // Owning package/app = the dir immediately before the source segment, if any
27
+ // (e.g. `packages/zod/src/types` → pkg "zod"; top-level `src/core` → pkg "").
28
+ const pkg = srcIdx >= 1 ? dirs[srcIdx - 1] : '';
29
+ const under = dirs.slice(srcIdx + 1); // dirs beneath the source root
30
+ const parts = (pkg ? [pkg, ...under] : under).filter(Boolean);
31
+ if (parts.length === 0)
32
+ return pkg || '(src)';
33
+ return parts.slice(0, Math.max(depth, pkg ? 2 : 1)).join('/');
34
+ }
35
+ // No source segment: drop a leading monorepo container so the package name leads.
36
+ const start = MONOREPO_CONTAINERS.has(dirs[0]) ? 1 : 0;
37
+ const parts = dirs.slice(start);
38
+ if (parts.length === 0)
39
+ return '(root)';
40
+ return parts.slice(0, depth).join('/');
41
+ }
42
+ /** Exposed so callers (the scanner) can map entry-point paths to graph groups. */
43
+ export function pathToGroup(rel, depth) {
44
+ return groupOf(rel, depth);
45
+ }
46
+ const EDGE_SEP = ' '; // single space — group labels never contain spaces
47
+ function buildAtDepth(fileEdges, sourceFiles, depth) {
48
+ const nodes = new Set();
49
+ // Representative original path per group. Grouping strips prefixes like
50
+ // `sample/`/`examples/`, so the label alone hides whether a group is noise;
51
+ // salience must score this fuller path. Deterministic = lexicographically first.
52
+ const repPath = new Map();
53
+ for (const f of [...sourceFiles].sort()) {
54
+ const g = groupOf(f, depth);
55
+ nodes.add(g);
56
+ const cur = repPath.get(g);
57
+ if (cur === undefined || f < cur)
58
+ repPath.set(g, f);
59
+ }
60
+ const edges = new Map();
61
+ for (const [from, to] of fileEdges) {
62
+ const a = groupOf(from, depth);
63
+ const b = groupOf(to, depth);
64
+ if (a === b)
65
+ continue;
66
+ const key = `${a}${EDGE_SEP}${b}`;
67
+ edges.set(key, (edges.get(key) ?? 0) + 1);
68
+ }
69
+ return { nodes, edges, repPath };
70
+ }
71
+ function sanitizeId(label, index) {
72
+ const base = label.replace(/[^A-Za-z0-9_]/g, '_').replace(/^_+|_+$/g, '');
73
+ return base.length > 0 ? `n_${index}_${base}`.slice(0, 60) : `n_${index}`;
74
+ }
75
+ /**
76
+ * Collapse file-level internal edges into a readable directory-granularity graph.
77
+ * If the chosen depth produces too many nodes we auto-collapse one level shallower;
78
+ * if still over the cap we keep the most *salient* groups (ADR-0004) — first-party
79
+ * production architecture and real dependency centres over examples/docs/fixtures —
80
+ * and flag the graph truncated honestly.
81
+ */
82
+ export function buildModuleGraph(fileEdges, sourceFiles, opts = {}) {
83
+ const maxNodes = opts.maxNodes ?? DEFAULTS.maxNodes;
84
+ let depth = opts.groupDepth ?? DEFAULTS.groupDepth;
85
+ let built = buildAtDepth(fileEdges, sourceFiles, depth);
86
+ if (built.nodes.size > maxNodes && depth > 1) {
87
+ depth = 1;
88
+ built = buildAtDepth(fileEdges, sourceFiles, depth);
89
+ }
90
+ // Per-node directional metrics + adjacency from the collapsed edges.
91
+ const fanIn = new Map();
92
+ const fanOut = new Map();
93
+ const adj = new Map();
94
+ for (const [key, w] of built.edges) {
95
+ const [a, b] = key.split(EDGE_SEP);
96
+ fanOut.set(a, (fanOut.get(a) ?? 0) + w);
97
+ fanIn.set(b, (fanIn.get(b) ?? 0) + w);
98
+ if (!adj.has(a))
99
+ adj.set(a, []);
100
+ adj.get(a).push(b);
101
+ }
102
+ for (const n of built.nodes) {
103
+ if (!fanIn.has(n))
104
+ fanIn.set(n, 0);
105
+ if (!fanOut.has(n))
106
+ fanOut.set(n, 0);
107
+ }
108
+ const degreeOf = (n) => (fanIn.get(n) ?? 0) + (fanOut.get(n) ?? 0);
109
+ // Reachability/depth from runtime entry points (groups owning an entry path).
110
+ const depthFromEntry = new Map();
111
+ if (opts.salience) {
112
+ const entryGroups = new Set(opts.salience.context.entryPoints
113
+ .filter((p) => p.includes('/') || p.includes('.'))
114
+ .map((p) => groupOf(p, depth))
115
+ .filter((g) => built.nodes.has(g)));
116
+ const queue = [];
117
+ for (const g of entryGroups) {
118
+ depthFromEntry.set(g, 0);
119
+ queue.push([g, 0]);
120
+ }
121
+ while (queue.length > 0) {
122
+ const [node, d] = queue.shift();
123
+ for (const next of adj.get(node) ?? []) {
124
+ if (!depthFromEntry.has(next)) {
125
+ depthFromEntry.set(next, d + 1);
126
+ queue.push([next, d + 1]);
127
+ }
128
+ }
129
+ }
130
+ }
131
+ let truncated = false;
132
+ let kept = [...built.nodes];
133
+ if (kept.length > maxNodes) {
134
+ truncated = true;
135
+ if (opts.salience) {
136
+ const items = kept.map((label) => ({
137
+ id: label,
138
+ path: built.repPath.get(label) ?? label,
139
+ metrics: {
140
+ fanIn: fanIn.get(label) ?? 0,
141
+ fanOut: fanOut.get(label) ?? 0,
142
+ reachableFromEntry: depthFromEntry.has(label),
143
+ depthFromEntry: depthFromEntry.get(label) ?? Number.POSITIVE_INFINITY,
144
+ },
145
+ }));
146
+ const sel = rankAndSelect(items, opts.salience.context, opts.salience.config, maxNodes);
147
+ kept = sel.kept.map((s) => s.id);
148
+ }
149
+ else {
150
+ kept = kept
151
+ .sort((a, b) => degreeOf(b) - degreeOf(a) || a.localeCompare(b))
152
+ .slice(0, maxNodes);
153
+ }
154
+ }
155
+ const keptSet = new Set(kept);
156
+ const labelToId = new Map();
157
+ const nodes = [...kept]
158
+ .sort((a, b) => a.localeCompare(b))
159
+ .map((label, i) => {
160
+ const id = sanitizeId(label, i);
161
+ labelToId.set(label, id);
162
+ const top = label === '(root)' ? 'root' : label.split('/')[0];
163
+ return { id, label, group: top };
164
+ });
165
+ const edges = [];
166
+ for (const [key, w] of [...built.edges.entries()].sort((x, y) => x[0].localeCompare(y[0]))) {
167
+ const [a, b] = key.split(EDGE_SEP);
168
+ if (!keptSet.has(a) || !keptSet.has(b)) {
169
+ truncated = true;
170
+ continue;
171
+ }
172
+ edges.push({ from: labelToId.get(a), to: labelToId.get(b), weight: w });
173
+ }
174
+ const ranked = opts.salience ? ' Truncation is salience-ranked (ADR-0004).' : '';
175
+ return {
176
+ kind: 'module',
177
+ title: `Module dependency graph (depth ${depth})`,
178
+ nodes,
179
+ edges,
180
+ truncated,
181
+ note: 'Directory-collapsed internal import graph (regex-extracted static imports; ' +
182
+ 'relative edges only). External packages and dynamic imports are excluded by ' +
183
+ `design.${ranked}`,
184
+ };
185
+ }
186
+ //# sourceMappingURL=moduleGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"moduleGraph.js","sourceRoot":"","sources":["../../../src/core/graph/moduleGraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Graph engine model (v0.5.0). Graphs are deliberately *collapsed* and *capped*: a
3
+ * per-file dependency graph on a real repo is an unreadable hairball and overruns
4
+ * Mermaid's practical limits. The valuable artifact is a directory-granularity graph
5
+ * an engineer can actually read, so that is what we build and cache.
6
+ */
7
+ export type GraphKind = 'module' | 'service' | 'architecture' | 'pipeline';
8
+ export interface GraphNode {
9
+ /** Mermaid-safe identifier. */
10
+ id: string;
11
+ label: string;
12
+ /** Optional grouping/styling hint. */
13
+ group?: string;
14
+ }
15
+ export interface GraphEdge {
16
+ from: string;
17
+ to: string;
18
+ /** Number of underlying file-level edges this collapsed edge represents. */
19
+ weight?: number;
20
+ label?: string;
21
+ }
22
+ export interface RepoGraph {
23
+ kind: GraphKind;
24
+ title: string;
25
+ nodes: GraphNode[];
26
+ edges: GraphEdge[];
27
+ /** True if nodes/edges were capped — the graph is then a partial view. */
28
+ truncated: boolean;
29
+ /** Honest one-line description of how this graph was derived and its limits. */
30
+ note: string;
31
+ }
32
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/graph/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,GAAG,UAAU,CAAC;AAE3E,MAAM,WAAW,SAAS;IACxB,+BAA+B;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,0EAA0E;IAC1E,SAAS,EAAE,OAAO,CAAC;IACnB,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;CACd"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/graph/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import type { KairoEvent, AuditEntry } from '../../types/events.js';
2
+ import type { Checkpoint } from '../../types/domain.js';
3
+ import type { CausalityResult, ConflictEntry, EventFilter, LineageNode, RetrievalTrace, TimelineEntry, TimelineKind, UnifiedEvent } from './types.js';
4
+ import type { TelemetryEvent } from '../telemetry/types.js';
5
+ /**
6
+ * Pure deterministic query primitives (ADR-0009). The same inputs always produce
7
+ * identical output — stable ts-only sort preserves append/causal order, as we
8
+ * learned in v0.7.0. Namespace isolation is enforced here: caller-namespace
9
+ * filtering matches the retrieval-isolation discipline.
10
+ */
11
+ export interface QueryInputs {
12
+ events: KairoEvent[];
13
+ telemetry: TelemetryEvent[];
14
+ audit: AuditEntry[];
15
+ /** Resolve worker by sessionId via `worker.registered`. */
16
+ sessionToWorker: Map<string, string>;
17
+ }
18
+ export declare function buildSessionToWorker(events: KairoEvent[]): Map<string, string>;
19
+ export declare function queryEvents(filter: EventFilter, inputs: QueryInputs): UnifiedEvent[];
20
+ export declare function timeline(kind: TimelineKind, inputs: QueryInputs, callerNamespace?: string): TimelineEntry[];
21
+ export declare function checkpointLineage(checkpointId: string, loadCheckpoint: (id: string) => Promise<Checkpoint | undefined>): Promise<LineageNode[]>;
22
+ export declare function conflictHistory(inputs: QueryInputs, callerNamespace?: string): ConflictEntry[];
23
+ export declare function retrievalTrace(retrievalEventId: string, inputs: QueryInputs, callerNamespace?: string): RetrievalTrace | undefined;
24
+ /** "Why was this guard.hold (or any event) emitted?" — immediate preceding causes. */
25
+ export declare function whyEvent(eventId: string, inputs: QueryInputs, callerNamespace?: string): CausalityResult | undefined;
26
+ //# sourceMappingURL=queryEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryEngine.d.ts","sourceRoot":"","sources":["../../../src/core/query/queryEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,WAAW,EACX,WAAW,EACX,cAAc,EACd,aAAa,EACb,YAAY,EACZ,YAAY,EACb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,2DAA2D;IAC3D,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtC;AAoCD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAS9E;AAsDD,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,YAAY,EAAE,CAcpF;AAED,wBAAgB,QAAQ,CACtB,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,WAAW,EACnB,eAAe,CAAC,EAAE,MAAM,GACvB,aAAa,EAAE,CA4CjB;AAED,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,GAC9D,OAAO,CAAC,WAAW,EAAE,CAAC,CAExB;AAuBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE,CA4B9F;AAED,wBAAgB,cAAc,CAC5B,gBAAgB,EAAE,MAAM,EACxB,MAAM,EAAE,WAAW,EACnB,eAAe,CAAC,EAAE,MAAM,GACvB,cAAc,GAAG,SAAS,CAiB5B;AAED,sFAAsF;AACtF,wBAAgB,QAAQ,CACtB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,WAAW,EACnB,eAAe,CAAC,EAAE,MAAM,GACvB,eAAe,GAAG,SAAS,CAgC7B"}
@@ -0,0 +1,258 @@
1
+ function unifyEvent(e, worker) {
2
+ return {
3
+ source: 'event',
4
+ id: e.id,
5
+ ts: e.ts,
6
+ kind: e.type,
7
+ sessionId: e.sessionId,
8
+ ...(worker ? { worker } : {}),
9
+ data: e.payload ?? {},
10
+ };
11
+ }
12
+ function unifyTelemetry(t) {
13
+ return {
14
+ source: 'telemetry',
15
+ id: t.id,
16
+ ts: t.ts,
17
+ kind: t.kind,
18
+ sessionId: t.sessionId,
19
+ worker: t.worker,
20
+ namespace: t.namespace,
21
+ data: t.data,
22
+ };
23
+ }
24
+ function unifyAudit(a, idx) {
25
+ return {
26
+ source: 'audit',
27
+ id: `audit-${idx}`,
28
+ ts: a.ts,
29
+ kind: `audit.${a.kind}`,
30
+ sessionId: '',
31
+ data: { message: a.message, ...(a.details ?? {}) },
32
+ };
33
+ }
34
+ export function buildSessionToWorker(events) {
35
+ const m = new Map();
36
+ for (const e of events) {
37
+ if (e.type === 'worker.registered') {
38
+ const p = e.payload;
39
+ if (p.workerId)
40
+ m.set(e.sessionId, p.workerId);
41
+ }
42
+ }
43
+ return m;
44
+ }
45
+ /** Safe string coercion for unknown telemetry/event payload values. */
46
+ function sval(v) {
47
+ if (typeof v === 'string')
48
+ return v;
49
+ if (v === null || v === undefined)
50
+ return '';
51
+ if (typeof v === 'number' || typeof v === 'boolean')
52
+ return String(v);
53
+ return JSON.stringify(v);
54
+ }
55
+ function kindMatches(kind, patterns) {
56
+ for (const p of patterns) {
57
+ if (p.endsWith('*')) {
58
+ if (kind.startsWith(p.slice(0, -1)))
59
+ return true;
60
+ }
61
+ else if (kind === p)
62
+ return true;
63
+ }
64
+ return false;
65
+ }
66
+ function unify(inputs) {
67
+ const out = [
68
+ ...inputs.events.map((e) => unifyEvent(e, inputs.sessionToWorker.get(e.sessionId))),
69
+ ...inputs.telemetry.map(unifyTelemetry),
70
+ ...inputs.audit.map((a, i) => unifyAudit(a, i)),
71
+ ];
72
+ // Stable ts-only sort keeps append/causal order on equal timestamps (ADR-0007).
73
+ out.sort((a, b) => (a.ts < b.ts ? -1 : a.ts > b.ts ? 1 : 0));
74
+ return out;
75
+ }
76
+ /**
77
+ * Coordination telemetry kinds carry only shared metadata (scope/holder/risk-level)
78
+ * and **no private content**, so they are visible to every worker regardless of the
79
+ * emitting worker's namespace tag. Worker-private kinds (memory.refreshed,
80
+ * retrieval.performed, risk.assessed, guard.hold) remain isolated.
81
+ */
82
+ const SHARED_KINDS = new Set([
83
+ 'session.started',
84
+ 'session.ended',
85
+ 'checkpoint.created',
86
+ 'lease.granted',
87
+ 'lease.denied',
88
+ 'release.prepared',
89
+ 'worker.registered',
90
+ ]);
91
+ /** Namespace-safe visibility filter: workspace + caller's own namespace + shared. */
92
+ function visible(e, ns) {
93
+ if (!ns)
94
+ return true;
95
+ if (!e.namespace || e.namespace === 'workspace')
96
+ return true;
97
+ if (SHARED_KINDS.has(e.kind))
98
+ return true;
99
+ return e.namespace === ns;
100
+ }
101
+ export function queryEvents(filter, inputs) {
102
+ const sources = new Set(filter.sources ?? ['event', 'telemetry', 'audit']);
103
+ const sIds = filter.sessionIds ? new Set(filter.sessionIds) : undefined;
104
+ const workers = filter.workers ? new Set(filter.workers) : undefined;
105
+ const limit = filter.limit === 0 ? Infinity : (filter.limit ?? 100);
106
+ let out = unify(inputs).filter((e) => sources.has(e.source));
107
+ if (filter.kinds && filter.kinds.length > 0)
108
+ out = out.filter((e) => kindMatches(e.kind, filter.kinds));
109
+ if (sIds)
110
+ out = out.filter((e) => sIds.has(e.sessionId));
111
+ if (workers)
112
+ out = out.filter((e) => e.worker !== undefined && workers.has(e.worker));
113
+ if (filter.since)
114
+ out = out.filter((e) => e.ts >= filter.since);
115
+ if (filter.until)
116
+ out = out.filter((e) => e.ts <= filter.until);
117
+ out = out.filter((e) => visible(e, filter.callerNamespace));
118
+ return out.slice(0, limit);
119
+ }
120
+ export function timeline(kind, inputs, callerNamespace) {
121
+ const pool = unify(inputs).filter((e) => visible(e, callerNamespace));
122
+ const entry = (e, summary) => ({
123
+ ts: e.ts,
124
+ kind,
125
+ sessionId: e.sessionId,
126
+ ...(e.worker ? { worker: e.worker } : {}),
127
+ summary,
128
+ data: e.data,
129
+ });
130
+ switch (kind) {
131
+ case 'sessions':
132
+ return pool
133
+ .filter((e) => e.kind === 'session.started' || e.kind === 'session.ended')
134
+ .map((e) => entry(e, e.kind === 'session.started' ? `start: ${sval(e.data.task)}`.trim() : 'end'));
135
+ case 'checkpoints':
136
+ return pool
137
+ .filter((e) => e.source === 'telemetry' && e.kind === 'checkpoint.created')
138
+ .map((e) => entry(e, `checkpoint (${String(e.data.reason)}, risk ${String(e.data.risk)})`));
139
+ case 'lease-conflicts':
140
+ return pool
141
+ .filter((e) => e.kind === 'lease.denied' || e.kind === 'lease.granted')
142
+ .map((e) => entry(e, `${e.kind === 'lease.denied' ? 'DENIED' : 'GRANTED'} ${String(e.data.scopeKind)}:${String(e.data.scope)}` +
143
+ (e.kind === 'lease.denied' ? ` held by ${String(e.data.holder)}` : '')));
144
+ case 'retrievals':
145
+ return pool
146
+ .filter((e) => e.kind === 'retrieval.performed')
147
+ .map((e) => entry(e, `retrieval: ${String(e.data.results)} results (top ${String(e.data.topKind)})`));
148
+ case 'memory-refresh':
149
+ return pool
150
+ .filter((e) => e.kind === 'memory.refreshed')
151
+ .map((e) => entry(e, `${e.data.rebuilt ? 'rebuilt' : 'reused'} (${String(e.data.chunks)} chunks)`));
152
+ }
153
+ }
154
+ export function checkpointLineage(checkpointId, loadCheckpoint) {
155
+ return walk(checkpointId, loadCheckpoint, []);
156
+ }
157
+ async function walk(id, load, acc) {
158
+ if (!id)
159
+ return acc;
160
+ const cp = await load(id);
161
+ if (!cp)
162
+ return acc;
163
+ const node = {
164
+ id: cp.id,
165
+ createdAt: cp.createdAt,
166
+ workerId: cp.ownerWorkerId ?? cp.agent,
167
+ task: cp.task,
168
+ reason: cp.reason,
169
+ riskLevel: cp.risk.level,
170
+ ...(cp.parentCheckpointId ? { parentId: cp.parentCheckpointId } : {}),
171
+ };
172
+ acc.unshift(node); // root-first order
173
+ return walk(cp.parentCheckpointId, load, acc);
174
+ }
175
+ export function conflictHistory(inputs, callerNamespace) {
176
+ const tel = unify(inputs).filter((e) => visible(e, callerNamespace));
177
+ const granted = tel.filter((e) => e.kind === 'lease.granted');
178
+ return tel
179
+ .filter((e) => e.kind === 'lease.denied')
180
+ .map((d) => {
181
+ const scope = String(d.data.scope);
182
+ const scopeKind = String(d.data.scopeKind);
183
+ const holder = sval(d.data.holder);
184
+ const prior = granted
185
+ .filter((g) => String(g.data.scope) === scope &&
186
+ String(g.data.scopeKind) === scopeKind &&
187
+ g.worker === holder &&
188
+ g.ts <= d.ts)
189
+ .pop();
190
+ const out = {
191
+ deniedAt: d.ts,
192
+ scopeKind,
193
+ scope,
194
+ deniedWorker: d.worker ?? '?',
195
+ holder,
196
+ };
197
+ if (prior?.ts)
198
+ out.holderGrantedAt = prior.ts;
199
+ return out;
200
+ });
201
+ }
202
+ export function retrievalTrace(retrievalEventId, inputs, callerNamespace) {
203
+ const all = unify(inputs).filter((e) => visible(e, callerNamespace));
204
+ const r = all.find((e) => e.id === retrievalEventId && e.kind === 'retrieval.performed');
205
+ if (!r)
206
+ return undefined;
207
+ const before = all.filter((e) => e.ts <= r.ts);
208
+ const last = (kind, sameSession = true) => [...before]
209
+ .reverse()
210
+ .find((e) => e.kind === kind && (!sameSession || e.sessionId === r.sessionId));
211
+ const out = { retrieval: r };
212
+ const s = last('session.started');
213
+ const m = last('memory.refreshed');
214
+ const c = last('checkpoint.created', false); // shared continuity
215
+ if (s)
216
+ out.precedingSessionStart = s;
217
+ if (m)
218
+ out.latestMemoryRefresh = m;
219
+ if (c)
220
+ out.latestCheckpointBefore = c;
221
+ return out;
222
+ }
223
+ /** "Why was this guard.hold (or any event) emitted?" — immediate preceding causes. */
224
+ export function whyEvent(eventId, inputs, callerNamespace) {
225
+ const all = unify(inputs).filter((e) => visible(e, callerNamespace));
226
+ const target = all.find((e) => e.id === eventId);
227
+ if (!target)
228
+ return undefined;
229
+ const sameSessionBefore = all.filter((e) => e.sessionId === target.sessionId && e.ts <= target.ts && e.id !== target.id);
230
+ let causes = [];
231
+ if (target.kind === 'guard.hold') {
232
+ const r = [...sameSessionBefore].reverse().find((e) => e.kind === 'risk.assessed');
233
+ if (r)
234
+ causes.push(r);
235
+ }
236
+ else if (target.kind === 'risk.assessed') {
237
+ causes = sameSessionBefore
238
+ .filter((e) => ['session.started', 'checkpoint.created', 'memory.refreshed'].includes(e.kind))
239
+ .slice(-3);
240
+ }
241
+ else if (target.kind === 'lease.denied') {
242
+ const holder = sval(target.data.holder);
243
+ const scope = String(target.data.scope);
244
+ const prior = all
245
+ .filter((e) => e.kind === 'lease.granted' &&
246
+ e.worker === holder &&
247
+ String(e.data.scope) === scope &&
248
+ e.ts <= target.ts)
249
+ .pop();
250
+ if (prior)
251
+ causes.push(prior);
252
+ }
253
+ else {
254
+ causes = sameSessionBefore.slice(-3);
255
+ }
256
+ return { target, precedingCauses: causes };
257
+ }
258
+ //# sourceMappingURL=queryEngine.js.map