nodedex 0.1.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 (469) hide show
  1. package/adapters/claude-code-watcher.mjs +336 -0
  2. package/adapters/hermes-statedb-watcher.mjs +234 -0
  3. package/adapters/nodedex-capture-core.mjs +129 -0
  4. package/adapters/nodedex-capture.mjs +169 -0
  5. package/dist/agent-protocol.d.ts +7 -0
  6. package/dist/agent-protocol.d.ts.map +1 -0
  7. package/dist/agent-protocol.js +38 -0
  8. package/dist/agent-protocol.js.map +1 -0
  9. package/dist/api-server.d.ts +5 -0
  10. package/dist/api-server.d.ts.map +1 -0
  11. package/dist/api-server.js +351 -0
  12. package/dist/api-server.js.map +1 -0
  13. package/dist/boot-env.d.ts +2 -0
  14. package/dist/boot-env.d.ts.map +1 -0
  15. package/dist/boot-env.js +12 -0
  16. package/dist/boot-env.js.map +1 -0
  17. package/dist/engine/__tests__/search-core.test.d.ts +2 -0
  18. package/dist/engine/__tests__/search-core.test.d.ts.map +1 -0
  19. package/dist/engine/__tests__/search-core.test.js +139 -0
  20. package/dist/engine/__tests__/search-core.test.js.map +1 -0
  21. package/dist/engine/ai-provider.d.ts +45 -0
  22. package/dist/engine/ai-provider.d.ts.map +1 -0
  23. package/dist/engine/ai-provider.js +5 -0
  24. package/dist/engine/ai-provider.js.map +1 -0
  25. package/dist/engine/embeddings.d.ts +51 -0
  26. package/dist/engine/embeddings.d.ts.map +1 -0
  27. package/dist/engine/embeddings.js +89 -0
  28. package/dist/engine/embeddings.js.map +1 -0
  29. package/dist/engine/providers/__tests__/failure-policy.test.d.ts +2 -0
  30. package/dist/engine/providers/__tests__/failure-policy.test.d.ts.map +1 -0
  31. package/dist/engine/providers/__tests__/failure-policy.test.js +134 -0
  32. package/dist/engine/providers/__tests__/failure-policy.test.js.map +1 -0
  33. package/dist/engine/providers/__tests__/model-caps.test.d.ts +2 -0
  34. package/dist/engine/providers/__tests__/model-caps.test.d.ts.map +1 -0
  35. package/dist/engine/providers/__tests__/model-caps.test.js +38 -0
  36. package/dist/engine/providers/__tests__/model-caps.test.js.map +1 -0
  37. package/dist/engine/providers/__tests__/openai-structured.test.d.ts +2 -0
  38. package/dist/engine/providers/__tests__/openai-structured.test.d.ts.map +1 -0
  39. package/dist/engine/providers/__tests__/openai-structured.test.js +73 -0
  40. package/dist/engine/providers/__tests__/openai-structured.test.js.map +1 -0
  41. package/dist/engine/providers/__tests__/usage-ledger.test.d.ts +2 -0
  42. package/dist/engine/providers/__tests__/usage-ledger.test.d.ts.map +1 -0
  43. package/dist/engine/providers/__tests__/usage-ledger.test.js +108 -0
  44. package/dist/engine/providers/__tests__/usage-ledger.test.js.map +1 -0
  45. package/dist/engine/providers/anthropic.d.ts +17 -0
  46. package/dist/engine/providers/anthropic.d.ts.map +1 -0
  47. package/dist/engine/providers/anthropic.js +125 -0
  48. package/dist/engine/providers/anthropic.js.map +1 -0
  49. package/dist/engine/providers/failure-policy.d.ts +56 -0
  50. package/dist/engine/providers/failure-policy.d.ts.map +1 -0
  51. package/dist/engine/providers/failure-policy.js +120 -0
  52. package/dist/engine/providers/failure-policy.js.map +1 -0
  53. package/dist/engine/providers/gemini.d.ts +22 -0
  54. package/dist/engine/providers/gemini.d.ts.map +1 -0
  55. package/dist/engine/providers/gemini.js +180 -0
  56. package/dist/engine/providers/gemini.js.map +1 -0
  57. package/dist/engine/providers/index.d.ts +8 -0
  58. package/dist/engine/providers/index.d.ts.map +1 -0
  59. package/dist/engine/providers/index.js +67 -0
  60. package/dist/engine/providers/index.js.map +1 -0
  61. package/dist/engine/providers/local.d.ts +12 -0
  62. package/dist/engine/providers/local.d.ts.map +1 -0
  63. package/dist/engine/providers/local.js +46 -0
  64. package/dist/engine/providers/local.js.map +1 -0
  65. package/dist/engine/providers/model-caps.d.ts +6 -0
  66. package/dist/engine/providers/model-caps.d.ts.map +1 -0
  67. package/dist/engine/providers/model-caps.js +49 -0
  68. package/dist/engine/providers/model-caps.js.map +1 -0
  69. package/dist/engine/providers/openai.d.ts +30 -0
  70. package/dist/engine/providers/openai.d.ts.map +1 -0
  71. package/dist/engine/providers/openai.js +309 -0
  72. package/dist/engine/providers/openai.js.map +1 -0
  73. package/dist/engine/providers/usage-ledger.d.ts +69 -0
  74. package/dist/engine/providers/usage-ledger.d.ts.map +1 -0
  75. package/dist/engine/providers/usage-ledger.js +209 -0
  76. package/dist/engine/providers/usage-ledger.js.map +1 -0
  77. package/dist/engine/search-core.d.ts +40 -0
  78. package/dist/engine/search-core.d.ts.map +1 -0
  79. package/dist/engine/search-core.js +109 -0
  80. package/dist/engine/search-core.js.map +1 -0
  81. package/dist/engine/vector-math.d.ts +5 -0
  82. package/dist/engine/vector-math.d.ts.map +1 -0
  83. package/dist/engine/vector-math.js +25 -0
  84. package/dist/engine/vector-math.js.map +1 -0
  85. package/dist/home-env.d.ts +26 -0
  86. package/dist/home-env.d.ts.map +1 -0
  87. package/dist/home-env.js +87 -0
  88. package/dist/home-env.js.map +1 -0
  89. package/dist/mcp-server.d.ts +13 -0
  90. package/dist/mcp-server.d.ts.map +1 -0
  91. package/dist/mcp-server.js +79 -0
  92. package/dist/mcp-server.js.map +1 -0
  93. package/dist/middleware/auth.d.ts +23 -0
  94. package/dist/middleware/auth.d.ts.map +1 -0
  95. package/dist/middleware/auth.js +104 -0
  96. package/dist/middleware/auth.js.map +1 -0
  97. package/dist/middleware/auto-recall.d.ts +7 -0
  98. package/dist/middleware/auto-recall.d.ts.map +1 -0
  99. package/dist/middleware/auto-recall.js +257 -0
  100. package/dist/middleware/auto-recall.js.map +1 -0
  101. package/dist/middleware/auto-reflect.d.ts +4 -0
  102. package/dist/middleware/auto-reflect.d.ts.map +1 -0
  103. package/dist/middleware/auto-reflect.js +5 -0
  104. package/dist/middleware/auto-reflect.js.map +1 -0
  105. package/dist/middleware/reflect/apply-flag-verdict.d.ts +27 -0
  106. package/dist/middleware/reflect/apply-flag-verdict.d.ts.map +1 -0
  107. package/dist/middleware/reflect/apply-flag-verdict.js +57 -0
  108. package/dist/middleware/reflect/apply-flag-verdict.js.map +1 -0
  109. package/dist/middleware/reflect/arc-entity-resolve.d.ts +29 -0
  110. package/dist/middleware/reflect/arc-entity-resolve.d.ts.map +1 -0
  111. package/dist/middleware/reflect/arc-entity-resolve.js +356 -0
  112. package/dist/middleware/reflect/arc-entity-resolve.js.map +1 -0
  113. package/dist/middleware/reflect/arc-inactivity-timer.d.ts +47 -0
  114. package/dist/middleware/reflect/arc-inactivity-timer.d.ts.map +1 -0
  115. package/dist/middleware/reflect/arc-inactivity-timer.js +175 -0
  116. package/dist/middleware/reflect/arc-inactivity-timer.js.map +1 -0
  117. package/dist/middleware/reflect/arc-pipeline.d.ts +33 -0
  118. package/dist/middleware/reflect/arc-pipeline.d.ts.map +1 -0
  119. package/dist/middleware/reflect/arc-pipeline.js +498 -0
  120. package/dist/middleware/reflect/arc-pipeline.js.map +1 -0
  121. package/dist/middleware/reflect/comprehend-pergroup.d.ts +100 -0
  122. package/dist/middleware/reflect/comprehend-pergroup.d.ts.map +1 -0
  123. package/dist/middleware/reflect/comprehend-pergroup.js +610 -0
  124. package/dist/middleware/reflect/comprehend-pergroup.js.map +1 -0
  125. package/dist/middleware/reflect/comprehend.d.ts +237 -0
  126. package/dist/middleware/reflect/comprehend.d.ts.map +1 -0
  127. package/dist/middleware/reflect/comprehend.js +706 -0
  128. package/dist/middleware/reflect/comprehend.js.map +1 -0
  129. package/dist/middleware/reflect/config.d.ts +34 -0
  130. package/dist/middleware/reflect/config.d.ts.map +1 -0
  131. package/dist/middleware/reflect/config.js +131 -0
  132. package/dist/middleware/reflect/config.js.map +1 -0
  133. package/dist/middleware/reflect/context.d.ts +138 -0
  134. package/dist/middleware/reflect/context.d.ts.map +1 -0
  135. package/dist/middleware/reflect/context.js +619 -0
  136. package/dist/middleware/reflect/context.js.map +1 -0
  137. package/dist/middleware/reflect/cost-breakdown.d.ts +69 -0
  138. package/dist/middleware/reflect/cost-breakdown.d.ts.map +1 -0
  139. package/dist/middleware/reflect/cost-breakdown.js +63 -0
  140. package/dist/middleware/reflect/cost-breakdown.js.map +1 -0
  141. package/dist/middleware/reflect/cost-guard.d.ts +102 -0
  142. package/dist/middleware/reflect/cost-guard.d.ts.map +1 -0
  143. package/dist/middleware/reflect/cost-guard.js +243 -0
  144. package/dist/middleware/reflect/cost-guard.js.map +1 -0
  145. package/dist/middleware/reflect/cost-pricing.d.ts +54 -0
  146. package/dist/middleware/reflect/cost-pricing.d.ts.map +1 -0
  147. package/dist/middleware/reflect/cost-pricing.js +148 -0
  148. package/dist/middleware/reflect/cost-pricing.js.map +1 -0
  149. package/dist/middleware/reflect/cross-group-link.d.ts +61 -0
  150. package/dist/middleware/reflect/cross-group-link.d.ts.map +1 -0
  151. package/dist/middleware/reflect/cross-group-link.js +212 -0
  152. package/dist/middleware/reflect/cross-group-link.js.map +1 -0
  153. package/dist/middleware/reflect/dedup-by-source-and-value.d.ts +70 -0
  154. package/dist/middleware/reflect/dedup-by-source-and-value.d.ts.map +1 -0
  155. package/dist/middleware/reflect/dedup-by-source-and-value.js +0 -0
  156. package/dist/middleware/reflect/dedup-by-source-and-value.js.map +1 -0
  157. package/dist/middleware/reflect/describe-roots.d.ts +58 -0
  158. package/dist/middleware/reflect/describe-roots.d.ts.map +1 -0
  159. package/dist/middleware/reflect/describe-roots.js +266 -0
  160. package/dist/middleware/reflect/describe-roots.js.map +1 -0
  161. package/dist/middleware/reflect/flag-reviewer-startup.d.ts +16 -0
  162. package/dist/middleware/reflect/flag-reviewer-startup.d.ts.map +1 -0
  163. package/dist/middleware/reflect/flag-reviewer-startup.js +107 -0
  164. package/dist/middleware/reflect/flag-reviewer-startup.js.map +1 -0
  165. package/dist/middleware/reflect/flag-reviewer.d.ts +69 -0
  166. package/dist/middleware/reflect/flag-reviewer.d.ts.map +1 -0
  167. package/dist/middleware/reflect/flag-reviewer.js +520 -0
  168. package/dist/middleware/reflect/flag-reviewer.js.map +1 -0
  169. package/dist/middleware/reflect/inline-dedup.d.ts +26 -0
  170. package/dist/middleware/reflect/inline-dedup.d.ts.map +1 -0
  171. package/dist/middleware/reflect/inline-dedup.js +131 -0
  172. package/dist/middleware/reflect/inline-dedup.js.map +1 -0
  173. package/dist/middleware/reflect/justify-decisions.d.ts +37 -0
  174. package/dist/middleware/reflect/justify-decisions.d.ts.map +1 -0
  175. package/dist/middleware/reflect/justify-decisions.js +159 -0
  176. package/dist/middleware/reflect/justify-decisions.js.map +1 -0
  177. package/dist/middleware/reflect/nl-accept.d.ts +35 -0
  178. package/dist/middleware/reflect/nl-accept.d.ts.map +1 -0
  179. package/dist/middleware/reflect/nl-accept.js +167 -0
  180. package/dist/middleware/reflect/nl-accept.js.map +1 -0
  181. package/dist/middleware/reflect/pass0.d.ts +20 -0
  182. package/dist/middleware/reflect/pass0.d.ts.map +1 -0
  183. package/dist/middleware/reflect/pass0.js +423 -0
  184. package/dist/middleware/reflect/pass0.js.map +1 -0
  185. package/dist/middleware/reflect/pass1.d.ts +17 -0
  186. package/dist/middleware/reflect/pass1.d.ts.map +1 -0
  187. package/dist/middleware/reflect/pass1.js +241 -0
  188. package/dist/middleware/reflect/pass1.js.map +1 -0
  189. package/dist/middleware/reflect/pass2-quarantine.d.ts +129 -0
  190. package/dist/middleware/reflect/pass2-quarantine.d.ts.map +1 -0
  191. package/dist/middleware/reflect/pass2-quarantine.js +272 -0
  192. package/dist/middleware/reflect/pass2-quarantine.js.map +1 -0
  193. package/dist/middleware/reflect/pass2-seams.d.ts +205 -0
  194. package/dist/middleware/reflect/pass2-seams.d.ts.map +1 -0
  195. package/dist/middleware/reflect/pass2-seams.js +279 -0
  196. package/dist/middleware/reflect/pass2-seams.js.map +1 -0
  197. package/dist/middleware/reflect/pass2-split-orchestrator.d.ts +37 -0
  198. package/dist/middleware/reflect/pass2-split-orchestrator.d.ts.map +1 -0
  199. package/dist/middleware/reflect/pass2-split-orchestrator.js +531 -0
  200. package/dist/middleware/reflect/pass2-split-orchestrator.js.map +1 -0
  201. package/dist/middleware/reflect/pass2.d.ts +17 -0
  202. package/dist/middleware/reflect/pass2.d.ts.map +1 -0
  203. package/dist/middleware/reflect/pass2.js +324 -0
  204. package/dist/middleware/reflect/pass2.js.map +1 -0
  205. package/dist/middleware/reflect/pass2a.d.ts +141 -0
  206. package/dist/middleware/reflect/pass2a.d.ts.map +1 -0
  207. package/dist/middleware/reflect/pass2a.js +404 -0
  208. package/dist/middleware/reflect/pass2a.js.map +1 -0
  209. package/dist/middleware/reflect/pass2b.d.ts +108 -0
  210. package/dist/middleware/reflect/pass2b.d.ts.map +1 -0
  211. package/dist/middleware/reflect/pass2b.js +480 -0
  212. package/dist/middleware/reflect/pass2b.js.map +1 -0
  213. package/dist/middleware/reflect/pass2c.d.ts +113 -0
  214. package/dist/middleware/reflect/pass2c.d.ts.map +1 -0
  215. package/dist/middleware/reflect/pass2c.js +360 -0
  216. package/dist/middleware/reflect/pass2c.js.map +1 -0
  217. package/dist/middleware/reflect/pass3-batch.d.ts +62 -0
  218. package/dist/middleware/reflect/pass3-batch.d.ts.map +1 -0
  219. package/dist/middleware/reflect/pass3-batch.js +139 -0
  220. package/dist/middleware/reflect/pass3-batch.js.map +1 -0
  221. package/dist/middleware/reflect/pass3.d.ts +23 -0
  222. package/dist/middleware/reflect/pass3.d.ts.map +1 -0
  223. package/dist/middleware/reflect/pass3.js +371 -0
  224. package/dist/middleware/reflect/pass3.js.map +1 -0
  225. package/dist/middleware/reflect/pass4-slice.d.ts +25 -0
  226. package/dist/middleware/reflect/pass4-slice.d.ts.map +1 -0
  227. package/dist/middleware/reflect/pass4-slice.js +315 -0
  228. package/dist/middleware/reflect/pass4-slice.js.map +1 -0
  229. package/dist/middleware/reflect/pass4.d.ts +30 -0
  230. package/dist/middleware/reflect/pass4.d.ts.map +1 -0
  231. package/dist/middleware/reflect/pass4.js +193 -0
  232. package/dist/middleware/reflect/pass4.js.map +1 -0
  233. package/dist/middleware/reflect/pass5.d.ts +22 -0
  234. package/dist/middleware/reflect/pass5.d.ts.map +1 -0
  235. package/dist/middleware/reflect/pass5.js +178 -0
  236. package/dist/middleware/reflect/pass5.js.map +1 -0
  237. package/dist/middleware/reflect/pass_judge.d.ts +44 -0
  238. package/dist/middleware/reflect/pass_judge.d.ts.map +1 -0
  239. package/dist/middleware/reflect/pass_judge.js +263 -0
  240. package/dist/middleware/reflect/pass_judge.js.map +1 -0
  241. package/dist/middleware/reflect/pipeline-flags.d.ts +140 -0
  242. package/dist/middleware/reflect/pipeline-flags.d.ts.map +1 -0
  243. package/dist/middleware/reflect/pipeline-flags.js +314 -0
  244. package/dist/middleware/reflect/pipeline-flags.js.map +1 -0
  245. package/dist/middleware/reflect/pipeline.d.ts +237 -0
  246. package/dist/middleware/reflect/pipeline.d.ts.map +1 -0
  247. package/dist/middleware/reflect/pipeline.js +3114 -0
  248. package/dist/middleware/reflect/pipeline.js.map +1 -0
  249. package/dist/middleware/reflect/promptOverride.d.ts +14 -0
  250. package/dist/middleware/reflect/promptOverride.d.ts.map +1 -0
  251. package/dist/middleware/reflect/promptOverride.js +28 -0
  252. package/dist/middleware/reflect/promptOverride.js.map +1 -0
  253. package/dist/middleware/reflect/provenance-check.d.ts +48 -0
  254. package/dist/middleware/reflect/provenance-check.d.ts.map +1 -0
  255. package/dist/middleware/reflect/provenance-check.js +180 -0
  256. package/dist/middleware/reflect/provenance-check.js.map +1 -0
  257. package/dist/middleware/reflect/provenance-reviewer.d.ts +52 -0
  258. package/dist/middleware/reflect/provenance-reviewer.d.ts.map +1 -0
  259. package/dist/middleware/reflect/provenance-reviewer.js +253 -0
  260. package/dist/middleware/reflect/provenance-reviewer.js.map +1 -0
  261. package/dist/middleware/reflect/prune-collapsed-types.d.ts +11 -0
  262. package/dist/middleware/reflect/prune-collapsed-types.d.ts.map +1 -0
  263. package/dist/middleware/reflect/prune-collapsed-types.js +32 -0
  264. package/dist/middleware/reflect/prune-collapsed-types.js.map +1 -0
  265. package/dist/middleware/reflect/recognize-root.d.ts +75 -0
  266. package/dist/middleware/reflect/recognize-root.d.ts.map +1 -0
  267. package/dist/middleware/reflect/recognize-root.js +204 -0
  268. package/dist/middleware/reflect/recognize-root.js.map +1 -0
  269. package/dist/middleware/reflect/render-agent-flag.d.ts +25 -0
  270. package/dist/middleware/reflect/render-agent-flag.d.ts.map +1 -0
  271. package/dist/middleware/reflect/render-agent-flag.js +39 -0
  272. package/dist/middleware/reflect/render-agent-flag.js.map +1 -0
  273. package/dist/middleware/reflect/retrieve-graph-slice.d.ts +54 -0
  274. package/dist/middleware/reflect/retrieve-graph-slice.d.ts.map +1 -0
  275. package/dist/middleware/reflect/retrieve-graph-slice.js +173 -0
  276. package/dist/middleware/reflect/retrieve-graph-slice.js.map +1 -0
  277. package/dist/middleware/reflect/root-relatedness.d.ts +31 -0
  278. package/dist/middleware/reflect/root-relatedness.d.ts.map +1 -0
  279. package/dist/middleware/reflect/root-relatedness.js +92 -0
  280. package/dist/middleware/reflect/root-relatedness.js.map +1 -0
  281. package/dist/middleware/reflect/schema-heal.d.ts +22 -0
  282. package/dist/middleware/reflect/schema-heal.d.ts.map +1 -0
  283. package/dist/middleware/reflect/schema-heal.js +119 -0
  284. package/dist/middleware/reflect/schema-heal.js.map +1 -0
  285. package/dist/middleware/reflect/schema-validator.d.ts +85 -0
  286. package/dist/middleware/reflect/schema-validator.d.ts.map +1 -0
  287. package/dist/middleware/reflect/schema-validator.js +196 -0
  288. package/dist/middleware/reflect/schema-validator.js.map +1 -0
  289. package/dist/middleware/reflect/stage-audit-graph.d.ts +115 -0
  290. package/dist/middleware/reflect/stage-audit-graph.d.ts.map +1 -0
  291. package/dist/middleware/reflect/stage-audit-graph.js +563 -0
  292. package/dist/middleware/reflect/stage-audit-graph.js.map +1 -0
  293. package/dist/middleware/reflect/stage-d-resolve-graph.d.ts +87 -0
  294. package/dist/middleware/reflect/stage-d-resolve-graph.d.ts.map +1 -0
  295. package/dist/middleware/reflect/stage-d-resolve-graph.js +256 -0
  296. package/dist/middleware/reflect/stage-d-resolve-graph.js.map +1 -0
  297. package/dist/middleware/reflect/synthesizeFromSceneCard.d.ts +15 -0
  298. package/dist/middleware/reflect/synthesizeFromSceneCard.d.ts.map +1 -0
  299. package/dist/middleware/reflect/synthesizeFromSceneCard.js +91 -0
  300. package/dist/middleware/reflect/synthesizeFromSceneCard.js.map +1 -0
  301. package/dist/middleware/reflect/types.d.ts +261 -0
  302. package/dist/middleware/reflect/types.d.ts.map +1 -0
  303. package/dist/middleware/reflect/types.js +3 -0
  304. package/dist/middleware/reflect/types.js.map +1 -0
  305. package/dist/middleware/reflect/v2-integrate.d.ts +120 -0
  306. package/dist/middleware/reflect/v2-integrate.d.ts.map +1 -0
  307. package/dist/middleware/reflect/v2-integrate.js +388 -0
  308. package/dist/middleware/reflect/v2-integrate.js.map +1 -0
  309. package/dist/middleware/reflect/v2-judge.d.ts +44 -0
  310. package/dist/middleware/reflect/v2-judge.d.ts.map +1 -0
  311. package/dist/middleware/reflect/v2-judge.js +191 -0
  312. package/dist/middleware/reflect/v2-judge.js.map +1 -0
  313. package/dist/relation-sets.d.ts +2 -0
  314. package/dist/relation-sets.d.ts.map +1 -0
  315. package/dist/relation-sets.js +35 -0
  316. package/dist/relation-sets.js.map +1 -0
  317. package/dist/routes/__tests__/flags.test.d.ts +2 -0
  318. package/dist/routes/__tests__/flags.test.d.ts.map +1 -0
  319. package/dist/routes/__tests__/flags.test.js +257 -0
  320. package/dist/routes/__tests__/flags.test.js.map +1 -0
  321. package/dist/routes/__tests__/models-catalog.test.d.ts +2 -0
  322. package/dist/routes/__tests__/models-catalog.test.d.ts.map +1 -0
  323. package/dist/routes/__tests__/models-catalog.test.js +130 -0
  324. package/dist/routes/__tests__/models-catalog.test.js.map +1 -0
  325. package/dist/routes/__tests__/reflect-pause-drain.test.d.ts +2 -0
  326. package/dist/routes/__tests__/reflect-pause-drain.test.d.ts.map +1 -0
  327. package/dist/routes/__tests__/reflect-pause-drain.test.js +38 -0
  328. package/dist/routes/__tests__/reflect-pause-drain.test.js.map +1 -0
  329. package/dist/routes/__tests__/spend-pause-drain.test.d.ts +2 -0
  330. package/dist/routes/__tests__/spend-pause-drain.test.d.ts.map +1 -0
  331. package/dist/routes/__tests__/spend-pause-drain.test.js +38 -0
  332. package/dist/routes/__tests__/spend-pause-drain.test.js.map +1 -0
  333. package/dist/routes/admin.d.ts +49 -0
  334. package/dist/routes/admin.d.ts.map +1 -0
  335. package/dist/routes/admin.js +471 -0
  336. package/dist/routes/admin.js.map +1 -0
  337. package/dist/routes/blocks.d.ts +4 -0
  338. package/dist/routes/blocks.d.ts.map +1 -0
  339. package/dist/routes/blocks.js +893 -0
  340. package/dist/routes/blocks.js.map +1 -0
  341. package/dist/routes/chat-proxy.d.ts +5 -0
  342. package/dist/routes/chat-proxy.d.ts.map +1 -0
  343. package/dist/routes/chat-proxy.js +225 -0
  344. package/dist/routes/chat-proxy.js.map +1 -0
  345. package/dist/routes/conversations.d.ts +4 -0
  346. package/dist/routes/conversations.d.ts.map +1 -0
  347. package/dist/routes/conversations.js +139 -0
  348. package/dist/routes/conversations.js.map +1 -0
  349. package/dist/routes/flags.d.ts +4 -0
  350. package/dist/routes/flags.d.ts.map +1 -0
  351. package/dist/routes/flags.js +151 -0
  352. package/dist/routes/flags.js.map +1 -0
  353. package/dist/routes/inject.d.ts +4 -0
  354. package/dist/routes/inject.d.ts.map +1 -0
  355. package/dist/routes/inject.js +183 -0
  356. package/dist/routes/inject.js.map +1 -0
  357. package/dist/routes/mcp-http.d.ts +5 -0
  358. package/dist/routes/mcp-http.d.ts.map +1 -0
  359. package/dist/routes/mcp-http.js +94 -0
  360. package/dist/routes/mcp-http.js.map +1 -0
  361. package/dist/routes/quarantine.d.ts +4 -0
  362. package/dist/routes/quarantine.d.ts.map +1 -0
  363. package/dist/routes/quarantine.js +66 -0
  364. package/dist/routes/quarantine.js.map +1 -0
  365. package/dist/routes/recall.d.ts +5 -0
  366. package/dist/routes/recall.d.ts.map +1 -0
  367. package/dist/routes/recall.js +573 -0
  368. package/dist/routes/recall.js.map +1 -0
  369. package/dist/routes/reflect.d.ts +5 -0
  370. package/dist/routes/reflect.d.ts.map +1 -0
  371. package/dist/routes/reflect.js +231 -0
  372. package/dist/routes/reflect.js.map +1 -0
  373. package/dist/routes/session.d.ts +4 -0
  374. package/dist/routes/session.d.ts.map +1 -0
  375. package/dist/routes/session.js +418 -0
  376. package/dist/routes/session.js.map +1 -0
  377. package/dist/routes/state.d.ts +116 -0
  378. package/dist/routes/state.d.ts.map +1 -0
  379. package/dist/routes/state.js +621 -0
  380. package/dist/routes/state.js.map +1 -0
  381. package/dist/routes/usage.d.ts +3 -0
  382. package/dist/routes/usage.d.ts.map +1 -0
  383. package/dist/routes/usage.js +141 -0
  384. package/dist/routes/usage.js.map +1 -0
  385. package/dist/routes/workspace.d.ts +5 -0
  386. package/dist/routes/workspace.d.ts.map +1 -0
  387. package/dist/routes/workspace.js +435 -0
  388. package/dist/routes/workspace.js.map +1 -0
  389. package/dist/server.d.ts +13 -0
  390. package/dist/server.d.ts.map +1 -0
  391. package/dist/server.js +298 -0
  392. package/dist/server.js.map +1 -0
  393. package/dist/store/__tests__/backup.test.d.ts +2 -0
  394. package/dist/store/__tests__/backup.test.d.ts.map +1 -0
  395. package/dist/store/__tests__/backup.test.js +53 -0
  396. package/dist/store/__tests__/backup.test.js.map +1 -0
  397. package/dist/store/__tests__/quality.test.d.ts +2 -0
  398. package/dist/store/__tests__/quality.test.d.ts.map +1 -0
  399. package/dist/store/__tests__/quality.test.js +75 -0
  400. package/dist/store/__tests__/quality.test.js.map +1 -0
  401. package/dist/store/backup.d.ts +14 -0
  402. package/dist/store/backup.d.ts.map +1 -0
  403. package/dist/store/backup.js +95 -0
  404. package/dist/store/backup.js.map +1 -0
  405. package/dist/store/database.d.ts +407 -0
  406. package/dist/store/database.d.ts.map +1 -0
  407. package/dist/store/database.js +2004 -0
  408. package/dist/store/database.js.map +1 -0
  409. package/dist/store/quality.d.ts +25 -0
  410. package/dist/store/quality.d.ts.map +1 -0
  411. package/dist/store/quality.js +48 -0
  412. package/dist/store/quality.js.map +1 -0
  413. package/dist/tools/__tests__/assemble-block-chains.test.d.ts +2 -0
  414. package/dist/tools/__tests__/assemble-block-chains.test.d.ts.map +1 -0
  415. package/dist/tools/__tests__/assemble-block-chains.test.js +118 -0
  416. package/dist/tools/__tests__/assemble-block-chains.test.js.map +1 -0
  417. package/dist/tools/__tests__/filter-roots-by-concepts.test.d.ts +2 -0
  418. package/dist/tools/__tests__/filter-roots-by-concepts.test.d.ts.map +1 -0
  419. package/dist/tools/__tests__/filter-roots-by-concepts.test.js +68 -0
  420. package/dist/tools/__tests__/filter-roots-by-concepts.test.js.map +1 -0
  421. package/dist/tools/__tests__/flag-surface.test.d.ts +2 -0
  422. package/dist/tools/__tests__/flag-surface.test.d.ts.map +1 -0
  423. package/dist/tools/__tests__/flag-surface.test.js +130 -0
  424. package/dist/tools/__tests__/flag-surface.test.js.map +1 -0
  425. package/dist/tools/core.d.ts +5 -0
  426. package/dist/tools/core.d.ts.map +1 -0
  427. package/dist/tools/core.js +962 -0
  428. package/dist/tools/core.js.map +1 -0
  429. package/dist/tools/derive.d.ts +5 -0
  430. package/dist/tools/derive.d.ts.map +1 -0
  431. package/dist/tools/derive.js +182 -0
  432. package/dist/tools/derive.js.map +1 -0
  433. package/dist/tools/flag-surface.d.ts +26 -0
  434. package/dist/tools/flag-surface.d.ts.map +1 -0
  435. package/dist/tools/flag-surface.js +59 -0
  436. package/dist/tools/flag-surface.js.map +1 -0
  437. package/dist/tools/helpers.d.ts +99 -0
  438. package/dist/tools/helpers.d.ts.map +1 -0
  439. package/dist/tools/helpers.js +243 -0
  440. package/dist/tools/helpers.js.map +1 -0
  441. package/dist/tools/projects.d.ts +5 -0
  442. package/dist/tools/projects.d.ts.map +1 -0
  443. package/dist/tools/projects.js +175 -0
  444. package/dist/tools/projects.js.map +1 -0
  445. package/dist/tools/system.d.ts +5 -0
  446. package/dist/tools/system.d.ts.map +1 -0
  447. package/dist/tools/system.js +1361 -0
  448. package/dist/tools/system.js.map +1 -0
  449. package/dist/tools/tasks.d.ts +5 -0
  450. package/dist/tools/tasks.d.ts.map +1 -0
  451. package/dist/tools/tasks.js +289 -0
  452. package/dist/tools/tasks.js.map +1 -0
  453. package/package.json +69 -0
  454. package/scripts/nodedex-entry.mjs +396 -0
  455. package/tui-dist/App.js +185 -0
  456. package/tui-dist/api.js +197 -0
  457. package/tui-dist/cli.js +53 -0
  458. package/tui-dist/components.js +63 -0
  459. package/tui-dist/config.js +242 -0
  460. package/tui-dist/connect-snippets.js +98 -0
  461. package/tui-dist/feed.js +51 -0
  462. package/tui-dist/health.js +465 -0
  463. package/tui-dist/hooks.js +23 -0
  464. package/tui-dist/memory.js +220 -0
  465. package/tui-dist/onboarding.js +498 -0
  466. package/tui-dist/review.js +193 -0
  467. package/tui-dist/servers.js +556 -0
  468. package/tui-dist/smoke.js +15 -0
  469. package/tui-dist/theme.js +106 -0
@@ -0,0 +1,204 @@
1
+ // ═══════════════════════════════════════════════════════════════════════════════
2
+ // Recognition Layer — STEP 2: THE RECOGNIZER ("Stage D for roots")
3
+ // ═══════════════════════════════════════════════════════════════════════════════
4
+ //
5
+ // Design: docs/PIPELINE-RECOGNITION-LAYER-DESIGN.md §2 (LLM-primary spine) + §3.
6
+ //
7
+ // JOB: for each NEW project-root candidate an arc would create, decide — does
8
+ // this cluster of new knowledge actually belong to an EXISTING root? One LLM
9
+ // judgment over (the new cluster's content) + (the candidate roots' DESCRIPTIONS
10
+ // + scope). Verdict: attach / new / uncertain.
11
+ //
12
+ // HOOK: runs in pipeline.ts right after applyArcEntityCanonicalNames (the seam
13
+ // where Stage C's canonical names are written onto items, BEFORE Pass 3). On a
14
+ // confident ATTACH it rewrites the cluster's items' .project to the existing
15
+ // root's EXACT label → Pass 3's root-create exact-match finds it → blocks attach,
16
+ // no fork. Default OFF (NODEDEX_RECOGNIZER_ENABLED=1), arc-mode only.
17
+ //
18
+ // THE 6 GUARDS (§2 — non-negotiable; without them this is a silent-merge risk):
19
+ // 1. judges against the root DESCRIPTION (essence), not the raw label string
20
+ // 2. SCOPE/OWNER is an explicit axis — same domain AND same owner to attach
21
+ // 3. cite EVIDENCE in reasoning (auditable, not a vibe)
22
+ // 4. bias hard to NOT-attach — anything short of a confident same-owner fit
23
+ // keeps the new root (a FORK is the safe failure; §1). Enforced
24
+ // deterministically in decideAction(), not left to the prompt alone.
25
+ // 5. judge against the description (members are not dumped here)
26
+ // 6. attach must NAME the shared subject-matter (shared_subject) — shared
27
+ // MANNER (both involve the speaker reasoning/remembering/planning) names no
28
+ // subject, so it can never justify an attach. Added 2026-06-11 after a
29
+ // transcript test where a process-narration root became an attractor and
30
+ // absorbed an unrelated domain. Enforced in decideAction().
31
+ //
32
+ // v1 SCOPE: ACT on ATTACH only (the value-add: stop the fork by attaching when
33
+ // confident). "new" and "uncertain" both → keep the new root (the safe fork).
34
+ // At-ingest flag-to-agent is deferred to the AUDIT-heal pass (step 4): blocks
35
+ // don't exist yet at this pre-Pass-3 seam, so a fork is created and the post-hoc
36
+ // project_dup_candidate detector surfaces the pair for the agent/user.
37
+ import { intFromEnv } from "./config.js";
38
+ // ─── Config ──────────────────────────────────────────────────────────────────
39
+ export function recognizerEnabled() {
40
+ // DEFAULT ON since 2026-06-12 (v2's cross-session root matching — without it the
41
+ // default engine fragments roots across sessions). =0 opts out.
42
+ return process.env.NODEDEX_RECOGNIZER_ENABLED !== "0";
43
+ }
44
+ function maxCandidateRoots() {
45
+ return intFromEnv("NODEDEX_RECOGNIZER_MAX_ROOTS", 40); // bound prompt size; scale-prefilter = TODO
46
+ }
47
+ function maxItemsInCluster() {
48
+ return intFromEnv("NODEDEX_RECOGNIZER_MAX_ITEMS", 30);
49
+ }
50
+ // ─── Pure decision (guard #4 enforced in code, not just the prompt) ────────────
51
+ /**
52
+ * Map an LLM verdict → an action. ATTACH only when the model is confident
53
+ * (decision==="attach"), names a root that ACTUALLY EXISTS, confirms same
54
+ * owner, AND names the shared subject-matter (guard #6 — an attach must carry
55
+ * its falsifiable evidence; an unevidenced attach is a contract violation, so
56
+ * the safe direction is fork). Everything else → keep. Pure / testable.
57
+ */
58
+ export function decideAction(verdict, knownRootLabels) {
59
+ if (verdict.decision === "attach" &&
60
+ verdict.same_owner === true &&
61
+ typeof verdict.matched_root === "string" &&
62
+ verdict.matched_root.length > 0 &&
63
+ knownRootLabels.has(verdict.matched_root) &&
64
+ typeof verdict.shared_subject === "string" &&
65
+ verdict.shared_subject.trim().length > 0) {
66
+ return { action: "attach", root: verdict.matched_root };
67
+ }
68
+ return { action: "keep" };
69
+ }
70
+ /** Distinct project names among items that are NOT existing roots = the
71
+ * new-root candidates the recognizer should judge. Pure / testable. */
72
+ export function newRootCandidateNames(items, knownRootLabels) {
73
+ const seen = new Set();
74
+ const out = [];
75
+ for (const it of items) {
76
+ const p = it.project;
77
+ if (!p || knownRootLabels.has(p) || seen.has(p))
78
+ continue;
79
+ seen.add(p);
80
+ out.push(p);
81
+ }
82
+ return out;
83
+ }
84
+ // ─── Prompt + schema ────────────────────────────────────────────────────────
85
+ export const RECOGNIZE_ROOT_PROMPT = `A knowledge graph is about to create a NEW project root for a cluster of new
86
+ knowledge. Decide whether that cluster actually belongs to an EXISTING project
87
+ instead — so related knowledge COMPOUNDS onto one project rather than fragmenting.
88
+
89
+ You are given:
90
+ - NEW CLUSTER: the new knowledge (its proposed project name + member items).
91
+ - EXISTING PROJECTS: each as a one-line DESCRIPTION (domain + owner).
92
+
93
+ Decide ONE:
94
+ - "attach" — the cluster clearly belongs to one EXISTING project: SAME DOMAIN
95
+ AND SAME OWNER. Set matched_root to that project's exact label and
96
+ shared_subject to the specific subject-matter they share.
97
+ - "new" — no existing project fits; this is genuinely a new project.
98
+ - "uncertain" — plausibly related to an existing project but you are NOT confident
99
+ (e.g. similar domain but unclear/different owner, or a weak fit).
100
+
101
+ RULES (read carefully):
102
+ - Judge on the DESCRIPTION's meaning, NOT on label string similarity. Two similar
103
+ names can be different projects; two different names can be the same project.
104
+ - SAME OWNER is required for "attach". Same domain but a DIFFERENT or UNKNOWN owner
105
+ (e.g. one customer's data vs another's) is NOT the same project → "new" or "uncertain".
106
+ - "attach" requires a NAMEABLE SHARED SUBJECT: shared_subject must name the specific
107
+ thing both bodies of work are ABOUT. A shared MANNER is not a subject — that both
108
+ involve someone remembering, reasoning, or planning a response names no subject,
109
+ because every conversation involves those. If you cannot name what they are both
110
+ about, the fit is not real → "new" or "uncertain", with shared_subject "".
111
+ - When the fit is merely plausible, choose "uncertain", NOT "attach". A wrong attach
112
+ silently merges two real projects (hard to undo); a fork is recoverable. Bias to caution.
113
+ - reasoning MUST cite the specific evidence (which description, which overlapping
114
+ content) — not "they seem related".`;
115
+ const RECOGNIZE_ROOT_SCHEMA = {
116
+ type: "object",
117
+ properties: {
118
+ decision: { type: "string", enum: ["attach", "new", "uncertain"] },
119
+ matched_root: { type: "string" },
120
+ same_owner: { type: "boolean" },
121
+ shared_subject: { type: "string" },
122
+ reasoning: { type: "string" },
123
+ },
124
+ required: ["decision", "matched_root", "same_owner", "shared_subject", "reasoning"],
125
+ };
126
+ export function buildRecognizeInput(newProjectName, clusterItems, candidateRoots, itemCap, rootCap) {
127
+ const roots = candidateRoots.slice(0, rootCap)
128
+ .map((r) => ` - ${r.label}: "${r.essence || "(no description)"}"`)
129
+ .join("\n");
130
+ const members = clusterItems.slice(0, itemCap).map((it) => {
131
+ const t = it.type ?? "?";
132
+ const txt = (it.text ?? "").toString().slice(0, 160);
133
+ return ` - [${t}] ${txt}`;
134
+ }).join("\n");
135
+ return (`NEW CLUSTER (proposed project: ${newProjectName}):\n${members || " (no items)"}\n\n` +
136
+ `EXISTING PROJECTS:\n${roots || " (none)"}`);
137
+ }
138
+ // ─── LLM judgment (one cluster) ───────────────────────────────────────────────
139
+ export async function recognizeClusterRoot(provider, newProjectName, clusterItems, candidateRoots) {
140
+ const userInput = buildRecognizeInput(newProjectName, clusterItems, candidateRoots, maxItemsInCluster(), maxCandidateRoots());
141
+ const r = await provider.generateStructured(RECOGNIZE_ROOT_PROMPT, userInput, RECOGNIZE_ROOT_SCHEMA, { thinkingBudget: 1024, maxOutputTokens: 1024 });
142
+ return { verdict: r.result ?? null, rateLimited: r.rateLimited, usage: r.usage };
143
+ }
144
+ /**
145
+ * For each new-root candidate cluster, ask the recognizer "attach to an existing
146
+ * root?" and collect the confident-attach rewrites. Caller applies the remap to
147
+ * item.project (then Pass 3 + root-create attach to the existing root). Does NOT
148
+ * mutate items itself (pure-ish: returns the remap). LLM-bounded (one call per
149
+ * new-root candidate). NO knownRoots → nothing to attach to → empty remap.
150
+ */
151
+ export async function recognizeRootsForArc(opts) {
152
+ const result = {
153
+ remap: [], candidates: 0, attached: 0, llm_calls: 0, rate_limited: 0, errors: 0,
154
+ };
155
+ if (opts.knownRoots.length === 0)
156
+ return result; // nothing to recognize against
157
+ const knownLabels = new Set(opts.knownRoots.map((r) => r.label));
158
+ const candidates = newRootCandidateNames(opts.items, knownLabels);
159
+ result.candidates = candidates.length;
160
+ for (const name of candidates) {
161
+ const clusterItems = opts.items.filter((it) => it.project === name);
162
+ try {
163
+ result.llm_calls += 1;
164
+ const { verdict, rateLimited } = await recognizeClusterRoot(opts.provider, name, clusterItems, opts.knownRoots);
165
+ if (rateLimited) {
166
+ result.rate_limited += 1;
167
+ continue;
168
+ }
169
+ if (!verdict)
170
+ continue;
171
+ const action = decideAction(verdict, knownLabels);
172
+ if (action.action === "attach" && action.root) {
173
+ result.remap.push({ from: name, to: action.root });
174
+ result.attached += 1;
175
+ console.log(`[recognizer] attach "${name}" → "${action.root}" (same_owner=${verdict.same_owner}, shared_subject="${verdict.shared_subject}"): ${verdict.reasoning.slice(0, 140)}`);
176
+ }
177
+ else {
178
+ console.log(`[recognizer] keep "${name}" (decision=${verdict.decision}, same_owner=${verdict.same_owner}): ${verdict.reasoning.slice(0, 120)}`);
179
+ }
180
+ }
181
+ catch (e) {
182
+ result.errors += 1;
183
+ console.warn(`[recognizer] cluster "${name}" threw: ${e?.message ?? e}`);
184
+ }
185
+ }
186
+ return result;
187
+ }
188
+ /** Apply a remap (from recognizeRootsForArc) to items' .project — returns a NEW
189
+ * array (shallow-copies only the rewritten items). Pure / testable. */
190
+ export function applyRootRemap(items, remap) {
191
+ if (remap.length === 0)
192
+ return { items, rewritten: 0 };
193
+ const map = new Map(remap.map((r) => [r.from, r.to]));
194
+ let rewritten = 0;
195
+ const out = items.map((it) => {
196
+ const to = map.get(it.project);
197
+ if (!to)
198
+ return it;
199
+ rewritten += 1;
200
+ return { ...it, project: to };
201
+ });
202
+ return { items: out, rewritten };
203
+ }
204
+ //# sourceMappingURL=recognize-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recognize-root.js","sourceRoot":"","sources":["../../../src/middleware/reflect/recognize-root.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { PipelineFlag } from "./types.js";
3
+ export interface RenderedAgentFlag {
4
+ id: string;
5
+ question: string;
6
+ you_are_recording: {
7
+ what: string;
8
+ value: string;
9
+ owner: string;
10
+ source: string | null;
11
+ };
12
+ existing_uncertain: {
13
+ what: string;
14
+ value: string;
15
+ owner: string;
16
+ source: string | null;
17
+ } | null;
18
+ routed_reason: string | null;
19
+ }
20
+ /**
21
+ * Render an owner-unknown flag as a plain-English question. Returns null if
22
+ * block_a is gone (stale flag — skip it).
23
+ */
24
+ export declare function renderAgentFlag(raw: Database.Database, flag: PipelineFlag): RenderedAgentFlag | null;
25
+ //# sourceMappingURL=render-agent-flag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-agent-flag.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/render-agent-flag.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzF,kBAAkB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IACjG,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,iBAAiB,GAAG,IAAI,CAepG"}
@@ -0,0 +1,39 @@
1
+ // render-agent-flag.ts — turn an owner-unknown pipeline_flag into a PLAIN-ENGLISH
2
+ // question for the agent. SINGLE SOURCE OF TRUTH for that rendering, used by BOTH:
3
+ // • the REST surface (routes/flags.ts → GET /api/flags/agent-pending)
4
+ // • the MCP pull surface (tools/flag-surface.ts → workspace_stats.flags)
5
+ //
6
+ // Extracted from routes/flags.ts so the two surfaces can't drift. The agent never
7
+ // sees ids/schema/verdict vocabulary — just "same thing? whose?" — and answers from
8
+ // its conversation context (or asks the user), then it's applied via the review path.
9
+ //
10
+ // Only owner-unknown dup flags are routed to the agent today (the reviewer's
11
+ // markFlagPendingClarification path); this renderer is shaped for them.
12
+ import { loadBlockSnapshot } from "./flag-reviewer.js";
13
+ import { extractPrimaryValueFromUnique } from "./dedup-by-source-and-value.js";
14
+ import { scopeSegmentOfLabel } from "./retrieve-graph-slice.js";
15
+ /**
16
+ * Render an owner-unknown flag as a plain-English question. Returns null if
17
+ * block_a is gone (stale flag — skip it).
18
+ */
19
+ export function renderAgentFlag(raw, flag) {
20
+ const a = loadBlockSnapshot(raw, flag.block_id_a);
21
+ if (!a)
22
+ return null;
23
+ const b = flag.block_id_b ? loadBlockSnapshot(raw, flag.block_id_b) : null;
24
+ const describe = (s) => {
25
+ let value = "";
26
+ try {
27
+ value = extractPrimaryValueFromUnique(s.type, (JSON.parse(s.content)?.unique) || {});
28
+ }
29
+ catch { /* leave blank */ }
30
+ return { what: s.essence, value, owner: scopeSegmentOfLabel(s.label), source: s.source ?? null };
31
+ };
32
+ const you = describe(a);
33
+ const existing = b ? describe(b) : null;
34
+ const question = existing
35
+ ? `You're recording (owner: ${you.owner}): "${you.value || you.what}". An existing entry is already on file with an UNCERTAIN owner (${existing.owner}): "${existing.value || existing.what}". Are these the same thing, and does the existing one belong to ${you.owner}? If you can't tell from context, ask the user. (The existing one was captured from: ${existing.source || "no source recorded"}.)`
36
+ : `An existing entry needs an owner assigned: "${you.value || you.what}" (owner: ${you.owner}). Who does it belong to? If unsure, ask the user.`;
37
+ return { id: flag.id, question, you_are_recording: you, existing_uncertain: existing, routed_reason: flag.review_reason };
38
+ }
39
+ //# sourceMappingURL=render-agent-flag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-agent-flag.js","sourceRoot":"","sources":["../../../src/middleware/reflect/render-agent-flag.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,mFAAmF;AACnF,2EAA2E;AAC3E,2EAA2E;AAC3E,EAAE;AACF,kFAAkF;AAClF,oFAAoF;AACpF,sFAAsF;AACtF,EAAE;AACF,6EAA6E;AAC7E,wEAAwE;AAGxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAWhE;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAsB,EAAE,IAAkB;IACxE,MAAM,CAAC,GAAG,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,MAAM,QAAQ,GAAG,CAAC,CAAsB,EAAE,EAAE;QAC1C,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,CAAC;YAAC,KAAK,GAAG,6BAA6B,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACzH,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;IACnG,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ;QACvB,CAAC,CAAC,4BAA4B,GAAG,CAAC,KAAK,OAAO,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,oEAAoE,QAAQ,CAAC,KAAK,OAAO,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,oEAAoE,GAAG,CAAC,KAAK,wFAAwF,QAAQ,CAAC,MAAM,IAAI,oBAAoB,IAAI;QAC3Y,CAAC,CAAC,+CAA+C,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,KAAK,oDAAoD,CAAC;IACnJ,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC5H,CAAC"}
@@ -0,0 +1,54 @@
1
+ import type { WorkspaceDB, Block } from "../../store/database.js";
2
+ export interface CandidateScope {
3
+ /** The owner/scope value (label {project} segment or project_id resolved to it). */
4
+ value: string;
5
+ /** True when the scope is a catch-all dump ("owner unknown"), not a real owner. */
6
+ is_catch_all: boolean;
7
+ }
8
+ export interface RetrievalCandidate {
9
+ block: Block;
10
+ identity_score: number;
11
+ scope: CandidateScope;
12
+ semantic_score: number;
13
+ rank_score: number;
14
+ why: string;
15
+ }
16
+ /** What Part 1 needs about the arc entity it's finding matches for. Derived from
17
+ * a Stage C cluster, but kept as a plain shape so callers/tests can build it
18
+ * without a full ArcEntityResolveResult. */
19
+ export interface EntityQuery {
20
+ canonical_name: string;
21
+ /** Identity-bearing primary values of the entity's member items (the thing to
22
+ * match on — Signal 1). Often one, but a cluster can carry several. */
23
+ primary_values: string[];
24
+ /** Concept tags for candidate FINDING (recall) + partial signal. */
25
+ concepts: string[];
26
+ /** Optional query embedding for Signal 3. Omit to skip semantic. */
27
+ embedding?: number[] | null;
28
+ }
29
+ /** Normalize a primary value for comparison: lowercase, collapse whitespace,
30
+ * strip surrounding backticks/quotes/trailing punctuation. Identity compares on
31
+ * MEANING-bearing text, so cosmetic punctuation must not split a true match. */
32
+ export declare function normalizePrimaryValue(v: string): string;
33
+ /** The {project} (owner) segment of a strict label {project}_{type}_{concept}.
34
+ * Read STRUCTURALLY (split on the `_` dimension separator) — never word-soup. */
35
+ export declare function scopeSegmentOfLabel(label: string): string;
36
+ /** Token-overlap (Jaccard) of two primary values — the partial-identity signal
37
+ * for paraphrase, where exact normalized match fails. */
38
+ export declare function primaryValueTokenOverlap(a: string, b: string): number;
39
+ export declare function isCatchAllScope(scopeValue: string, projectRootEssenceByLabel?: Map<string, string>): boolean;
40
+ export interface RetrieveOpts {
41
+ k?: number;
42
+ /** Pass an embedding-getter to enable Signal 3; omit to skip (pure identity+scope). */
43
+ embeddingFor?: (block: Block) => number[] | null;
44
+ }
45
+ /**
46
+ * Retrieve the top-k candidate blocks for an arc entity, ranked identity-first.
47
+ *
48
+ * Recall step: union of keywordSearch(canonical_name + primary values) +
49
+ * conceptSearch(concepts). Cross-scope candidates are INCLUDED (the resolver's
50
+ * Q2 needs them). Ranking: Signal 1 (identity) dominates; Signal 2 (scope) is
51
+ * carried as evidence, not a filter; Signal 3 (semantic) is a capped booster.
52
+ */
53
+ export declare function retrieveGraphSlice(db: WorkspaceDB, entity: EntityQuery, opts?: RetrieveOpts): RetrievalCandidate[];
54
+ //# sourceMappingURL=retrieve-graph-slice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrieve-graph-slice.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/retrieve-graph-slice.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAkBlE,MAAM,WAAW,cAAc;IAC7B,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,cAAc,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;6CAE6C;AAC7C,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB;4EACwE;IACxE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC7B;AAID;;iFAEiF;AACjF,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED;kFACkF;AAClF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGzD;AAMD;0DAC0D;AAC1D,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAMrE;AAUD,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,yBAAyB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9C,OAAO,CAOT;AAID,MAAM,WAAW,YAAY;IAC3B,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,uFAAuF;IACvF,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,EAAE,GAAG,IAAI,CAAC;CAClD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,WAAW,EACf,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,YAAiB,GACtB,kBAAkB,EAAE,CAsEtB"}
@@ -0,0 +1,173 @@
1
+ // ═══════════════════════════════════════════════════════════════════════════════
2
+ // DEBT 5 Slice 3 (Stage D) — Part 1: RETRIEVE — identity-ranked candidate finder
3
+ // ═══════════════════════════════════════════════════════════════════════════════
4
+ //
5
+ // Job (docs/PIPELINE-STAGE-D-PART1-RETRIEVAL-DESIGN.md):
6
+ // Narrow the graph to ~k candidate blocks the Stage D resolver (Part 2) should
7
+ // judge for "same entity? same scope?". ONLY duty = high RECALL (never miss a
8
+ // real same-entity match). Precision is the resolver's job.
9
+ //
10
+ // Why this is NOT just "reuse recall-smart" (the meaning-first audit, 2026-06-01):
11
+ // recall-smart's SEMANTIC half fingerprints [label, essence, concepts] — TOPIC,
12
+ // not identity. It omits unique{} (the system's identity basis) and FLATTENS the
13
+ // label's {project} segment (the OWNER) into word-soup. For an IDENTITY check
14
+ // that's the wrong signal. So we keep the candidate-FINDING plumbing
15
+ // (keywordSearch/conceptSearch) but rebuild the RANKING on three SEPARATE
16
+ // signals, identity-first:
17
+ //
18
+ // Signal 1 IDENTITY — unique{} primary value (via extractPrimaryValueFromUnique,
19
+ // the SAME extractor D2 + AUDIT use — Rule 5). DOMINANT.
20
+ // Signal 2 SCOPE — label {project} segment read as a DISCRETE dimension (not
21
+ // blended); catch-all scopes tagged "unknown" (spike pair-5
22
+ // lesson). Does NOT filter — cross-scope candidates are
23
+ // WANTED (resolver's Q2 needs them).
24
+ // Signal 3 SEMANTIC — existing cosine, DE-WEIGHTED (≤0.2). A weak recall-net for
25
+ // paraphrases Signal 1 missed; never the identity basis.
26
+ //
27
+ // source_excerpt: carried as EVIDENCE to the resolver, NOT a match key (cross-arc
28
+ // the same entity comes from different conversations → excerpts differ).
29
+ import { cosineSim } from "../../engine/vector-math.js";
30
+ import { extractPrimaryValueFromUnique } from "./dedup-by-source-and-value.js";
31
+ // ─── Weights (identity dominates; semantic is a weak booster) ──────────────────
32
+ const W_IDENTITY_EXACT = 1.0; // exact normalized unique{} primary-value match
33
+ const W_IDENTITY_PARTIAL = 0.5; // token overlap of primary values (paraphrase net)
34
+ const W_SEMANTIC_MAX = 0.2; // cosine contribution ceiling (recall booster only)
35
+ // Scopes that are catch-all dumping grounds, not real owners. Detected
36
+ // STRUCTURALLY below (a project root with few/no real members) — this constant
37
+ // is only the well-known explicit marker, NOT an exhaustive sentinel list (that
38
+ // would be the signal-word anti-pattern). See isCatchAllScope().
39
+ const EXPLICIT_CATCH_ALL = "unspecified-project";
40
+ // ─── Pure helpers (no DB — unit-testable) ──────────────────────────────────────
41
+ /** Normalize a primary value for comparison: lowercase, collapse whitespace,
42
+ * strip surrounding backticks/quotes/trailing punctuation. Identity compares on
43
+ * MEANING-bearing text, so cosmetic punctuation must not split a true match. */
44
+ export function normalizePrimaryValue(v) {
45
+ return (v ?? "")
46
+ .toLowerCase()
47
+ .replace(/[`"'.]/g, "")
48
+ .replace(/\s+/g, " ")
49
+ .trim();
50
+ }
51
+ /** The {project} (owner) segment of a strict label {project}_{type}_{concept}.
52
+ * Read STRUCTURALLY (split on the `_` dimension separator) — never word-soup. */
53
+ export function scopeSegmentOfLabel(label) {
54
+ const i = (label ?? "").indexOf("_");
55
+ return i === -1 ? (label ?? "") : label.slice(0, i);
56
+ }
57
+ function tokenize(s) {
58
+ return normalizePrimaryValue(s).split(" ").filter(t => t.length > 2);
59
+ }
60
+ /** Token-overlap (Jaccard) of two primary values — the partial-identity signal
61
+ * for paraphrase, where exact normalized match fails. */
62
+ export function primaryValueTokenOverlap(a, b) {
63
+ const ta = new Set(tokenize(a)), tb = new Set(tokenize(b));
64
+ if (ta.size === 0 || tb.size === 0)
65
+ return 0;
66
+ let inter = 0;
67
+ for (const t of ta)
68
+ if (tb.has(t))
69
+ inter += 1;
70
+ return inter / (ta.size + tb.size - inter);
71
+ }
72
+ // ─── Scope: catch-all detection (structural, not a sentinel list) ──────────────
73
+ //
74
+ // A scope is "catch-all" when it's a dumping ground rather than a real owner. We
75
+ // detect this STRUCTURALLY: the explicit well-known marker, OR a project root that
76
+ // owns blocks spanning many unrelated concept clusters with a generic essence.
77
+ // For now (small graph) the explicit marker + a low-cohesion heuristic; the
78
+ // heuristic is the extensible part (NOT a hard-coded list of names).
79
+ export function isCatchAllScope(scopeValue, projectRootEssenceByLabel) {
80
+ if (scopeValue === EXPLICIT_CATCH_ALL)
81
+ return true;
82
+ // Structural signal: a project root whose essence advertises "items without a
83
+ // specified project" / "miscellaneous" — read from the root block's own essence,
84
+ // NOT a name list. Extensible: future cohesion metric plugs in here.
85
+ const essence = projectRootEssenceByLabel?.get(scopeValue)?.toLowerCase() ?? "";
86
+ return /without a specified project|miscellaneous|uncategorized|catch-?all|unspecified/.test(essence);
87
+ }
88
+ /**
89
+ * Retrieve the top-k candidate blocks for an arc entity, ranked identity-first.
90
+ *
91
+ * Recall step: union of keywordSearch(canonical_name + primary values) +
92
+ * conceptSearch(concepts). Cross-scope candidates are INCLUDED (the resolver's
93
+ * Q2 needs them). Ranking: Signal 1 (identity) dominates; Signal 2 (scope) is
94
+ * carried as evidence, not a filter; Signal 3 (semantic) is a capped booster.
95
+ */
96
+ export function retrieveGraphSlice(db, entity, opts = {}) {
97
+ const k = opts.k ?? 20;
98
+ // Project-root essences for structural catch-all detection (cheap; small set).
99
+ const rootEssence = new Map();
100
+ for (const b of db.getAllBlocks()) {
101
+ if (b.type === "project")
102
+ rootEssence.set(b.label, b.essence ?? "");
103
+ }
104
+ // ── Recall (FINDING): union keyword + concept candidates ──
105
+ const queryString = [entity.canonical_name.replace(/-/g, " "), ...entity.primary_values].join(" ");
106
+ const kw = db.keywordSearch(queryString, 200);
107
+ const conceptHits = entity.concepts.length
108
+ ? [...db.conceptSearch(entity.concepts).values()].map(v => v.block)
109
+ : [];
110
+ const pool = new Map();
111
+ for (const b of [...kw, ...conceptHits]) {
112
+ if (b && b.id && b.status === "active")
113
+ pool.set(b.id, b);
114
+ }
115
+ const normEntityValues = entity.primary_values.map(normalizePrimaryValue).filter(Boolean);
116
+ // ── Rank ──
117
+ const scored = [];
118
+ for (const block of pool.values()) {
119
+ if (block.type === "project")
120
+ continue; // entities resolve against atomic blocks, not roots
121
+ // Signal 1 — IDENTITY (unique{} primary value)
122
+ let content = {};
123
+ try {
124
+ content = typeof block.content === "string" ? JSON.parse(block.content) : (block.content || {});
125
+ }
126
+ catch {
127
+ content = {};
128
+ }
129
+ const candVal = extractPrimaryValueFromUnique(block.type, content.unique || {});
130
+ const candNorm = normalizePrimaryValue(candVal);
131
+ let identity = 0;
132
+ const whyParts = [];
133
+ if (candNorm) {
134
+ if (normEntityValues.includes(candNorm)) {
135
+ identity = W_IDENTITY_EXACT;
136
+ whyParts.push(`identity:exact(${candNorm.slice(0, 40)})`);
137
+ }
138
+ else {
139
+ const best = Math.max(0, ...normEntityValues.map(v => primaryValueTokenOverlap(v, candNorm)));
140
+ if (best > 0) {
141
+ identity = W_IDENTITY_PARTIAL * best;
142
+ whyParts.push(`identity:partial(${best.toFixed(2)})`);
143
+ }
144
+ }
145
+ }
146
+ // Signal 2 — SCOPE (discrete; carried, not filtered)
147
+ const scopeVal = scopeSegmentOfLabel(block.label);
148
+ const scope = { value: scopeVal, is_catch_all: isCatchAllScope(scopeVal, rootEssence) };
149
+ if (scope.is_catch_all)
150
+ whyParts.push("scope:catch-all");
151
+ // Signal 3 — SEMANTIC (capped booster)
152
+ let semantic = 0;
153
+ if (entity.embedding && opts.embeddingFor) {
154
+ const vec = opts.embeddingFor(block);
155
+ if (vec) {
156
+ semantic = cosineSim(entity.embedding, vec);
157
+ if (semantic > 0.01)
158
+ whyParts.push(`semantic:${semantic.toFixed(2)}`);
159
+ }
160
+ }
161
+ const rank = identity + Math.min(semantic, 1) * W_SEMANTIC_MAX;
162
+ // Keep anything with ANY identity OR a strong semantic hit (recall net).
163
+ if (rank <= 0 && semantic < 0.5)
164
+ continue;
165
+ scored.push({
166
+ block, identity_score: identity, scope, semantic_score: semantic,
167
+ rank_score: rank, why: whyParts.join(" "),
168
+ });
169
+ }
170
+ scored.sort((a, b) => b.rank_score - a.rank_score);
171
+ return scored.slice(0, k);
172
+ }
173
+ //# sourceMappingURL=retrieve-graph-slice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrieve-graph-slice.js","sourceRoot":"","sources":["../../../src/middleware/reflect/retrieve-graph-slice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { WorkspaceDB } from "../../store/database.js";
2
+ export type RelatednessCategory = "dependency" | "containment" | "evolution" | "conflict" | "loose";
3
+ export interface MinBlock {
4
+ id: string;
5
+ label: string;
6
+ type: string;
7
+ project_id: string | null;
8
+ }
9
+ export interface RootEdge {
10
+ source_id: string;
11
+ target_id: string;
12
+ type: string;
13
+ }
14
+ export interface RelatedPair {
15
+ root_a: string;
16
+ root_b: string;
17
+ categories: Partial<Record<RelatednessCategory, number>>;
18
+ total: number;
19
+ /** Label of the root the other sits under (most subordinating edges point here), or null. */
20
+ parent: string | null;
21
+ parent_subordinating_edges: number;
22
+ }
23
+ export interface RootRelatedness {
24
+ pairs: RelatedPair[];
25
+ standalone: string[];
26
+ }
27
+ /** Pure: classify cross-root edges into a meaning-categorized relatedness map. Testable. */
28
+ export declare function classifyRootRelatedness(blocks: MinBlock[], edges: RootEdge[]): RootRelatedness;
29
+ /** DB wrapper: read blocks + active relations, classify. */
30
+ export declare function deriveRootRelatedness(db: WorkspaceDB): RootRelatedness;
31
+ //# sourceMappingURL=root-relatedness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-relatedness.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/root-relatedness.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAS,MAAM,yBAAyB,CAAC;AAElE,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;AAgBpG,MAAM,WAAW,QAAQ;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAAE;AACjG,MAAM,WAAW,QAAQ;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AAEjF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,0BAA0B,EAAE,MAAM,CAAC;CACpC;AACD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,4FAA4F;AAC5F,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,eAAe,CAwC9F;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,WAAW,GAAG,eAAe,CAOtE"}