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,266 @@
1
+ // ═══════════════════════════════════════════════════════════════════════════════
2
+ // Recognition Layer — STEP 1: THE DESCRIBER (root description maintainer)
3
+ // ═══════════════════════════════════════════════════════════════════════════════
4
+ //
5
+ // Design: docs/PIPELINE-RECOGNITION-LAYER-DESIGN.md §3 + §6.
6
+ //
7
+ // JOB: give every project ROOT a SURFACE description — "what this project is
8
+ // about" = DOMAIN + OWNER, one line, signpost-not-textbook. This is the FUEL the
9
+ // recognizer (step 2, not built yet) compares new knowledge against. The
10
+ // recognizer only READS descriptions; the DESCRIBER is the sole maintainer
11
+ // (Rule 5 producer split — the only other writer is the create-path's initial
12
+ // essence). The recognizer NEVER writes descriptions.
13
+ //
14
+ // WHY a separate async worker (NOT folded into Stage AUDIT): AUDIT's contract is
15
+ // "no LLM, no mutate — flag only" (stage-audit-graph.ts). The describer DOES
16
+ // call the LLM and DOES write the root's essence, so it mirrors the flag-REVIEWER
17
+ // pattern (async LLM worker that mutates), not AUDIT. Default OFF
18
+ // (NODEDEX_DESCRIBER_ENABLED=on) so upgrading never silently starts LLM spend.
19
+ //
20
+ // LAZY (cost): only (re)describe a root when it's worth it — never described, OR
21
+ // grew by >= growthThreshold members since the last describe (tracked via
22
+ // content.last_described_member_count). Bounded per tick (maxRootsPerTick).
23
+ //
24
+ // Meaning-first: the description is the root's SCOPE identity (domain + owner) —
25
+ // NOT the leaf unique{} CLAIM identity. Surface only: the members ARE the
26
+ // contents; the description is a signpost, it does not enumerate them.
27
+ import { intFromEnv } from "./config.js";
28
+ import { getLLMProvider } from "../../engine/providers/index.js";
29
+ import { budgetTripped } from "./cost-guard.js";
30
+ // ─── Config (env-controlled; all have safe defaults) ────────────────────────────
31
+ function describerEnabled() {
32
+ // Default ON (agent-facing root signposts — locked-on per release decision); set =off for dev/test.
33
+ return (process.env.NODEDEX_DESCRIBER_ENABLED ?? "").toLowerCase() !== "off";
34
+ }
35
+ function describerIntervalMs() {
36
+ return intFromEnv("NODEDEX_DESCRIBER_INTERVAL_MS", 1_800_000); // 30 min (slow background)
37
+ }
38
+ function minMembers() {
39
+ return intFromEnv("NODEDEX_DESCRIBER_MIN_MEMBERS", 2); // a 1-member root has no real "domain" yet
40
+ }
41
+ function growthThreshold() {
42
+ return intFromEnv("NODEDEX_DESCRIBER_GROWTH", 5); // re-describe after +5 members
43
+ }
44
+ function maxRootsPerTick() {
45
+ return intFromEnv("NODEDEX_DESCRIBER_MAX_PER_TICK", 3); // bound LLM calls per tick
46
+ }
47
+ function maxMembersInPrompt() {
48
+ return intFromEnv("NODEDEX_DESCRIBER_MAX_MEMBERS_IN_PROMPT", 40); // bound input tokens
49
+ }
50
+ /** Returns the reason a root needs (re)describing, or false. Pure. */
51
+ export function rootNeedsDescription(inp, opts) {
52
+ if (inp.memberCount < opts.minMembers)
53
+ return false;
54
+ if (inp.lastDescribedCount === null)
55
+ return "never";
56
+ if (inp.memberCount - inp.lastDescribedCount >= opts.growthThreshold)
57
+ return "grew";
58
+ return false;
59
+ }
60
+ export function selectRootsNeedingDescription(inputs, opts) {
61
+ const out = [];
62
+ for (const inp of inputs) {
63
+ const r = rootNeedsDescription(inp, opts);
64
+ if (r)
65
+ out.push({ ...inp, reason: r });
66
+ }
67
+ return out;
68
+ }
69
+ // ─── Prompt + schema ────────────────────────────────────────────────────────────
70
+ export const DESCRIBE_ROOT_PROMPT = `You are writing a one-line SURFACE description of a project root in a knowledge graph.
71
+ Its ONLY job: let a later step decide "does a new piece of knowledge belong in THIS project?"
72
+
73
+ Capture TWO things in one line:
74
+ 1. DOMAIN — what this project is about (the topic).
75
+ 2. OWNER / SCOPE — whose it is (a client/customer name, a system name, or "personal")
76
+ IF the members reveal one. Omit only if genuinely unknown.
77
+
78
+ RULES:
79
+ - SIGNPOST, not table-of-contents. Do NOT list the individual members/decisions/facts.
80
+ - Surface only. ONE line, <= 140 characters.
81
+ - Base it ONLY on the MEMBERS shown. Never invent a domain or owner the members don't evidence.
82
+ - Plain language. No label syntax, no underscores.`;
83
+ const DESCRIBE_ROOT_SCHEMA = {
84
+ type: "object",
85
+ properties: { description: { type: "string" } },
86
+ required: ["description"],
87
+ };
88
+ export function buildDescribeInput(root, members, cap) {
89
+ const head = `PROJECT ROOT label: ${root.label}\n` +
90
+ `Current description (may be stale/generic): "${root.essence ?? ""}"\n\n` +
91
+ `MEMBERS (${members.length} total${members.length > cap ? `, showing ${cap}` : ""}):`;
92
+ const lines = members.slice(0, cap).map((m) => {
93
+ let concepts = [];
94
+ try {
95
+ const p = JSON.parse(m.concepts ?? "[]");
96
+ if (Array.isArray(p))
97
+ concepts = p;
98
+ }
99
+ catch { /* tolerate */ }
100
+ const c = concepts.length ? ` (${concepts.slice(0, 6).join(", ")})` : "";
101
+ return `- [${m.type}] ${m.essence ?? ""}${c}`;
102
+ });
103
+ return `${head}\n${lines.join("\n")}`;
104
+ }
105
+ // ─── LLM describe (one root) ────────────────────────────────────────────────────
106
+ export async function describeRoot(provider, root, members) {
107
+ const userInput = buildDescribeInput(root, members, maxMembersInPrompt());
108
+ const r = await provider.generateStructured(DESCRIBE_ROOT_PROMPT, userInput, DESCRIBE_ROOT_SCHEMA, { thinkingBudget: 512, maxOutputTokens: 512 });
109
+ const desc = r.result?.description?.trim();
110
+ return {
111
+ description: desc && desc.length > 0 ? desc : null,
112
+ rateLimited: r.rateLimited,
113
+ usage: r.usage,
114
+ };
115
+ }
116
+ /**
117
+ * One describer tick: find roots needing a (re)description, describe up to
118
+ * `limit` of them, write essence + the lazy marker. Async (LLM). Bounded.
119
+ */
120
+ export async function runDescriberTick(opts) {
121
+ const t0 = Date.now();
122
+ const result = {
123
+ roots_total: 0, roots_needing: 0, described: 0,
124
+ llm_calls: 0, rate_limited: 0, errors: 0, wall_ms: 0,
125
+ };
126
+ const limit = opts.limit ?? maxRootsPerTick();
127
+ let all;
128
+ try {
129
+ all = opts.db.getAllBlocks();
130
+ }
131
+ catch (e) {
132
+ result.errors += 1;
133
+ result.wall_ms = Date.now() - t0;
134
+ console.warn(`[describer] getAllBlocks threw: ${e?.message ?? e}`);
135
+ return result;
136
+ }
137
+ const roots = all.filter((b) => b.type === "project");
138
+ result.roots_total = roots.length;
139
+ // members grouped by their project_id (one pass)
140
+ const membersByRoot = new Map();
141
+ for (const b of all) {
142
+ if (b.type === "project")
143
+ continue;
144
+ const pid = b.project_id;
145
+ if (!pid)
146
+ continue;
147
+ let arr = membersByRoot.get(pid);
148
+ if (!arr) {
149
+ arr = [];
150
+ membersByRoot.set(pid, arr);
151
+ }
152
+ arr.push(b);
153
+ }
154
+ const inputs = roots.map((root) => {
155
+ let lastDescribedCount = null;
156
+ try {
157
+ const c = JSON.parse(root.content ?? "{}");
158
+ const v = c?.last_described_member_count;
159
+ if (typeof v === "number" && Number.isFinite(v))
160
+ lastDescribedCount = v;
161
+ }
162
+ catch { /* tolerate */ }
163
+ return { root, memberCount: membersByRoot.get(root.id)?.length ?? 0, lastDescribedCount };
164
+ });
165
+ const candidates = selectRootsNeedingDescription(inputs, {
166
+ minMembers: minMembers(),
167
+ growthThreshold: growthThreshold(),
168
+ });
169
+ result.roots_needing = candidates.length;
170
+ for (const cand of candidates.slice(0, limit)) {
171
+ const members = membersByRoot.get(cand.root.id) ?? [];
172
+ if (members.length === 0)
173
+ continue; // defensive (selection gates on minMembers>=1)
174
+ try {
175
+ result.llm_calls += 1;
176
+ const { description, rateLimited } = await describeRoot(opts.provider, cand.root, members);
177
+ if (rateLimited) {
178
+ result.rate_limited += 1;
179
+ continue;
180
+ }
181
+ if (!description)
182
+ continue;
183
+ // Merge the lazy marker into existing content; write essence + enriched_at.
184
+ let content = {};
185
+ try {
186
+ const c = JSON.parse(cand.root.content ?? "{}");
187
+ if (c && typeof c === "object")
188
+ content = c;
189
+ }
190
+ catch { /* tolerate */ }
191
+ content.last_described_member_count = cand.memberCount;
192
+ opts.db.updateBlock(cand.root.id, { essence: description, content, enriched_at: new Date().toISOString() }, `describer: ${cand.reason} (members=${cand.memberCount})`, "describer");
193
+ result.described += 1;
194
+ }
195
+ catch (e) {
196
+ result.errors += 1;
197
+ console.warn(`[describer] root ${cand.root.label} threw: ${e?.message ?? e}`);
198
+ }
199
+ }
200
+ result.wall_ms = Date.now() - t0;
201
+ return result;
202
+ }
203
+ // ─── Timer wrapper (env-gated, default OFF — mirrors flag-reviewer-startup) ──────
204
+ let _handle = null;
205
+ let _inFlight = false;
206
+ async function tick(db) {
207
+ if (_inFlight) {
208
+ console.log("[describer] tick still running, skipping this interval");
209
+ return;
210
+ }
211
+ _inFlight = true;
212
+ try {
213
+ // Cost breaker (production gap 2, Phase B): self-gate before spending.
214
+ const budget = await budgetTripped();
215
+ if (budget?.tripped) {
216
+ console.warn(`[describer] tick skipped — cost breaker: ${budget.reason}`);
217
+ return;
218
+ }
219
+ const provider = getLLMProvider();
220
+ if (!provider.isAvailable()) {
221
+ console.warn("[describer] provider unavailable — skipping tick");
222
+ return;
223
+ }
224
+ const res = await runDescriberTick({ db, provider });
225
+ if (res.described > 0 || res.errors > 0 || res.rate_limited > 0) {
226
+ console.log(`[describer] tick: roots=${res.roots_total} needing=${res.roots_needing} ` +
227
+ `described=${res.described} llm=${res.llm_calls} rate_limited=${res.rate_limited} ` +
228
+ `errors=${res.errors} wall_ms=${res.wall_ms}`);
229
+ }
230
+ }
231
+ catch (e) {
232
+ console.warn(`[describer] tick threw: ${e?.message ?? e}`);
233
+ }
234
+ finally {
235
+ _inFlight = false;
236
+ }
237
+ }
238
+ /** Start the describer timer. Idempotent; returns true if started. Default OFF. */
239
+ export function startDescriberTimer(db) {
240
+ if (!describerEnabled()) {
241
+ console.log("[describer] disabled (set NODEDEX_DESCRIBER_ENABLED=on to enable)");
242
+ return false;
243
+ }
244
+ if (_handle !== null)
245
+ return false;
246
+ const intervalMs = describerIntervalMs();
247
+ console.log(`[describer] starting: interval=${intervalMs}ms`);
248
+ _handle = setInterval(() => {
249
+ tick(db).catch((e) => console.warn(`[describer] interval tick rejected: ${e?.message ?? e}`));
250
+ }, intervalMs);
251
+ if (typeof _handle.unref === "function")
252
+ _handle.unref();
253
+ return true;
254
+ }
255
+ /** Stop the describer timer. Used on shutdown + by tests. */
256
+ export function stopDescriberTimer() {
257
+ if (_handle !== null) {
258
+ clearInterval(_handle);
259
+ _handle = null;
260
+ }
261
+ }
262
+ /** For tests only — reports whether the timer is currently running. */
263
+ export function _isDescriberTimerRunningForTests() {
264
+ return _handle !== null;
265
+ }
266
+ //# sourceMappingURL=describe-roots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe-roots.js","sourceRoot":"","sources":["../../../src/middleware/reflect/describe-roots.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { WorkspaceDB } from "../../store/database.js";
2
+ /**
3
+ * Start the flag-reviewer interval timer. Idempotent — calling twice after
4
+ * the first call is a no-op. Returns true if the timer started, false if
5
+ * disabled or already running.
6
+ */
7
+ export declare function startFlagReviewer(db: WorkspaceDB): boolean;
8
+ /**
9
+ * Stop the flag-reviewer interval timer. Used on shutdown + by tests.
10
+ */
11
+ export declare function stopFlagReviewer(): void;
12
+ /**
13
+ * For tests only — reports whether the timer is currently running.
14
+ */
15
+ export declare function _isFlagReviewerRunningForTests(): boolean;
16
+ //# sourceMappingURL=flag-reviewer-startup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flag-reviewer-startup.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/flag-reviewer-startup.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAuD3D;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAmB1D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC;AAED;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,OAAO,CAExD"}
@@ -0,0 +1,107 @@
1
+ // ═══════════════════════════════════════════════════════════════════════════════
2
+ // DEBT 5 Slice 2 Sub-step 2.2 — FLAG REVIEWER STARTUP / WORKER WRAPPER
3
+ // ═══════════════════════════════════════════════════════════════════════════════
4
+ //
5
+ // Env-gated setInterval wrapper around runFlagReviewerTick (flag-reviewer.ts).
6
+ // Pattern reference: arc-inactivity-timer.ts — same shape (singleton handle,
7
+ // in-flight guard, unref so tests/shutdown aren't blocked, idempotent start/
8
+ // stop, test inspector).
9
+ //
10
+ // Worker runs ONLY when NODEDEX_FLAG_REVIEWER_ENABLED=on. Default off so
11
+ // upgrading does not silently start LLM spend.
12
+ //
13
+ // Per-tick policy:
14
+ // - One tick at a time (in-flight guard) — if a tick is still running
15
+ // when next interval fires, skip and log.
16
+ // - Tick errors do NOT crash the process (try/catch around runReviewerTick).
17
+ // - Each tick logs reviewed-count / verdicts / cost.
18
+ import { getLLMProvider } from "../../engine/providers/index.js";
19
+ import { runFlagReviewerTick } from "./flag-reviewer.js";
20
+ import { budgetTripped } from "./cost-guard.js";
21
+ import { intFromEnv } from "./config.js";
22
+ let _intervalHandle = null;
23
+ let _inFlight = false;
24
+ function flagReviewerEnabled() {
25
+ // Default ON (self-cleaning loop locked-on — validated 2026-06-20); set =off for dev/test.
26
+ return (process.env.NODEDEX_FLAG_REVIEWER_ENABLED ?? "").toLowerCase() !== "off";
27
+ }
28
+ function getIntervalMs() {
29
+ return intFromEnv("NODEDEX_FLAG_REVIEWER_INTERVAL_MS", 300_000); // default 5 min
30
+ }
31
+ async function tick(db) {
32
+ if (_inFlight) {
33
+ console.log("[flag-reviewer] tick still running, skipping this interval");
34
+ return;
35
+ }
36
+ _inFlight = true;
37
+ try {
38
+ // Cost breaker (production gap 2, Phase B): this autonomous worker self-gates
39
+ // on the budget before spending. No-op when no budget is configured.
40
+ const budget = await budgetTripped();
41
+ if (budget?.tripped) {
42
+ console.warn(`[flag-reviewer] tick skipped — cost breaker: ${budget.reason}`);
43
+ return;
44
+ }
45
+ const provider = getLLMProvider();
46
+ if (!provider.isAvailable()) {
47
+ console.warn("[flag-reviewer] provider unavailable — skipping tick");
48
+ return;
49
+ }
50
+ const result = await runFlagReviewerTick({ db, provider });
51
+ if (result.reviewed === 0 && result.errors === 0) {
52
+ // Quiet skip — common case (no pending flags). Don't spam the log.
53
+ return;
54
+ }
55
+ const costStr = result.cost_usd === null ? "?" : `$${result.cost_usd.toFixed(4)}`;
56
+ console.log(`[flag-reviewer] tick: reviewed=${result.reviewed} ` +
57
+ `verdicts={merge:${result.verdicts.merge}, leave:${result.verdicts.leave}, split:${result.verdicts.split}} ` +
58
+ `actions=${result.actions_executed} routed=${result.routed_to_agent} errors=${result.errors} cost=${costStr}`);
59
+ }
60
+ catch (e) {
61
+ console.warn(`[flag-reviewer] tick threw: ${e?.message ?? e}`);
62
+ }
63
+ finally {
64
+ _inFlight = false;
65
+ }
66
+ }
67
+ /**
68
+ * Start the flag-reviewer interval timer. Idempotent — calling twice after
69
+ * the first call is a no-op. Returns true if the timer started, false if
70
+ * disabled or already running.
71
+ */
72
+ export function startFlagReviewer(db) {
73
+ if (!flagReviewerEnabled()) {
74
+ console.log("[flag-reviewer] disabled (set NODEDEX_FLAG_REVIEWER_ENABLED=on to enable)");
75
+ return false;
76
+ }
77
+ if (_intervalHandle !== null)
78
+ return false;
79
+ const intervalMs = getIntervalMs();
80
+ // Default ON (validated: clear-case auto-merge is correct + recoverable; weak evidence is routed, not merged); set =off for dev/test.
81
+ const autoMerge = (process.env.NODEDEX_FLAG_AUTO_MERGE ?? "on").toLowerCase() !== "off";
82
+ console.log(`[flag-reviewer] starting: interval=${intervalMs}ms auto_merge=${autoMerge ? "ON (Level 2)" : "OFF (Level 1 verdict-only)"}`);
83
+ _intervalHandle = setInterval(() => {
84
+ tick(db).catch((e) => {
85
+ console.warn(`[flag-reviewer] interval-fired tick rejected: ${e?.message ?? e}`);
86
+ });
87
+ }, intervalMs);
88
+ if (typeof _intervalHandle.unref === "function")
89
+ _intervalHandle.unref();
90
+ return true;
91
+ }
92
+ /**
93
+ * Stop the flag-reviewer interval timer. Used on shutdown + by tests.
94
+ */
95
+ export function stopFlagReviewer() {
96
+ if (_intervalHandle !== null) {
97
+ clearInterval(_intervalHandle);
98
+ _intervalHandle = null;
99
+ }
100
+ }
101
+ /**
102
+ * For tests only — reports whether the timer is currently running.
103
+ */
104
+ export function _isFlagReviewerRunningForTests() {
105
+ return _intervalHandle !== null;
106
+ }
107
+ //# sourceMappingURL=flag-reviewer-startup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flag-reviewer-startup.js","sourceRoot":"","sources":["../../../src/middleware/reflect/flag-reviewer-startup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type Database from "better-sqlite3";
2
+ import type { WorkspaceDB } from "../../store/database.js";
3
+ import type { LLMProvider } from "../../engine/ai-provider.js";
4
+ import type { PipelineFlag, ReviewerContext, ReviewerVerdictOutput, BlockReviewSnapshot, FlagReviewerTickResult } from "./types.js";
5
+ /** Load a BlockReviewSnapshot from the blocks table. Returns null if the block
6
+ * was archived/deleted between flag-write and reviewer-tick (we don't
7
+ * re-resurrect — the flag becomes stale, reviewer skips it). */
8
+ export declare function loadBlockSnapshot(db: Database.Database, blockId: string): BlockReviewSnapshot | null;
9
+ /** Walk part_of relations up to the project root. Returns the chain of LABELS
10
+ * from root → block. Bounded depth (default 8) — graph cycles or pathological
11
+ * depths return whatever we walked. */
12
+ export declare function loadScopeChain(db: Database.Database, blockId: string, maxDepth?: number): string[];
13
+ export declare function buildReviewerContext(db: Database.Database, flag: PipelineFlag): ReviewerContext | null;
14
+ export declare function buildReviewerInput(ctx: ReviewerContext): string;
15
+ export declare function callReviewerLLM(provider: LLMProvider, ctx: ReviewerContext): Promise<{
16
+ result: ReviewerVerdictOutput | null;
17
+ model?: string;
18
+ rateLimited: boolean;
19
+ }>;
20
+ /**
21
+ * Execute a merge verdict — wire supersedes (winner → loser) AND archive the
22
+ * loser so the duplicate actually collapses.
23
+ *
24
+ * ⚠ DESIGN NOTE — relaxes the "facts permanent on supersede" rule for the
25
+ * confirmed-duplicate-merge case (surfaced to user 2026-05-31):
26
+ *
27
+ * database.ts:1192-1199 auto-archives a supersede TARGET only when it's a
28
+ * 'blueprint' or 'decision' — facts/constraints/dead_ends/questions are
29
+ * treated as permanent historical records (a contradicted fact stays visible).
30
+ * That rule is correct for GENERIC supersede ("B replaces A's claim; both are
31
+ * history"). It is WRONG for a reviewer-confirmed DUPLICATE, which is a
32
+ * different operation: "A and B are the SAME thing captured twice — collapse
33
+ * to one." A duplicate fact is not two historical records; keeping both is
34
+ * noise, not history. Slice 1's atomic_dup_candidate is PRECISELY duplicate
35
+ * facts (same source_excerpt + same primary_value), so relying on the
36
+ * type-conditional supersede-archive would leave every confirmed fact-dup
37
+ * un-merged.
38
+ *
39
+ * Therefore executeMerge archives the loser DIRECTLY (db.archiveBlock) instead
40
+ * of relying on the supersede side-effect. Charter Rule 2 honored: archive
41
+ * (recoverable via /api/blocks), never delete. Containment: this only runs at
42
+ * Level 2 (NODEDEX_FLAG_AUTO_MERGE=on, default OFF) on a high-confidence
43
+ * reviewer 'merge' verdict — both opt-in gates.
44
+ *
45
+ * Returns the action_taken value to write to the flag row.
46
+ */
47
+ export declare function executeMerge(db: WorkspaceDB, winnerBlockId: string, loserBlockId: string): 'archived_loser_and_wired_superseded_by' | 'none';
48
+ export interface RunReviewerTickOpts {
49
+ db: WorkspaceDB;
50
+ provider: LLMProvider;
51
+ /** Override the env-controlled auto-merge gate (used by REST manual-review
52
+ * endpoint, which passes execute=true explicitly). */
53
+ forceAutoMerge?: boolean;
54
+ }
55
+ /**
56
+ * One reviewer tick: read up to N pending flags, review each, write verdicts.
57
+ * Returns per-tick result for telemetry + log.
58
+ *
59
+ * This is the SINGLE PUBLIC entry point — flag-reviewer-startup.ts wraps it
60
+ * in setInterval, REST /api/flags/:id/review (Sub-step 2.4) can also invoke
61
+ * it synchronously for a specific flag (via filtered getPendingFlags +
62
+ * forceAutoMerge from request body).
63
+ *
64
+ * Per-flag failure is contained: errors increment the counter and the flag
65
+ * stays unreviewed (next tick picks it up). One bad flag does NOT crash the
66
+ * whole tick.
67
+ */
68
+ export declare function runFlagReviewerTick(opts: RunReviewerTickOpts): Promise<FlagReviewerTickResult>;
69
+ //# sourceMappingURL=flag-reviewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flag-reviewer.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/flag-reviewer.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EACV,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EAEvB,MAAM,YAAY,CAAC;AAsFpB;;kEAEkE;AAClE,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,GACd,mBAAmB,GAAG,IAAI,CAmC5B;AAED;;yCAEyC;AACzC,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,OAAO,EAAE,MAAM,EACf,QAAQ,SAAI,GACX,MAAM,EAAE,CAiBV;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,IAAI,EAAE,YAAY,GACjB,eAAe,GAAG,IAAI,CAgBxB;AAmBD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAgB/D;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,WAAW,EACrB,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC;IAAE,MAAM,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC,CAqBzF;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,YAAY,CAC1B,EAAE,EAAE,WAAW,EACf,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,wCAAwC,GAAG,MAAM,CA2DnD;AAID,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,WAAW,CAAC;IAChB,QAAQ,EAAE,WAAW,CAAC;IACtB;4DACwD;IACxD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,sBAAsB,CAAC,CAgKjC"}