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,79 @@
1
+ // mcp-server.ts — the ONE factory that builds a fully-configured Workspace MCP server
2
+ // (the `instructions` field + the read-only agent gating + all tools). Used by BOTH
3
+ // transports so the tool surface CANNOT drift between them:
4
+ // • stdio — server.ts (the local, host-spawned path)
5
+ // • HTTP — routes/mcp-http.ts (per session; the networked path, e.g. a Dockerized
6
+ // host reaching the server over host.docker.internal)
7
+ //
8
+ // Extracted from server.ts when the HTTP transport was added (Option B) so a containerized
9
+ // MCP client — which can't spawn a host stdio binary — can still reach the same tools.
10
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
+ import { registerCoreTools } from "./tools/core.js";
12
+ import { registerDeriveTools } from "./tools/derive.js";
13
+ import { registerProjectTools } from "./tools/projects.js";
14
+ import { registerTaskTools } from "./tools/tasks.js";
15
+ import { registerSystemTools } from "./tools/system.js";
16
+ import { appendFlagNudge } from "./tools/flag-surface.js";
17
+ import { AGENT_PROTOCOL } from "./agent-protocol.js";
18
+ // The MCP `instructions` field — the advisory FLOOR the host injects on connect. Installs
19
+ // the two reflexes + traversal loop (shared AGENT_PROTOCOL) + the onboard nudge.
20
+ export const WORKSPACE_INSTRUCTIONS = `${AGENT_PROTOCOL}
21
+
22
+ First time connecting in this project? Call workspace_onboard ONCE — it offers to persist these reflexes into your own standing config (it checks whether you can, and you explain why + ask the user first). If you can't persist, this advisory copy still applies for the session.`;
23
+ // The agent surface is READ-ONLY by default — it traverses/queries/retrieves; the pipeline
24
+ // does all writing. Pure reads only. (extract_arc etc. are INFRA, triggered by host/timer.)
25
+ const READ_TOOLS_BASE = [
26
+ "workspace_get", "workspace_search", "workspace_filter", "workspace_tree",
27
+ "workspace_list", "workspace_stats", "workspace_history", "workspace_find_skill",
28
+ "workspace_onboard", "workspace_install_capture",
29
+ ];
30
+ // Task tools are opt-in (a host often has its own task system).
31
+ const TASK_TOOLS = ["workspace_task_next", "workspace_task_create", "workspace_task_update"];
32
+ /** Whether write/admin/maintenance tools are exposed (default off → read-only surface). */
33
+ export function writesExposed() {
34
+ return (process.env.NODEDEX_EXPOSE_WRITE_TOOLS ?? "").toLowerCase() === "on";
35
+ }
36
+ /** The tool names the agent surface exposes given current env flags (for boot logging). */
37
+ export function agentToolAllowlist() {
38
+ const allow = new Set(READ_TOOLS_BASE);
39
+ if ((process.env.NODEDEX_EXPOSE_TASKS ?? "").toLowerCase() === "on") {
40
+ for (const t of TASK_TOOLS)
41
+ allow.add(t);
42
+ }
43
+ return allow;
44
+ }
45
+ /** Build a Workspace MCP server: instructions, read-only gating, and every tool registered.
46
+ * A fresh instance is cheap (registration is pure) — the HTTP path builds one per session;
47
+ * db + embeddings are shared singletons passed in. */
48
+ export function buildWorkspaceServer(db, embeddings) {
49
+ const server = new McpServer({ name: "workspace", version: "1.0.0-MVP" }, { instructions: WORKSPACE_INSTRUCTIONS });
50
+ // Wrap server.tool BEFORE the register calls so two cross-cutting concerns apply to
51
+ // every tool without touching a single handler:
52
+ // 1. read-only gating — skip tools not in the allowlist (unless writes exposed).
53
+ // 2. flag nudge — append a passive "N items need your input" note to each
54
+ // result when self-maintenance routed work to the agent. A passive MCP tool
55
+ // can't push, so the agent discovers pending flags by bumping into this on a
56
+ // call it was already making. Best-effort, never breaks the tool.
57
+ {
58
+ const allow = writesExposed() ? null : agentToolAllowlist();
59
+ const registerTool = server.tool.bind(server);
60
+ server.tool = (...args) => {
61
+ const name = args[0];
62
+ if (allow && !allow.has(name))
63
+ return undefined; // gated out of the read-only surface
64
+ const handler = args[args.length - 1];
65
+ if (typeof handler === "function") {
66
+ const orig = handler;
67
+ args[args.length - 1] = async (...h) => appendFlagNudge((await orig(...h)), db, name);
68
+ }
69
+ return registerTool(...args);
70
+ };
71
+ }
72
+ registerCoreTools(server, db, embeddings);
73
+ registerDeriveTools(server, db, embeddings);
74
+ registerProjectTools(server, db, embeddings);
75
+ registerTaskTools(server, db, embeddings);
76
+ registerSystemTools(server, db, embeddings);
77
+ return server;
78
+ }
79
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Request, Response, NextFunction } from "express";
2
+ export type AuthIdentity = {
3
+ kind: "owner";
4
+ } | {
5
+ kind: "account";
6
+ accountId: string;
7
+ };
8
+ declare module "express-serve-static-core" {
9
+ interface Request {
10
+ auth?: AuthIdentity;
11
+ }
12
+ }
13
+ export declare function resolveBindHost(): string;
14
+ export declare function apiTokenEnabled(): boolean;
15
+ export declare function extractCredential(req: Request): string;
16
+ export declare function validateCredential(token: string): AuthIdentity | null;
17
+ export declare function safeEqual(a: string, b: string): boolean;
18
+ export declare function isLoopbackRequest(req: Request): boolean;
19
+ export declare function requireAuth(opts: {
20
+ exempt: (path: string) => boolean;
21
+ }): (req: Request, res: Response, next: NextFunction) => void | Response<any, Record<string, any>>;
22
+ export declare function defaultAuthExempt(p: string): boolean;
23
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM/D,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,OAAO,QAAQ,2BAA2B,CAAC;IACzC,UAAU,OAAO;QACf,IAAI,CAAC,EAAE,YAAY,CAAC;KACrB;CACF;AAOD,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAMD,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAKD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAKtD;AAOD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAKrE;AAGD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAKvD;AAWD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAIvD;AAOD,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CAAE,IAC7D,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,+CAcxD;AAMD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEpD"}
@@ -0,0 +1,104 @@
1
+ // middleware/auth.ts — security slice 1: the auth SEAM + network bind resolver.
2
+ //
3
+ // THE SEAM (why this file exists): today Nodedex is a single-owner LOCAL tool,
4
+ // so auth is one shared bearer token. The future Phase-2 remote server is
5
+ // multi-tenant (per-account credentials). This module is written so that going
6
+ // multi-tenant is a swap of ONE function — validateCredential(token) → identity
7
+ // — while credential extraction, the gate placement in api-server.ts, and every
8
+ // downstream `req.auth` reference stay put. Do NOT build accounts/passwords in
9
+ // the local tool; they belong to the closed Phase-2 server. See memory
10
+ // project-monetization-direction-2026-06-13 for the bigger picture.
11
+ // ─── Network bind ───────────────────────────────────────────────────────────
12
+ // Default to loopback so a fresh install is NOT reachable from the network.
13
+ // Intentional exposure (the future remote server, or a LAN dev box) opts in via
14
+ // NODEDEX_BIND_HOST=0.0.0.0. Pure + exported so it's unit-testable without
15
+ // opening a socket.
16
+ export function resolveBindHost() {
17
+ const h = (process.env.NODEDEX_BIND_HOST || "").trim();
18
+ return h.length > 0 ? h : "127.0.0.1";
19
+ }
20
+ // ─── Auth ───────────────────────────────────────────────────────────────────
21
+ // Is the whole-API token lock turned on? Unset = OFF (open, localhost-protected)
22
+ // so the live dogfood loop and a naive install keep working.
23
+ export function apiTokenEnabled() {
24
+ return (process.env.NODEDEX_API_TOKEN || "").length > 0;
25
+ }
26
+ // Pull the presented credential. Prefer a DEDICATED header so we never collide
27
+ // with Authorization, which the chat-proxy forwards verbatim to the upstream
28
+ // LLM. Authorization: Bearer is also accepted for convenience on data paths.
29
+ export function extractCredential(req) {
30
+ const x = (req.headers["x-nodedex-token"] || "");
31
+ if (x && x.trim())
32
+ return x.trim();
33
+ const auth = (req.headers["authorization"] || "").toString();
34
+ return auth.replace(/^Bearer\s+/i, "").trim();
35
+ }
36
+ // THE SWAP POINT. token → identity (or null if it doesn't authenticate).
37
+ // Today: constant-time compare to the one configured owner token.
38
+ // Future server: replace the body with a token→account DB lookup returning
39
+ // { kind: "account", accountId }. Callers only check apiTokenEnabled() first,
40
+ // so this is only invoked when a token is actually configured.
41
+ export function validateCredential(token) {
42
+ const expected = process.env.NODEDEX_API_TOKEN || "";
43
+ if (!expected)
44
+ return null;
45
+ if (token && safeEqual(token, expected))
46
+ return { kind: "owner" };
47
+ return null;
48
+ }
49
+ // Length-then-constant-time compare — avoids leaking the token via timing.
50
+ export function safeEqual(a, b) {
51
+ if (a.length !== b.length)
52
+ return false;
53
+ let diff = 0;
54
+ for (let i = 0; i < a.length; i++)
55
+ diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
56
+ return diff === 0;
57
+ }
58
+ // ─── Loopback exemption (the ONE token rule) ────────────────────────────────
59
+ // The token exists to gate NETWORK exposure (a 0.0.0.0 bind for Docker/remote
60
+ // agents). A same-machine client (Claude Code sitting next to a dockerized
61
+ // agent) is the owner's own process — making it juggle the token is the #1
62
+ // "connecting is messy" complaint. So: requests arriving over loopback are
63
+ // token-exempt; anything with a network source address must authenticate.
64
+ // TCP source addresses can't be spoofed for an established connection, so this
65
+ // is a sound trust boundary for a single-owner tool. Shared/multi-user machines
66
+ // that want local strictness set NODEDEX_STRICT_TOKEN=1.
67
+ export function isLoopbackRequest(req) {
68
+ if ((process.env.NODEDEX_STRICT_TOKEN || "").trim() === "1")
69
+ return false;
70
+ const a = (req.socket?.remoteAddress || "").trim();
71
+ return a === "127.0.0.1" || a === "::1" || a === "::ffff:127.0.0.1";
72
+ }
73
+ // App-level gate. When the token is OFF: pass everything, stamping the owner
74
+ // identity (single-owner tool). When ON: require a valid credential on every
75
+ // /api/* path except those the caller exempts (health for supervisors, the
76
+ // chat-proxy BYO-key passthrough, non-/api pages like /upgrade) — and except
77
+ // loopback clients (see isLoopbackRequest: the token gates the NETWORK).
78
+ export function requireAuth(opts) {
79
+ return (req, res, next) => {
80
+ req.auth = { kind: "owner" }; // default identity; replaced below if a token authenticates
81
+ if (!apiTokenEnabled())
82
+ return next();
83
+ if (opts.exempt(req.path))
84
+ return next();
85
+ if (isLoopbackRequest(req))
86
+ return next(); // own machine — the token gates the network
87
+ const identity = validateCredential(extractCredential(req));
88
+ if (!identity) {
89
+ return res.status(401).json({
90
+ error: "Unauthorized — set header 'x-nodedex-token' or 'Authorization: Bearer <token>' (NODEDEX_API_TOKEN is enabled; only same-machine connections are exempt)",
91
+ });
92
+ }
93
+ req.auth = identity;
94
+ next();
95
+ };
96
+ }
97
+ // What the whole-API gate does NOT cover: liveness (supervisors poll it), the
98
+ // chat-proxy (authenticates with the client's own forwarded LLM key), and any
99
+ // non-/api path (the /upgrade page, static). NB for Phase 2: the remote server
100
+ // MUST gate /api/chat (it spends money) — that exemption is local-tool-only.
101
+ export function defaultAuthExempt(p) {
102
+ return !p.startsWith("/api/") || p === "/api/health" || p.startsWith("/api/chat");
103
+ }
104
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { WorkspaceDB } from "../store/database.js";
2
+ import { EmbeddingEngine } from "../engine/embeddings.js";
3
+ export declare function runAutoRecall(db: WorkspaceDB, embeddings: EmbeddingEngine, userMessage: string, context?: {
4
+ projectId?: string;
5
+ activeBlocks?: string[];
6
+ }): Promise<string>;
7
+ //# sourceMappingURL=auto-recall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-recall.d.ts","sourceRoot":"","sources":["../../src/middleware/auto-recall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AA2B1D,wBAAsB,aAAa,CACjC,EAAE,EAAE,WAAW,EACf,UAAU,EAAE,eAAe,EAC3B,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACxD,OAAO,CAAC,MAAM,CAAC,CA4NjB"}
@@ -0,0 +1,257 @@
1
+ import { cosineSim } from "../engine/vector-math.js";
2
+ function extractEntities(message) {
3
+ const capsRegex = /(?<!^|\.\s+)\b[A-Z][a-z]+\b/g;
4
+ const capitalized = message.match(capsRegex) || [];
5
+ const targetRegex = /\b(?:about|on|for|with|using|fix|debug|build|create|find)\s+([a-zA-Z0-9_-]+)\b/gi;
6
+ const targets = [];
7
+ let match;
8
+ while ((match = targetRegex.exec(message)) !== null)
9
+ targets.push(match[1]);
10
+ return [...new Set([...capitalized, ...targets, message])];
11
+ }
12
+ // Extract plain concept-like tokens from a message (lowercase, 2+ chars, no stopwords)
13
+ const STOPWORDS = new Set(["the", "is", "a", "an", "to", "of", "in", "for", "on", "with", "and", "or", "but", "it", "this", "that", "how", "what", "why", "can", "do", "be", "are", "was", "were", "will"]);
14
+ function extractConcepts(message) {
15
+ return message
16
+ .toLowerCase()
17
+ .replace(/[^a-z0-9_ ]/g, " ")
18
+ .split(/\s+/)
19
+ .filter((w) => w.length > 2 && !STOPWORDS.has(w));
20
+ }
21
+ export async function runAutoRecall(db, embeddings, userMessage, context) {
22
+ let semanticActive = false;
23
+ let queryVector = [];
24
+ if (embeddings.isAvailable()) {
25
+ try {
26
+ const v = await embeddings.embed(userMessage);
27
+ if (v) {
28
+ queryVector = v;
29
+ semanticActive = true;
30
+ }
31
+ }
32
+ catch { /* fall through to keyword */ }
33
+ }
34
+ const entities = extractEntities(userMessage);
35
+ const queryConcepts = extractConcepts(userMessage);
36
+ const weights = { keyword: 0.3, semantic: 0.5, concept: 0.4, context: 0.2 };
37
+ // score + reason tracking per block
38
+ const scoredBlocks = new Map();
39
+ const addScore = (block, score, reason) => {
40
+ const existing = scoredBlocks.get(block.id);
41
+ if (existing) {
42
+ existing.score += score;
43
+ existing.reasons.add(reason);
44
+ }
45
+ else {
46
+ scoredBlocks.set(block.id, { block, score, reasons: new Set([reason]) });
47
+ }
48
+ };
49
+ const allBlocks = db.getAllBlocks();
50
+ // ── 1. Keyword match ────────────────────────────────────────────
51
+ for (const entity of entities) {
52
+ const term = entity.toLowerCase();
53
+ for (const block of allBlocks) {
54
+ let aliases = [];
55
+ try {
56
+ aliases = JSON.parse(block.aliases || "[]");
57
+ }
58
+ catch { /* ignore */ }
59
+ if (block.label.toLowerCase().includes(term) ||
60
+ block.essence.toLowerCase().includes(term) ||
61
+ aliases.some((a) => a.toLowerCase().includes(term))) {
62
+ addScore(block, weights.keyword, "keyword");
63
+ }
64
+ }
65
+ }
66
+ // ── 2. Semantic similarity ───────────────────────────────────────
67
+ if (semanticActive && queryVector.length > 0) {
68
+ for (const block of allBlocks) {
69
+ if (!block.embedding)
70
+ continue;
71
+ try {
72
+ const bv = JSON.parse(block.embedding);
73
+ const sim = cosineSim(queryVector, bv);
74
+ if (sim > 0.6)
75
+ addScore(block, sim * weights.semantic, "semantic");
76
+ }
77
+ catch { /* ignore */ }
78
+ }
79
+ }
80
+ // ── 3. Concept overlap ─────────────────────────────────────────
81
+ // Uses SQL json_each() to search concept arrays in the DB — no JS-level JSON-parse loop.
82
+ // This is the cross-domain bridge: finds blocks whose abstract concepts overlap with the
83
+ // query even when the topic/domain differs.
84
+ if (queryConcepts.length > 0) {
85
+ const conceptMatches = db.conceptSearch(queryConcepts);
86
+ for (const [, { block, matches }] of conceptMatches) {
87
+ const bonus = Math.min(matches * 0.2, 0.8);
88
+ addScore(block, bonus * weights.concept, "concept");
89
+ }
90
+ }
91
+ // ── 4. Context boost + project-scope precision ────────────────
92
+ // Blocks linked to the current project score higher.
93
+ // Unrelated non-skill blocks get a subtle penalty to keep recall project-focused.
94
+ const projectRelatedIds = new Set();
95
+ if (context?.projectId) {
96
+ const allRelations = db.getAllRelations(false);
97
+ for (const rel of allRelations) {
98
+ if (rel.source_id === context.projectId)
99
+ projectRelatedIds.add(rel.target_id);
100
+ if (rel.target_id === context.projectId)
101
+ projectRelatedIds.add(rel.source_id);
102
+ }
103
+ projectRelatedIds.add(context.projectId);
104
+ for (const block of allBlocks) {
105
+ if (block.id === context.projectId) {
106
+ addScore(block, weights.context * 2, "context");
107
+ }
108
+ else if (projectRelatedIds.has(block.id)) {
109
+ addScore(block, weights.context * 1.2, "context");
110
+ }
111
+ else if (block.type !== "process" && block.type !== "skill") {
112
+ // Skills/process blocks are exempt — cross-project use is intentional
113
+ const existing = scoredBlocks.get(block.id);
114
+ if (existing)
115
+ existing.score *= 0.85;
116
+ }
117
+ try {
118
+ const c = typeof block.content === "string" ? JSON.parse(block.content) : block.content;
119
+ if (c?.project_id === context.projectId)
120
+ addScore(block, weights.context, "context");
121
+ }
122
+ catch { /* ignore */ }
123
+ }
124
+ }
125
+ if (context?.activeBlocks) {
126
+ for (const blockId of context.activeBlocks) {
127
+ const b = db.getBlock(blockId);
128
+ if (b)
129
+ addScore(b, weights.context, "active_session");
130
+ }
131
+ }
132
+ // ── Boost derive/insight blocks — synthesized knowledge ranks above raw inputs ──
133
+ // Apply quality weight so thin auto-reflect blocks don't compete equally with rich agent-saved blocks.
134
+ for (const entry of scoredBlocks.values()) {
135
+ try {
136
+ const c = typeof entry.block.content === "string" ? JSON.parse(entry.block.content) : entry.block.content;
137
+ if (c?.derivation)
138
+ entry.score += 0.15; // derived insight boost
139
+ }
140
+ catch { /* ignore */ }
141
+ if (entry.block.type === "insight")
142
+ entry.score += 0.1;
143
+ // quality_score 0–6 (0 means "not yet scored", treat as neutral default 3)
144
+ const raw = entry.block.quality_score;
145
+ const q = (typeof raw === "number" && raw > 0) ? raw : 3;
146
+ entry.score *= q / 6;
147
+ }
148
+ // ── Rank + budget ────────────────────────────────────────────
149
+ // Without a project scope, concept overlap alone can surface loosely related blocks.
150
+ // A higher minimum threshold keeps recall focused when no project is active.
151
+ const MIN_SCORE = context?.projectId ? 0.1 : 0.2;
152
+ const ranked = Array.from(scoredBlocks.values())
153
+ .filter(({ block, score }) => !block.label.startsWith("agent_session_") && score >= MIN_SCORE)
154
+ .sort((a, b) => b.score - a.score);
155
+ const MAX_LOADED = 5;
156
+ const MAX_HINTS = 15;
157
+ const CHAR_BUDGET = 3000;
158
+ const loadedBlocks = [];
159
+ const hintBlocks = [];
160
+ let charUsed = 0;
161
+ const sanitize = (block) => {
162
+ let content = {};
163
+ try {
164
+ content = typeof block.content === "string" ? JSON.parse(block.content) : block.content;
165
+ }
166
+ catch { /* ignore */ }
167
+ let aliases = [];
168
+ try {
169
+ aliases = JSON.parse(block.aliases || "[]");
170
+ }
171
+ catch { /* ignore */ }
172
+ return {
173
+ id: block.id,
174
+ label: block.label,
175
+ type: block.type,
176
+ status: block.status,
177
+ ttl: block.ttl,
178
+ essence: block.essence,
179
+ is_a: content.is_a || undefined,
180
+ unique: content.unique || undefined,
181
+ has: content.has || undefined,
182
+ concepts: (() => { try {
183
+ const c = JSON.parse(block.concepts || "[]");
184
+ return c.length ? c : undefined;
185
+ }
186
+ catch {
187
+ return undefined;
188
+ } })(),
189
+ created_at: block.created_at,
190
+ updated_at: block.updated_at,
191
+ aliases: aliases.length ? aliases : undefined,
192
+ created_by: block.created_by || undefined,
193
+ };
194
+ };
195
+ const reasonLabel = {
196
+ keyword: "keyword match",
197
+ semantic: "semantic similarity",
198
+ concept: "shared concept",
199
+ context: "active project",
200
+ active_session: "used in this session",
201
+ };
202
+ for (const { block, reasons } of ranked) {
203
+ const clean = sanitize(block);
204
+ const str = JSON.stringify(clean);
205
+ if (loadedBlocks.length < MAX_LOADED && charUsed + str.length < CHAR_BUDGET) {
206
+ loadedBlocks.push({ block: clean, reasons });
207
+ charUsed += str.length;
208
+ // Touch access count only for blocks actually loaded (not hints)
209
+ db.updateBlock(block.id, { access_count: (block.access_count || 0) + 1 });
210
+ // Log recall as used=true for LOADED blocks — they were surfaced to the agent
211
+ db.logRecall(block.id, context?.projectId, [...reasons].join(","), true);
212
+ }
213
+ else if (hintBlocks.length < MAX_HINTS) {
214
+ hintBlocks.push({ block, reasons });
215
+ }
216
+ }
217
+ if (loadedBlocks.length === 0 && hintBlocks.length === 0) {
218
+ return `\n═══ WORKSPACE CONTEXT ═══\n(No relevant blocks found for this query)\n═════════════════════════\n`;
219
+ }
220
+ // ── Format prompt ────────────────────────────────────────────
221
+ let prompt = `\n═══ WORKSPACE CONTEXT ═══\n`;
222
+ if (loadedBlocks.length > 0) {
223
+ prompt += `LOADED (use directly in your reasoning):\n`;
224
+ for (const { block: b, reasons } of loadedBlocks) {
225
+ const why = [...reasons].map((r) => reasonLabel[r]).join(", ");
226
+ prompt += `\n[${b.id}] ${b.label} (${b.type}`;
227
+ if (b.type === "process")
228
+ prompt += ` ← SKILL/PROCEDURE`;
229
+ prompt += `) — recalled via: ${why}\n`;
230
+ prompt += ` what it is: ${b.essence}\n`;
231
+ if (b.is_a)
232
+ prompt += ` is_a: ${b.is_a}\n`;
233
+ if (b.unique && Object.keys(b.unique).length)
234
+ prompt += ` properties: ${JSON.stringify(b.unique)}\n`;
235
+ if (b.has && Object.keys(b.has).length)
236
+ prompt += ` content: ${JSON.stringify(b.has)}\n`;
237
+ if (b.concepts?.length)
238
+ prompt += ` concepts: ${b.concepts.join(", ")}\n`;
239
+ if (b.type === "process")
240
+ prompt += ` usage_hint: This is a stored skill/procedure. Apply it to your current task if the concepts match.\n`;
241
+ if (b.created_by)
242
+ prompt += ` saved_by: ${b.created_by}\n`;
243
+ prompt += ` saved: ${b.created_at?.slice(0, 10)}${b.updated_at !== b.created_at ? ` (updated ${b.updated_at?.slice(0, 10)})` : ""}\n`;
244
+ }
245
+ }
246
+ if (hintBlocks.length > 0) {
247
+ prompt += `\nAVAILABLE (hints — call workspace_get(id) for full detail):\n`;
248
+ for (const { block: b, reasons } of hintBlocks) {
249
+ const why = [...reasons].map((r) => reasonLabel[r]).join(", ");
250
+ const tag = b.type === "process" ? " [SKILL]" : "";
251
+ prompt += ` [${b.id}]${tag} ${b.label}: ${b.essence} — ${why}\n`;
252
+ }
253
+ }
254
+ prompt += `═════════════════════════\n`;
255
+ return prompt;
256
+ }
257
+ //# sourceMappingURL=auto-recall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-recall.js","sourceRoot":"","sources":["../../src/middleware/auto-recall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { runAutoReflect, getReflectLogPath } from "./reflect/pipeline.js";
2
+ export { reflectTokenStats } from "./reflect/context.js";
3
+ export type { ReflectCreatedBlock, ReflectUpdatedBlock, ReflectResult } from "./reflect/types.js";
4
+ //# sourceMappingURL=auto-reflect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-reflect.d.ts","sourceRoot":"","sources":["../../src/middleware/auto-reflect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,5 @@
1
+ // auto-reflect.ts — entry point. Implementation split into reflect/ directory.
2
+ // Reference: auto-reflect.v10-stable.ts (stable snapshot before split)
3
+ export { runAutoReflect, getReflectLogPath } from "./reflect/pipeline.js";
4
+ export { reflectTokenStats } from "./reflect/context.js";
5
+ //# sourceMappingURL=auto-reflect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-reflect.js","sourceRoot":"","sources":["../../src/middleware/auto-reflect.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,uEAAuE;AACvE,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { WorkspaceDB } from "../../store/database.js";
2
+ import type { PipelineFlag, ReviewVerdict, FlagActionTaken } from "./types.js";
3
+ export declare const APPLY_VALID_VERDICTS: ReviewVerdict[];
4
+ export interface ApplyVerdictInput {
5
+ verdict: ReviewVerdict;
6
+ reason: string;
7
+ /** Run executeMerge (archive loser + wire supersedes). Only meaningful for 'merge'. */
8
+ execute?: boolean;
9
+ winning_block_id?: string | null;
10
+ }
11
+ export type ApplyVerdictResult = {
12
+ ok: true;
13
+ action_taken: FlagActionTaken;
14
+ winning_block_id: string | null;
15
+ } | {
16
+ ok: false;
17
+ code: string;
18
+ message: string;
19
+ };
20
+ /**
21
+ * Apply a verdict to a (fresh, not-yet-reviewed) flag. Caller is responsible for the
22
+ * not-found / already-reviewed pre-checks (the REST route returns 404/409; the NL
23
+ * path re-reads the pending set). Returns a discriminated result the caller maps to
24
+ * its surface (HTTP status / log).
25
+ */
26
+ export declare function applyFlagVerdict(db: WorkspaceDB, flag: PipelineFlag, input: ApplyVerdictInput): ApplyVerdictResult;
27
+ //# sourceMappingURL=apply-flag-verdict.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apply-flag-verdict.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/apply-flag-verdict.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAI/E,eAAO,MAAM,oBAAoB,EAAE,aAAa,EAAyD,CAAC;AAE1G,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,uFAAuF;IACvF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,YAAY,EAAE,eAAe,CAAC;IAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC5E;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,WAAW,EACf,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,iBAAiB,GACvB,kBAAkB,CAuCpB"}
@@ -0,0 +1,57 @@
1
+ // apply-flag-verdict.ts — the ONE mechanical applier for a flag verdict.
2
+ //
3
+ // Validate a {verdict, reason, execute?, winning_block_id?} against a flag, run the
4
+ // merge if asked, write the verdict back. Pure mechanics — no LLM, no NL. Both
5
+ // resolution surfaces call THIS so they can't diverge on validation or merge
6
+ // semantics:
7
+ // • REST — POST /api/flags/:id/review (operator override)
8
+ // • NL — nl-accept.ts (agent stated its decision in its reply)
9
+ //
10
+ // Charter Rule 2 honored downstream: executeMerge archives the loser (recoverable),
11
+ // never deletes.
12
+ import { markFlagReviewed } from "./pipeline-flags.js";
13
+ import { executeMerge } from "./flag-reviewer.js";
14
+ export const APPLY_VALID_VERDICTS = ["merge", "leave", "split", "pending_clarification"];
15
+ /**
16
+ * Apply a verdict to a (fresh, not-yet-reviewed) flag. Caller is responsible for the
17
+ * not-found / already-reviewed pre-checks (the REST route returns 404/409; the NL
18
+ * path re-reads the pending set). Returns a discriminated result the caller maps to
19
+ * its surface (HTTP status / log).
20
+ */
21
+ export function applyFlagVerdict(db, flag, input) {
22
+ const raw = db.db;
23
+ const verdict = input.verdict;
24
+ const reason = (input.reason ?? "").trim();
25
+ if (!APPLY_VALID_VERDICTS.includes(verdict)) {
26
+ return { ok: false, code: "BAD_VERDICT", message: `verdict must be one of ${APPLY_VALID_VERDICTS.filter(Boolean).join(", ")}` };
27
+ }
28
+ if (!reason) {
29
+ return { ok: false, code: "REASON_REQUIRED", message: "reason is required (the durable audit trail for this resolution)" };
30
+ }
31
+ let action_taken = "none";
32
+ let winningId = input.winning_block_id ?? null;
33
+ if (input.execute && verdict === "merge") {
34
+ if (!input.winning_block_id) {
35
+ return { ok: false, code: "WINNER_REQUIRED", message: "winning_block_id required when execute=true and verdict='merge'" };
36
+ }
37
+ const validWinner = input.winning_block_id === flag.block_id_a || input.winning_block_id === flag.block_id_b;
38
+ if (!validWinner) {
39
+ return { ok: false, code: "BAD_WINNER", message: `winning_block_id must be one of the flag's blocks (${flag.block_id_a}, ${flag.block_id_b})` };
40
+ }
41
+ const loser = input.winning_block_id === flag.block_id_a ? flag.block_id_b : flag.block_id_a;
42
+ if (!loser) {
43
+ return { ok: false, code: "NO_LOSER", message: "cannot merge a single-block flag (no loser)" };
44
+ }
45
+ action_taken = executeMerge(db, input.winning_block_id, loser);
46
+ if (action_taken === "none") {
47
+ return { ok: false, code: "MERGE_FAILED", message: "merge execution failed (block not found or self-merge) — flag NOT marked reviewed" };
48
+ }
49
+ winningId = input.winning_block_id;
50
+ }
51
+ const wrote = markFlagReviewed(raw, { flag_id: flag.id, verdict, reason, action_taken, winning_block_id: winningId });
52
+ if (!wrote) {
53
+ return { ok: false, code: "ALREADY_REVIEWED", message: "flag was reviewed concurrently — re-fetch to see the verdict" };
54
+ }
55
+ return { ok: true, action_taken, winning_block_id: winningId };
56
+ }
57
+ //# sourceMappingURL=apply-flag-verdict.js.map