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,563 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
// DEBT 5 Slice 2 Sub-step 2.3 — STAGE AUDIT (graph-health background scan)
|
|
3
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// The SECOND writer to pipeline_flags (complements Slice 1's Stage FLAG, which
|
|
6
|
+
// fires per-pipeline-run). Stage AUDIT runs periodically over the WHOLE graph
|
|
7
|
+
// and detects cross-block patterns no single pipeline run can see:
|
|
8
|
+
//
|
|
9
|
+
// project_dup_candidate — two type='project' roots with high concept overlap
|
|
10
|
+
// and no cross-link (cross-customer / cross-arc
|
|
11
|
+
// anaphora Stage C missed)
|
|
12
|
+
// scope_disagreement — two blocks sharing the SAME source_excerpt but
|
|
13
|
+
// living under DIFFERENT project scopes (scope
|
|
14
|
+
// contamination — same source text filed twice)
|
|
15
|
+
// island_candidate — two blocks with strong concept overlap but NO
|
|
16
|
+
// relation between them (a missed supports/relates_to)
|
|
17
|
+
//
|
|
18
|
+
// Stage AUDIT does NOT call the LLM. It only WRITES flags. The async reviewer
|
|
19
|
+
// (Sub-step 2.2) is the LLM consumer that decides merge/leave/split.
|
|
20
|
+
//
|
|
21
|
+
// Design contract: docs/PIPELINE-SLICE-2-DESIGN.md §3.
|
|
22
|
+
// Worker pattern: stage-audit-startup wraps this in setInterval (folded into
|
|
23
|
+
// flag-reviewer-startup.ts-style wiring at Sub-step 2.4 / server bootstrap).
|
|
24
|
+
//
|
|
25
|
+
// Charter Rule 5 (producers disjoint): each flag_type has exactly ONE writer.
|
|
26
|
+
// AUDIT owns project_dup_candidate / scope_disagreement / island_candidate.
|
|
27
|
+
// Stage FLAG owns atomic_dup_candidate. Stage C owns entity_unresolved.
|
|
28
|
+
//
|
|
29
|
+
// What this module does NOT do:
|
|
30
|
+
// - LLM calls (reviewer's job)
|
|
31
|
+
// - mutate blocks/relations (reviewer's job; AUDIT is read + write-flag only)
|
|
32
|
+
// - cosine/embedding similarity (cheaper concept + source_excerpt signals
|
|
33
|
+
// for now; cosine is a future enhancement — see SCALE NOTE)
|
|
34
|
+
// - cross-graph resolve (that's Slice 3 Stage D)
|
|
35
|
+
// - scan archived blocks (getAllBlocks already excludes status='archived')
|
|
36
|
+
import { cosineSim } from "../../engine/vector-math.js";
|
|
37
|
+
import { intFromEnv } from "./config.js";
|
|
38
|
+
import { writePipelineFlag } from "./pipeline-flags.js";
|
|
39
|
+
import { extractPrimaryValueFromUnique } from "./dedup-by-source-and-value.js";
|
|
40
|
+
import { budgetTripped } from "./cost-guard.js";
|
|
41
|
+
// ─── Config (env-controlled) ──────────────────────────────────────────────────
|
|
42
|
+
/** Jaccard threshold for project_dup_candidate (concept-set overlap). */
|
|
43
|
+
function projectDupThreshold() {
|
|
44
|
+
const v = parseFloat(process.env.NODEDEX_AUDIT_PROJECT_DUP_THRESHOLD ?? "");
|
|
45
|
+
return Number.isFinite(v) && v > 0 && v <= 1 ? v : 0.6;
|
|
46
|
+
}
|
|
47
|
+
/** Min shared concepts for island_candidate. */
|
|
48
|
+
function islandSharedMin() {
|
|
49
|
+
return intFromEnv("NODEDEX_AUDIT_ISLAND_SHARED_MIN", 3);
|
|
50
|
+
}
|
|
51
|
+
/** Max pairwise comparisons per tick — bounds O(n²) wall time. Pairs beyond
|
|
52
|
+
* this are deferred to the next tick (round-robin via the block-id offset).
|
|
53
|
+
* SCALE NOTE: at 10000+ blocks, replace the pairwise scan with the retrieval
|
|
54
|
+
* mechanism Slice 3/4 builds (design §3.3). */
|
|
55
|
+
function maxPairsPerTick() {
|
|
56
|
+
return intFromEnv("NODEDEX_AUDIT_MAX_PAIRS", 5000);
|
|
57
|
+
}
|
|
58
|
+
/** Min shared ESSENCE tokens for a project-dup candidate (the recall net for
|
|
59
|
+
* DRIFTED-concept fork pairs the concept-jaccard misses — see the project_dup
|
|
60
|
+
* branch). Recognition-layer step 4 (heal existing forks). */
|
|
61
|
+
function essenceOverlapMin() {
|
|
62
|
+
return intFromEnv("NODEDEX_AUDIT_ESSENCE_MIN", 2);
|
|
63
|
+
}
|
|
64
|
+
/** Block-dup detector: ON only when opted in. AUDIT itself may be on (live) while
|
|
65
|
+
* this newer block-level detection stays silent — so it never adds block_dup
|
|
66
|
+
* flags to an existing AUDIT user without an explicit opt-in. Default OFF. */
|
|
67
|
+
function blockDupDetectEnabled() {
|
|
68
|
+
// Default ON (locked-on dup detection — validated 2026-06-20); set =off for dev/test.
|
|
69
|
+
return (process.env.NODEDEX_BLOCK_DUP_DETECT ?? "").toLowerCase() !== "off";
|
|
70
|
+
}
|
|
71
|
+
/** Min shared CLAIM tokens (on unique{} primary_value) for a block_dup candidate.
|
|
72
|
+
* Anchored on the CLAIM, not the essence: essence carries TOPIC ("pydantic",
|
|
73
|
+
* "validation", "fastapi") which over-flags in a dense single-project graph
|
|
74
|
+
* (real-data validation: 33 pairs, ~30 false). primary_value is the per-type
|
|
75
|
+
* identity (PRIMARY_KEYS) — the same-claim signal a dup actually IS. The reviewer
|
|
76
|
+
* is the precision judge, so this is recall-tuned. */
|
|
77
|
+
function blockDupClaimMin() {
|
|
78
|
+
return intFromEnv("NODEDEX_BLOCK_DUP_CLAIM_MIN", 3);
|
|
79
|
+
}
|
|
80
|
+
/** DRIFT recall (default OFF). Also flag a block_dup candidate when two SAME-TYPE
|
|
81
|
+
* blocks under the same scope are SEMANTICALLY near-identical (cosine on the stored
|
|
82
|
+
* label+essence+concepts embedding). This catches reworded IDENTITY the exact/token
|
|
83
|
+
* match misses — e.g. approach "Sliding Window Log" vs "Sliding Window Logging".
|
|
84
|
+
* The SAME-TYPE gate + a high threshold limit the topic-similarity false flags that
|
|
85
|
+
* essence-meaning over-flags on (e.g. a Redis fact vs a Redis constraint); the
|
|
86
|
+
* reviewer remains the precision judge, so this stays recall-tuned. Opt-in so it
|
|
87
|
+
* never widens flags for existing block-dup users without an explicit choice. */
|
|
88
|
+
function blockDupEmbedEnabled() {
|
|
89
|
+
return (process.env.NODEDEX_BLOCK_DUP_EMBED ?? "").toLowerCase() === "on";
|
|
90
|
+
}
|
|
91
|
+
function blockDupEmbedMin() {
|
|
92
|
+
const v = parseFloat(process.env.NODEDEX_BLOCK_DUP_EMBED_MIN ?? "");
|
|
93
|
+
// Default 0.80: a real reworded restatement scored cosine 0.840 on live extraction
|
|
94
|
+
// (label+essence+concepts vector), while genuinely-different same-type claims sat at
|
|
95
|
+
// <=0.684 (worth-watch test, 2026-06-08) — a wide gap, so 0.80 catches drift with
|
|
96
|
+
// margin and false-flags nothing. Recall-biased on purpose: a false flag is filtered
|
|
97
|
+
// by the reviewer (cheap), a missed dup persists forever (expensive). Env-tunable.
|
|
98
|
+
return Number.isFinite(v) && v > 0 && v <= 1 ? v : 0.80;
|
|
99
|
+
}
|
|
100
|
+
// ─── Pure helpers (no DB, no LLM — unit-testable) ──────────────────────────────
|
|
101
|
+
/** Jaccard similarity of two concept sets: |A∩B| / |A∪B|. 0 when both empty. */
|
|
102
|
+
export function jaccard(a, b) {
|
|
103
|
+
if (a.length === 0 && b.length === 0)
|
|
104
|
+
return 0;
|
|
105
|
+
const setA = new Set(a.map(s => s.toLowerCase().trim()));
|
|
106
|
+
const setB = new Set(b.map(s => s.toLowerCase().trim()));
|
|
107
|
+
let inter = 0;
|
|
108
|
+
for (const x of setA)
|
|
109
|
+
if (setB.has(x))
|
|
110
|
+
inter += 1;
|
|
111
|
+
const union = setA.size + setB.size - inter;
|
|
112
|
+
return union === 0 ? 0 : inter / union;
|
|
113
|
+
}
|
|
114
|
+
/** Count shared concepts (case-insensitive). */
|
|
115
|
+
export function sharedConceptCount(a, b) {
|
|
116
|
+
const setB = new Set(b.map(s => s.toLowerCase().trim()));
|
|
117
|
+
let n = 0;
|
|
118
|
+
const seen = new Set();
|
|
119
|
+
for (const x of a) {
|
|
120
|
+
const k = x.toLowerCase().trim();
|
|
121
|
+
if (setB.has(k) && !seen.has(k)) {
|
|
122
|
+
n += 1;
|
|
123
|
+
seen.add(k);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return n;
|
|
127
|
+
}
|
|
128
|
+
// Common words that carry no domain signal — excluded from the essence-overlap
|
|
129
|
+
// recall signal so two unrelated roots don't pair on "this/that/with". NOT an
|
|
130
|
+
// exhaustive list; just the high-frequency noise. Real domain words (coffee,
|
|
131
|
+
// roasting, billing, customer) are what we want to match on.
|
|
132
|
+
const ESSENCE_STOPWORDS = new Set([
|
|
133
|
+
"the", "and", "for", "with", "this", "that", "from", "into", "your", "you", "are", "not",
|
|
134
|
+
"but", "has", "was", "its", "our", "their", "other", "some", "more", "than", "then", "over",
|
|
135
|
+
"onto", "only", "also", "such", "when", "what", "which", "both", "each", "per", "about",
|
|
136
|
+
"these", "those", "they", "them", "have", "will", "would", "should", "could", "been",
|
|
137
|
+
]);
|
|
138
|
+
/** Count distinct shared SIGNIFICANT tokens between two essences (descriptions).
|
|
139
|
+
* The recall net for drifted-concept fork pairs: two roots about the same domain
|
|
140
|
+
* share domain words in their descriptions even when their concept tags drift
|
|
141
|
+
* (measured: home-coffee-roasting vs ...-activities had 0 concept overlap but
|
|
142
|
+
* share "coffee"+"roasting" in essence). Keys on the DESCRIPTION (meaning), not
|
|
143
|
+
* the label (name-vs-meaning). Pure / testable. */
|
|
144
|
+
export function sharedEssenceTokens(a, b) {
|
|
145
|
+
const tok = (s) => new Set((s ?? "").toLowerCase().split(/[^a-z0-9]+/)
|
|
146
|
+
.filter((w) => w.length >= 4 && !ESSENCE_STOPWORDS.has(w)));
|
|
147
|
+
const ta = tok(a), tb = tok(b);
|
|
148
|
+
let n = 0;
|
|
149
|
+
for (const w of ta)
|
|
150
|
+
if (tb.has(w))
|
|
151
|
+
n += 1;
|
|
152
|
+
return n;
|
|
153
|
+
}
|
|
154
|
+
// cosineSim now lives in engine/vector-math.ts (single source). Re-exported for
|
|
155
|
+
// callers that import it from this module.
|
|
156
|
+
export { cosineSim };
|
|
157
|
+
export function toAuditBlock(b) {
|
|
158
|
+
let concepts = [];
|
|
159
|
+
try {
|
|
160
|
+
const parsed = JSON.parse(b.concepts ?? "[]");
|
|
161
|
+
if (Array.isArray(parsed))
|
|
162
|
+
concepts = parsed;
|
|
163
|
+
}
|
|
164
|
+
catch { /* tolerate */ }
|
|
165
|
+
// Identity value lives in content.unique{} (NOT label/essence). Parse it +
|
|
166
|
+
// extract the per-type primary value the SAME way D2 dedup does.
|
|
167
|
+
let unique = {};
|
|
168
|
+
try {
|
|
169
|
+
const c = JSON.parse(b.content ?? "{}");
|
|
170
|
+
if (c && typeof c.unique === "object" && c.unique !== null)
|
|
171
|
+
unique = c.unique;
|
|
172
|
+
}
|
|
173
|
+
catch { /* tolerate */ }
|
|
174
|
+
const primary_value = extractPrimaryValueFromUnique(b.type, unique).trim().toLowerCase();
|
|
175
|
+
let embedding = null;
|
|
176
|
+
try {
|
|
177
|
+
const e = b.embedding;
|
|
178
|
+
if (typeof e === "string" && e.length > 0) {
|
|
179
|
+
const v = JSON.parse(e);
|
|
180
|
+
if (Array.isArray(v))
|
|
181
|
+
embedding = v;
|
|
182
|
+
}
|
|
183
|
+
else if (Array.isArray(e))
|
|
184
|
+
embedding = e;
|
|
185
|
+
}
|
|
186
|
+
catch { /* tolerate malformed embedding */ }
|
|
187
|
+
return {
|
|
188
|
+
id: b.id,
|
|
189
|
+
label: b.label,
|
|
190
|
+
type: b.type,
|
|
191
|
+
concepts,
|
|
192
|
+
project_id: b.project_id ?? null,
|
|
193
|
+
source_excerpt: b.source_excerpt ?? null,
|
|
194
|
+
primary_value,
|
|
195
|
+
essence: b.essence ?? "",
|
|
196
|
+
embedding,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/** Read the block-dup judge config once, from the SAME env readers the periodic
|
|
200
|
+
* AUDIT uses, so the inline recognize-before-write path can never drift apart
|
|
201
|
+
* from the AUDIT scan. */
|
|
202
|
+
export function blockDupJudgeOpts() {
|
|
203
|
+
return { claimMin: blockDupClaimMin(), embedOn: blockDupEmbedEnabled(), embedMin: blockDupEmbedMin() };
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* DO: decide whether two blocks are a same-scope duplicate CANDIDATE — exact
|
|
207
|
+
* primary_value, primary_value token-overlap, or (opt-in) near-identical
|
|
208
|
+
* same-type essence embedding (the drift net).
|
|
209
|
+
* SERVE: compounding — one piece of residue should be ONE block. This is the
|
|
210
|
+
* RECALL stage; the flag-reviewer is the precision judge.
|
|
211
|
+
* CARRY: identity is unique{} primary_value, NOT label/essence; same-scope
|
|
212
|
+
* (project_id) is the merge guard — a cross-scope same-claim pair is a
|
|
213
|
+
* scope_disagreement (never merged), so it can never be a candidate here.
|
|
214
|
+
*
|
|
215
|
+
* Pure: no DB, no LLM. The supersedes-skip + flag idempotency are caller-side
|
|
216
|
+
* (they need the DB). This is the ONE implementation shared by the periodic
|
|
217
|
+
* AUDIT (runStageAuditTick) and the inline path (dedupNewBlocksInline) — so the
|
|
218
|
+
* two seams detect identically (Rule 5 spirit: one detection, two timings).
|
|
219
|
+
*/
|
|
220
|
+
export function judgeBlockDupPair(a, b, opts) {
|
|
221
|
+
const sameScope = a.project_id != null && a.project_id === b.project_id;
|
|
222
|
+
if (!sameScope)
|
|
223
|
+
return { isCandidate: false, sameScope: false, signal: null, claimTokens: 0, embedSim: 0 };
|
|
224
|
+
const sameIdentity = a.primary_value.length > 0 && a.primary_value === b.primary_value;
|
|
225
|
+
const claimTokens = sharedEssenceTokens(a.primary_value, b.primary_value);
|
|
226
|
+
// SAME-TYPE gate on the token-overlap signal (2026-06-15): a primary_value token
|
|
227
|
+
// overlap is a dup CANDIDATE only when the two blocks share the same epistemic role.
|
|
228
|
+
// Different types are different kinds of knowledge — "almost never duplicates" (the
|
|
229
|
+
// reviewer's own rule) — and in a dense single-domain graph the shared domain tokens
|
|
230
|
+
// (useFetch/hook/state) otherwise flood the queue with cross-type false candidates.
|
|
231
|
+
// This aligns the token signal with the embedding signal below, which ALREADY requires
|
|
232
|
+
// same-type. Measured on the collapse-e2e graph: 66→15 candidates, real dup preserved.
|
|
233
|
+
// (A concept-overlap gate was rejected — it cut 66→3 but LOST the real dup pair.)
|
|
234
|
+
// Exact-identity (sameIdentity) stays type-agnostic: an identical primary_value is a
|
|
235
|
+
// strong enough signal to flag regardless of type.
|
|
236
|
+
const byClaim = claimTokens >= opts.claimMin && a.type === b.type;
|
|
237
|
+
const embedSim = (opts.embedOn && a.type === b.type && a.embedding && b.embedding)
|
|
238
|
+
? cosineSim(a.embedding, b.embedding) : 0;
|
|
239
|
+
const byEmbedding = embedSim >= opts.embedMin && embedSim > 0;
|
|
240
|
+
const isCandidate = sameIdentity || byClaim || byEmbedding;
|
|
241
|
+
const signal = !isCandidate ? null
|
|
242
|
+
: sameIdentity ? 'primary_value_exact'
|
|
243
|
+
: byClaim ? 'primary_value_overlap'
|
|
244
|
+
: 'essence_embedding';
|
|
245
|
+
return { isCandidate, sameScope, signal, claimTokens, embedSim };
|
|
246
|
+
}
|
|
247
|
+
// ─── Relation + flag existence (idempotency) ───────────────────────────────────
|
|
248
|
+
/** True if any active relation exists between the pair in EITHER direction. */
|
|
249
|
+
function hasRelationBetween(raw, idA, idB) {
|
|
250
|
+
const row = raw.prepare(`
|
|
251
|
+
SELECT 1 FROM relations
|
|
252
|
+
WHERE valid_to IS NULL
|
|
253
|
+
AND ((source_id = @a AND target_id = @b) OR (source_id = @b AND target_id = @a))
|
|
254
|
+
LIMIT 1
|
|
255
|
+
`).get({ a: idA, b: idB });
|
|
256
|
+
return !!row;
|
|
257
|
+
}
|
|
258
|
+
/** True if a supersedes/superseded_by relation exists between the pair (either
|
|
259
|
+
* direction). Used by the block_dup detector to SKIP pairs already in a
|
|
260
|
+
* replacement chain (the recap "reconfirmed → abandoned" case): the supersede
|
|
261
|
+
* mechanism already collapsed them, re-flagging is redundant. Deliberately
|
|
262
|
+
* NARROWER than hasRelationBetween — a `supports`/`contradicts` edge between two
|
|
263
|
+
* same-claim blocks is NOT a dedup and must NOT suppress the flag (the 50ms-SLA
|
|
264
|
+
* pair carries a `supports` edge yet is still an un-merged duplicate). */
|
|
265
|
+
export function hasSupersedesBetween(raw, idA, idB) {
|
|
266
|
+
const row = raw.prepare(`
|
|
267
|
+
SELECT 1 FROM relations
|
|
268
|
+
WHERE valid_to IS NULL
|
|
269
|
+
AND type IN ('supersedes', 'superseded_by')
|
|
270
|
+
AND ((source_id = @a AND target_id = @b) OR (source_id = @b AND target_id = @a))
|
|
271
|
+
LIMIT 1
|
|
272
|
+
`).get({ a: idA, b: idB });
|
|
273
|
+
return !!row;
|
|
274
|
+
}
|
|
275
|
+
/** True if a flag of this type already exists for the pair (either direction),
|
|
276
|
+
* reviewed OR not. Prevents re-flagging a known pair on every tick (incl.
|
|
277
|
+
* re-spending reviewer $$ on a pair already verdicted 'leave'). */
|
|
278
|
+
export function flagAlreadyExists(raw, flag_type, idA, idB) {
|
|
279
|
+
const row = raw.prepare(`
|
|
280
|
+
SELECT 1 FROM pipeline_flags
|
|
281
|
+
WHERE flag_type = @t
|
|
282
|
+
AND ((block_id_a = @a AND block_id_b = @b) OR (block_id_a = @b AND block_id_b = @a))
|
|
283
|
+
LIMIT 1
|
|
284
|
+
`).get({ t: flag_type, a: idA, b: idB });
|
|
285
|
+
return !!row;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* One Stage AUDIT tick: scan blocks pairwise, write flags for the 3 audit
|
|
289
|
+
* patterns. Bounded by maxPairsPerTick. Idempotent — never re-flags a pair
|
|
290
|
+
* already in pipeline_flags for that type.
|
|
291
|
+
*
|
|
292
|
+
* Returns per-tick result for telemetry + log + the next-tick offset.
|
|
293
|
+
*
|
|
294
|
+
* Per-pair precedence to avoid double-flagging the same pair:
|
|
295
|
+
* both type='project' → project_dup_candidate only (skip scope/island)
|
|
296
|
+
* else same source_excerpt + different project → scope_disagreement
|
|
297
|
+
* else strong concept overlap + no link → island_candidate
|
|
298
|
+
*/
|
|
299
|
+
export function runStageAuditTick(opts) {
|
|
300
|
+
const t0 = Date.now();
|
|
301
|
+
const raw = opts.db.db;
|
|
302
|
+
const result = {
|
|
303
|
+
scanned_pairs: 0,
|
|
304
|
+
flags_written: { project_dup_candidate: 0, scope_disagreement: 0, island_candidate: 0, block_dup_candidate: 0 },
|
|
305
|
+
flags_skipped_already_pending: 0,
|
|
306
|
+
errors: 0,
|
|
307
|
+
wall_ms: 0,
|
|
308
|
+
};
|
|
309
|
+
let blocks;
|
|
310
|
+
try {
|
|
311
|
+
blocks = opts.db.getAllBlocks().map(toAuditBlock);
|
|
312
|
+
}
|
|
313
|
+
catch (e) {
|
|
314
|
+
result.errors += 1;
|
|
315
|
+
result.wall_ms = Date.now() - t0;
|
|
316
|
+
console.warn(`[stage-audit] getAllBlocks threw: ${e?.message ?? e}`);
|
|
317
|
+
return result;
|
|
318
|
+
}
|
|
319
|
+
const projDupThresh = projectDupThreshold();
|
|
320
|
+
const essMin = essenceOverlapMin();
|
|
321
|
+
const islandMin = islandSharedMin();
|
|
322
|
+
const pairCap = maxPairsPerTick();
|
|
323
|
+
const blockDupOn = blockDupDetectEnabled();
|
|
324
|
+
const blockDupEmbedOn = blockDupEmbedEnabled();
|
|
325
|
+
const embedMin = blockDupEmbedMin();
|
|
326
|
+
const blockDupClaim = blockDupClaimMin();
|
|
327
|
+
const n = blocks.length;
|
|
328
|
+
const start = Math.min(opts.startOffset ?? 0, Math.max(0, n - 1));
|
|
329
|
+
outer: for (let i = start; i < n; i++) {
|
|
330
|
+
const a = blocks[i];
|
|
331
|
+
for (let j = i + 1; j < n; j++) {
|
|
332
|
+
if (result.scanned_pairs >= pairCap)
|
|
333
|
+
break outer;
|
|
334
|
+
const b = blocks[j];
|
|
335
|
+
result.scanned_pairs += 1;
|
|
336
|
+
try {
|
|
337
|
+
// ── project_dup_candidate: both projects, high concept overlap, no link
|
|
338
|
+
if (a.type === 'project' && b.type === 'project') {
|
|
339
|
+
// Recall = concept-jaccard OR shared-essence-tokens. The essence signal
|
|
340
|
+
// catches DRIFTED-concept fork pairs the jaccard misses (the
|
|
341
|
+
// recognizer-validated gap: home-coffee-roasting vs ...-activities had
|
|
342
|
+
// ~0 concept overlap but share "coffee"+"roasting" in essence). Detection
|
|
343
|
+
// is RECALL only + LLM-free; the flag-reviewer is the precision judge
|
|
344
|
+
// (same domain + same owner -> merge; different scope -> leave), so a
|
|
345
|
+
// looser recall is safe (false pairs get 'leave').
|
|
346
|
+
const conceptJac = jaccard(a.concepts, b.concepts);
|
|
347
|
+
const essTokens = sharedEssenceTokens(a.essence, b.essence);
|
|
348
|
+
const byConcept = conceptJac >= projDupThresh;
|
|
349
|
+
const byEssence = essTokens >= essMin;
|
|
350
|
+
if ((byConcept || byEssence) && !hasRelationBetween(raw, a.id, b.id)) {
|
|
351
|
+
if (flagAlreadyExists(raw, 'project_dup_candidate', a.id, b.id)) {
|
|
352
|
+
result.flags_skipped_already_pending += 1;
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
writePipelineFlag(raw, {
|
|
356
|
+
flag_type: 'project_dup_candidate',
|
|
357
|
+
block_id_a: a.id,
|
|
358
|
+
block_id_b: b.id,
|
|
359
|
+
criteria: {
|
|
360
|
+
jaccard: Number(conceptJac.toFixed(3)),
|
|
361
|
+
shared_essence_tokens: essTokens,
|
|
362
|
+
signal: byConcept ? (byEssence ? 'concept+essence' : 'concept') : 'essence',
|
|
363
|
+
shared_concepts: a.concepts.filter(c => b.concepts.map(x => x.toLowerCase()).includes(c.toLowerCase())),
|
|
364
|
+
label_a: a.label, label_b: b.label,
|
|
365
|
+
},
|
|
366
|
+
scope_check: 'different',
|
|
367
|
+
origin_writer: 'stage_audit_project_dup',
|
|
368
|
+
origin_range_id: null,
|
|
369
|
+
});
|
|
370
|
+
result.flags_written.project_dup_candidate += 1;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
continue; // both-projects pair handled — don't also scope/island it
|
|
374
|
+
}
|
|
375
|
+
// ── scope_disagreement: SAME identity (unique{} primary value) under
|
|
376
|
+
// DIFFERENT owner (project_id). Identity is content.unique{}, NOT
|
|
377
|
+
// label/essence/source_excerpt (per [[feedback-identity-is-unique-
|
|
378
|
+
// not-label]] + the provider-drift finding). This catches the EXACT
|
|
379
|
+
// cross-owner collision precisely: "the same specific claim is filed
|
|
380
|
+
// under two different projects." It does NOT catch paraphrased-same-
|
|
381
|
+
// meaning across owners (different words → different primary_value) —
|
|
382
|
+
// that's PARAPHRASE = LLM territory (Stage D / Slice 3 + reviewer),
|
|
383
|
+
// explicitly not solved in code per the identity memory. The code
|
|
384
|
+
// AUDIT is the precise smoke alarm; Stage D is the semantic sprinkler.
|
|
385
|
+
const sameIdentity = a.primary_value.length > 0 && a.primary_value === b.primary_value;
|
|
386
|
+
const differentScope = (a.project_id ?? null) !== (b.project_id ?? null);
|
|
387
|
+
if (sameIdentity && differentScope) {
|
|
388
|
+
if (flagAlreadyExists(raw, 'scope_disagreement', a.id, b.id)) {
|
|
389
|
+
result.flags_skipped_already_pending += 1;
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
writePipelineFlag(raw, {
|
|
393
|
+
flag_type: 'scope_disagreement',
|
|
394
|
+
block_id_a: a.id,
|
|
395
|
+
block_id_b: b.id,
|
|
396
|
+
criteria: {
|
|
397
|
+
similarity_type: 'unique_primary_value',
|
|
398
|
+
primary_value: a.primary_value.slice(0, 200),
|
|
399
|
+
scope_a: a.project_id, scope_b: b.project_id,
|
|
400
|
+
},
|
|
401
|
+
scope_check: 'different',
|
|
402
|
+
origin_writer: 'stage_audit_scope',
|
|
403
|
+
origin_range_id: null,
|
|
404
|
+
});
|
|
405
|
+
result.flags_written.scope_disagreement += 1;
|
|
406
|
+
}
|
|
407
|
+
continue; // scope handled — don't also island it
|
|
408
|
+
}
|
|
409
|
+
// ── block_dup_candidate: two NON-root blocks under the SAME scope that look
|
|
410
|
+
// like the same claim — the recap-restatement gap (reworded same claim
|
|
411
|
+
// OR same claim re-typed). Recall = same primary_value (exact identity)
|
|
412
|
+
// OR essence-token overlap (the reworded net). SAME-scope is the merge
|
|
413
|
+
// guard: cross-scope is scope_disagreement (handled above, must NOT merge);
|
|
414
|
+
// only same-scope pairs are merge candidates. The reviewer is the precision
|
|
415
|
+
// judge (merge/leave). Skips pairs already in a SUPERSEDES chain (the
|
|
416
|
+
// supersede mechanism already collapsed them) — but NOT pairs merely linked
|
|
417
|
+
// by supports/contradicts (those ARE the un-merged dups). Opt-in
|
|
418
|
+
// (NODEDEX_BLOCK_DUP_DETECT=on) so it stays silent for existing AUDIT users.
|
|
419
|
+
if (blockDupOn) {
|
|
420
|
+
// The pair-decision (same-scope gate + claim/embedding recall) is the ONE
|
|
421
|
+
// shared judge — reused verbatim by the inline recognize-before-write path
|
|
422
|
+
// so the two seams can never drift. Same-scope is the structural merge guard
|
|
423
|
+
// (cross-scope = scope_disagreement, handled above); identity is unique{}
|
|
424
|
+
// primary_value, NOT essence (essence carries topic and over-flags). The
|
|
425
|
+
// reviewer is the precision judge, so this stays recall-tuned.
|
|
426
|
+
const v = judgeBlockDupPair(a, b, { claimMin: blockDupClaim, embedOn: blockDupEmbedOn, embedMin });
|
|
427
|
+
if (v.isCandidate && !hasSupersedesBetween(raw, a.id, b.id)) {
|
|
428
|
+
if (flagAlreadyExists(raw, 'block_dup_candidate', a.id, b.id)) {
|
|
429
|
+
result.flags_skipped_already_pending += 1;
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
writePipelineFlag(raw, {
|
|
433
|
+
flag_type: 'block_dup_candidate',
|
|
434
|
+
block_id_a: a.id,
|
|
435
|
+
block_id_b: b.id,
|
|
436
|
+
criteria: {
|
|
437
|
+
signal: v.signal,
|
|
438
|
+
claim_tokens: v.claimTokens,
|
|
439
|
+
embed_sim: v.signal === 'essence_embedding' ? Number(v.embedSim.toFixed(3)) : undefined,
|
|
440
|
+
shared_concepts: sharedConceptCount(a.concepts, b.concepts),
|
|
441
|
+
primary_value: a.primary_value.slice(0, 200),
|
|
442
|
+
scope: a.project_id,
|
|
443
|
+
type_a: a.type, type_b: b.type,
|
|
444
|
+
label_a: a.label, label_b: b.label,
|
|
445
|
+
},
|
|
446
|
+
scope_check: 'same',
|
|
447
|
+
origin_writer: 'stage_audit_block_dup',
|
|
448
|
+
origin_range_id: null,
|
|
449
|
+
});
|
|
450
|
+
result.flags_written.block_dup_candidate += 1;
|
|
451
|
+
}
|
|
452
|
+
continue; // block-dup handled — don't also island it
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
// ── island_candidate: strong concept overlap, no relation
|
|
456
|
+
const shared = sharedConceptCount(a.concepts, b.concepts);
|
|
457
|
+
if (shared >= islandMin && !hasRelationBetween(raw, a.id, b.id)) {
|
|
458
|
+
if (flagAlreadyExists(raw, 'island_candidate', a.id, b.id)) {
|
|
459
|
+
result.flags_skipped_already_pending += 1;
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
writePipelineFlag(raw, {
|
|
463
|
+
flag_type: 'island_candidate',
|
|
464
|
+
block_id_a: a.id,
|
|
465
|
+
block_id_b: b.id,
|
|
466
|
+
criteria: {
|
|
467
|
+
shared_concept_count: shared,
|
|
468
|
+
shared_concepts: a.concepts.filter(c => b.concepts.map(x => x.toLowerCase()).includes(c.toLowerCase())),
|
|
469
|
+
potential_relation_type: 'relates_to',
|
|
470
|
+
},
|
|
471
|
+
scope_check: 'unknown',
|
|
472
|
+
origin_writer: 'stage_audit_islands',
|
|
473
|
+
origin_range_id: null,
|
|
474
|
+
});
|
|
475
|
+
result.flags_written.island_candidate += 1;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
catch (e) {
|
|
480
|
+
result.errors += 1;
|
|
481
|
+
console.warn(`[stage-audit] pair (${a.id}, ${b.id}) threw: ${e?.message ?? e}`);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
result.wall_ms = Date.now() - t0;
|
|
486
|
+
return result;
|
|
487
|
+
}
|
|
488
|
+
// ─── Timer wrapper (env-gated, mirror arc-inactivity-timer) ────────────────────
|
|
489
|
+
//
|
|
490
|
+
// Default OFF. Opt-in via NODEDEX_AUDIT_ENABLED=on. Longer interval than the
|
|
491
|
+
// reviewer (graph-wide scan; no need to be fast) — default 30 min. Round-robins
|
|
492
|
+
// the startOffset across ticks so large graphs eventually get full coverage.
|
|
493
|
+
let _auditHandle = null;
|
|
494
|
+
let _auditInFlight = false;
|
|
495
|
+
let _auditOffset = 0;
|
|
496
|
+
function auditEnabled() {
|
|
497
|
+
// Default ON (self-maintenance locked-on per release decision 2026-06-20); set =off for dev/test.
|
|
498
|
+
return (process.env.NODEDEX_AUDIT_ENABLED ?? "").toLowerCase() !== "off";
|
|
499
|
+
}
|
|
500
|
+
function auditIntervalMs() {
|
|
501
|
+
return intFromEnv("NODEDEX_AUDIT_INTERVAL_MS", 1_800_000); // 30 min default
|
|
502
|
+
}
|
|
503
|
+
async function auditTick(db) {
|
|
504
|
+
if (_auditInFlight) {
|
|
505
|
+
console.log("[stage-audit] tick still running, skipping this interval");
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
_auditInFlight = true;
|
|
509
|
+
try {
|
|
510
|
+
// Cost breaker (production gap 2, Phase B): self-gate before spending
|
|
511
|
+
// (audit's spend is embeddings; the flags it writes feed the gated reviewer).
|
|
512
|
+
const budget = await budgetTripped();
|
|
513
|
+
if (budget?.tripped) {
|
|
514
|
+
console.warn(`[stage-audit] tick skipped — cost breaker: ${budget.reason}`);
|
|
515
|
+
return;
|
|
516
|
+
}
|
|
517
|
+
const res = runStageAuditTick({ db, startOffset: _auditOffset });
|
|
518
|
+
// Advance the round-robin offset; wrap when we've covered the graph.
|
|
519
|
+
const total = db.getAllBlocks().length;
|
|
520
|
+
_auditOffset = res.scanned_pairs > 0 && total > 0 ? (_auditOffset + 1) % Math.max(1, total) : 0;
|
|
521
|
+
const w = res.flags_written;
|
|
522
|
+
if (w.project_dup_candidate + w.scope_disagreement + w.island_candidate > 0 || res.errors > 0) {
|
|
523
|
+
console.log(`[stage-audit] tick: pairs=${res.scanned_pairs} ` +
|
|
524
|
+
`flags={project_dup:${w.project_dup_candidate}, scope:${w.scope_disagreement}, island:${w.island_candidate}} ` +
|
|
525
|
+
`skipped=${res.flags_skipped_already_pending} errors=${res.errors} wall_ms=${res.wall_ms}`);
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
catch (e) {
|
|
529
|
+
console.warn(`[stage-audit] tick threw: ${e?.message ?? e}`);
|
|
530
|
+
}
|
|
531
|
+
finally {
|
|
532
|
+
_auditInFlight = false;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
/** Start the Stage AUDIT timer. Idempotent; returns true if started. */
|
|
536
|
+
export function startStageAuditTimer(db) {
|
|
537
|
+
if (!auditEnabled()) {
|
|
538
|
+
console.log("[stage-audit] disabled (set NODEDEX_AUDIT_ENABLED=on to enable)");
|
|
539
|
+
return false;
|
|
540
|
+
}
|
|
541
|
+
if (_auditHandle !== null)
|
|
542
|
+
return false;
|
|
543
|
+
const intervalMs = auditIntervalMs();
|
|
544
|
+
console.log(`[stage-audit] starting: interval=${intervalMs}ms`);
|
|
545
|
+
_auditHandle = setInterval(() => {
|
|
546
|
+
auditTick(db).catch((e) => console.warn(`[stage-audit] interval tick rejected: ${e?.message ?? e}`));
|
|
547
|
+
}, intervalMs);
|
|
548
|
+
if (typeof _auditHandle.unref === "function")
|
|
549
|
+
_auditHandle.unref();
|
|
550
|
+
return true;
|
|
551
|
+
}
|
|
552
|
+
/** Stop the Stage AUDIT timer. Used on shutdown + by tests. */
|
|
553
|
+
export function stopStageAuditTimer() {
|
|
554
|
+
if (_auditHandle !== null) {
|
|
555
|
+
clearInterval(_auditHandle);
|
|
556
|
+
_auditHandle = null;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
/** For tests only — reports whether the timer is currently running. */
|
|
560
|
+
export function _isStageAuditTimerRunningForTests() {
|
|
561
|
+
return _auditHandle !== null;
|
|
562
|
+
}
|
|
563
|
+
//# sourceMappingURL=stage-audit-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stage-audit-graph.js","sourceRoot":"","sources":["../../../src/middleware/reflect/stage-audit-graph.ts"],"names":[],"mappings":"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"}
|