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,315 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
// PASS 4 — SLICE BUILDER (production gap ⑤: scale — replace the full-graph dump)
|
|
3
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// WHAT IT DOES
|
|
6
|
+
// Builds the PROJECT GRAPH context Pass 4 reasons over — but as a RETRIEVED
|
|
7
|
+
// SLICE instead of buildProjectContext's whole-graph dump. Pass 4's job is
|
|
8
|
+
// unchanged (link this-turn's new blocks to existing blocks BY MEANING); this
|
|
9
|
+
// only changes WHAT it sees, never HOW it decides. The slice is RECALL only —
|
|
10
|
+
// it narrows the field to plausible candidates; the link is still Pass 4's
|
|
11
|
+
// meaning judgment, per pair. "In the slice" never implies "link it."
|
|
12
|
+
//
|
|
13
|
+
// HOW IT NARROWS (two paths — mirrors how the AGENT navigates cross-root, and
|
|
14
|
+
// reuses the exact same substrate: deriveRootRelatedness + the chain abstraction):
|
|
15
|
+
//
|
|
16
|
+
// FOLLOW TRUTH (certain, no threshold) — for each new block, pull candidates
|
|
17
|
+
// from its OWN root PLUS every root in its Venn overlap. A cross-root edge is
|
|
18
|
+
// RECORDED truth that two roots are related (deriveRootRelatedness); there is
|
|
19
|
+
// no "related enough" — edge present ⟹ descend. Root-level relatedness does
|
|
20
|
+
// NOT pre-decide any block-level link; it only widens the candidate field.
|
|
21
|
+
//
|
|
22
|
+
// GUESS (fuzzy, first-ever links only) — retrieveGraphSlice's identity/semantic
|
|
23
|
+
// net surfaces candidates in roots with NO overlap yet, where there is no
|
|
24
|
+
// recorded edge to follow. This is the only place similarity enters.
|
|
25
|
+
//
|
|
26
|
+
// HOW IT PRESENTS (coarse → fine — "the chain is the unit of meaning; the block
|
|
27
|
+
// is the entry point", agent.md Rule 2):
|
|
28
|
+
// • CHAINS as units (chain block essence = the arc summary) to let Pass 4 find
|
|
29
|
+
// the right neighbourhood, THEN
|
|
30
|
+
// • the individual MEMBER blocks at full detail so Pass 4 can name the exact
|
|
31
|
+
// link target (relations are block→block; you cannot link to a summary).
|
|
32
|
+
// • loose blocks (chain_id = null) presented individually.
|
|
33
|
+
//
|
|
34
|
+
// Default OFF (NODEDEX_PASS4_SLICE=1). Small graphs fall back to the dump (the
|
|
35
|
+
// caller's buildProjectContext) — slicing only earns its keep at scale.
|
|
36
|
+
import { cosineSim } from "../../engine/vector-math.js";
|
|
37
|
+
import { intFromEnv } from "./config.js";
|
|
38
|
+
import { deriveRootRelatedness } from "./root-relatedness.js";
|
|
39
|
+
import { retrieveGraphSlice } from "./retrieve-graph-slice.js";
|
|
40
|
+
import { extractPrimaryValueFromUnique } from "./dedup-by-source-and-value.js";
|
|
41
|
+
// ─── Config (env-gated; safe defaults) ──────────────────────────────────────────
|
|
42
|
+
/** Default ON (promoted 2026-06-14 — validated; falls back to the full dump under the
|
|
43
|
+
* small-graph threshold). Set NODEDEX_PASS4_SLICE=0 to opt out. */
|
|
44
|
+
export function pass4SliceEnabled() {
|
|
45
|
+
return process.env.NODEDEX_PASS4_SLICE !== "0";
|
|
46
|
+
}
|
|
47
|
+
/** Below this many blocks the dump is fine + cheaper than k retrievals → fall back. */
|
|
48
|
+
export function pass4SliceMinGraph() {
|
|
49
|
+
return intFromEnv("NODEDEX_PASS4_SLICE_MIN_GRAPH", 150);
|
|
50
|
+
}
|
|
51
|
+
// ─── Semantic-delta net (drift recall) — default OFF, sub-feature of the slice ──
|
|
52
|
+
// Surfaces a SMALL, CAPPED, TAGGED set of existing blocks that are MEANING-near a
|
|
53
|
+
// new block but were missed by structure + identity (wording drift). It is a pure
|
|
54
|
+
// RECALL net: NOT weighted into the trusted ranking — appended separately, marked
|
|
55
|
+
// "unconfirmed", and judged by Pass 4. Reads STORED embeddings (no embed call).
|
|
56
|
+
export function semanticDeltaEnabled() {
|
|
57
|
+
return process.env.NODEDEX_PASS4_SEMANTIC_DELTA === "1";
|
|
58
|
+
}
|
|
59
|
+
export function semanticDeltaK() {
|
|
60
|
+
return intFromEnv("NODEDEX_PASS4_SEMANTIC_DELTA_K", 5);
|
|
61
|
+
}
|
|
62
|
+
// Below this cosine, "near" is noise — don't even introduce it to the judge.
|
|
63
|
+
const SEMANTIC_DELTA_FLOOR = 0.5;
|
|
64
|
+
// ─── Pure-ish helpers ────────────────────────────────────────────────────────────
|
|
65
|
+
function parseObject(s) {
|
|
66
|
+
if (s && typeof s === "object")
|
|
67
|
+
return s;
|
|
68
|
+
if (typeof s !== "string" || !s)
|
|
69
|
+
return {};
|
|
70
|
+
try {
|
|
71
|
+
const p = JSON.parse(s);
|
|
72
|
+
return p && typeof p === "object" ? p : {};
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return {};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function parseConcepts(s) {
|
|
79
|
+
if (Array.isArray(s))
|
|
80
|
+
return s.filter((x) => typeof x === "string");
|
|
81
|
+
if (typeof s !== "string" || !s)
|
|
82
|
+
return [];
|
|
83
|
+
try {
|
|
84
|
+
const p = JSON.parse(s);
|
|
85
|
+
return Array.isArray(p) ? p.filter((x) => typeof x === "string") : [];
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** unique{} primary value (identity), via the same extractor RETRIEVE + AUDIT use. */
|
|
92
|
+
function uniquePrimary(block) {
|
|
93
|
+
const content = parseObject(block.content);
|
|
94
|
+
const unique = parseObject(content.unique);
|
|
95
|
+
try {
|
|
96
|
+
return extractPrimaryValueFromUnique(block.type, unique) || "";
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
return "";
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** unique{} fields rendered compactly for a context line (≤4 pairs, mirrors pipeline). */
|
|
103
|
+
function uniqueFieldsStr(block) {
|
|
104
|
+
const content = parseObject(block.content);
|
|
105
|
+
const unique = parseObject(content.unique);
|
|
106
|
+
const pairs = Object.entries(unique)
|
|
107
|
+
.filter(([, v]) => v && String(v).trim())
|
|
108
|
+
.slice(0, 4)
|
|
109
|
+
.map(([k, v]) => `${k}: "${String(v).slice(0, 80)}"`);
|
|
110
|
+
return pairs.length ? ` | unique: { ${pairs.join(", ")} }` : "";
|
|
111
|
+
}
|
|
112
|
+
/** The {project} (owner) segment of a strict label {project}_{type}_{concept}. */
|
|
113
|
+
function labelPrefix(label) {
|
|
114
|
+
const i = (label ?? "").indexOf("_");
|
|
115
|
+
return i === -1 ? (label ?? "") : label.slice(0, i);
|
|
116
|
+
}
|
|
117
|
+
function blockLine(block, indent) {
|
|
118
|
+
return `${indent}${block.label} | ${block.id} [${block.type}] — "${(block.essence || "").slice(0, 140)}"${uniqueFieldsStr(block)}`;
|
|
119
|
+
}
|
|
120
|
+
/** Parse a stored embedding (JSON array string, or already an array) → vector or null. */
|
|
121
|
+
function parseEmbedding(v) {
|
|
122
|
+
if (Array.isArray(v))
|
|
123
|
+
return v.length ? v : null;
|
|
124
|
+
if (typeof v !== "string" || !v)
|
|
125
|
+
return null;
|
|
126
|
+
try {
|
|
127
|
+
const p = JSON.parse(v);
|
|
128
|
+
return Array.isArray(p) && p.length ? p : null;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** Cosine similarity of two equal-length vectors. 0 if shapes mismatch. */
|
|
135
|
+
// ─── Main entry ──────────────────────────────────────────────────────────────────
|
|
136
|
+
/**
|
|
137
|
+
* Build the retrieved-slice PROJECT GRAPH body for Pass 4. Returns the same shape
|
|
138
|
+
* as buildProjectContext ({ context, reflectedIds }) so it is a drop-in swap at
|
|
139
|
+
* the call site. `context` is the body Pass 4 wraps in "PROJECT GRAPH (...):".
|
|
140
|
+
*/
|
|
141
|
+
export function buildPass4Slice(db, newBlocks, opts = {}) {
|
|
142
|
+
const netK = opts.netK ?? 5;
|
|
143
|
+
const maxBlocks = opts.maxBlocks ?? 120;
|
|
144
|
+
if (!newBlocks || newBlocks.length === 0)
|
|
145
|
+
return { context: "", reflectedIds: [] };
|
|
146
|
+
const allBlocks = db.getAllBlocks();
|
|
147
|
+
const newIds = new Set(newBlocks.map((b) => b.id));
|
|
148
|
+
// Root maps (label ⇄ id). deriveRootRelatedness speaks in LABELS; member blocks
|
|
149
|
+
// carry their root id in project_id — so we need both directions.
|
|
150
|
+
const rootIdByLabel = new Map();
|
|
151
|
+
const rootLabelById = new Map();
|
|
152
|
+
for (const b of allBlocks) {
|
|
153
|
+
if (b.type === "project") {
|
|
154
|
+
rootIdByLabel.set(b.label, b.id);
|
|
155
|
+
rootLabelById.set(b.id, b.label);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// ── 1. ANCHOR ROOTS — the new blocks' own roots (project_id, else label prefix) ──
|
|
159
|
+
const anchorRootLabels = new Set();
|
|
160
|
+
for (const b of newBlocks) {
|
|
161
|
+
const pid = b.project_id;
|
|
162
|
+
if (pid && rootLabelById.has(pid))
|
|
163
|
+
anchorRootLabels.add(rootLabelById.get(pid));
|
|
164
|
+
const pref = labelPrefix(b.label);
|
|
165
|
+
if (rootIdByLabel.has(pref))
|
|
166
|
+
anchorRootLabels.add(pref);
|
|
167
|
+
}
|
|
168
|
+
// ── 2. RELATED ROOTS (FOLLOW TRUTH) — Venn overlap from recorded cross-root edges ──
|
|
169
|
+
const relatedRootLabels = new Set();
|
|
170
|
+
try {
|
|
171
|
+
for (const pair of deriveRootRelatedness(db).pairs) {
|
|
172
|
+
if (anchorRootLabels.has(pair.root_a))
|
|
173
|
+
relatedRootLabels.add(pair.root_b);
|
|
174
|
+
if (anchorRootLabels.has(pair.root_b))
|
|
175
|
+
relatedRootLabels.add(pair.root_a);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch { /* best-effort — a relatedness failure must not sink Pass 4 */ }
|
|
179
|
+
const neighbourhoodLabels = new Set([...anchorRootLabels, ...relatedRootLabels]);
|
|
180
|
+
const neighbourhoodIds = new Set();
|
|
181
|
+
for (const lbl of neighbourhoodLabels) {
|
|
182
|
+
const id = rootIdByLabel.get(lbl);
|
|
183
|
+
if (id)
|
|
184
|
+
neighbourhoodIds.add(id);
|
|
185
|
+
}
|
|
186
|
+
// ── 3. NEIGHBOURHOOD MEMBERS — atomic blocks owned by anchor ∪ related roots ──
|
|
187
|
+
const surfaced = new Map();
|
|
188
|
+
for (const b of allBlocks) {
|
|
189
|
+
if (b.type === "project")
|
|
190
|
+
continue;
|
|
191
|
+
// No status filter: getAllBlocks() already excludes archived — match the
|
|
192
|
+
// dump (buildProjectContext) this replaces, so it stays a faithful swap.
|
|
193
|
+
if (newIds.has(b.id))
|
|
194
|
+
continue; // never link a new block against itself
|
|
195
|
+
const pid = b.project_id;
|
|
196
|
+
const inByPid = pid != null && neighbourhoodIds.has(pid);
|
|
197
|
+
const inByPrefix = neighbourhoodLabels.has(labelPrefix(b.label));
|
|
198
|
+
if (inByPid || inByPrefix)
|
|
199
|
+
surfaced.set(b.id, b);
|
|
200
|
+
}
|
|
201
|
+
// ── 4. FIRST-EVER NET (GUESS) — similarity candidates in not-yet-overlapping roots ──
|
|
202
|
+
for (const nb of newBlocks) {
|
|
203
|
+
const primary = uniquePrimary(nb);
|
|
204
|
+
const entity = {
|
|
205
|
+
canonical_name: nb.label.replace(/-/g, " "),
|
|
206
|
+
primary_values: primary ? [primary] : [],
|
|
207
|
+
concepts: parseConcepts(nb.concepts),
|
|
208
|
+
};
|
|
209
|
+
let candidates;
|
|
210
|
+
try {
|
|
211
|
+
candidates = retrieveGraphSlice(db, entity, { k: netK });
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
for (const c of candidates) {
|
|
217
|
+
const b = c.block;
|
|
218
|
+
if (!b || b.type === "project" || newIds.has(b.id) || b.status !== "active")
|
|
219
|
+
continue;
|
|
220
|
+
if (!surfaced.has(b.id))
|
|
221
|
+
surfaced.set(b.id, b);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// Token guard: cap total surfaced blocks (FOLLOW-TRUTH neighbourhood first,
|
|
225
|
+
// already inserted before the net, so the cap drops the weakest net hits first).
|
|
226
|
+
let surfacedBlocks = [...surfaced.values()];
|
|
227
|
+
if (surfacedBlocks.length > maxBlocks)
|
|
228
|
+
surfacedBlocks = surfacedBlocks.slice(0, maxBlocks);
|
|
229
|
+
// ── 4b. SEMANTIC DELTA (drift recall net) — UNWEIGHTED, separate, capped, $0 ──
|
|
230
|
+
// Pure recall: existing blocks MEANING-near a new block but missed by structure
|
|
231
|
+
// + identity (wording drift). Reads STORED vectors (no embed call). NOT ranked
|
|
232
|
+
// into the trusted set — appended as a small tagged delta the LLM judges by
|
|
233
|
+
// meaning. Excludes anything already surfaced + the new blocks themselves.
|
|
234
|
+
const deltaScored = [];
|
|
235
|
+
if (semanticDeltaEnabled()) {
|
|
236
|
+
const queryVecs = newBlocks
|
|
237
|
+
.map((b) => parseEmbedding(b.embedding))
|
|
238
|
+
.filter((v) => !!v);
|
|
239
|
+
if (queryVecs.length > 0) {
|
|
240
|
+
const surfacedIds = new Set(surfacedBlocks.map((b) => b.id));
|
|
241
|
+
for (const b of allBlocks) {
|
|
242
|
+
if (b.type === "project" || newIds.has(b.id) || surfacedIds.has(b.id))
|
|
243
|
+
continue;
|
|
244
|
+
if (b.status !== "active")
|
|
245
|
+
continue;
|
|
246
|
+
const vec = parseEmbedding(b.embedding);
|
|
247
|
+
if (!vec)
|
|
248
|
+
continue;
|
|
249
|
+
let best = 0;
|
|
250
|
+
for (const q of queryVecs) {
|
|
251
|
+
const s = cosineSim(q, vec);
|
|
252
|
+
if (s > best)
|
|
253
|
+
best = s;
|
|
254
|
+
}
|
|
255
|
+
if (best >= SEMANTIC_DELTA_FLOOR)
|
|
256
|
+
deltaScored.push({ block: b, sim: best });
|
|
257
|
+
}
|
|
258
|
+
deltaScored.sort((a, b) => b.sim - a.sim);
|
|
259
|
+
deltaScored.length = Math.min(deltaScored.length, semanticDeltaK());
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
if (deltaScored.length > 0) {
|
|
263
|
+
console.log(`[pass4-slice] semantic delta: ${deltaScored.length} candidate(s) — ` +
|
|
264
|
+
deltaScored.map((d) => `${d.block.label}(${d.sim.toFixed(2)})`).join(", "));
|
|
265
|
+
}
|
|
266
|
+
if (surfacedBlocks.length === 0 && deltaScored.length === 0)
|
|
267
|
+
return { context: "", reflectedIds: [] };
|
|
268
|
+
// ── 5. PRESENT COARSE → FINE — group by chain_id; chain block essence = the arc ──
|
|
269
|
+
const byChain = new Map();
|
|
270
|
+
const loose = [];
|
|
271
|
+
for (const b of surfacedBlocks) {
|
|
272
|
+
const cid = b.chain_id;
|
|
273
|
+
if (cid) {
|
|
274
|
+
let arr = byChain.get(cid);
|
|
275
|
+
if (!arr) {
|
|
276
|
+
arr = [];
|
|
277
|
+
byChain.set(cid, arr);
|
|
278
|
+
}
|
|
279
|
+
arr.push(b);
|
|
280
|
+
}
|
|
281
|
+
else
|
|
282
|
+
loose.push(b);
|
|
283
|
+
}
|
|
284
|
+
const lines = [];
|
|
285
|
+
for (const [chainId, members] of byChain) {
|
|
286
|
+
// Canonical chain_id IS the blk_ id of the materialized type:"chain" block.
|
|
287
|
+
let header = `CHAIN ${chainId}`;
|
|
288
|
+
try {
|
|
289
|
+
const cb = db.getBlock(chainId);
|
|
290
|
+
if (cb && cb.type === "chain")
|
|
291
|
+
header = `CHAIN ${cb.label} — "${(cb.essence || "").slice(0, 160)}"`;
|
|
292
|
+
}
|
|
293
|
+
catch { /* tolerate — fall back to the bare chain id header */ }
|
|
294
|
+
lines.push(header);
|
|
295
|
+
for (const m of members)
|
|
296
|
+
lines.push(blockLine(m, " "));
|
|
297
|
+
}
|
|
298
|
+
if (loose.length > 0) {
|
|
299
|
+
lines.push("[loose blocks]");
|
|
300
|
+
for (const b of loose)
|
|
301
|
+
lines.push(blockLine(b, " "));
|
|
302
|
+
}
|
|
303
|
+
// Semantic delta — kept SEPARATE + tagged so Pass 4 scrutinizes by meaning,
|
|
304
|
+
// never links on resemblance. sim shown for the judge's calibration.
|
|
305
|
+
if (deltaScored.length > 0) {
|
|
306
|
+
lines.push("[semantically related — UNCONFIRMED; link ONLY if the meaning clearly matches, not on resemblance]");
|
|
307
|
+
for (const { block, sim } of deltaScored)
|
|
308
|
+
lines.push(`${blockLine(block, " ")} (sim ${sim.toFixed(2)})`);
|
|
309
|
+
}
|
|
310
|
+
return {
|
|
311
|
+
context: lines.join("\n"),
|
|
312
|
+
reflectedIds: [...surfacedBlocks.map((b) => b.id), ...deltaScored.map((d) => d.block.id)],
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
//# sourceMappingURL=pass4-slice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pass4-slice.js","sourceRoot":"","sources":["../../../src/middleware/reflect/pass4-slice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { LLMProvider } from "../../engine/ai-provider.js";
|
|
2
|
+
export declare const PASS4_PROMPT = "You receive two things:\n NEW BLOCKS \u2014 blocks just saved this turn (label, id, type, essence, existing relations)\n PROJECT GRAPH \u2014 existing blocks from prior sessions\n\n\u2500\u2500 STATE CONVENTION \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\"State\" in this prompt = text in marked regions below (NEW BLOCKS, PROJECT GRAPH).\nYour training knowledge and \"what's commonly true in this domain\" are NOT state.\nA block exists ONLY if it appears in one of the two marked regions. Familiarity \u2260\nrecorded. When the DIRECTNESS CHECK asks \"is there another block Z that already\nconnects X to Y?\", Z must be a real label from NEW BLOCKS or PROJECT GRAPH \u2014 not\na block you imagine should exist.\n\nYour ONLY job: find missing connections between a NEW BLOCK and an EXISTING block.\nOutput relation tuples only. No new blocks. No block content. Just arrows.\n\n\u2500\u2500 SCOPE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n New block \u2194 existing block: YES \u2014 this is your job.\n New block \u2194 new block (same batch): NEVER \u2014 already decided by an earlier pass.\n Reversing an existing relation: NEVER \u2014 earlier passes had the transcript.\n\nIf a new block already has relations in its \"chain:\" section, those are DECIDED.\nDo not re-derive, reverse, or duplicate them.\n\n\u2500\u2500 DIRECTION \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nTHE SOURCE DEPENDS ON THE TARGET.\n\"Which block needs the other to make sense?\" \u2014 that block is the source.\n\n\u2500\u2500 FOR EACH (NEW BLOCK, EXISTING BLOCK) PAIR \u2014 RUN THIS TREE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nAnswer from the essences only. When uncertain at any step, answer NO.\nA missing link is recoverable next session; a wrong link is not.\n\nIn all steps, (X) and (Y) can be either the new block or the existing block.\nDirection follows the question's answer, not which block is newer.\n\nSTEP 1 \u2014 IDENTITY: \"Are (X) and (Y) about the same concept, mechanism, or role?\"\n\n NO \u2192 go to STEP 2.\n\n YES \u2192 STEP 1b: \"Does (X) make (Y) obsolete \u2014 same role, newer state?\"\n YES \u2192 supersedes { source: X (newer), target: Y (older) }\n Only valid between same category (decision\u2194decision, blueprint\u2194blueprint,\n decision\u2194blueprint). STOP \u2014 do not continue to STEP 2 for this pair.\n NO \u2192 STEP 1c: \"Does (X) add scope on top of (Y), where (Y) still stands alone?\"\n YES \u2192 extends { source: X (addition), target: Y (foundation) }\n STOP \u2014 do not continue to STEP 2 for this pair.\n NO \u2192 go to STEP 2.\n\nSTEP 2 \u2014 CAUSALITY: Ask 2a and 2b independently. A pair can produce both.\n\n 2a \u2014 \"Would (X) exist if (Y) had never happened?\"\n YES \u2192 no prompted_by for this pair.\n NO \u2192 DIRECTNESS CHECK before wiring:\n \"Is there another block (Z) \u2014 in (X)'s chain or in NEW BLOCKS \u2014 that (X)\n depends on more directly, where (Z) itself depends on or relates to (Y)?\"\n YES \u2192 (Y) is an ancestor, not the direct cause. The path from (X) to (Y)\n already runs through (Z). Skip \u2014 do not wire prompted_by.\n NO \u2192 (Y) is the most immediate cause.\n prompted_by { source: X (effect), target: Y (cause) }\n\n 2b \u2014 \"Would (X)'s claim be unsupported without (Y)'s specific finding?\"\n NO \u2192 no based_on for this pair.\n YES \u2192 DIRECTNESS CHECK before wiring:\n \"Is there another block (Z) that (X) already relies on, where (Z) itself\n draws on (Y) as its evidence?\"\n YES \u2192 (Y)'s evidence already reaches (X) through (Z). Skip.\n NO \u2192 (Y) is direct evidence for (X).\n based_on { source: X (claim), target: Y (evidence) }\n\nSTEP 3 \u2014 RESOLVES: Only ask when (Y) has type = question OR type = hypothesis.\n\n \"Does (X) directly answer or settle what (Y) asks or proposes?\"\n YES \u2192 resolves { source: X (answer/finding), target: Y (question/hypothesis) }\n NO \u2192 no relation for this pair.\n\n\u2500\u2500 TERMINAL \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nAfter checking every (new block, existing block) pair:\n No question answered YES for any pair \u2192 output empty relations array.\n\n\u2500\u2500 REASONING (REQUIRED PER RELATION) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nFor each emitted relation, the reason field MUST cite SPECIFIC source-target\nlabels and name which TREE STEP fired (1b supersedes / 1c extends / 2a\nprompted_by / 2b based_on / 3 resolves), in \u2264200 chars. Mirror Pass 5's\nper-chain reasoning shape: WHY this direction, citing the concrete labels.\n\nA reason that says only \"they are related\" or \"X relates to Y\" without\nnaming the TREE STEP that fired fails the contract \u2014 do not emit relations\nwhose direction you cannot defend by naming the specific step.\n\nExamples of valid reasons:\n \"2a prompted_by: project-X_decision_databricks would not exist without\n project-X_constraint_no-vendor-lock \u2014 constraint was prior.\"\n \"1b supersedes: project-Y_decision_use-postgres is newer same-role\n replacement for project-Y_decision_use-sqlite.\"\n\n\u2500\u2500 RULES \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n- Only output MISSING relations \u2014 not already in the graph or in a block's chain\n- Only use: extends, supersedes, superseded_by, prompted_by, based_on, resolves\n- source_id and target_id must be block labels exactly as shown\n- Every relation MUST include a reason field per REASONING above\n- Candidates under \"[semantically related \u2014 UNCONFIRMED]\" were surfaced by SIMILARITY,\n not a recorded connection. Link one ONLY when its MEANING clearly matches per the\n tree above \u2014 surface resemblance is never enough. When uncertain, answer NO.";
|
|
3
|
+
export declare const PASS4_DEFAULT_BATCH = 20;
|
|
4
|
+
export declare function pass4BatchSize(): number;
|
|
5
|
+
export declare function chunkForPass4<T>(items: T[], size?: number): T[][];
|
|
6
|
+
export declare function callPass4LLM(provider: LLMProvider, newBlocks: Array<{
|
|
7
|
+
id: string;
|
|
8
|
+
label: string;
|
|
9
|
+
type: string;
|
|
10
|
+
essence: string;
|
|
11
|
+
uniqueFields?: string;
|
|
12
|
+
chain?: string[];
|
|
13
|
+
}>, projectContext: string, thinkingBudget?: number, sceneCard?: string): Promise<{
|
|
14
|
+
result: {
|
|
15
|
+
relations: Array<{
|
|
16
|
+
source_id: string;
|
|
17
|
+
type: string;
|
|
18
|
+
target_id: string;
|
|
19
|
+
reason?: string;
|
|
20
|
+
}>;
|
|
21
|
+
} | null;
|
|
22
|
+
thinking: string;
|
|
23
|
+
rateLimited: boolean;
|
|
24
|
+
model?: string;
|
|
25
|
+
attempts?: Array<{
|
|
26
|
+
model: string;
|
|
27
|
+
outcome: string;
|
|
28
|
+
}>;
|
|
29
|
+
}>;
|
|
30
|
+
//# sourceMappingURL=pass4.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pass4.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/pass4.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAe/D,eAAO,MAAM,YAAY,ipPA2GsD,CAAC;AA8BhF,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,wBAAgB,cAAc,IAAI,MAAM,CAGvC;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,SAAmB,GAAG,CAAC,EAAE,EAAE,CAI3E;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,EACvH,cAAc,EAAE,MAAM,EACtB,cAAc,SAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE;QAAE,SAAS,EAAE,KAAK,CAAC;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAwCzO"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { reflectTokenStats } from "./context.js";
|
|
2
|
+
import { modelForPass } from "./config.js";
|
|
3
|
+
// Pass 4 model (resolved at call time via modelForPass("pass4")):
|
|
4
|
+
// NODEDEX_PASS4_MODEL override → NODEDEX_REASONING_MODEL tier → (Gemini) gemini-2.5-pro
|
|
5
|
+
// default (Pro reliably thinks where Flash skips + produces shallow links) → provider default.
|
|
6
|
+
// Set a stronger reasoning model (o4-mini, deepseek-reasoner) for non-Gemini providers.
|
|
7
|
+
// See docs/Compatible-Models-Reference.md for per-provider recommendations.
|
|
8
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
9
|
+
// PASS 4 — CONNECT (cross-session only)
|
|
10
|
+
// Job: link new blocks to existing graph blocks from prior sessions.
|
|
11
|
+
// Runs after all Pass 3 blocks are saved. Output: relation tuples only.
|
|
12
|
+
// Does NOT re-derive intra-batch wiring (Pass 2 owns that).
|
|
13
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
14
|
+
export const PASS4_PROMPT = `You receive two things:
|
|
15
|
+
NEW BLOCKS — blocks just saved this turn (label, id, type, essence, existing relations)
|
|
16
|
+
PROJECT GRAPH — existing blocks from prior sessions
|
|
17
|
+
|
|
18
|
+
── STATE CONVENTION ─────────────────────────────────────────────────────────
|
|
19
|
+
"State" in this prompt = text in marked regions below (NEW BLOCKS, PROJECT GRAPH).
|
|
20
|
+
Your training knowledge and "what's commonly true in this domain" are NOT state.
|
|
21
|
+
A block exists ONLY if it appears in one of the two marked regions. Familiarity ≠
|
|
22
|
+
recorded. When the DIRECTNESS CHECK asks "is there another block Z that already
|
|
23
|
+
connects X to Y?", Z must be a real label from NEW BLOCKS or PROJECT GRAPH — not
|
|
24
|
+
a block you imagine should exist.
|
|
25
|
+
|
|
26
|
+
Your ONLY job: find missing connections between a NEW BLOCK and an EXISTING block.
|
|
27
|
+
Output relation tuples only. No new blocks. No block content. Just arrows.
|
|
28
|
+
|
|
29
|
+
── SCOPE ───────────────────────────────────────────────────────────────────
|
|
30
|
+
|
|
31
|
+
New block ↔ existing block: YES — this is your job.
|
|
32
|
+
New block ↔ new block (same batch): NEVER — already decided by an earlier pass.
|
|
33
|
+
Reversing an existing relation: NEVER — earlier passes had the transcript.
|
|
34
|
+
|
|
35
|
+
If a new block already has relations in its "chain:" section, those are DECIDED.
|
|
36
|
+
Do not re-derive, reverse, or duplicate them.
|
|
37
|
+
|
|
38
|
+
── DIRECTION ───────────────────────────────────────────────────────────────
|
|
39
|
+
|
|
40
|
+
THE SOURCE DEPENDS ON THE TARGET.
|
|
41
|
+
"Which block needs the other to make sense?" — that block is the source.
|
|
42
|
+
|
|
43
|
+
── FOR EACH (NEW BLOCK, EXISTING BLOCK) PAIR — RUN THIS TREE ──────────────
|
|
44
|
+
|
|
45
|
+
Answer from the essences only. When uncertain at any step, answer NO.
|
|
46
|
+
A missing link is recoverable next session; a wrong link is not.
|
|
47
|
+
|
|
48
|
+
In all steps, (X) and (Y) can be either the new block or the existing block.
|
|
49
|
+
Direction follows the question's answer, not which block is newer.
|
|
50
|
+
|
|
51
|
+
STEP 1 — IDENTITY: "Are (X) and (Y) about the same concept, mechanism, or role?"
|
|
52
|
+
|
|
53
|
+
NO → go to STEP 2.
|
|
54
|
+
|
|
55
|
+
YES → STEP 1b: "Does (X) make (Y) obsolete — same role, newer state?"
|
|
56
|
+
YES → supersedes { source: X (newer), target: Y (older) }
|
|
57
|
+
Only valid between same category (decision↔decision, blueprint↔blueprint,
|
|
58
|
+
decision↔blueprint). STOP — do not continue to STEP 2 for this pair.
|
|
59
|
+
NO → STEP 1c: "Does (X) add scope on top of (Y), where (Y) still stands alone?"
|
|
60
|
+
YES → extends { source: X (addition), target: Y (foundation) }
|
|
61
|
+
STOP — do not continue to STEP 2 for this pair.
|
|
62
|
+
NO → go to STEP 2.
|
|
63
|
+
|
|
64
|
+
STEP 2 — CAUSALITY: Ask 2a and 2b independently. A pair can produce both.
|
|
65
|
+
|
|
66
|
+
2a — "Would (X) exist if (Y) had never happened?"
|
|
67
|
+
YES → no prompted_by for this pair.
|
|
68
|
+
NO → DIRECTNESS CHECK before wiring:
|
|
69
|
+
"Is there another block (Z) — in (X)'s chain or in NEW BLOCKS — that (X)
|
|
70
|
+
depends on more directly, where (Z) itself depends on or relates to (Y)?"
|
|
71
|
+
YES → (Y) is an ancestor, not the direct cause. The path from (X) to (Y)
|
|
72
|
+
already runs through (Z). Skip — do not wire prompted_by.
|
|
73
|
+
NO → (Y) is the most immediate cause.
|
|
74
|
+
prompted_by { source: X (effect), target: Y (cause) }
|
|
75
|
+
|
|
76
|
+
2b — "Would (X)'s claim be unsupported without (Y)'s specific finding?"
|
|
77
|
+
NO → no based_on for this pair.
|
|
78
|
+
YES → DIRECTNESS CHECK before wiring:
|
|
79
|
+
"Is there another block (Z) that (X) already relies on, where (Z) itself
|
|
80
|
+
draws on (Y) as its evidence?"
|
|
81
|
+
YES → (Y)'s evidence already reaches (X) through (Z). Skip.
|
|
82
|
+
NO → (Y) is direct evidence for (X).
|
|
83
|
+
based_on { source: X (claim), target: Y (evidence) }
|
|
84
|
+
|
|
85
|
+
STEP 3 — RESOLVES: Only ask when (Y) has type = question OR type = hypothesis.
|
|
86
|
+
|
|
87
|
+
"Does (X) directly answer or settle what (Y) asks or proposes?"
|
|
88
|
+
YES → resolves { source: X (answer/finding), target: Y (question/hypothesis) }
|
|
89
|
+
NO → no relation for this pair.
|
|
90
|
+
|
|
91
|
+
── TERMINAL ────────────────────────────────────────────────────────────────
|
|
92
|
+
|
|
93
|
+
After checking every (new block, existing block) pair:
|
|
94
|
+
No question answered YES for any pair → output empty relations array.
|
|
95
|
+
|
|
96
|
+
── REASONING (REQUIRED PER RELATION) ────────────────────────────────────────
|
|
97
|
+
|
|
98
|
+
For each emitted relation, the reason field MUST cite SPECIFIC source-target
|
|
99
|
+
labels and name which TREE STEP fired (1b supersedes / 1c extends / 2a
|
|
100
|
+
prompted_by / 2b based_on / 3 resolves), in ≤200 chars. Mirror Pass 5's
|
|
101
|
+
per-chain reasoning shape: WHY this direction, citing the concrete labels.
|
|
102
|
+
|
|
103
|
+
A reason that says only "they are related" or "X relates to Y" without
|
|
104
|
+
naming the TREE STEP that fired fails the contract — do not emit relations
|
|
105
|
+
whose direction you cannot defend by naming the specific step.
|
|
106
|
+
|
|
107
|
+
Examples of valid reasons:
|
|
108
|
+
"2a prompted_by: project-X_decision_databricks would not exist without
|
|
109
|
+
project-X_constraint_no-vendor-lock — constraint was prior."
|
|
110
|
+
"1b supersedes: project-Y_decision_use-postgres is newer same-role
|
|
111
|
+
replacement for project-Y_decision_use-sqlite."
|
|
112
|
+
|
|
113
|
+
── RULES ───────────────────────────────────────────────────────────────────
|
|
114
|
+
|
|
115
|
+
- Only output MISSING relations — not already in the graph or in a block's chain
|
|
116
|
+
- Only use: extends, supersedes, superseded_by, prompted_by, based_on, resolves
|
|
117
|
+
- source_id and target_id must be block labels exactly as shown
|
|
118
|
+
- Every relation MUST include a reason field per REASONING above
|
|
119
|
+
- Candidates under "[semantically related — UNCONFIRMED]" were surfaced by SIMILARITY,
|
|
120
|
+
not a recorded connection. Link one ONLY when its MEANING clearly matches per the
|
|
121
|
+
tree above — surface resemblance is never enough. When uncertain, answer NO.`;
|
|
122
|
+
const PASS4_SCHEMA = {
|
|
123
|
+
type: "object",
|
|
124
|
+
properties: {
|
|
125
|
+
relations: {
|
|
126
|
+
type: "array",
|
|
127
|
+
items: {
|
|
128
|
+
type: "object",
|
|
129
|
+
properties: {
|
|
130
|
+
source_id: { type: "string" },
|
|
131
|
+
type: { type: "string" },
|
|
132
|
+
target_id: { type: "string" },
|
|
133
|
+
reason: { type: "string" },
|
|
134
|
+
},
|
|
135
|
+
required: ["source_id", "type", "target_id", "reason"],
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
required: ["relations"],
|
|
140
|
+
};
|
|
141
|
+
// ── Batching (2026-07-03) ────────────────────────────────────────────────────
|
|
142
|
+
// Pass 4 emits one relation-judgment per new block; its OUTPUT grows with the
|
|
143
|
+
// new-block count while the input-side slice stays capped. The 200-block dogfood
|
|
144
|
+
// run proved the failure mode: 157 new blocks in ONE call blew the model's output
|
|
145
|
+
// cap → truncated twice → the whole pass failed → every cross-group conclusion
|
|
146
|
+
// landed orphaned. The caller chunks new blocks to ≤ this size per call (mirroring
|
|
147
|
+
// fill_2b's batching), which bounds each call's output and isolates failures —
|
|
148
|
+
// one truncated batch loses only its own links.
|
|
149
|
+
export const PASS4_DEFAULT_BATCH = 20;
|
|
150
|
+
export function pass4BatchSize() {
|
|
151
|
+
const n = Number(process.env.NODEDEX_PASS4_BATCH);
|
|
152
|
+
return Number.isFinite(n) && n >= 1 ? Math.floor(n) : PASS4_DEFAULT_BATCH;
|
|
153
|
+
}
|
|
154
|
+
export function chunkForPass4(items, size = pass4BatchSize()) {
|
|
155
|
+
const out = [];
|
|
156
|
+
for (let i = 0; i < items.length; i += size)
|
|
157
|
+
out.push(items.slice(i, i + size));
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
export async function callPass4LLM(provider, newBlocks, projectContext, thinkingBudget = 512, sceneCard) {
|
|
161
|
+
const newBlocksSection = `NEW BLOCKS (just saved this turn):\n${newBlocks.map(b => {
|
|
162
|
+
const chainStr = b.chain && b.chain.length > 0 ? `\n chain:\n${b.chain.join("\n")}` : "";
|
|
163
|
+
return ` ${b.label} | ${b.id} [${b.type}] — "${b.essence}"${b.uniqueFields ?? ""}${chainStr}`;
|
|
164
|
+
}).join("\n")}\n\n`;
|
|
165
|
+
const projectSection = projectContext
|
|
166
|
+
? `PROJECT GRAPH (existing blocks — find missing links against these):\n${projectContext}`
|
|
167
|
+
: `PROJECT GRAPH: (empty)`;
|
|
168
|
+
// Scene card is session-level framing — Pass 4 is cross-session linking only,
|
|
169
|
+
// so we don't inject it (it encouraged intra-batch re-derivation).
|
|
170
|
+
const userInput = `${newBlocksSection}${projectSection}`;
|
|
171
|
+
// Resolve the model to use for Pass 4:
|
|
172
|
+
// 1. NODEDEX_PASS4_MODEL env var (explicit override, works for any provider)
|
|
173
|
+
// 2. For Gemini with no override: default to gemini-2.5-pro (Pro thinks reliably)
|
|
174
|
+
// 3. All other providers with no override: use their configured AI_MODEL
|
|
175
|
+
const modelOverride = modelForPass("pass4")
|
|
176
|
+
?? (provider.getName() === "gemini" ? "gemini-2.5-pro" : undefined);
|
|
177
|
+
const r = await provider.generateStructured(PASS4_PROMPT, userInput, PASS4_SCHEMA, { thinkingBudget, modelOverride });
|
|
178
|
+
if (r.usage) {
|
|
179
|
+
reflectTokenStats.pass4.input += r.usage.input;
|
|
180
|
+
reflectTokenStats.pass4.thinking += r.usage.thinking;
|
|
181
|
+
reflectTokenStats.pass4.output += r.usage.output;
|
|
182
|
+
}
|
|
183
|
+
reflectTokenStats.pass4.calls += 1;
|
|
184
|
+
if (r.result) {
|
|
185
|
+
const modelTag = modelOverride ? ` [${modelOverride}]` : (provider.getName() !== "gemini" ? ` [${provider.getName()}]` : "");
|
|
186
|
+
console.log(`Auto-Reflect Pass 4: ${r.result.relations?.length ?? 0} relation(s) found | tokens: in=${r.usage?.input ?? "?"} think=${r.usage?.thinking ?? "?"}${modelTag}`);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
console.warn(`Auto-Reflect Pass 4: ${r.rateLimited ? "rate limited" : "failed"} — skipping (non-critical)`);
|
|
190
|
+
}
|
|
191
|
+
return { result: r.result, thinking: r.thinking ?? "", rateLimited: r.rateLimited, model: r.model, attempts: r.attempts };
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=pass4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pass4.js","sourceRoot":"","sources":["../../../src/middleware/reflect/pass4.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { LLMProvider } from "../../engine/ai-provider.js";
|
|
2
|
+
import type { Pass5Result } from "./types.js";
|
|
3
|
+
export type Pass5CallResult = {
|
|
4
|
+
result: Pass5Result | null;
|
|
5
|
+
rateLimited: boolean;
|
|
6
|
+
model?: string;
|
|
7
|
+
attempts?: Array<{
|
|
8
|
+
model: string;
|
|
9
|
+
outcome: string;
|
|
10
|
+
}>;
|
|
11
|
+
};
|
|
12
|
+
export declare function callPass5LLM(provider: LLMProvider, newBlocks: Array<{
|
|
13
|
+
id: string;
|
|
14
|
+
label: string;
|
|
15
|
+
type: string;
|
|
16
|
+
essence: string;
|
|
17
|
+
}>, causalRels: Array<{
|
|
18
|
+
source_id: string;
|
|
19
|
+
target_id: string;
|
|
20
|
+
type: string;
|
|
21
|
+
}>): Promise<Pass5CallResult>;
|
|
22
|
+
//# sourceMappingURL=pass5.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pass5.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/pass5.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA6I9C,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD,CAAC;AAEF,wBAAsB,YAAY,CAChC,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9E,UAAU,EAAE,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACxE,OAAO,CAAC,eAAe,CAAC,CA4C1B"}
|