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,520 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
// DEBT 5 Slice 2 Sub-step 2.2 — ASYNC FLAG REVIEWER
|
|
3
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// The "reasoning MERGES" half of the user's "system FLAGS, reasoning MERGES"
|
|
6
|
+
// directive. Consumes pipeline_flags rows written by Slice 1's Stage FLAG
|
|
7
|
+
// (atomic_dup_candidate) and Slice 2.3's Stage AUDIT (project_dup_candidate,
|
|
8
|
+
// scope_disagreement, island_candidate). For each pending flag:
|
|
9
|
+
//
|
|
10
|
+
// 1. Build context: load both blocks + scope chains (db reads, no LLM)
|
|
11
|
+
// 2. Call LLM with merge/leave/split prompt — single call per flag
|
|
12
|
+
// 3. Write verdict back via markFlagReviewed (idempotent UPDATE)
|
|
13
|
+
// 4. If verdict='merge' AND auto-merge enabled AND confidence='high':
|
|
14
|
+
// execute merge — createRelation('supersedes') auto-archives loser
|
|
15
|
+
// per database.ts:1192-1198 (existing supersedes-archive trigger)
|
|
16
|
+
//
|
|
17
|
+
// Design contract: docs/PIPELINE-SLICE-2-DESIGN.md §2.
|
|
18
|
+
// Worker pattern: flag-reviewer-startup.ts wraps this in setInterval.
|
|
19
|
+
//
|
|
20
|
+
// What this module does NOT do:
|
|
21
|
+
// - Setinterval / startup (that's flag-reviewer-startup.ts)
|
|
22
|
+
// - Stage AUDIT graph scanning (that's stage-audit-graph.ts)
|
|
23
|
+
// - REST endpoints (that's routes/flags.ts)
|
|
24
|
+
// - island_candidate / entity_unresolved review (different shape — both
|
|
25
|
+
// deferred to optional Sub-step 2.6 per design doc §8; this reviewer
|
|
26
|
+
// SKIPS them with verdict='leave' + reason explaining the deferral)
|
|
27
|
+
//
|
|
28
|
+
// Safety levels per design §2.5 (env-controlled):
|
|
29
|
+
// Level 0 (default): NODEDEX_FLAG_REVIEWER_ENABLED unset/off — worker
|
|
30
|
+
// never starts. This module's runFlagReviewerTick can
|
|
31
|
+
// still be called manually (e.g., REST sync path).
|
|
32
|
+
// Level 1: NODEDEX_FLAG_REVIEWER_ENABLED=on, NODEDEX_FLAG_AUTO_MERGE unset
|
|
33
|
+
// — verdicts written, NO auto-merge fires.
|
|
34
|
+
// Level 2: + NODEDEX_FLAG_AUTO_MERGE=on — verdict='merge' AND
|
|
35
|
+
// confidence='high' triggers executeMerge (charter Rule 2: archive
|
|
36
|
+
// not delete, recoverable via /api/blocks).
|
|
37
|
+
import { getPendingFlags, markFlagReviewed, markFlagPendingClarification } from "./pipeline-flags.js";
|
|
38
|
+
import { extractPrimaryValueFromUnique } from "./dedup-by-source-and-value.js";
|
|
39
|
+
import { reflectTokenStats } from "./context.js";
|
|
40
|
+
import { getThinkingBudget, modelOverride, intFromEnv } from "./config.js";
|
|
41
|
+
import { computeCost } from "./cost-pricing.js";
|
|
42
|
+
// ─── Config (env-controlled) ──────────────────────────────────────────────────
|
|
43
|
+
/** Max flags reviewed per tick. Caps worst-case $$ per tick:
|
|
44
|
+
* default 5 × ~$0.02-0.05 per call ≈ $0.10-0.25 / tick.
|
|
45
|
+
* Override via NODEDEX_FLAG_REVIEWER_BATCH_SIZE. */
|
|
46
|
+
function batchSize() {
|
|
47
|
+
return intFromEnv("NODEDEX_FLAG_REVIEWER_BATCH_SIZE", 5);
|
|
48
|
+
}
|
|
49
|
+
/** Model override for the reviewer. Defaults to whatever the default provider
|
|
50
|
+
* uses; opt-in different model via NODEDEX_FLAG_REVIEWER_MODEL. */
|
|
51
|
+
function reviewerModel() {
|
|
52
|
+
return modelOverride("NODEDEX_FLAG_REVIEWER_MODEL");
|
|
53
|
+
}
|
|
54
|
+
/** Auto-merge gate. Default OFF — Level 1 behavior. Set to "on" for Level 2. */
|
|
55
|
+
function autoMergeEnabled() {
|
|
56
|
+
return (process.env.NODEDEX_FLAG_AUTO_MERGE ?? "").toLowerCase() === "on";
|
|
57
|
+
}
|
|
58
|
+
// ─── Prompt + schema ──────────────────────────────────────────────────────────
|
|
59
|
+
const REVIEWER_PROMPT = `You are a graph curator reviewing a candidate-duplicate detection in a knowledge graph.
|
|
60
|
+
|
|
61
|
+
INPUT: A flag describing two blocks the pipeline (or graph-health audit) suspects might be duplicates, plus the full content + scope of each block.
|
|
62
|
+
|
|
63
|
+
YOUR DECISION: For this candidate pair, output ONE of three verdicts:
|
|
64
|
+
- "merge": The two blocks state the SAME CLAIM at the SAME epistemic role — one is a
|
|
65
|
+
restatement/rewording of the other (the same constraint phrased two ways; the same
|
|
66
|
+
fact captured twice). Judge on the \`claim:\` line (the unique{} identity), NOT the
|
|
67
|
+
topic or the essence wording.
|
|
68
|
+
- "leave": NOT the same claim. Three common cases:
|
|
69
|
+
(a) same topic / surface-similar but a DIFFERENT claim;
|
|
70
|
+
(b) same claim but DIFFERENT SCOPE (different owner/project) — scope dominates;
|
|
71
|
+
(c) DIFFERENT EPISTEMIC ROLE about the same topic — a metric (a measurement) vs a
|
|
72
|
+
constraint (its implication) vs a fact vs a dead_end vs a hypothesis are NOT
|
|
73
|
+
duplicates even when about the same thing. They are LINKED (based_on, etc.), not
|
|
74
|
+
merged. Collapsing them DESTROYS information (e.g. a metric's measurement value).
|
|
75
|
+
When in doubt, LEAVE — a kept pair is recoverable; a wrong merge corrupts the graph.
|
|
76
|
+
- "split": Real ambiguity — both blocks should remain, BUT something structural needs to change
|
|
77
|
+
(e.g., one should be re-parented to a different project). Or it needs human attention.
|
|
78
|
+
|
|
79
|
+
KEY RULE — compare the CLAIM, preserve the ROLE:
|
|
80
|
+
Judge sameness on the \`claim:\` line (the unique{} identity = what the block IS), using
|
|
81
|
+
\`essence:\` only as readable context. A duplicate is the SAME claim restated. Blocks of DIFFERENT
|
|
82
|
+
\`type\` carry different epistemic roles and are almost never duplicates on the same topic — merge
|
|
83
|
+
across type ONLY if they are unmistakably the identical claim captured under two type labels.
|
|
84
|
+
Labels are strict {project}_{type}_{concept} (scope_role_topic), so the label echoes scope, role,
|
|
85
|
+
and topic — use it consistently with type and project_id.
|
|
86
|
+
|
|
87
|
+
KEY RULE — scope dominates content similarity:
|
|
88
|
+
Two blocks with identical content under DIFFERENT scopes (e.g., "auth-service" under Customer-A vs "auth-service" under Customer-B) are NOT duplicates. They serve different graphs. Output "leave".
|
|
89
|
+
|
|
90
|
+
KEY RULE — winning_block_id required when verdict='merge':
|
|
91
|
+
If verdict='merge', you MUST set winning_block_id to one of block_a.id or block_b.id. Prefer:
|
|
92
|
+
(a) the block with more concepts (richer indexed presence)
|
|
93
|
+
(b) on tie: the block with more content
|
|
94
|
+
(c) on tie: block_a (deterministic tiebreaker)
|
|
95
|
+
|
|
96
|
+
KEY RULE — confidence is structural:
|
|
97
|
+
- "high": obvious dup (same source_excerpt + same primary_value) OR obvious non-dup (different scope, different domain)
|
|
98
|
+
- "medium": content suggests same entity but evidence is partial
|
|
99
|
+
- "low": genuine ambiguity — the verdict is your best read but a human might disagree
|
|
100
|
+
|
|
101
|
+
OUTPUT: JSON per schema. Reason must explain WHY in 1-2 sentences — it's read by future audit + the next reviewer cycle.`;
|
|
102
|
+
const REVIEWER_SCHEMA = {
|
|
103
|
+
type: "object",
|
|
104
|
+
properties: {
|
|
105
|
+
verdict: { type: "string", enum: ["merge", "leave", "split"] },
|
|
106
|
+
reason: { type: "string" },
|
|
107
|
+
winning_block_id: { type: "string" },
|
|
108
|
+
confidence: { type: "string", enum: ["high", "medium", "low"] },
|
|
109
|
+
},
|
|
110
|
+
required: ["verdict", "reason", "confidence"],
|
|
111
|
+
};
|
|
112
|
+
// ─── Context loaders (no LLM) ──────────────────────────────────────────────────
|
|
113
|
+
/** Load a BlockReviewSnapshot from the blocks table. Returns null if the block
|
|
114
|
+
* was archived/deleted between flag-write and reviewer-tick (we don't
|
|
115
|
+
* re-resurrect — the flag becomes stale, reviewer skips it). */
|
|
116
|
+
export function loadBlockSnapshot(db, blockId) {
|
|
117
|
+
const row = db.prepare(`
|
|
118
|
+
SELECT id, label, type, essence, content, concepts, project_id, source, status
|
|
119
|
+
FROM blocks
|
|
120
|
+
WHERE id = ?
|
|
121
|
+
`).get(blockId);
|
|
122
|
+
if (!row)
|
|
123
|
+
return null;
|
|
124
|
+
// Honor this function's contract: an ARCHIVED block reads as STALE → null, so a
|
|
125
|
+
// block merged earlier in the SAME tick is NOT re-judged/re-merged. The prior SQL
|
|
126
|
+
// had no status filter → double-archive + archived-winner cascades (2026-06-03
|
|
127
|
+
// reviewer-precision finding: 8 merges produced an incoherent merge graph).
|
|
128
|
+
if (row.status === 'archived')
|
|
129
|
+
return null;
|
|
130
|
+
let concepts = [];
|
|
131
|
+
try {
|
|
132
|
+
concepts = Array.isArray(JSON.parse(row.concepts)) ? JSON.parse(row.concepts) : [];
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
concepts = [];
|
|
136
|
+
}
|
|
137
|
+
// The CLAIM (unique{} identity) — the dedup anchor. SAME extractor as the detector
|
|
138
|
+
// (Rule 5: one identity definition). Parsed from content.unique{}.
|
|
139
|
+
let unique = {};
|
|
140
|
+
try {
|
|
141
|
+
const c = JSON.parse(row.content ?? "{}");
|
|
142
|
+
if (c && typeof c.unique === "object" && c.unique)
|
|
143
|
+
unique = c.unique;
|
|
144
|
+
}
|
|
145
|
+
catch { /* tolerate malformed content */ }
|
|
146
|
+
return {
|
|
147
|
+
id: row.id,
|
|
148
|
+
label: row.label,
|
|
149
|
+
type: row.type,
|
|
150
|
+
essence: row.essence,
|
|
151
|
+
content: row.content,
|
|
152
|
+
concepts,
|
|
153
|
+
project_id: row.project_id,
|
|
154
|
+
source: row.source,
|
|
155
|
+
primary_value: extractPrimaryValueFromUnique(row.type, unique),
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/** Walk part_of relations up to the project root. Returns the chain of LABELS
|
|
159
|
+
* from root → block. Bounded depth (default 8) — graph cycles or pathological
|
|
160
|
+
* depths return whatever we walked. */
|
|
161
|
+
export function loadScopeChain(db, blockId, maxDepth = 8) {
|
|
162
|
+
const chain = [];
|
|
163
|
+
let current = blockId;
|
|
164
|
+
let depth = 0;
|
|
165
|
+
while (current && depth < maxDepth) {
|
|
166
|
+
const row = db.prepare(`SELECT label FROM blocks WHERE id = ?`).get(current);
|
|
167
|
+
if (!row)
|
|
168
|
+
break;
|
|
169
|
+
chain.unshift(row.label);
|
|
170
|
+
const parent = db.prepare(`
|
|
171
|
+
SELECT target_id FROM relations
|
|
172
|
+
WHERE source_id = ? AND type = 'part_of' AND valid_to IS NULL
|
|
173
|
+
LIMIT 1
|
|
174
|
+
`).get(current);
|
|
175
|
+
current = parent?.target_id ?? null;
|
|
176
|
+
depth += 1;
|
|
177
|
+
}
|
|
178
|
+
return chain;
|
|
179
|
+
}
|
|
180
|
+
export function buildReviewerContext(db, flag) {
|
|
181
|
+
const block_a = loadBlockSnapshot(db, flag.block_id_a);
|
|
182
|
+
if (!block_a)
|
|
183
|
+
return null; // flag stale — block_a archived/deleted
|
|
184
|
+
let block_b = null;
|
|
185
|
+
if (flag.block_id_b) {
|
|
186
|
+
block_b = loadBlockSnapshot(db, flag.block_id_b);
|
|
187
|
+
// A 2-block dup flag whose partner is archived/gone is STALE (most often: already
|
|
188
|
+
// merged by an earlier flag THIS tick) → skip it, don't degrade to a single-block
|
|
189
|
+
// judgment. This + loadBlockSnapshot's archived-filter is the Problem-2 fix.
|
|
190
|
+
if (!block_b)
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
const scope_a_chain = loadScopeChain(db, flag.block_id_a);
|
|
194
|
+
const scope_b_chain = flag.block_id_b ? loadScopeChain(db, flag.block_id_b) : null;
|
|
195
|
+
return { flag, block_a, block_b, scope_a_chain, scope_b_chain };
|
|
196
|
+
}
|
|
197
|
+
// ─── LLM call ─────────────────────────────────────────────────────────────────
|
|
198
|
+
function formatBlockForPrompt(b, scope) {
|
|
199
|
+
return [
|
|
200
|
+
` id: ${b.id}`,
|
|
201
|
+
` label: ${b.label}`, // strict: {project}_{type}_{concept} = scope_role_topic
|
|
202
|
+
` type (epistemic ROLE): ${b.type}`,
|
|
203
|
+
` claim (unique{} identity — COMPARE THIS): ${b.primary_value || "(none)"}`,
|
|
204
|
+
` essence (readable context only, NOT the identity): ${b.essence}`,
|
|
205
|
+
` content: ${b.content.slice(0, 1500)}${b.content.length > 1500 ? " …[truncated]" : ""}`,
|
|
206
|
+
` concepts: [${b.concepts.join(", ")}]`,
|
|
207
|
+
` project_id (SCOPE): ${b.project_id ?? "(none)"}`,
|
|
208
|
+
` source: ${b.source ?? "(none)"}`,
|
|
209
|
+
` scope_chain: ${scope ? scope.join(" → ") : "(unknown)"}`,
|
|
210
|
+
].join("\n");
|
|
211
|
+
}
|
|
212
|
+
export function buildReviewerInput(ctx) {
|
|
213
|
+
const sections = [
|
|
214
|
+
`FLAG TYPE: ${ctx.flag.flag_type}`,
|
|
215
|
+
`FLAG ORIGIN: ${ctx.flag.origin_writer}`,
|
|
216
|
+
`SCOPE CHECK (pipeline's pre-LLM read): ${ctx.flag.scope_check}`,
|
|
217
|
+
`FLAG CRITERIA (what was detected): ${JSON.stringify(ctx.flag.criteria, null, 2)}`,
|
|
218
|
+
"",
|
|
219
|
+
"BLOCK A:",
|
|
220
|
+
formatBlockForPrompt(ctx.block_a, ctx.scope_a_chain),
|
|
221
|
+
];
|
|
222
|
+
if (ctx.block_b) {
|
|
223
|
+
sections.push("", "BLOCK B:", formatBlockForPrompt(ctx.block_b, ctx.scope_b_chain));
|
|
224
|
+
}
|
|
225
|
+
else {
|
|
226
|
+
sections.push("", "BLOCK B: (none — single-block flag; verdict='split' if uncertain)");
|
|
227
|
+
}
|
|
228
|
+
return sections.join("\n");
|
|
229
|
+
}
|
|
230
|
+
export async function callReviewerLLM(provider, ctx) {
|
|
231
|
+
const userInput = buildReviewerInput(ctx);
|
|
232
|
+
const r = await provider.generateStructured(REVIEWER_PROMPT, userInput, REVIEWER_SCHEMA, {
|
|
233
|
+
thinkingBudget: getThinkingBudget(1024), // judgment, not reasoning-heavy
|
|
234
|
+
maxOutputTokens: 4096, // small JSON output expected
|
|
235
|
+
modelOverride: reviewerModel(),
|
|
236
|
+
});
|
|
237
|
+
if (r.usage) {
|
|
238
|
+
reflectTokenStats.pass_reviewer.input += r.usage.input ?? 0;
|
|
239
|
+
reflectTokenStats.pass_reviewer.thinking += r.usage.thinking ?? 0;
|
|
240
|
+
reflectTokenStats.pass_reviewer.output += r.usage.output ?? 0;
|
|
241
|
+
}
|
|
242
|
+
reflectTokenStats.pass_reviewer.calls += 1;
|
|
243
|
+
return { result: r.result, model: r.model, rateLimited: r.rateLimited };
|
|
244
|
+
}
|
|
245
|
+
// ─── Merge action ──────────────────────────────────────────────────────────────
|
|
246
|
+
/**
|
|
247
|
+
* Execute a merge verdict — wire supersedes (winner → loser) AND archive the
|
|
248
|
+
* loser so the duplicate actually collapses.
|
|
249
|
+
*
|
|
250
|
+
* ⚠ DESIGN NOTE — relaxes the "facts permanent on supersede" rule for the
|
|
251
|
+
* confirmed-duplicate-merge case (surfaced to user 2026-05-31):
|
|
252
|
+
*
|
|
253
|
+
* database.ts:1192-1199 auto-archives a supersede TARGET only when it's a
|
|
254
|
+
* 'blueprint' or 'decision' — facts/constraints/dead_ends/questions are
|
|
255
|
+
* treated as permanent historical records (a contradicted fact stays visible).
|
|
256
|
+
* That rule is correct for GENERIC supersede ("B replaces A's claim; both are
|
|
257
|
+
* history"). It is WRONG for a reviewer-confirmed DUPLICATE, which is a
|
|
258
|
+
* different operation: "A and B are the SAME thing captured twice — collapse
|
|
259
|
+
* to one." A duplicate fact is not two historical records; keeping both is
|
|
260
|
+
* noise, not history. Slice 1's atomic_dup_candidate is PRECISELY duplicate
|
|
261
|
+
* facts (same source_excerpt + same primary_value), so relying on the
|
|
262
|
+
* type-conditional supersede-archive would leave every confirmed fact-dup
|
|
263
|
+
* un-merged.
|
|
264
|
+
*
|
|
265
|
+
* Therefore executeMerge archives the loser DIRECTLY (db.archiveBlock) instead
|
|
266
|
+
* of relying on the supersede side-effect. Charter Rule 2 honored: archive
|
|
267
|
+
* (recoverable via /api/blocks), never delete. Containment: this only runs at
|
|
268
|
+
* Level 2 (NODEDEX_FLAG_AUTO_MERGE=on, default OFF) on a high-confidence
|
|
269
|
+
* reviewer 'merge' verdict — both opt-in gates.
|
|
270
|
+
*
|
|
271
|
+
* Returns the action_taken value to write to the flag row.
|
|
272
|
+
*/
|
|
273
|
+
export function executeMerge(db, winnerBlockId, loserBlockId) {
|
|
274
|
+
if (winnerBlockId === loserBlockId)
|
|
275
|
+
return 'none'; // safety: refuse self-merge
|
|
276
|
+
// ── Rewire the loser's relations onto the winner BEFORE archiving ──
|
|
277
|
+
// (1) CONTENT edges (based_on/supports/contradicts/...): archived blocks are filtered
|
|
278
|
+
// at read, so an un-rewired loser edge would silently vanish — the cluster would
|
|
279
|
+
// LOSE the loser's connections (e.g. loser supports→hypothesis; gone on merge).
|
|
280
|
+
// (2) the loser's OUTGOING `supersedes` edges (its OWN prior losers, when the loser was
|
|
281
|
+
// itself a winner in an earlier merge this tick): re-point them to the winner so a
|
|
282
|
+
// TRANSITIVE merge stays FLAT — every collapsed block ends up superseded DIRECTLY by
|
|
283
|
+
// the live winner, not via an archived intermediate (A→B, B→C becomes A→C, B→C).
|
|
284
|
+
// Without this, resolving "the live version of A" needs multi-hop through archived
|
|
285
|
+
// nodes, and single-hop supersedes resolution would land on a dead block.
|
|
286
|
+
// SKIP only `superseded_by` (createRelation auto-wires that inverse) + `part_of` (the
|
|
287
|
+
// winner already shares the scope). createRelation is idempotent + existence-guarded.
|
|
288
|
+
const raw = db.db;
|
|
289
|
+
const SKIP_REWIRE = new Set(['superseded_by', 'part_of']);
|
|
290
|
+
let rewired = 0;
|
|
291
|
+
try {
|
|
292
|
+
const out = raw.prepare(`SELECT target_id, type FROM relations WHERE source_id = ? AND valid_to IS NULL`).all(loserBlockId);
|
|
293
|
+
for (const r of out) {
|
|
294
|
+
if (SKIP_REWIRE.has(r.type) || r.target_id === winnerBlockId || r.target_id === loserBlockId)
|
|
295
|
+
continue;
|
|
296
|
+
const rr = db.createRelation({ source_id: winnerBlockId, target_id: r.target_id, type: r.type, created_by: 'flag-reviewer-merge' });
|
|
297
|
+
if (rr.status !== 'skipped' && rr.id)
|
|
298
|
+
rewired++;
|
|
299
|
+
}
|
|
300
|
+
const inc = raw.prepare(`SELECT source_id, type FROM relations WHERE target_id = ? AND valid_to IS NULL`).all(loserBlockId);
|
|
301
|
+
for (const r of inc) {
|
|
302
|
+
if (SKIP_REWIRE.has(r.type) || r.source_id === winnerBlockId || r.source_id === loserBlockId)
|
|
303
|
+
continue;
|
|
304
|
+
const rr = db.createRelation({ source_id: r.source_id, target_id: winnerBlockId, type: r.type, created_by: 'flag-reviewer-merge' });
|
|
305
|
+
if (rr.status !== 'skipped' && rr.id)
|
|
306
|
+
rewired++;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
catch (e) {
|
|
310
|
+
console.warn(`[flag-reviewer] rewire failed for loser=${loserBlockId}: ${e?.message ?? e} — proceeding with supersede+archive`);
|
|
311
|
+
}
|
|
312
|
+
if (rewired > 0)
|
|
313
|
+
console.log(`[flag-reviewer] merge rewired ${rewired} relation(s) loser=${loserBlockId} → winner=${winnerBlockId}`);
|
|
314
|
+
// createRelation verifies both blocks exist (returns a stub status='skipped'
|
|
315
|
+
// if not) and wires the inverse superseded_by. We do NOT depend on its
|
|
316
|
+
// type-conditional archive (see DESIGN NOTE above).
|
|
317
|
+
const rel = db.createRelation({
|
|
318
|
+
source_id: winnerBlockId,
|
|
319
|
+
target_id: loserBlockId,
|
|
320
|
+
type: 'supersedes',
|
|
321
|
+
created_by: 'flag-reviewer',
|
|
322
|
+
});
|
|
323
|
+
if (rel.status === 'skipped' || !rel.id) {
|
|
324
|
+
console.warn(`[flag-reviewer] merge skipped — one of winner=${winnerBlockId} loser=${loserBlockId} not found`);
|
|
325
|
+
return 'none';
|
|
326
|
+
}
|
|
327
|
+
// Collapse the duplicate: archive the loser regardless of block type. The
|
|
328
|
+
// supersedes edge above is the durable audit pointer (winner supersedes
|
|
329
|
+
// loser); this archive is what actually de-duplicates the graph.
|
|
330
|
+
const archived = db.archiveBlock(loserBlockId, `Merged into ${winnerBlockId} by flag-reviewer (confirmed duplicate)`);
|
|
331
|
+
if (!archived) {
|
|
332
|
+
console.warn(`[flag-reviewer] supersedes wired but archive failed for loser=${loserBlockId} — relation persists, block still active`);
|
|
333
|
+
// Relation IS written; report partial so the flag row reflects reality.
|
|
334
|
+
return 'none';
|
|
335
|
+
}
|
|
336
|
+
return 'archived_loser_and_wired_superseded_by';
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* One reviewer tick: read up to N pending flags, review each, write verdicts.
|
|
340
|
+
* Returns per-tick result for telemetry + log.
|
|
341
|
+
*
|
|
342
|
+
* This is the SINGLE PUBLIC entry point — flag-reviewer-startup.ts wraps it
|
|
343
|
+
* in setInterval, REST /api/flags/:id/review (Sub-step 2.4) can also invoke
|
|
344
|
+
* it synchronously for a specific flag (via filtered getPendingFlags +
|
|
345
|
+
* forceAutoMerge from request body).
|
|
346
|
+
*
|
|
347
|
+
* Per-flag failure is contained: errors increment the counter and the flag
|
|
348
|
+
* stays unreviewed (next tick picks it up). One bad flag does NOT crash the
|
|
349
|
+
* whole tick.
|
|
350
|
+
*/
|
|
351
|
+
export async function runFlagReviewerTick(opts) {
|
|
352
|
+
const rawDb = opts.db.db;
|
|
353
|
+
const limit = batchSize();
|
|
354
|
+
const pending = getPendingFlags(rawDb, { limit });
|
|
355
|
+
const result = {
|
|
356
|
+
reviewed: 0,
|
|
357
|
+
verdicts: { merge: 0, leave: 0, split: 0 },
|
|
358
|
+
actions_executed: 0,
|
|
359
|
+
routed_to_agent: 0,
|
|
360
|
+
errors: 0,
|
|
361
|
+
cost_usd: 0,
|
|
362
|
+
};
|
|
363
|
+
const allowAutoMerge = opts.forceAutoMerge ?? autoMergeEnabled();
|
|
364
|
+
const inputTokensBefore = reflectTokenStats.pass_reviewer.input;
|
|
365
|
+
const thinkingTokensBefore = reflectTokenStats.pass_reviewer.thinking;
|
|
366
|
+
const outputTokensBefore = reflectTokenStats.pass_reviewer.output;
|
|
367
|
+
let modelUsed;
|
|
368
|
+
let unpricedHit = false;
|
|
369
|
+
for (const flag of pending) {
|
|
370
|
+
// Deferral: island_candidate + entity_unresolved don't fit merge/leave/split
|
|
371
|
+
// cleanly — design §2.4 + §7 mark Sub-step 2.6 as the optional reviewer for
|
|
372
|
+
// these. For now: write 'leave' + a deferral reason so they don't re-block
|
|
373
|
+
// the queue. The flag stays in the DB for audit + future re-review.
|
|
374
|
+
if (flag.flag_type === 'island_candidate' || flag.flag_type === 'entity_unresolved') {
|
|
375
|
+
const ok = markFlagReviewed(rawDb, {
|
|
376
|
+
flag_id: flag.id,
|
|
377
|
+
verdict: 'leave',
|
|
378
|
+
reason: `Deferred: ${flag.flag_type} review requires Sub-step 2.6 (design §8 optional). Flag preserved for audit + manual review via /api/flags.`,
|
|
379
|
+
action_taken: 'none',
|
|
380
|
+
});
|
|
381
|
+
if (ok) {
|
|
382
|
+
result.reviewed += 1;
|
|
383
|
+
result.verdicts.leave += 1;
|
|
384
|
+
}
|
|
385
|
+
continue;
|
|
386
|
+
}
|
|
387
|
+
// Owner-unknown → the agent's call, not the autonomous reviewer's. Stage D's
|
|
388
|
+
// flag_for_review means "identity matches an existing block, but that block's
|
|
389
|
+
// owner is a catch-all/placeholder (genuinely unknown)". Deciding ownership needs
|
|
390
|
+
// context the reviewer lacks — the conversation + the ability to ask the user —
|
|
391
|
+
// so route it to the agent (no LLM, no auto-merge) instead of GUESSING which owner
|
|
392
|
+
// an orphan belongs to. Leaves reviewed_at NULL so the agent can still resolve via
|
|
393
|
+
// POST /api/flags/:id/review.
|
|
394
|
+
//
|
|
395
|
+
// Trigger is SPECIFIC: origin_writer='stage_d_resolve' AND scope_check='unknown'.
|
|
396
|
+
// scope_check='unknown' alone is NOT enough — D2 atomic-dups (stage_flag_dedup)
|
|
397
|
+
// and one AUDIT path also use 'unknown' as a default, but those are same-source /
|
|
398
|
+
// mechanical, not genuine owner-ambiguity. (Latent cleanup: make those writers
|
|
399
|
+
// set an honest scope_check so this could key on scope_check alone.)
|
|
400
|
+
if (flag.origin_writer === 'stage_d_resolve' && flag.scope_check === 'unknown') {
|
|
401
|
+
const ok = markFlagPendingClarification(rawDb, {
|
|
402
|
+
flag_id: flag.id,
|
|
403
|
+
reason: `Owner unknown — routed to the agent to confirm ownership (or ask the user). The reviewer must not guess which owner this matches.`,
|
|
404
|
+
});
|
|
405
|
+
if (ok)
|
|
406
|
+
result.routed_to_agent += 1;
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
try {
|
|
410
|
+
const ctx = buildReviewerContext(rawDb, flag);
|
|
411
|
+
if (!ctx) {
|
|
412
|
+
// Stale: block_a was archived/deleted between flag-write and review
|
|
413
|
+
const ok = markFlagReviewed(rawDb, {
|
|
414
|
+
flag_id: flag.id,
|
|
415
|
+
verdict: 'leave',
|
|
416
|
+
reason: `Stale: block_id_a=${flag.block_id_a} not found (archived?). Flag auto-resolved as no-op.`,
|
|
417
|
+
action_taken: 'none',
|
|
418
|
+
});
|
|
419
|
+
if (ok) {
|
|
420
|
+
result.reviewed += 1;
|
|
421
|
+
result.verdicts.leave += 1;
|
|
422
|
+
}
|
|
423
|
+
continue;
|
|
424
|
+
}
|
|
425
|
+
const llmResp = await callReviewerLLM(opts.provider, ctx);
|
|
426
|
+
if (!llmResp.result) {
|
|
427
|
+
result.errors += 1;
|
|
428
|
+
console.warn(`[flag-reviewer] LLM call failed for flag=${flag.id} (rateLimited=${llmResp.rateLimited}) — flag stays unreviewed`);
|
|
429
|
+
continue;
|
|
430
|
+
}
|
|
431
|
+
if (llmResp.model)
|
|
432
|
+
modelUsed = llmResp.model;
|
|
433
|
+
const v = llmResp.result;
|
|
434
|
+
// Safety: validate verdict + winning_block_id consistency. Narrow to the
|
|
435
|
+
// 3-way reviewer verdict (the schema enum) — ReviewVerdict is broader
|
|
436
|
+
// ('pending_clarification' | null are persistence states, not reviewer
|
|
437
|
+
// outputs). Anything off-enum collapses to 'leave' (safe no-op).
|
|
438
|
+
const validVerdict = (v.verdict === 'merge' || v.verdict === 'split') ? v.verdict : 'leave';
|
|
439
|
+
const validConfidence = ['high', 'medium', 'low'].includes(v.confidence)
|
|
440
|
+
? v.confidence : 'low';
|
|
441
|
+
// Decide action
|
|
442
|
+
let actionTaken = 'none';
|
|
443
|
+
let winningId = null;
|
|
444
|
+
let routedUnclear = false;
|
|
445
|
+
if (validVerdict === 'merge' && allowAutoMerge) {
|
|
446
|
+
// Validate winning_block_id is one of the candidates (defense vs LLM hallucination)
|
|
447
|
+
const validWinner = !!v.winning_block_id &&
|
|
448
|
+
(v.winning_block_id === flag.block_id_a || v.winning_block_id === flag.block_id_b);
|
|
449
|
+
if (validConfidence === 'high' && validWinner) {
|
|
450
|
+
const loser = v.winning_block_id === flag.block_id_a ? flag.block_id_b : flag.block_id_a;
|
|
451
|
+
if (loser) {
|
|
452
|
+
actionTaken = executeMerge(opts.db, v.winning_block_id, loser);
|
|
453
|
+
winningId = v.winning_block_id;
|
|
454
|
+
if (actionTaken !== 'none')
|
|
455
|
+
result.actions_executed += 1;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
// Merge-LEAN but not confidently auto-executable: either confidence is
|
|
460
|
+
// below 'high' (the reviewer reads SAME claim but isn't sure — a reworded
|
|
461
|
+
// / drift dup is 'medium' by the confidence rubric, never 'high'), or the
|
|
462
|
+
// LLM named a winner outside the candidate pair. Do NOT silently record-
|
|
463
|
+
// and-drop (the dup would persist + re-flag forever) and do NOT auto-archive
|
|
464
|
+
// on weak evidence (a wrong merge corrupts the graph). Route to the AGENT,
|
|
465
|
+
// which has the conversation + can ask the user. ("system FLAGS, reasoning
|
|
466
|
+
// MERGES, the agent resolves the genuinely-unclear ones.")
|
|
467
|
+
const why = validConfidence !== 'high'
|
|
468
|
+
? `confidence=${validConfidence} (below the auto-merge bar)`
|
|
469
|
+
: `winner="${v.winning_block_id ?? 'none'}" not in the candidate pair`;
|
|
470
|
+
const ok = markFlagPendingClarification(rawDb, {
|
|
471
|
+
flag_id: flag.id,
|
|
472
|
+
reason: `Reviewer leans MERGE but ${why} — routed to the agent to confirm these are the same claim reworded (or to keep them separate). Reviewer reason: ${v.reason || '(none)'}`,
|
|
473
|
+
});
|
|
474
|
+
if (ok) {
|
|
475
|
+
result.routed_to_agent += 1;
|
|
476
|
+
routedUnclear = true;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
else if (validVerdict === 'merge' && !allowAutoMerge) {
|
|
481
|
+
// Level 1 verdict-only: record the LLM's choice but DON'T act (operator chose
|
|
482
|
+
// manual REST review; agent-routing is reserved for the auto-merge path).
|
|
483
|
+
winningId = v.winning_block_id ?? null;
|
|
484
|
+
}
|
|
485
|
+
if (!routedUnclear) {
|
|
486
|
+
const ok = markFlagReviewed(rawDb, {
|
|
487
|
+
flag_id: flag.id,
|
|
488
|
+
verdict: validVerdict,
|
|
489
|
+
reason: v.reason || `(LLM returned no reason; confidence=${validConfidence})`,
|
|
490
|
+
action_taken: actionTaken,
|
|
491
|
+
winning_block_id: winningId,
|
|
492
|
+
});
|
|
493
|
+
if (ok) {
|
|
494
|
+
result.reviewed += 1;
|
|
495
|
+
result.verdicts[validVerdict] += 1;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
catch (e) {
|
|
500
|
+
result.errors += 1;
|
|
501
|
+
console.warn(`[flag-reviewer] threw on flag=${flag.id}: ${e?.message ?? e}`);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
// Bill the tick's $$ for telemetry — read the delta of pass_reviewer stats
|
|
505
|
+
const inputDelta = reflectTokenStats.pass_reviewer.input - inputTokensBefore;
|
|
506
|
+
const thinkingDelta = reflectTokenStats.pass_reviewer.thinking - thinkingTokensBefore;
|
|
507
|
+
const outputDelta = reflectTokenStats.pass_reviewer.output - outputTokensBefore;
|
|
508
|
+
if (modelUsed) {
|
|
509
|
+
const tickStats = { input: inputDelta, thinking: thinkingDelta, output: outputDelta, calls: result.reviewed };
|
|
510
|
+
const billed = computeCost(tickStats, modelUsed);
|
|
511
|
+
if (billed === null)
|
|
512
|
+
unpricedHit = true;
|
|
513
|
+
else
|
|
514
|
+
result.cost_usd = billed;
|
|
515
|
+
}
|
|
516
|
+
if (unpricedHit)
|
|
517
|
+
result.cost_usd = null;
|
|
518
|
+
return result;
|
|
519
|
+
}
|
|
520
|
+
//# sourceMappingURL=flag-reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flag-reviewer.js","sourceRoot":"","sources":["../../../src/middleware/reflect/flag-reviewer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { WorkspaceDB } from "../../store/database.js";
|
|
2
|
+
import type { LLMProvider } from "../../engine/ai-provider.js";
|
|
3
|
+
/** Gate. Default OFF — the inline merge only runs when explicitly opted in. */
|
|
4
|
+
export declare function inlineDedupEnabled(): boolean;
|
|
5
|
+
export interface InlineDedupResult {
|
|
6
|
+
/** block_dup_candidate flags written this call. */
|
|
7
|
+
flagsWritten: number;
|
|
8
|
+
/** Merges the reviewer actually executed (either side may be the loser). */
|
|
9
|
+
merges: number;
|
|
10
|
+
/** Flags routed to the agent (merge-lean but not confidently auto-mergeable). */
|
|
11
|
+
routed: number;
|
|
12
|
+
/** Ids of the NEW (this-turn) blocks the reviewer archived (merged away). */
|
|
13
|
+
mergedAway: Set<string>;
|
|
14
|
+
/** Labels of those same merged-away blocks (so the caller can prune its
|
|
15
|
+
* saved_labels precisely, without an id→label re-lookup post-archive). */
|
|
16
|
+
mergedAwayLabels: Set<string>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Dedup this turn's new blocks against the existing graph, BEFORE Pass 4 links.
|
|
20
|
+
*
|
|
21
|
+
* @param newBlockIds the ids Pass 3 just created (still status='pending').
|
|
22
|
+
* @returns which of those ids the reviewer merged away (archived) — the caller
|
|
23
|
+
* drops them from the pending set so they never reach Pass 4 / Pass 5.
|
|
24
|
+
*/
|
|
25
|
+
export declare function dedupNewBlocksInline(db: WorkspaceDB, provider: LLMProvider, newBlockIds: string[]): Promise<InlineDedupResult>;
|
|
26
|
+
//# sourceMappingURL=inline-dedup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-dedup.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/inline-dedup.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAY/D,+EAA+E;AAC/E,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED,MAAM,WAAW,iBAAiB;IAChC,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB;+EAC2E;IAC3E,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,WAAW,EACf,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,iBAAiB,CAAC,CA4E5B"}
|