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,191 @@
1
+ // ═══════════════════════════════════════════════════════════════════════════════
2
+ // v2 SELECTOR β€” the worth-gate (Fix 1, 2026-06-07)
3
+ //
4
+ // First principles: forming memory is comprehension + SELECTION, two opposing stances
5
+ // (capture vs discard) that can't be one breath β€” so they're two LLMs. v2's COMPREHEND
6
+ // is the comprehender (high recall); this is the SELECTOR (precision). Without it,
7
+ // COMPREHEND keeps everything it forms (dogfood: 242 blocks from a 19KB doc, all kept).
8
+ //
9
+ // Placement: AFTER COMPREHEND-stitch + convert, BEFORE Pass 2b fill β€” so a dropped
10
+ // candidate never pays its per-block downstream cost (2b fill, naming, relations).
11
+ //
12
+ // Reuse: v1's PASS JUDGE (pass_judge.ts) IS the discard-biased selector we want β€” the
13
+ // path-specificity test, default-KEEP-on-uncertain (recall guard), the reason_category
14
+ // enum. We feed it the v2 candidates and apply the verdicts with a v2-aware override.
15
+ //
16
+ // Default-OFF: NODEDEX_V2_JUDGE.
17
+ // ═══════════════════════════════════════════════════════════════════════════════
18
+ import { callPassJudgeLLM } from "./pass_judge.js";
19
+ export function v2JudgeEnabled() {
20
+ // DEFAULT ON since 2026-06-12 (part of the validated v2 stack). =0 opts out.
21
+ return process.env.NODEDEX_V2_JUDGE !== "0";
22
+ }
23
+ /** Context-aware judge (default OFF, NODEDEX_V2_JUDGE_CONTEXT): show the SELECTOR each
24
+ * block's structural ROLE (what depends on it / what it builds on) so it judges worth in
25
+ * context, not by the sentence alone β€” the proactive complement to the mechanical rescue
26
+ * below. Best paired with cross-link-first (so the role includes cross-group deps);
27
+ * degrades to within-group roles when cross-link runs after the judge. */
28
+ export function v2JudgeContextEnabled() {
29
+ return process.env.NODEDEX_V2_JUDGE_CONTEXT === "1";
30
+ }
31
+ /** Strong causal dependencies: a KEPT item with one of these pointing at a DROPPED item
32
+ * would be orphaned (a decision losing its `based_on` evidence = the islanding failure).
33
+ * These get RESCUED. (Weak `relations[]` β€” supports/related_to/affects β€” are NOT rescued;
34
+ * their dangling targets are just cleaned.) Only within-batch item-ids match dropIds;
35
+ * external labels (supersedes_ref/resolved_ref can be labels) simply never match. */
36
+ function strongRefs(it) {
37
+ const out = [];
38
+ if (Array.isArray(it.based_on_items))
39
+ out.push(...it.based_on_items);
40
+ if (Array.isArray(it.triggered_by_items))
41
+ out.push(...it.triggered_by_items);
42
+ if (it.extends_item)
43
+ out.push(it.extends_item);
44
+ if (it.supersedes_ref)
45
+ out.push(it.supersedes_ref);
46
+ if (it.resolved_ref)
47
+ out.push(it.resolved_ref);
48
+ return out;
49
+ }
50
+ /** Each item's structural ROLE for the context-aware judge: what DEPENDS ON it (incoming
51
+ * edges β€” the load-bearing signal) and what it BUILDS ON (outgoing), summarized by the
52
+ * NEIGHBOUR blocks' TYPES (ids are noise to the judge). Built over the WHOLE item set, so
53
+ * cross-group roles appear when cross-link ran first; degrades to within-group otherwise.
54
+ * Isolated blocks get no entry (judged on text alone). Pure / testable. */
55
+ export function buildRoleContext(items) {
56
+ const typeOf = new Map(items.map((it) => [it.id, it.type]));
57
+ const outRefs = (it) => {
58
+ const o = strongRefs(it).slice();
59
+ if (Array.isArray(it.relations))
60
+ for (const r of it.relations)
61
+ if (r?.target)
62
+ o.push(r.target);
63
+ return o.filter((id) => typeOf.has(id)); // only in-set refs (external labels never match)
64
+ };
65
+ const incoming = new Map(); // id β†’ types of blocks that point AT it
66
+ for (const it of items) {
67
+ for (const ref of outRefs(it)) {
68
+ const arr = incoming.get(ref) ?? [];
69
+ arr.push(it.type);
70
+ incoming.set(ref, arr);
71
+ }
72
+ }
73
+ const summarize = (types) => {
74
+ const counts = new Map();
75
+ for (const t of types)
76
+ counts.set(t, (counts.get(t) ?? 0) + 1);
77
+ return [...counts.entries()].map(([t, n]) => (n > 1 ? `${t}Γ—${n}` : t)).join(", ");
78
+ };
79
+ const out = {};
80
+ for (const it of items) {
81
+ const inc = incoming.get(it.id) ?? [];
82
+ const outg = outRefs(it).map((id) => typeOf.get(id));
83
+ const parts = [];
84
+ if (inc.length)
85
+ parts.push(`needed-by ${summarize(inc)}`);
86
+ if (outg.length)
87
+ parts.push(`builds-on ${summarize(outg)}`);
88
+ if (parts.length)
89
+ out[it.id] = parts.join("; ");
90
+ }
91
+ return out;
92
+ }
93
+ /** Apply JUDGE verdicts to v2 candidates. DROP the low-worth; RESCUE any dropped item a
94
+ * KEPT item causally depends on (never orphan a kept decision's evidence); then CLEAN
95
+ * any remaining refs to still-dropped items so no edge dangles. judge=null β†’ keep all
96
+ * (a failed selector must NEVER drop residue β€” precision is an improvement, not a gate).
97
+ * Mutates kept items' ref arrays in place (cleaning). Pure w.r.t. the input list otherwise. */
98
+ export function applyV2JudgeVerdicts(items, judge) {
99
+ if (!judge)
100
+ return { kept: items, droppedCount: 0, rescued: 0 };
101
+ const allIds = new Set(items.map((i) => i.id));
102
+ const dropIds = new Set(judge.verdicts.filter((v) => v.verdict === "DROP" && allIds.has(v.item_id)).map((v) => v.item_id));
103
+ // Anchor-override to fixpoint: rescue strong-causal deps of kept items.
104
+ let rescued = 0, changed = true;
105
+ while (changed) {
106
+ changed = false;
107
+ for (const it of items) {
108
+ if (dropIds.has(it.id))
109
+ continue; // a dropped item's deps don't rescue
110
+ for (const ref of strongRefs(it)) {
111
+ if (dropIds.has(ref)) {
112
+ dropIds.delete(ref);
113
+ rescued++;
114
+ changed = true;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ const kept = items.filter((it) => !dropIds.has(it.id));
120
+ // Clean refs to still-dropped items so nothing dangles downstream.
121
+ for (const it of kept) {
122
+ if (Array.isArray(it.based_on_items))
123
+ it.based_on_items = it.based_on_items.filter((r) => !dropIds.has(r));
124
+ if (Array.isArray(it.triggered_by_items))
125
+ it.triggered_by_items = it.triggered_by_items.filter((r) => !dropIds.has(r));
126
+ if (it.extends_item && dropIds.has(it.extends_item))
127
+ delete it.extends_item;
128
+ if (it.supersedes_ref && dropIds.has(it.supersedes_ref))
129
+ delete it.supersedes_ref;
130
+ if (it.resolved_ref && dropIds.has(it.resolved_ref))
131
+ delete it.resolved_ref;
132
+ if (Array.isArray(it.relations))
133
+ it.relations = it.relations.filter((r) => !dropIds.has(r.target));
134
+ }
135
+ return { kept, droppedCount: dropIds.size, rescued };
136
+ }
137
+ /** Run the SELECTOR PER GROUP, all groups in PARALLEL. Judging per group is how v1's
138
+ * judge actually runs (per turn β€” never hundreds at once) and how PRODUCE already runs
139
+ * (per group): it keeps each call's VERDICT output bounded so the judge never truncates
140
+ * on a big arc (the one-shot-over-all-314 version did). The path-specificity test is
141
+ * per-item-independent, so splitting by group changes no verdict β€” only the call size.
142
+ *
143
+ * Each group's items are judged with the transcript as shared session context. A group
144
+ * whose judge call FAILS contributes no verdicts β†’ its items default to KEEP (recall
145
+ * guard β€” a failed selector never drops residue). Verdicts are merged and applied once
146
+ * (so anchor-override / dangling-clean see the whole item set). No-op (keep all) for <2.
147
+ */
148
+ export async function runV2Judge(provider, items, transcript, groupByItemId) {
149
+ if (items.length < 2)
150
+ return { kept: items, ran: false, droppedCount: 0, rescued: 0 };
151
+ // Bucket candidates by group (id is `{group_id}::{local_id}`; fall back to that prefix
152
+ // when no map is given). The group is the v2-native small unit for the judge.
153
+ const groupOf = (it) => groupByItemId?.[it.id] ?? it.id.split("::")[0] ?? "_";
154
+ const byGroup = new Map();
155
+ for (const it of items) {
156
+ const g = groupOf(it);
157
+ let bucket = byGroup.get(g);
158
+ if (!bucket) {
159
+ bucket = [];
160
+ byGroup.set(g, bucket);
161
+ }
162
+ bucket.push(it);
163
+ }
164
+ // Judge every group AT ONCE (parallel). Each call judges only its group's items (small,
165
+ // bounded output) with the transcript as shared context. The v1 judge reads id /
166
+ // provisional_type / text / excerpt only.
167
+ const groups = [...byGroup.values()];
168
+ // Context-aware judge (default OFF): each item's role is computed over ALL items (so a
169
+ // cross-group dependency shows when cross-link ran first), then passed to every group's
170
+ // judge call. Empty map when off β†’ callPassJudgeLLM is byte-identical to before.
171
+ const roleById = v2JudgeContextEnabled() ? buildRoleContext(items) : {};
172
+ if (v2JudgeContextEnabled()) {
173
+ console.log(`Auto-Reflect v2 SELECTOR: context-aware β€” roles for ${Object.keys(roleById).length}/${items.length} block(s)`);
174
+ }
175
+ const results = await Promise.all(groups.map(async (groupItems) => {
176
+ const judgeItems = groupItems.map((it) => ({
177
+ id: it.id, provisional_type: it.type, text: it.text, excerpt: it.excerpt,
178
+ }));
179
+ const r = await callPassJudgeLLM(provider, judgeItems, undefined, "", transcript, 1024, "", roleById);
180
+ return r.result; // PassJudgeResult | null (null β†’ this group's items default to KEEP)
181
+ }));
182
+ // Merge verdicts from all groups; failed groups contribute none. anyRan=false β†’ judge
183
+ // fully failed β†’ applyV2JudgeVerdicts(null) keeps all.
184
+ const anyRan = results.some((r) => !!r);
185
+ const merged = anyRan ? { verdicts: results.flatMap((r) => r?.verdicts ?? []) } : null;
186
+ const failedGroups = results.filter((r) => !r).length;
187
+ const { kept, droppedCount, rescued } = applyV2JudgeVerdicts(items, merged);
188
+ console.log(`Auto-Reflect v2 SELECTOR: ${items.length} β†’ ${kept.length} kept (${droppedCount} dropped, ${rescued} rescued) over ${groups.length} group(s) in parallel${failedGroups ? ` [${failedGroups} group-judge(s) failed β†’ those kept]` : ""}`);
189
+ return { kept, ran: anyRan, droppedCount, rescued };
190
+ }
191
+ //# sourceMappingURL=v2-judge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v2-judge.js","sourceRoot":"","sources":["../../../src/middleware/reflect/v2-judge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const CAUSAL_TRAVERSAL_RELS: ReadonlySet<string>;
2
+ //# sourceMappingURL=relation-sets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-sets.d.ts","sourceRoot":"","sources":["../src/relation-sets.ts"],"names":[],"mappings":"AAwBA,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CASpD,CAAC"}
@@ -0,0 +1,35 @@
1
+ // relation-sets.ts β€” single source of truth for the CAUSAL TRAVERSAL thread.
2
+ //
3
+ // "Which relation types are 'how was this reached?'" Every READ-SIDE traversal
4
+ // endpoint imports this ONE set so they walk a consistent causal graph, instead of
5
+ // the historical inconsistency where /chain walked only 3 types and `extends` /
6
+ // `supports` (the bulk of real elaboration edges) were invisible β€” making
7
+ // genuinely-connected blocks render as orphans.
8
+ //
9
+ // IN β€” the cause-and-effect reasoning thread the agent walks to understand how a
10
+ // state was reached.
11
+ // OUT β€” `part_of` (containment), `member_of` (chain membership β€” a grouping, like a
12
+ // folder), `related_to` (loose), `contradicts` (conflict, not "how reached"),
13
+ // and task/manual edges. Those are real, but they are not the causal thread.
14
+ //
15
+ // SCOPE: this is now the single source of truth for the causal thread across all
16
+ // three "chain" notions β€” read-side TRAVERSAL (/chain, /nav), the chain_id
17
+ // clustering WRITER (stampFlowRolesAndChains), AND Pass 5 chain assembly β€” unified
18
+ // 2026-06-05 so they agree on which edges are "how was this reached?". (Earlier
19
+ // the clustering writer was deliberately fenced off on a narrower set; that fence
20
+ // was reversed once a clustering simulation showed adding supports/supersedes/
21
+ // resolves pulls supports-linked residue into its arc WITHOUT cross-arc over-merge.
22
+ // supports alone is ~half of all causal edges, so excluding it orphaned real
23
+ // members like a user's lived failure.) The pipeline's internal CONTEXT-BUILDING
24
+ // sets remain tuned independently β€” they shape extraction, not the causal thread.
25
+ export const CAUSAL_TRAVERSAL_RELS = new Set([
26
+ "prompted_by", // consequence β†’ trigger (primary causal coordinate)
27
+ "based_on", // conclusion β†’ evidence
28
+ "derived_from", // derived β†’ source (logical inference)
29
+ "extends", // specific β†’ broader (mechanism elaboration)
30
+ "supports", // fact β†’ hypothesis (evidential grounding)
31
+ "supersedes", // new β†’ old (replacement β€” walk back to history)
32
+ "superseded_by", // old β†’ new (inverse)
33
+ "resolves", // answer β†’ question
34
+ ]);
35
+ //# sourceMappingURL=relation-sets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-sets.js","sourceRoot":"","sources":["../src/relation-sets.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,EAAE;AACF,+EAA+E;AAC/E,mFAAmF;AACnF,gFAAgF;AAChF,0EAA0E;AAC1E,gDAAgD;AAChD,EAAE;AACF,kFAAkF;AAClF,2BAA2B;AAC3B,oFAAoF;AACpF,oFAAoF;AACpF,mFAAmF;AACnF,EAAE;AACF,iFAAiF;AACjF,2EAA2E;AAC3E,mFAAmF;AACnF,gFAAgF;AAChF,kFAAkF;AAClF,+EAA+E;AAC/E,oFAAoF;AACpF,6EAA6E;AAC7E,iFAAiF;AACjF,kFAAkF;AAClF,MAAM,CAAC,MAAM,qBAAqB,GAAwB,IAAI,GAAG,CAAC;IAChE,aAAa,EAAI,oDAAoD;IACrE,UAAU,EAAO,wBAAwB;IACzC,cAAc,EAAG,uCAAuC;IACxD,SAAS,EAAQ,6CAA6C;IAC9D,UAAU,EAAO,2CAA2C;IAC5D,YAAY,EAAK,iDAAiD;IAClE,eAAe,EAAE,sBAAsB;IACvC,UAAU,EAAO,oBAAoB;CACtC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=flags.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flags.test.d.ts","sourceRoot":"","sources":["../../../src/routes/__tests__/flags.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,257 @@
1
+ /**
2
+ * DEBT 5 Slice 2 Sub-step 2.4 β€” /api/flags REST endpoint tests.
3
+ *
4
+ * Boots a real api-server on a random port (matches src/__tests__/api.test.ts
5
+ * harness) so route wiring + JSON body parsing + the executeMerge path are all
6
+ * exercised end-to-end. No LLM (manual review is operator-driven, no model).
7
+ *
8
+ * Covers:
9
+ * GET /api/flags/summary β€” counts
10
+ * GET /api/flags β€” list + filters (flag_type, reviewed, block_id)
11
+ * GET /api/flags/:id β€” single flag + both blocks embedded; 404
12
+ * POST /api/flags/:id/review β€” verdict-only; merge+execute (archive+relation);
13
+ * validation (bad verdict / missing reason /
14
+ * bad winning_block_id); 409 on already-reviewed
15
+ *
16
+ * Run: node --import=tsx/esm --test src/routes/__tests__/flags.test.ts
17
+ */
18
+ import { test, describe, before, after, beforeEach } from "node:test";
19
+ import assert from "node:assert/strict";
20
+ import fs from "node:fs";
21
+ import { WorkspaceDB } from "../../store/database.js";
22
+ import { startApiServer } from "../../api-server.js";
23
+ import { writePipelineFlag, markFlagPendingClarification } from "../../middleware/reflect/pipeline-flags.js";
24
+ const TEST_DB = "/tmp/wmcs_flags_route_test.db";
25
+ let db;
26
+ let raw;
27
+ let server;
28
+ let baseUrl;
29
+ function cleanFiles() {
30
+ for (const s of ["", "-wal", "-shm"]) {
31
+ try {
32
+ if (fs.existsSync(TEST_DB + s))
33
+ fs.unlinkSync(TEST_DB + s);
34
+ }
35
+ catch { /* ignore */ }
36
+ }
37
+ }
38
+ before(async () => {
39
+ cleanFiles();
40
+ db = new WorkspaceDB(TEST_DB);
41
+ await db.init();
42
+ raw = db["db"];
43
+ server = startApiServer(db, undefined, 0);
44
+ await new Promise((resolve) => server.once("listening", resolve));
45
+ const addr = server.address();
46
+ baseUrl = `http://localhost:${addr.port}`;
47
+ });
48
+ after(() => {
49
+ server.close();
50
+ try {
51
+ db["db"]?.close();
52
+ }
53
+ catch { /* ignore */ }
54
+ cleanFiles();
55
+ });
56
+ beforeEach(() => {
57
+ raw.pragma("foreign_keys = OFF");
58
+ raw.exec(`DELETE FROM pipeline_flags`);
59
+ raw.exec(`DELETE FROM relations`);
60
+ raw.exec(`DELETE FROM blocks`);
61
+ raw.pragma("foreign_keys = ON");
62
+ });
63
+ function mkBlock(label, opts = {}) {
64
+ return db.createBlock({
65
+ label, type: opts.type ?? "fact", essence: `essence ${label}`,
66
+ content: { value: label }, concepts: opts.concepts ?? [], ttl: "permanent",
67
+ });
68
+ }
69
+ function writeFlag(a, b, flag_type = "atomic_dup_candidate") {
70
+ return writePipelineFlag(raw, {
71
+ flag_type, block_id_a: a, block_id_b: b,
72
+ criteria: { value_match: "x" }, scope_check: "unknown",
73
+ origin_writer: "stage_flag_dedup", origin_range_id: null,
74
+ });
75
+ }
76
+ // ─── GET summary + list ─────────────────────────────────────────────────────────
77
+ describe("GET /api/flags/summary + /api/flags", () => {
78
+ test("summary counts total + unreviewed + by_type", async () => {
79
+ const a = mkBlock("sum_a");
80
+ const b = mkBlock("sum_b");
81
+ writeFlag(a.id, b.id, "atomic_dup_candidate");
82
+ writeFlag(a.id, b.id, "island_candidate");
83
+ const res = await fetch(`${baseUrl}/api/flags/summary`);
84
+ assert.equal(res.status, 200);
85
+ const json = await res.json();
86
+ assert.equal(json.total, 2);
87
+ assert.equal(json.unreviewed, 2);
88
+ assert.ok(Array.isArray(json.by_type));
89
+ });
90
+ test("list returns all flags, count matches", async () => {
91
+ const a = mkBlock("list_a");
92
+ const b = mkBlock("list_b");
93
+ writeFlag(a.id, b.id);
94
+ const res = await fetch(`${baseUrl}/api/flags`);
95
+ const json = await res.json();
96
+ assert.equal(json.count, 1);
97
+ assert.equal(json.flags.length, 1);
98
+ });
99
+ test("agent-pending renders owner-unknown flags as plain questions (no ids/schema)", async () => {
100
+ const owned = mkBlock("customer-c_decision_redis", { type: "decision" });
101
+ const orphan = mkBlock("unspecified-project_decision_redis", { type: "decision" });
102
+ const id = writePipelineFlag(raw, {
103
+ flag_type: "cross_arc_dup_candidate",
104
+ block_id_a: owned.id, block_id_b: orphan.id,
105
+ criteria: { decision: "flag_for_review" },
106
+ scope_check: "unknown", origin_writer: "stage_d_resolve", origin_range_id: null,
107
+ });
108
+ markFlagPendingClarification(raw, { flag_id: id, reason: "owner unknown β€” routed to agent" });
109
+ const res = await fetch(`${baseUrl}/api/flags/agent-pending`);
110
+ assert.equal(res.status, 200);
111
+ const json = await res.json();
112
+ assert.equal(json.count, 1);
113
+ const f = json.flags[0];
114
+ assert.equal(f.id, id);
115
+ assert.match(f.question, /same thing/i); // a plain question, not a verdict form
116
+ assert.match(f.question, /ask the user/i); // the escalation affordance
117
+ assert.equal(f.you_are_recording.owner, "customer-c"); // owner from label, in plain terms
118
+ assert.equal(f.existing_uncertain.owner, "unspecified-project");
119
+ // No raw flag schema leaked to the agent surface
120
+ assert.equal(f.block_id_a, undefined);
121
+ assert.equal(f.scope_check, undefined);
122
+ });
123
+ test("agent-pending excludes flags still in the reviewer queue (not yet routed)", async () => {
124
+ const a = mkBlock("notrouted_a");
125
+ const b = mkBlock("notrouted_b");
126
+ writeFlag(a.id, b.id); // unreviewed, verdict NULL β†’ reviewer's queue, not the agent's
127
+ const res = await fetch(`${baseUrl}/api/flags/agent-pending`);
128
+ const json = await res.json();
129
+ assert.equal(json.count, 0);
130
+ });
131
+ test("list filters by flag_type", async () => {
132
+ const a = mkBlock("ft_a");
133
+ const b = mkBlock("ft_b");
134
+ writeFlag(a.id, b.id, "atomic_dup_candidate");
135
+ writeFlag(a.id, b.id, "island_candidate");
136
+ const res = await fetch(`${baseUrl}/api/flags?flag_type=island_candidate`);
137
+ const json = await res.json();
138
+ assert.equal(json.count, 1);
139
+ assert.equal(json.flags[0].flag_type, "island_candidate");
140
+ });
141
+ test("list filters by reviewed=false (unreviewed only)", async () => {
142
+ const a = mkBlock("rv_a");
143
+ const b = mkBlock("rv_b");
144
+ const f1 = writeFlag(a.id, b.id, "atomic_dup_candidate");
145
+ writeFlag(a.id, b.id, "island_candidate");
146
+ // Review one
147
+ raw.prepare(`UPDATE pipeline_flags SET reviewed_at='2026-01-01', review_verdict='leave' WHERE id=?`).run(f1);
148
+ const res = await fetch(`${baseUrl}/api/flags?reviewed=false`);
149
+ const json = await res.json();
150
+ assert.equal(json.count, 1, "only the unreviewed flag");
151
+ });
152
+ });
153
+ // ─── GET :id ──────────────────────────────────────────────────────────────────
154
+ describe("GET /api/flags/:id", () => {
155
+ test("returns flag + both blocks embedded", async () => {
156
+ const a = mkBlock("det_a");
157
+ const b = mkBlock("det_b");
158
+ const id = writeFlag(a.id, b.id);
159
+ const res = await fetch(`${baseUrl}/api/flags/${id}`);
160
+ assert.equal(res.status, 200);
161
+ const json = await res.json();
162
+ assert.equal(json.flag.id, id);
163
+ assert.equal(json.block_a.label, "det_a");
164
+ assert.equal(json.block_b.label, "det_b");
165
+ });
166
+ test("404 for unknown id", async () => {
167
+ const res = await fetch(`${baseUrl}/api/flags/pfl_does_not_exist`);
168
+ assert.equal(res.status, 404);
169
+ });
170
+ });
171
+ // ─── POST :id/review ────────────────────────────────────────────────────────────
172
+ describe("POST /api/flags/:id/review", () => {
173
+ test("verdict-only (no execute) writes verdict, no graph change", async () => {
174
+ const a = mkBlock("vo_a");
175
+ const b = mkBlock("vo_b");
176
+ const id = writeFlag(a.id, b.id);
177
+ const res = await fetch(`${baseUrl}/api/flags/${id}/review`, {
178
+ method: "POST",
179
+ headers: { "content-type": "application/json" },
180
+ body: JSON.stringify({ verdict: "leave", reason: "different scope" }),
181
+ });
182
+ assert.equal(res.status, 200);
183
+ const json = await res.json();
184
+ assert.equal(json.verdict, "leave");
185
+ assert.equal(json.action_taken, "none");
186
+ // Block still active
187
+ assert.notEqual(db.getBlock(b.id).status, "archived");
188
+ });
189
+ test("merge + execute archives loser + wires supersedes", async () => {
190
+ const winner = mkBlock("mx_winner");
191
+ const loser = mkBlock("mx_loser");
192
+ const id = writeFlag(winner.id, loser.id);
193
+ const res = await fetch(`${baseUrl}/api/flags/${id}/review`, {
194
+ method: "POST",
195
+ headers: { "content-type": "application/json" },
196
+ body: JSON.stringify({ verdict: "merge", reason: "same entity", execute: true, winning_block_id: winner.id }),
197
+ });
198
+ assert.equal(res.status, 200);
199
+ const json = await res.json();
200
+ assert.equal(json.action_taken, "archived_loser_and_wired_superseded_by");
201
+ assert.equal(db.getBlock(loser.id).status, "archived");
202
+ const rel = raw.prepare(`SELECT * FROM relations WHERE source_id=? AND target_id=? AND type='supersedes'`).get(winner.id, loser.id);
203
+ assert.ok(rel, "supersedes relation winner→loser exists");
204
+ });
205
+ test("400 on invalid verdict", async () => {
206
+ const a = mkBlock("iv_a");
207
+ const b = mkBlock("iv_b");
208
+ const id = writeFlag(a.id, b.id);
209
+ const res = await fetch(`${baseUrl}/api/flags/${id}/review`, {
210
+ method: "POST", headers: { "content-type": "application/json" },
211
+ body: JSON.stringify({ verdict: "frobnicate", reason: "x" }),
212
+ });
213
+ assert.equal(res.status, 400);
214
+ });
215
+ test("400 on missing reason", async () => {
216
+ const a = mkBlock("mr_a");
217
+ const b = mkBlock("mr_b");
218
+ const id = writeFlag(a.id, b.id);
219
+ const res = await fetch(`${baseUrl}/api/flags/${id}/review`, {
220
+ method: "POST", headers: { "content-type": "application/json" },
221
+ body: JSON.stringify({ verdict: "leave" }),
222
+ });
223
+ assert.equal(res.status, 400);
224
+ });
225
+ test("400 when merge+execute but winning_block_id not a candidate", async () => {
226
+ const a = mkBlock("bw_a");
227
+ const b = mkBlock("bw_b");
228
+ const id = writeFlag(a.id, b.id);
229
+ const res = await fetch(`${baseUrl}/api/flags/${id}/review`, {
230
+ method: "POST", headers: { "content-type": "application/json" },
231
+ body: JSON.stringify({ verdict: "merge", reason: "x", execute: true, winning_block_id: "blk_bogus" }),
232
+ });
233
+ assert.equal(res.status, 400);
234
+ // Neither block archived
235
+ assert.notEqual(db.getBlock(a.id).status, "archived");
236
+ assert.notEqual(db.getBlock(b.id).status, "archived");
237
+ });
238
+ test("409 on already-reviewed flag", async () => {
239
+ const a = mkBlock("ar_a");
240
+ const b = mkBlock("ar_b");
241
+ const id = writeFlag(a.id, b.id);
242
+ raw.prepare(`UPDATE pipeline_flags SET reviewed_at='2026-01-01', review_verdict='leave' WHERE id=?`).run(id);
243
+ const res = await fetch(`${baseUrl}/api/flags/${id}/review`, {
244
+ method: "POST", headers: { "content-type": "application/json" },
245
+ body: JSON.stringify({ verdict: "merge", reason: "x" }),
246
+ });
247
+ assert.equal(res.status, 409);
248
+ });
249
+ test("404 review on unknown flag", async () => {
250
+ const res = await fetch(`${baseUrl}/api/flags/pfl_nope/review`, {
251
+ method: "POST", headers: { "content-type": "application/json" },
252
+ body: JSON.stringify({ verdict: "leave", reason: "x" }),
253
+ });
254
+ assert.equal(res.status, 404);
255
+ });
256
+ });
257
+ //# sourceMappingURL=flags.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flags.test.js","sourceRoot":"","sources":["../../../src/routes/__tests__/flags.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=models-catalog.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-catalog.test.d.ts","sourceRoot":"","sources":["../../../src/routes/__tests__/models-catalog.test.ts"],"names":[],"mappings":""}