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,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // feed.tsx — memory FORMING, live. The pulse view: what the pipeline is doing
3
+ // right now, the newest blocks as they're born (typed, colored, chained), and
4
+ // what the agent recently pulled back out. Replaces v2's Live + Stats overlap.
5
+ import { useEffect, useState } from "react";
6
+ import { Box, Text, useInput } from "ink";
7
+ import { Section, Row, Keys, Panel, windowSlice } from "./components.js";
8
+ import { theme, glyph, typeColorOf, typeGlyphOf, trunc, relTime } from "./theme.js";
9
+ import { useTermSize } from "./hooks.js";
10
+ import { fetchBlockDetail } from "./api.js";
11
+ export function FeedTab({ dash, isActive }) {
12
+ const { rows: termRows, columns: cols } = useTermSize();
13
+ const recent = dash.session?.recent_blocks ?? [];
14
+ const reads = dash.reads ?? [];
15
+ const r = dash.reflect;
16
+ const last = dash.session?.last_reflect;
17
+ const cap = Math.max(5, termRows - 16);
18
+ const [sel, setSel] = useState(0);
19
+ const [peek, setPeek] = useState(null);
20
+ useEffect(() => { if (sel >= recent.length)
21
+ setSel(Math.max(0, recent.length - 1)); }, [recent.length, sel]);
22
+ useInput((_input, k) => {
23
+ if (peek) {
24
+ if (k.escape || k.return)
25
+ setPeek(null);
26
+ return;
27
+ }
28
+ if (k.upArrow)
29
+ setSel((s) => Math.max(0, s - 1));
30
+ else if (k.downArrow)
31
+ setSel((s) => Math.min(recent.length - 1, s + 1));
32
+ else if (k.return && recent[sel])
33
+ void fetchBlockDetail(recent[sel].id).then(setPeek);
34
+ }, { isActive });
35
+ const pulse = r?.processing || (r?.queue_depth ?? 0) > 0
36
+ ? { color: theme.accent, text: `${glyph.tick} extracting… ${r.queue_depth} turn${r.queue_depth === 1 ? "" : "s"} queued` }
37
+ : r?.paused
38
+ ? { color: theme.warn, text: `${glyph.paused} capture paused` }
39
+ : r?.spend_paused
40
+ ? { color: theme.warn, text: `${glyph.paused} spending paused (credit) — turns still queuing` }
41
+ : last
42
+ ? { color: theme.dim, text: `${glyph.okMark} last extraction ${last.timestamp ? relTime(last.timestamp) + " ago" : ""} · +${last.blocks_created} block${last.blocks_created === 1 ? "" : "s"}${last.blocks_updated ? ` · ${last.blocks_updated} updated` : ""}` }
43
+ : { color: theme.dim, text: "idle — waiting for captured turns" };
44
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: pulse.color, children: pulse.text }) }), _jsx(Section, { title: "memory forming", right: _jsx(Text, { color: theme.dim, children: "newest first" }), children: recent.length === 0 ? (_jsx(Text, { color: theme.dim, children: "nothing yet \u2014 once capture is on, new memory streams here" })) : (() => {
45
+ const win = windowSlice(recent, sel, cap);
46
+ return (_jsxs(_Fragment, { children: [win.above > 0 ? _jsx(Text, { color: theme.dim, children: ` ↑ ${win.above} more` }) : null, win.visible.map((b, i) => {
47
+ const idx = win.start + i;
48
+ return (_jsxs(Row, { selected: idx === sel, children: [_jsx(Box, { width: 5, children: _jsx(Text, { color: theme.dim, children: relTime(b.created_at) }) }), _jsx(Text, { color: typeColorOf(b.type), children: `${typeGlyphOf(b.type)} ` }), _jsx(Box, { width: Math.min(44, Math.floor(cols * 0.4)), children: _jsx(Text, { color: idx === sel ? theme.value : theme.label, children: trunc(b.label, Math.min(43, Math.floor(cols * 0.4) - 1)) }) }), _jsx(Text, { color: theme.dim, children: trunc(b.essence, Math.max(10, cols - 62)) })] }, b.id));
49
+ }), win.below > 0 ? _jsx(Text, { color: theme.dim, children: ` ↓ ${win.below} more` }) : null] }));
50
+ })() }), reads.length > 0 ? (_jsx(Section, { title: "agent reads", right: _jsx(Text, { color: theme.dim, children: "what memory got used" }), children: reads.slice(0, 3).map((ev) => (_jsxs(Box, { children: [_jsx(Box, { width: 5, children: _jsx(Text, { color: theme.dim, children: relTime(ev.timestamp) }) }), _jsx(Text, { color: theme.dim, children: `${glyph.read} "${trunc(ev.query, 36)}" → ` }), _jsx(Text, { color: theme.label, children: ev.recalled.slice(0, 3).map((x) => x.label).join(" · ") || `${ev.total_injected} injected` })] }, ev.id))) })) : null, _jsx(Box, { flexGrow: 1 }), peek ? (_jsxs(Panel, { title: peek.label, hot: true, children: [_jsxs(Box, { children: [_jsx(Text, { color: typeColorOf(peek.type), children: `${typeGlyphOf(peek.type)} ${peek.type}` }), (peek.incoming ?? []).some((e) => e.type === "superseded_by") ? _jsx(Text, { color: theme.warn, children: " ⚠ superseded" }) : null] }), _jsx(Text, { color: theme.value, wrap: "wrap", children: peek.essence }), _jsx(Text, { color: theme.dim, children: "full story: view 1 (memory) \u2192 its root, or search it with /" })] })) : (_jsx(Keys, { items: [["↑↓", "move"], ["enter", "peek"], ["1", "open in memory"]] }))] }));
51
+ }
@@ -0,0 +1,465 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ // health.tsx — ONE ops view. Server + capture + pipeline settings + the review
3
+ // queue, merged from v2's Servers/Settings/Review tabs. Everything is a row:
4
+ // ↑↓ to move, enter toggles or edits, overlays for db-switch and review.
5
+ //
6
+ // Deliberate v1 cuts from the old Servers tab: launch/stop/rename/pins moved to
7
+ // the CLI + onboarding (restoreSession auto-launches the last server at boot);
8
+ // here you can SWITCH the db on the running server and CONNECT to another
9
+ // discovered server — the two ops people actually do day-to-day.
10
+ import { useCallback, useEffect, useState } from "react";
11
+ import { Box, Text, useInput } from "ink";
12
+ import { Section, Row, Keys, Panel } from "./components.js";
13
+ import { theme, glyph, trunc, fmtMoney } from "./theme.js";
14
+ import { fetchConfig, postConfig, setReflectPausedRemote, getBase, setBase, } from "./api.js";
15
+ import { loadHermesCapture, setHermesCapture, loadClaudeCapture, setClaudeCapture, parseSources, loadConfig, saveConfig, RECOMMENDED_MODELS, isTrainsOnPrompts, validateOpenRouterKey, scanLocalModels, DEFAULT_LOCAL_BASE_URL, } from "./config.js";
16
+ import { launchWatcher, stopWatcher, isWatcherRunning, listDbs, swapDb, isManaged, discover, saveLastServer, } from "./servers.js";
17
+ import { ReviewTab } from "./review.js";
18
+ const ROWS = ["server", "db", "reflect", "provider", "model", "fallback", "autoturns", "floor", "cap", "hermes", "sources", "claude", "ccprojects", "review"];
19
+ export function HealthTab({ dash, balance, isActive, onCapture, onConnect }) {
20
+ const [sel, setSel] = useState(0);
21
+ const [cfg, setCfg] = useState(null);
22
+ const [editing, setEditing] = useState(null);
23
+ const [buf, setBuf] = useState("");
24
+ const [notice, setNotice] = useState("");
25
+ const [hc, setHc] = useState(loadHermesCapture());
26
+ const [cc, setCc] = useState(loadClaudeCapture());
27
+ const [overlay, setOverlay] = useState("none");
28
+ const [dbs, setDbs] = useState(listDbs());
29
+ const [dbSel, setDbSel] = useState(0);
30
+ const [servers, setServers] = useState([]);
31
+ const [srvSel, setSrvSel] = useState(0);
32
+ const [busy, setBusy] = useState(false);
33
+ // provider overlay state (pSel is reused as the cursor of whichever step's list is showing)
34
+ const [pStep, setPStep] = useState("pick");
35
+ const [pSel, setPSel] = useState(0);
36
+ const [pModels, setPModels] = useState([]);
37
+ const [pScanning, setPScanning] = useState(false);
38
+ const [pScanNonce, setPScanNonce] = useState(0);
39
+ const [pBuf, setPBuf] = useState(""); // key / custom model / url / manual model input
40
+ const [pUrl, setPUrl] = useState(""); // manual local endpoint carried from lurl → lmodel
41
+ const [pBusy, setPBusy] = useState(false);
42
+ const [pErr, setPErr] = useState("");
43
+ const load = useCallback(() => { void fetchConfig().then(setCfg); }, []);
44
+ useEffect(() => { load(); }, [load]);
45
+ useEffect(() => { onCapture(editing !== null || overlay !== "none"); }, [editing, overlay, onCapture]);
46
+ useEffect(() => {
47
+ if (!notice)
48
+ return;
49
+ const id = setTimeout(() => setNotice(""), 4000);
50
+ return () => clearTimeout(id);
51
+ }, [notice]);
52
+ // Auto-scan local model servers when the provider overlay enters the scan step
53
+ // (same probe onboarding uses); [r] bumps the nonce to rescan.
54
+ useEffect(() => {
55
+ if (overlay !== "provider" || pStep !== "scan")
56
+ return;
57
+ let cancelled = false;
58
+ setPScanning(true);
59
+ setPErr("");
60
+ void scanLocalModels().then((models) => {
61
+ if (cancelled)
62
+ return;
63
+ setPModels(models);
64
+ setPSel(0);
65
+ setPScanning(false);
66
+ });
67
+ return () => { cancelled = true; };
68
+ }, [overlay, pStep, pScanNonce]);
69
+ const reflect = dash?.reflect;
70
+ const paused = !!reflect?.paused;
71
+ const budgetCfg = dash?.budget?.config;
72
+ const floor = budgetCfg?.minCreditUsd;
73
+ const cap = budgetCfg?.dailyBudgetUsd;
74
+ const unreviewed = dash?.flagSummary?.unreviewed ?? 0;
75
+ const save = useCallback(async (patch, msg) => {
76
+ setNotice("saving…");
77
+ const ok = await postConfig(patch);
78
+ setNotice(ok ? msg : "save failed");
79
+ if (ok)
80
+ load();
81
+ }, [load]);
82
+ const act = useCallback((id) => {
83
+ if (id === "server") {
84
+ setBusy(true);
85
+ void discover().then((s) => { setServers(s); setSrvSel(0); setBusy(false); setOverlay("servers"); });
86
+ return;
87
+ }
88
+ if (id === "db") {
89
+ setDbs(listDbs());
90
+ setDbSel(0);
91
+ setOverlay("db");
92
+ return;
93
+ }
94
+ if (id === "review") {
95
+ setOverlay("review");
96
+ return;
97
+ }
98
+ if (id === "provider") {
99
+ setPSel(loadConfig().provider === "local" ? 1 : 0);
100
+ setPStep("pick");
101
+ setPBuf("");
102
+ setPUrl("");
103
+ setPErr("");
104
+ setPModels([]);
105
+ setOverlay("provider");
106
+ return;
107
+ }
108
+ if (id === "reflect") {
109
+ const next = !paused;
110
+ setNotice(next ? "pausing capture…" : "resuming capture…");
111
+ void setReflectPausedRemote(next).then((ok) => setNotice(ok ? (next ? "capture paused" : "capture resumed") : "toggle failed"));
112
+ return;
113
+ }
114
+ if (id === "hermes" || id === "claude") {
115
+ const host = id === "hermes" ? "hermes" : "claude-code";
116
+ const on = id === "hermes" ? !hc.enabled : !cc.enabled;
117
+ if (id === "hermes")
118
+ setHermesCapture({ enabled: on });
119
+ else
120
+ setClaudeCapture({ enabled: on });
121
+ if (on)
122
+ launchWatcher(host);
123
+ else
124
+ stopWatcher(host);
125
+ setHc(loadHermesCapture());
126
+ setCc(loadClaudeCapture());
127
+ setNotice(`${id === "hermes" ? "hermes" : "claude code"} capture ${on ? "started" : "stopped"}`);
128
+ return;
129
+ }
130
+ setBuf(id === "model" ? (cfg?.model ?? "") :
131
+ id === "fallback" ? (cfg?.fallback_model ?? "") :
132
+ id === "autoturns" ? (cfg?.arc_auto_turns ?? "") :
133
+ id === "sources" ? hc.sources.join(", ") :
134
+ id === "ccprojects" ? cc.projects.join(", ") :
135
+ id === "floor" ? (floor != null ? String(floor) : "") :
136
+ cap != null ? String(cap) : "");
137
+ setEditing(id);
138
+ }, [paused, cfg, floor, cap, hc, cc]);
139
+ // Persist the provider choice to ~/.nodedex/config.json (what launchServer injects).
140
+ // A model change WITHIN the same lane (same provider + endpoint) also applies LIVE via
141
+ // admin config; a lane switch only takes full effect when the server relaunches
142
+ // (switch db or restart) — the notice says which happened.
143
+ const applyProvider = useCallback((prov, baseUrl, model) => {
144
+ const prev = loadConfig();
145
+ saveConfig(prov === "local" ? { provider: "local", base_url: baseUrl, model } : { provider: "openrouter", model });
146
+ setOverlay("none");
147
+ setPBuf("");
148
+ setPErr("");
149
+ const sameLane = prev.provider === prov && (prov === "openrouter" || prev.base_url === baseUrl);
150
+ if (sameLane) {
151
+ void save({ model }, `model → ${model}`);
152
+ }
153
+ else {
154
+ setNotice(`provider saved: ${prov === "local" ? `local (${baseUrl})` : "openrouter"} · ${model} — applies when the server relaunches (switch db or restart)`);
155
+ }
156
+ }, [save]);
157
+ const submit = useCallback(async () => {
158
+ const v = buf.trim();
159
+ const id = editing;
160
+ setEditing(null);
161
+ setBuf("");
162
+ // Also persist to config.json — the launch env (providerEnv) wins over ~/.nodedex/.env
163
+ // on relaunch, so a live-only change would silently revert at the next launch.
164
+ if (id === "model") {
165
+ saveConfig({ model: v || undefined });
166
+ return save({ model: v }, v ? `model → ${v}` : "model cleared");
167
+ }
168
+ if (id === "fallback")
169
+ return save({ fallback_model: v }, v ? `fallback → ${v}` : "fallback cleared");
170
+ if (id === "autoturns") {
171
+ if (v && (!Number.isInteger(Number(v)) || Number(v) < 0)) {
172
+ setNotice("auto-turns must be a whole number ≥ 0");
173
+ return;
174
+ }
175
+ return save({ arc_auto_turns: v }, v && Number(v) > 0 ? `auto-extract every ${v} turns` : "auto-extract off");
176
+ }
177
+ if (id === "sources") {
178
+ const arr = parseSources(v);
179
+ setHermesCapture({ sources: arr });
180
+ setHc(loadHermesCapture());
181
+ setNotice(`hermes sources → ${arr.join(", ")}`);
182
+ return;
183
+ }
184
+ if (id === "ccprojects") {
185
+ const arr = parseSources(v);
186
+ setClaudeCapture({ projects: arr });
187
+ setCc(loadClaudeCapture());
188
+ setNotice(`claude projects → ${arr.join(", ")}`);
189
+ return;
190
+ }
191
+ if (id === "floor") {
192
+ if (v && !Number.isFinite(Number(v))) {
193
+ setNotice("floor must be a number");
194
+ return;
195
+ }
196
+ return save({ min_credit_usd: v }, v ? `credit floor → $${v}` : "credit floor off");
197
+ }
198
+ if (id === "cap") {
199
+ if (v && !Number.isFinite(Number(v))) {
200
+ setNotice("cap must be a number");
201
+ return;
202
+ }
203
+ return save({ daily_budget_usd: v }, v ? `daily cap → $${v}` : "daily cap off");
204
+ }
205
+ }, [buf, editing, save]);
206
+ useInput((input, key) => {
207
+ if (overlay === "review") {
208
+ if (key.escape)
209
+ setOverlay("none");
210
+ return;
211
+ } // ReviewTab owns the rest
212
+ if (overlay === "provider") {
213
+ if (pBusy)
214
+ return;
215
+ const typeInto = () => {
216
+ if (key.backspace || key.delete)
217
+ setPBuf((b) => b.slice(0, -1));
218
+ else if (input && !key.ctrl && !key.meta && !key.tab)
219
+ setPBuf((b) => b + input.replace(/[\r\n]/g, ""));
220
+ };
221
+ if (key.escape) {
222
+ setPErr("");
223
+ if (pStep === "key" || pStep === "model" || pStep === "scan") {
224
+ setPBuf("");
225
+ setPStep("pick");
226
+ }
227
+ else if (pStep === "lurl") {
228
+ setPBuf("");
229
+ setPStep("scan");
230
+ }
231
+ else if (pStep === "lmodel") {
232
+ setPBuf(pUrl);
233
+ setPStep("lurl");
234
+ }
235
+ else
236
+ setOverlay("none");
237
+ return;
238
+ }
239
+ if (pStep === "pick") {
240
+ if (key.upArrow || key.downArrow)
241
+ setPSel((s) => (s === 0 ? 1 : 0));
242
+ else if (key.return) {
243
+ setPErr("");
244
+ setPBuf("");
245
+ if (pSel === 1) {
246
+ setPStep("scan");
247
+ }
248
+ else if (loadConfig().openrouter_key) {
249
+ const cur = RECOMMENDED_MODELS.findIndex((m) => m.id === loadConfig().model);
250
+ setPSel(cur >= 0 ? cur : 0);
251
+ setPStep("model");
252
+ }
253
+ else
254
+ setPStep("key");
255
+ }
256
+ return;
257
+ }
258
+ if (pStep === "key") {
259
+ if (key.return) {
260
+ const k = pBuf.trim();
261
+ if (!/^sk-or-/.test(k) || k.length < 40) {
262
+ setPErr("that doesn't look like a full OpenRouter key (sk-or-…) — re-paste the whole key");
263
+ return;
264
+ }
265
+ setPBusy(true);
266
+ setPErr("");
267
+ void validateOpenRouterKey(k).then((v) => {
268
+ setPBusy(false);
269
+ if (!v.ok) {
270
+ setPErr(v.error ?? "invalid key");
271
+ return;
272
+ }
273
+ saveConfig({ openrouter_key: k });
274
+ setPBuf("");
275
+ setPSel(0);
276
+ setPStep("model");
277
+ });
278
+ }
279
+ else
280
+ typeInto();
281
+ return;
282
+ }
283
+ if (pStep === "model") {
284
+ const total = RECOMMENDED_MODELS.length + 1; // + custom row
285
+ if (key.upArrow)
286
+ setPSel((s) => (s - 1 + total) % total);
287
+ else if (key.downArrow)
288
+ setPSel((s) => (s + 1) % total);
289
+ else if (key.return) {
290
+ const m = pSel >= RECOMMENDED_MODELS.length ? pBuf.trim() : RECOMMENDED_MODELS[pSel].id;
291
+ if (!m) {
292
+ setPErr("pick a model or type a custom id");
293
+ return;
294
+ }
295
+ applyProvider("openrouter", undefined, m);
296
+ }
297
+ else if (pSel >= RECOMMENDED_MODELS.length)
298
+ typeInto();
299
+ return;
300
+ }
301
+ if (pStep === "scan") {
302
+ if (pScanning)
303
+ return;
304
+ const total = pModels.length + 1; // + "enter manually" row
305
+ if (key.upArrow)
306
+ setPSel((s) => (s - 1 + total) % total);
307
+ else if (key.downArrow)
308
+ setPSel((s) => (s + 1) % total);
309
+ else if (input === "r")
310
+ setPScanNonce((n) => n + 1);
311
+ else if (key.return) {
312
+ setPErr("");
313
+ if (pSel >= pModels.length) {
314
+ setPBuf(loadConfig().base_url || DEFAULT_LOCAL_BASE_URL);
315
+ setPStep("lurl");
316
+ return;
317
+ }
318
+ const pick = pModels[pSel];
319
+ applyProvider("local", pick.baseUrl, pick.model);
320
+ }
321
+ return;
322
+ }
323
+ if (pStep === "lurl") {
324
+ if (key.return) {
325
+ const url = pBuf.trim();
326
+ if (!url) {
327
+ setPErr("enter the endpoint URL (e.g. http://localhost:11434/v1)");
328
+ return;
329
+ }
330
+ const c = loadConfig();
331
+ setPUrl(url);
332
+ setPBuf(c.provider === "local" && c.model ? c.model : "");
333
+ setPErr("");
334
+ setPStep("lmodel");
335
+ }
336
+ else
337
+ typeInto();
338
+ return;
339
+ }
340
+ // lmodel
341
+ if (key.return) {
342
+ const m = pBuf.trim();
343
+ if (!m) {
344
+ setPErr("enter the model id your server serves (e.g. qwen3:30b)");
345
+ return;
346
+ }
347
+ applyProvider("local", pUrl, m);
348
+ }
349
+ else
350
+ typeInto();
351
+ return;
352
+ }
353
+ if (overlay === "db") {
354
+ if (key.escape) {
355
+ setOverlay("none");
356
+ return;
357
+ }
358
+ if (key.upArrow) {
359
+ setDbSel((s) => Math.max(0, s - 1));
360
+ return;
361
+ }
362
+ if (key.downArrow) {
363
+ setDbSel((s) => Math.min(dbs.length - 1, s + 1));
364
+ return;
365
+ }
366
+ if (key.return && dbs[dbSel]) {
367
+ const target = dbs[dbSel];
368
+ const base = getBase();
369
+ const port = Number(new URL(base).port) || 3001;
370
+ if (!isManaged(base)) {
371
+ setNotice("current server isn't TUI-managed — switch db via onboarding");
372
+ setOverlay("none");
373
+ return;
374
+ }
375
+ setBusy(true);
376
+ setOverlay("none");
377
+ setNotice(`switching db → ${target.name}…`);
378
+ void swapDb(base, port, target.path).then((r) => {
379
+ setBusy(false);
380
+ setNotice(r.ok ? `db → ${target.name}` : `switch failed: ${r.error}`);
381
+ onConnect();
382
+ });
383
+ }
384
+ return;
385
+ }
386
+ if (overlay === "servers") {
387
+ if (key.escape) {
388
+ setOverlay("none");
389
+ return;
390
+ }
391
+ if (key.upArrow) {
392
+ setSrvSel((s) => Math.max(0, s - 1));
393
+ return;
394
+ }
395
+ if (key.downArrow) {
396
+ setSrvSel((s) => Math.min(servers.length - 1, s + 1));
397
+ return;
398
+ }
399
+ if (key.return && servers[srvSel]) {
400
+ const s = servers[srvSel];
401
+ setBase(s.url);
402
+ saveLastServer({ url: s.url, port: Number(new URL(s.url).port) || null, managed: isManaged(s.url) });
403
+ setOverlay("none");
404
+ setNotice(`connected → ${s.url}`);
405
+ onConnect();
406
+ }
407
+ return;
408
+ }
409
+ if (editing) {
410
+ if (key.escape) {
411
+ setEditing(null);
412
+ setBuf("");
413
+ setNotice("cancelled");
414
+ }
415
+ else if (key.return)
416
+ void submit();
417
+ else if (key.backspace || key.delete)
418
+ setBuf((b) => b.slice(0, -1));
419
+ else if (input && !key.ctrl && !key.meta)
420
+ setBuf((b) => b + input);
421
+ return;
422
+ }
423
+ if (key.downArrow || input === "j") {
424
+ setSel((i) => Math.min(i + 1, ROWS.length - 1));
425
+ return;
426
+ }
427
+ if (key.upArrow || input === "k") {
428
+ setSel((i) => Math.max(i - 1, 0));
429
+ return;
430
+ }
431
+ if (key.return) {
432
+ act(ROWS[Math.min(sel, ROWS.length - 1)]);
433
+ return;
434
+ }
435
+ if (input.toLowerCase() === "r") {
436
+ load();
437
+ setHc(loadHermesCapture());
438
+ setCc(loadClaudeCapture());
439
+ setNotice("refreshed");
440
+ return;
441
+ }
442
+ }, { isActive });
443
+ if (overlay === "review") {
444
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [dash ? (_jsx(ReviewTab, { dash: dash, isActive: isActive, onCapture: onCapture })) : (_jsx(Text, { color: theme.dim, children: "no server connected \u2014 nothing to review" })), _jsx(Keys, { items: [["esc", "back to health"]] })] }));
445
+ }
446
+ const selId = ROWS[Math.min(sel, ROWS.length - 1)];
447
+ const cfgFile = loadConfig();
448
+ const providerValue = cfgFile.provider === "local" ? `local · ${trunc(cfgFile.base_url ?? "?", 36)}` :
449
+ cfgFile.provider === "openrouter" ? "openrouter (cloud)" : "not set";
450
+ const editLabel = editing === "model" ? "model id:" :
451
+ editing === "fallback" ? "fallback model id (blank = none):" :
452
+ editing === "autoturns" ? "auto-extract every N turns (0/blank = off):" :
453
+ editing === "sources" ? "hermes sources (comma-sep, * = all):" :
454
+ editing === "ccprojects" ? "claude project dirs (comma-sep, * = all):" :
455
+ editing === "floor" ? "credit floor USD (blank = off):" :
456
+ editing === "cap" ? "daily cap USD (blank = off):" : "";
457
+ const R = ({ id, label, value, color, hint }) => (_jsxs(Row, { selected: selId === id, focused: true, children: [_jsx(Box, { width: 13, children: _jsx(Text, { color: selId === id ? theme.accent : theme.label, children: label }) }), _jsx(Text, { color: color ?? theme.value, children: value }), selId === id ? _jsx(Text, { color: theme.dim, children: ` ${hint}` }) : null] }));
458
+ return (_jsxs(Box, { flexDirection: "column", flexGrow: 1, children: [_jsxs(Section, { title: "server", children: [_jsx(R, { id: "server", label: "connected", value: getBase(), color: dash?.ok ? theme.value : theme.danger, hint: "enter = find + switch server" }), _jsx(R, { id: "db", label: "database", value: dash?.session?.db ?? "—", hint: "enter = switch db (relaunches)" })] }), _jsxs(Section, { title: "pipeline", children: [_jsx(R, { id: "reflect", label: "capture", value: paused ? `${glyph.paused} paused` : reflect?.spend_paused ? `${glyph.paused} spend paused` : `${glyph.up} running`, color: paused || reflect?.spend_paused ? theme.warn : theme.ok, hint: "enter = pause/resume" }), _jsx(R, { id: "provider", label: "provider", value: providerValue, hint: "enter = switch cloud/local + pick model" }), _jsx(R, { id: "model", label: "model", value: cfg?.model || "(default)", hint: "enter = edit" }), _jsx(R, { id: "fallback", label: "fallback", value: cfg?.fallback_model || "(none)", hint: "enter = edit" }), _jsx(R, { id: "autoturns", label: "auto-turns", value: cfg?.arc_auto_turns && Number(cfg.arc_auto_turns) > 0 ? `every ${cfg.arc_auto_turns}` : "off", hint: "enter = edit" }), _jsx(R, { id: "floor", label: "credit floor", value: floor != null ? fmtMoney(floor) : "off", hint: "enter = edit" }), _jsx(R, { id: "cap", label: "daily cap", value: cap != null ? fmtMoney(cap) : "off", hint: "enter = edit" })] }), _jsxs(Section, { title: "capture watchers", children: [_jsx(R, { id: "hermes", label: "hermes", value: isWatcherRunning("hermes") ? `${glyph.up} running` : hc.enabled ? `${glyph.paused} enabled (stopped)` : "off", color: isWatcherRunning("hermes") ? theme.ok : hc.enabled ? theme.warn : theme.dim, hint: "enter = start/stop" }), _jsx(R, { id: "sources", label: " sources", value: hc.sources.join(", "), hint: "enter = edit (* = all)" }), _jsx(R, { id: "claude", label: "claude code", value: isWatcherRunning("claude-code") ? `${glyph.up} running` : cc.enabled ? `${glyph.paused} enabled (stopped)` : "off", color: isWatcherRunning("claude-code") ? theme.ok : cc.enabled ? theme.warn : theme.dim, hint: "enter = start/stop" }), _jsx(R, { id: "ccprojects", label: " projects", value: cc.projects.join(", "), hint: "enter = edit (* = all)" })] }), _jsx(Section, { title: "review", children: _jsx(R, { id: "review", label: "queue", value: unreviewed > 0 ? `${glyph.flag} ${unreviewed} unreviewed` : "clear", color: unreviewed > 0 ? theme.warn : theme.dim, hint: "enter = open review" }) }), overlay === "provider" ? (_jsxs(Panel, { title: "extraction provider", hot: true, children: [pStep === "pick" ? (_jsxs(_Fragment, { children: [_jsxs(Row, { selected: pSel === 0, children: [_jsx(Box, { width: 12, children: _jsx(Text, { bold: pSel === 0, color: pSel === 0 ? theme.value : theme.label, children: "OpenRouter" }) }), _jsx(Text, { color: theme.dim, children: "cloud \u2014 your API key" })] }), _jsxs(Row, { selected: pSel === 1, children: [_jsx(Box, { width: 12, children: _jsx(Text, { bold: pSel === 1, color: pSel === 1 ? theme.value : theme.label, children: "Local" }) }), _jsx(Text, { color: theme.dim, children: "Ollama / LM Studio / vLLM \u2014 auto-scanned, no key, $0" })] }), _jsx(Text, { color: theme.dim, children: "\u2191\u2193 move \u00B7 enter choose \u00B7 esc close" })] })) : null, pStep === "key" ? (_jsxs(_Fragment, { children: [_jsx(Text, { color: theme.dim, children: "Paste your OpenRouter key (openrouter.ai/keys)" }), _jsxs(Box, { children: [_jsx(Text, { color: theme.warn, children: "key: " }), _jsx(Text, { color: theme.value, children: pBuf ? pBuf.slice(0, 8) + "•".repeat(Math.min(Math.max(pBuf.length - 8, 0), 28)) : "" }), _jsx(Text, { color: theme.accent, children: "\u258F" })] }), pBusy ? _jsx(Text, { color: theme.dim, children: "verifying key\u2026" }) : _jsx(Text, { color: theme.dim, children: "enter verify \u00B7 esc back" })] })) : null, pStep === "model" ? (_jsxs(_Fragment, { children: [RECOMMENDED_MODELS.map((m, i) => (_jsxs(Row, { selected: i === pSel, children: [_jsx(Box, { width: 22, children: _jsx(Text, { bold: i === pSel, color: i === pSel ? theme.value : theme.label, children: m.label }) }), _jsx(Text, { color: m.free ? theme.danger : theme.dim, children: m.note })] }, m.id))), _jsxs(Row, { selected: pSel >= RECOMMENDED_MODELS.length, children: [_jsx(Box, { width: 22, children: _jsx(Text, { bold: pSel >= RECOMMENDED_MODELS.length, color: pSel >= RECOMMENDED_MODELS.length ? theme.value : theme.label, children: "Custom\u2026" }) }), pSel >= RECOMMENDED_MODELS.length
459
+ ? _jsxs(Text, { color: pBuf ? theme.value : theme.dim, children: [pBuf || "type any OpenRouter model id", _jsx(Text, { color: theme.accent, children: "\u258F" })] })
460
+ : _jsx(Text, { color: theme.dim, children: "any OpenRouter model id" })] }), (pSel >= RECOMMENDED_MODELS.length ? isTrainsOnPrompts(pBuf) : !!RECOMMENDED_MODELS[pSel]?.free)
461
+ ? _jsx(Text, { color: theme.danger, children: "\u26A0 free \u2014 trains on your prompts (inputs may improve the model)" })
462
+ : null, _jsx(Text, { color: theme.dim, children: "\u2191\u2193 move \u00B7 enter apply \u00B7 esc back" })] })) : null, pStep === "scan" ? (pScanning ? _jsx(Text, { color: theme.dim, children: "scanning Ollama / LM Studio / vLLM\u2026" }) : (_jsxs(_Fragment, { children: [pModels.length === 0
463
+ ? _jsx(Text, { color: theme.dim, children: "no local server found \u2014 start it (e.g. `ollama serve`) and press [r], or enter manually" })
464
+ : pModels.map((m, i) => (_jsxs(Row, { selected: i === pSel, children: [_jsx(Box, { width: 30, children: _jsx(Text, { bold: i === pSel, color: i === pSel ? theme.value : theme.label, children: trunc(m.model, 29) }) }), _jsx(Text, { color: theme.dim, children: m.baseUrl.replace(/^https?:\/\//, "") })] }, `${m.baseUrl}:${m.model}`))), _jsxs(Row, { selected: pSel >= pModels.length, children: [_jsx(Box, { width: 30, children: _jsx(Text, { bold: pSel >= pModels.length, color: pSel >= pModels.length ? theme.value : theme.label, children: "\u2328 Enter manually" }) }), _jsx(Text, { color: theme.dim, children: "type a URL + model id" })] }), _jsx(Text, { color: theme.dim, children: "\u2191\u2193 move \u00B7 enter apply \u00B7 r rescan \u00B7 esc back" })] }))) : null, pStep === "lurl" || pStep === "lmodel" ? (_jsxs(_Fragment, { children: [_jsx(Text, { color: theme.dim, children: pStep === "lurl" ? "your OpenAI-compatible endpoint (Ollama, LM Studio, vLLM)" : "the model id your server serves" }), _jsxs(Box, { children: [_jsx(Text, { color: theme.warn, children: pStep === "lurl" ? "url: " : "model: " }), _jsx(Text, { color: pBuf ? theme.value : theme.dim, children: pBuf || (pStep === "lurl" ? DEFAULT_LOCAL_BASE_URL : "qwen3:30b") }), _jsx(Text, { color: theme.accent, children: "\u258F" })] }), _jsx(Text, { color: theme.dim, children: pStep === "lurl" ? "enter continue · esc back" : "enter apply · esc back" })] })) : null, pErr ? _jsx(Text, { color: theme.danger, children: `⚠ ${pErr}` }) : null] })) : null, overlay === "db" ? (_jsxs(Panel, { title: "switch database", hot: true, children: [dbs.map((d, i) => (_jsxs(Row, { selected: i === dbSel, children: [_jsx(Text, { color: i === dbSel ? theme.value : theme.label, children: d.name }), _jsx(Text, { color: theme.dim, children: ` ${trunc(d.path, 50)}` })] }, d.path))), dbs.length === 0 ? _jsx(Text, { color: theme.dim, children: "no dbs in ~/.nodedex" }) : null] })) : null, overlay === "servers" ? (_jsxs(Panel, { title: "servers found", hot: true, children: [busy ? _jsx(Text, { color: theme.dim, children: "scanning\u2026" }) : null, servers.map((s, i) => (_jsxs(Row, { selected: i === srvSel, children: [_jsx(Text, { color: s.up ? theme.ok : theme.dim, children: `${glyph.up} ` }), _jsx(Text, { color: i === srvSel ? theme.value : theme.label, children: s.url }), _jsx(Text, { color: theme.dim, children: ` ${s.db ?? ""}${s.blocks != null ? ` · ${s.blocks} blk` : ""}` })] }, s.url))), !busy && servers.length === 0 ? _jsx(Text, { color: theme.dim, children: "none up \u2014 launch via onboarding or `nodedex run`" }) : null] })) : null, editing ? (_jsxs(Box, { borderStyle: "round", borderColor: theme.borderHot, paddingX: 1, children: [_jsx(Text, { color: theme.warn, children: `${editLabel} ` }), _jsx(Text, { color: theme.value, children: buf }), _jsx(Text, { color: theme.accent, children: "\u258F" }), _jsx(Text, { color: theme.dim, children: " (enter ok \u00B7 esc cancel)" })] })) : null, notice ? _jsx(Text, { color: theme.warn, children: notice }) : null, _jsx(Box, { flexGrow: 1 }), _jsx(Keys, { items: [["↑↓", "move"], ["enter", "toggle / edit / open"], ["r", "refresh"]] })] }));
465
+ }
@@ -0,0 +1,23 @@
1
+ // hooks.ts — shared React hooks for the TUI.
2
+ import { useEffect, useState } from "react";
3
+ import { useStdout } from "ink";
4
+ // Live terminal dimensions — updates on resize so panels can budget their
5
+ // truncation widths from the real width instead of hardcoded char counts
6
+ // (v1 hardcoded trunc(…, 18-44) and wasted half of any wide terminal).
7
+ export function useTermSize() {
8
+ const { stdout } = useStdout();
9
+ const [size, setSize] = useState({
10
+ columns: stdout?.columns ?? 80,
11
+ rows: stdout?.rows ?? 24,
12
+ });
13
+ useEffect(() => {
14
+ if (!stdout)
15
+ return;
16
+ const onResize = () => setSize({ columns: stdout.columns ?? 80, rows: stdout.rows ?? 24 });
17
+ stdout.on("resize", onResize);
18
+ return () => {
19
+ stdout.off("resize", onResize);
20
+ };
21
+ }, [stdout]);
22
+ return size;
23
+ }