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.
- package/adapters/claude-code-watcher.mjs +336 -0
- package/adapters/hermes-statedb-watcher.mjs +234 -0
- package/adapters/nodedex-capture-core.mjs +129 -0
- package/adapters/nodedex-capture.mjs +169 -0
- package/dist/agent-protocol.d.ts +7 -0
- package/dist/agent-protocol.d.ts.map +1 -0
- package/dist/agent-protocol.js +38 -0
- package/dist/agent-protocol.js.map +1 -0
- package/dist/api-server.d.ts +5 -0
- package/dist/api-server.d.ts.map +1 -0
- package/dist/api-server.js +351 -0
- package/dist/api-server.js.map +1 -0
- package/dist/boot-env.d.ts +2 -0
- package/dist/boot-env.d.ts.map +1 -0
- package/dist/boot-env.js +12 -0
- package/dist/boot-env.js.map +1 -0
- package/dist/engine/__tests__/search-core.test.d.ts +2 -0
- package/dist/engine/__tests__/search-core.test.d.ts.map +1 -0
- package/dist/engine/__tests__/search-core.test.js +139 -0
- package/dist/engine/__tests__/search-core.test.js.map +1 -0
- package/dist/engine/ai-provider.d.ts +45 -0
- package/dist/engine/ai-provider.d.ts.map +1 -0
- package/dist/engine/ai-provider.js +5 -0
- package/dist/engine/ai-provider.js.map +1 -0
- package/dist/engine/embeddings.d.ts +51 -0
- package/dist/engine/embeddings.d.ts.map +1 -0
- package/dist/engine/embeddings.js +89 -0
- package/dist/engine/embeddings.js.map +1 -0
- package/dist/engine/providers/__tests__/failure-policy.test.d.ts +2 -0
- package/dist/engine/providers/__tests__/failure-policy.test.d.ts.map +1 -0
- package/dist/engine/providers/__tests__/failure-policy.test.js +134 -0
- package/dist/engine/providers/__tests__/failure-policy.test.js.map +1 -0
- package/dist/engine/providers/__tests__/model-caps.test.d.ts +2 -0
- package/dist/engine/providers/__tests__/model-caps.test.d.ts.map +1 -0
- package/dist/engine/providers/__tests__/model-caps.test.js +38 -0
- package/dist/engine/providers/__tests__/model-caps.test.js.map +1 -0
- package/dist/engine/providers/__tests__/openai-structured.test.d.ts +2 -0
- package/dist/engine/providers/__tests__/openai-structured.test.d.ts.map +1 -0
- package/dist/engine/providers/__tests__/openai-structured.test.js +73 -0
- package/dist/engine/providers/__tests__/openai-structured.test.js.map +1 -0
- package/dist/engine/providers/__tests__/usage-ledger.test.d.ts +2 -0
- package/dist/engine/providers/__tests__/usage-ledger.test.d.ts.map +1 -0
- package/dist/engine/providers/__tests__/usage-ledger.test.js +108 -0
- package/dist/engine/providers/__tests__/usage-ledger.test.js.map +1 -0
- package/dist/engine/providers/anthropic.d.ts +17 -0
- package/dist/engine/providers/anthropic.d.ts.map +1 -0
- package/dist/engine/providers/anthropic.js +125 -0
- package/dist/engine/providers/anthropic.js.map +1 -0
- package/dist/engine/providers/failure-policy.d.ts +56 -0
- package/dist/engine/providers/failure-policy.d.ts.map +1 -0
- package/dist/engine/providers/failure-policy.js +120 -0
- package/dist/engine/providers/failure-policy.js.map +1 -0
- package/dist/engine/providers/gemini.d.ts +22 -0
- package/dist/engine/providers/gemini.d.ts.map +1 -0
- package/dist/engine/providers/gemini.js +180 -0
- package/dist/engine/providers/gemini.js.map +1 -0
- package/dist/engine/providers/index.d.ts +8 -0
- package/dist/engine/providers/index.d.ts.map +1 -0
- package/dist/engine/providers/index.js +67 -0
- package/dist/engine/providers/index.js.map +1 -0
- package/dist/engine/providers/local.d.ts +12 -0
- package/dist/engine/providers/local.d.ts.map +1 -0
- package/dist/engine/providers/local.js +46 -0
- package/dist/engine/providers/local.js.map +1 -0
- package/dist/engine/providers/model-caps.d.ts +6 -0
- package/dist/engine/providers/model-caps.d.ts.map +1 -0
- package/dist/engine/providers/model-caps.js +49 -0
- package/dist/engine/providers/model-caps.js.map +1 -0
- package/dist/engine/providers/openai.d.ts +30 -0
- package/dist/engine/providers/openai.d.ts.map +1 -0
- package/dist/engine/providers/openai.js +309 -0
- package/dist/engine/providers/openai.js.map +1 -0
- package/dist/engine/providers/usage-ledger.d.ts +69 -0
- package/dist/engine/providers/usage-ledger.d.ts.map +1 -0
- package/dist/engine/providers/usage-ledger.js +209 -0
- package/dist/engine/providers/usage-ledger.js.map +1 -0
- package/dist/engine/search-core.d.ts +40 -0
- package/dist/engine/search-core.d.ts.map +1 -0
- package/dist/engine/search-core.js +109 -0
- package/dist/engine/search-core.js.map +1 -0
- package/dist/engine/vector-math.d.ts +5 -0
- package/dist/engine/vector-math.d.ts.map +1 -0
- package/dist/engine/vector-math.js +25 -0
- package/dist/engine/vector-math.js.map +1 -0
- package/dist/home-env.d.ts +26 -0
- package/dist/home-env.d.ts.map +1 -0
- package/dist/home-env.js +87 -0
- package/dist/home-env.js.map +1 -0
- package/dist/mcp-server.d.ts +13 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +79 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/middleware/auth.d.ts +23 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +104 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/auto-recall.d.ts +7 -0
- package/dist/middleware/auto-recall.d.ts.map +1 -0
- package/dist/middleware/auto-recall.js +257 -0
- package/dist/middleware/auto-recall.js.map +1 -0
- package/dist/middleware/auto-reflect.d.ts +4 -0
- package/dist/middleware/auto-reflect.d.ts.map +1 -0
- package/dist/middleware/auto-reflect.js +5 -0
- package/dist/middleware/auto-reflect.js.map +1 -0
- package/dist/middleware/reflect/apply-flag-verdict.d.ts +27 -0
- package/dist/middleware/reflect/apply-flag-verdict.d.ts.map +1 -0
- package/dist/middleware/reflect/apply-flag-verdict.js +57 -0
- package/dist/middleware/reflect/apply-flag-verdict.js.map +1 -0
- package/dist/middleware/reflect/arc-entity-resolve.d.ts +29 -0
- package/dist/middleware/reflect/arc-entity-resolve.d.ts.map +1 -0
- package/dist/middleware/reflect/arc-entity-resolve.js +356 -0
- package/dist/middleware/reflect/arc-entity-resolve.js.map +1 -0
- package/dist/middleware/reflect/arc-inactivity-timer.d.ts +47 -0
- package/dist/middleware/reflect/arc-inactivity-timer.d.ts.map +1 -0
- package/dist/middleware/reflect/arc-inactivity-timer.js +175 -0
- package/dist/middleware/reflect/arc-inactivity-timer.js.map +1 -0
- package/dist/middleware/reflect/arc-pipeline.d.ts +33 -0
- package/dist/middleware/reflect/arc-pipeline.d.ts.map +1 -0
- package/dist/middleware/reflect/arc-pipeline.js +498 -0
- package/dist/middleware/reflect/arc-pipeline.js.map +1 -0
- package/dist/middleware/reflect/comprehend-pergroup.d.ts +100 -0
- package/dist/middleware/reflect/comprehend-pergroup.d.ts.map +1 -0
- package/dist/middleware/reflect/comprehend-pergroup.js +610 -0
- package/dist/middleware/reflect/comprehend-pergroup.js.map +1 -0
- package/dist/middleware/reflect/comprehend.d.ts +237 -0
- package/dist/middleware/reflect/comprehend.d.ts.map +1 -0
- package/dist/middleware/reflect/comprehend.js +706 -0
- package/dist/middleware/reflect/comprehend.js.map +1 -0
- package/dist/middleware/reflect/config.d.ts +34 -0
- package/dist/middleware/reflect/config.d.ts.map +1 -0
- package/dist/middleware/reflect/config.js +131 -0
- package/dist/middleware/reflect/config.js.map +1 -0
- package/dist/middleware/reflect/context.d.ts +138 -0
- package/dist/middleware/reflect/context.d.ts.map +1 -0
- package/dist/middleware/reflect/context.js +619 -0
- package/dist/middleware/reflect/context.js.map +1 -0
- package/dist/middleware/reflect/cost-breakdown.d.ts +69 -0
- package/dist/middleware/reflect/cost-breakdown.d.ts.map +1 -0
- package/dist/middleware/reflect/cost-breakdown.js +63 -0
- package/dist/middleware/reflect/cost-breakdown.js.map +1 -0
- package/dist/middleware/reflect/cost-guard.d.ts +102 -0
- package/dist/middleware/reflect/cost-guard.d.ts.map +1 -0
- package/dist/middleware/reflect/cost-guard.js +243 -0
- package/dist/middleware/reflect/cost-guard.js.map +1 -0
- package/dist/middleware/reflect/cost-pricing.d.ts +54 -0
- package/dist/middleware/reflect/cost-pricing.d.ts.map +1 -0
- package/dist/middleware/reflect/cost-pricing.js +148 -0
- package/dist/middleware/reflect/cost-pricing.js.map +1 -0
- package/dist/middleware/reflect/cross-group-link.d.ts +61 -0
- package/dist/middleware/reflect/cross-group-link.d.ts.map +1 -0
- package/dist/middleware/reflect/cross-group-link.js +212 -0
- package/dist/middleware/reflect/cross-group-link.js.map +1 -0
- package/dist/middleware/reflect/dedup-by-source-and-value.d.ts +70 -0
- package/dist/middleware/reflect/dedup-by-source-and-value.d.ts.map +1 -0
- package/dist/middleware/reflect/dedup-by-source-and-value.js +0 -0
- package/dist/middleware/reflect/dedup-by-source-and-value.js.map +1 -0
- package/dist/middleware/reflect/describe-roots.d.ts +58 -0
- package/dist/middleware/reflect/describe-roots.d.ts.map +1 -0
- package/dist/middleware/reflect/describe-roots.js +266 -0
- package/dist/middleware/reflect/describe-roots.js.map +1 -0
- package/dist/middleware/reflect/flag-reviewer-startup.d.ts +16 -0
- package/dist/middleware/reflect/flag-reviewer-startup.d.ts.map +1 -0
- package/dist/middleware/reflect/flag-reviewer-startup.js +107 -0
- package/dist/middleware/reflect/flag-reviewer-startup.js.map +1 -0
- package/dist/middleware/reflect/flag-reviewer.d.ts +69 -0
- package/dist/middleware/reflect/flag-reviewer.d.ts.map +1 -0
- package/dist/middleware/reflect/flag-reviewer.js +520 -0
- package/dist/middleware/reflect/flag-reviewer.js.map +1 -0
- package/dist/middleware/reflect/inline-dedup.d.ts +26 -0
- package/dist/middleware/reflect/inline-dedup.d.ts.map +1 -0
- package/dist/middleware/reflect/inline-dedup.js +131 -0
- package/dist/middleware/reflect/inline-dedup.js.map +1 -0
- package/dist/middleware/reflect/justify-decisions.d.ts +37 -0
- package/dist/middleware/reflect/justify-decisions.d.ts.map +1 -0
- package/dist/middleware/reflect/justify-decisions.js +159 -0
- package/dist/middleware/reflect/justify-decisions.js.map +1 -0
- package/dist/middleware/reflect/nl-accept.d.ts +35 -0
- package/dist/middleware/reflect/nl-accept.d.ts.map +1 -0
- package/dist/middleware/reflect/nl-accept.js +167 -0
- package/dist/middleware/reflect/nl-accept.js.map +1 -0
- package/dist/middleware/reflect/pass0.d.ts +20 -0
- package/dist/middleware/reflect/pass0.d.ts.map +1 -0
- package/dist/middleware/reflect/pass0.js +423 -0
- package/dist/middleware/reflect/pass0.js.map +1 -0
- package/dist/middleware/reflect/pass1.d.ts +17 -0
- package/dist/middleware/reflect/pass1.d.ts.map +1 -0
- package/dist/middleware/reflect/pass1.js +241 -0
- package/dist/middleware/reflect/pass1.js.map +1 -0
- package/dist/middleware/reflect/pass2-quarantine.d.ts +129 -0
- package/dist/middleware/reflect/pass2-quarantine.d.ts.map +1 -0
- package/dist/middleware/reflect/pass2-quarantine.js +272 -0
- package/dist/middleware/reflect/pass2-quarantine.js.map +1 -0
- package/dist/middleware/reflect/pass2-seams.d.ts +205 -0
- package/dist/middleware/reflect/pass2-seams.d.ts.map +1 -0
- package/dist/middleware/reflect/pass2-seams.js +279 -0
- package/dist/middleware/reflect/pass2-seams.js.map +1 -0
- package/dist/middleware/reflect/pass2-split-orchestrator.d.ts +37 -0
- package/dist/middleware/reflect/pass2-split-orchestrator.d.ts.map +1 -0
- package/dist/middleware/reflect/pass2-split-orchestrator.js +531 -0
- package/dist/middleware/reflect/pass2-split-orchestrator.js.map +1 -0
- package/dist/middleware/reflect/pass2.d.ts +17 -0
- package/dist/middleware/reflect/pass2.d.ts.map +1 -0
- package/dist/middleware/reflect/pass2.js +324 -0
- package/dist/middleware/reflect/pass2.js.map +1 -0
- package/dist/middleware/reflect/pass2a.d.ts +141 -0
- package/dist/middleware/reflect/pass2a.d.ts.map +1 -0
- package/dist/middleware/reflect/pass2a.js +404 -0
- package/dist/middleware/reflect/pass2a.js.map +1 -0
- package/dist/middleware/reflect/pass2b.d.ts +108 -0
- package/dist/middleware/reflect/pass2b.d.ts.map +1 -0
- package/dist/middleware/reflect/pass2b.js +480 -0
- package/dist/middleware/reflect/pass2b.js.map +1 -0
- package/dist/middleware/reflect/pass2c.d.ts +113 -0
- package/dist/middleware/reflect/pass2c.d.ts.map +1 -0
- package/dist/middleware/reflect/pass2c.js +360 -0
- package/dist/middleware/reflect/pass2c.js.map +1 -0
- package/dist/middleware/reflect/pass3-batch.d.ts +62 -0
- package/dist/middleware/reflect/pass3-batch.d.ts.map +1 -0
- package/dist/middleware/reflect/pass3-batch.js +139 -0
- package/dist/middleware/reflect/pass3-batch.js.map +1 -0
- package/dist/middleware/reflect/pass3.d.ts +23 -0
- package/dist/middleware/reflect/pass3.d.ts.map +1 -0
- package/dist/middleware/reflect/pass3.js +371 -0
- package/dist/middleware/reflect/pass3.js.map +1 -0
- package/dist/middleware/reflect/pass4-slice.d.ts +25 -0
- package/dist/middleware/reflect/pass4-slice.d.ts.map +1 -0
- package/dist/middleware/reflect/pass4-slice.js +315 -0
- package/dist/middleware/reflect/pass4-slice.js.map +1 -0
- package/dist/middleware/reflect/pass4.d.ts +30 -0
- package/dist/middleware/reflect/pass4.d.ts.map +1 -0
- package/dist/middleware/reflect/pass4.js +193 -0
- package/dist/middleware/reflect/pass4.js.map +1 -0
- package/dist/middleware/reflect/pass5.d.ts +22 -0
- package/dist/middleware/reflect/pass5.d.ts.map +1 -0
- package/dist/middleware/reflect/pass5.js +178 -0
- package/dist/middleware/reflect/pass5.js.map +1 -0
- package/dist/middleware/reflect/pass_judge.d.ts +44 -0
- package/dist/middleware/reflect/pass_judge.d.ts.map +1 -0
- package/dist/middleware/reflect/pass_judge.js +263 -0
- package/dist/middleware/reflect/pass_judge.js.map +1 -0
- package/dist/middleware/reflect/pipeline-flags.d.ts +140 -0
- package/dist/middleware/reflect/pipeline-flags.d.ts.map +1 -0
- package/dist/middleware/reflect/pipeline-flags.js +314 -0
- package/dist/middleware/reflect/pipeline-flags.js.map +1 -0
- package/dist/middleware/reflect/pipeline.d.ts +237 -0
- package/dist/middleware/reflect/pipeline.d.ts.map +1 -0
- package/dist/middleware/reflect/pipeline.js +3114 -0
- package/dist/middleware/reflect/pipeline.js.map +1 -0
- package/dist/middleware/reflect/promptOverride.d.ts +14 -0
- package/dist/middleware/reflect/promptOverride.d.ts.map +1 -0
- package/dist/middleware/reflect/promptOverride.js +28 -0
- package/dist/middleware/reflect/promptOverride.js.map +1 -0
- package/dist/middleware/reflect/provenance-check.d.ts +48 -0
- package/dist/middleware/reflect/provenance-check.d.ts.map +1 -0
- package/dist/middleware/reflect/provenance-check.js +180 -0
- package/dist/middleware/reflect/provenance-check.js.map +1 -0
- package/dist/middleware/reflect/provenance-reviewer.d.ts +52 -0
- package/dist/middleware/reflect/provenance-reviewer.d.ts.map +1 -0
- package/dist/middleware/reflect/provenance-reviewer.js +253 -0
- package/dist/middleware/reflect/provenance-reviewer.js.map +1 -0
- package/dist/middleware/reflect/prune-collapsed-types.d.ts +11 -0
- package/dist/middleware/reflect/prune-collapsed-types.d.ts.map +1 -0
- package/dist/middleware/reflect/prune-collapsed-types.js +32 -0
- package/dist/middleware/reflect/prune-collapsed-types.js.map +1 -0
- package/dist/middleware/reflect/recognize-root.d.ts +75 -0
- package/dist/middleware/reflect/recognize-root.d.ts.map +1 -0
- package/dist/middleware/reflect/recognize-root.js +204 -0
- package/dist/middleware/reflect/recognize-root.js.map +1 -0
- package/dist/middleware/reflect/render-agent-flag.d.ts +25 -0
- package/dist/middleware/reflect/render-agent-flag.d.ts.map +1 -0
- package/dist/middleware/reflect/render-agent-flag.js +39 -0
- package/dist/middleware/reflect/render-agent-flag.js.map +1 -0
- package/dist/middleware/reflect/retrieve-graph-slice.d.ts +54 -0
- package/dist/middleware/reflect/retrieve-graph-slice.d.ts.map +1 -0
- package/dist/middleware/reflect/retrieve-graph-slice.js +173 -0
- package/dist/middleware/reflect/retrieve-graph-slice.js.map +1 -0
- package/dist/middleware/reflect/root-relatedness.d.ts +31 -0
- package/dist/middleware/reflect/root-relatedness.d.ts.map +1 -0
- package/dist/middleware/reflect/root-relatedness.js +92 -0
- package/dist/middleware/reflect/root-relatedness.js.map +1 -0
- package/dist/middleware/reflect/schema-heal.d.ts +22 -0
- package/dist/middleware/reflect/schema-heal.d.ts.map +1 -0
- package/dist/middleware/reflect/schema-heal.js +119 -0
- package/dist/middleware/reflect/schema-heal.js.map +1 -0
- package/dist/middleware/reflect/schema-validator.d.ts +85 -0
- package/dist/middleware/reflect/schema-validator.d.ts.map +1 -0
- package/dist/middleware/reflect/schema-validator.js +196 -0
- package/dist/middleware/reflect/schema-validator.js.map +1 -0
- package/dist/middleware/reflect/stage-audit-graph.d.ts +115 -0
- package/dist/middleware/reflect/stage-audit-graph.d.ts.map +1 -0
- package/dist/middleware/reflect/stage-audit-graph.js +563 -0
- package/dist/middleware/reflect/stage-audit-graph.js.map +1 -0
- package/dist/middleware/reflect/stage-d-resolve-graph.d.ts +87 -0
- package/dist/middleware/reflect/stage-d-resolve-graph.d.ts.map +1 -0
- package/dist/middleware/reflect/stage-d-resolve-graph.js +256 -0
- package/dist/middleware/reflect/stage-d-resolve-graph.js.map +1 -0
- package/dist/middleware/reflect/synthesizeFromSceneCard.d.ts +15 -0
- package/dist/middleware/reflect/synthesizeFromSceneCard.d.ts.map +1 -0
- package/dist/middleware/reflect/synthesizeFromSceneCard.js +91 -0
- package/dist/middleware/reflect/synthesizeFromSceneCard.js.map +1 -0
- package/dist/middleware/reflect/types.d.ts +261 -0
- package/dist/middleware/reflect/types.d.ts.map +1 -0
- package/dist/middleware/reflect/types.js +3 -0
- package/dist/middleware/reflect/types.js.map +1 -0
- package/dist/middleware/reflect/v2-integrate.d.ts +120 -0
- package/dist/middleware/reflect/v2-integrate.d.ts.map +1 -0
- package/dist/middleware/reflect/v2-integrate.js +388 -0
- package/dist/middleware/reflect/v2-integrate.js.map +1 -0
- package/dist/middleware/reflect/v2-judge.d.ts +44 -0
- package/dist/middleware/reflect/v2-judge.d.ts.map +1 -0
- package/dist/middleware/reflect/v2-judge.js +191 -0
- package/dist/middleware/reflect/v2-judge.js.map +1 -0
- package/dist/relation-sets.d.ts +2 -0
- package/dist/relation-sets.d.ts.map +1 -0
- package/dist/relation-sets.js +35 -0
- package/dist/relation-sets.js.map +1 -0
- package/dist/routes/__tests__/flags.test.d.ts +2 -0
- package/dist/routes/__tests__/flags.test.d.ts.map +1 -0
- package/dist/routes/__tests__/flags.test.js +257 -0
- package/dist/routes/__tests__/flags.test.js.map +1 -0
- package/dist/routes/__tests__/models-catalog.test.d.ts +2 -0
- package/dist/routes/__tests__/models-catalog.test.d.ts.map +1 -0
- package/dist/routes/__tests__/models-catalog.test.js +130 -0
- package/dist/routes/__tests__/models-catalog.test.js.map +1 -0
- package/dist/routes/__tests__/reflect-pause-drain.test.d.ts +2 -0
- package/dist/routes/__tests__/reflect-pause-drain.test.d.ts.map +1 -0
- package/dist/routes/__tests__/reflect-pause-drain.test.js +38 -0
- package/dist/routes/__tests__/reflect-pause-drain.test.js.map +1 -0
- package/dist/routes/__tests__/spend-pause-drain.test.d.ts +2 -0
- package/dist/routes/__tests__/spend-pause-drain.test.d.ts.map +1 -0
- package/dist/routes/__tests__/spend-pause-drain.test.js +38 -0
- package/dist/routes/__tests__/spend-pause-drain.test.js.map +1 -0
- package/dist/routes/admin.d.ts +49 -0
- package/dist/routes/admin.d.ts.map +1 -0
- package/dist/routes/admin.js +471 -0
- package/dist/routes/admin.js.map +1 -0
- package/dist/routes/blocks.d.ts +4 -0
- package/dist/routes/blocks.d.ts.map +1 -0
- package/dist/routes/blocks.js +893 -0
- package/dist/routes/blocks.js.map +1 -0
- package/dist/routes/chat-proxy.d.ts +5 -0
- package/dist/routes/chat-proxy.d.ts.map +1 -0
- package/dist/routes/chat-proxy.js +225 -0
- package/dist/routes/chat-proxy.js.map +1 -0
- package/dist/routes/conversations.d.ts +4 -0
- package/dist/routes/conversations.d.ts.map +1 -0
- package/dist/routes/conversations.js +139 -0
- package/dist/routes/conversations.js.map +1 -0
- package/dist/routes/flags.d.ts +4 -0
- package/dist/routes/flags.d.ts.map +1 -0
- package/dist/routes/flags.js +151 -0
- package/dist/routes/flags.js.map +1 -0
- package/dist/routes/inject.d.ts +4 -0
- package/dist/routes/inject.d.ts.map +1 -0
- package/dist/routes/inject.js +183 -0
- package/dist/routes/inject.js.map +1 -0
- package/dist/routes/mcp-http.d.ts +5 -0
- package/dist/routes/mcp-http.d.ts.map +1 -0
- package/dist/routes/mcp-http.js +94 -0
- package/dist/routes/mcp-http.js.map +1 -0
- package/dist/routes/quarantine.d.ts +4 -0
- package/dist/routes/quarantine.d.ts.map +1 -0
- package/dist/routes/quarantine.js +66 -0
- package/dist/routes/quarantine.js.map +1 -0
- package/dist/routes/recall.d.ts +5 -0
- package/dist/routes/recall.d.ts.map +1 -0
- package/dist/routes/recall.js +573 -0
- package/dist/routes/recall.js.map +1 -0
- package/dist/routes/reflect.d.ts +5 -0
- package/dist/routes/reflect.d.ts.map +1 -0
- package/dist/routes/reflect.js +231 -0
- package/dist/routes/reflect.js.map +1 -0
- package/dist/routes/session.d.ts +4 -0
- package/dist/routes/session.d.ts.map +1 -0
- package/dist/routes/session.js +418 -0
- package/dist/routes/session.js.map +1 -0
- package/dist/routes/state.d.ts +116 -0
- package/dist/routes/state.d.ts.map +1 -0
- package/dist/routes/state.js +621 -0
- package/dist/routes/state.js.map +1 -0
- package/dist/routes/usage.d.ts +3 -0
- package/dist/routes/usage.d.ts.map +1 -0
- package/dist/routes/usage.js +141 -0
- package/dist/routes/usage.js.map +1 -0
- package/dist/routes/workspace.d.ts +5 -0
- package/dist/routes/workspace.d.ts.map +1 -0
- package/dist/routes/workspace.js +435 -0
- package/dist/routes/workspace.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +298 -0
- package/dist/server.js.map +1 -0
- package/dist/store/__tests__/backup.test.d.ts +2 -0
- package/dist/store/__tests__/backup.test.d.ts.map +1 -0
- package/dist/store/__tests__/backup.test.js +53 -0
- package/dist/store/__tests__/backup.test.js.map +1 -0
- package/dist/store/__tests__/quality.test.d.ts +2 -0
- package/dist/store/__tests__/quality.test.d.ts.map +1 -0
- package/dist/store/__tests__/quality.test.js +75 -0
- package/dist/store/__tests__/quality.test.js.map +1 -0
- package/dist/store/backup.d.ts +14 -0
- package/dist/store/backup.d.ts.map +1 -0
- package/dist/store/backup.js +95 -0
- package/dist/store/backup.js.map +1 -0
- package/dist/store/database.d.ts +407 -0
- package/dist/store/database.d.ts.map +1 -0
- package/dist/store/database.js +2004 -0
- package/dist/store/database.js.map +1 -0
- package/dist/store/quality.d.ts +25 -0
- package/dist/store/quality.d.ts.map +1 -0
- package/dist/store/quality.js +48 -0
- package/dist/store/quality.js.map +1 -0
- package/dist/tools/__tests__/assemble-block-chains.test.d.ts +2 -0
- package/dist/tools/__tests__/assemble-block-chains.test.d.ts.map +1 -0
- package/dist/tools/__tests__/assemble-block-chains.test.js +118 -0
- package/dist/tools/__tests__/assemble-block-chains.test.js.map +1 -0
- package/dist/tools/__tests__/filter-roots-by-concepts.test.d.ts +2 -0
- package/dist/tools/__tests__/filter-roots-by-concepts.test.d.ts.map +1 -0
- package/dist/tools/__tests__/filter-roots-by-concepts.test.js +68 -0
- package/dist/tools/__tests__/filter-roots-by-concepts.test.js.map +1 -0
- package/dist/tools/__tests__/flag-surface.test.d.ts +2 -0
- package/dist/tools/__tests__/flag-surface.test.d.ts.map +1 -0
- package/dist/tools/__tests__/flag-surface.test.js +130 -0
- package/dist/tools/__tests__/flag-surface.test.js.map +1 -0
- package/dist/tools/core.d.ts +5 -0
- package/dist/tools/core.d.ts.map +1 -0
- package/dist/tools/core.js +962 -0
- package/dist/tools/core.js.map +1 -0
- package/dist/tools/derive.d.ts +5 -0
- package/dist/tools/derive.d.ts.map +1 -0
- package/dist/tools/derive.js +182 -0
- package/dist/tools/derive.js.map +1 -0
- package/dist/tools/flag-surface.d.ts +26 -0
- package/dist/tools/flag-surface.d.ts.map +1 -0
- package/dist/tools/flag-surface.js +59 -0
- package/dist/tools/flag-surface.js.map +1 -0
- package/dist/tools/helpers.d.ts +99 -0
- package/dist/tools/helpers.d.ts.map +1 -0
- package/dist/tools/helpers.js +243 -0
- package/dist/tools/helpers.js.map +1 -0
- package/dist/tools/projects.d.ts +5 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +175 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/system.d.ts +5 -0
- package/dist/tools/system.d.ts.map +1 -0
- package/dist/tools/system.js +1361 -0
- package/dist/tools/system.js.map +1 -0
- package/dist/tools/tasks.d.ts +5 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +289 -0
- package/dist/tools/tasks.js.map +1 -0
- package/package.json +69 -0
- package/scripts/nodedex-entry.mjs +396 -0
- package/tui-dist/App.js +185 -0
- package/tui-dist/api.js +197 -0
- package/tui-dist/cli.js +53 -0
- package/tui-dist/components.js +63 -0
- package/tui-dist/config.js +242 -0
- package/tui-dist/connect-snippets.js +98 -0
- package/tui-dist/feed.js +51 -0
- package/tui-dist/health.js +465 -0
- package/tui-dist/hooks.js +23 -0
- package/tui-dist/memory.js +220 -0
- package/tui-dist/onboarding.js +498 -0
- package/tui-dist/review.js +193 -0
- package/tui-dist/servers.js +556 -0
- package/tui-dist/smoke.js +15 -0
- 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
|
+
}
|