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,92 @@
1
+ // root-relatedness.ts — derive a MEANING-CLASSIFIED root-relatedness map from the
2
+ // CROSS-ROOT edges already in the graph. The "Venn overlap" of two project roots,
3
+ // grounded in real edges (no LLM, no hallucination).
4
+ //
5
+ // "Related" is NOT one thing — each relation type carries a DIFFERENT meaning, so
6
+ // edges are classified into categories rather than lumped:
7
+ // dependency — based_on/prompted_by/derived_from/supports/extends/depends_on/affects
8
+ // ("A reasons from / is triggered by B") — the real cross-root overlap
9
+ // containment — part_of/contains ("A is INSIDE B") — the nesting signal, strongest
10
+ // evolution — supersedes/superseded_by ("A replaced B") — shared topic revisited
11
+ // conflict — contradicts — a conflict to resolve, surfaced distinctly
12
+ // loose — related_to — generic association
13
+ // EXCLUDED: member_of (chain grouping — would double-count) + provenance types
14
+ // (extracted_from/produced/describes/implements…) — not topic relatedness.
15
+ // Directional for the SUBORDINATING types, so "gear belongs under wind-river" falls out.
16
+ const CATEGORY = {
17
+ based_on: "dependency", prompted_by: "dependency", derived_from: "dependency",
18
+ supports: "dependency", extends: "dependency", depends_on: "dependency",
19
+ affects: "dependency", affected_by: "dependency", triggered: "dependency", enables: "dependency",
20
+ part_of: "containment", contains: "containment",
21
+ supersedes: "evolution", superseded_by: "evolution",
22
+ contradicts: "conflict",
23
+ related_to: "loose",
24
+ };
25
+ // Types where SOURCE is subordinate to TARGET (source depends on / sits under target).
26
+ const SUBORDINATING = new Set(["based_on", "prompted_by", "derived_from", "depends_on", "part_of", "triggered", "affected_by"]);
27
+ // Grouping + provenance — NOT topic relatedness.
28
+ const EXCLUDE = new Set(["member_of", "extracted_from", "produced", "describes", "described_by", "implements", "implemented_by"]);
29
+ /** Pure: classify cross-root edges into a meaning-categorized relatedness map. Testable. */
30
+ export function classifyRootRelatedness(blocks, edges) {
31
+ const byId = new Map(blocks.map((b) => [b.id, b]));
32
+ const rootOf = (id) => {
33
+ const b = byId.get(id);
34
+ if (!b)
35
+ return null;
36
+ return b.type === "project" ? b.id : b.project_id;
37
+ };
38
+ const labelOf = (rid) => byId.get(rid)?.label ?? rid;
39
+ const pairs = new Map();
40
+ for (const e of edges) {
41
+ if (EXCLUDE.has(e.type))
42
+ continue;
43
+ const cat = CATEGORY[e.type];
44
+ if (!cat)
45
+ continue;
46
+ const rs = rootOf(e.source_id), rt = rootOf(e.target_id);
47
+ if (!rs || !rt || rs === rt)
48
+ continue;
49
+ const [a, b] = rs < rt ? [rs, rt] : [rt, rs];
50
+ const k = `${a}|${b}`;
51
+ let acc = pairs.get(k);
52
+ if (!acc) {
53
+ acc = { a, b, cats: new Map(), subUp: new Map() };
54
+ pairs.set(k, acc);
55
+ }
56
+ acc.cats.set(cat, (acc.cats.get(cat) ?? 0) + 1);
57
+ if (SUBORDINATING.has(e.type))
58
+ acc.subUp.set(rt, (acc.subUp.get(rt) ?? 0) + 1); // target is the parent
59
+ }
60
+ const out = [];
61
+ const related = new Set();
62
+ for (const acc of pairs.values()) {
63
+ related.add(acc.a);
64
+ related.add(acc.b);
65
+ const categories = {};
66
+ let total = 0;
67
+ for (const [c, n] of acc.cats) {
68
+ categories[c] = n;
69
+ total += n;
70
+ }
71
+ let parent = null, parentEdges = 0;
72
+ for (const [rid, n] of acc.subUp)
73
+ if (n > parentEdges) {
74
+ parent = labelOf(rid);
75
+ parentEdges = n;
76
+ }
77
+ out.push({ root_a: labelOf(acc.a), root_b: labelOf(acc.b), categories, total, parent, parent_subordinating_edges: parentEdges });
78
+ }
79
+ out.sort((x, y) => y.total - x.total);
80
+ const standalone = blocks.filter((b) => b.type === "project" && !related.has(b.id)).map((b) => b.label);
81
+ return { pairs: out, standalone };
82
+ }
83
+ /** DB wrapper: read blocks + active relations, classify. */
84
+ export function deriveRootRelatedness(db) {
85
+ const blocks = db.getAllBlocks().map((b) => ({
86
+ id: b.id, label: b.label, type: b.type, project_id: b.project_id ?? null,
87
+ }));
88
+ const raw = db.db;
89
+ const edges = raw.prepare("SELECT source_id, target_id, type FROM relations WHERE valid_to IS NULL").all();
90
+ return classifyRootRelatedness(blocks, edges);
91
+ }
92
+ //# sourceMappingURL=root-relatedness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-relatedness.js","sourceRoot":"","sources":["../../../src/middleware/reflect/root-relatedness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { WorkspaceDB } from "../../store/database.js";
2
+ export interface SchemaHealResult {
3
+ flagged: number;
4
+ healed: number;
5
+ collided: number;
6
+ skipped: number;
7
+ healed_labels: string[];
8
+ }
9
+ /**
10
+ * Apply demoteForSave() retroactively to every needs_review block. Pure use of the
11
+ * existing rule + db.updateBlock (which records block_history). Idempotent: a healed
12
+ * block becomes review_status='corrected' and is no longer picked up on a re-run.
13
+ */
14
+ export declare function healSchemaDemotes(db: WorkspaceDB): SchemaHealResult;
15
+ export declare function schemaHealEnabled(): boolean;
16
+ /** Start the $0 deterministic schema-heal sweep. Default-ON (Tier-1). Idempotent.
17
+ * Runs an initial sweep ~15s after boot (let the server settle), then periodically. */
18
+ export declare function startSchemaHealTimer(db: WorkspaceDB): boolean;
19
+ export declare function stopSchemaHealTimer(): void;
20
+ /** Tests only — is the timer running? */
21
+ export declare function _isSchemaHealTimerRunningForTests(): boolean;
22
+ //# sourceMappingURL=schema-heal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-heal.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/schema-heal.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAI3D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,WAAW,GAAG,gBAAgB,CA4BnE;AAWD,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAuBD;wFACwF;AACxF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAa7D;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,yCAAyC;AACzC,wBAAgB,iCAAiC,IAAI,OAAO,CAE3D"}
@@ -0,0 +1,119 @@
1
+ // schema-heal.ts — retroactive backfill of the deterministic demote-at-save heal.
2
+ //
3
+ // WHY: demoteForSave() (schema-validator.ts) re-types a block whose content fits a
4
+ // DIFFERENT type better — an `insight` with no `implication` IS, by definition, a
5
+ // `fact` whose value is the observation. But it runs at SAVE time, forward-only, so
6
+ // blocks created before it shipped (2026-06-12) sit FLAGGED
7
+ // (review_status='needs_review', schema_mismatch) instead of demoted. This applies the
8
+ // SAME deterministic rule retroactively to already-flagged blocks.
9
+ //
10
+ // CORRECTS, never deletes (Rule 2):
11
+ // - clean case → re-type via the demote (insight→fact: label segment renamed,
12
+ // observation mapped to value), flag cleared.
13
+ // - collision → the demoted label already exists, so this block DUPLICATES it.
14
+ // That's a MERGE judgment, not a clean demote — LEFT flagged for the
15
+ // dup-reviewer; never auto-merged here on a label match alone.
16
+ // - not eligible→ no DEMOTE_TARGETS row / extras / source field missing → LEFT flagged.
17
+ //
18
+ // $0 — no LLM, pure deterministic rule. Run via POST /api/admin/heal-schema-demotes
19
+ // (the server's single DB connection). NEVER run as a script against a server-held DB.
20
+ import { demoteForSave } from "./schema-validator.js";
21
+ import { intFromEnv } from "./config.js";
22
+ /**
23
+ * Apply demoteForSave() retroactively to every needs_review block. Pure use of the
24
+ * existing rule + db.updateBlock (which records block_history). Idempotent: a healed
25
+ * block becomes review_status='corrected' and is no longer picked up on a re-run.
26
+ */
27
+ export function healSchemaDemotes(db) {
28
+ const flagged = db.getAllBlocks().filter((b) => b.review_status === "needs_review");
29
+ const res = { flagged: flagged.length, healed: 0, collided: 0, skipped: 0, healed_labels: [] };
30
+ for (const b of flagged) {
31
+ let content = {};
32
+ try {
33
+ content = typeof b.content === "string" ? JSON.parse(b.content) : (b.content ?? {});
34
+ }
35
+ catch {
36
+ content = {};
37
+ }
38
+ const unique = content.unique ?? {};
39
+ const demotion = demoteForSave(b.type, unique, b.label);
40
+ if (!demotion) {
41
+ res.skipped++;
42
+ continue;
43
+ }
44
+ // Collision: the demoted label is already taken → this block duplicates an
45
+ // existing one. Merging is a judgment for the dup-reviewer; leave it flagged.
46
+ if (db.getBlock(demotion.label)) {
47
+ res.collided++;
48
+ continue;
49
+ }
50
+ content.unique = demotion.unique;
51
+ db.updateBlock(b.id, { type: demotion.type, label: demotion.label, content, review_status: "corrected", review_reason: "" }, `schema-heal: demoted ${demotion.from_type}→${demotion.type} (required field unfillable)`, "schema_heal");
52
+ res.healed++;
53
+ res.healed_labels.push(demotion.label);
54
+ }
55
+ return res;
56
+ }
57
+ // ─── Background sweep (Tier-1 LOCKED-ON per docs/RELEASE-DEFAULTS-AND-SELF-MAINTENANCE.md) ──
58
+ // The doc lists schema-heal as a default-on essential ($0 deterministic), but only the
59
+ // save-time demote (forward) + the manual /api/admin/heal-schema-demotes endpoint were ever
60
+ // wired — so OLD flagged blocks never got swept (the doc↔code drift the backpacking DB's 8
61
+ // schema_mismatch flags exposed, 2026-06-21). This timer makes the doc true: a periodic $0
62
+ // deterministic sweep over the server's OWN db connection (the safe path — NEVER a script
63
+ // against a server-held DB). Idempotent (healed → review_status='corrected', not re-picked),
64
+ // so re-running is free. Opt-out only: NODEDEX_SCHEMA_HEAL_ENABLED=off.
65
+ export function schemaHealEnabled() {
66
+ return (process.env.NODEDEX_SCHEMA_HEAL_ENABLED ?? "on").toLowerCase() !== "off";
67
+ }
68
+ function intervalMs() {
69
+ return intFromEnv("NODEDEX_SCHEMA_HEAL_INTERVAL_MS", 1_800_000); // 30 min (slow background)
70
+ }
71
+ let _handle = null;
72
+ let _inFlight = false;
73
+ function tick(db) {
74
+ if (_inFlight)
75
+ return;
76
+ _inFlight = true;
77
+ try {
78
+ const r = healSchemaDemotes(db);
79
+ if (r.healed > 0 || r.collided > 0) {
80
+ console.log(`[schema-heal] swept: flagged=${r.flagged} healed=${r.healed} collided=${r.collided} skipped=${r.skipped}`);
81
+ }
82
+ }
83
+ catch (e) {
84
+ console.warn(`[schema-heal] sweep threw: ${e?.message ?? e}`);
85
+ }
86
+ finally {
87
+ _inFlight = false;
88
+ }
89
+ }
90
+ /** Start the $0 deterministic schema-heal sweep. Default-ON (Tier-1). Idempotent.
91
+ * Runs an initial sweep ~15s after boot (let the server settle), then periodically. */
92
+ export function startSchemaHealTimer(db) {
93
+ if (!schemaHealEnabled()) {
94
+ console.log("[schema-heal] disabled (NODEDEX_SCHEMA_HEAL_ENABLED=off)");
95
+ return false;
96
+ }
97
+ if (_handle !== null)
98
+ return false;
99
+ const ms = intervalMs();
100
+ const initial = setTimeout(() => tick(db), 15_000);
101
+ if (typeof initial.unref === "function")
102
+ initial.unref();
103
+ _handle = setInterval(() => tick(db), ms);
104
+ if (typeof _handle.unref === "function")
105
+ _handle.unref();
106
+ console.log(`[schema-heal] started: $0 deterministic sweep, interval=${ms}ms (initial in 15s)`);
107
+ return true;
108
+ }
109
+ export function stopSchemaHealTimer() {
110
+ if (_handle !== null) {
111
+ clearInterval(_handle);
112
+ _handle = null;
113
+ }
114
+ }
115
+ /** Tests only — is the timer running? */
116
+ export function _isSchemaHealTimerRunningForTests() {
117
+ return _handle !== null;
118
+ }
119
+ //# sourceMappingURL=schema-heal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-heal.js","sourceRoot":"","sources":["../../../src/middleware/reflect/schema-heal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Required and optional unique{} keys per block type.
3
+ *
4
+ * `required[]` — keys that MUST be present (non-empty) for the type to be valid.
5
+ * `optional[]` — keys that MAY appear. Anything outside required ∪ optional is
6
+ * an "extras" violation (probably wrong type for the content).
7
+ * Empty arrays in BOTH → freeform / no-schema type (project, process, note),
8
+ * always passes validation.
9
+ */
10
+ export declare const TYPE_UNIQUE_SCHEMA: Record<string, {
11
+ required: string[];
12
+ optional: string[];
13
+ }>;
14
+ export type SchemaCheckResult = {
15
+ ok: true;
16
+ } | {
17
+ ok: false;
18
+ missing: string[];
19
+ extras: string[];
20
+ detail: string;
21
+ };
22
+ /**
23
+ * Check if `unique{}` matches the type's declared schema.
24
+ *
25
+ * Returns `{ ok: true }` if:
26
+ * - the type has no declared schema (novel/freeform), OR
27
+ * - all required keys are present (non-empty) AND no unexpected keys are present.
28
+ *
29
+ * Returns `{ ok: false, missing, extras, detail }` otherwise.
30
+ *
31
+ * "Present" means: the key exists AND its value is not null/undefined/empty-string.
32
+ * Whitespace-only strings are treated as empty.
33
+ */
34
+ export declare function validateUniqueSchema(type: string | undefined | null, unique: Record<string, unknown> | undefined | null): SchemaCheckResult;
35
+ /**
36
+ * Compose a review_reason string for a schema mismatch, prefixed so downstream
37
+ * consumers (UI, audits) can recognize the source.
38
+ */
39
+ export declare function schemaMismatchReason(check: SchemaCheckResult): string | null;
40
+ /**
41
+ * DEMOTE_TARGETS — type re-targeting map for the demote-edge (2026-05-27, debt-3
42
+ * structural-small; relocated here 2026-06-12 so seam-α and the save-time demote
43
+ * share ONE source of truth — pass2-seams re-exports it).
44
+ *
45
+ * Each row encodes a UNIVERSAL meaning-equivalence (per docs/reference/block-types.md
46
+ * definitions), NEVER a domain-specific heuristic. The gate for adding a row:
47
+ *
48
+ * "If type X's required field is genuinely unfillable AND the equivalent content
49
+ * is fillable as type Y, then 'X without that field' IS Y, by Y's definition."
50
+ *
51
+ * Current rows:
52
+ * - insight → fact: an insight is `observation + implication`; a fact is
53
+ * `value + why_matters?`. An insight whose implication is unfillable while
54
+ * observation is present IS, by definition, a fact whose value is that
55
+ * observation. The demote encodes this; it does not invent it.
56
+ */
57
+ export declare const DEMOTE_TARGETS: Record<string, {
58
+ to: string;
59
+ field_map: Record<string, string>;
60
+ }>;
61
+ export interface SaveDemotion {
62
+ type: string;
63
+ unique: Record<string, unknown>;
64
+ label: string;
65
+ from_type: string;
66
+ }
67
+ /**
68
+ * Tier 1B demote-at-save (2026-06-12). The v1 path applies DEMOTE_TARGETS at
69
+ * seam-α (before naming); the v2 TRANSFORM path enters at Pass 3 and SKIPS that
70
+ * seam — so schema-clean-but-demotable blocks were arriving at save flagged
71
+ * (`schema_mismatch: missing=[implication]`) instead of demoted (6/6 of the
72
+ * 2026-06-12 audit's flags). This applies the SAME equivalence at the final seam.
73
+ *
74
+ * CONSERVATIVE by contract — demotes ONLY the exact case:
75
+ * - the type has a DEMOTE_TARGETS row, AND
76
+ * - the ONLY schema problem is that every missing key is a mapped source key
77
+ * whose target content is present (no extras, nothing else missing), AND
78
+ * - the label's type segment can be renamed so label and type stay in
79
+ * agreement (a half-demote that leaves `_insight_` in the label would break
80
+ * findability — then we keep the flag instead).
81
+ * Anything outside that → return null → the existing soft-flag path applies
82
+ * (capture-first: a wrong flag is recoverable; a wrong rewrite is not).
83
+ */
84
+ export declare function demoteForSave(type: string | undefined | null, unique: Record<string, unknown> | undefined | null, label: string | undefined | null): SaveDemotion | null;
85
+ //# sourceMappingURL=schema-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/schema-validator.ts"],"names":[],"mappings":"AAwBA;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAyCzF,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,GACjD,iBAAiB,CA4BnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAG5E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAE5F,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,EAClD,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAC/B,YAAY,GAAG,IAAI,CAyBrB"}
@@ -0,0 +1,196 @@
1
+ // ═══════════════════════════════════════════════════════════════════════════════
2
+ // SCHEMA VALIDATOR — Tier 1B (2026-05-24)
3
+ //
4
+ // Role: At save time, verify that a block's `content.unique{}` key-set matches
5
+ // the schema declared for its `type`. Catches type-vs-shape mismatches
6
+ // that the type discriminator (Pass 1/2) failed to prevent.
7
+ //
8
+ // Mode: SOFT — never rejects a save. On mismatch, flags the block with
9
+ // review_status="needs_review" and a structured review_reason. Charter
10
+ // rule 2 (never delete vetted blocks) + rule 6 (guards catch failure,
11
+ // never override success). The flag is recoverable; deletion is not.
12
+ //
13
+ // Source of truth: docs/reference/block-types.md (last verified 2026-05-24).
14
+ // When a type's schema changes there, update TYPE_UNIQUE_SCHEMA
15
+ // here too — the doc and code drift independently otherwise.
16
+ //
17
+ // Not validated by this module:
18
+ // - Whether the type name itself is in KNOWN_BLOCK_TYPES (pipeline already
19
+ // handles that elsewhere).
20
+ // - Whether the values inside unique{} are non-empty / semantically valid.
21
+ // That's Pass 2/Pass 3's job; this validator only checks key-set shape.
22
+ // - Novel types created by Pass 2 with their own schema{} — they're trusted.
23
+ // ═══════════════════════════════════════════════════════════════════════════════
24
+ /**
25
+ * Required and optional unique{} keys per block type.
26
+ *
27
+ * `required[]` — keys that MUST be present (non-empty) for the type to be valid.
28
+ * `optional[]` — keys that MAY appear. Anything outside required ∪ optional is
29
+ * an "extras" violation (probably wrong type for the content).
30
+ * Empty arrays in BOTH → freeform / no-schema type (project, process, note),
31
+ * always passes validation.
32
+ */
33
+ export const TYPE_UNIQUE_SCHEMA = {
34
+ // Permanent core types
35
+ decision: { required: ["choice"], optional: ["reason", "alternatives_rejected"] },
36
+ dead_end: { required: ["approach", "reason"], optional: ["alternative"] },
37
+ constraint: { required: ["limit"], optional: ["reason", "source"] },
38
+ blueprint: { required: ["purpose"], optional: ["status", "trigger_to_implement"] },
39
+ preference: { required: ["lean"], optional: ["over", "condition"] },
40
+ // Chain — narrative summary. `conclusion` added 2026-05-18 (commit e0e41b8).
41
+ chain: { required: ["arc"], optional: ["conclusion"] },
42
+ // Project-scoped types
43
+ fact: { required: ["value"], optional: ["why_matters"] },
44
+ insight: { required: ["observation", "implication"], optional: [] },
45
+ // reasoning_chain collapsed → insight (2026-06-15): validator-identical; "derived-ness"
46
+ // lives in the derived_from relations + workspace_derive's content sub-object, not the type.
47
+ task: { required: ["status", "description"], optional: ["owner"] },
48
+ question: { required: ["question"], optional: ["why_matters"] },
49
+ hypothesis: { required: ["proposal"], optional: ["evidence_for", "evidence_against"] },
50
+ entity: { required: ["name"], optional: ["role"] },
51
+ artifact: { required: ["path"], optional: ["description"] },
52
+ // claim / metric collapsed → fact (2026-06-15): the system never branched on them (a
53
+ // fact + flavor); the distinguishing detail lives in fact.value/why_matters or a relation.
54
+ // KEPT: hypothesis (an unverified guess ≠ a verified fact = a real stance) and entity (the
55
+ // pipeline auto-creates entity blocks as label sub-group containers — a structural role).
56
+ // An event is a timestamped OCCURRENCE — something that happened. It is distinct
57
+ // from a `fact` (a standing truth) and a `task` (a not-yet-done). `what_happened`
58
+ // is the irreducible core (the occurrence itself); the TYPE label carries the
59
+ // happened-vs-true distinction, so the field schema stays thin. CAUSALITY lives in
60
+ // RELATIONS (the causal chain is the unit of meaning), never in a field — so
61
+ // `outcome` is optional and only for a trivial inline result (a significant
62
+ // consequence becomes its own chain node), and `date` is optional, only when the
63
+ // absolute time is itself the recall key. (2026-06-15: reconciled the prompt /
64
+ // validator / doc, which had drifted — the validator wrongly required `value`;
65
+ // `what_happened` is the honest field the extraction prompt already teaches.)
66
+ event: { required: ["what_happened"], optional: ["outcome", "date"] },
67
+ // Freeform / no-schema — always pass
68
+ project: { required: [], optional: [] },
69
+ process: { required: [], optional: [] },
70
+ note: { required: [], optional: [] },
71
+ draft: { required: [], optional: [] },
72
+ };
73
+ /**
74
+ * Check if `unique{}` matches the type's declared schema.
75
+ *
76
+ * Returns `{ ok: true }` if:
77
+ * - the type has no declared schema (novel/freeform), OR
78
+ * - all required keys are present (non-empty) AND no unexpected keys are present.
79
+ *
80
+ * Returns `{ ok: false, missing, extras, detail }` otherwise.
81
+ *
82
+ * "Present" means: the key exists AND its value is not null/undefined/empty-string.
83
+ * Whitespace-only strings are treated as empty.
84
+ */
85
+ export function validateUniqueSchema(type, unique) {
86
+ if (!type)
87
+ return { ok: true }; // can't validate without a type label
88
+ const schema = TYPE_UNIQUE_SCHEMA[type];
89
+ if (!schema)
90
+ return { ok: true }; // novel/unknown type — Pass 2 trusted for these
91
+ // Freeform: both arrays empty → always pass.
92
+ if (schema.required.length === 0 && schema.optional.length === 0)
93
+ return { ok: true };
94
+ const u = unique || {};
95
+ const present = new Set();
96
+ for (const [k, v] of Object.entries(u)) {
97
+ if (v === null || v === undefined)
98
+ continue;
99
+ if (typeof v === "string" && v.trim() === "")
100
+ continue;
101
+ present.add(k);
102
+ }
103
+ const missing = schema.required.filter((k) => !present.has(k));
104
+ const allowed = new Set([...schema.required, ...schema.optional]);
105
+ const extras = [...present].filter((k) => !allowed.has(k));
106
+ if (missing.length === 0 && extras.length === 0)
107
+ return { ok: true };
108
+ const parts = [];
109
+ if (missing.length > 0)
110
+ parts.push(`missing=[${missing.join(",")}]`);
111
+ if (extras.length > 0)
112
+ parts.push(`extras=[${extras.join(",")}]`);
113
+ const detail = `type=${type} ${parts.join(" ")}`;
114
+ return { ok: false, missing, extras, detail };
115
+ }
116
+ /**
117
+ * Compose a review_reason string for a schema mismatch, prefixed so downstream
118
+ * consumers (UI, audits) can recognize the source.
119
+ */
120
+ export function schemaMismatchReason(check) {
121
+ if (check.ok)
122
+ return null;
123
+ return `schema_mismatch: ${check.detail}`;
124
+ }
125
+ /**
126
+ * DEMOTE_TARGETS — type re-targeting map for the demote-edge (2026-05-27, debt-3
127
+ * structural-small; relocated here 2026-06-12 so seam-α and the save-time demote
128
+ * share ONE source of truth — pass2-seams re-exports it).
129
+ *
130
+ * Each row encodes a UNIVERSAL meaning-equivalence (per docs/reference/block-types.md
131
+ * definitions), NEVER a domain-specific heuristic. The gate for adding a row:
132
+ *
133
+ * "If type X's required field is genuinely unfillable AND the equivalent content
134
+ * is fillable as type Y, then 'X without that field' IS Y, by Y's definition."
135
+ *
136
+ * Current rows:
137
+ * - insight → fact: an insight is `observation + implication`; a fact is
138
+ * `value + why_matters?`. An insight whose implication is unfillable while
139
+ * observation is present IS, by definition, a fact whose value is that
140
+ * observation. The demote encodes this; it does not invent it.
141
+ */
142
+ export const DEMOTE_TARGETS = {
143
+ insight: { to: "fact", field_map: { observation: "value" } },
144
+ };
145
+ /**
146
+ * Tier 1B demote-at-save (2026-06-12). The v1 path applies DEMOTE_TARGETS at
147
+ * seam-α (before naming); the v2 TRANSFORM path enters at Pass 3 and SKIPS that
148
+ * seam — so schema-clean-but-demotable blocks were arriving at save flagged
149
+ * (`schema_mismatch: missing=[implication]`) instead of demoted (6/6 of the
150
+ * 2026-06-12 audit's flags). This applies the SAME equivalence at the final seam.
151
+ *
152
+ * CONSERVATIVE by contract — demotes ONLY the exact case:
153
+ * - the type has a DEMOTE_TARGETS row, AND
154
+ * - the ONLY schema problem is that every missing key is a mapped source key
155
+ * whose target content is present (no extras, nothing else missing), AND
156
+ * - the label's type segment can be renamed so label and type stay in
157
+ * agreement (a half-demote that leaves `_insight_` in the label would break
158
+ * findability — then we keep the flag instead).
159
+ * Anything outside that → return null → the existing soft-flag path applies
160
+ * (capture-first: a wrong flag is recoverable; a wrong rewrite is not).
161
+ */
162
+ export function demoteForSave(type, unique, label) {
163
+ if (!type || !label)
164
+ return null;
165
+ const row = DEMOTE_TARGETS[type];
166
+ if (!row)
167
+ return null;
168
+ const check = validateUniqueSchema(type, unique);
169
+ if (check.ok)
170
+ return null; // nothing to repair
171
+ if (check.extras.length > 0)
172
+ return null; // shape doesn't cleanly fit either type
173
+ const mappedSources = new Set(Object.keys(row.field_map)); // e.g. {observation}
174
+ const u = unique || {};
175
+ // every missing key must be a non-source required key (i.e. the unfillable one),
176
+ // and every mapped source must be present with real content
177
+ for (const m of check.missing) {
178
+ if (mappedSources.has(m))
179
+ return null; // the SOURCE itself is missing → worse failure, keep flag
180
+ }
181
+ const newUnique = {};
182
+ for (const [src, dst] of Object.entries(row.field_map)) {
183
+ const v = u[src];
184
+ if (typeof v !== "string" || v.trim() === "")
185
+ return null;
186
+ newUnique[dst] = v;
187
+ }
188
+ // the demoted shape must actually validate as the target type
189
+ if (!validateUniqueSchema(row.to, newUnique).ok)
190
+ return null;
191
+ const newLabel = label.replace(`_${type}_`, `_${row.to}_`);
192
+ if (newLabel === label)
193
+ return null; // type segment not found → don't half-demote
194
+ return { type: row.to, unique: newUnique, label: newLabel, from_type: type };
195
+ }
196
+ //# sourceMappingURL=schema-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../../src/middleware/reflect/schema-validator.ts"],"names":[],"mappings":"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"}