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,619 @@
1
+ import { cosineSim } from "../../engine/vector-math.js";
2
+ import { CONFIG } from "./config.js";
3
+ // ─── Token usage accumulator ──────────────────────────────────────────────────
4
+ // Slots cover: original monolith passes (pass0-pass4) + the Pass 2 split
5
+ // sub-passes (pass2a/b/c, populated only when NODEDEX_PASS2_SPLIT=1).
6
+ // When the flag is OFF, the split slots stay at 0; when ON, the monolith
7
+ // `pass2` slot stays at 0 and the sub-pass slots accumulate. This lets the
8
+ // turn log surface BOTH paths' usage independently without ambiguity.
9
+ //
10
+ // Per PASS2-SPLIT-DESIGN.md §7, this is the substrate for per-pass cost
11
+ // telemetry. Token counts are tracked here; $$ cost is derived elsewhere
12
+ // (provider-specific pricing). All 10 slots (0/1/judge/2/2a/2b/2c/3/4/5) are
13
+ // now present (debt-4 §3 uniform observability — pass5 slot added 2026-05-29).
14
+ // Pre-fix, pass5 token counts were mis-attributed into reflectTokenStats.pass4
15
+ // (see pass5.ts comment "lightweight, no separate counter needed" — empirically
16
+ // FALSE: pass5 wall_ms is ~5-12s and it bills thinking_budget=512). Inflated
17
+ // pass4 cost, hid pass5 from cost_breakdown → confabulated total_usd.
18
+ export const reflectTokenStats = {
19
+ pass0: { input: 0, thinking: 0, output: 0, calls: 0 },
20
+ pass1: { input: 0, thinking: 0, output: 0, calls: 0 },
21
+ pass_judge: { input: 0, thinking: 0, output: 0, calls: 0 },
22
+ pass2: { input: 0, thinking: 0, output: 0, calls: 0 },
23
+ pass2a: { input: 0, thinking: 0, output: 0, calls: 0 },
24
+ pass2b: { input: 0, thinking: 0, output: 0, calls: 0 },
25
+ pass2c: { input: 0, thinking: 0, output: 0, calls: 0 },
26
+ pass3: { input: 0, thinking: 0, output: 0, calls: 0 },
27
+ pass4: { input: 0, thinking: 0, output: 0, calls: 0 },
28
+ pass5: { input: 0, thinking: 0, output: 0, calls: 0 },
29
+ // DEBT 5 Slice 1 Sub-step 1.2 — Stage C (arc entity resolve) runs once per
30
+ // arc trigger BEFORE Pass 2-5. Its own telemetry slot avoids the cost-mis-
31
+ // attribution pattern the pass5 fix addressed (commit 742f50d). Empty in
32
+ // non-arc runs + when arc-entity-resolve fails before LLM call.
33
+ pass_c_resolve: { input: 0, thinking: 0, output: 0, calls: 0 },
34
+ // DEBT 5 Slice 3 (Stage D) — cross-graph resolve runs once per arc trigger
35
+ // AFTER Stage C, BEFORE Pass 3. Own slot (same rationale as pass_c_resolve:
36
+ // avoid cost mis-attribution). Empty in non-arc runs + when Stage D resolves
37
+ // everything via the code-exact path (no LLM call).
38
+ pass_d_resolve: { input: 0, thinking: 0, output: 0, calls: 0 },
39
+ // DEBT 5 Slice 2 Sub-step 2.2 — async flag-reviewer runs OUTSIDE the
40
+ // per-pipeline trigger (its own setInterval worker, env-gated). Cost is
41
+ // billed to its own slot so per-pipeline cost_breakdown stays honest about
42
+ // just-that-pipeline-run's spend. Reviewer cost is an ENRICHMENT-CYCLE
43
+ // cost — different temporal grain than pipeline cost. Surfaced separately
44
+ // via per-tick log + (future) /api/flags/cost endpoint.
45
+ pass_reviewer: { input: 0, thinking: 0, output: 0, calls: 0 },
46
+ reset() {
47
+ this.pass0 = { input: 0, thinking: 0, output: 0, calls: 0 };
48
+ this.pass1 = { input: 0, thinking: 0, output: 0, calls: 0 };
49
+ this.pass_judge = { input: 0, thinking: 0, output: 0, calls: 0 };
50
+ this.pass2 = { input: 0, thinking: 0, output: 0, calls: 0 };
51
+ this.pass2a = { input: 0, thinking: 0, output: 0, calls: 0 };
52
+ this.pass2b = { input: 0, thinking: 0, output: 0, calls: 0 };
53
+ this.pass2c = { input: 0, thinking: 0, output: 0, calls: 0 };
54
+ this.pass3 = { input: 0, thinking: 0, output: 0, calls: 0 };
55
+ this.pass4 = { input: 0, thinking: 0, output: 0, calls: 0 };
56
+ this.pass5 = { input: 0, thinking: 0, output: 0, calls: 0 };
57
+ this.pass_c_resolve = { input: 0, thinking: 0, output: 0, calls: 0 };
58
+ this.pass_d_resolve = { input: 0, thinking: 0, output: 0, calls: 0 };
59
+ // Note: pass_reviewer NOT reset here — pipeline reset() runs per-turn
60
+ // but the reviewer is async/global-grain. Reviewer module manages its
61
+ // own per-tick read-and-clear if needed.
62
+ },
63
+ };
64
+ // ─── Embedding stats ───────────────────────────────────────────────────────────
65
+ // debt-4 Stage A (foundations) — embedding API calls were a HIDDEN time tax,
66
+ // invisible to cost_breakdown. ~100+ sequential embedding calls per
67
+ // moderate-sized turn at ~300ms each. Tracking here so the turn-log can
68
+ // surface the unaccounted time AND so Stage B (batching) has a measurement
69
+ // baseline to prove against.
70
+ //
71
+ // Slots: same shape pattern as reflectTokenStats.
72
+ // calls — count of embed() invocations this turn
73
+ // ms_total — sum of wall-time spent in embed() (sequential)
74
+ // input_chars — sum of input string lengths (cheap proxy for input tokens
75
+ // since embeddings tokenize roughly 1 token per 4 chars)
76
+ // estimated_usd — rough cost using gemini-embedding-001 at $0.00015/1k chars
77
+ // (placeholder; real pricing is per-token at $0.15/M output
78
+ // tokens, but embeddings are output-tokens-only so the
79
+ // estimate is roughly chars/4 → tokens → /1M × $0.15)
80
+ export const embeddingStats = {
81
+ calls: 0,
82
+ ms_total: 0,
83
+ input_chars: 0,
84
+ reset() {
85
+ this.calls = 0;
86
+ this.ms_total = 0;
87
+ this.input_chars = 0;
88
+ },
89
+ };
90
+ // ─── Context builder constants ────────────────────────────────────────────────
91
+ const HIGH_SIGNAL_TYPES = new Set(["decision", "dead_end", "constraint", "blueprint"]);
92
+ const ANCHOR_TYPES = new Set(["dead_end", "constraint"]); // always sent to Pass 2 regardless of relevance
93
+ // ─── buildProjectContext ──────────────────────────────────────────────────────
94
+ /**
95
+ * Build a tiered project context for Gemini.
96
+ *
97
+ * Tier 1 — active project (inferred from loadedBlockIds label prefixes):
98
+ * High-signal types (decision, dead_end, constraint, blueprint):
99
+ * full detail — label + ID + essence + relations (dedup + causal linking)
100
+ * All other types:
101
+ * label + essence only — enough for dedup, no relations noise
102
+ *
103
+ * Tier 2 — other projects:
104
+ * High-signal types: label + essence (catches fuzzy dedup across projects)
105
+ * Everything else: label only (routing signal for affects relations)
106
+ */
107
+ export function buildProjectContext(allBlocks, allRels, allProjectPrefixes, loadedBlockIds = []) {
108
+ const blockById = new Map(allBlocks.map((b) => [b.id, b]));
109
+ // Infer active project prefixes from loaded block labels
110
+ const activeProjectPrefixes = new Set();
111
+ for (const id of loadedBlockIds) {
112
+ const b = blockById.get(id);
113
+ if (!b)
114
+ continue;
115
+ const prefix = (b.label || "").split("_")[0];
116
+ if (allProjectPrefixes.has(prefix))
117
+ activeProjectPrefixes.add(prefix);
118
+ }
119
+ // Fallback: if no loaded blocks touched a known project, use all prefixes
120
+ if (activeProjectPrefixes.size === 0) {
121
+ for (const p of allProjectPrefixes)
122
+ activeProjectPrefixes.add(p);
123
+ }
124
+ // Build relation map (skip part_of — not useful for Gemini context)
125
+ const relMap = new Map();
126
+ for (const rel of allRels) {
127
+ if (rel.status !== "active" || rel.type === "part_of")
128
+ continue;
129
+ const target = blockById.get(rel.target_id);
130
+ if (!target)
131
+ continue;
132
+ if (!relMap.has(rel.source_id))
133
+ relMap.set(rel.source_id, []);
134
+ relMap.get(rel.source_id).push({ type: rel.type, targetLabel: target.label });
135
+ }
136
+ const lines = [];
137
+ const reflectedIds = [];
138
+ // ── Tier 1: Active project ────────────────────────────────────────────────
139
+ const activeBlocks = allBlocks.filter((b) => b.type !== "project" && activeProjectPrefixes.has((b.label || "").split("_")[0]));
140
+ if (activeBlocks.length > 0) {
141
+ const TYPE_ORDER = ["decision", "dead_end", "constraint", "blueprint", "fact", "insight", "entity", "process"];
142
+ const groups = new Map();
143
+ for (const b of activeBlocks) {
144
+ if (!groups.has(b.type))
145
+ groups.set(b.type, []);
146
+ groups.get(b.type).push(b);
147
+ }
148
+ const orderedTypes = [...new Set([...TYPE_ORDER, ...groups.keys()])];
149
+ for (const type of orderedTypes) {
150
+ const blocks = groups.get(type);
151
+ if (!blocks || blocks.length === 0)
152
+ continue;
153
+ lines.push(`[${type}s]`);
154
+ for (const b of blocks) {
155
+ reflectedIds.push(b.id); // stamp all Tier 1 blocks as reflected
156
+ if (HIGH_SIGNAL_TYPES.has(type)) {
157
+ // Full detail: label + ID + essence + unique{} values + relations
158
+ const rels = relMap.get(b.id) ?? [];
159
+ const relStr = rels.length > 0
160
+ ? `\n relations: ${rels.map((r) => `${r.type}→${r.targetLabel}`).join(", ")}`
161
+ : "";
162
+ let uniqueStr = "";
163
+ try {
164
+ const c = typeof b.content === "string" ? JSON.parse(b.content) : b.content;
165
+ const u = c?.unique ?? {};
166
+ const pairs = Object.entries(u)
167
+ .filter(([, v]) => v && String(v).trim())
168
+ .map(([k, v]) => `${k}: "${String(v).slice(0, 80)}"`)
169
+ .slice(0, 4);
170
+ if (pairs.length > 0)
171
+ uniqueStr = `\n unique: { ${pairs.join(", ")} }`;
172
+ }
173
+ catch { /* skip malformed content */ }
174
+ lines.push(` ${b.label} | ${b.id} — "${b.essence || ""}"${uniqueStr}${relStr}`);
175
+ }
176
+ else {
177
+ lines.push(` ${b.label} — "${(b.essence || "").slice(0, 100)}"`);
178
+ }
179
+ }
180
+ lines.push("");
181
+ }
182
+ }
183
+ // ── Tier 2: Other projects ────────────────────────────────────────────────
184
+ const otherBlocks = allBlocks.filter((b) => b.type !== "project"
185
+ && !activeProjectPrefixes.has((b.label || "").split("_")[0]));
186
+ if (otherBlocks.length > 0) {
187
+ const otherHighSignal = otherBlocks.filter((b) => HIGH_SIGNAL_TYPES.has(b.type));
188
+ const otherRest = otherBlocks.filter((b) => !HIGH_SIGNAL_TYPES.has(b.type));
189
+ if (otherHighSignal.length > 0) {
190
+ lines.push("[other projects — decisions/constraints/dead_ends (essence for dedup)]");
191
+ for (const b of otherHighSignal) {
192
+ reflectedIds.push(b.id); // stamp Tier 2 high-signal blocks as reflected
193
+ lines.push(` ${b.label} — "${(b.essence || "").slice(0, 100)}"`);
194
+ }
195
+ lines.push("");
196
+ }
197
+ if (otherRest.length > 0) {
198
+ lines.push("[other projects — label only, use for affects relations]");
199
+ for (const b of otherRest)
200
+ lines.push(` ${b.label}`);
201
+ lines.push("");
202
+ }
203
+ }
204
+ return { context: lines.join("\n"), reflectedIds };
205
+ }
206
+ // ─── buildPreSearchContext ────────────────────────────────────────────────────
207
+ // Targeted context for Pass 2. Replaces full block dump with:
208
+ // project roots + anchors (dead_ends/constraints) + per-item semantic candidates.
209
+ export async function buildPreSearchContext(items, allBlocks, allRels, knownRoots, embeddings, activeProjectPrefixes) {
210
+ const activeProject = [...activeProjectPrefixes][0] || "";
211
+ const lines = ["[PROJECTS IN THIS GRAPH]"];
212
+ for (const root of knownRoots) {
213
+ lines.push(` ${root.label} — "${root.essence}"`);
214
+ }
215
+ lines.push(`\n[ACTIVE PROJECT: ${activeProject || "unknown"}]\n`);
216
+ // Relation map
217
+ const blockById = new Map(allBlocks.map((b) => [b.id, b]));
218
+ const relMap = new Map();
219
+ for (const rel of allRels) {
220
+ if (rel.status !== "active" || rel.type === "part_of")
221
+ continue;
222
+ const target = blockById.get(rel.target_id);
223
+ if (!target)
224
+ continue;
225
+ if (!relMap.has(rel.source_id))
226
+ relMap.set(rel.source_id, []);
227
+ relMap.get(rel.source_id).push({ type: rel.type, targetLabel: target.label });
228
+ }
229
+ // Active project blocks only
230
+ const projectBlocks = allBlocks.filter((b) => {
231
+ if (b.type === "project" || b.status === "archived")
232
+ return false;
233
+ const prefix = (b.label || "").split("_")[0];
234
+ return activeProjectPrefixes.has(prefix);
235
+ });
236
+ const formatBlock = (b, includeRelations = false) => {
237
+ let uniqueStr = "";
238
+ try {
239
+ const c = typeof b.content === "string" ? JSON.parse(b.content) : b.content;
240
+ const u = c?.unique ?? {};
241
+ const pairs = Object.entries(u)
242
+ .filter(([, v]) => v && String(v).trim())
243
+ .map(([k, v]) => `${k}: "${String(v).slice(0, 80)}"`)
244
+ .slice(0, 3);
245
+ if (pairs.length > 0)
246
+ uniqueStr = `\n unique: { ${pairs.join(", ")} }`;
247
+ }
248
+ catch { /* skip */ }
249
+ const rels = includeRelations ? (relMap.get(b.id) ?? []) : [];
250
+ const relStr = rels.length > 0 ? `\n relations: ${rels.map((r) => `${r.type}→${r.targetLabel}`).join(", ")}` : "";
251
+ return ` ${b.label} | ${b.id} — "${b.essence || ""}"${uniqueStr}${relStr}`;
252
+ };
253
+ // Anchor layer: all dead_ends + constraints (always present)
254
+ const anchors = projectBlocks.filter((b) => ANCHOR_TYPES.has(b.type));
255
+ if (anchors.length > 0) {
256
+ lines.push("[anchor blocks — always included: dead_ends + constraints]");
257
+ for (const b of anchors)
258
+ lines.push(formatBlock(b, true));
259
+ lines.push("");
260
+ }
261
+ const includedIds = new Set(anchors.map((b) => b.id));
262
+ const anchorIds = new Set(anchors.map((b) => b.id));
263
+ const nonAnchorBlocks = projectBlocks.filter((b) => !anchorIds.has(b.id));
264
+ const candidateLines = [];
265
+ // Semantic candidates: one best-match per item
266
+ if (embeddings?.isAvailable() && nonAnchorBlocks.length > 0) {
267
+ for (const item of items) {
268
+ const vec = await embeddings.embed(item.text).catch(() => null);
269
+ if (!vec)
270
+ continue;
271
+ let best = null;
272
+ for (const block of nonAnchorBlocks) {
273
+ if (includedIds.has(block.id) || !block.embedding)
274
+ continue;
275
+ try {
276
+ const blockVec = JSON.parse(block.embedding);
277
+ const sim = cosineSim(vec, blockVec);
278
+ if (sim >= CONFIG.preSearch.semanticMatchThreshold && (!best || sim > best.sim))
279
+ best = { sim, block };
280
+ }
281
+ catch { /* skip */ }
282
+ }
283
+ if (best) {
284
+ includedIds.add(best.block.id);
285
+ candidateLines.push(formatBlock(best.block, true));
286
+ }
287
+ }
288
+ }
289
+ // Also always include recent decisions (last 3 sessions worth — for supersedes detection)
290
+ const recentDecisions = projectBlocks
291
+ .filter((b) => b.type === "decision" && !includedIds.has(b.id) && !anchorIds.has(b.id))
292
+ .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())
293
+ .slice(0, CONFIG.preSearch.recentDecisionsLimit);
294
+ for (const b of recentDecisions) {
295
+ includedIds.add(b.id);
296
+ candidateLines.push(formatBlock(b, false));
297
+ }
298
+ if (candidateLines.length > 0) {
299
+ lines.push("[related blocks — matched to current items + recent decisions]");
300
+ lines.push(...candidateLines);
301
+ lines.push("");
302
+ }
303
+ // Conflict candidates: existing decisions/blueprints that dead_end items may supersede
304
+ const conflictSection = await buildConflictCandidates(items, allBlocks, embeddings);
305
+ if (conflictSection)
306
+ lines.push(conflictSection);
307
+ return lines.join("\n");
308
+ }
309
+ // ─── buildItemContext ─────────────────────────────────────────────────────────
310
+ /**
311
+ * For each Pass 2 classified item, find the closest existing block in the graph
312
+ * and render a mini-narrative: the block + its 1-hop causal neighborhood.
313
+ *
314
+ * This gives Pass 3 the story behind each candidate match — not just "block exists"
315
+ * but what caused it, what it led to, and whether it is still active.
316
+ *
317
+ * Priority order for candidate lookup per item:
318
+ * 1. supersedes_ref (exact label pointer from Pass 2)
319
+ * 2. extends_item target (if set and resolves to a block label)
320
+ * 3. Cosine similarity search (threshold 0.72, same as buildPreSearchContext)
321
+ */
322
+ export async function buildItemContext(classified, allBlocks, allRels, embeddings) {
323
+ const blockByLabel = new Map(allBlocks.map((b) => [b.label, b]));
324
+ const blockById = new Map(allBlocks.map((b) => [b.id, b]));
325
+ // Build outgoing and incoming relation maps
326
+ const outgoing = new Map();
327
+ const incoming = new Map();
328
+ const CAUSAL_TYPES = new Set(["prompted_by", "based_on", "supersedes", "extends", "derived_from"]);
329
+ for (const rel of allRels) {
330
+ if (rel.status !== "active")
331
+ continue;
332
+ const src = blockById.get(rel.source_id);
333
+ const tgt = blockById.get(rel.target_id);
334
+ if (!src || !tgt)
335
+ continue;
336
+ if (CAUSAL_TYPES.has(rel.type)) {
337
+ if (!outgoing.has(rel.source_id))
338
+ outgoing.set(rel.source_id, []);
339
+ outgoing.get(rel.source_id).push({ type: rel.type, targetLabel: tgt.label, targetEssence: (tgt.essence || "").slice(0, 80), targetType: tgt.type });
340
+ if (!incoming.has(rel.target_id))
341
+ incoming.set(rel.target_id, []);
342
+ incoming.get(rel.target_id).push({ type: rel.type, sourceLabel: src.label, sourceEssence: (src.essence || "").slice(0, 80), sourceType: src.type });
343
+ }
344
+ }
345
+ // Check if any newer block supersedes a given block
346
+ const isSuperseded = new Set();
347
+ for (const rel of allRels) {
348
+ if (rel.status === "active" && rel.type === "supersedes")
349
+ isSuperseded.add(rel.target_id);
350
+ }
351
+ const renderNeighborhood = (block) => {
352
+ const lines = [
353
+ `EXISTING BLOCK: ${block.label} [${block.type}]`,
354
+ ` "${(block.essence || "").slice(0, 120)}"`,
355
+ ];
356
+ const inc = incoming.get(block.id) ?? [];
357
+ if (inc.length === 0) {
358
+ lines.push(` Preceded by: (founding block — no causal predecessors)`);
359
+ }
360
+ else {
361
+ lines.push(` Preceded by:`);
362
+ for (const r of inc.slice(0, 4)) {
363
+ lines.push(` ← ${r.sourceLabel} [${r.sourceType}] via ${r.type} — "${r.sourceEssence}"`);
364
+ }
365
+ }
366
+ const out = (outgoing.get(block.id) ?? []).filter(r => r.type !== "part_of");
367
+ if (out.length > 0) {
368
+ for (const r of out.slice(0, 3)) {
369
+ lines.push(` ${r.type}→ ${r.targetLabel} [${r.targetType}]`);
370
+ }
371
+ }
372
+ if (isSuperseded.has(block.id)) {
373
+ lines.push(` Superseded by: YES — this block has been replaced by a newer block`);
374
+ }
375
+ else {
376
+ lines.push(` Superseded by: (none — currently active)`);
377
+ }
378
+ // Summarise the story arc
379
+ const arcParts = [...inc.map(r => r.sourceType), block.type];
380
+ lines.push(` Story arc: ${arcParts.join(" → ")}`);
381
+ return lines.join("\n");
382
+ };
383
+ const result = {};
384
+ const embeddingAvailable = embeddings?.isAvailable() && allBlocks.some((b) => b.embedding);
385
+ const highSignal = allBlocks.filter((b) => HIGH_SIGNAL_TYPES.has(b.type) && b.type !== "project");
386
+ for (const item of classified) {
387
+ let candidate = null;
388
+ // Priority 1: exact label from supersedes_ref
389
+ if (item.supersedes_ref) {
390
+ candidate = blockByLabel.get(item.supersedes_ref) ?? null;
391
+ }
392
+ // Priority 2: extends_item — resolve the item id to a block label via classified batch
393
+ // (extends_item is an item ID not a block label; skip if not resolvable to a block)
394
+ // This is intentionally lightweight — we just ensure the supersedes path is captured above.
395
+ // Priority 3: cosine similarity
396
+ if (!candidate && embeddingAvailable) {
397
+ const vec = await embeddings.embed(item.text).catch(() => null);
398
+ if (vec) {
399
+ let bestSim = CONFIG.preSearch.semanticMatchThreshold;
400
+ for (const block of highSignal) {
401
+ if (!block.embedding)
402
+ continue;
403
+ try {
404
+ const blockVec = JSON.parse(block.embedding);
405
+ const sim = cosineSim(vec, blockVec);
406
+ if (sim > bestSim) {
407
+ bestSim = sim;
408
+ candidate = block;
409
+ }
410
+ }
411
+ catch { /* skip */ }
412
+ }
413
+ }
414
+ }
415
+ result[item.id] = candidate
416
+ ? renderNeighborhood(candidate)
417
+ : "(no existing match — create new block)";
418
+ }
419
+ return result;
420
+ }
421
+ // ─── buildConflictCandidates ──────────────────────────────────────────────────
422
+ /**
423
+ * For each dead_end item from Pass 1, find existing decision/blueprint blocks
424
+ * that are likely being superseded. Uses two-step lookup:
425
+ * 1. Label substring search on key nouns (deterministic, uses naming convention)
426
+ * 2. Embedding similarity fallback (threshold 0.85, only if step 1 finds nothing)
427
+ *
428
+ * For each match found, also looks up the block's chain membership to give
429
+ * Pass 2 the full causal arc context.
430
+ *
431
+ * Returns a formatted string ready for injection into Pass 2 context, or "" if none.
432
+ */
433
+ export async function buildConflictCandidates(items, allBlocks, embeddings) {
434
+ const deadEndItems = items.filter(i => i.provisional_type === "dead_end");
435
+ if (deadEndItems.length === 0)
436
+ return "";
437
+ const SUPERSEDABLE_TYPES = new Set(["decision", "blueprint"]);
438
+ const candidates = allBlocks.filter(b => SUPERSEDABLE_TYPES.has(b.type) && b.status !== "archived");
439
+ if (candidates.length === 0)
440
+ return "";
441
+ // Build chain membership map: blockId → chain block
442
+ const chainBlocks = allBlocks.filter(b => b.type === "chain");
443
+ const blockIdToChain = new Map();
444
+ for (const chain of chainBlocks) {
445
+ try {
446
+ const content = typeof chain.content === "string" ? JSON.parse(chain.content) : chain.content;
447
+ const memberLabels = content?.unique?.members ?? content?.members ?? [];
448
+ for (const memberLabel of memberLabels) {
449
+ const member = allBlocks.find(b => b.label === memberLabel);
450
+ if (member)
451
+ blockIdToChain.set(member.id, chain);
452
+ }
453
+ }
454
+ catch { /* skip malformed chain content */ }
455
+ }
456
+ // Also use chain_id stamp on blocks directly
457
+ for (const block of allBlocks) {
458
+ if (block.chain_id && !blockIdToChain.has(block.id)) {
459
+ const chainBlock = allBlocks.find(b => b.id === block.chain_id);
460
+ if (chainBlock)
461
+ blockIdToChain.set(block.id, chainBlock);
462
+ }
463
+ }
464
+ // Extract key nouns from text — words 4+ chars, not stop words
465
+ const STOP = new Set(["this", "that", "with", "from", "have", "been", "will", "were", "they", "their", "would", "could", "should", "when", "then", "also", "into", "over", "under", "about", "after", "before", "there", "here", "just", "more", "some", "such", "than", "very", "what", "which", "while", "these", "those", "where", "both", "only", "well"]);
466
+ const extractNouns = (text) => {
467
+ return text.toLowerCase()
468
+ .replace(/[^a-z0-9\s-]/g, " ")
469
+ .split(/\s+/)
470
+ .filter(w => w.length >= 4 && !STOP.has(w));
471
+ };
472
+ const formatCandidate = (item, block, matchType, sim) => {
473
+ let uniqueStr = "";
474
+ try {
475
+ const c = typeof block.content === "string" ? JSON.parse(block.content) : block.content;
476
+ const u = c?.unique ?? {};
477
+ const pairs = Object.entries(u)
478
+ .filter(([, v]) => v && String(v).trim())
479
+ .map(([k, v]) => `${k}: "${String(v).slice(0, 80)}"`)
480
+ .slice(0, 3);
481
+ if (pairs.length > 0)
482
+ uniqueStr = `\n unique: { ${pairs.join(", ")} }`;
483
+ }
484
+ catch { /* skip */ }
485
+ const chainBlock = blockIdToChain.get(block.id);
486
+ let chainStr = "";
487
+ if (chainBlock) {
488
+ try {
489
+ const c = typeof chainBlock.content === "string" ? JSON.parse(chainBlock.content) : chainBlock.content;
490
+ const members = c?.unique?.members ?? c?.members ?? [];
491
+ const arc = c?.unique?.arc ?? "";
492
+ if (members.length > 0) {
493
+ chainStr = `\n part of chain: ${chainBlock.label}` +
494
+ (arc ? ` (arc: ${arc})` : "") +
495
+ `\n members: ${members.join(" → ")}`;
496
+ }
497
+ }
498
+ catch { /* skip */ }
499
+ }
500
+ const confidence = matchType === "label" ? "label match" : `semantic match ${Math.round((sim ?? 0) * 100)}%`;
501
+ return ` item ${item.id} [dead_end] "${item.text.slice(0, 70)}"\n` +
502
+ ` → may supersede: ${block.label} [${block.type}] (${confidence})\n` +
503
+ ` essence: "${(block.essence || "").slice(0, 120)}"${uniqueStr}${chainStr}`;
504
+ };
505
+ const SEMANTIC_THRESHOLD = 0.85;
506
+ const sections = [];
507
+ for (const item of deadEndItems) {
508
+ const nouns = extractNouns(item.text);
509
+ let matched = null;
510
+ let matchType = "label";
511
+ let matchSim;
512
+ // Step 1: label substring search
513
+ for (const noun of nouns) {
514
+ const found = candidates.find(b => b.label.includes(noun));
515
+ if (found) {
516
+ matched = found;
517
+ break;
518
+ }
519
+ }
520
+ // Step 2: embedding fallback
521
+ if (!matched && embeddings?.isAvailable()) {
522
+ const vec = await embeddings.embed(item.text).catch(() => null);
523
+ if (vec) {
524
+ let bestSim = SEMANTIC_THRESHOLD;
525
+ for (const block of candidates) {
526
+ if (!block.embedding)
527
+ continue;
528
+ try {
529
+ const blockVec = JSON.parse(block.embedding);
530
+ const sim = cosineSim(vec, blockVec);
531
+ if (sim > bestSim) {
532
+ bestSim = sim;
533
+ matched = block;
534
+ matchSim = sim;
535
+ }
536
+ }
537
+ catch { /* skip */ }
538
+ }
539
+ if (matched)
540
+ matchType = "semantic";
541
+ }
542
+ }
543
+ if (matched) {
544
+ sections.push(formatCandidate(item, matched, matchType, matchSim));
545
+ }
546
+ }
547
+ if (sections.length === 0)
548
+ return "";
549
+ return `[POTENTIAL SUPERSEDES CANDIDATES — dead_end items may replace these existing blocks]\n` +
550
+ ` Verify by reading content. If the item is replacing this block → set supersedes_ref to the EXACT label shown.\n` +
551
+ sections.join("\n\n") + "\n";
552
+ }
553
+ // ─── Dedup helpers ────────────────────────────────────────────────────────────
554
+ export const DEDUP_HIGH_SIGNAL = new Set(["decision", "constraint", "dead_end", "blueprint"]);
555
+ export async function buildDuplicateAlerts(items, existingBlocks, embeddings) {
556
+ const candidates = existingBlocks.filter((b) => b.type !== "project" && DEDUP_HIGH_SIGNAL.has(b.type) && b.embedding);
557
+ if (candidates.length === 0)
558
+ return "";
559
+ const RELATED_SIM_LOW = 0.72;
560
+ const RELATED_SIM_HIGH = CONFIG.dedup.defaultThreshold; // 0.88
561
+ const strongAlerts = [];
562
+ const relatedAlerts = [];
563
+ for (const item of items) {
564
+ if (!DEDUP_HIGH_SIGNAL.has(item.type))
565
+ continue;
566
+ const vec = await embeddings.embed(item.text);
567
+ if (!vec)
568
+ continue;
569
+ let bestStrongSim = 0;
570
+ let bestStrongBlock = null;
571
+ let bestRelatedSim = 0;
572
+ let bestRelatedBlock = null;
573
+ for (const block of candidates) {
574
+ if (block.type !== item.type)
575
+ continue; // only same-type comparisons
576
+ try {
577
+ const blockVec = JSON.parse(block.embedding);
578
+ const sim = cosineSim(vec, blockVec);
579
+ if (sim >= RELATED_SIM_HIGH && sim > bestStrongSim) {
580
+ bestStrongSim = sim;
581
+ bestStrongBlock = block;
582
+ }
583
+ else if (sim >= RELATED_SIM_LOW && sim < RELATED_SIM_HIGH && sim > bestRelatedSim) {
584
+ bestRelatedSim = sim;
585
+ bestRelatedBlock = block;
586
+ }
587
+ }
588
+ catch { /* skip malformed embedding */ }
589
+ }
590
+ const snippet = item.text.length > 80 ? item.text.slice(0, 80) + "..." : item.text;
591
+ if (bestStrongBlock) {
592
+ const pct = Math.round(bestStrongSim * 100);
593
+ strongAlerts.push(` Item [type:${item.type}]: "${snippet}"\n` +
594
+ ` → ${pct}% similar to existing block: ${bestStrongBlock.label}\n` +
595
+ ` essence: "${(bestStrongBlock.essence || "").slice(0, 120)}"\n` +
596
+ ` → Same concept? Put in updates[], not new_blocks[]. Genuinely different? Explain in novelty_reason.`);
597
+ }
598
+ else if (bestRelatedBlock) {
599
+ const pct = Math.round(bestRelatedSim * 100);
600
+ relatedAlerts.push(` Item [type:${item.type}]: "${snippet}"\n` +
601
+ ` → ${pct}% related to existing block: ${bestRelatedBlock.label}\n` +
602
+ ` essence: "${(bestRelatedBlock.essence || "").slice(0, 120)}"\n` +
603
+ ` → Specialization or extension? Add { "type": "extends", "target_id": "${bestRelatedBlock.label}" } to the new block's relations[].`);
604
+ }
605
+ }
606
+ const parts = [];
607
+ if (strongAlerts.length > 0) {
608
+ console.log(`Auto-Reflect: ${strongAlerts.length} strong duplicate(s) flagged for Pass 3`);
609
+ parts.push(`⚠ POTENTIAL DUPLICATE ALERTS — check these before creating new blocks:\n${strongAlerts.join("\n\n")}`);
610
+ }
611
+ if (relatedAlerts.length > 0) {
612
+ console.log(`Auto-Reflect: ${relatedAlerts.length} related block(s) flagged for Pass 3 (extends candidates)`);
613
+ parts.push(`⚠ RELATED BLOCK ALERTS — these items overlap with existing blocks but are likely specializations:\n${relatedAlerts.join("\n\n")}`);
614
+ }
615
+ if (parts.length === 0)
616
+ return "";
617
+ return parts.join("\n\n") + "\n\n";
618
+ }
619
+ //# sourceMappingURL=context.js.map