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,148 @@
1
+ // ═══════════════════════════════════════════════════════════════════════════════
2
+ // COST PRICING — per-pass $$ telemetry support (D, 2026-05-25)
3
+ //
4
+ // Why this exists (system-level WHY before HOW per
5
+ // feedback-systems-thinking-framework 2026-05-25 lesson):
6
+ //
7
+ // PASS2-SPLIT-DESIGN.md §7: "The bet is unfalsifiable without measurement."
8
+ // Without per-pass $$ in the turn log, we can't:
9
+ // (a) verify the split lands in the Comfortable cost tier ($0.05-0.15/turn)
10
+ // (b) detect cost regressions before they reach the Warning tier
11
+ // (c) compare baseline-vs-split honestly when assessing flip readiness
12
+ // (d) attribute cost shifts (Pass 4 cheaper because Pass 2 is cleaner?
13
+ // or Pass 2c expensive because semantic wiring?)
14
+ //
15
+ // This module converts the already-tracked token counts (reflectTokenStats
16
+ // in context.ts) into $$ per pass, written into the turn log per writeTurnLog
17
+ // in pipeline.ts. Together with splitAudit persistence, this closes the
18
+ // §7 measurement loop that the design declared non-negotiable.
19
+ //
20
+ // Universal framing (charter §5):
21
+ // - Keyed by `model_name: string` — works for ANY provider (Anthropic,
22
+ // Google, OpenAI, Mistral, DeepSeek, anything routed via OpenRouter)
23
+ // - Adding a new model = one entry to the table; no schema change
24
+ // - Returns null on unknown model — NEVER fabricates a cost (charter
25
+ // rule 6: guards catch failure, never override success). The turn log
26
+ // surfacing "we don't know what this costs" is the honest signal.
27
+ // - USD only — explicit in field names (`cost_usd`, `input_per_million`).
28
+ // Not aspirational about EUR/etc.
29
+ //
30
+ // Pricing source (point-in-time, verify against current provider docs):
31
+ // - Anthropic: https://www.anthropic.com/pricing (Haiku 4.5, Sonnet 4.6, Opus 4.7)
32
+ // - Google: https://ai.google.dev/pricing (Gemini 2.5 Flash, Pro)
33
+ // - OpenRouter dashboard: https://openrouter.ai/models (cross-provider rates)
34
+ // COST_PRICING_VERSION below is the safety valve — future agent should
35
+ // bump it when re-verifying rates.
36
+ //
37
+ // What this module does NOT do:
38
+ // - Per-attempt cost (escalations on truncation are billed at the model
39
+ // that ran). Today we use the FINAL successful model. Per-attempt
40
+ // fidelity is a follow-up if/when retry-cost-attribution becomes a
41
+ // validation question.
42
+ // - Reconcile with OpenRouter dashboard automatically — §7 wants ±10%
43
+ // reconciliation, that's a manual check until a separate tool exists.
44
+ // - Live-fetch rates — that would be a runtime dependency on an external
45
+ // API. Static table + version is the right tradeoff for now.
46
+ // ═══════════════════════════════════════════════════════════════════════════════
47
+ /**
48
+ * Bumped whenever the PRICING table below is re-verified against provider
49
+ * docs / OpenRouter dashboard. Surfaced in the turn log so a future agent
50
+ * (or future me) reading old turn logs can tell if the cost figures used
51
+ * stale rates.
52
+ */
53
+ export const COST_PRICING_VERSION = "2026-06-22";
54
+ /**
55
+ * Pricing table — model name string → per-million-token rates in USD.
56
+ *
57
+ * Add a new model = one entry. The key is the model name as it appears in
58
+ * provider.getName() / GenerateResult.model — these are the strings the
59
+ * pipeline already stamps into the turn log providers[] field. Stay
60
+ * verbatim to what providers emit so lookups are direct.
61
+ *
62
+ * Rates as of 2026-05-25. If you bump these, bump COST_PRICING_VERSION too
63
+ * so old turn-log readers can detect rate drift.
64
+ */
65
+ export const PRICING = {
66
+ // ── Google Gemini (currently the primary pipeline model) ────────────────────
67
+ "google/gemini-2.5-flash": { input_per_million: 0.30, output_per_million: 2.50 },
68
+ "google/gemini-2.5-pro": { input_per_million: 1.25, output_per_million: 10.00 },
69
+ "gemini-2.5-flash": { input_per_million: 0.30, output_per_million: 2.50 },
70
+ "gemini-2.5-pro": { input_per_million: 1.25, output_per_million: 10.00 },
71
+ // ── Anthropic (target for multi-model routing per PASS2-SPLIT-DESIGN.md §7) ─
72
+ // Haiku for 2a/2b (structural); Sonnet/Opus for harder semantic work if needed.
73
+ // Both bare-name (direct Anthropic API) and "anthropic/" prefixed (OpenRouter
74
+ // routing) forms — these are the same models, the provider emits different
75
+ // model strings depending on the path. Multi-model routing in the orchestrator
76
+ // (NODEDEX_PASS2A_MODEL etc.) generally uses OpenRouter-prefix form because
77
+ // the production agent already routes via OpenRouter (see project-chat-proxy-built).
78
+ "claude-haiku-4-5-20251001": { input_per_million: 1.00, output_per_million: 5.00 },
79
+ "claude-haiku-4-5": { input_per_million: 1.00, output_per_million: 5.00 },
80
+ "claude-sonnet-4-6": { input_per_million: 3.00, output_per_million: 15.00 },
81
+ "claude-opus-4-7": { input_per_million: 15.00, output_per_million: 75.00 },
82
+ "anthropic/claude-haiku-4-5": { input_per_million: 1.00, output_per_million: 5.00 },
83
+ "anthropic/claude-haiku-4.5": { input_per_million: 1.00, output_per_million: 5.00 },
84
+ "anthropic/claude-sonnet-4-6": { input_per_million: 3.00, output_per_million: 15.00 },
85
+ "anthropic/claude-sonnet-4.6": { input_per_million: 3.00, output_per_million: 15.00 },
86
+ "anthropic/claude-opus-4-7": { input_per_million: 15.00, output_per_million: 75.00 },
87
+ "anthropic/claude-opus-4.7": { input_per_million: 15.00, output_per_million: 75.00 },
88
+ // ── Onboarding's recommended PAID option (so the cost panel doesn't show "?"
89
+ // for a model a normal user is told to pick). Free models → FREE_MODELS below.
90
+ "openai/gpt-4o-mini": { input_per_million: 0.15, output_per_million: 0.60 },
91
+ "gpt-4o-mini": { input_per_million: 0.15, output_per_million: 0.60 },
92
+ };
93
+ /**
94
+ * Genuinely-FREE models ($0 at the provider). Kept OUT of PRICING — whose entries must be
95
+ * paid/non-zero (the "no accidental $0 lines" guard) — so a real free model is recognized as a
96
+ * known $0 rather than an "unknown model" (which would render as "?" in the cost panel). owl-alpha
97
+ * (the onboarding free option) is the case this fixes. Both OpenRouter-slug and bare forms.
98
+ */
99
+ export const FREE_MODELS = new Set([
100
+ "openrouter/owl-alpha",
101
+ "owl-alpha",
102
+ ]);
103
+ /**
104
+ * Compute USD cost for a token-usage record under the given model's rates.
105
+ *
106
+ * Returns `null` if the model is unknown to the pricing table. This is
107
+ * deliberate — fabricating a cost would mislead the validation work the
108
+ * design relies on. Logs once per unknown model so the gap is auditable.
109
+ *
110
+ * Returns 0 (not null) on empty usage with a known model — distinguishes
111
+ * "didn't run" (0) from "ran but we don't know what it cost" (null).
112
+ */
113
+ const _warnedModels = new Set();
114
+ export function computeCost(usage, model) {
115
+ if (!model) {
116
+ if (!_warnedModels.has("(undefined)")) {
117
+ _warnedModels.add("(undefined)");
118
+ console.warn("cost-pricing: computeCost called with undefined model — returning null");
119
+ }
120
+ return null;
121
+ }
122
+ if (FREE_MODELS.has(model))
123
+ return 0; // genuinely free → a KNOWN $0, not "unknown model" ("?")
124
+ const rate = PRICING[model];
125
+ if (!rate) {
126
+ if (!_warnedModels.has(model)) {
127
+ _warnedModels.add(model);
128
+ console.warn(`cost-pricing: no pricing entry for model "${model}" — returning null (add to PRICING table)`);
129
+ }
130
+ return null;
131
+ }
132
+ const input = usage?.input ?? 0;
133
+ const output = usage?.output ?? 0;
134
+ const thinking = usage?.thinking ?? 0;
135
+ // Thinking billed as output unless the provider specifies otherwise.
136
+ const thinkingRate = rate.thinking_per_million ?? rate.output_per_million;
137
+ const cost = (input / 1_000_000) * rate.input_per_million +
138
+ (output / 1_000_000) * rate.output_per_million +
139
+ (thinking / 1_000_000) * thinkingRate;
140
+ return cost;
141
+ }
142
+ /**
143
+ * Reset the warn-once memo. Useful for tests; not used in production code.
144
+ */
145
+ export function _resetWarnings() {
146
+ _warnedModels.clear();
147
+ }
148
+ //# sourceMappingURL=cost-pricing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-pricing.js","sourceRoot":"","sources":["../../../src/middleware/reflect/cost-pricing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { Pass2Item } from "./types.js";
2
+ import type { LLMProvider } from "../../engine/ai-provider.js";
3
+ export declare function crossGroupLinkEnabled(): boolean;
4
+ /** Orphan-aware linking (default OFF, NODEDEX_V2_CROSSLINK_ORPHAN_AWARE): mark the blocks
5
+ * that have no link yet (⚠ UNLINKED) in the linker's input so it targets those gaps
6
+ * instead of re-deriving blindly — the recall fix for the residual islands. Empirical
7
+ * (could it over-link a genuinely-standalone block?), so opt-in + A/B-able. Off → the
8
+ * linker input is byte-identical to before. */
9
+ export declare function orphanAwareLinkEnabled(): boolean;
10
+ export interface CrossGroupLink {
11
+ from: string;
12
+ to: string;
13
+ type: string;
14
+ reasoning?: string;
15
+ }
16
+ export declare const CROSS_GROUP_LINK_PROMPT = "You are given knowledge blocks from ONE work session, already grouped into THREADS,\nwith each thread's INTERNAL links already drawn. Your only job: add the links that\ncross BETWEEN threads \u2014 where a block in one thread stands in a real relationship to\na block in another. The same kinds of relationships that hold within a thread hold\nacross them.\n\nDecide by reasoning about MEANING \u2014 what actually relates to what across the\nthreads, whether or not any connecting word is present.\n\nEach link is {from, to, type}, where \"from\" holds the relationship. Use the block\nids EXACTLY as given. Choose the type whose MEANING matches:\n prompted_by \u00B7 based_on \u00B7 extends \u00B7 supersedes \u00B7 resolves \u00B7 supports \u00B7\n contradicts \u00B7 related_to \u00B7 derived_from \u00B7 affects\nReach for the SHARPEST relation the meaning supports; related_to and affects are a\nlast resort. The link type MUST be exactly one of these ten.\n\nLook especially for the connections that orphan a block otherwise \u2014 these are easy to\nmiss across threads, for ANY block type: a block in one thread that REPLACED\n(supersedes) an earlier approach, value, or state in another, or that was TRIGGERED BY\n(prompted_by) an event or failure in another \u2014 not only where one thread's block is\nEVIDENCE for another's. A superseded or triggering block left unlinked is the gap to close.\n\nBlocks the input marks \u26A0 UNLINKED have NO link at all yet \u2014 they are the ones most\nlikely to be wrongly orphaned. Give each marked block a deliberate pass: find its\ncross-thread connection (what caused it, what it depends on, what it replaced or\nanswers), or judge it genuinely standalone.\n\nAdd ONLY links whose two blocks are in DIFFERENT threads \u2014 do NOT re-draw links\nwithin a thread, those are already present. Do NOT invent blocks or ids. If no\ngenuine cross-thread relationship exists, return an empty list.";
17
+ /** Block ids that currently have NO link at all — no outgoing causal ref AND no in-set
18
+ * block points at them. These are the islands the cross-group pass should target: the
19
+ * linker sees every block but, without this, can't tell which are already connected, so
20
+ * it re-derives blindly and misses a few. Considers the within-thread links already on
21
+ * the items (based_on/triggered_by/extends/supersedes/resolves/relations). Refs to
22
+ * out-of-set labels (existing-graph) count as "connected". Pure / testable. */
23
+ export declare function unlinkedIds(items: Pass2Item[]): Set<string>;
24
+ /** Render the blocks grouped by thread, each as `id [type] essence`, so the model sees
25
+ * the cluster structure and references blocks by their exact id. Islands (no link yet)
26
+ * are marked ⚠ UNLINKED so the linker prioritises closing those gaps. */
27
+ export declare function buildCrossGroupLinkInput(items: Pass2Item[], groupByItemId: Record<string, string>): string;
28
+ export interface CrossGroupLinkCallResult {
29
+ links: CrossGroupLink[] | null;
30
+ rateLimited: boolean;
31
+ usage?: {
32
+ input: number;
33
+ thinking: number;
34
+ output: number;
35
+ };
36
+ }
37
+ export declare function callCrossGroupLinkLLM(provider: LLMProvider, items: Pass2Item[], groupByItemId: Record<string, string>, thinkingBudget?: number): Promise<CrossGroupLinkCallResult>;
38
+ /**
39
+ * Apply cross-group links onto the items' causal fields (via the shared
40
+ * applyLinkToPass2Item). Pure-ish: MUTATES the matched items. Every guard a
41
+ * cross-thread link must pass: both ids resolve, not a self-link, the two blocks
42
+ * are in DIFFERENT groups (within-thread links already exist), and the type is one
43
+ * of the ten relations. Anything failing a guard is skipped (never throws).
44
+ */
45
+ export declare function applyCrossGroupLinks(items: Pass2Item[], links: CrossGroupLink[], groupByItemId: Record<string, string>): {
46
+ added: number;
47
+ skipped: number;
48
+ };
49
+ export interface CrossGroupLinkResult {
50
+ items: Pass2Item[];
51
+ added: number;
52
+ skipped: number;
53
+ llm_calls: number;
54
+ }
55
+ /**
56
+ * Run the cross-group linker over the converted items. Default OFF → passthrough.
57
+ * No-op when there are <2 threads (nothing can be cross-group). One bounded LLM
58
+ * call; never blocks the pipeline (any failure → 0 links added).
59
+ */
60
+ export declare function runCrossGroupLink(provider: LLMProvider, items: Pass2Item[], groupByItemId: Record<string, string>): Promise<CrossGroupLinkResult>;
61
+ //# sourceMappingURL=cross-group-link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-group-link.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/cross-group-link.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D,wBAAgB,qBAAqB,IAAI,OAAO,CAG/C;AAED;;;;gDAIgD;AAChD,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,uBAAuB,+5DA6B4B,CAAC;AAsBjE;;;;;gFAKgF;AAChF,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAsB3D;AAED;;0EAE0E;AAC1E,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,EAAE,EAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,MAAM,CAqBR;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,SAAS,EAAE,EAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,cAAc,SAAO,GACpB,OAAO,CAAC,wBAAwB,CAAC,CAOnC;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAAE,EAClB,KAAK,EAAE,cAAc,EAAE,EACvB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAapC;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,SAAS,EAAE,EAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC,oBAAoB,CAAC,CAc/B"}
@@ -0,0 +1,212 @@
1
+ // ═══════════════════════════════════════════════════════════════════════════════
2
+ // PIPELINE v2 — CROSS-GROUP LINKER (the INTEGRATE cross-thread step; design §15.4)
3
+ // ═══════════════════════════════════════════════════════════════════════════════
4
+ //
5
+ // Per-group PRODUCE wires links only WITHIN each thread (it never sees the other
6
+ // threads' blocks). This step runs AFTER all blocks exist (post-convert) and adds
7
+ // the sparse links that cross BETWEEN threads — e.g. a decision in one cluster
8
+ // grounded in a fact established in another. One bounded LLM call over the block
9
+ // essences (output is just links → can't run away).
10
+ //
11
+ // MEANING-FIRST / GATE-5 (no new vocabulary):
12
+ // - relation types = the SAME 10 (COMPREHEND_LINK_RELS).
13
+ // - fields targeted = the SAME Pass2Item causal fields, via the SHARED
14
+ // applyLinkToPass2Item helper (comprehend.ts) — the converter and this linker
15
+ // never drift on which field a relation lands in.
16
+ // - block identity = the qualified item.id ({group}::{local}); no new id scheme.
17
+ //
18
+ // SCOPE: this builds CROSS-THREAD LINKING only. Cross-thread DEDUP (the duplicate
19
+ // blocks two PRODUCE calls extract from shared transcript) is a separate concern
20
+ // served by the existing block-dedup layer (dedupBySourceAndValue / stage-audit
21
+ // block_dup), not re-implemented here.
22
+ //
23
+ // Default OFF: NODEDEX_V2_CROSSLINK=1 (only meaningful under v2). When off → pure
24
+ // passthrough (no LLM). Reuse-not-rewrite: this IS the §15.4 INTEGRATE linker, now
25
+ // concretely targeted (the roaster↔dark-roast cross-thread edges Run 10/11 missed).
26
+ import { getThinkingBudget } from "./config.js";
27
+ import { COMPREHEND_LINK_RELS, applyLinkToPass2Item, comprehendModel } from "./comprehend.js";
28
+ export function crossGroupLinkEnabled() {
29
+ // DEFAULT ON since 2026-06-12 (part of the validated v2 stack). =0 opts out.
30
+ return process.env.NODEDEX_V2_CROSSLINK !== "0";
31
+ }
32
+ /** Orphan-aware linking (default OFF, NODEDEX_V2_CROSSLINK_ORPHAN_AWARE): mark the blocks
33
+ * that have no link yet (⚠ UNLINKED) in the linker's input so it targets those gaps
34
+ * instead of re-deriving blindly — the recall fix for the residual islands. Empirical
35
+ * (could it over-link a genuinely-standalone block?), so opt-in + A/B-able. Off → the
36
+ * linker input is byte-identical to before. */
37
+ export function orphanAwareLinkEnabled() {
38
+ return process.env.NODEDEX_V2_CROSSLINK_ORPHAN_AWARE === "1";
39
+ }
40
+ export const CROSS_GROUP_LINK_PROMPT = `You are given knowledge blocks from ONE work session, already grouped into THREADS,
41
+ with each thread's INTERNAL links already drawn. Your only job: add the links that
42
+ cross BETWEEN threads — where a block in one thread stands in a real relationship to
43
+ a block in another. The same kinds of relationships that hold within a thread hold
44
+ across them.
45
+
46
+ Decide by reasoning about MEANING — what actually relates to what across the
47
+ threads, whether or not any connecting word is present.
48
+
49
+ Each link is {from, to, type}, where "from" holds the relationship. Use the block
50
+ ids EXACTLY as given. Choose the type whose MEANING matches:
51
+ prompted_by · based_on · extends · supersedes · resolves · supports ·
52
+ contradicts · related_to · derived_from · affects
53
+ Reach for the SHARPEST relation the meaning supports; related_to and affects are a
54
+ last resort. The link type MUST be exactly one of these ten.
55
+
56
+ Look especially for the connections that orphan a block otherwise — these are easy to
57
+ miss across threads, for ANY block type: a block in one thread that REPLACED
58
+ (supersedes) an earlier approach, value, or state in another, or that was TRIGGERED BY
59
+ (prompted_by) an event or failure in another — not only where one thread's block is
60
+ EVIDENCE for another's. A superseded or triggering block left unlinked is the gap to close.
61
+
62
+ Blocks the input marks ⚠ UNLINKED have NO link at all yet — they are the ones most
63
+ likely to be wrongly orphaned. Give each marked block a deliberate pass: find its
64
+ cross-thread connection (what caused it, what it depends on, what it replaced or
65
+ answers), or judge it genuinely standalone.
66
+
67
+ Add ONLY links whose two blocks are in DIFFERENT threads — do NOT re-draw links
68
+ within a thread, those are already present. Do NOT invent blocks or ids. If no
69
+ genuine cross-thread relationship exists, return an empty list.`;
70
+ const CROSS_GROUP_LINK_SCHEMA = {
71
+ type: "object",
72
+ properties: {
73
+ links: {
74
+ type: "array",
75
+ items: {
76
+ type: "object",
77
+ properties: {
78
+ from: { type: "string" },
79
+ to: { type: "string" },
80
+ type: { type: "string" },
81
+ reasoning: { type: "string" },
82
+ },
83
+ required: ["from", "to", "type"],
84
+ },
85
+ },
86
+ },
87
+ required: ["links"],
88
+ };
89
+ /** Block ids that currently have NO link at all — no outgoing causal ref AND no in-set
90
+ * block points at them. These are the islands the cross-group pass should target: the
91
+ * linker sees every block but, without this, can't tell which are already connected, so
92
+ * it re-derives blindly and misses a few. Considers the within-thread links already on
93
+ * the items (based_on/triggered_by/extends/supersedes/resolves/relations). Refs to
94
+ * out-of-set labels (existing-graph) count as "connected". Pure / testable. */
95
+ export function unlinkedIds(items) {
96
+ const idSet = new Set(items.map((it) => it.id));
97
+ const hasOut = new Set(); // blocks with >=1 outgoing causal ref
98
+ const isTarget = new Set(); // in-set blocks something points at
99
+ for (const it of items) {
100
+ const refs = [
101
+ ...(it.based_on_items ?? []),
102
+ ...(it.triggered_by_items ?? []),
103
+ it.extends_item,
104
+ it.supersedes_ref,
105
+ it.resolved_ref,
106
+ ...((it.relations ?? []).map((r) => r?.target)),
107
+ ];
108
+ for (const r of refs) {
109
+ if (!r)
110
+ continue;
111
+ hasOut.add(it.id);
112
+ if (idSet.has(r))
113
+ isTarget.add(r);
114
+ }
115
+ }
116
+ const out = new Set();
117
+ for (const it of items)
118
+ if (!hasOut.has(it.id) && !isTarget.has(it.id))
119
+ out.add(it.id);
120
+ return out;
121
+ }
122
+ /** Render the blocks grouped by thread, each as `id [type] essence`, so the model sees
123
+ * the cluster structure and references blocks by their exact id. Islands (no link yet)
124
+ * are marked ⚠ UNLINKED so the linker prioritises closing those gaps. */
125
+ export function buildCrossGroupLinkInput(items, groupByItemId) {
126
+ const islands = orphanAwareLinkEnabled() ? unlinkedIds(items) : new Set();
127
+ const byGroup = new Map();
128
+ for (const it of items) {
129
+ const g = groupByItemId[it.id] ?? "?";
130
+ let arr = byGroup.get(g);
131
+ if (!arr) {
132
+ arr = [];
133
+ byGroup.set(g, arr);
134
+ }
135
+ arr.push(it);
136
+ }
137
+ const parts = [];
138
+ for (const [g, its] of byGroup) {
139
+ parts.push(`[thread: ${g}]`);
140
+ for (const it of its) {
141
+ const mark = islands.has(it.id) ? " ⚠ UNLINKED" : "";
142
+ parts.push(` - ${it.id} [${it.type}]${mark} ${(it.text ?? "").replace(/\s+/g, " ").slice(0, 140)}`);
143
+ }
144
+ }
145
+ const islandNote = islands.size > 0
146
+ ? `\n\n${islands.size} block(s) are marked ⚠ UNLINKED — give each a deliberate pass (see prompt).`
147
+ : "";
148
+ return `THREADS (each block's within-thread links are already drawn; add ONLY links BETWEEN threads):\n\n${parts.join("\n")}${islandNote}`;
149
+ }
150
+ export async function callCrossGroupLinkLLM(provider, items, groupByItemId, thinkingBudget = 2048) {
151
+ const userInput = buildCrossGroupLinkInput(items, groupByItemId);
152
+ const r = await provider.generateStructured(CROSS_GROUP_LINK_PROMPT, userInput, CROSS_GROUP_LINK_SCHEMA, { thinkingBudget: getThinkingBudget(thinkingBudget), maxOutputTokens: 4096, modelOverride: comprehendModel() });
153
+ return { links: r.result?.links ?? null, rateLimited: r.rateLimited, usage: r.usage };
154
+ }
155
+ /**
156
+ * Apply cross-group links onto the items' causal fields (via the shared
157
+ * applyLinkToPass2Item). Pure-ish: MUTATES the matched items. Every guard a
158
+ * cross-thread link must pass: both ids resolve, not a self-link, the two blocks
159
+ * are in DIFFERENT groups (within-thread links already exist), and the type is one
160
+ * of the ten relations. Anything failing a guard is skipped (never throws).
161
+ */
162
+ export function applyCrossGroupLinks(items, links, groupByItemId) {
163
+ const byId = new Map(items.map((it) => [it.id, it]));
164
+ let added = 0, skipped = 0;
165
+ for (const link of links ?? []) {
166
+ const from = byId.get(link?.from);
167
+ if (!from || !byId.has(link?.to)) {
168
+ skipped++;
169
+ continue;
170
+ } // unknown id
171
+ if (link.from === link.to) {
172
+ skipped++;
173
+ continue;
174
+ } // self-link
175
+ if (groupByItemId[link.from] === groupByItemId[link.to]) {
176
+ skipped++;
177
+ continue;
178
+ } // SAME thread → not cross-group
179
+ if (!COMPREHEND_LINK_RELS.has(link.type)) {
180
+ skipped++;
181
+ continue;
182
+ } // unknown relation type
183
+ applyLinkToPass2Item(from, link.type, link.to, link.reasoning);
184
+ added++;
185
+ }
186
+ return { added, skipped };
187
+ }
188
+ /**
189
+ * Run the cross-group linker over the converted items. Default OFF → passthrough.
190
+ * No-op when there are <2 threads (nothing can be cross-group). One bounded LLM
191
+ * call; never blocks the pipeline (any failure → 0 links added).
192
+ */
193
+ export async function runCrossGroupLink(provider, items, groupByItemId) {
194
+ if (!crossGroupLinkEnabled())
195
+ return { items, added: 0, skipped: 0, llm_calls: 0 };
196
+ const groupCount = new Set(Object.values(groupByItemId)).size;
197
+ if (groupCount < 2 || items.length < 2)
198
+ return { items, added: 0, skipped: 0, llm_calls: 0 };
199
+ try {
200
+ const r = await callCrossGroupLinkLLM(provider, items, groupByItemId);
201
+ if (!r.links)
202
+ return { items, added: 0, skipped: 0, llm_calls: 1 };
203
+ const { added, skipped } = applyCrossGroupLinks(items, r.links, groupByItemId);
204
+ console.log(`[cross-group-link] added ${added} cross-thread link(s), skipped ${skipped} — 1 LLM call`);
205
+ return { items, added, skipped, llm_calls: 1 };
206
+ }
207
+ catch (e) {
208
+ console.warn(`[cross-group-link] threw (${e?.message ?? e}) — 0 links added`);
209
+ return { items, added: 0, skipped: 0, llm_calls: 1 };
210
+ }
211
+ }
212
+ //# sourceMappingURL=cross-group-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-group-link.js","sourceRoot":"","sources":["../../../src/middleware/reflect/cross-group-link.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import type { Pass2Item } from "./types.js";
2
+ /**
3
+ * Core extractor: given a block TYPE + its unique{} object, return the canonical
4
+ * "what is this block" primary value. The identity-bearing field per type
5
+ * (per [[feedback-identity-is-unique-not-label]] — identity is unique{} content,
6
+ * NOT label/essence). Returns "" when no primary value found.
7
+ *
8
+ * Exported so OTHER producers that hold a (type, unique) pair rather than a
9
+ * Pass2Item — e.g. Stage AUDIT's scope_disagreement detector, which works off
10
+ * persisted Block rows — extract the SAME identity value (Rule 5: one notion of
11
+ * "block identity value," one implementation).
12
+ */
13
+ export declare function extractPrimaryValueFromUnique(type: string, unique: Record<string, unknown>): string;
14
+ /**
15
+ * Extract the canonical primary value for a Pass2Item, used as the second
16
+ * tuple element in dedup. Returns "" when no primary value found (the item
17
+ * then dedups only on source_excerpt, which is conservative).
18
+ */
19
+ export declare function extractPrimaryValue(item: Pass2Item): string;
20
+ export interface DedupResult {
21
+ /**
22
+ * Items list returned to the caller. Sub-step 1.4 semantics: kept ALWAYS
23
+ * equals input items (no drop). Pre-1.4 this auto-dropped duplicates;
24
+ * post-1.4 the caller writes pipeline_flags rows for an async LLM
25
+ * reviewer (Slice 2) to decide merge/leave/split with full graph context.
26
+ *
27
+ * Until Slice 2 lands, the graph may accumulate duplicate atomic blocks.
28
+ * That's the trade-off versus auto-drop, which violated the flag-not-merge
29
+ * principle the user established in PIPELINE-AUDIT-DEPENDENCY-MAP.md §2.
30
+ */
31
+ kept: Pass2Item[];
32
+ /**
33
+ * Duplicate-candidate pairs detected. The caller (pipeline.ts) resolves
34
+ * these item_ids to block_ids after Pass 3 createBlock loop, then calls
35
+ * writePipelineFlag with flag_type='atomic_dup_candidate'.
36
+ */
37
+ duplicates: Array<{
38
+ id: string;
39
+ duplicate_of: string;
40
+ key: string;
41
+ }>;
42
+ }
43
+ /**
44
+ * Detect candidate duplicate items by (source_excerpt, primary_value).
45
+ *
46
+ * Sub-step 1.4 change: this function NO LONGER drops items. Returns input
47
+ * unchanged + the duplicate-pair list. See DedupResult.kept comment for
48
+ * full rationale.
49
+ *
50
+ * RULES (unchanged from prior behavior):
51
+ * - Two items are duplicate-CANDIDATES iff:
52
+ * a) Both have non-empty excerpt AND
53
+ * b) Both have non-empty primary value AND
54
+ * c) Both tuples match exactly (case-sensitive — Pass 1 deterministically
55
+ * extracts from transcript, so case should be stable)
56
+ * - First occurrence is the "winner" for FK target purposes in the flag.
57
+ * - NULL/empty excerpt items NEVER detected (treated as pre-Debt-5 atomic —
58
+ * can't determine sameness without source pin).
59
+ * - Empty primary value items NEVER detected (defensive — risk false-positive
60
+ * on unrelated items that happen to share a source line).
61
+ *
62
+ * Returns:
63
+ * - kept: ALL input items (never drops; same array reference)
64
+ * - duplicates: list of {id, duplicate_of, key} for downstream flag writing
65
+ *
66
+ * Function name preserved (dedupBySourceAndValue) for backward compat with
67
+ * callers, but semantics flipped from "dedup" to "detect duplicates."
68
+ */
69
+ export declare function dedupBySourceAndValue(items: Pass2Item[]): DedupResult;
70
+ //# sourceMappingURL=dedup-by-source-and-value.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup-by-source-and-value.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/dedup-by-source-and-value.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA+B5C;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAeR;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE3D;AAID,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;OASG;IACH,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB;;;;OAIG;IACH,UAAU,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,WAAW,CAqBrE"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dedup-by-source-and-value.js","sourceRoot":"","sources":["../../../src/middleware/reflect/dedup-by-source-and-value.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { WorkspaceDB, Block } from "../../store/database.js";
2
+ import type { LLMProvider } from "../../engine/ai-provider.js";
3
+ export interface RootDescribeInput {
4
+ root: Block;
5
+ memberCount: number;
6
+ /** content.last_described_member_count; null = never described. */
7
+ lastDescribedCount: number | null;
8
+ }
9
+ /** Returns the reason a root needs (re)describing, or false. Pure. */
10
+ export declare function rootNeedsDescription(inp: {
11
+ memberCount: number;
12
+ lastDescribedCount: number | null;
13
+ }, opts: {
14
+ minMembers: number;
15
+ growthThreshold: number;
16
+ }): false | "never" | "grew";
17
+ export declare function selectRootsNeedingDescription(inputs: RootDescribeInput[], opts: {
18
+ minMembers: number;
19
+ growthThreshold: number;
20
+ }): Array<RootDescribeInput & {
21
+ reason: "never" | "grew";
22
+ }>;
23
+ export declare const DESCRIBE_ROOT_PROMPT = "You are writing a one-line SURFACE description of a project root in a knowledge graph.\nIts ONLY job: let a later step decide \"does a new piece of knowledge belong in THIS project?\"\n\nCapture TWO things in one line:\n 1. DOMAIN \u2014 what this project is about (the topic).\n 2. OWNER / SCOPE \u2014 whose it is (a client/customer name, a system name, or \"personal\")\n IF the members reveal one. Omit only if genuinely unknown.\n\nRULES:\n - SIGNPOST, not table-of-contents. Do NOT list the individual members/decisions/facts.\n - Surface only. ONE line, <= 140 characters.\n - Base it ONLY on the MEMBERS shown. Never invent a domain or owner the members don't evidence.\n - Plain language. No label syntax, no underscores.";
24
+ export declare function buildDescribeInput(root: Block, members: Block[], cap: number): string;
25
+ export declare function describeRoot(provider: LLMProvider, root: Block, members: Block[]): Promise<{
26
+ description: string | null;
27
+ rateLimited: boolean;
28
+ usage?: {
29
+ input?: number;
30
+ thinking?: number;
31
+ output?: number;
32
+ };
33
+ }>;
34
+ export interface DescriberTickResult {
35
+ roots_total: number;
36
+ roots_needing: number;
37
+ described: number;
38
+ llm_calls: number;
39
+ rate_limited: number;
40
+ errors: number;
41
+ wall_ms: number;
42
+ }
43
+ /**
44
+ * One describer tick: find roots needing a (re)description, describe up to
45
+ * `limit` of them, write essence + the lazy marker. Async (LLM). Bounded.
46
+ */
47
+ export declare function runDescriberTick(opts: {
48
+ db: WorkspaceDB;
49
+ provider: LLMProvider;
50
+ limit?: number;
51
+ }): Promise<DescriberTickResult>;
52
+ /** Start the describer timer. Idempotent; returns true if started. Default OFF. */
53
+ export declare function startDescriberTimer(db: WorkspaceDB): boolean;
54
+ /** Stop the describer timer. Used on shutdown + by tests. */
55
+ export declare function stopDescriberTimer(): void;
56
+ /** For tests only — reports whether the timer is currently running. */
57
+ export declare function _isDescriberTimerRunningForTests(): boolean;
58
+ //# sourceMappingURL=describe-roots.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-roots.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/describe-roots.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AA4B/D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,KAAK,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,sEAAsE;AACtE,wBAAgB,oBAAoB,CAClC,GAAG,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC/D,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GACpD,KAAK,GAAG,OAAO,GAAG,MAAM,CAK1B;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,iBAAiB,EAAE,EAC3B,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GACpD,KAAK,CAAC,iBAAiB,GAAG;IAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE,CAAC,CAOzD;AAID,eAAO,MAAM,oBAAoB,yuBAYoB,CAAC;AAQtD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAerF;AAID,wBAAsB,YAAY,CAChC,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,KAAK,EAAE,GACf,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAc/H;AAID,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,EAAE,EAAE,WAAW,CAAC;IAChB,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgF/B;AAwCD,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAa5D;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC;AAED,uEAAuE;AACvE,wBAAgB,gCAAgC,IAAI,OAAO,CAE1D"}