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,129 @@
|
|
|
1
|
+
// nodedex-capture-core.mjs — shared, host-agnostic capture core.
|
|
2
|
+
//
|
|
3
|
+
// WHY THIS EXISTS
|
|
4
|
+
// Every host adapter (a Claude Code hook, the Hermes hook, the tee, the next host…) needs
|
|
5
|
+
// the SAME two things, and only the same two things:
|
|
6
|
+
// 1. find the live Nodedex server — its url + token — WITHOUT the user hardcoding a port,
|
|
7
|
+
// 2. POST a finished turn to /api/reflect/trigger, fire-and-forget, never breaking the agent.
|
|
8
|
+
// That's this file. A host adapter is then a thin SHIM that knows how ITS host hands over a
|
|
9
|
+
// turn, parses that, and calls captureTurn() (or resolveNodedexTarget + buildTriggerBody +
|
|
10
|
+
// postTrigger). Building one host gives every future host this core for free.
|
|
11
|
+
//
|
|
12
|
+
// SELF-LOCATING (the reason the adapter never contains a port)
|
|
13
|
+
// The server's port can change — switch DB in the TUI and it relaunches on a new port. So we
|
|
14
|
+
// read the LIVE port + token from ~/.nodedex/tui-session.json, which the TUI rewrites on every
|
|
15
|
+
// launch / stop / DB-switch. The adapter follows the running server automatically; the user
|
|
16
|
+
// never types or re-edits a port. An explicit NODEDEX_CAPTURE_URL / NODEDEX_CAPTURE_TOKEN
|
|
17
|
+
// override wins when you want to pin a specific server (e.g. several running at once).
|
|
18
|
+
//
|
|
19
|
+
// Dependency-free: runs on Node 18+ (global fetch), Bun, or Deno.
|
|
20
|
+
|
|
21
|
+
import { readFileSync } from "node:fs";
|
|
22
|
+
import { homedir } from "node:os";
|
|
23
|
+
import { join } from "node:path";
|
|
24
|
+
|
|
25
|
+
const TRIGGER_MIN_CHARS = 10; // mirror the server's combined-content floor (/api/reflect/trigger)
|
|
26
|
+
const CAPS = { response: 16000, reasoning: 8000, user: 2000 };
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the live Nodedex server to capture into → { url, token } or null.
|
|
30
|
+
* Order: explicit env override → the FOCUSED server in tui-session.json → first managed server.
|
|
31
|
+
* Returns null (caller skips silently) when no server is known.
|
|
32
|
+
*/
|
|
33
|
+
export function resolveNodedexTarget() {
|
|
34
|
+
// 1. Explicit override — pin a specific server.
|
|
35
|
+
const envUrl = process.env.NODEDEX_CAPTURE_URL;
|
|
36
|
+
if (envUrl && envUrl.trim()) {
|
|
37
|
+
return {
|
|
38
|
+
url: envUrl.trim().replace(/\/+$/, ""),
|
|
39
|
+
token: process.env.NODEDEX_CAPTURE_TOKEN || process.env.NODEDEX_TOKEN || "",
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 2. Read the TUI's own record of running servers.
|
|
44
|
+
let session;
|
|
45
|
+
try {
|
|
46
|
+
session = JSON.parse(readFileSync(join(homedir(), ".nodedex", "tui-session.json"), "utf8"));
|
|
47
|
+
} catch {
|
|
48
|
+
return null; // no session file → no server known
|
|
49
|
+
}
|
|
50
|
+
const managed = Array.isArray(session?.managed) ? session.managed : [];
|
|
51
|
+
if (managed.length === 0) return null;
|
|
52
|
+
|
|
53
|
+
// Prefer the server the user is FOCUSED on (matched to its managed entry for the token).
|
|
54
|
+
let entry = null;
|
|
55
|
+
const focusedUrl = session?.connected?.url;
|
|
56
|
+
if (focusedUrl) {
|
|
57
|
+
let port = null;
|
|
58
|
+
try { port = Number(new URL(focusedUrl).port) || null; } catch { /* not a url → ignore */ }
|
|
59
|
+
if (port != null) entry = managed.find((m) => Number(m?.port) === port) || null;
|
|
60
|
+
}
|
|
61
|
+
if (!entry) entry = managed[0]; // fallback: first managed server
|
|
62
|
+
|
|
63
|
+
if (!entry?.port) return null;
|
|
64
|
+
// The adapter runs on the HOST (where the agent host / Hermes gateway lives), so the server
|
|
65
|
+
// is on loopback — 127.0.0.1 (not `localhost`, which can resolve to IPv6 ::1 on Windows; and
|
|
66
|
+
// not host.docker.internal, which is only for code running INSIDE a container).
|
|
67
|
+
return { url: `http://127.0.0.1:${entry.port}`, token: entry.token || "" };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Build the /api/reflect/trigger body for one turn. PURE + testable.
|
|
72
|
+
* Returns null when there's nothing worth sending (no response, or under 50 chars).
|
|
73
|
+
* turn = { agentResponse, userMessage?, reasoning?, agentId?, turnName?, hint? }
|
|
74
|
+
*/
|
|
75
|
+
export function buildTriggerBody(turn) {
|
|
76
|
+
const response = String(turn?.agentResponse ?? "").slice(0, CAPS.response);
|
|
77
|
+
const reasoning = String(turn?.reasoning ?? "").slice(0, CAPS.reasoning);
|
|
78
|
+
const user = String(turn?.userMessage ?? "").slice(0, CAPS.user);
|
|
79
|
+
// Need SOME answer, but floor on COMBINED content — a short answer can ride a rich trace.
|
|
80
|
+
if (!response.trim()) return null;
|
|
81
|
+
if ((response + reasoning + user).trim().length < TRIGGER_MIN_CHARS) return null;
|
|
82
|
+
const body = {
|
|
83
|
+
agent_response: response,
|
|
84
|
+
user_message: user,
|
|
85
|
+
agent_thinking: reasoning,
|
|
86
|
+
agent_id: turn?.agentId || "agent",
|
|
87
|
+
turn_name: turn?.turnName || "turn",
|
|
88
|
+
hint: turn?.hint || "discovery",
|
|
89
|
+
loaded_block_ids: [],
|
|
90
|
+
};
|
|
91
|
+
// turn_number enables ARC mode: the server stores this turn in conversation_turns keyed by
|
|
92
|
+
// (agent_id, turn_number) and later assembles the range. Only sent when the adapter supplies a
|
|
93
|
+
// monotonic ordinal; adapters that don't (per-turn-only capture) simply omit it → atomic mode.
|
|
94
|
+
if (Number.isInteger(turn?.turnNumber)) body.turn_number = turn.turnNumber;
|
|
95
|
+
return body;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** POST a body to a resolved target's /api/reflect/trigger. Never throws → true on success. */
|
|
99
|
+
export async function postTrigger(target, body, timeoutMs = 5000) {
|
|
100
|
+
if (!target?.url || !body) return false;
|
|
101
|
+
try {
|
|
102
|
+
const res = await fetch(`${target.url}/api/reflect/trigger`, {
|
|
103
|
+
method: "POST",
|
|
104
|
+
headers: { "Content-Type": "application/json", ...(target.token ? { "x-nodedex-token": target.token } : {}) },
|
|
105
|
+
body: JSON.stringify(body),
|
|
106
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
107
|
+
});
|
|
108
|
+
return res.ok;
|
|
109
|
+
} catch {
|
|
110
|
+
return false; // server down / unreachable → capture is best-effort
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Convenience: build → resolve → post. Returns a short status string (for logging only):
|
|
116
|
+
* "captured" | "skipped:short" | "skipped:no-server" | "failed:post"
|
|
117
|
+
* Never throws — capture must never affect the agent's turn.
|
|
118
|
+
*/
|
|
119
|
+
export async function captureTurn(turn) {
|
|
120
|
+
try {
|
|
121
|
+
const body = buildTriggerBody(turn);
|
|
122
|
+
if (!body) return "skipped:short";
|
|
123
|
+
const target = resolveNodedexTarget();
|
|
124
|
+
if (!target) return "skipped:no-server";
|
|
125
|
+
return (await postTrigger(target, body)) ? "captured" : "failed:post";
|
|
126
|
+
} catch {
|
|
127
|
+
return "failed:post";
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// nodedex-capture.mjs — non-intrusive TEE capture adapter.
|
|
2
|
+
//
|
|
3
|
+
// JOB
|
|
4
|
+
// Send a COPY of each finished agent turn to the Nodedex pipeline so it can extract
|
|
5
|
+
// decisions / dead-ends / chains. The MCP server is PASSIVE — it only sees tool-call
|
|
6
|
+
// args + its own responses, never the agent's natural-language output. So capture
|
|
7
|
+
// can't be done BY the server; it must be PUSHED by the host. This is that push.
|
|
8
|
+
//
|
|
9
|
+
// THE RULE THAT MAKES IT SAFE
|
|
10
|
+
// OUT-of-path and fire-and-forget — the agent's OWN llm call is NEVER touched, never
|
|
11
|
+
// slowed, never broken. You call this AFTER a turn completes and ignore the result.
|
|
12
|
+
// The server already does debounce / dedup / pause-gating / async extraction
|
|
13
|
+
// (POST /api/reflect/trigger), so this client stays dumb: build payload, POST, swallow.
|
|
14
|
+
//
|
|
15
|
+
// UNIVERSAL
|
|
16
|
+
// Dependency-free; runs on Node / Bun / Deno. Probes every known reasoning shape
|
|
17
|
+
// (OpenAI / OpenRouter / Anthropic) so it captures chain-of-thought when present.
|
|
18
|
+
//
|
|
19
|
+
// CONFIGURABLE — choose which fields to capture (env, or a per-call `capture` override):
|
|
20
|
+
// NODEDEX_CAPTURE_RESPONSE (default on) the agent's emitted answer — the SUBSTRATE.
|
|
21
|
+
// off ⇒ nothing is sent (the pipeline needs it).
|
|
22
|
+
// NODEDEX_CAPTURE_USER (default on) the user's message.
|
|
23
|
+
// NODEDEX_CAPTURE_REASONING (default on) the agent's reasoning / thinking, if available.
|
|
24
|
+
// NODEDEX_URL (default http://localhost:3001) where the server lives.
|
|
25
|
+
// NODEDEX_CAPTURE_BUFFER (default off) on ⇒ buffer to ~/.nodedex/capture-buffer.jsonl
|
|
26
|
+
// when the server is down, flush on next success.
|
|
27
|
+
|
|
28
|
+
const env = (typeof process !== "undefined" && process.env) ? process.env : {};
|
|
29
|
+
|
|
30
|
+
const CAPS = { response: 16000, reasoning: 8000, user: 2000 };
|
|
31
|
+
export const DEFAULT_CAPTURE = { response: true, user: true, reasoning: true };
|
|
32
|
+
|
|
33
|
+
function flag(name, dflt) {
|
|
34
|
+
const v = env[name];
|
|
35
|
+
if (v == null || v === "") return dflt;
|
|
36
|
+
return !/^(0|off|false|no)$/i.test(String(v).trim());
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Resolve the capture config: per-call override wins over env, env over default. */
|
|
40
|
+
export function resolveCaptureConfig(override) {
|
|
41
|
+
return {
|
|
42
|
+
response: override?.response ?? flag("NODEDEX_CAPTURE_RESPONSE", DEFAULT_CAPTURE.response),
|
|
43
|
+
user: override?.user ?? flag("NODEDEX_CAPTURE_USER", DEFAULT_CAPTURE.user),
|
|
44
|
+
reasoning: override?.reasoning ?? flag("NODEDEX_CAPTURE_REASONING", DEFAULT_CAPTURE.reasoning),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Probe every known provider shape for chain-of-thought. "" if none present. */
|
|
49
|
+
export function extractReasoning(message) {
|
|
50
|
+
if (!message || typeof message !== "object") return "";
|
|
51
|
+
let r = "";
|
|
52
|
+
for (const f of ["reasoning", "reasoning_content"]) // OpenAI / OpenRouter / DeepSeek
|
|
53
|
+
if (typeof message[f] === "string") r += message[f];
|
|
54
|
+
if (Array.isArray(message.reasoning_details)) // OpenRouter detailed
|
|
55
|
+
for (const d of message.reasoning_details) if (d && typeof d.text === "string") r += d.text;
|
|
56
|
+
if (Array.isArray(message.content)) // Anthropic-style thinking parts
|
|
57
|
+
for (const p of message.content) if (p && p.type === "thinking" && p.thinking) r += p.thinking + "\n";
|
|
58
|
+
return r.trim();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function slug(s) {
|
|
62
|
+
return String(s || "").split(/\s+/).slice(0, 5).join("-").toLowerCase()
|
|
63
|
+
.replace(/[^a-z0-9-]/g, "").slice(0, 60) || "turn";
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Build the /api/reflect/trigger payload for one turn under a capture config.
|
|
68
|
+
* PURE + testable. Returns null when nothing is capturable: response disabled, or the
|
|
69
|
+
* answer is under 50 chars (the server rejects those anyway).
|
|
70
|
+
*
|
|
71
|
+
* turn = { userMessage, agentResponse, reasoning?, agentId?, turnNumber?, turnName?,
|
|
72
|
+
* loadedBlockIds?, hint? }
|
|
73
|
+
*/
|
|
74
|
+
export function buildCapturePayload(turn, override) {
|
|
75
|
+
const cfg = resolveCaptureConfig(override);
|
|
76
|
+
if (!cfg.response) return null; // substrate disabled ⇒ skip
|
|
77
|
+
const response = String(turn?.agentResponse ?? "").slice(0, CAPS.response);
|
|
78
|
+
if (response.trim().length < 50) return null; // server 400s on <50
|
|
79
|
+
return {
|
|
80
|
+
agent_response: response,
|
|
81
|
+
user_message: cfg.user ? String(turn?.userMessage ?? "").slice(0, CAPS.user) : "",
|
|
82
|
+
agent_thinking: cfg.reasoning ? String(turn?.reasoning ?? "").slice(0, CAPS.reasoning) : "",
|
|
83
|
+
agent_id: turn?.agentId,
|
|
84
|
+
turn_number: typeof turn?.turnNumber === "number" ? turn.turnNumber : undefined,
|
|
85
|
+
// Don't leak the user message into the name when user-capture is off.
|
|
86
|
+
turn_name: turn?.turnName || (cfg.user ? slug(turn?.userMessage) : "turn"),
|
|
87
|
+
loaded_block_ids: Array.isArray(turn?.loadedBlockIds) ? turn.loadedBlockIds : [],
|
|
88
|
+
hint: turn?.hint || "discovery",
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function baseUrl(url) {
|
|
93
|
+
return String(url || env.NODEDEX_URL || "http://localhost:3001").replace(/\/+$/, "");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Resolve the local buffer handle — only when buffering is enabled AND fs is reachable. */
|
|
97
|
+
async function bufferHandle() {
|
|
98
|
+
if (!flag("NODEDEX_CAPTURE_BUFFER", false)) return null;
|
|
99
|
+
try {
|
|
100
|
+
const [{ default: fs }, { default: os }, { default: path }] = await Promise.all([
|
|
101
|
+
import("node:fs"), import("node:os"), import("node:path"),
|
|
102
|
+
]);
|
|
103
|
+
const dir = path.join(os.homedir(), ".nodedex");
|
|
104
|
+
return { fs, dir, file: path.join(dir, "capture-buffer.jsonl") };
|
|
105
|
+
} catch { return null; } // non-node runtime → no buffering
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Auth header for a token-gated server (NODEDEX_BIND_HOST=0.0.0.0 + NODEDEX_API_TOKEN).
|
|
109
|
+
* /api/reflect/trigger is gated, so set NODEDEX_TOKEN where the adapter runs or captures
|
|
110
|
+
* get 401'd. Empty when the server is open (localhost / no token). */
|
|
111
|
+
function authHeaders() {
|
|
112
|
+
const t = env.NODEDEX_TOKEN || env.NODEDEX_API_TOKEN || "";
|
|
113
|
+
return t ? { "x-nodedex-token": t } : {};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async function post(url, payload) {
|
|
117
|
+
const res = await fetch(`${url}/api/reflect/trigger`, {
|
|
118
|
+
method: "POST",
|
|
119
|
+
headers: { "Content-Type": "application/json", ...authHeaders() },
|
|
120
|
+
body: JSON.stringify(payload),
|
|
121
|
+
signal: AbortSignal.timeout(4000),
|
|
122
|
+
});
|
|
123
|
+
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Opportunistically drain any payloads buffered by prior failures. No-op if buffering off. */
|
|
127
|
+
export async function flushCaptureBuffer(url) {
|
|
128
|
+
const b = await bufferHandle();
|
|
129
|
+
if (!b || !b.fs.existsSync(b.file)) return;
|
|
130
|
+
let lines;
|
|
131
|
+
try { lines = b.fs.readFileSync(b.file, "utf8").trim().split("\n").filter(Boolean); } catch { return; }
|
|
132
|
+
const u = baseUrl(url);
|
|
133
|
+
let sent = 0;
|
|
134
|
+
for (; sent < lines.length; sent++) {
|
|
135
|
+
try { await post(u, JSON.parse(lines[sent])); } catch { break; } // server still down → stop
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
if (sent >= lines.length) b.fs.unlinkSync(b.file);
|
|
139
|
+
else b.fs.writeFileSync(b.file, lines.slice(sent).join("\n") + "\n");
|
|
140
|
+
} catch { /* best-effort */ }
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async function bufferOnFail(payload) {
|
|
144
|
+
const b = await bufferHandle();
|
|
145
|
+
if (!b) return;
|
|
146
|
+
try {
|
|
147
|
+
b.fs.mkdirSync(b.dir, { recursive: true });
|
|
148
|
+
b.fs.appendFileSync(b.file, JSON.stringify({ ...payload, _buffered_at: Date.now() }) + "\n");
|
|
149
|
+
} catch { /* best-effort */ }
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Tee one finished turn into the pipeline. Returns immediately (fire-and-forget),
|
|
154
|
+
* never throws, never blocks the agent. Call AFTER your turn completes.
|
|
155
|
+
*
|
|
156
|
+
* options = { url?, capture?: { response?, user?, reasoning? } }
|
|
157
|
+
*/
|
|
158
|
+
export function nodedexCapture(turn, options = {}) {
|
|
159
|
+
const payload = buildCapturePayload(turn, options.capture);
|
|
160
|
+
if (!payload) return; // nothing capturable this turn
|
|
161
|
+
const url = baseUrl(options.url);
|
|
162
|
+
// Out-of-path: drain prior failures, send, buffer-on-fail — all detached from the turn.
|
|
163
|
+
(async () => {
|
|
164
|
+
await flushCaptureBuffer(url);
|
|
165
|
+
try { await post(url, payload); } catch { await bufferOnFail(payload); }
|
|
166
|
+
})().catch(() => { /* capture must NEVER affect the agent's call */ });
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export default nodedexCapture;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const AGENT_PROTOCOL = "Nodedex is your persistent memory \u2014 a graph of what was decided, tried, ABANDONED, and constrained across sessions. You did NOT write it \u2014 a background pipeline extracts it from your conversation, so DON'T call save/write tools in normal work (they're for fixing graph errors only). READ before you act.\n\nREACH THE GRAPH ONLY THROUGH THESE TOOLS. Don't go hunting the filesystem or shell \u2014 never read Nodedex's database, log, or config files directly, and don't run raw SQL: you'd get rows stripped of the chains that carry the meaning, and you'd miss the dedup/heal the tools apply. NAVIGATE (traverse), don't blindly query. Touch the underlying DB/files ONLY if you genuinely need something no tool can reach \u2014 that's the rare exception, not the default.\n\nTWO REFLEXES \u2014 do these unprompted:\n1. BEFORE proposing ANY approach, check what already failed \u2014 suggesting something abandoned, or that breaks a constraint, is the worst outcome. \u2192 workspace_filter the approach's concepts (or workspace_get a dead_end label); read the dead_ends + constraints FIRST.\n2. When you need context, TRAVERSE \u2014 don't keyword-search. A block is a headline; the causal CHAIN it sits on is the story. Anchor on a block, then walk.\n\nTHE LOOP (traversal-first):\n- New task, no anchor? \u2192 workspace_filter(concepts) \u2014 first-principle terms of your task (technologies, mechanisms, failure-modes; NOT \"fix\"/\"issue\"). Returns relevant project ROOTS + entry blocks.\n- Know it exists but not the label? \u2192 workspace_search (fuzzy \u2014 the FALLBACK; isolated matches).\n- Know exactly what you want? \u2192 CONSTRUCT the label and get it directly: {project}_{entity}_{type}_{concept} ('_' between dimensions, '-' within a concept, entity optional).\n- Have a block? \u2192 workspace_get(label, detail=\"relations\") \u2014 returns the block PLUS the chain(s) it sits on AND the chains they lead to / rest on (the connected story). That is the unit of meaning; read it, open the next block, keep walking.\n\ndetail: surface (scan) \u2192 relations (block + its chain \u2014 the traversal default) \u2192 full. Graph knowledge is established; your own conclusions are hypotheses until the graph agrees.";
|
|
2
|
+
export declare const NODEDEX_BEGIN = "<!-- nodedex:protocol:begin -->";
|
|
3
|
+
export declare const NODEDEX_END = "<!-- nodedex:protocol:end -->";
|
|
4
|
+
/** The protocol as a marked, removable block for the agent to persist into its own
|
|
5
|
+
* standing config — only ever with explicit user permission (workspace_onboard). */
|
|
6
|
+
export declare function protocolBlock(): string;
|
|
7
|
+
//# sourceMappingURL=agent-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-protocol.d.ts","sourceRoot":"","sources":["../src/agent-protocol.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,cAAc,usEAcwJ,CAAC;AAIpL,eAAO,MAAM,aAAa,oCAAoC,CAAC;AAC/D,eAAO,MAAM,WAAW,kCAAkC,CAAC;AAE3D;qFACqF;AACrF,wBAAgB,aAAa,IAAI,MAAM,CAMtC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// agent-protocol.ts — the ONE source of truth for what an agent must know to use
|
|
2
|
+
// Nodedex well. Consumed by BOTH:
|
|
3
|
+
// • the MCP `instructions` field (server.ts) — the advisory FLOOR, every host,
|
|
4
|
+
// re-sent each connect, may or may not be surfaced.
|
|
5
|
+
// • workspace_onboard (tools/system.ts) — the persistent UPGRADE: on a capable
|
|
6
|
+
// host the agent writes this into its OWN standing config (CLAUDE.md / rules
|
|
7
|
+
// file) so the reflexes survive and are reliably followed.
|
|
8
|
+
// We can't reprogram the agent (we're a tool), so this is how the reflexes reach it.
|
|
9
|
+
// Keep it tight — it costs context tokens on every connect.
|
|
10
|
+
export const AGENT_PROTOCOL = `Nodedex is your persistent memory — a graph of what was decided, tried, ABANDONED, and constrained across sessions. You did NOT write it — a background pipeline extracts it from your conversation, so DON'T call save/write tools in normal work (they're for fixing graph errors only). READ before you act.
|
|
11
|
+
|
|
12
|
+
REACH THE GRAPH ONLY THROUGH THESE TOOLS. Don't go hunting the filesystem or shell — never read Nodedex's database, log, or config files directly, and don't run raw SQL: you'd get rows stripped of the chains that carry the meaning, and you'd miss the dedup/heal the tools apply. NAVIGATE (traverse), don't blindly query. Touch the underlying DB/files ONLY if you genuinely need something no tool can reach — that's the rare exception, not the default.
|
|
13
|
+
|
|
14
|
+
TWO REFLEXES — do these unprompted:
|
|
15
|
+
1. BEFORE proposing ANY approach, check what already failed — suggesting something abandoned, or that breaks a constraint, is the worst outcome. → workspace_filter the approach's concepts (or workspace_get a dead_end label); read the dead_ends + constraints FIRST.
|
|
16
|
+
2. When you need context, TRAVERSE — don't keyword-search. A block is a headline; the causal CHAIN it sits on is the story. Anchor on a block, then walk.
|
|
17
|
+
|
|
18
|
+
THE LOOP (traversal-first):
|
|
19
|
+
- New task, no anchor? → workspace_filter(concepts) — first-principle terms of your task (technologies, mechanisms, failure-modes; NOT "fix"/"issue"). Returns relevant project ROOTS + entry blocks.
|
|
20
|
+
- Know it exists but not the label? → workspace_search (fuzzy — the FALLBACK; isolated matches).
|
|
21
|
+
- Know exactly what you want? → CONSTRUCT the label and get it directly: {project}_{entity}_{type}_{concept} ('_' between dimensions, '-' within a concept, entity optional).
|
|
22
|
+
- Have a block? → workspace_get(label, detail="relations") — returns the block PLUS the chain(s) it sits on AND the chains they lead to / rest on (the connected story). That is the unit of meaning; read it, open the next block, keep walking.
|
|
23
|
+
|
|
24
|
+
detail: surface (scan) → relations (block + its chain — the traversal default) → full. Graph knowledge is established; your own conclusions are hypotheses until the graph agrees.`;
|
|
25
|
+
// Markers wrap the persisted block so a re-run can REPLACE it in place (never
|
|
26
|
+
// duplicate) and the user can remove it in one move.
|
|
27
|
+
export const NODEDEX_BEGIN = "<!-- nodedex:protocol:begin -->";
|
|
28
|
+
export const NODEDEX_END = "<!-- nodedex:protocol:end -->";
|
|
29
|
+
/** The protocol as a marked, removable block for the agent to persist into its own
|
|
30
|
+
* standing config — only ever with explicit user permission (workspace_onboard). */
|
|
31
|
+
export function protocolBlock() {
|
|
32
|
+
return `${NODEDEX_BEGIN}
|
|
33
|
+
# Nodedex memory protocol — added with your permission. Delete this whole block to opt out.
|
|
34
|
+
|
|
35
|
+
${AGENT_PROTOCOL}
|
|
36
|
+
${NODEDEX_END}`;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=agent-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-protocol.js","sourceRoot":"","sources":["../src/agent-protocol.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,kCAAkC;AAClC,iFAAiF;AACjF,wDAAwD;AACxD,iFAAiF;AACjF,iFAAiF;AACjF,+DAA+D;AAC/D,qFAAqF;AACrF,4DAA4D;AAE5D,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;mLAcqJ,CAAC;AAEpL,8EAA8E;AAC9E,qDAAqD;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,iCAAiC,CAAC;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,+BAA+B,CAAC;AAE3D;qFACqF;AACrF,MAAM,UAAU,aAAa;IAC3B,OAAO,GAAG,aAAa;;;EAGvB,cAAc;EACd,WAAW,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { WorkspaceDB } from "./store/database.js";
|
|
2
|
+
import { EmbeddingEngine } from "./engine/embeddings.js";
|
|
3
|
+
import type { SchedulerJobStatus } from "./server.js";
|
|
4
|
+
export declare function startApiServer(db: WorkspaceDB, schedulerHealth?: Record<string, SchedulerJobStatus>, port?: number, embeddings?: EmbeddingEngine): import("http").Server;
|
|
5
|
+
//# sourceMappingURL=api-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-server.d.ts","sourceRoot":"","sources":["../src/api-server.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AA8BtD,wBAAgB,cAAc,CAC5B,EAAE,EAAE,WAAW,EACf,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,EACpD,IAAI,SAAO,EACX,UAAU,CAAC,EAAE,eAAe,GAC3B,OAAO,MAAM,EAAE,MAAM,CAiUvB"}
|