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