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,404 @@
1
+ // ═══════════════════════════════════════════════════════════════════════════════
2
+ // PASS 2a — CLASSIFY ONLY (Week 2, debt #1, 2026-05-25)
3
+ //
4
+ // Role: The first of three sub-passes in the Pass 2 split (see
5
+ // docs/PASS2-SPLIT-DESIGN.md §2 Pass ownership). Decides WHAT each
6
+ // item IS — its epistemic type, project, hierarchy, dedup verdict,
7
+ // and supersession references — but does NOT fill `unique{}` (2b's
8
+ // job) and does NOT wire causal relations (2c's job).
9
+ //
10
+ // What this pass DOES (§2 ownership):
11
+ // - Q0 DEDUP — intra-batch first, then against PROJECT GRAPH
12
+ // - Q1 TYPE — 5 TEST structural checks for type override
13
+ // - Q2 HIERARCHY — extends_item assignment
14
+ // - PROJECT ATTRIBUTION — every item gets a project
15
+ // - SUPERSEDES_REF / RESOLVED_REF — label/ID references
16
+ // - REVIEW FLAGS — type_override, weak_match, etc.
17
+ // - CLASSIFICATION REASONING — 1-2 sentence WHY per item
18
+ // - NOVEL TYPE — defines schema{} if a novel type fires
19
+ //
20
+ // What this pass does NOT do (anti-examples, §2):
21
+ // - Fill `unique{}` — that's Pass 2b
22
+ // - Emit `triggered_by_items`, `based_on_items`, `relations` — that's Pass 2c
23
+ // - Run schema validation — Tier 1B at Seam α (post-2b) does that
24
+ // - Reach the live DB — pure data transform, no side effects
25
+ //
26
+ // Status:
27
+ // - Standalone file. NOT wired into pipeline.ts yet (Week 2 wiring is the
28
+ // next step). Callable in tests with synthetic inputs.
29
+ // - `pass2.ts` is FROZEN per §4 — this file does NOT replace it. Both
30
+ // coexist; routing is via NODEDEX_PASS2_SPLIT=1 flag (default off).
31
+ //
32
+ // Charter alignment:
33
+ // - Rule 6 (guards catch failure, never override success): 2a is one
34
+ // guard in a chain (2a → Seam α → 2b → Seam β → 2c). A guard that
35
+ // fails simply hands a clean failure to the next layer; this pass
36
+ // never destroys data.
37
+ // - Rule 7 (determinism is local): structured output schema is
38
+ // deterministic from the LLM's perspective; reasoning trace makes
39
+ // each decision auditable.
40
+ // - Rule 14 (store the path): every classified item carries
41
+ // `classification_reasoning` — the WHY is not regenerable, must persist.
42
+ // ═══════════════════════════════════════════════════════════════════════════════
43
+ import { CONFIG } from "./config.js";
44
+ // ─── Prompt ────────────────────────────────────────────────────────────────────
45
+ //
46
+ // Derived from PASS2_PROMPT in pass2.ts by REMOVING two sections per §2:
47
+ // - "UNIQUE FIELDS — populate AFTER type is final" (Pass 2b's job)
48
+ // - "CAUSAL WIRING (output AFTER classified[])" + Q3/Q4/Q5 (Pass 2c's job)
49
+ //
50
+ // All other sections preserved verbatim from pass2.ts. The processing-order
51
+ // line at top is updated since 2a no longer outputs `unique` or
52
+ // `causal_wiring[]`. SCENE CARD CONTEXT note about CAUSAL LINKS is
53
+ // retained because dedup (Q0) still benefits from scene-card context;
54
+ // the "use in Q3" instruction inside that block is moot but harmless
55
+ // (it references rules that aren't in this prompt — the model just
56
+ // can't use them).
57
+ //
58
+ // DELIBERATE PRESERVATION:
59
+ // - Q5 SEMANTIC RELATIONS belongs to 2c — removed here.
60
+ // - The "ASYMMETRIC COST" callout stays (it's a dedup discipline, not a
61
+ // wiring discipline).
62
+ // - REVIEW FLAGS enum stays whole (2a sets these flags).
63
+ export const PASS2A_PROMPT = `You receive extracted items from an agent session.
64
+ Each item has a provisional_type set by Pass 1 based on surface form.
65
+
66
+ ── ARC-MODE NOTE (DEBT 5 D4, applies when input is multi-turn arc) ──────────
67
+ If the input begins with "[ARC EXTRACTION — agent_id=..., turns S-E, N turn(s)]"
68
+ header AND items carry IDs prefixed "item_T<turn>_<n>", you are reading ONE
69
+ CONTINUOUS CONVERSATION ARC, not N independent turns. Treat it that way:
70
+ - Items mentioned in MULTIPLE turns about the SAME thing → ONE item, not
71
+ duplicates needing supersedes. Sew them together via your DEDUP pass (Q0).
72
+ - The conversation flowed as one ongoing thought; [TURN N] headers mark
73
+ sequence only.
74
+ - Use the chronological order to reason about cross-turn causal links
75
+ (decisions built progressively, dead-ends abandoned then re-considered).
76
+ For single-turn input (no ARC header), behave as before — this section is a
77
+ no-op.
78
+
79
+ ── STATE CONVENTION ─────────────────────────────────────────────────────────
80
+ "State" in this prompt = text in marked regions below (PROJECT GRAPH, SCENE CARD,
81
+ PREVIOUS TURN ENTITY MAP, ITEMS FROM PASS 1). Your training knowledge and
82
+ "what's commonly known about this domain" are NOT state. A claim is "already
83
+ recorded" ONLY if a block in PROJECT GRAPH has a matching essence text or
84
+ unique{} field value. Familiarity ≠ recorded. The fact that something is widely
85
+ known, famous, or established in the field is irrelevant to dedup.
86
+
87
+ Your job: verify the type, dedup the batch, assign project + supersession refs.
88
+ Processing order: DEDUP (Q0) → TYPE (Q1) → HIERARCHY (Q2) → classified[].
89
+ DO NOT output unique{} fields and DO NOT output causal links — those are
90
+ handled by later passes. Output ONLY the type + project + reasoning + refs.
91
+ Reference each item by its id only — do NOT echo the item's text back; the
92
+ system already has it from Pass 1.
93
+
94
+ ── Q0: DEDUP — intra-batch first, then against PROJECT GRAPH ──
95
+ "Does this item add a claim not already covered — by another item in this same
96
+ batch, or by a block in PROJECT GRAPH?"
97
+
98
+ For EVERY item, walk these steps in order. Stop at the first verdict.
99
+
100
+ STEP I — Intra-batch duplicate (check before the graph):
101
+ "Does another ITEM in this batch make the SAME claim — same type, same
102
+ specific subject and values? Two items can word it differently and still be
103
+ the same claim; a merely related claim is NOT the same claim."
104
+ YES → keep exactly ONE — the item with the more complete text. The other
105
+ does not become a block: do not emit it in classified[], and do not
106
+ put it in skipped[] — simply omit it. In the kept item's
107
+ classification_reasoning, name the dropped item's id.
108
+ NO → proceed to STEP 0.
109
+
110
+ STEP 0 — Pre-check before graph dedup:
111
+ PROJECT GRAPH empty (no blocks shown at all) → item is GENUINELY NEW. Stop.
112
+ Item's project absent from PROJECT GRAPH → item is GENUINELY NEW. Stop.
113
+ Item's (project, provisional_type) pair has no matching blocks → GENUINELY NEW. Stop.
114
+ Only when one or more concrete candidate blocks exist → proceed to STEP A.
115
+
116
+ STEP A — Identify candidate blocks in PROJECT GRAPH by project prefix + provisional type.
117
+ Each candidate has a visible essence and (sometimes) unique{} values.
118
+ Ask: "Would the item and the candidate be saying the SAME THING or DIFFERENT
119
+ THINGS as graph blocks?" Same = same specific claim with same values. Related
120
+ topic ≠ same claim.
121
+
122
+ STEP B — "Is this turn CHANGING the recorded state, or CONFIRMING what is
123
+ recorded in PROJECT GRAPH?" The comparison is against the candidate's ESSENCE
124
+ TEXT and UNIQUE FIELD VALUES — not against domain knowledge.
125
+
126
+ NOTHING NEW (same claim, same value, candidate already says it) → skipped[].
127
+ UPDATES (same claim, CHANGES outcome/value) → classify + supersedes_ref = candidate label.
128
+ "Is the old block still the CURRENT STATE?" NO → supersedes_ref. YES but wrong → contradicts.
129
+ NOT UPDATES: item USES or BUILDS ON the candidate → GENUINELY NEW.
130
+ GENUINELY NEW → classify normally.
131
+
132
+ SKIP EVIDENCE — falsifiability rule:
133
+ A skip in skipped[] makes a claim about PROJECT GRAPH state. The reason must
134
+ reference the specific block — by label or by its essence text — that the
135
+ skip is checked against. If you cannot point to a block in PROJECT GRAPH that
136
+ a reader could verify the claim against, the claim is unfalsifiable: classify
137
+ the item, do not skip it.
138
+
139
+ ASYMMETRIC COST: false skip = permanent data loss. false save = minor bloat.
140
+ When in doubt at any step, default to GENUINELY NEW.
141
+
142
+ ── Q1: TYPE — "What is the speaker's EPISTEMIC STANCE toward this claim?" ──
143
+ Type = speaker's relationship to knowledge, not content topic.
144
+ extends_id and type are independent axes. Apply Q1 regardless.
145
+
146
+ Pass 1's type is correct unless one of these structural tests fires:
147
+
148
+ TEST 1: "Same quantity at two distinct points — showing a change?"
149
+ YES → metric. Single value alone = fact.
150
+
151
+ TEST 2: "Expected answer or proposed mechanism BEFORE confirmation?"
152
+ YES → hypothesis. Already confirmed → remains fact.
153
+
154
+ TEST 3: "CLOSING something or ADOPTING something?"
155
+ ADOPTING → decision.
156
+ CLOSING → "Were resources committed INTO this path before closure?"
157
+ "If I removed the closing event, would there be active work to stop?"
158
+ YES → dead_end. NO (only analysis, never entered) → fact.
159
+ EXTERNAL FORCE closed it → constraint.
160
+
161
+ TEST 4: "Has an outcome already been selected and closed?"
162
+ YES → decision. Path committed, destination unknown → blueprint. Nothing committed → question.
163
+
164
+ TEST 5: "PROJECT GRAPH has same concept with different type?"
165
+ YES → align with graph's type. Set review_reason = "graph_align".
166
+
167
+ When overriding, set review_reason = "type_override".
168
+ When keeping, fill classification_reasoning explaining why it held.
169
+
170
+ NOVEL TYPE: all three must pass — (1) future agent would behave differently than any existing type,
171
+ (2) can't be expressed as existing type + richer unique{}, (3) name describes epistemic stance not content shape.
172
+ → set type, define schema{} with 2-3 fields, review_reason = "novel_type".
173
+
174
+ BLUEPRINT → DECISION: planned/uncertain → active/current? → decision + supersedes_ref to blueprint label.
175
+ UNCERTAIN ITEMS: preserve type. Never downgrade. Set review_reason = "incomplete_context".
176
+
177
+ ── Q2: HIERARCHY — "Can this item stand alone as knowledge?" ───────────────
178
+ "If I deleted the item it points to, would THIS item make sense standalone?"
179
+ YES → clear extends_item. NO → set extends_item = that item's ID.
180
+ Captures MEANING DEPENDENCY, not topic relatedness. Type does not change.
181
+
182
+ ── PROJECT ATTRIBUTION ─────────────────────────────────────────────────────
183
+ Every item MUST get a project. Decide in order:
184
+ 1. Item is about one specific named system/project → that project (a valid root
185
+ from PROJECT GRAPH or scene card PROJECTS; use APPROACHES project tags).
186
+ 2. Item is cross-cutting — background/intro context, a field-level conclusion,
187
+ or a question or comparison spanning multiple projects → the SCOPE PROJECT
188
+ named in the scene card.
189
+ The scene card always names a scope project; it is the home for anything that
190
+ belongs to no single project. "null", "", "unknown", "general" are never valid
191
+ project values — if you cannot name a specific project, the answer is the scope
192
+ project, not a placeholder.
193
+
194
+ ── SUPERSEDES_REF ──────────────────────────────────────────────────────────
195
+ "After this item exists, is the old block still the CURRENT STATE?"
196
+ NO → supersedes_ref = old label. YES but wrong → contradicts relation (handled by Pass 2c).
197
+ Within-batch: predecessor item ID. Cross-batch: exact label from PROJECT GRAPH.
198
+ resolved_ref — label for same entity by different name. High confidence only.
199
+
200
+ ── REVIEW FLAGS ────────────────────────────────────────────────────────────
201
+ Set review_reason when not confident: type_override, weak_match, no_evidence,
202
+ project_uncertain, incomplete_context, graph_align, novel_type. Empty when confident.
203
+
204
+ ── CLASSIFICATION REASONING (required) ─────────────────────────────────────
205
+ For EVERY item: 1-2 sentences — which test determined the outcome and what evidence.
206
+
207
+ ── SCENE CARD CONTEXT ──────────────────────────────────────────────────────
208
+ APPROACHES → engagement level (for TEST 3) and project tags.
209
+ UNCHANGED → source="recap", Q0 handles. TASKS → active work.
210
+
211
+ `;
212
+ // ─── Output schema ─────────────────────────────────────────────────────────────
213
+ //
214
+ // Subset of PASS2_SCHEMA (defined in pass2.ts) — drops `unique`,
215
+ // `triggered_by_items`, `based_on_items`, `relations`, `note`, the
216
+ // `causal_wiring` top-level array, AND `text` (project-future-enhancements #6,
217
+ // 2026-05-25: 2a echoing verbatim text inflated output → caused refund
218
+ // truncation@16384 → 321s; text is already known from Pass 1 input, so
219
+ // callPass2aLLM re-joins it by `id` after the LLM returns).
220
+ //
221
+ // Why explicitly forbidding `unique` (not just omitting it)?
222
+ // - Schema-only output. If the model emits `unique`, structured-output
223
+ // validation will silently accept extra properties unless we constrain.
224
+ // Defense in depth: keep `unique` out of the schema so any leakage is
225
+ // visible in pass-log output.
226
+ //
227
+ // Exported so tests can lock the contract (text-not-required, etc).
228
+ export const PASS2A_SCHEMA = {
229
+ type: "object",
230
+ properties: {
231
+ skipped: {
232
+ type: "array",
233
+ items: {
234
+ type: "object",
235
+ properties: {
236
+ id: { type: "string" },
237
+ reason: { type: "string" },
238
+ },
239
+ required: ["id", "reason"],
240
+ },
241
+ },
242
+ classified: {
243
+ type: "array",
244
+ items: {
245
+ type: "object",
246
+ properties: {
247
+ id: { type: "string" },
248
+ type: { type: "string" },
249
+ project: { type: "string" },
250
+ extends_item: { type: "string" },
251
+ supersedes_ref: { type: "string" },
252
+ resolved_ref: { type: "string" },
253
+ review_reason: { type: "string" },
254
+ schema: { type: "object" },
255
+ classification_reasoning: { type: "string" },
256
+ },
257
+ required: ["id", "type", "project", "classification_reasoning"],
258
+ },
259
+ },
260
+ },
261
+ required: ["skipped", "classified"],
262
+ };
263
+ // ─── Output sanitizer ──────────────────────────────────────────────────────────
264
+ //
265
+ // Defense in depth: even if the model leaks `unique` or `triggered_by_items`
266
+ // (e.g. by ignoring the schema), strip those keys from each classified item.
267
+ // This enforces §1 Seam α contract: 2b is the only writer of `unique`; 2c is
268
+ // the only writer of wiring.
269
+ //
270
+ // Exposed as a pure function so tests can verify the contract independently.
271
+ const FORBIDDEN_KEYS_ON_PASS2A_OUTPUT = ["unique", "triggered_by_items", "based_on_items", "relations", "note"];
272
+ export function sanitizePass2aItem(raw) {
273
+ const stripped = [];
274
+ const item = { ...raw };
275
+ for (const k of FORBIDDEN_KEYS_ON_PASS2A_OUTPUT) {
276
+ if (k in item) {
277
+ stripped.push(k);
278
+ delete item[k];
279
+ }
280
+ }
281
+ return { item: item, stripped };
282
+ }
283
+ export function sanitizePass2aResult(raw) {
284
+ const perItemStripped = [];
285
+ let totalStrippedFields = 0;
286
+ const classified = (raw.classified ?? []).map((c) => {
287
+ const { item, stripped } = sanitizePass2aItem(c);
288
+ if (stripped.length > 0) {
289
+ perItemStripped.push({ id: item.id, stripped });
290
+ totalStrippedFields += stripped.length;
291
+ }
292
+ return item;
293
+ });
294
+ const skipped = (raw.skipped ?? []).map((s) => ({
295
+ id: String(s.id ?? ""),
296
+ reason: String(s.reason ?? ""),
297
+ }));
298
+ return { result: { skipped, classified }, totalStrippedFields, perItemStripped };
299
+ }
300
+ // ─── LLM call ──────────────────────────────────────────────────────────────────
301
+ //
302
+ // Mirrors the signature shape of `callPass2LLM` in pass2.ts so wiring later
303
+ // can route between monolith and split with minimal call-site change. Differs
304
+ // only in:
305
+ // - returns Pass2aResult (no `unique`, no `causal_wiring`)
306
+ // - uses PASS2A_PROMPT + PASS2A_SCHEMA
307
+ // - does NOT update reflectTokenStats yet (that's a wiring concern — adding
308
+ // pass2a/2b/2c slots to context.ts is part of the §9 Week 2 wiring step,
309
+ // not this isolated module)
310
+ //
311
+ // Returns usage so callers (tests + future wiring) can capture token counts
312
+ // without touching global state.
313
+ export async function callPass2aLLM(provider, pass1Items, projectContext, prevEntityMap, thinkingBudget = 1024, sceneCard,
314
+ // Multi-model routing (C, 2026-05-25): per PASS2-SPLIT-DESIGN.md §7 cost
315
+ // recalibration, 2a is structural work — cheap-model territory (Haiku-class
316
+ // via OpenRouter). When set, overrides the provider's default model for this
317
+ // call only. Undefined → use provider default (backward compat). Universal:
318
+ // model name is a string, no provider assumption (works for any model the
319
+ // upstream provider can serve).
320
+ modelOverride) {
321
+ const sceneCardSection = sceneCard
322
+ ? `SCENE CARD (APPROACHES entries give investment level and blueprint/dead_end context; ACTOR-ACTIONS confirm who committed to what):\n${sceneCard}\n\n`
323
+ : "";
324
+ const projectSection = projectContext
325
+ ? `PROJECT GRAPH (all existing blocks — use for dedup and supersession refs):\n${projectContext}\n\n`
326
+ : "";
327
+ const prevMapSection = prevEntityMap.length > 0
328
+ ? `PREVIOUS TURN ENTITY MAP:\n${prevEntityMap.map((e) => `"${e.reference}" → ${e.resolved_to}`).join("\n")}\n\n`
329
+ : "";
330
+ const itemsSection = `ITEMS FROM PASS 1:\n${JSON.stringify(pass1Items, null, 2)}`;
331
+ const userInput = `${sceneCardSection}${projectSection}${prevMapSection}${itemsSection}`;
332
+ const r = await provider.generateStructured(PASS2A_PROMPT, userInput, PASS2A_SCHEMA, {
333
+ thinkingBudget,
334
+ maxOutputTokens: CONFIG.pass2.maxOutputTokens,
335
+ ...(modelOverride ? { modelOverride } : {}),
336
+ });
337
+ if (!r.result) {
338
+ console.error(`Auto-Reflect Pass 2a: ${r.rateLimited ? "rate limited" : "failed"} [${provider.getName()}]`);
339
+ return {
340
+ result: null,
341
+ thinking: r.thinking ?? "",
342
+ rateLimited: r.rateLimited,
343
+ model: r.model,
344
+ attempts: r.attempts,
345
+ };
346
+ }
347
+ const { result: clean, totalStrippedFields, perItemStripped } = sanitizePass2aResult(r.result);
348
+ // Re-join `text` by id from Pass 1 input. 2a no longer echoes verbatim text
349
+ // (PASS2A_SCHEMA omits it). Source of truth for text = Pass 1, not the LLM.
350
+ // See project-future-enhancements #6 for the WHY (refund truncation@16384).
351
+ // Defensive: a classified id with no matching pass1 id is an anomaly (Q0
352
+ // dedup only ever drops items, never creates new ids) — log + fall back to
353
+ // "" so downstream never gets undefined on a string-typed field.
354
+ const textById = new Map(pass1Items.map((p) => [p.id, p.text]));
355
+ // ── DEBT 5 D3: also re-join excerpt by id (same pattern as text) ──
356
+ // Source of truth for excerpt = Pass 1 (matches the prompt's source rule).
357
+ // Pass 2a doesn't need the LLM to echo it — we paste it back from Pass 1
358
+ // input by id. Phase 5 propagation: Pass1Item.excerpt → Pass2Item.excerpt →
359
+ // (Pass 2b passes through unchanged) → Pass 3 → blocks.source_excerpt column.
360
+ const excerptById = new Map(pass1Items.map((p) => [p.id, p.excerpt]));
361
+ let textRejoinMisses = 0;
362
+ let excerptRejoinMisses = 0;
363
+ for (const item of clean.classified) {
364
+ const t = textById.get(item.id);
365
+ if (t === undefined)
366
+ textRejoinMisses++;
367
+ item.text = t ?? item.text ?? "";
368
+ const e = excerptById.get(item.id);
369
+ if (e === undefined)
370
+ excerptRejoinMisses++;
371
+ item.excerpt = e ?? ""; // empty string is safe — Pass 3 treats "" as "no excerpt available" same as NULL
372
+ }
373
+ if (textRejoinMisses > 0) {
374
+ console.log(`Auto-Reflect Pass 2a: WARNING ${textRejoinMisses} classified item(s) had no matching Pass 1 id for text re-join (defensive)`);
375
+ }
376
+ if (excerptRejoinMisses > 0) {
377
+ console.log(`Auto-Reflect Pass 2a: WARNING ${excerptRejoinMisses} classified item(s) had no matching Pass 1 id for excerpt re-join (D3 source_excerpt — block will have NULL provenance)`);
378
+ }
379
+ const tag = provider.getName() !== "gemini" ? ` [${provider.getName()}]` : "";
380
+ console.log(`Auto-Reflect Pass 2a: classified ${pass1Items.length} items | tokens: in=${r.usage?.input ?? "?"} think=${r.usage?.thinking ?? "?"} out=${r.usage?.output ?? "?"}${tag}`);
381
+ if (totalStrippedFields > 0) {
382
+ // Sanitizer fired — model leaked fields it wasn't supposed to emit.
383
+ // Log loudly so the contract violation is auditable in turn logs.
384
+ console.log(`Auto-Reflect Pass 2a: SANITIZER stripped ${totalStrippedFields} leaked field(s) across ${perItemStripped.length} item(s)`);
385
+ for (const s of perItemStripped) {
386
+ console.log(` ${s.id}: removed ${s.stripped.join(", ")}`);
387
+ }
388
+ }
389
+ for (const item of clean.classified) {
390
+ if (item.classification_reasoning) {
391
+ console.log(` [Pass 2a reasoning] ${item.id} [${item.type}]: ${item.classification_reasoning}`);
392
+ }
393
+ }
394
+ return {
395
+ result: clean,
396
+ thinking: r.thinking ?? "",
397
+ rateLimited: r.rateLimited,
398
+ model: r.model,
399
+ attempts: r.attempts,
400
+ usage: r.usage,
401
+ strippedFields: perItemStripped.length > 0 ? perItemStripped : undefined,
402
+ };
403
+ }
404
+ //# sourceMappingURL=pass2a.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pass2a.js","sourceRoot":"","sources":["../../../src/middleware/reflect/pass2a.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import type { LLMProvider } from "../../engine/ai-provider.js";
2
+ /**
3
+ * Input to Pass 2b — a subset of Pass 2a's output. 2b needs only what's
4
+ * required to fill `unique{}` for a single item.
5
+ *
6
+ * `classification_reasoning` is included for the LLM's context (so it knows
7
+ * why 2a picked the type) but 2b does not act on it beyond that.
8
+ */
9
+ export interface Pass2bInput {
10
+ id: string;
11
+ text: string;
12
+ type: string;
13
+ classification_reasoning?: string;
14
+ /**
15
+ * Set on a RE-FILL RETRY (seam α route-back). Carries the schema-validation
16
+ * failure detail from the first attempt (e.g. "type=insight missing=[implication]")
17
+ * so the prompt can tell 2b exactly which field to look harder for. Undefined
18
+ * on the first fill. See pass2-split-orchestrator.ts re-fill stage.
19
+ */
20
+ retryFailureDetail?: string;
21
+ }
22
+ /**
23
+ * Output per item — strictly `id` + `unique{}`. No other fields.
24
+ * 2b owns `unique{}` exclusively; everything else from 2a passes through
25
+ * the orchestrator unchanged (see future `composeForDownstream()`).
26
+ */
27
+ export interface Pass2bResult {
28
+ id: string;
29
+ unique: Record<string, string>;
30
+ }
31
+ /**
32
+ * Batch helper result. Per-item failures (LLM rate-limit, network) are
33
+ * surfaced separately so the caller can decide whether to retry or
34
+ * quarantine; they are NOT the same as schema-mismatch failures (those go
35
+ * to the seam validator with whatever fields 2b managed to emit).
36
+ */
37
+ export interface Pass2bBatchResult {
38
+ results: Pass2bResult[];
39
+ failures: Array<{
40
+ id: string;
41
+ reason: "rate_limited" | "llm_error";
42
+ detail?: string;
43
+ }>;
44
+ usage: {
45
+ input: number;
46
+ thinking: number;
47
+ output: number;
48
+ };
49
+ }
50
+ /**
51
+ * Build the Pass 2b prompt for a single item. The type's schema is injected
52
+ * directly so the prompt is concise and type-specific.
53
+ *
54
+ * Exposed for tests (so prompt structure can be asserted without an LLM call).
55
+ */
56
+ export declare function buildPass2bPrompt(item: Pass2bInput): string;
57
+ export declare function sanitizePass2bUnique(type: string, unique: Record<string, unknown>): {
58
+ unique: Record<string, string>;
59
+ strippedKeys: string[];
60
+ };
61
+ export declare function sanitizePass2bResult(type: string, raw: {
62
+ id: string;
63
+ unique?: Record<string, unknown>;
64
+ }): {
65
+ result: Pass2bResult;
66
+ strippedKeys: string[];
67
+ };
68
+ export declare function callPass2bLLM(provider: LLMProvider, item: Pass2bInput, thinkingBudget?: number, // Smaller than 2a — fill is structural, not reasoning-heavy
69
+ modelOverride?: string): Promise<{
70
+ result: Pass2bResult | null;
71
+ thinking: string;
72
+ rateLimited: boolean;
73
+ model?: string;
74
+ attempts?: Array<{
75
+ model: string;
76
+ outcome: string;
77
+ }>;
78
+ usage?: {
79
+ input?: number;
80
+ thinking?: number;
81
+ output?: number;
82
+ };
83
+ strippedKeys?: string[];
84
+ }>;
85
+ export declare function callPass2bBatch(provider: LLMProvider, items: Pass2bInput[], options?: {
86
+ parallelism?: number;
87
+ thinkingBudget?: number;
88
+ modelOverride?: string;
89
+ }): Promise<Pass2bBatchResult>;
90
+ export declare function v2FillBatchEnabled(): boolean;
91
+ export declare function buildPass2bBatchPrompt(): string;
92
+ /** One compact schema line per item (the per-item prompt's fieldGuidance, condensed). */
93
+ export declare function batchFieldLine(type: string): string;
94
+ export declare function callPass2bBatchedFill(provider: LLMProvider, items: Pass2bInput[], opts?: {
95
+ chunkSize?: number;
96
+ thinkingBudget?: number;
97
+ modelOverride?: string;
98
+ }): Promise<{
99
+ results: Pass2bResult[];
100
+ fellBackIds: string[];
101
+ llmCalls: number;
102
+ usage: {
103
+ input: number;
104
+ thinking: number;
105
+ output: number;
106
+ };
107
+ }>;
108
+ //# sourceMappingURL=pass2b.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pass2b.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/pass2b.ts"],"names":[],"mappings":"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"}