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,480 @@
1
+ // ═══════════════════════════════════════════════════════════════════════════════
2
+ // PASS 2b — FILL UNIQUE{} (Week 2 step 2, debt #1, 2026-05-25)
3
+ //
4
+ // Role: The second of three sub-passes in the Pass 2 split (see
5
+ // docs/PASS2-SPLIT-DESIGN.md §2 Pass ownership). Takes one item from
6
+ // Pass 2a (type already assigned) and fills the `unique{}` fields
7
+ // per the type's schema. NEVER changes the type. NEVER wires causal
8
+ // relations. PER-ITEM, parallelizable.
9
+ //
10
+ // What this pass DOES (§2 ownership):
11
+ // - UNIQUE FIELDS — populate using ONLY the assigned type's schema
12
+ // - The insight discriminator check (implication vs reason vs proposal)
13
+ // - Schema-shape self-check before emitting (structured output enforces it;
14
+ // Seam α validation is the hard gate)
15
+ //
16
+ // What this pass does NOT do (anti-examples, §2):
17
+ // - Change the `type` — read-only per Seam α contract; if 2b can't fill,
18
+ // it emits its best attempt, the seam validator routes back to 2a
19
+ // - Reclassify if the schema doesn't fit — that's the seam's job
20
+ // - Wire relations (`triggered_by_items`, `based_on_items`, `relations`) —
21
+ // that's Pass 2c
22
+ // - Touch other items' fields — 2b is strictly per-item
23
+ // - Use BATCH visibility — each item processed independently (parallelizable)
24
+ //
25
+ // Failure mode (per §3): if 2b can't fill the schema for the assigned type,
26
+ // it just emits what it has. The Seam α validator (`validateSeamAlpha` in
27
+ // pass2-seams.ts) catches the mismatch and routes back to 2a OR quarantines.
28
+ // 2b is not in the route-back decision loop; it just tries.
29
+ //
30
+ // Status:
31
+ // - Standalone file. NOT wired into pipeline.ts yet (Week 2 wiring is the
32
+ // next step). Callable in tests with synthetic inputs.
33
+ // - `pass2.ts` is FROZEN per §4. This file does NOT replace it.
34
+ //
35
+ // Charter alignment:
36
+ // - Rule 6 (guards catch failure): 2b emits its best attempt; the SEAM
37
+ // catches mismatches. 2b never silently corrupts data.
38
+ // - Rule 7 (determinism is local): per-item structured output, deterministic
39
+ // schema per type, no batch interactions.
40
+ // - Rule 14 (store the path): the type 2a assigned is the path 2b walks;
41
+ // 2b doesn't re-derive it.
42
+ // ═══════════════════════════════════════════════════════════════════════════════
43
+ import { CONFIG } from "./config.js";
44
+ import { TYPE_UNIQUE_SCHEMA } from "./schema-validator.js";
45
+ // ─── Prompt builder ────────────────────────────────────────────────────────────
46
+ //
47
+ // 2b's prompt is much shorter than 2a's because:
48
+ // - No dedup (Q0 is 2a's)
49
+ // - No type assignment (Q1 is 2a's)
50
+ // - No hierarchy / project / supersession (all 2a's)
51
+ // - No causal wiring (2c's)
52
+ // - No PROJECT GRAPH (no dedup needed)
53
+ // - No SCENE CARD (no classification needed)
54
+ //
55
+ // 2b sees only: this item's text + type + which fields to fill.
56
+ // The schema is INJECTED per call from TYPE_UNIQUE_SCHEMA, so 2b prompts
57
+ // don't enumerate all 18 type schemas every call (cost discipline per §7).
58
+ //
59
+ // The insight discriminator is preserved verbatim from monolith for the
60
+ // insight type — that's the Bug-3-class fix this design targets at the
61
+ // Seam α layer, but 2b still does the structural disambiguation in the
62
+ // prompt as a first line of defense.
63
+ /**
64
+ * Build the Pass 2b prompt for a single item. The type's schema is injected
65
+ * directly so the prompt is concise and type-specific.
66
+ *
67
+ * Exposed for tests (so prompt structure can be asserted without an LLM call).
68
+ */
69
+ export function buildPass2bPrompt(item) {
70
+ const schema = TYPE_UNIQUE_SCHEMA[item.type];
71
+ // Novel / unknown type: 2a should have provided schema{} in the seam payload,
72
+ // but at the per-item-fill level we just instruct the model to fill whatever
73
+ // fields make sense; the seam validator will pass through novel types per
74
+ // its bypass rule (see validateSeamAlpha).
75
+ const isNovel = !schema;
76
+ const isFreeform = schema && schema.required.length === 0 && schema.optional.length === 0;
77
+ // Build the type-specific field guidance.
78
+ let fieldGuidance;
79
+ if (isNovel) {
80
+ fieldGuidance =
81
+ `This item's type is "${item.type}" — a novel type defined by Pass 2a.\n` +
82
+ `Fill 1-3 fields in unique{} that capture the essential structured data.\n` +
83
+ `Use short, lowercase, snake_case field names that describe the role of each value.`;
84
+ }
85
+ else if (isFreeform) {
86
+ fieldGuidance =
87
+ `This item's type is "${item.type}" — a freeform type with no required schema.\n` +
88
+ `If structured data is present in the text, capture it. Otherwise leave unique{} empty.`;
89
+ }
90
+ else {
91
+ const required = schema.required.join(", ");
92
+ const optional = schema.optional.join(", ");
93
+ fieldGuidance =
94
+ `This item's type is "${item.type}".\n` +
95
+ `REQUIRED fields (must all be present and non-empty): ${required}\n` +
96
+ (optional.length > 0 ? `OPTIONAL fields (include only if the text actually says them): ${optional}\n` : "") +
97
+ `Use ONLY these field names. Do not invent new fields. Do not include fields not listed above.`;
98
+ }
99
+ // Insight discriminator: preserved verbatim from the monolith UNIQUE FIELDS
100
+ // section. Only fires when the type is insight, but kept in every prompt
101
+ // (cheap and reinforces the discipline even when the type is something else).
102
+ const insightDiscriminator = item.type === "insight"
103
+ ? `\n\nINSIGHT FIELD DISCIPLINE: insight's second field is "implication" (what the observation MEANS going forward) — NOT "proposal" (that field belongs to hypothesis: an unverified guess) and NOT a bare "reason". If the text only gives an observation and a reason without a forward-looking implication, you cannot fill insight cleanly — emit whatever you have and let the seam validator route back. Do NOT invent an implication that isn't in the text.`
104
+ : "";
105
+ // Re-fill retry context (seam α route-back). Tells 2b exactly which required
106
+ // field the first attempt missed, and to LOOK HARDER for it in the text —
107
+ // without licensing fabrication (charter rule 4: don't ask for a weak skill;
108
+ // rule 14: don't invent path-content). The "leave empty if genuinely absent"
109
+ // escape preserves the seam's ability to quarantine a truly-unfillable item.
110
+ const retrySection = item.retryFailureDetail
111
+ ? `\n\nRETRY — a previous fill of this item failed schema validation: ${item.retryFailureDetail}.
112
+ Re-read the text carefully. If the missing field's content IS present — for example a
113
+ forward-looking consequence for "implication", or the action being described for
114
+ "description" — extract and fill it now (the first pass may have been too conservative).
115
+ If the required field is genuinely NOT in the text, leave it empty: the item will be set
116
+ aside rather than saved incorrectly. Never invent content that isn't in the text.`
117
+ : "";
118
+ return `You receive ONE classified item from Pass 2a. Your job is to fill
119
+ its unique{} fields per the assigned type's schema. DO NOT change the type.
120
+ DO NOT wire causal relations (later pass handles that).
121
+
122
+ ${fieldGuidance}
123
+
124
+ EXTRACTION RULES (apply regardless of type):
125
+ - Omit fields that have no value in the text — do not fabricate.
126
+ - Use verbatim language from the text when possible; light paraphrase OK for clarity.
127
+ - Specific named things (a tool name, a number, a date) belong in unique{}.
128
+ - Each field value should be a single concise string.${insightDiscriminator}${retrySection}
129
+
130
+ OUTPUT FORMAT:
131
+ { "id": "<the item's id>", "unique": { <field>: <value>, ... } }
132
+ `;
133
+ }
134
+ /**
135
+ * Output schema for a single 2b call.
136
+ *
137
+ * Defense in depth: `unique` is `type: "object"` with no constraint on which
138
+ * keys appear. This means we cannot prevent the model from emitting extra
139
+ * fields at the schema layer — `sanitizePass2bResult` (below) strips any
140
+ * fields not in the type's allowed set. The seam validator then runs the
141
+ * canonical `validateUniqueSchema` on what survives.
142
+ *
143
+ * Why not constrain the schema to the type's allowed keys?
144
+ * - The per-type set would have to be built dynamically per call
145
+ * - Structured output JSON schemas typically can't express "exactly these
146
+ * keys or those keys" (the union shape varies)
147
+ * - Sanitizer + seam validator gives layered defense without per-call
148
+ * schema gymnastics
149
+ */
150
+ const PASS2B_SCHEMA = {
151
+ type: "object",
152
+ properties: {
153
+ id: { type: "string" },
154
+ unique: {
155
+ type: "object",
156
+ // All known fields as optional strings; model fills what applies for the
157
+ // assigned type. Sanitizer strips anything outside the type's allowed set.
158
+ properties: {
159
+ choice: { type: "string" },
160
+ reason: { type: "string" },
161
+ alternatives_rejected: { type: "string" },
162
+ approach: { type: "string" },
163
+ alternative: { type: "string" },
164
+ limit: { type: "string" },
165
+ source: { type: "string" },
166
+ value: { type: "string" },
167
+ name: { type: "string" },
168
+ role: { type: "string" },
169
+ purpose: { type: "string" },
170
+ status: { type: "string" },
171
+ trigger_to_implement: { type: "string" },
172
+ question: { type: "string" },
173
+ why_matters: { type: "string" },
174
+ observation: { type: "string" },
175
+ implication: { type: "string" },
176
+ description: { type: "string" },
177
+ owner: { type: "string" },
178
+ outcome: { type: "string" },
179
+ proposal: { type: "string" },
180
+ evidence_for: { type: "string" },
181
+ evidence_against: { type: "string" },
182
+ definition: { type: "string" },
183
+ current_value: { type: "string" },
184
+ target: { type: "string" },
185
+ what_happened: { type: "string" },
186
+ date: { type: "string" },
187
+ lean: { type: "string" },
188
+ over: { type: "string" },
189
+ condition: { type: "string" },
190
+ },
191
+ },
192
+ },
193
+ required: ["id", "unique"],
194
+ };
195
+ // ─── Sanitizer ─────────────────────────────────────────────────────────────────
196
+ //
197
+ // Strip `unique{}` fields that aren't allowed for the assigned type.
198
+ //
199
+ // Why: the structured-output schema accepts ALL known fields as optional, so a
200
+ // model emitting `{observation, reason}` for an insight (Bug-3 territory)
201
+ // passes JSON-schema validation but FAILS the type-vs-schema validator. The
202
+ // sanitizer removes the extras BEFORE the seam runs, so:
203
+ // - Seam validator sees only the fields that should be there
204
+ // - If required fields are missing, seam routes back / quarantines as designed
205
+ // - If extras were the model's misread, they're not preserved into the live graph
206
+ //
207
+ // For novel/freeform types: pass through unchanged (no canonical schema to
208
+ // strip against).
209
+ export function sanitizePass2bUnique(type, unique) {
210
+ const schema = TYPE_UNIQUE_SCHEMA[type];
211
+ // Coerce values to strings (the schema declares them as strings; defensive).
212
+ const coerced = {};
213
+ for (const [k, v] of Object.entries(unique ?? {})) {
214
+ if (v === null || v === undefined)
215
+ continue;
216
+ if (typeof v === "string" && v.trim() === "")
217
+ continue;
218
+ coerced[k] = typeof v === "string" ? v : String(v);
219
+ }
220
+ // Novel / unknown type: trust the model (no canonical schema to validate against).
221
+ if (!schema)
222
+ return { unique: coerced, strippedKeys: [] };
223
+ // Freeform (project/process/note): pass through.
224
+ if (schema.required.length === 0 && schema.optional.length === 0) {
225
+ return { unique: coerced, strippedKeys: [] };
226
+ }
227
+ const allowed = new Set([...schema.required, ...schema.optional]);
228
+ const strippedKeys = [];
229
+ const out = {};
230
+ for (const [k, v] of Object.entries(coerced)) {
231
+ if (allowed.has(k))
232
+ out[k] = v;
233
+ else
234
+ strippedKeys.push(k);
235
+ }
236
+ return { unique: out, strippedKeys };
237
+ }
238
+ export function sanitizePass2bResult(type, raw) {
239
+ const { unique, strippedKeys } = sanitizePass2bUnique(type, raw.unique ?? {});
240
+ return { result: { id: raw.id, unique }, strippedKeys };
241
+ }
242
+ // ─── LLM call ──────────────────────────────────────────────────────────────────
243
+ //
244
+ // Per-item LLM call. Returns the filled unique{} (sanitized). Mirrors the
245
+ // rate-limit / model / attempts shape of callPass2aLLM so wiring is uniform.
246
+ export async function callPass2bLLM(provider, item, thinkingBudget = 512, // Smaller than 2a — fill is structural, not reasoning-heavy
247
+ // Multi-model routing (C, 2026-05-25): 2b is structural per-item fill
248
+ // (Haiku-class territory per PASS2-SPLIT-DESIGN.md §7). Universal — string
249
+ // model name, no provider assumption.
250
+ modelOverride) {
251
+ const prompt = buildPass2bPrompt(item);
252
+ // User input: just the item's text + classification_reasoning so model has
253
+ // the context for why 2a picked this type. NO project graph, NO scene card.
254
+ const reasonLine = item.classification_reasoning
255
+ ? `\nCLASSIFICATION REASONING from Pass 2a: ${item.classification_reasoning}\n`
256
+ : "";
257
+ const userInput = `ITEM:\n id: ${item.id}\n type: ${item.type}\n text: ${item.text}\n${reasonLine}`;
258
+ const r = await provider.generateStructured(prompt, userInput, PASS2B_SCHEMA, {
259
+ thinkingBudget,
260
+ maxOutputTokens: CONFIG.pass2.maxOutputTokens,
261
+ ...(modelOverride ? { modelOverride } : {}),
262
+ });
263
+ if (!r.result) {
264
+ return {
265
+ result: null,
266
+ thinking: r.thinking ?? "",
267
+ rateLimited: r.rateLimited,
268
+ model: r.model,
269
+ attempts: r.attempts,
270
+ usage: r.usage, // a failed/truncated call still burned tokens — surface for the batch roll-up
271
+ };
272
+ }
273
+ const { result: clean, strippedKeys } = sanitizePass2bResult(item.type, r.result);
274
+ if (strippedKeys.length > 0) {
275
+ // Sanitizer fired — model emitted fields outside the type's schema.
276
+ // Log loudly so the contract violation is auditable; the seam validator
277
+ // will then run on the sanitized output.
278
+ console.log(`Auto-Reflect Pass 2b: SANITIZER stripped ${strippedKeys.length} extra field(s) on ${item.id} [${item.type}]: ${strippedKeys.join(", ")}`);
279
+ }
280
+ return {
281
+ result: clean,
282
+ thinking: r.thinking ?? "",
283
+ rateLimited: r.rateLimited,
284
+ model: r.model,
285
+ attempts: r.attempts,
286
+ usage: r.usage,
287
+ strippedKeys: strippedKeys.length > 0 ? strippedKeys : undefined,
288
+ };
289
+ }
290
+ // ─── Batch helper ──────────────────────────────────────────────────────────────
291
+ //
292
+ // Calls callPass2bLLM for each item, with configurable parallelism. On
293
+ // rate-limit, an item lands in `failures[]` with reason: 'rate_limited'; the
294
+ // caller can retry-with-backoff or quarantine the item. Sequential fallback is
295
+ // achieved by passing parallelism=1.
296
+ //
297
+ // Default parallelism = 10 — Stage C-1 (2026-05-30). Bumped from 5 after the
298
+ // popup-dinner empirical baseline (28 items, Pass 2 = 143s wall ≈ 59.5% of the
299
+ // 253s reflect run) showed Pass 2b chunked execution dominating Pass 2 wall.
300
+ // At ~20 items, parallelism=5 = 4 chunks sequential; parallelism=10 = 2 chunks
301
+ // ≈ 50% Pass 2b wall reduction when not provider-rate-limited. Existing
302
+ // failure capture (failures[] with reason: 'rate_limited') means a 10-wide
303
+ // burst is safe — 429'd items land in failures[] and the orchestrator
304
+ // retry-with-backoff path handles them. Sequential fallback: parallelism=1.
305
+ //
306
+ // Buying-time-against: Debt 5 (atomic + arc extraction, atlas §9). Per-turn
307
+ // Pass 2 will reshape under Variant A; until then, parallelism is the smallest
308
+ // data-model-independent win on the table.
309
+ //
310
+ // Override precedence (high → low):
311
+ // 1. options.parallelism — explicit caller arg (tests + future per-call tuning)
312
+ // 2. NODEDEX_PASS2B_PARALLELISM env var — operator dial; mirrors NODEDEX_PASS2{A,B,C}_MODEL family
313
+ // 3. DEFAULT_PASS2B_PARALLELISM — compile-time fallback
314
+ const DEFAULT_PASS2B_PARALLELISM = 10;
315
+ function parsePass2bParallelismEnv() {
316
+ const raw = process.env.NODEDEX_PASS2B_PARALLELISM;
317
+ if (!raw)
318
+ return undefined;
319
+ const n = Number.parseInt(raw, 10);
320
+ if (Number.isNaN(n) || n < 1)
321
+ return undefined;
322
+ return n;
323
+ }
324
+ export async function callPass2bBatch(provider, items, options) {
325
+ // Env-var dial — read per call so test overrides take effect without
326
+ // module reload. Bad / NaN / negative → fall through to DEFAULT.
327
+ const envParallelism = parsePass2bParallelismEnv();
328
+ const parallelism = Math.max(1, options?.parallelism ?? envParallelism ?? DEFAULT_PASS2B_PARALLELISM);
329
+ const thinkingBudget = options?.thinkingBudget;
330
+ const modelOverride = options?.modelOverride;
331
+ const results = [];
332
+ const failures = [];
333
+ const usage = { input: 0, thinking: 0, output: 0 };
334
+ // Simple chunked-parallelism: take `parallelism` items at a time, await all,
335
+ // then take the next chunk. Avoids requiring a heavier concurrency lib.
336
+ for (let i = 0; i < items.length; i += parallelism) {
337
+ const chunk = items.slice(i, i + parallelism);
338
+ const settled = await Promise.allSettled(chunk.map((item) => callPass2bLLM(provider, item, thinkingBudget, modelOverride).then((r) => ({ item, r }))));
339
+ for (const s of settled) {
340
+ if (s.status === "rejected") {
341
+ // Promise rejection (unusual — callPass2bLLM normally returns rateLimited
342
+ // or null instead of throwing); capture as llm_error.
343
+ failures.push({ id: "<unknown>", reason: "llm_error", detail: String(s.reason).slice(0, 200) });
344
+ continue;
345
+ }
346
+ const { item, r } = s.value;
347
+ // Roll up usage from every settled call — success or failure — since a
348
+ // truncated/failed call still consumed tokens at the provider.
349
+ if (r.usage) {
350
+ usage.input += r.usage.input ?? 0;
351
+ usage.thinking += r.usage.thinking ?? 0;
352
+ usage.output += r.usage.output ?? 0;
353
+ }
354
+ if (r.result) {
355
+ results.push(r.result);
356
+ }
357
+ else if (r.rateLimited) {
358
+ failures.push({ id: item.id, reason: "rate_limited" });
359
+ }
360
+ else {
361
+ failures.push({ id: item.id, reason: "llm_error", detail: "callPass2bLLM returned null result" });
362
+ }
363
+ }
364
+ }
365
+ return { results, failures, usage };
366
+ }
367
+ // ─── STAGE B — SINGLE-CALL BATCHED FILL (Debt 4 Stage B, 2026-06-13) ────────────
368
+ //
369
+ // The per-item fill above is correct but its fan-out dominates v2 front-half
370
+ // wall time (~1 call per block; ~19 calls on a 3-turn arc). This fills N items
371
+ // in ONE structured call: same TYPE_UNIQUE_SCHEMA, same sanitizer, same
372
+ // never-fabricate rules — only the call SHAPE changes. The risk profile differs
373
+ // from the known fused-call failure (COMPREHEND could not fill *while
374
+ // comprehending*): here fill is still the ONLY job, just over several items.
375
+ //
376
+ // Resilience contract: batching may speed up, it must NEVER lose a fill —
377
+ // any item missing from a batch response (or a whole failed chunk) FALLS BACK
378
+ // to the proven per-item call. Flag: NODEDEX_V2_FILL_BATCH (default ON; =0
379
+ // reverts the v2 front-half to the per-item path).
380
+ export function v2FillBatchEnabled() {
381
+ return process.env.NODEDEX_V2_FILL_BATCH !== "0";
382
+ }
383
+ export function buildPass2bBatchPrompt() {
384
+ return `You receive SEVERAL classified items. For EACH item, fill its unique{}
385
+ fields per the field list given WITH that item. DO NOT change any type. DO NOT
386
+ wire causal relations. Items are independent — never copy content between items.
387
+
388
+ EXTRACTION RULES (apply to every item):
389
+ - Use ONLY the field names listed for that item. Do not invent new fields.
390
+ - Omit fields that have no value in the item's text — do not fabricate.
391
+ - Use verbatim language from the text when possible; light paraphrase OK.
392
+ - Specific named things (a tool name, a number, a date) belong in unique{}.
393
+ - Each field value is a single concise string.
394
+ - When the text states content for an OPTIONAL field (a reason, a status, a
395
+ condition), fill it as its OWN field — do not fold it into the primary field.
396
+
397
+ INSIGHT FIELD DISCIPLINE: insight's second field is "implication" (what the
398
+ observation MEANS going forward) — NOT "proposal" (hypothesis territory) and NOT
399
+ a bare "reason". If an insight's text has no forward-looking implication, emit
400
+ what you have; never invent one.
401
+
402
+ OUTPUT FORMAT:
403
+ { "items": [ { "id": "<item id>", "unique": { <field>: <value>, ... } }, ... ] }
404
+ Return ONE entry per input item, using the exact input ids.`;
405
+ }
406
+ /** One compact schema line per item (the per-item prompt's fieldGuidance, condensed). */
407
+ export function batchFieldLine(type) {
408
+ const schema = TYPE_UNIQUE_SCHEMA[type];
409
+ if (!schema)
410
+ return "novel type — fill 1-3 snake_case fields capturing the essential structured data";
411
+ if (schema.required.length === 0 && schema.optional.length === 0)
412
+ return "freeform — capture structured data if present, else leave unique{} empty";
413
+ const opt = schema.optional.length > 0 ? ` | OPTIONAL: ${schema.optional.join(", ")}` : "";
414
+ return `REQUIRED: ${schema.required.join(", ")}${opt}`;
415
+ }
416
+ const PASS2B_BATCH_SCHEMA = {
417
+ type: "object",
418
+ properties: {
419
+ items: { type: "array", items: PASS2B_SCHEMA },
420
+ },
421
+ required: ["items"],
422
+ };
423
+ export async function callPass2bBatchedFill(provider, items, opts = {}) {
424
+ const chunkSize = Math.max(1, opts.chunkSize ?? 12);
425
+ const usage = { input: 0, thinking: 0, output: 0 };
426
+ const results = [];
427
+ const fellBackIds = [];
428
+ let llmCalls = 0;
429
+ const addUsage = (u) => {
430
+ if (!u)
431
+ return;
432
+ usage.input += u.input ?? 0;
433
+ usage.thinking += u.thinking ?? 0;
434
+ usage.output += u.output ?? 0;
435
+ };
436
+ // The never-lose-a-fill floor: anything the batch path can't account for goes
437
+ // through the proven per-item call.
438
+ const perItemFallback = async (item) => {
439
+ llmCalls += 1;
440
+ fellBackIds.push(item.id);
441
+ const r = await callPass2bLLM(provider, item, 512, opts.modelOverride);
442
+ addUsage(r.usage);
443
+ if (r.result)
444
+ results.push(r.result);
445
+ };
446
+ for (let i = 0; i < items.length; i += chunkSize) {
447
+ const chunk = items.slice(i, i + chunkSize);
448
+ const userInput = chunk
449
+ .map((it) => `ITEM ${it.id}\n type: ${it.type}\n fields: ${batchFieldLine(it.type)}\n text: ${it.text}`)
450
+ .join("\n\n");
451
+ llmCalls += 1;
452
+ const r = await provider.generateStructured(buildPass2bBatchPrompt(), userInput, PASS2B_BATCH_SCHEMA, {
453
+ thinkingBudget: opts.thinkingBudget ?? 1024,
454
+ maxOutputTokens: CONFIG.pass2.maxOutputTokens,
455
+ ...(opts.modelOverride ? { modelOverride: opts.modelOverride } : {}),
456
+ });
457
+ addUsage(r.usage);
458
+ const got = new Map();
459
+ if (r.result?.items) {
460
+ for (const e of r.result.items)
461
+ if (e && e.id)
462
+ got.set(e.id, e.unique ?? {});
463
+ }
464
+ // A failed chunk (null result) leaves `got` empty → every chunk item falls back.
465
+ for (const it of chunk) {
466
+ const raw = got.get(it.id);
467
+ if (raw === undefined) {
468
+ await perItemFallback(it);
469
+ continue;
470
+ }
471
+ const { result: clean, strippedKeys } = sanitizePass2bResult(it.type, { id: it.id, unique: raw });
472
+ if (strippedKeys.length > 0) {
473
+ console.log(`Auto-Reflect Pass 2b(batch): SANITIZER stripped ${strippedKeys.length} extra field(s) on ${it.id} [${it.type}]: ${strippedKeys.join(", ")}`);
474
+ }
475
+ results.push(clean);
476
+ }
477
+ }
478
+ return { results, fellBackIds, llmCalls, usage };
479
+ }
480
+ //# sourceMappingURL=pass2b.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pass2b.js","sourceRoot":"","sources":["../../../src/middleware/reflect/pass2b.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ import type { LLMProvider } from "../../engine/ai-provider.js";
2
+ /**
3
+ * Input to Pass 2c — what 2c sees per item. All fields are READ-ONLY for 2c
4
+ * (Seam β contract, §1). `unique` is included so the model can reason about
5
+ * pair semantics (Q5: does item A contradict item B? requires reading both
6
+ * unique{}s), but 2c never emits a `unique` field on its output.
7
+ *
8
+ * `classification_reasoning` is included as context — the model can see WHY
9
+ * 2a picked the type, which helps Q3 (a dead_end's triggered_by is the
10
+ * decision that adopted the alternative, per REPLACEMENTS rule).
11
+ */
12
+ export interface Pass2cInput {
13
+ id: string;
14
+ text: string;
15
+ type: string;
16
+ project?: string;
17
+ unique: Record<string, string>;
18
+ extends_item?: string;
19
+ supersedes_ref?: string;
20
+ resolved_ref?: string;
21
+ classification_reasoning?: string;
22
+ }
23
+ /**
24
+ * Wiring decisions for ONE item — the entire output of pass2c per item.
25
+ *
26
+ * Per the design discussion 2026-05-25 (Shape A vs Shape B): one item ↔ one
27
+ * wiring bundle, all three axes together. Reflects the conceptual unit ("what
28
+ * causal wiring did 2c decide for this item?") and avoids forcing every
29
+ * downstream consumer (composer, tests, telemetry, future enrichment) to JOIN
30
+ * across two arrays by id forever.
31
+ *
32
+ * The composer (`composeForDownstream`, future) splits this bundle into the
33
+ * shape Pass 3 expects: `causal_wiring[]` (triggered_by + based_on) and
34
+ * per-classified-item `relations[]`.
35
+ */
36
+ export interface Pass2cItemWiring {
37
+ id: string;
38
+ triggered_by: string[];
39
+ based_on: string[];
40
+ relations: Array<{
41
+ type: string;
42
+ target: string;
43
+ reasoning: string;
44
+ }>;
45
+ }
46
+ /**
47
+ * Pass 2c result envelope. Single batch call → single result containing the
48
+ * wiring bundles for every input item.
49
+ *
50
+ * No `skipped[]` (2a already filtered), no `classified[]` (2c doesn't re-emit
51
+ * classification data — composer carries that forward from 2a/2b).
52
+ */
53
+ export interface Pass2cResult {
54
+ wiring: Pass2cItemWiring[];
55
+ }
56
+ export declare const PASS2C_PROMPT = "You receive classified items from Pass 2a (type, project, refs)\nalready filled by Pass 2b (unique{}). Your ONE job: wire causal relations\nbetween these items (and to existing blocks in PROJECT GRAPH).\n\n\u2500\u2500 SEAM \u03B2 CONTRACT \u2014 READ-ONLY \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nDO NOT change any item's type. DO NOT touch unique{} fields. DO NOT change\ntext, id, project, supersedes_ref, resolved_ref, or extends_item. DO NOT add\nor remove items. DO NOT emit skipped[]. DO NOT re-dedup (Pass 2a did Q0).\nDO NOT re-classify (Pass 2a did Q1). If you think 2a or 2b got something\nwrong, EMIT ONLY YOUR WIRING DECISIONS anyway \u2014 the seam validator will\ncatch the mismatch.\n\n\u2500\u2500 STATE CONVENTION \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\"State\" in this prompt = text in marked regions below (PROJECT GRAPH, SCENE\nCARD, ITEMS). Your training knowledge and \"what's commonly known about this\ndomain\" are NOT state. A causal link to an existing block is valid ONLY if a\nblock in PROJECT GRAPH has that exact label.\n\nFor EACH item: walk Q3 \u2192 Q4 \u2192 Q5 in order.\n\n\u2500\u2500 Q3: TRIGGERED_BY \u2014 \"In a world where (X) didn't happen, would (Y) still have occurred?\"\n YES \u2192 no link. NO \u2192 X goes in triggered_by.\n UNCERTAIN \u2192 no link. Wrong wiring (false narrative) costs more than missing wiring (recoverable).\n CIRCULARITY GUARD: before adding A\u2192B, check \"Did I already put B\u2192A?\" YES \u2192 skip.\n Use item IDs for batch, block labels for PROJECT GRAPH. Genesis \u2192 triggered_by: [].\n REPLACEMENTS \"X\u2192Y\": dead_end for X is triggered_by the decision that adopted Y.\n HIERARCHY: \"Did cause make the DECISION necessary, or only this mechanism?\"\n Decision \u2192 triggered_by on parent. Mechanism only \u2192 triggered_by on child.\n\n\u2500\u2500 Q4: BASED_ON \u2014 \"Would this claim be UNSUPPORTED without that specific finding?\"\n NO \u2192 no link. YES \u2192 based_on.\n UNCERTAIN \u2192 no link. False evidence link costs more than missing one.\n Applies to conclusions, decisions justified by findings.\n\n\u2500\u2500 Q5: SEMANTIC RELATIONS \u2014 for each item pair in this batch:\n \"Does (X) directly contradict, support, or answer (Y)?\"\n contradicts: opposite claims about the same specific thing.\n supports: independent evidence strengthening the same claim.\n resolves: (X) answers the question or settles the hypothesis (Y) poses.\n Use ONLY these three relation types. Other relation kinds are emitted by\n other passes (e.g. supersedes, extends, derived_from) \u2014 do not emit them here.\n\n PER-RELATION REASONING: every emitted relation MUST carry a reasoning field\n that NAMES the case (contradicts / supports / resolves) AND CITES the specific\n claim from each item that grounded the decision \u2014 e.g. a contradicts entry\n should read \"contradicts: item_5 claims X always Y; item_9 reports X did not Y in case Z\".\n This is the audit trail downstream consumers (chains, agent inspection) read to\n understand WHY this wire exists. A wire without grounded reasoning is corruption;\n if you cannot cite a specific claim-pair, do not emit the relation.\n\n\u2500\u2500 SCENE CARD CONTEXT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nCAUSAL LINKS in the scene card name explicit cause\u2192effect pairs the agent\nstated in this session \u2014 use them as Q3 input.\n\n\u2500\u2500 OUTPUT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nFor EACH item, emit one wiring entry: { id, triggered_by[], based_on[], relations[] }.\nEach entry in relations[] is { type, target, reasoning } \u2014 reasoning REQUIRED per\nQ5 (names the case + cites the claim-pair). Use [] (empty array) for any axis\nwith no links \u2014 do not omit fields. The id MUST match an input item's id exactly.\nDo NOT emit wiring for items not in the input.\n\n";
57
+ export declare const ALLOWED_PASS2C_RELATION_TYPES: ReadonlySet<string>;
58
+ /**
59
+ * Strip forbidden keys from a single wiring entry. Returns the cleaned wiring
60
+ * + the list of stripped keys (so callers can audit-log contract violations).
61
+ *
62
+ * If `triggered_by` / `based_on` / `relations` are missing, default to empty
63
+ * arrays (the schema requires them; this is defensive). If `relations` items
64
+ * have type values outside ALLOWED_PASS2C_RELATION_TYPES, those entries are
65
+ * dropped — reported in `strippedRelationTypes`.
66
+ */
67
+ export declare function sanitizePass2cItem(raw: Record<string, unknown>): {
68
+ item: Pass2cItemWiring;
69
+ stripped: string[];
70
+ strippedRelationTypes: string[];
71
+ };
72
+ /**
73
+ * Sanitize the full pass2c result. Aggregates per-item stripped keys + relation
74
+ * types so the caller can log the contract-violation surface.
75
+ */
76
+ export declare function sanitizePass2cResult(raw: {
77
+ wiring?: any[];
78
+ }): {
79
+ result: Pass2cResult;
80
+ totalStrippedFields: number;
81
+ perItemStripped: Array<{
82
+ id: string;
83
+ stripped: string[];
84
+ }>;
85
+ perItemStrippedRelationTypes: Array<{
86
+ id: string;
87
+ types: string[];
88
+ }>;
89
+ };
90
+ export declare function callPass2cLLM(provider: LLMProvider, items: Pass2cInput[], projectContext: string, thinkingBudget?: number, sceneCard?: string, modelOverride?: string): Promise<{
91
+ result: Pass2cResult | null;
92
+ thinking: string;
93
+ rateLimited: boolean;
94
+ model?: string;
95
+ attempts?: Array<{
96
+ model: string;
97
+ outcome: string;
98
+ }>;
99
+ usage?: {
100
+ input?: number;
101
+ thinking?: number;
102
+ output?: number;
103
+ };
104
+ strippedFields?: Array<{
105
+ id: string;
106
+ stripped: string[];
107
+ }>;
108
+ strippedRelationTypes?: Array<{
109
+ id: string;
110
+ types: string[];
111
+ }>;
112
+ }>;
113
+ //# sourceMappingURL=pass2c.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pass2c.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/pass2c.ts"],"names":[],"mappings":"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"}