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,204 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
// Recognition Layer — STEP 2: THE RECOGNIZER ("Stage D for roots")
|
|
3
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// Design: docs/PIPELINE-RECOGNITION-LAYER-DESIGN.md §2 (LLM-primary spine) + §3.
|
|
6
|
+
//
|
|
7
|
+
// JOB: for each NEW project-root candidate an arc would create, decide — does
|
|
8
|
+
// this cluster of new knowledge actually belong to an EXISTING root? One LLM
|
|
9
|
+
// judgment over (the new cluster's content) + (the candidate roots' DESCRIPTIONS
|
|
10
|
+
// + scope). Verdict: attach / new / uncertain.
|
|
11
|
+
//
|
|
12
|
+
// HOOK: runs in pipeline.ts right after applyArcEntityCanonicalNames (the seam
|
|
13
|
+
// where Stage C's canonical names are written onto items, BEFORE Pass 3). On a
|
|
14
|
+
// confident ATTACH it rewrites the cluster's items' .project to the existing
|
|
15
|
+
// root's EXACT label → Pass 3's root-create exact-match finds it → blocks attach,
|
|
16
|
+
// no fork. Default OFF (NODEDEX_RECOGNIZER_ENABLED=1), arc-mode only.
|
|
17
|
+
//
|
|
18
|
+
// THE 6 GUARDS (§2 — non-negotiable; without them this is a silent-merge risk):
|
|
19
|
+
// 1. judges against the root DESCRIPTION (essence), not the raw label string
|
|
20
|
+
// 2. SCOPE/OWNER is an explicit axis — same domain AND same owner to attach
|
|
21
|
+
// 3. cite EVIDENCE in reasoning (auditable, not a vibe)
|
|
22
|
+
// 4. bias hard to NOT-attach — anything short of a confident same-owner fit
|
|
23
|
+
// keeps the new root (a FORK is the safe failure; §1). Enforced
|
|
24
|
+
// deterministically in decideAction(), not left to the prompt alone.
|
|
25
|
+
// 5. judge against the description (members are not dumped here)
|
|
26
|
+
// 6. attach must NAME the shared subject-matter (shared_subject) — shared
|
|
27
|
+
// MANNER (both involve the speaker reasoning/remembering/planning) names no
|
|
28
|
+
// subject, so it can never justify an attach. Added 2026-06-11 after a
|
|
29
|
+
// transcript test where a process-narration root became an attractor and
|
|
30
|
+
// absorbed an unrelated domain. Enforced in decideAction().
|
|
31
|
+
//
|
|
32
|
+
// v1 SCOPE: ACT on ATTACH only (the value-add: stop the fork by attaching when
|
|
33
|
+
// confident). "new" and "uncertain" both → keep the new root (the safe fork).
|
|
34
|
+
// At-ingest flag-to-agent is deferred to the AUDIT-heal pass (step 4): blocks
|
|
35
|
+
// don't exist yet at this pre-Pass-3 seam, so a fork is created and the post-hoc
|
|
36
|
+
// project_dup_candidate detector surfaces the pair for the agent/user.
|
|
37
|
+
import { intFromEnv } from "./config.js";
|
|
38
|
+
// ─── Config ──────────────────────────────────────────────────────────────────
|
|
39
|
+
export function recognizerEnabled() {
|
|
40
|
+
// DEFAULT ON since 2026-06-12 (v2's cross-session root matching — without it the
|
|
41
|
+
// default engine fragments roots across sessions). =0 opts out.
|
|
42
|
+
return process.env.NODEDEX_RECOGNIZER_ENABLED !== "0";
|
|
43
|
+
}
|
|
44
|
+
function maxCandidateRoots() {
|
|
45
|
+
return intFromEnv("NODEDEX_RECOGNIZER_MAX_ROOTS", 40); // bound prompt size; scale-prefilter = TODO
|
|
46
|
+
}
|
|
47
|
+
function maxItemsInCluster() {
|
|
48
|
+
return intFromEnv("NODEDEX_RECOGNIZER_MAX_ITEMS", 30);
|
|
49
|
+
}
|
|
50
|
+
// ─── Pure decision (guard #4 enforced in code, not just the prompt) ────────────
|
|
51
|
+
/**
|
|
52
|
+
* Map an LLM verdict → an action. ATTACH only when the model is confident
|
|
53
|
+
* (decision==="attach"), names a root that ACTUALLY EXISTS, confirms same
|
|
54
|
+
* owner, AND names the shared subject-matter (guard #6 — an attach must carry
|
|
55
|
+
* its falsifiable evidence; an unevidenced attach is a contract violation, so
|
|
56
|
+
* the safe direction is fork). Everything else → keep. Pure / testable.
|
|
57
|
+
*/
|
|
58
|
+
export function decideAction(verdict, knownRootLabels) {
|
|
59
|
+
if (verdict.decision === "attach" &&
|
|
60
|
+
verdict.same_owner === true &&
|
|
61
|
+
typeof verdict.matched_root === "string" &&
|
|
62
|
+
verdict.matched_root.length > 0 &&
|
|
63
|
+
knownRootLabels.has(verdict.matched_root) &&
|
|
64
|
+
typeof verdict.shared_subject === "string" &&
|
|
65
|
+
verdict.shared_subject.trim().length > 0) {
|
|
66
|
+
return { action: "attach", root: verdict.matched_root };
|
|
67
|
+
}
|
|
68
|
+
return { action: "keep" };
|
|
69
|
+
}
|
|
70
|
+
/** Distinct project names among items that are NOT existing roots = the
|
|
71
|
+
* new-root candidates the recognizer should judge. Pure / testable. */
|
|
72
|
+
export function newRootCandidateNames(items, knownRootLabels) {
|
|
73
|
+
const seen = new Set();
|
|
74
|
+
const out = [];
|
|
75
|
+
for (const it of items) {
|
|
76
|
+
const p = it.project;
|
|
77
|
+
if (!p || knownRootLabels.has(p) || seen.has(p))
|
|
78
|
+
continue;
|
|
79
|
+
seen.add(p);
|
|
80
|
+
out.push(p);
|
|
81
|
+
}
|
|
82
|
+
return out;
|
|
83
|
+
}
|
|
84
|
+
// ─── Prompt + schema ────────────────────────────────────────────────────────
|
|
85
|
+
export const RECOGNIZE_ROOT_PROMPT = `A knowledge graph is about to create a NEW project root for a cluster of new
|
|
86
|
+
knowledge. Decide whether that cluster actually belongs to an EXISTING project
|
|
87
|
+
instead — so related knowledge COMPOUNDS onto one project rather than fragmenting.
|
|
88
|
+
|
|
89
|
+
You are given:
|
|
90
|
+
- NEW CLUSTER: the new knowledge (its proposed project name + member items).
|
|
91
|
+
- EXISTING PROJECTS: each as a one-line DESCRIPTION (domain + owner).
|
|
92
|
+
|
|
93
|
+
Decide ONE:
|
|
94
|
+
- "attach" — the cluster clearly belongs to one EXISTING project: SAME DOMAIN
|
|
95
|
+
AND SAME OWNER. Set matched_root to that project's exact label and
|
|
96
|
+
shared_subject to the specific subject-matter they share.
|
|
97
|
+
- "new" — no existing project fits; this is genuinely a new project.
|
|
98
|
+
- "uncertain" — plausibly related to an existing project but you are NOT confident
|
|
99
|
+
(e.g. similar domain but unclear/different owner, or a weak fit).
|
|
100
|
+
|
|
101
|
+
RULES (read carefully):
|
|
102
|
+
- Judge on the DESCRIPTION's meaning, NOT on label string similarity. Two similar
|
|
103
|
+
names can be different projects; two different names can be the same project.
|
|
104
|
+
- SAME OWNER is required for "attach". Same domain but a DIFFERENT or UNKNOWN owner
|
|
105
|
+
(e.g. one customer's data vs another's) is NOT the same project → "new" or "uncertain".
|
|
106
|
+
- "attach" requires a NAMEABLE SHARED SUBJECT: shared_subject must name the specific
|
|
107
|
+
thing both bodies of work are ABOUT. A shared MANNER is not a subject — that both
|
|
108
|
+
involve someone remembering, reasoning, or planning a response names no subject,
|
|
109
|
+
because every conversation involves those. If you cannot name what they are both
|
|
110
|
+
about, the fit is not real → "new" or "uncertain", with shared_subject "".
|
|
111
|
+
- When the fit is merely plausible, choose "uncertain", NOT "attach". A wrong attach
|
|
112
|
+
silently merges two real projects (hard to undo); a fork is recoverable. Bias to caution.
|
|
113
|
+
- reasoning MUST cite the specific evidence (which description, which overlapping
|
|
114
|
+
content) — not "they seem related".`;
|
|
115
|
+
const RECOGNIZE_ROOT_SCHEMA = {
|
|
116
|
+
type: "object",
|
|
117
|
+
properties: {
|
|
118
|
+
decision: { type: "string", enum: ["attach", "new", "uncertain"] },
|
|
119
|
+
matched_root: { type: "string" },
|
|
120
|
+
same_owner: { type: "boolean" },
|
|
121
|
+
shared_subject: { type: "string" },
|
|
122
|
+
reasoning: { type: "string" },
|
|
123
|
+
},
|
|
124
|
+
required: ["decision", "matched_root", "same_owner", "shared_subject", "reasoning"],
|
|
125
|
+
};
|
|
126
|
+
export function buildRecognizeInput(newProjectName, clusterItems, candidateRoots, itemCap, rootCap) {
|
|
127
|
+
const roots = candidateRoots.slice(0, rootCap)
|
|
128
|
+
.map((r) => ` - ${r.label}: "${r.essence || "(no description)"}"`)
|
|
129
|
+
.join("\n");
|
|
130
|
+
const members = clusterItems.slice(0, itemCap).map((it) => {
|
|
131
|
+
const t = it.type ?? "?";
|
|
132
|
+
const txt = (it.text ?? "").toString().slice(0, 160);
|
|
133
|
+
return ` - [${t}] ${txt}`;
|
|
134
|
+
}).join("\n");
|
|
135
|
+
return (`NEW CLUSTER (proposed project: ${newProjectName}):\n${members || " (no items)"}\n\n` +
|
|
136
|
+
`EXISTING PROJECTS:\n${roots || " (none)"}`);
|
|
137
|
+
}
|
|
138
|
+
// ─── LLM judgment (one cluster) ───────────────────────────────────────────────
|
|
139
|
+
export async function recognizeClusterRoot(provider, newProjectName, clusterItems, candidateRoots) {
|
|
140
|
+
const userInput = buildRecognizeInput(newProjectName, clusterItems, candidateRoots, maxItemsInCluster(), maxCandidateRoots());
|
|
141
|
+
const r = await provider.generateStructured(RECOGNIZE_ROOT_PROMPT, userInput, RECOGNIZE_ROOT_SCHEMA, { thinkingBudget: 1024, maxOutputTokens: 1024 });
|
|
142
|
+
return { verdict: r.result ?? null, rateLimited: r.rateLimited, usage: r.usage };
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* For each new-root candidate cluster, ask the recognizer "attach to an existing
|
|
146
|
+
* root?" and collect the confident-attach rewrites. Caller applies the remap to
|
|
147
|
+
* item.project (then Pass 3 + root-create attach to the existing root). Does NOT
|
|
148
|
+
* mutate items itself (pure-ish: returns the remap). LLM-bounded (one call per
|
|
149
|
+
* new-root candidate). NO knownRoots → nothing to attach to → empty remap.
|
|
150
|
+
*/
|
|
151
|
+
export async function recognizeRootsForArc(opts) {
|
|
152
|
+
const result = {
|
|
153
|
+
remap: [], candidates: 0, attached: 0, llm_calls: 0, rate_limited: 0, errors: 0,
|
|
154
|
+
};
|
|
155
|
+
if (opts.knownRoots.length === 0)
|
|
156
|
+
return result; // nothing to recognize against
|
|
157
|
+
const knownLabels = new Set(opts.knownRoots.map((r) => r.label));
|
|
158
|
+
const candidates = newRootCandidateNames(opts.items, knownLabels);
|
|
159
|
+
result.candidates = candidates.length;
|
|
160
|
+
for (const name of candidates) {
|
|
161
|
+
const clusterItems = opts.items.filter((it) => it.project === name);
|
|
162
|
+
try {
|
|
163
|
+
result.llm_calls += 1;
|
|
164
|
+
const { verdict, rateLimited } = await recognizeClusterRoot(opts.provider, name, clusterItems, opts.knownRoots);
|
|
165
|
+
if (rateLimited) {
|
|
166
|
+
result.rate_limited += 1;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (!verdict)
|
|
170
|
+
continue;
|
|
171
|
+
const action = decideAction(verdict, knownLabels);
|
|
172
|
+
if (action.action === "attach" && action.root) {
|
|
173
|
+
result.remap.push({ from: name, to: action.root });
|
|
174
|
+
result.attached += 1;
|
|
175
|
+
console.log(`[recognizer] attach "${name}" → "${action.root}" (same_owner=${verdict.same_owner}, shared_subject="${verdict.shared_subject}"): ${verdict.reasoning.slice(0, 140)}`);
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
console.log(`[recognizer] keep "${name}" (decision=${verdict.decision}, same_owner=${verdict.same_owner}): ${verdict.reasoning.slice(0, 120)}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
result.errors += 1;
|
|
183
|
+
console.warn(`[recognizer] cluster "${name}" threw: ${e?.message ?? e}`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
/** Apply a remap (from recognizeRootsForArc) to items' .project — returns a NEW
|
|
189
|
+
* array (shallow-copies only the rewritten items). Pure / testable. */
|
|
190
|
+
export function applyRootRemap(items, remap) {
|
|
191
|
+
if (remap.length === 0)
|
|
192
|
+
return { items, rewritten: 0 };
|
|
193
|
+
const map = new Map(remap.map((r) => [r.from, r.to]));
|
|
194
|
+
let rewritten = 0;
|
|
195
|
+
const out = items.map((it) => {
|
|
196
|
+
const to = map.get(it.project);
|
|
197
|
+
if (!to)
|
|
198
|
+
return it;
|
|
199
|
+
rewritten += 1;
|
|
200
|
+
return { ...it, project: to };
|
|
201
|
+
});
|
|
202
|
+
return { items: out, rewritten };
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=recognize-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recognize-root.js","sourceRoot":"","sources":["../../../src/middleware/reflect/recognize-root.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
import type { PipelineFlag } from "./types.js";
|
|
3
|
+
export interface RenderedAgentFlag {
|
|
4
|
+
id: string;
|
|
5
|
+
question: string;
|
|
6
|
+
you_are_recording: {
|
|
7
|
+
what: string;
|
|
8
|
+
value: string;
|
|
9
|
+
owner: string;
|
|
10
|
+
source: string | null;
|
|
11
|
+
};
|
|
12
|
+
existing_uncertain: {
|
|
13
|
+
what: string;
|
|
14
|
+
value: string;
|
|
15
|
+
owner: string;
|
|
16
|
+
source: string | null;
|
|
17
|
+
} | null;
|
|
18
|
+
routed_reason: string | null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Render an owner-unknown flag as a plain-English question. Returns null if
|
|
22
|
+
* block_a is gone (stale flag — skip it).
|
|
23
|
+
*/
|
|
24
|
+
export declare function renderAgentFlag(raw: Database.Database, flag: PipelineFlag): RenderedAgentFlag | null;
|
|
25
|
+
//# sourceMappingURL=render-agent-flag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-agent-flag.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/render-agent-flag.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IACzF,kBAAkB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;IACjG,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,GAAG,iBAAiB,GAAG,IAAI,CAepG"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// render-agent-flag.ts — turn an owner-unknown pipeline_flag into a PLAIN-ENGLISH
|
|
2
|
+
// question for the agent. SINGLE SOURCE OF TRUTH for that rendering, used by BOTH:
|
|
3
|
+
// • the REST surface (routes/flags.ts → GET /api/flags/agent-pending)
|
|
4
|
+
// • the MCP pull surface (tools/flag-surface.ts → workspace_stats.flags)
|
|
5
|
+
//
|
|
6
|
+
// Extracted from routes/flags.ts so the two surfaces can't drift. The agent never
|
|
7
|
+
// sees ids/schema/verdict vocabulary — just "same thing? whose?" — and answers from
|
|
8
|
+
// its conversation context (or asks the user), then it's applied via the review path.
|
|
9
|
+
//
|
|
10
|
+
// Only owner-unknown dup flags are routed to the agent today (the reviewer's
|
|
11
|
+
// markFlagPendingClarification path); this renderer is shaped for them.
|
|
12
|
+
import { loadBlockSnapshot } from "./flag-reviewer.js";
|
|
13
|
+
import { extractPrimaryValueFromUnique } from "./dedup-by-source-and-value.js";
|
|
14
|
+
import { scopeSegmentOfLabel } from "./retrieve-graph-slice.js";
|
|
15
|
+
/**
|
|
16
|
+
* Render an owner-unknown flag as a plain-English question. Returns null if
|
|
17
|
+
* block_a is gone (stale flag — skip it).
|
|
18
|
+
*/
|
|
19
|
+
export function renderAgentFlag(raw, flag) {
|
|
20
|
+
const a = loadBlockSnapshot(raw, flag.block_id_a);
|
|
21
|
+
if (!a)
|
|
22
|
+
return null;
|
|
23
|
+
const b = flag.block_id_b ? loadBlockSnapshot(raw, flag.block_id_b) : null;
|
|
24
|
+
const describe = (s) => {
|
|
25
|
+
let value = "";
|
|
26
|
+
try {
|
|
27
|
+
value = extractPrimaryValueFromUnique(s.type, (JSON.parse(s.content)?.unique) || {});
|
|
28
|
+
}
|
|
29
|
+
catch { /* leave blank */ }
|
|
30
|
+
return { what: s.essence, value, owner: scopeSegmentOfLabel(s.label), source: s.source ?? null };
|
|
31
|
+
};
|
|
32
|
+
const you = describe(a);
|
|
33
|
+
const existing = b ? describe(b) : null;
|
|
34
|
+
const question = existing
|
|
35
|
+
? `You're recording (owner: ${you.owner}): "${you.value || you.what}". An existing entry is already on file with an UNCERTAIN owner (${existing.owner}): "${existing.value || existing.what}". Are these the same thing, and does the existing one belong to ${you.owner}? If you can't tell from context, ask the user. (The existing one was captured from: ${existing.source || "no source recorded"}.)`
|
|
36
|
+
: `An existing entry needs an owner assigned: "${you.value || you.what}" (owner: ${you.owner}). Who does it belong to? If unsure, ask the user.`;
|
|
37
|
+
return { id: flag.id, question, you_are_recording: you, existing_uncertain: existing, routed_reason: flag.review_reason };
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=render-agent-flag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-agent-flag.js","sourceRoot":"","sources":["../../../src/middleware/reflect/render-agent-flag.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,mFAAmF;AACnF,2EAA2E;AAC3E,2EAA2E;AAC3E,EAAE;AACF,kFAAkF;AAClF,oFAAoF;AACpF,sFAAsF;AACtF,EAAE;AACF,6EAA6E;AAC7E,wEAAwE;AAGxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAWhE;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAsB,EAAE,IAAkB;IACxE,MAAM,CAAC,GAAG,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,MAAM,QAAQ,GAAG,CAAC,CAAsB,EAAE,EAAE;QAC1C,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,CAAC;YAAC,KAAK,GAAG,6BAA6B,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACzH,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;IACnG,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,MAAM,QAAQ,GAAG,QAAQ;QACvB,CAAC,CAAC,4BAA4B,GAAG,CAAC,KAAK,OAAO,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,oEAAoE,QAAQ,CAAC,KAAK,OAAO,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,oEAAoE,GAAG,CAAC,KAAK,wFAAwF,QAAQ,CAAC,MAAM,IAAI,oBAAoB,IAAI;QAC3Y,CAAC,CAAC,+CAA+C,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,aAAa,GAAG,CAAC,KAAK,oDAAoD,CAAC;IACnJ,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,GAAG,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;AAC5H,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { WorkspaceDB, Block } from "../../store/database.js";
|
|
2
|
+
export interface CandidateScope {
|
|
3
|
+
/** The owner/scope value (label {project} segment or project_id resolved to it). */
|
|
4
|
+
value: string;
|
|
5
|
+
/** True when the scope is a catch-all dump ("owner unknown"), not a real owner. */
|
|
6
|
+
is_catch_all: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface RetrievalCandidate {
|
|
9
|
+
block: Block;
|
|
10
|
+
identity_score: number;
|
|
11
|
+
scope: CandidateScope;
|
|
12
|
+
semantic_score: number;
|
|
13
|
+
rank_score: number;
|
|
14
|
+
why: string;
|
|
15
|
+
}
|
|
16
|
+
/** What Part 1 needs about the arc entity it's finding matches for. Derived from
|
|
17
|
+
* a Stage C cluster, but kept as a plain shape so callers/tests can build it
|
|
18
|
+
* without a full ArcEntityResolveResult. */
|
|
19
|
+
export interface EntityQuery {
|
|
20
|
+
canonical_name: string;
|
|
21
|
+
/** Identity-bearing primary values of the entity's member items (the thing to
|
|
22
|
+
* match on — Signal 1). Often one, but a cluster can carry several. */
|
|
23
|
+
primary_values: string[];
|
|
24
|
+
/** Concept tags for candidate FINDING (recall) + partial signal. */
|
|
25
|
+
concepts: string[];
|
|
26
|
+
/** Optional query embedding for Signal 3. Omit to skip semantic. */
|
|
27
|
+
embedding?: number[] | null;
|
|
28
|
+
}
|
|
29
|
+
/** Normalize a primary value for comparison: lowercase, collapse whitespace,
|
|
30
|
+
* strip surrounding backticks/quotes/trailing punctuation. Identity compares on
|
|
31
|
+
* MEANING-bearing text, so cosmetic punctuation must not split a true match. */
|
|
32
|
+
export declare function normalizePrimaryValue(v: string): string;
|
|
33
|
+
/** The {project} (owner) segment of a strict label {project}_{type}_{concept}.
|
|
34
|
+
* Read STRUCTURALLY (split on the `_` dimension separator) — never word-soup. */
|
|
35
|
+
export declare function scopeSegmentOfLabel(label: string): string;
|
|
36
|
+
/** Token-overlap (Jaccard) of two primary values — the partial-identity signal
|
|
37
|
+
* for paraphrase, where exact normalized match fails. */
|
|
38
|
+
export declare function primaryValueTokenOverlap(a: string, b: string): number;
|
|
39
|
+
export declare function isCatchAllScope(scopeValue: string, projectRootEssenceByLabel?: Map<string, string>): boolean;
|
|
40
|
+
export interface RetrieveOpts {
|
|
41
|
+
k?: number;
|
|
42
|
+
/** Pass an embedding-getter to enable Signal 3; omit to skip (pure identity+scope). */
|
|
43
|
+
embeddingFor?: (block: Block) => number[] | null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Retrieve the top-k candidate blocks for an arc entity, ranked identity-first.
|
|
47
|
+
*
|
|
48
|
+
* Recall step: union of keywordSearch(canonical_name + primary values) +
|
|
49
|
+
* conceptSearch(concepts). Cross-scope candidates are INCLUDED (the resolver's
|
|
50
|
+
* Q2 needs them). Ranking: Signal 1 (identity) dominates; Signal 2 (scope) is
|
|
51
|
+
* carried as evidence, not a filter; Signal 3 (semantic) is a capped booster.
|
|
52
|
+
*/
|
|
53
|
+
export declare function retrieveGraphSlice(db: WorkspaceDB, entity: EntityQuery, opts?: RetrieveOpts): RetrievalCandidate[];
|
|
54
|
+
//# sourceMappingURL=retrieve-graph-slice.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrieve-graph-slice.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/retrieve-graph-slice.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAkBlE,MAAM,WAAW,cAAc;IAC7B,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,KAAK,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,cAAc,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;6CAE6C;AAC7C,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB;4EACwE;IACxE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,oEAAoE;IACpE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC7B;AAID;;iFAEiF;AACjF,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED;kFACkF;AAClF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGzD;AAMD;0DAC0D;AAC1D,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAMrE;AAUD,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,EAClB,yBAAyB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9C,OAAO,CAOT;AAID,MAAM,WAAW,YAAY;IAC3B,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,uFAAuF;IACvF,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,EAAE,GAAG,IAAI,CAAC;CAClD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,WAAW,EACf,MAAM,EAAE,WAAW,EACnB,IAAI,GAAE,YAAiB,GACtB,kBAAkB,EAAE,CAsEtB"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
// DEBT 5 Slice 3 (Stage D) — Part 1: RETRIEVE — identity-ranked candidate finder
|
|
3
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// Job (docs/PIPELINE-STAGE-D-PART1-RETRIEVAL-DESIGN.md):
|
|
6
|
+
// Narrow the graph to ~k candidate blocks the Stage D resolver (Part 2) should
|
|
7
|
+
// judge for "same entity? same scope?". ONLY duty = high RECALL (never miss a
|
|
8
|
+
// real same-entity match). Precision is the resolver's job.
|
|
9
|
+
//
|
|
10
|
+
// Why this is NOT just "reuse recall-smart" (the meaning-first audit, 2026-06-01):
|
|
11
|
+
// recall-smart's SEMANTIC half fingerprints [label, essence, concepts] — TOPIC,
|
|
12
|
+
// not identity. It omits unique{} (the system's identity basis) and FLATTENS the
|
|
13
|
+
// label's {project} segment (the OWNER) into word-soup. For an IDENTITY check
|
|
14
|
+
// that's the wrong signal. So we keep the candidate-FINDING plumbing
|
|
15
|
+
// (keywordSearch/conceptSearch) but rebuild the RANKING on three SEPARATE
|
|
16
|
+
// signals, identity-first:
|
|
17
|
+
//
|
|
18
|
+
// Signal 1 IDENTITY — unique{} primary value (via extractPrimaryValueFromUnique,
|
|
19
|
+
// the SAME extractor D2 + AUDIT use — Rule 5). DOMINANT.
|
|
20
|
+
// Signal 2 SCOPE — label {project} segment read as a DISCRETE dimension (not
|
|
21
|
+
// blended); catch-all scopes tagged "unknown" (spike pair-5
|
|
22
|
+
// lesson). Does NOT filter — cross-scope candidates are
|
|
23
|
+
// WANTED (resolver's Q2 needs them).
|
|
24
|
+
// Signal 3 SEMANTIC — existing cosine, DE-WEIGHTED (≤0.2). A weak recall-net for
|
|
25
|
+
// paraphrases Signal 1 missed; never the identity basis.
|
|
26
|
+
//
|
|
27
|
+
// source_excerpt: carried as EVIDENCE to the resolver, NOT a match key (cross-arc
|
|
28
|
+
// the same entity comes from different conversations → excerpts differ).
|
|
29
|
+
import { cosineSim } from "../../engine/vector-math.js";
|
|
30
|
+
import { extractPrimaryValueFromUnique } from "./dedup-by-source-and-value.js";
|
|
31
|
+
// ─── Weights (identity dominates; semantic is a weak booster) ──────────────────
|
|
32
|
+
const W_IDENTITY_EXACT = 1.0; // exact normalized unique{} primary-value match
|
|
33
|
+
const W_IDENTITY_PARTIAL = 0.5; // token overlap of primary values (paraphrase net)
|
|
34
|
+
const W_SEMANTIC_MAX = 0.2; // cosine contribution ceiling (recall booster only)
|
|
35
|
+
// Scopes that are catch-all dumping grounds, not real owners. Detected
|
|
36
|
+
// STRUCTURALLY below (a project root with few/no real members) — this constant
|
|
37
|
+
// is only the well-known explicit marker, NOT an exhaustive sentinel list (that
|
|
38
|
+
// would be the signal-word anti-pattern). See isCatchAllScope().
|
|
39
|
+
const EXPLICIT_CATCH_ALL = "unspecified-project";
|
|
40
|
+
// ─── Pure helpers (no DB — unit-testable) ──────────────────────────────────────
|
|
41
|
+
/** Normalize a primary value for comparison: lowercase, collapse whitespace,
|
|
42
|
+
* strip surrounding backticks/quotes/trailing punctuation. Identity compares on
|
|
43
|
+
* MEANING-bearing text, so cosmetic punctuation must not split a true match. */
|
|
44
|
+
export function normalizePrimaryValue(v) {
|
|
45
|
+
return (v ?? "")
|
|
46
|
+
.toLowerCase()
|
|
47
|
+
.replace(/[`"'.]/g, "")
|
|
48
|
+
.replace(/\s+/g, " ")
|
|
49
|
+
.trim();
|
|
50
|
+
}
|
|
51
|
+
/** The {project} (owner) segment of a strict label {project}_{type}_{concept}.
|
|
52
|
+
* Read STRUCTURALLY (split on the `_` dimension separator) — never word-soup. */
|
|
53
|
+
export function scopeSegmentOfLabel(label) {
|
|
54
|
+
const i = (label ?? "").indexOf("_");
|
|
55
|
+
return i === -1 ? (label ?? "") : label.slice(0, i);
|
|
56
|
+
}
|
|
57
|
+
function tokenize(s) {
|
|
58
|
+
return normalizePrimaryValue(s).split(" ").filter(t => t.length > 2);
|
|
59
|
+
}
|
|
60
|
+
/** Token-overlap (Jaccard) of two primary values — the partial-identity signal
|
|
61
|
+
* for paraphrase, where exact normalized match fails. */
|
|
62
|
+
export function primaryValueTokenOverlap(a, b) {
|
|
63
|
+
const ta = new Set(tokenize(a)), tb = new Set(tokenize(b));
|
|
64
|
+
if (ta.size === 0 || tb.size === 0)
|
|
65
|
+
return 0;
|
|
66
|
+
let inter = 0;
|
|
67
|
+
for (const t of ta)
|
|
68
|
+
if (tb.has(t))
|
|
69
|
+
inter += 1;
|
|
70
|
+
return inter / (ta.size + tb.size - inter);
|
|
71
|
+
}
|
|
72
|
+
// ─── Scope: catch-all detection (structural, not a sentinel list) ──────────────
|
|
73
|
+
//
|
|
74
|
+
// A scope is "catch-all" when it's a dumping ground rather than a real owner. We
|
|
75
|
+
// detect this STRUCTURALLY: the explicit well-known marker, OR a project root that
|
|
76
|
+
// owns blocks spanning many unrelated concept clusters with a generic essence.
|
|
77
|
+
// For now (small graph) the explicit marker + a low-cohesion heuristic; the
|
|
78
|
+
// heuristic is the extensible part (NOT a hard-coded list of names).
|
|
79
|
+
export function isCatchAllScope(scopeValue, projectRootEssenceByLabel) {
|
|
80
|
+
if (scopeValue === EXPLICIT_CATCH_ALL)
|
|
81
|
+
return true;
|
|
82
|
+
// Structural signal: a project root whose essence advertises "items without a
|
|
83
|
+
// specified project" / "miscellaneous" — read from the root block's own essence,
|
|
84
|
+
// NOT a name list. Extensible: future cohesion metric plugs in here.
|
|
85
|
+
const essence = projectRootEssenceByLabel?.get(scopeValue)?.toLowerCase() ?? "";
|
|
86
|
+
return /without a specified project|miscellaneous|uncategorized|catch-?all|unspecified/.test(essence);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Retrieve the top-k candidate blocks for an arc entity, ranked identity-first.
|
|
90
|
+
*
|
|
91
|
+
* Recall step: union of keywordSearch(canonical_name + primary values) +
|
|
92
|
+
* conceptSearch(concepts). Cross-scope candidates are INCLUDED (the resolver's
|
|
93
|
+
* Q2 needs them). Ranking: Signal 1 (identity) dominates; Signal 2 (scope) is
|
|
94
|
+
* carried as evidence, not a filter; Signal 3 (semantic) is a capped booster.
|
|
95
|
+
*/
|
|
96
|
+
export function retrieveGraphSlice(db, entity, opts = {}) {
|
|
97
|
+
const k = opts.k ?? 20;
|
|
98
|
+
// Project-root essences for structural catch-all detection (cheap; small set).
|
|
99
|
+
const rootEssence = new Map();
|
|
100
|
+
for (const b of db.getAllBlocks()) {
|
|
101
|
+
if (b.type === "project")
|
|
102
|
+
rootEssence.set(b.label, b.essence ?? "");
|
|
103
|
+
}
|
|
104
|
+
// ── Recall (FINDING): union keyword + concept candidates ──
|
|
105
|
+
const queryString = [entity.canonical_name.replace(/-/g, " "), ...entity.primary_values].join(" ");
|
|
106
|
+
const kw = db.keywordSearch(queryString, 200);
|
|
107
|
+
const conceptHits = entity.concepts.length
|
|
108
|
+
? [...db.conceptSearch(entity.concepts).values()].map(v => v.block)
|
|
109
|
+
: [];
|
|
110
|
+
const pool = new Map();
|
|
111
|
+
for (const b of [...kw, ...conceptHits]) {
|
|
112
|
+
if (b && b.id && b.status === "active")
|
|
113
|
+
pool.set(b.id, b);
|
|
114
|
+
}
|
|
115
|
+
const normEntityValues = entity.primary_values.map(normalizePrimaryValue).filter(Boolean);
|
|
116
|
+
// ── Rank ──
|
|
117
|
+
const scored = [];
|
|
118
|
+
for (const block of pool.values()) {
|
|
119
|
+
if (block.type === "project")
|
|
120
|
+
continue; // entities resolve against atomic blocks, not roots
|
|
121
|
+
// Signal 1 — IDENTITY (unique{} primary value)
|
|
122
|
+
let content = {};
|
|
123
|
+
try {
|
|
124
|
+
content = typeof block.content === "string" ? JSON.parse(block.content) : (block.content || {});
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
content = {};
|
|
128
|
+
}
|
|
129
|
+
const candVal = extractPrimaryValueFromUnique(block.type, content.unique || {});
|
|
130
|
+
const candNorm = normalizePrimaryValue(candVal);
|
|
131
|
+
let identity = 0;
|
|
132
|
+
const whyParts = [];
|
|
133
|
+
if (candNorm) {
|
|
134
|
+
if (normEntityValues.includes(candNorm)) {
|
|
135
|
+
identity = W_IDENTITY_EXACT;
|
|
136
|
+
whyParts.push(`identity:exact(${candNorm.slice(0, 40)})`);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
const best = Math.max(0, ...normEntityValues.map(v => primaryValueTokenOverlap(v, candNorm)));
|
|
140
|
+
if (best > 0) {
|
|
141
|
+
identity = W_IDENTITY_PARTIAL * best;
|
|
142
|
+
whyParts.push(`identity:partial(${best.toFixed(2)})`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Signal 2 — SCOPE (discrete; carried, not filtered)
|
|
147
|
+
const scopeVal = scopeSegmentOfLabel(block.label);
|
|
148
|
+
const scope = { value: scopeVal, is_catch_all: isCatchAllScope(scopeVal, rootEssence) };
|
|
149
|
+
if (scope.is_catch_all)
|
|
150
|
+
whyParts.push("scope:catch-all");
|
|
151
|
+
// Signal 3 — SEMANTIC (capped booster)
|
|
152
|
+
let semantic = 0;
|
|
153
|
+
if (entity.embedding && opts.embeddingFor) {
|
|
154
|
+
const vec = opts.embeddingFor(block);
|
|
155
|
+
if (vec) {
|
|
156
|
+
semantic = cosineSim(entity.embedding, vec);
|
|
157
|
+
if (semantic > 0.01)
|
|
158
|
+
whyParts.push(`semantic:${semantic.toFixed(2)}`);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const rank = identity + Math.min(semantic, 1) * W_SEMANTIC_MAX;
|
|
162
|
+
// Keep anything with ANY identity OR a strong semantic hit (recall net).
|
|
163
|
+
if (rank <= 0 && semantic < 0.5)
|
|
164
|
+
continue;
|
|
165
|
+
scored.push({
|
|
166
|
+
block, identity_score: identity, scope, semantic_score: semantic,
|
|
167
|
+
rank_score: rank, why: whyParts.join(" "),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
scored.sort((a, b) => b.rank_score - a.rank_score);
|
|
171
|
+
return scored.slice(0, k);
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=retrieve-graph-slice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrieve-graph-slice.js","sourceRoot":"","sources":["../../../src/middleware/reflect/retrieve-graph-slice.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,iFAAiF;AACjF,kFAAkF;AAClF,EAAE;AACF,yDAAyD;AACzD,iFAAiF;AACjF,gFAAgF;AAChF,8DAA8D;AAC9D,EAAE;AACF,mFAAmF;AACnF,kFAAkF;AAClF,mFAAmF;AACnF,gFAAgF;AAChF,uEAAuE;AACvE,4EAA4E;AAC5E,6BAA6B;AAC7B,EAAE;AACF,oFAAoF;AACpF,gFAAgF;AAChF,mFAAmF;AACnF,mFAAmF;AACnF,+EAA+E;AAC/E,4DAA4D;AAC5D,oFAAoF;AACpF,gFAAgF;AAChF,EAAE;AACF,kFAAkF;AAClF,yEAAyE;AAGzE,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAExD,OAAO,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAE/E,kFAAkF;AAClF,MAAM,gBAAgB,GAAK,GAAG,CAAC,CAAG,gDAAgD;AAClF,MAAM,kBAAkB,GAAG,GAAG,CAAC,CAAG,mDAAmD;AACrF,MAAM,cAAc,GAAO,GAAG,CAAC,CAAG,oDAAoD;AAEtF,uEAAuE;AACvE,+EAA+E;AAC/E,gFAAgF;AAChF,iEAAiE;AACjE,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAkCjD,kFAAkF;AAElF;;iFAEiF;AACjF,MAAM,UAAU,qBAAqB,CAAC,CAAS;IAC7C,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;SACb,WAAW,EAAE;SACb,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;kFACkF;AAClF,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,qBAAqB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;0DAC0D;AAC1D,MAAM,UAAU,wBAAwB,CAAC,CAAS,EAAE,CAAS;IAC3D,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;IAC9C,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,kFAAkF;AAClF,EAAE;AACF,iFAAiF;AACjF,mFAAmF;AACnF,+EAA+E;AAC/E,4EAA4E;AAC5E,qEAAqE;AAErE,MAAM,UAAU,eAAe,CAC7B,UAAkB,EAClB,yBAA+C;IAE/C,IAAI,UAAU,KAAK,kBAAkB;QAAE,OAAO,IAAI,CAAC;IACnD,8EAA8E;IAC9E,iFAAiF;IACjF,qEAAqE;IACrE,MAAM,OAAO,GAAG,yBAAyB,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAChF,OAAO,gFAAgF,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACxG,CAAC;AAUD;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,EAAe,EACf,MAAmB,EACnB,OAAqB,EAAE;IAEvB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;IAEvB,+EAA+E;IAC/E,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS;YAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,6DAA6D;IAC7D,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnG,MAAM,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM;QACxC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACnE,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,IAAI,GAAG,IAAI,GAAG,EAAiB,CAAC;IACtC,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ;YAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,gBAAgB,GAAG,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE1F,aAAa;IACb,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAClC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;YAAE,SAAS,CAAE,oDAAoD;QAE7F,+CAA+C;QAC/C,IAAI,OAAO,GAAQ,EAAE,CAAC;QACtB,IAAI,CAAC;YAAC,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QACxG,MAAM,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;QAAC,CAAC;QACvB,MAAM,OAAO,GAAG,6BAA6B,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAChF,MAAM,QAAQ,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxC,QAAQ,GAAG,gBAAgB,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,kBAAkB,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC9F,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;oBAAC,QAAQ,GAAG,kBAAkB,GAAG,IAAI,CAAC;oBAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAAC,CAAC;YAChH,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,KAAK,GAAmB,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;QACxG,IAAI,KAAK,CAAC,YAAY;YAAE,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEzD,uCAAuC;QACvC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,GAAG,EAAE,CAAC;gBAAC,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBAAC,IAAI,QAAQ,GAAG,IAAI;oBAAE,QAAQ,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;QAClI,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,cAAc,CAAC;QAC/D,yEAAyE;QACzE,IAAI,IAAI,IAAI,CAAC,IAAI,QAAQ,GAAG,GAAG;YAAE,SAAS;QAE1C,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ;YAChE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { WorkspaceDB } from "../../store/database.js";
|
|
2
|
+
export type RelatednessCategory = "dependency" | "containment" | "evolution" | "conflict" | "loose";
|
|
3
|
+
export interface MinBlock {
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
type: string;
|
|
7
|
+
project_id: string | null;
|
|
8
|
+
}
|
|
9
|
+
export interface RootEdge {
|
|
10
|
+
source_id: string;
|
|
11
|
+
target_id: string;
|
|
12
|
+
type: string;
|
|
13
|
+
}
|
|
14
|
+
export interface RelatedPair {
|
|
15
|
+
root_a: string;
|
|
16
|
+
root_b: string;
|
|
17
|
+
categories: Partial<Record<RelatednessCategory, number>>;
|
|
18
|
+
total: number;
|
|
19
|
+
/** Label of the root the other sits under (most subordinating edges point here), or null. */
|
|
20
|
+
parent: string | null;
|
|
21
|
+
parent_subordinating_edges: number;
|
|
22
|
+
}
|
|
23
|
+
export interface RootRelatedness {
|
|
24
|
+
pairs: RelatedPair[];
|
|
25
|
+
standalone: string[];
|
|
26
|
+
}
|
|
27
|
+
/** Pure: classify cross-root edges into a meaning-categorized relatedness map. Testable. */
|
|
28
|
+
export declare function classifyRootRelatedness(blocks: MinBlock[], edges: RootEdge[]): RootRelatedness;
|
|
29
|
+
/** DB wrapper: read blocks + active relations, classify. */
|
|
30
|
+
export declare function deriveRootRelatedness(db: WorkspaceDB): RootRelatedness;
|
|
31
|
+
//# sourceMappingURL=root-relatedness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-relatedness.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/root-relatedness.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,WAAW,EAAS,MAAM,yBAAyB,CAAC;AAElE,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;AAgBpG,MAAM,WAAW,QAAQ;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAAE;AACjG,MAAM,WAAW,QAAQ;IAAG,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AAEjF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,6FAA6F;IAC7F,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,0BAA0B,EAAE,MAAM,CAAC;CACpC;AACD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,4FAA4F;AAC5F,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,eAAe,CAwC9F;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,WAAW,GAAG,eAAe,CAOtE"}
|