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,351 @@
1
+ // api-server.ts — thin orchestrator. Creates the Express app, mounts all route
2
+ // modules, and handles startup recovery for the reflect queue.
3
+ // Reference: api-server.v1.ts (the original monolithic version, 3390 lines)
4
+ import express from "express";
5
+ import cors from "cors";
6
+ import { writeFileSync, existsSync } from "fs";
7
+ import { fileURLToPath } from "url";
8
+ import { homedir } from "os";
9
+ import path from "path";
10
+ import { reflectQueue, processReflectQueue, reflectPaused, setReflectPaused, spendPaused, setSpendPaused, startCreditAutoResume } from "./routes/state.js";
11
+ import { spendPauseFileExists, readSpendPauseReason } from "./middleware/reflect/cost-guard.js";
12
+ import { createBlocksRouter } from "./routes/blocks.js";
13
+ import { createRecallRouter } from "./routes/recall.js";
14
+ import { createReflectRouter } from "./routes/reflect.js";
15
+ import { createSessionRouter } from "./routes/session.js";
16
+ import { createWorkspaceRouter } from "./routes/workspace.js";
17
+ import { createAdminRouter } from "./routes/admin.js";
18
+ import { createInjectRouter } from "./routes/inject.js";
19
+ import { createChatProxyRouter } from "./routes/chat-proxy.js";
20
+ import { createQuarantineRouter } from "./routes/quarantine.js";
21
+ import { createConversationsRouter } from "./routes/conversations.js";
22
+ import { createFlagsRouter } from "./routes/flags.js";
23
+ import { createUsageRouter } from "./routes/usage.js";
24
+ import { createMcpHttpRouter } from "./routes/mcp-http.js";
25
+ import { startArcInactivityTimer, startBootArcSweep } from "./middleware/reflect/arc-inactivity-timer.js";
26
+ import { startFlagReviewer } from "./middleware/reflect/flag-reviewer-startup.js";
27
+ import { startStageAuditTimer } from "./middleware/reflect/stage-audit-graph.js";
28
+ import { startDescriberTimer } from "./middleware/reflect/describe-roots.js";
29
+ import { startProvenanceReviewerTimer } from "./middleware/reflect/provenance-reviewer.js";
30
+ import { requireAuth, defaultAuthExempt, resolveBindHost, apiTokenEnabled } from "./middleware/auth.js";
31
+ import { startBackupTimer } from "./store/backup.js";
32
+ import { startSchemaHealTimer } from "./middleware/reflect/schema-heal.js";
33
+ export function startApiServer(db, schedulerHealth, port = 3001, embeddings) {
34
+ const app = express();
35
+ app.use(cors());
36
+ // ─── Data directory ───────────────────────────────────────────────────────
37
+ const __filename_api = fileURLToPath(import.meta.url);
38
+ const __dirname_api = path.dirname(__filename_api);
39
+ const dataDir = path.resolve(__dirname_api, "../../data");
40
+ const serverStartFile = path.join(dataDir, "server_start.txt");
41
+ // Stamp the current server start time — gap mirror uses this as session boundary
42
+ try {
43
+ writeFileSync(serverStartFile, new Date().toISOString(), "utf8");
44
+ }
45
+ catch { /* non-fatal */ }
46
+ // Larger limit on the chat-proxy path — LLM message arrays exceed the 100kb default.
47
+ // Must precede the global json() so this path is parsed with the bigger cap.
48
+ app.use("/api/chat", express.json({ limit: "16mb" }));
49
+ app.use(express.json());
50
+ // ─── API auth middleware (security slice 1) ───────────────────────────────
51
+ // Whole-API token lock. Default OFF (NODEDEX_API_TOKEN unset) = open, and the
52
+ // localhost bind below is the protection — keeps the live dogfood loop + a
53
+ // naive install working. Set NODEDEX_API_TOKEN to require it on every /api/*
54
+ // read AND write (a memory graph is maximally sensitive; reads = exfiltration).
55
+ // Exempts /api/health (supervisors), /api/chat (BYO-key passthrough), /upgrade.
56
+ // This is the forward-compat seam for the future multi-tenant server — see
57
+ // middleware/auth.ts. Layered with the ADMIN_TOKEN gate below (which adds an
58
+ // extra lock on the destructive paths even when the API token is off).
59
+ app.use(requireAuth({ exempt: defaultAuthExempt }));
60
+ // ─── Admin auth middleware ────────────────────────────────────────────────
61
+ // Protects destructive/admin endpoints with NODEDEX_ADMIN_TOKEN env var.
62
+ // Read-only endpoints (GET /api/blocks, /api/tree, /api/recall-fast, etc.) stay open.
63
+ // If NODEDEX_ADMIN_TOKEN is not set, admin endpoints are unprotected (local dev default).
64
+ // Token accepted via: Authorization: Bearer <token> OR x-admin-token: <token>
65
+ const ADMIN_TOKEN = process.env.NODEDEX_ADMIN_TOKEN || "";
66
+ const ADMIN_PATHS = new Set([
67
+ "/api/admin/reembed-all",
68
+ "/api/admin/backup",
69
+ "/api/admin/config",
70
+ "/api/session/reset",
71
+ "/api/reflect/stats/reset",
72
+ "/api/reflect/pause",
73
+ "/api/reflect/resume",
74
+ ]);
75
+ app.use((req, res, next) => {
76
+ if (!ADMIN_TOKEN)
77
+ return next();
78
+ if (!ADMIN_PATHS.has(req.path))
79
+ return next();
80
+ const bearer = (req.headers["authorization"] || "").replace(/^Bearer\s+/i, "").trim();
81
+ const header = (req.headers["x-admin-token"] || "");
82
+ if (bearer === ADMIN_TOKEN || header === ADMIN_TOKEN)
83
+ return next();
84
+ res.status(401).json({ error: "Unauthorized — NODEDEX_ADMIN_TOKEN required" });
85
+ });
86
+ // ─── Mount all route modules ──────────────────────────────────────────────
87
+ app.use(createAdminRouter(db, schedulerHealth, embeddings));
88
+ app.use(createBlocksRouter(db));
89
+ app.use(createRecallRouter(db, embeddings));
90
+ app.use(createReflectRouter(db, embeddings));
91
+ app.use(createSessionRouter(db, dataDir));
92
+ app.use(createWorkspaceRouter(db, embeddings));
93
+ app.use(createInjectRouter(db, dataDir));
94
+ app.use(createChatProxyRouter(db, embeddings));
95
+ app.use(createQuarantineRouter(db));
96
+ app.use(createConversationsRouter(db));
97
+ app.use(createFlagsRouter(db));
98
+ app.use(createUsageRouter());
99
+ // Streamable-HTTP MCP transport at /mcp — lets a NETWORKED MCP client (e.g. a
100
+ // Dockerized host via host.docker.internal) use the tools when it can't spawn the
101
+ // stdio binary itself. Same tool surface as stdio; self-gated by the owner token.
102
+ // Needs embeddings to build the server (always provided by server.ts).
103
+ if (embeddings)
104
+ app.use(createMcpHttpRouter(db, embeddings));
105
+ // DEBT 5 Phase 10: inactivity safety net (server-side timer).
106
+ // Default OFF — opt-in via NODEDEX_ARC_INACTIVITY_ENABLED=on. No-op when
107
+ // off; checks for stale pass01_done turns when on (default every 60s,
108
+ // threshold 30 min idle). Idempotent — safe to call on each server start.
109
+ startArcInactivityTimer(db);
110
+ // Boot sweep: recover arcs a restart stranded mid-extraction (the auto-trigger
111
+ // is fire-and-forget, so a restart kills an in-flight extraction and leaves the
112
+ // turns pass01_done with no re-trigger). One-shot, ~90s after boot; gated on arc
113
+ // mode being on (NODEDEX_ARC_EXTRACTION=1), off-switch NODEDEX_ARC_BOOT_SWEEP=off.
114
+ startBootArcSweep(db);
115
+ // DEBT 5 Slice 2: enrichment-cycle workers (both default OFF, opt-in).
116
+ // Flag reviewer — consumes pipeline_flags, decides merge/leave/split.
117
+ // NODEDEX_FLAG_REVIEWER_ENABLED=on (+ NODEDEX_FLAG_AUTO_MERGE=on for
118
+ // Level 2 auto-archive). Default OFF = flags accumulate for manual
119
+ // inspection via GET /api/flags.
120
+ // Stage AUDIT — periodic graph-health scan writing flags.
121
+ // NODEDEX_AUDIT_ENABLED=on. Default OFF.
122
+ // Both idempotent — safe to call on each server start.
123
+ startFlagReviewer(db);
124
+ startStageAuditTimer(db);
125
+ // Recognition Layer step 1: the DESCRIBER — maintains a surface description
126
+ // (domain + owner) on each project root, the fuel the recognizer will compare
127
+ // new knowledge against (docs/PIPELINE-RECOGNITION-LAYER-DESIGN.md §3/§6).
128
+ // Async LLM worker (mirrors the reviewer, NOT flag-only AUDIT). Default OFF:
129
+ // NODEDEX_DESCRIBER_ENABLED=on.
130
+ startDescriberTimer(db);
131
+ // Gap ④(b): the PROVENANCE MEANING-REVIEWER — consumes the HARD provenance_mismatch
132
+ // flags the $0 detector wrote, judges grounded-or-fabricated by meaning, and
133
+ // (Level 2) corrects/demotes. Async LLM worker. Default OFF:
134
+ // NODEDEX_PROVENANCE_REVIEWER_ENABLED=on (+ NODEDEX_PROVENANCE_AUTO_ACT=on to mutate).
135
+ startProvenanceReviewerTimer(db);
136
+ // Ops gap 3: scheduled DB backups (store/backup.ts). DEFAULT ON ($0 +
137
+ // protective, unlike the LLM timers above); checkpoint-then-copy = consistent
138
+ // + encryption-preserving. NODEDEX_BACKUP_ENABLED=0 to disable.
139
+ startBackupTimer(db);
140
+ // Tier-1 LOCKED-ON ($0 deterministic): retroactively demote old mis-typed blocks
141
+ // (e.g. an insight with no implication but an observation IS a fact) that predate the
142
+ // save-time demote or slipped past it. The doc listed this as default-on but no timer
143
+ // was wired — this closes that gap. NODEDEX_SCHEMA_HEAL_ENABLED=off to disable.
144
+ startSchemaHealTimer(db);
145
+ // ─── Upgrade page ────────────────────────────────────────────────────────
146
+ // Served at /upgrade — users land here from 402 pro_required errors.
147
+ const LEMON_CHECKOUT = process.env.NODEDEX_CHECKOUT_URL || "https://nodedex.lemonsqueezy.com/checkout";
148
+ app.get("/upgrade", (_req, res) => {
149
+ res.setHeader("Content-Type", "text/html; charset=utf-8");
150
+ res.send(`<!DOCTYPE html>
151
+ <html lang="en">
152
+ <head>
153
+ <meta charset="UTF-8" />
154
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
155
+ <title>Nodedex Pro</title>
156
+ <style>
157
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
158
+ body {
159
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
160
+ background: #0d0d0d; color: #e8e8e8;
161
+ min-height: 100vh; display: flex; align-items: center; justify-content: center;
162
+ padding: 2rem;
163
+ }
164
+ .card {
165
+ background: #141414; border: 1px solid #2a2a2a; border-radius: 12px;
166
+ max-width: 540px; width: 100%; padding: 2.5rem;
167
+ }
168
+ .badge {
169
+ display: inline-block; background: #1a3a2a; color: #4ade80;
170
+ font-size: 0.7rem; font-weight: 700; letter-spacing: 0.08em;
171
+ text-transform: uppercase; padding: 0.25rem 0.6rem; border-radius: 99px;
172
+ margin-bottom: 1.25rem;
173
+ }
174
+ h1 { font-size: 1.75rem; font-weight: 700; margin-bottom: 0.5rem; }
175
+ .sub { color: #888; font-size: 0.95rem; margin-bottom: 2rem; line-height: 1.5; }
176
+ .features { list-style: none; margin-bottom: 2rem; }
177
+ .features li {
178
+ display: flex; align-items: flex-start; gap: 0.75rem;
179
+ padding: 0.6rem 0; border-bottom: 1px solid #1e1e1e; font-size: 0.9rem;
180
+ }
181
+ .features li:last-child { border-bottom: none; }
182
+ .check { color: #4ade80; font-size: 1rem; flex-shrink: 0; margin-top: 0.05rem; }
183
+ .desc { color: #aaa; font-size: 0.8rem; margin-top: 0.15rem; }
184
+ .cta {
185
+ display: block; width: 100%; padding: 0.85rem 1.5rem;
186
+ background: #16a34a; color: #fff; font-size: 1rem; font-weight: 600;
187
+ border: none; border-radius: 8px; cursor: pointer; text-align: center;
188
+ text-decoration: none; transition: background 0.15s;
189
+ }
190
+ .cta:hover { background: #15803d; }
191
+ .note { color: #555; font-size: 0.78rem; text-align: center; margin-top: 1rem; }
192
+ </style>
193
+ </head>
194
+ <body>
195
+ <div class="card">
196
+ <div class="badge">Pro Required</div>
197
+ <h1>Nodedex Pro</h1>
198
+ <p class="sub">
199
+ You hit a feature that requires a Pro license.<br />
200
+ Unlock the full pipeline and advanced tooling with one key.
201
+ </p>
202
+ <ul class="features">
203
+ <li>
204
+ <span class="check">&#10003;</span>
205
+ <div>
206
+ <div><strong>Pass 4 — Causal Wiring</strong></div>
207
+ <div class="desc">Automatically traces cause-effect chains across your entire knowledge graph.</div>
208
+ </div>
209
+ </li>
210
+ <li>
211
+ <span class="check">&#10003;</span>
212
+ <div>
213
+ <div><strong>Session Reports</strong></div>
214
+ <div class="desc">Full session intelligence reports via <code>/api/session/report</code>.</div>
215
+ </div>
216
+ </li>
217
+ <li>
218
+ <span class="check">&#10003;</span>
219
+ <div>
220
+ <div><strong>workspace_challenge</strong></div>
221
+ <div class="desc">Challenge stale beliefs and surface contradictions across the graph.</div>
222
+ </div>
223
+ </li>
224
+ <li>
225
+ <span class="check">&#10003;</span>
226
+ <div>
227
+ <div><strong>Free tier included</strong></div>
228
+ <div class="desc">Pass 0-3 and all core graph operations remain free — no key needed.</div>
229
+ </div>
230
+ </li>
231
+ </ul>
232
+ <a class="cta" href="${LEMON_CHECKOUT}" target="_blank" rel="noopener">
233
+ Get Nodedex Pro &rarr;
234
+ </a>
235
+ <p class="note">
236
+ After purchase, set <code>NODEDEX_LICENSE_KEY=&lt;your-key&gt;</code> and restart the server.
237
+ </p>
238
+ </div>
239
+ </body>
240
+ </html>`);
241
+ });
242
+ // ── Honor the reflect-pause file at boot ────────────────────────────────────
243
+ // ~/.nodedex/reflect-pause is the user's "stop reflecting" switch (also checked
244
+ // by the hooks). The in-memory reflectPaused flag used to reset to false on
245
+ // every restart, so a paused user who restarted the server silently resumed
246
+ // per-turn reflection AND drained the recovered job queue — the surprise spend
247
+ // hit on 2026-06-01. Seed the flag from the file so pause survives restarts.
248
+ try {
249
+ const pauseFile = path.join(homedir(), ".nodedex", "reflect-pause");
250
+ if (existsSync(pauseFile)) {
251
+ setReflectPaused(true);
252
+ console.log("[reflect] reflect-pause file present at boot — reflection PAUSED (delete ~/.nodedex/reflect-pause + POST /api/reflect/resume to re-enable)");
253
+ }
254
+ }
255
+ catch { /* non-fatal */ }
256
+ // Honor the SPEND-pause file (cost-breaker / credit-out). Distinct from reflect-pause:
257
+ // spending stays halted but CAPTURE KEEPS QUEUING, and the auto-resume timer drains it
258
+ // once credit recovers — so a restart mid-outage doesn't burn credit OR drop turns.
259
+ try {
260
+ if (spendPauseFileExists()) {
261
+ setSpendPaused(true);
262
+ console.log(`[cost-breaker] spend-pause file present at boot — SPENDING PAUSED (${readSpendPauseReason() ?? "credit/budget"}); capture still queuing; auto-resumes on top-up`);
263
+ }
264
+ }
265
+ catch { /* non-fatal */ }
266
+ // ─── Startup: recover persisted reflect jobs ──────────────────────────────
267
+ // Jobs stuck in 'processing' mean the server crashed mid-job — reset to pending.
268
+ // Jobs in 'pending' or 'retry_wait' are loaded back into the in-memory queue.
269
+ try {
270
+ const cleaned = db.cleanupReflectJobs();
271
+ if (cleaned > 0)
272
+ console.log(`[reflect-queue] cleaned up ${cleaned} stale DB job(s)`);
273
+ const staleJobs = db.getActiveReflectJobs();
274
+ let recovered = 0;
275
+ for (const row of staleJobs) {
276
+ if (row.status === 'processing' || (row.status === 'dead' && row.error === 'max retries exceeded')) {
277
+ db.updateReflectJob(row.id, { status: 'pending', retry_after: null });
278
+ row.status = 'pending';
279
+ row.retry_after = null;
280
+ }
281
+ try {
282
+ const payload = JSON.parse(row.payload);
283
+ const precomputed = row.precomputed ? JSON.parse(row.precomputed) : {};
284
+ reflectQueue.push({
285
+ agentResponse: payload.agentResponse ?? "",
286
+ agentThinking: payload.agentThinking ?? "",
287
+ userMessage: payload.userMessage ?? "",
288
+ loadedBlockIds: payload.loadedBlockIds ?? [],
289
+ agentId: row.agent_id ?? undefined,
290
+ precomputedPass0: precomputed.pass0 ?? undefined,
291
+ precomputedPass1: precomputed.pass1 ?? undefined,
292
+ precomputedPass2: precomputed.pass2 ?? undefined,
293
+ precomputedPass3PendingBlockIds: precomputed.p3PendingBlockIds ?? undefined,
294
+ retryAfter: row.retry_after ?? undefined,
295
+ retryAttempts: row.retry_attempts,
296
+ dbId: row.id,
297
+ });
298
+ recovered++;
299
+ }
300
+ catch { /* corrupt row — skip */ }
301
+ }
302
+ if (recovered > 0 && !reflectPaused && !spendPaused) {
303
+ console.log(`[reflect-queue] recovered ${recovered} job(s) from DB — resuming`);
304
+ processReflectQueue(db, embeddings || undefined).catch(e => console.error("[reflect-queue] recovery worker error:", e));
305
+ }
306
+ else if (recovered > 0 && spendPaused) {
307
+ console.log(`[reflect-queue] recovered ${recovered} job(s) from DB — NOT draining (spending paused: credit/budget). Auto-resumes when the balance recovers.`);
308
+ }
309
+ else if (recovered > 0) {
310
+ console.log(`[reflect-queue] recovered ${recovered} job(s) from DB — NOT draining (reflect paused). Delete ~/.nodedex/reflect-pause + POST /api/reflect/resume to drain.`);
311
+ }
312
+ }
313
+ catch (e) {
314
+ console.error("[reflect-queue] startup recovery failed:", e);
315
+ }
316
+ const bindHost = resolveBindHost();
317
+ const server = app.listen(port, bindHost, () => {
318
+ const shown = bindHost === "0.0.0.0" ? "localhost" : bindHost;
319
+ const lock = apiTokenEnabled() ? "token-locked" : "open (localhost-only)";
320
+ console.error(`Workspace Web UI API running on http://${shown}:${port} — bound ${bindHost}, ${lock}`);
321
+ if (embeddings)
322
+ console.error(`MCP (HTTP) endpoint: http://${shown}:${port}/mcp — for networked clients (e.g. Docker: http://host.docker.internal:${port}/mcp)`);
323
+ if (bindHost === "0.0.0.0" && !apiTokenEnabled()) {
324
+ console.error("⚠ SECURITY: bound to 0.0.0.0 (network-reachable) with NO NODEDEX_API_TOKEN — the graph is exposed unauthenticated. Set NODEDEX_API_TOKEN.");
325
+ }
326
+ });
327
+ // Auto-resume the spend-pause once credit tops back up (a separate timer — the drain
328
+ // loop breaks on spendPaused before it could re-check the budget itself). unref'd, so
329
+ // it never holds the process open.
330
+ startCreditAutoResume(db, embeddings || undefined);
331
+ // Stale-process trap fix: db.init() already opened the DB, and the MCP stdio
332
+ // transport keeps this process alive — so a server that CAN'T bind the port
333
+ // would otherwise linger as a zombie holding the DB lock (the accumulation we
334
+ // hit all session). On EADDRINUSE (or any listen error), release the DB and
335
+ // EXIT instead of zombie-lingering.
336
+ server.on("error", (e) => {
337
+ if (e.code === "EADDRINUSE") {
338
+ console.error(`✖ port ${port} already in use — another nodedex server is running. Exiting (won't linger holding the DB). Stop the other first, or use scripts/restart.mjs.`);
339
+ }
340
+ else {
341
+ console.error(`✖ API server error: ${e.message}. Exiting.`);
342
+ }
343
+ try {
344
+ db.close();
345
+ }
346
+ catch { /* ignore */ }
347
+ process.exit(1);
348
+ });
349
+ return server;
350
+ }
351
+ //# sourceMappingURL=api-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-server.js","sourceRoot":"","sources":["../src/api-server.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,+DAA+D;AAC/D,4EAA4E;AAE5E,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,gBAAgB,EAAE,WAAW,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC3J,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAChG,OAAO,EAAE,kBAAkB,EAAE,MAAW,oBAAoB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAW,oBAAoB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAU,qBAAqB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAU,qBAAqB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAQ,uBAAuB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAY,mBAAmB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAW,oBAAoB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAQ,wBAAwB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAO,wBAAwB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAa,mBAAmB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAc,mBAAmB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAY,sBAAsB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,8CAA8C,CAAC;AAC1G,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACxG,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAE3E,MAAM,UAAU,cAAc,CAC5B,EAAe,EACf,eAAoD,EACpD,IAAI,GAAG,IAAI,EACX,UAA4B;IAE5B,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IACtB,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAEhB,6EAA6E;IAC7E,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,aAAa,GAAI,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,OAAO,GAAU,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IACjE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAE/D,iFAAiF;IACjF,IAAI,CAAC;QAAC,aAAa,CAAC,eAAe,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IACnG,qFAAqF;IACrF,6EAA6E;IAC7E,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACtD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,6EAA6E;IAC7E,8EAA8E;IAC9E,2EAA2E;IAC3E,6EAA6E;IAC7E,gFAAgF;IAChF,gFAAgF;IAChF,2EAA2E;IAC3E,6EAA6E;IAC7E,uEAAuE;IACvE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;IAEpD,6EAA6E;IAC7E,yEAAyE;IACzE,sFAAsF;IACtF,0FAA0F;IAC1F,gFAAgF;IAChF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;QAC1B,wBAAwB;QACxB,mBAAmB;QACnB,mBAAmB;QACnB,oBAAoB;QACpB,0BAA0B;QAC1B,oBAAoB;QACpB,qBAAqB;KACtB,CAAC,CAAC;IACH,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QACzB,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtF,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,CAAW,CAAC;QAC9D,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,WAAW;YAAE,OAAO,IAAI,EAAE,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,6EAA6E;IAC7E,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5D,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5C,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAC7C,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1C,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/C,GAAG,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/C,GAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;IACpC,GAAG,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,CAAC,CAAC,CAAC;IACvC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAE7B,8EAA8E;IAC9E,kFAAkF;IAClF,kFAAkF;IAClF,uEAAuE;IACvE,IAAI,UAAU;QAAE,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IAE7D,8DAA8D;IAC9D,yEAAyE;IACzE,sEAAsE;IACtE,0EAA0E;IAC1E,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAE5B,+EAA+E;IAC/E,gFAAgF;IAChF,iFAAiF;IACjF,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,CAAC,CAAC;IAEtB,uEAAuE;IACvE,wEAAwE;IACxE,yEAAyE;IACzE,uEAAuE;IACvE,qCAAqC;IACrC,4DAA4D;IAC5D,6CAA6C;IAC7C,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACtB,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAEzB,4EAA4E;IAC5E,8EAA8E;IAC9E,2EAA2E;IAC3E,6EAA6E;IAC7E,gCAAgC;IAChC,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAExB,oFAAoF;IACpF,6EAA6E;IAC7E,6DAA6D;IAC7D,uFAAuF;IACvF,4BAA4B,CAAC,EAAE,CAAC,CAAC;IAEjC,sEAAsE;IACtE,8EAA8E;IAC9E,gEAAgE;IAChE,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAErB,iFAAiF;IACjF,sFAAsF;IACtF,sFAAsF;IACtF,gFAAgF;IAChF,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAGzB,4EAA4E;IAC5E,qEAAqE;IACrE,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,2CAA2C,CAAC;IACvG,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAChC,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAkFc,cAAc;;;;;;;;QAQjC,CAAC,CAAC;IACR,CAAC,CAAC,CAAC;IAEH,+EAA+E;IAC/E,gFAAgF;IAChF,4EAA4E;IAC5E,4EAA4E;IAC5E,+EAA+E;IAC/E,6EAA6E;IAC7E,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;QACpE,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,4IAA4I,CAAC,CAAC;QAC5J,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAE3B,uFAAuF;IACvF,uFAAuF;IACvF,oFAAoF;IACpF,IAAI,CAAC;QACH,IAAI,oBAAoB,EAAE,EAAE,CAAC;YAC3B,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,sEAAsE,oBAAoB,EAAE,IAAI,eAAe,kDAAkD,CAAC,CAAC;QACjL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC;IAE3B,6EAA6E;IAC7E,iFAAiF;IACjF,8EAA8E;IAC9E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,kBAAkB,EAAE,CAAC;QACxC,IAAI,OAAO,GAAG,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,kBAAkB,CAAC,CAAC;QAEtF,MAAM,SAAS,GAAG,EAAE,CAAC,oBAAoB,EAAE,CAAC;QAC5C,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,MAAM,KAAK,YAAY,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,KAAK,KAAK,sBAAsB,CAAC,EAAE,CAAC;gBACnG,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;gBACtE,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;gBACvB,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC;YACzB,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACxC,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvE,YAAY,CAAC,IAAI,CAAC;oBAChB,aAAa,EAAK,OAAO,CAAC,aAAa,IAAK,EAAE;oBAC9C,aAAa,EAAK,OAAO,CAAC,aAAa,IAAK,EAAE;oBAC9C,WAAW,EAAO,OAAO,CAAC,WAAW,IAAO,EAAE;oBAC9C,cAAc,EAAI,OAAO,CAAC,cAAc,IAAI,EAAE;oBAC9C,OAAO,EAAW,GAAG,CAAC,QAAQ,IAAc,SAAS;oBACrD,gBAAgB,EAAE,WAAW,CAAC,KAAK,IAAS,SAAS;oBACrD,gBAAgB,EAAE,WAAW,CAAC,KAAK,IAAS,SAAS;oBACrD,gBAAgB,EAAE,WAAW,CAAC,KAAK,IAAS,SAAS;oBACrD,+BAA+B,EAAE,WAAW,CAAC,iBAAiB,IAAI,SAAS;oBAC3E,UAAU,EAAQ,GAAG,CAAC,WAAW,IAAW,SAAS;oBACrD,aAAa,EAAK,GAAG,CAAC,cAAc;oBACpC,IAAI,EAAc,GAAG,CAAC,EAAE;iBACzB,CAAC,CAAC;gBACH,SAAS,EAAE,CAAC;YACd,CAAC;YAAC,MAAM,CAAC,CAAC,wBAAwB,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,WAAW,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,6BAA6B,SAAS,4BAA4B,CAAC,CAAC;YAChF,mBAAmB,CAAC,EAAE,EAAE,UAAU,IAAI,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CACzD,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,CAAC,CAAC,CAC3D,CAAC;QACJ,CAAC;aAAM,IAAI,SAAS,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,6BAA6B,SAAS,0GAA0G,CAAC,CAAC;QAChK,CAAC;aAAM,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,6BAA6B,SAAS,uHAAuH,CAAC,CAAC;QAC7K,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE;QAC7C,MAAM,KAAK,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC9D,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,uBAAuB,CAAC;QAC1E,OAAO,CAAC,KAAK,CAAC,0CAA0C,KAAK,IAAI,IAAI,YAAY,QAAQ,KAAK,IAAI,EAAE,CAAC,CAAC;QACtG,IAAI,UAAU;YAAE,OAAO,CAAC,KAAK,CAAC,+BAA+B,KAAK,IAAI,IAAI,0EAA0E,IAAI,OAAO,CAAC,CAAC;QACjK,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,2IAA2I,CAAC,CAAC;QAC7J,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,qFAAqF;IACrF,sFAAsF;IACtF,mCAAmC;IACnC,qBAAqB,CAAC,EAAE,EAAE,UAAU,IAAI,SAAS,CAAC,CAAC;IACnD,6EAA6E;IAC7E,4EAA4E;IAC5E,8EAA8E;IAC9E,4EAA4E;IAC5E,oCAAoC;IACpC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAwB,EAAE,EAAE;QAC9C,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,+IAA+I,CAAC,CAAC;QAC/K,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC;YAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=boot-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-env.d.ts","sourceRoot":"","sources":["../src/boot-env.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ // boot-env.ts — side-effect module: load ~/.nodedex/.env BEFORE anything else.
2
+ //
3
+ // Imported FIRST in server.ts so this runs before any other module's top-level
4
+ // process.env reads (config consts, provider defaults, …). Precedence: a real env var /
5
+ // --env-file (dev server/.env) already in process.env WINS; this only fills the gaps a
6
+ // fresh install relies on. See home-env.ts.
7
+ import { loadHomeEnv, HOME_ENV_PATH } from "./home-env.js";
8
+ const applied = loadHomeEnv();
9
+ if (applied > 0) {
10
+ console.error(`[boot] applied ${applied} setting(s) from ${HOME_ENV_PATH} (env / --env-file still win)`);
11
+ }
12
+ //# sourceMappingURL=boot-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-env.js","sourceRoot":"","sources":["../src/boot-env.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,EAAE;AACF,+EAA+E;AAC/E,wFAAwF;AACxF,uFAAuF;AACvF,4CAA4C;AAC5C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE3D,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;AAC9B,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;IAChB,OAAO,CAAC,KAAK,CAAC,kBAAkB,OAAO,oBAAoB,aAAa,+BAA+B,CAAC,CAAC;AAC3G,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=search-core.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-core.test.d.ts","sourceRoot":"","sources":["../../../src/engine/__tests__/search-core.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * search-core tests — the shared three-signal scorer (MCP workspace_search +
3
+ * REST /api/search rank identically through this).
4
+ *
5
+ * Pins the ranking principle: MATCH QUALITY ONLY. No popularity ranking
6
+ * (access_count), no freshness decay, no usage penalty — the graph's
7
+ * highest-value blocks (dead-ends) are old and rarely accessed by design.
8
+ * Run: node --import=tsx/esm --test src/engine/__tests__/search-core.test.ts
9
+ */
10
+ import { test, describe, before, after } from "node:test";
11
+ import assert from "node:assert/strict";
12
+ import fs from "node:fs";
13
+ import path from "node:path";
14
+ import { WorkspaceDB } from "../../store/database.js";
15
+ import { searchBlocks, rootContextFor, allWeak } from "../search-core.js";
16
+ const TEST_DB = path.resolve("/tmp/search_core_test.db");
17
+ let db;
18
+ before(async () => {
19
+ for (const s of ["", "-wal", "-shm"]) {
20
+ if (fs.existsSync(TEST_DB + s))
21
+ fs.unlinkSync(TEST_DB + s);
22
+ }
23
+ db = new WorkspaceDB(TEST_DB);
24
+ await db.init();
25
+ });
26
+ after(() => {
27
+ try {
28
+ db["db"]?.close();
29
+ }
30
+ catch { /* ignore */ }
31
+ for (const s of ["", "-wal", "-shm"]) {
32
+ try {
33
+ if (fs.existsSync(TEST_DB + s))
34
+ fs.unlinkSync(TEST_DB + s);
35
+ }
36
+ catch { /* ignore */ }
37
+ }
38
+ });
39
+ describe("searchBlocks — match-quality ranking", () => {
40
+ test("strong match beats popular weak match (no access_count ranking)", async () => {
41
+ const strong = db.createBlock({
42
+ label: "garden_dead-end_aphid-spray-failed",
43
+ type: "dead_end",
44
+ essence: "Aphid spray failed — neem oil burned the tomato leaves",
45
+ content: { concepts: ["aphid-spray", "neem-oil", "tomato"] },
46
+ ttl: "permanent",
47
+ });
48
+ const popular = db.createBlock({
49
+ label: "garden_fact_watering-schedule",
50
+ type: "fact",
51
+ essence: "Watering twice a week; the spray bottle is under the sink",
52
+ content: { concepts: ["watering"] },
53
+ ttl: "permanent",
54
+ });
55
+ // Make the weak block "popular": many reads bump access_count. The OLD REST
56
+ // path (ORDER BY access_count DESC) would rank it first on any shared term.
57
+ for (let i = 0; i < 25; i++)
58
+ db.getBlock(popular.id);
59
+ const { hits } = await searchBlocks(db, undefined, { query: "aphid spray neem", limit: 5 });
60
+ assert.ok(hits.length >= 2, "both blocks share the 'spray' term");
61
+ assert.equal(hits[0].block.id, strong.id, "the actual match must outrank the popular block");
62
+ });
63
+ test("signals add: keyword+concept hit outranks keyword-only", async () => {
64
+ db.createBlock({
65
+ label: "forge_fact_jwt-mention",
66
+ type: "fact",
67
+ essence: "The doc mentions jwt once in passing",
68
+ content: {},
69
+ ttl: "permanent",
70
+ });
71
+ const both = db.createBlock({
72
+ label: "forge_decision_jwt-hs256",
73
+ type: "decision",
74
+ essence: "Use HS256 jwt tokens for service auth",
75
+ content: { concepts: ["jwt", "hs256", "auth-tokens"] },
76
+ ttl: "permanent",
77
+ });
78
+ const { hits, signals } = await searchBlocks(db, undefined, { query: "jwt auth", limit: 5 });
79
+ assert.equal(hits[0].block.id, both.id, "keyword+concept beats keyword-only");
80
+ assert.ok(hits[0].matchTypes.some((t) => t.startsWith("concept(")), "concept match is explained");
81
+ assert.equal(signals.semantic, false, "no embeddings passed → semantic signal reported off");
82
+ assert.equal(signals.keyword, true);
83
+ });
84
+ test("type filter restricts hits", async () => {
85
+ const { hits } = await searchBlocks(db, undefined, { query: "jwt", type: "decision", limit: 5 });
86
+ assert.ok(hits.length > 0);
87
+ assert.ok(hits.every((h) => h.block.type === "decision"));
88
+ });
89
+ test("no query tokens → empty, never throws", async () => {
90
+ const { hits } = await searchBlocks(db, undefined, { query: "zzzz_nothing_matches_this", limit: 5 });
91
+ assert.equal(hits.length, 0);
92
+ });
93
+ });
94
+ describe("allWeak — the nearest-neighbor shrug detector", () => {
95
+ const hit = (score, matchTypes) => ({ block: {}, score, matchTypes });
96
+ test("all semantic-only sub-0.3 hits → weak (off-graph query signature)", () => {
97
+ assert.equal(allWeak([hit(0.26, ["semantic"]), hit(0.26, ["semantic"])]), true);
98
+ });
99
+ test("one strong or multi-signal hit anywhere → not weak", () => {
100
+ assert.equal(allWeak([hit(0.63, ["semantic", "keyword"]), hit(0.22, ["semantic"])]), false);
101
+ assert.equal(allWeak([hit(0.45, ["semantic"])]), false, "high score alone disarms it");
102
+ assert.equal(allWeak([hit(0.25, ["keyword"])]), false, "keyword match alone disarms it");
103
+ });
104
+ test("empty result set is not weak (it is simply empty)", () => {
105
+ assert.equal(allWeak([]), false);
106
+ });
107
+ });
108
+ describe("rootContextFor — containment attached to hits", () => {
109
+ test("resolves project_id to root label + truncated essence, once per root", async () => {
110
+ const root = db.createBlock({
111
+ label: "garden",
112
+ type: "project",
113
+ essence: "Backyard vegetable garden project — pests, soil, and the greenhouse build. " + "x".repeat(60),
114
+ content: {},
115
+ ttl: "permanent",
116
+ });
117
+ const child = db.createBlock({
118
+ label: "garden_fact_soil-ph",
119
+ type: "fact",
120
+ essence: "Soil pH is 6.2",
121
+ content: {},
122
+ ttl: "permanent",
123
+ });
124
+ db.updateBlock(child.id, { project_id: root.id });
125
+ const fresh = db.getBlock(child.id);
126
+ const ctx = rootContextFor(db, [fresh, fresh]); // duplicate input → single lookup
127
+ assert.equal(ctx.size, 1);
128
+ const rc = ctx.get(root.id);
129
+ assert.equal(rc.root_label, "garden");
130
+ assert.ok(rc.root_essence.endsWith("…"), "long root essence is truncated");
131
+ assert.ok(rc.root_essence.length <= 101);
132
+ });
133
+ test("blocks without project_id or with dangling project_id are skipped", () => {
134
+ const orphan = db.getBlock("forge_fact_jwt-mention");
135
+ const ctx = rootContextFor(db, [orphan]);
136
+ assert.equal(ctx.size, 0);
137
+ });
138
+ });
139
+ //# sourceMappingURL=search-core.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-core.test.js","sourceRoot":"","sources":["../../../src/engine/__tests__/search-core.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export interface GenerateResult<T> {
2
+ result: T | null;
3
+ rateLimited: boolean;
4
+ /** The call failed because the account is OUT OF CREDIT (HTTP 402 / insufficient-credit
5
+ * body) — distinct from rateLimited (a transient capacity cap). The reflect queue treats
6
+ * this as a spend-pause trigger (preserve + requeue the turn, never drop), so it must be
7
+ * surfaced rather than swallowed into a generic null. See isInsufficientCreditError. */
8
+ creditExhausted?: boolean;
9
+ thinking?: string;
10
+ usage?: {
11
+ input: number;
12
+ thinking: number;
13
+ output: number;
14
+ costUsd?: number;
15
+ };
16
+ /** Model that produced this result (or the last attempted, on failure). Instrumentation for run-to-run variance. */
17
+ model?: string;
18
+ /**
19
+ * Full attempt trail across the primary-then-fallback escalation in this single generateStructured() call.
20
+ * Lets the turn log show *why* a run diverged (e.g. primary truncated → fallback succeeded). One entry per
21
+ * model invocation; the last entry's outcome matches `result === null` (failure) or `"ok"`.
22
+ */
23
+ attempts?: Array<{
24
+ model: string;
25
+ outcome: "ok" | "rate_limited" | "truncated" | "empty" | "timeout" | "error";
26
+ }>;
27
+ }
28
+ export interface LLMProvider {
29
+ /** Schema-enforced JSON generation — used by pipeline passes 1–4. */
30
+ generateStructured<T>(systemPrompt: string, userInput: string, schema: object, options?: {
31
+ thinkingBudget?: number;
32
+ maxOutputTokens?: number;
33
+ modelOverride?: string;
34
+ }): Promise<GenerateResult<T>>;
35
+ /** Free-form text/JSON generation — route handlers, tools, scheduler jobs. */
36
+ generate(prompt: string): Promise<string | null>;
37
+ ping(): Promise<boolean>;
38
+ isAvailable(): boolean;
39
+ getName(): string;
40
+ }
41
+ export interface EmbeddingProvider {
42
+ embed(text: string): Promise<number[] | null>;
43
+ isAvailable(): boolean;
44
+ }
45
+ //# sourceMappingURL=ai-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-provider.d.ts","sourceRoot":"","sources":["../../src/engine/ai-provider.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB;;;6FAGyF;IACzF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9E,oHAAoH;IACpH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,IAAI,GAAG,cAAc,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;CACnH;AAED,MAAM,WAAW,WAAW;IAC1B,qEAAqE;IACrE,kBAAkB,CAAC,CAAC,EAClB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GACtF,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9B,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEjD,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,WAAW,IAAI,OAAO,CAAC;IACvB,OAAO,IAAI,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9C,WAAW,IAAI,OAAO,CAAC;CACxB"}
@@ -0,0 +1,5 @@
1
+ // ─── AI Provider Abstraction ──────────────────────────────────────────────────
2
+ // Swap AI backends without touching pipeline logic.
3
+ // Supported: gemini (default) | openai | anthropic | openai-compatible (Ollama, Groq, etc.)
4
+ export {};
5
+ //# sourceMappingURL=ai-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-provider.js","sourceRoot":"","sources":["../../src/engine/ai-provider.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,oDAAoD;AACpD,4FAA4F"}