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,498 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ // onboarding.tsx — first-run setup wizard (static, no animation).
3
+ //
4
+ // Flow: welcome → consent → provider → {OpenRouter: key → model | Local: endpoint → model}
5
+ // → port → db → capture (host discovery + per-host consent) → bind → starting → connect.
6
+ // Two model paths: OpenRouter (cloud, BYO key) or Local / self-hosted (Ollama/LM Studio/vLLM —
7
+ // offline, no key, $0). After the DB, a bind-mode step asks WHERE the agent runs: this machine
8
+ // (localhost, no token) or Docker/remote (0.0.0.0 + a generated token) — the connect screen then
9
+ // shows the right URL (+ the token to hand the agent). Onboarding sets up + starts the SERVER.
10
+ // Connecting an autonomous agent (e.g. Hermes) to the running /mcp endpoint + wiring
11
+ // capture is the USER's own step — the final screen points at the GitHub README for the
12
+ // format. Config + secrets go to ~/.nodedex/config.json and are injected into the server
13
+ // the TUI launches (servers.ts). Rolls its own inputs + spinner (no input/spinner deps).
14
+ import { useState, useEffect, useCallback } from "react";
15
+ import { Box, Text, useApp, useInput } from "ink";
16
+ import { Logo } from "./components.js";
17
+ import { theme } from "./theme.js";
18
+ import { saveConfig, DEFAULT_PORT, DEFAULT_LOCAL_BASE_URL, RECOMMENDED_MODELS, isTrainsOnPrompts, validateOpenRouterKey, listDbs, dbPathForName, scanLocalModels, scanCaptureHosts, setHermesCapture, setClaudeCapture, } from "./config.js";
19
+ import { launchServer, genToken, launchWatcher, stopWatcher } from "./servers.js";
20
+ import { probeServer, setBase } from "./api.js";
21
+ import { writeConnectSnippets } from "./connect-snippets.js";
22
+ const README_URL = "https://github.com/NodeDex/NodeDex-v0.1#connect-your-agent";
23
+ // Show a secret's prefix (confirms shape) but mask the tail.
24
+ function maskSecret(k) {
25
+ if (!k)
26
+ return "";
27
+ if (k.length <= 10)
28
+ return k;
29
+ return k.slice(0, 8) + "•".repeat(Math.min(k.length - 8, 28));
30
+ }
31
+ function Spinner() {
32
+ const frames = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
33
+ const [i, setI] = useState(0);
34
+ useEffect(() => {
35
+ const id = setInterval(() => setI((n) => (n + 1) % frames.length), 80);
36
+ return () => clearInterval(id);
37
+ }, []);
38
+ return _jsx(Text, { color: theme.accent, children: frames[i] });
39
+ }
40
+ function Frame({ children }) {
41
+ return (_jsxs(Box, { flexDirection: "column", alignItems: "center", marginTop: 1, children: [_jsx(Logo, {}), _jsx(Box, { flexDirection: "column", alignItems: "center", marginTop: 1, width: 66, children: children })] }));
42
+ }
43
+ function FieldBox({ label, value, focused, mask, placeholder }) {
44
+ const shown = mask ? maskSecret(value) : value;
45
+ return (_jsxs(Box, { borderStyle: "round", borderColor: focused ? theme.borderHot : theme.border, paddingX: 1, width: 56, children: [_jsx(Box, { width: 7, children: _jsx(Text, { color: theme.label, children: label }) }), _jsx(Text, { color: value ? theme.value : theme.dim, children: shown || placeholder || " " }), focused ? _jsx(Text, { color: theme.accent, children: "\u258F" }) : null] }));
46
+ }
47
+ function Hint({ keys }) {
48
+ return (_jsx(Box, { marginTop: 1, children: keys.map(([k, label], i) => (_jsxs(Box, { children: [_jsx(Text, { color: theme.accent, children: `[${k}]` }), _jsx(Text, { color: theme.dim, children: ` ${label}${i < keys.length - 1 ? " " : ""}` })] }, k))) }));
49
+ }
50
+ /** A vertical pick-list row: ▸ marker + bold-on-select + a dim note/aside. */
51
+ function Row({ selected, label, width, aside, asideColor }) {
52
+ return (_jsxs(Box, { children: [_jsx(Text, { color: selected ? theme.accent : theme.dim, children: selected ? "▸ " : " " }), _jsx(Box, { width: width, children: _jsx(Text, { bold: selected, color: selected ? theme.value : theme.dim, children: label }) }), typeof aside === "string" ? _jsx(Text, { color: asideColor ?? theme.dim, children: aside }) : aside] }));
53
+ }
54
+ export function Onboarding({ onDone }) {
55
+ const { exit } = useApp();
56
+ const [step, setStep] = useState("welcome");
57
+ const [orKey, setOrKey] = useState("");
58
+ // provider step (0 = OpenRouter cloud, 1 = Local/self-hosted) + local fields
59
+ const [providerSel, setProviderSel] = useState(0);
60
+ const [localBaseUrl, setLocalBaseUrl] = useState(DEFAULT_LOCAL_BASE_URL);
61
+ const [localModel, setLocalModel] = useState("");
62
+ // local-scan step: discovered models + selection (=== length → "enter manually")
63
+ const [localScanning, setLocalScanning] = useState(false);
64
+ const [localModels, setLocalModels] = useState([]);
65
+ const [localModelSel, setLocalModelSel] = useState(0);
66
+ const [localScanNonce, setLocalScanNonce] = useState(0); // bump to rescan
67
+ const [busy, setBusy] = useState(false);
68
+ const [error, setError] = useState("");
69
+ const [status, setStatus] = useState("");
70
+ // model step
71
+ const [modelSel, setModelSel] = useState(0); // index into RECOMMENDED_MODELS; === length → custom
72
+ const [customModel, setCustomModel] = useState("");
73
+ // port step
74
+ const [freePorts, setFreePorts] = useState([]);
75
+ const [portSel, setPortSel] = useState(0);
76
+ const [chosenPort, setChosenPort] = useState(DEFAULT_PORT);
77
+ // db step
78
+ const [dbs] = useState(() => listDbs());
79
+ const [dbSel, setDbSel] = useState(0); // 0..dbs.length-1 existing; === dbs.length → new
80
+ const [newDbName, setNewDbName] = useState("");
81
+ // capture step: discovered hosts + per-host consent checkbox
82
+ const [captureHosts, setCaptureHosts] = useState([]);
83
+ const [captureSel, setCaptureSel] = useState(0);
84
+ const [captureChecked, setCaptureChecked] = useState({});
85
+ // connect step
86
+ const [serverUrl, setServerUrl] = useState("");
87
+ // bind step (where will the agent run) + launch details for the connect screen
88
+ const [chosenDbPath, setChosenDbPath] = useState("");
89
+ const [bindSel, setBindSel] = useState(0); // 0 = this machine, 1 = docker/remote
90
+ const [launchNetwork, setLaunchNetwork] = useState(false);
91
+ const [launchToken, setLaunchToken] = useState(undefined);
92
+ // Scan local LLM servers when entering the local-scan step (so the user picks a model, not a
93
+ // URL). Re-runs when localScanNonce bumps ([r] rescan — e.g. after starting the server).
94
+ useEffect(() => {
95
+ if (step !== "localscan")
96
+ return;
97
+ let cancelled = false;
98
+ setLocalScanning(true);
99
+ setError("");
100
+ scanLocalModels().then((models) => {
101
+ if (cancelled)
102
+ return;
103
+ setLocalModels(models);
104
+ setLocalModelSel(0);
105
+ setLocalScanning(false);
106
+ });
107
+ return () => { cancelled = true; };
108
+ }, [step, localScanNonce]);
109
+ // Detect free ports when entering the port step (reuse probeServer: a port with no
110
+ // Nodedex responding is free enough to claim; launch fails loudly otherwise).
111
+ useEffect(() => {
112
+ if (step !== "port" || freePorts.length > 0)
113
+ return;
114
+ let cancelled = false;
115
+ (async () => {
116
+ setStatus("Scanning for free ports…");
117
+ const found = [];
118
+ for (const p of [3001, 3002, 3003, 3004, 3005, 3006, 3007, 3008]) {
119
+ const probe = await probeServer(`http://localhost:${p}`);
120
+ if (!probe.up)
121
+ found.push(p);
122
+ if (found.length >= 5)
123
+ break;
124
+ }
125
+ if (cancelled)
126
+ return;
127
+ setStatus("");
128
+ setFreePorts(found.length ? found : [DEFAULT_PORT]);
129
+ setPortSel(0);
130
+ })();
131
+ return () => { cancelled = true; };
132
+ }, [step, freePorts.length]);
133
+ // Launch the server with the chosen port + db, poll until up, then hand off to connect.
134
+ const finishSetup = useCallback(async (port, dbPath, bindHost, token) => {
135
+ setStep("starting");
136
+ setStatus("Starting the Nodedex server (downloading the local embedding model on first run — one-time)…");
137
+ setError("");
138
+ const res = launchServer({ port, dbPath, bindHost, token });
139
+ if (!res.ok) {
140
+ setBusy(false);
141
+ setStatus("");
142
+ setError(`Server failed to start: ${res.error}`);
143
+ setStep("db");
144
+ return;
145
+ }
146
+ const url = `http://localhost:${port}`;
147
+ const deadline = Date.now() + 30000;
148
+ while (Date.now() < deadline) {
149
+ const probe = await probeServer(url);
150
+ if (probe.up) {
151
+ setBase(url);
152
+ setBusy(false);
153
+ setServerUrl(url);
154
+ // Ready-to-paste per-host connect config → ~/.nodedex/connect-snippets.md.
155
+ // Regenerated on every launch so the port/token in it always match this server.
156
+ const network = bindHost === "0.0.0.0";
157
+ writeConnectSnippets({
158
+ mcpUrl: network ? `http://host.docker.internal:${port}/mcp` : `http://127.0.0.1:${port}/mcp`,
159
+ token,
160
+ readmeUrl: README_URL,
161
+ });
162
+ setStep("connect");
163
+ return;
164
+ }
165
+ await new Promise((r) => setTimeout(r, 500));
166
+ }
167
+ setBusy(false);
168
+ setStatus("");
169
+ setError("Server didn't come up in time — see ~/.nodedex/tui-logs/.");
170
+ setStep("db");
171
+ }, []);
172
+ const submitProvider = useCallback(() => {
173
+ setError("");
174
+ setStep(providerSel === 1 ? "localscan" : "openrouter");
175
+ }, [providerSel]);
176
+ const submitLocalScan = useCallback(() => {
177
+ if (localModelSel >= localModels.length) {
178
+ setError("");
179
+ setStep("localendpoint");
180
+ return;
181
+ } // manual entry
182
+ const pick = localModels[localModelSel];
183
+ saveConfig({ provider: "local", base_url: pick.baseUrl, model: pick.model });
184
+ setError("");
185
+ setStep("port");
186
+ }, [localModelSel, localModels]);
187
+ const submitLocalEndpoint = useCallback(() => {
188
+ const url = localBaseUrl.trim();
189
+ if (!url) {
190
+ setError("Enter your local endpoint URL (e.g. http://localhost:11434/v1).");
191
+ return;
192
+ }
193
+ saveConfig({ provider: "local", base_url: url });
194
+ setError("");
195
+ setStep("localmodel");
196
+ }, [localBaseUrl]);
197
+ const submitLocalModel = useCallback(() => {
198
+ const m = localModel.trim();
199
+ if (!m) {
200
+ setError("Enter the model id your server serves (e.g. qwen3:30b).");
201
+ return;
202
+ }
203
+ saveConfig({ model: m });
204
+ setError("");
205
+ setStep("port");
206
+ }, [localModel]);
207
+ const submitOpenRouter = useCallback(async () => {
208
+ const k = orKey.trim();
209
+ if (!k) {
210
+ setError("Paste your OpenRouter API key first.");
211
+ return;
212
+ }
213
+ // Shape check before the network call: catches a truncated paste fast (a long key pasted
214
+ // into a terminal can drop characters) with a clearer message than a generic 401.
215
+ if (!/^sk-or-/.test(k) || k.length < 40) {
216
+ setError("That doesn't look like a full OpenRouter key (sk-or-…, ~73 chars). A long paste can get cut off — re-paste the whole key.");
217
+ return;
218
+ }
219
+ setBusy(true);
220
+ setError("");
221
+ setStatus("Verifying key…");
222
+ const v = await validateOpenRouterKey(k);
223
+ if (!v.ok) {
224
+ setBusy(false);
225
+ setStatus("");
226
+ setError(v.error || "Invalid key.");
227
+ return;
228
+ }
229
+ saveConfig({ provider: "openrouter", openrouter_key: k });
230
+ setBusy(false);
231
+ setStatus("");
232
+ setModelSel(0);
233
+ setStep("model");
234
+ }, [orKey]);
235
+ const submitModel = useCallback(() => {
236
+ const m = modelSel >= RECOMMENDED_MODELS.length ? customModel.trim() : RECOMMENDED_MODELS[modelSel].id;
237
+ if (!m) {
238
+ setError("Pick a model or type a custom id.");
239
+ return;
240
+ }
241
+ saveConfig({ model: m });
242
+ setError("");
243
+ setStep("port");
244
+ }, [modelSel, customModel]);
245
+ const submitPort = useCallback(() => {
246
+ const port = freePorts[portSel] ?? DEFAULT_PORT;
247
+ setChosenPort(port);
248
+ saveConfig({ port });
249
+ setError("");
250
+ setStep("db");
251
+ }, [freePorts, portSel]);
252
+ const submitDb = useCallback(() => {
253
+ let dbPath;
254
+ if (dbSel >= dbs.length) {
255
+ const name = newDbName.trim();
256
+ if (!name) {
257
+ setError("Name your new database.");
258
+ return;
259
+ }
260
+ dbPath = dbPathForName(name);
261
+ }
262
+ else {
263
+ dbPath = dbs[dbSel].path;
264
+ }
265
+ saveConfig({ dbPath, onboarded: true });
266
+ setChosenDbPath(dbPath);
267
+ // Discover capture hosts for the consent step (cheap existence probes, no cooperation needed).
268
+ const hosts = scanCaptureHosts();
269
+ setCaptureHosts(hosts);
270
+ setCaptureChecked(Object.fromEntries(hosts.map((h) => [h.host, h.found]))); // found → pre-checked
271
+ setCaptureSel(0);
272
+ setError("");
273
+ setStep("capture");
274
+ }, [dbSel, dbs, newDbName]);
275
+ // Persist per-host capture consent + converge the watchers to it, then on to bind.
276
+ const submitCapture = useCallback(() => {
277
+ const on = (h) => captureHosts.some((x) => x.host === h && x.found) && !!captureChecked[h];
278
+ setHermesCapture({ enabled: on("hermes") });
279
+ setClaudeCapture({ enabled: on("claude-code") });
280
+ if (on("hermes"))
281
+ launchWatcher("hermes");
282
+ else
283
+ stopWatcher("hermes");
284
+ if (on("claude-code"))
285
+ launchWatcher("claude-code");
286
+ else
287
+ stopWatcher("claude-code");
288
+ setError("");
289
+ setBindSel(0);
290
+ setStep("bind");
291
+ }, [captureHosts, captureChecked]);
292
+ // After the db, ask WHERE the agent runs → localhost (no token) or 0.0.0.0 + generated token.
293
+ const submitBind = useCallback(() => {
294
+ const network = bindSel === 1;
295
+ const token = network ? genToken() : undefined;
296
+ setLaunchNetwork(network);
297
+ setLaunchToken(token);
298
+ setError("");
299
+ void finishSetup(chosenPort, chosenDbPath, network ? "0.0.0.0" : undefined, token);
300
+ }, [bindSel, chosenPort, chosenDbPath, finishSetup]);
301
+ const typeInto = (setter, input, k) => {
302
+ if (k.backspace || k.delete)
303
+ setter((s) => s.slice(0, -1));
304
+ else if (input && !k.ctrl && !k.meta && !k.tab && !k.return && !k.escape)
305
+ setter((s) => s + input.replace(/[\r\n]/g, ""));
306
+ setError("");
307
+ };
308
+ useInput((input, k) => {
309
+ if (k.ctrl && input === "c") {
310
+ exit();
311
+ return;
312
+ }
313
+ if (busy)
314
+ return;
315
+ if (step === "welcome") {
316
+ if (k.return)
317
+ setStep("consent");
318
+ else if (input === "q")
319
+ exit();
320
+ }
321
+ else if (step === "consent") {
322
+ if (k.return)
323
+ setStep("provider");
324
+ else if (input === "q")
325
+ exit();
326
+ }
327
+ else if (step === "provider") {
328
+ if (k.upArrow || k.downArrow)
329
+ setProviderSel((s) => (s === 0 ? 1 : 0));
330
+ else if (k.escape)
331
+ setStep("consent");
332
+ else if (k.return)
333
+ submitProvider();
334
+ }
335
+ else if (step === "openrouter") {
336
+ if (k.return)
337
+ void submitOpenRouter();
338
+ else if (k.escape)
339
+ setStep("provider");
340
+ else
341
+ typeInto(setOrKey, input, k);
342
+ }
343
+ else if (step === "localscan") {
344
+ if (localScanning)
345
+ return;
346
+ const total = localModels.length + 1; // + "enter manually" row
347
+ if (k.upArrow)
348
+ setLocalModelSel((s) => (s - 1 + total) % total);
349
+ else if (k.downArrow)
350
+ setLocalModelSel((s) => (s + 1) % total);
351
+ else if (k.escape)
352
+ setStep("provider");
353
+ else if (input === "r")
354
+ setLocalScanNonce((n) => n + 1);
355
+ else if (k.return)
356
+ submitLocalScan();
357
+ }
358
+ else if (step === "localendpoint") {
359
+ if (k.return)
360
+ submitLocalEndpoint();
361
+ else if (k.escape)
362
+ setStep("localscan");
363
+ else
364
+ typeInto(setLocalBaseUrl, input, k);
365
+ }
366
+ else if (step === "localmodel") {
367
+ if (k.return)
368
+ submitLocalModel();
369
+ else if (k.escape)
370
+ setStep("localendpoint");
371
+ else
372
+ typeInto(setLocalModel, input, k);
373
+ }
374
+ else if (step === "model") {
375
+ const total = RECOMMENDED_MODELS.length + 1; // + custom row
376
+ if (k.upArrow)
377
+ setModelSel((s) => (s - 1 + total) % total);
378
+ else if (k.downArrow)
379
+ setModelSel((s) => (s + 1) % total);
380
+ else if (k.escape)
381
+ setStep("openrouter");
382
+ else if (k.return)
383
+ submitModel();
384
+ else if (modelSel >= RECOMMENDED_MODELS.length)
385
+ typeInto(setCustomModel, input, k);
386
+ }
387
+ else if (step === "port") {
388
+ if (freePorts.length === 0)
389
+ return; // still scanning
390
+ if (k.upArrow)
391
+ setPortSel((s) => (s - 1 + freePorts.length) % freePorts.length);
392
+ else if (k.downArrow)
393
+ setPortSel((s) => (s + 1) % freePorts.length);
394
+ else if (k.return)
395
+ submitPort();
396
+ else if (k.escape)
397
+ setStep(providerSel === 1 ? "localscan" : "model");
398
+ }
399
+ else if (step === "db") {
400
+ const total = dbs.length + 1; // + new row
401
+ if (k.upArrow)
402
+ setDbSel((s) => (s - 1 + total) % total);
403
+ else if (k.downArrow)
404
+ setDbSel((s) => (s + 1) % total);
405
+ else if (k.escape)
406
+ setStep("port");
407
+ else if (k.return)
408
+ submitDb();
409
+ else if (dbSel >= dbs.length)
410
+ typeInto(setNewDbName, input, k);
411
+ }
412
+ else if (step === "capture") {
413
+ if (k.upArrow)
414
+ setCaptureSel((s) => Math.max(0, s - 1));
415
+ else if (k.downArrow)
416
+ setCaptureSel((s) => Math.min(captureHosts.length - 1, s + 1));
417
+ else if (input === " ") {
418
+ const h = captureHosts[captureSel];
419
+ if (h?.found)
420
+ setCaptureChecked((c) => ({ ...c, [h.host]: !c[h.host] }));
421
+ }
422
+ else if (k.return)
423
+ submitCapture();
424
+ else if (k.escape)
425
+ setStep("db");
426
+ }
427
+ else if (step === "bind") {
428
+ if (k.upArrow || k.downArrow)
429
+ setBindSel((s) => (s === 0 ? 1 : 0));
430
+ else if (k.escape)
431
+ setStep("capture");
432
+ else if (k.return)
433
+ submitBind();
434
+ }
435
+ else if (step === "connect") {
436
+ if (k.return)
437
+ onDone();
438
+ }
439
+ });
440
+ if (step === "welcome") {
441
+ return (_jsxs(Frame, { children: [_jsx(Text, { color: theme.value, children: "Welcome \u2014 let's get your agent's memory set up." }), _jsx(Hint, { keys: [["Enter", "begin"], ["q", "quit"]] })] }));
442
+ }
443
+ if (step === "consent") {
444
+ return (_jsxs(Frame, { children: [_jsx(Text, { color: theme.title, bold: true, children: "Before you start" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: theme.value, children: "\u00B7 Nodedex stores your work as a knowledge graph on your machine." }), _jsx(Text, { color: theme.value, children: "\u00B7 An AI pipeline builds your agent's memory from your turns \u2014 it" }), _jsx(Text, { color: theme.value, children: " can be wrong or incomplete; the agent's notes, not ground truth." }), _jsx(Text, { color: theme.value, children: "\u00B7 You bring your own model \u2014 a cloud key (billed to you) or a local one." })] }), _jsx(Hint, { keys: [["Enter", "I understand & agree"], ["q", "quit"]] })] }));
445
+ }
446
+ if (step === "provider") {
447
+ return (_jsxs(Frame, { children: [_jsx(Text, { color: theme.title, bold: true, children: "How will you run the extraction model?" }), _jsx(Text, { color: theme.dim, children: "NodeDex's pipeline uses it to turn your turns into the graph." }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Row, { selected: providerSel === 0, label: "OpenRouter", width: 12, aside: "cloud \u2014 bring your API key (recommended)" }), _jsx(Row, { selected: providerSel === 1, label: "Local", width: 12, aside: "self-hosted (Ollama / LM Studio) \u2014 offline, no key, $0" })] }), _jsx(Hint, { keys: [["↑↓", "move"], ["Enter", "select"], ["Esc", "back"]] })] }));
448
+ }
449
+ if (step === "localscan") {
450
+ const manualSel = localModelSel >= localModels.length;
451
+ return (_jsxs(Frame, { children: [_jsx(Text, { color: theme.title, bold: true, children: "Pick a local model" }), _jsx(Text, { color: theme.dim, children: "Make sure your model server (Ollama / LM Studio / vLLM) is running first." }), localScanning ? (_jsxs(Box, { marginTop: 1, children: [_jsx(Spinner, {}), _jsx(Text, { color: theme.dim, children: ` Scanning Ollama / LM Studio / vLLM…` })] })) : (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [localModels.length === 0
452
+ ? _jsx(Text, { color: theme.dim, children: "No local server found. Start it (e.g. `ollama serve`) and press [r], or enter it manually." })
453
+ : localModels.map((m, i) => (_jsx(Row, { selected: i === localModelSel, label: m.model, width: 30, aside: m.baseUrl.replace(/^https?:\/\//, "") }, `${m.baseUrl}:${m.model}`))), _jsx(Row, { selected: manualSel, label: "\u2328 Enter manually", width: 30, aside: "type a URL + model id" })] })), error ? _jsx(Text, { color: theme.danger, children: `⚠ ${error}` }) : null, _jsx(Hint, { keys: [["↑↓", "move"], ["Enter", "select"], ["r", "rescan"], ["Esc", "back"]] })] }));
454
+ }
455
+ if (step === "localendpoint") {
456
+ return (_jsxs(Frame, { children: [_jsx(Text, { color: theme.title, bold: true, children: "Local endpoint" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: theme.dim, children: "Your OpenAI-compatible server (Ollama, LM Studio, vLLM)" }), _jsx(Box, { marginTop: 1, children: _jsx(FieldBox, { label: "url", value: localBaseUrl, focused: true, placeholder: DEFAULT_LOCAL_BASE_URL }) }), error ? _jsx(Text, { color: theme.danger, children: `⚠ ${error}` }) : _jsx(Text, { children: " " })] }), _jsx(Hint, { keys: [["Enter", "continue"], ["Esc", "back"]] })] }));
457
+ }
458
+ if (step === "localmodel") {
459
+ return (_jsxs(Frame, { children: [_jsx(Text, { color: theme.title, bold: true, children: "Local model" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: theme.dim, children: "The model id your server serves (e.g. qwen3:30b, llama3.3)" }), _jsx(Box, { marginTop: 1, children: _jsx(FieldBox, { label: "model", value: localModel, focused: true, placeholder: "qwen3:30b" }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.dim, children: "A capable ~30B+ model gives the best extraction quality." }) }), error ? _jsx(Text, { color: theme.danger, children: `⚠ ${error}` }) : _jsx(Text, { children: " " })] }), _jsx(Hint, { keys: [["Enter", "continue"], ["Esc", "back"]] })] }));
460
+ }
461
+ if (step === "openrouter") {
462
+ return (_jsxs(Frame, { children: [_jsx(Text, { color: theme.title, bold: true, children: "Connect OpenRouter" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: theme.dim, children: "Get a key at openrouter.ai/keys" }), _jsx(Box, { marginTop: 1, children: _jsx(FieldBox, { label: "key", value: orKey, focused: true, mask: true, placeholder: "sk-or-..." }) }), error ? _jsx(Text, { color: theme.danger, children: `⚠ ${error}` }) : _jsx(Text, { children: " " }), status ? _jsxs(Box, { children: [_jsx(Spinner, {}), _jsx(Text, { color: theme.dim, children: ` ${status}` })] }) : null] }), _jsx(Hint, { keys: [["Enter", "verify & continue"], ["Esc", "back"]] })] }));
463
+ }
464
+ if (step === "model") {
465
+ const custom = modelSel >= RECOMMENDED_MODELS.length;
466
+ const warn = custom ? isTrainsOnPrompts(customModel) : !!RECOMMENDED_MODELS[modelSel].free;
467
+ return (_jsxs(Frame, { children: [_jsx(Text, { color: theme.title, bold: true, children: "Choose a model" }), _jsx(Text, { color: theme.dim, children: "OpenRouter slugs \u2014 vendor/model (custom: any OpenRouter id)" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [RECOMMENDED_MODELS.map((m, i) => (_jsx(Row, { selected: i === modelSel, label: m.label, width: 20, aside: m.note, asideColor: m.free ? theme.danger : theme.dim }, m.id))), _jsx(Row, { selected: custom, label: "Custom\u2026", width: 20, aside: custom
468
+ ? _jsxs(Text, { color: customModel ? theme.value : theme.dim, children: [(customModel || "type a model id"), _jsx(Text, { color: theme.accent, children: "\u258F" })] })
469
+ : "enter any model id" })] }), warn
470
+ ? _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.danger, children: "\u26A0 Free \u2014 but it trains on your prompts (your inputs may be used to improve the model)." }) })
471
+ : _jsx(Text, { children: " " }), error ? _jsx(Text, { color: theme.danger, children: `⚠ ${error}` }) : null, _jsx(Hint, { keys: [["↑↓", "move"], ["Enter", "select"], ["Esc", "back"]] })] }));
472
+ }
473
+ if (step === "port") {
474
+ return (_jsxs(Frame, { children: [_jsx(Text, { color: theme.title, bold: true, children: "Pick a port" }), freePorts.length === 0
475
+ ? _jsxs(Box, { marginTop: 1, children: [_jsx(Spinner, {}), _jsx(Text, { color: theme.dim, children: ` ${status || "Scanning…"}` })] })
476
+ : (_jsx(Box, { marginTop: 1, flexDirection: "column", children: freePorts.map((p, i) => (_jsx(Row, { selected: i === portSel, label: `localhost:${p}`, width: 18, aside: "free" }, p))) })), error ? _jsx(Text, { color: theme.danger, children: `⚠ ${error}` }) : null, _jsx(Hint, { keys: [["↑↓", "move"], ["Enter", "select"], ["Esc", "back"]] })] }));
477
+ }
478
+ if (step === "db") {
479
+ const newSel = dbSel >= dbs.length;
480
+ return (_jsxs(Frame, { children: [_jsx(Text, { color: theme.title, bold: true, children: "Choose a database" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [dbs.map((d, i) => (_jsx(Row, { selected: i === dbSel, label: d.name, width: 18, aside: "existing" }, d.path))), _jsx(Row, { selected: newSel, label: "\uFF0B New database", width: 18, aside: newSel
481
+ ? _jsxs(Text, { color: newDbName ? theme.value : theme.dim, children: [(newDbName || "name it"), _jsx(Text, { color: theme.accent, children: "\u258F" })] })
482
+ : "create + name a new graph" })] }), error ? _jsx(Text, { color: theme.danger, children: `⚠ ${error}` }) : null, _jsx(Hint, { keys: [["↑↓", "move"], ["Enter", "select"], ["Esc", "back"]] })] }));
483
+ }
484
+ if (step === "capture") {
485
+ return (_jsxs(Frame, { children: [_jsx(Text, { color: theme.title, bold: true, children: "Capture \u2014 which agents feed this memory?" }), _jsx(Text, { color: theme.dim, children: "NodeDex reads each host's own conversation log (read-only, on this machine)." }), _jsx(Text, { color: theme.dim, children: "Only new turns are captured \u2014 never past history. Change anytime in Settings." }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: captureHosts.map((h, i) => (_jsx(Row, { selected: i === captureSel, label: `${h.found && captureChecked[h.host] ? "[✓]" : "[ ]"} ${h.label}`, width: 22, aside: h.found ? h.detail : `${h.detail} — will idle until it appears`, asideColor: h.found ? theme.value : theme.dim }, h.host))) }), error ? _jsx(Text, { color: theme.danger, children: `⚠ ${error}` }) : null, _jsx(Hint, { keys: [["↑↓", "move"], ["space", "toggle"], ["Enter", "continue"], ["Esc", "back"]] })] }));
486
+ }
487
+ if (step === "bind") {
488
+ return (_jsxs(Frame, { children: [_jsx(Text, { color: theme.title, bold: true, children: "Where will your agent run?" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Row, { selected: bindSel === 0, label: "This machine", width: 20, aside: "localhost \u2014 simplest & private, no token" }), _jsx(Row, { selected: bindSel === 1, label: "Docker / remote", width: 20, aside: "0.0.0.0 + token \u2014 agent in a container or on another machine" })] }), error ? _jsx(Text, { color: theme.danger, children: `⚠ ${error}` }) : null, _jsx(Hint, { keys: [["↑↓", "move"], ["Enter", "start server"], ["Esc", "back"]] })] }));
489
+ }
490
+ if (step === "connect") {
491
+ const mcpUrl = launchNetwork
492
+ ? `http://host.docker.internal:${chosenPort}/mcp`
493
+ : `${serverUrl.replace("localhost", "127.0.0.1")}/mcp`;
494
+ return (_jsxs(Frame, { children: [_jsx(Text, { color: theme.title, bold: true, children: "\u2713 Server running" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: theme.value, children: mcpUrl }), launchNetwork ? (_jsxs(Box, { marginTop: 1, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: theme.value, children: `Authorization: Bearer ${launchToken}` }), _jsx(Text, { color: theme.warn, children: `⚠ keep this token safe — your agent needs it; it won't be shown again.` })] })) : null, _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: theme.value, children: "1 \u00B7 Connect your agent (READ):" }), _jsx(Text, { color: theme.dim, children: ` Claude Code claude mcp add --transport http nodedex ${mcpUrl}` }), _jsx(Text, { color: theme.dim, children: ` Hermes MCP server url → ${mcpUrl}` }), _jsx(Text, { color: theme.dim, children: ` Other hosts any MCP client → that URL (Streamable HTTP)` })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: theme.value, children: "2 \u00B7 Wire CAPTURE \u2014 without it the graph stays empty:" }), _jsx(Text, { color: theme.dim, children: ` Hermes → automatic (watcher) · other hosts → README "capture"` })] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.dim, children: "Copy-paste snippets for every host (incl. auth) saved to:" }) }), _jsx(Text, { color: theme.accent, children: "~/.nodedex/connect-snippets.md" }), _jsx(Text, { color: theme.accent, children: README_URL })] }), _jsx(Hint, { keys: [["Enter", "open dashboard"]] })] }));
495
+ }
496
+ // starting
497
+ return (_jsxs(Frame, { children: [_jsxs(Box, { children: [_jsx(Spinner, {}), _jsx(Text, { color: theme.value, children: ` ${status || "Starting…"}` })] }), error ? _jsx(Text, { color: theme.danger, children: `⚠ ${error}` }) : null] }));
498
+ }