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,178 @@
|
|
|
1
|
+
import { reflectTokenStats } from "./context.js";
|
|
2
|
+
import { getThinkingBudget, modelForPass } from "./config.js";
|
|
3
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
4
|
+
// PASS 5 — CHAIN ASSEMBLY
|
|
5
|
+
// Job: find causally connected clusters in this turn's new blocks and name them
|
|
6
|
+
// as retrievable chain objects. Runs after Pass 4 has wired all relations.
|
|
7
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
8
|
+
const PASS5_PROMPT = `You receive blocks saved this turn and the causal relations between them.
|
|
9
|
+
|
|
10
|
+
── STATE CONVENTION ─────────────────────────────────────────────────────────
|
|
11
|
+
"State" in this prompt = text in marked regions below (NEW BLOCKS THIS TURN,
|
|
12
|
+
CAUSAL RELATIONS BETWEEN THEM). Your training knowledge of "how such arcs
|
|
13
|
+
typically conclude" is NOT state. A committed conclusion exists ONLY if a
|
|
14
|
+
member block in NEW BLOCKS has the right type and the cluster's relations
|
|
15
|
+
terminate on it. Familiarity with the domain's typical patterns is irrelevant.
|
|
16
|
+
|
|
17
|
+
Your job: find clusters of causally connected blocks and assemble each into a named chain.
|
|
18
|
+
|
|
19
|
+
── WHAT IS A CHAIN ───────────────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
A chain is a named arc that captures a complete story: evidence or failures led
|
|
22
|
+
to a committed conclusion. It is a retrievable summary of how a cluster of blocks
|
|
23
|
+
resolved into an outcome.
|
|
24
|
+
|
|
25
|
+
A chain requires:
|
|
26
|
+
- At least 2 blocks connected by a causal-thread relation: prompted_by, based_on,
|
|
27
|
+
supports (X is evidence for Y — e.g. a specific failure supports a general
|
|
28
|
+
dead-end), supersedes, or resolves
|
|
29
|
+
- A committed conclusion — ask: "Does this cluster end in a block that represents
|
|
30
|
+
a closed outcome — something the cluster produced or resolved — not just an
|
|
31
|
+
observation, a work-in-progress, or accumulated context?"
|
|
32
|
+
|
|
33
|
+
Committed conclusion (valid terminus):
|
|
34
|
+
(X) was chosen from real alternatives → decision
|
|
35
|
+
(X) was established as an external boundary → constraint
|
|
36
|
+
(A) + (B) were synthesised into a new conclusion → insight, reasoning_chain
|
|
37
|
+
(X) was definitively replaced or abandoned → dead_end as final block
|
|
38
|
+
|
|
39
|
+
NOT a committed conclusion (do not create a chain):
|
|
40
|
+
(X) is true — observation with no resolution attached → fact alone
|
|
41
|
+
(X) is planned but not yet built or confirmed → blueprint
|
|
42
|
+
(X) is being worked on → task
|
|
43
|
+
A cluster where every block is accumulated context with no arc produced
|
|
44
|
+
|
|
45
|
+
- The blocks must be from the same project
|
|
46
|
+
|
|
47
|
+
Do NOT create a chain for:
|
|
48
|
+
- A single block with no causal connections
|
|
49
|
+
- A cluster with no committed conclusion (open arcs, pure accumulation, tasks only)
|
|
50
|
+
- Blocks from different projects (each project gets its own chain)
|
|
51
|
+
|
|
52
|
+
── CHAIN NAMING ──────────────────────────────────────────────────────────────
|
|
53
|
+
|
|
54
|
+
{project}_chain_{capability-area}
|
|
55
|
+
|
|
56
|
+
project = the project prefix (same as member blocks)
|
|
57
|
+
capability-area = the system capability this arc resolved
|
|
58
|
+
Name the WHAT (the capability), not the HOW (mechanism)
|
|
59
|
+
and not the WHY (cause). 2-4 words, hyphens only.
|
|
60
|
+
|
|
61
|
+
"What system capability now exists or changed because of this arc?"
|
|
62
|
+
That answer is the capability-area.
|
|
63
|
+
|
|
64
|
+
Test: "What system capability now exists or changed because of this arc?"
|
|
65
|
+
The answer to that question is the capability-area.
|
|
66
|
+
Strip "because", "using", "via", "from" — what remains is the concept.
|
|
67
|
+
Name the RESULT (what now works), not the PROCESS (how it was achieved).
|
|
68
|
+
|
|
69
|
+
── CHAIN ESSENCE ─────────────────────────────────────────────────────────────
|
|
70
|
+
|
|
71
|
+
One sentence, ≤140 chars. The compressed story: what was tried/required, what
|
|
72
|
+
failed or was imposed, what was adopted. Should stand alone as a summary.
|
|
73
|
+
|
|
74
|
+
"First approach hit scaling limit; second approach had prohibitive overhead cost; third approach adopted as primary solution"
|
|
75
|
+
"First method showed high variance across sites; second method validated at acceptable consistency; second method adopted as standard"
|
|
76
|
+
|
|
77
|
+
── MEMBERS AND ARC ───────────────────────────────────────────────────────────
|
|
78
|
+
|
|
79
|
+
members: block labels in causal order — cause-first, outcome-last.
|
|
80
|
+
arc: type sequence matching members order, e.g. "fact → dead_end → decision"
|
|
81
|
+
|
|
82
|
+
── CONCLUSION ────────────────────────────────────────────────────────────────
|
|
83
|
+
|
|
84
|
+
conclusion: the specific committed outcome this arc produced.
|
|
85
|
+
A noun phrase (≤80 chars) naming what now exists or is established.
|
|
86
|
+
This is the terminal answer to "what did this arc resolve into?"
|
|
87
|
+
|
|
88
|
+
NOT a restatement of the essence. NOT a sentence. NOT the mechanism.
|
|
89
|
+
The WHAT — the named capability, decision, or practice that now exists.
|
|
90
|
+
|
|
91
|
+
Test: "What named capability, decision, or practice now exists?"
|
|
92
|
+
Must be a noun phrase (≤80 chars), not a sentence.
|
|
93
|
+
Name the WHAT (capability), not the HOW (mechanism).
|
|
94
|
+
Strip "by", "through", "via" — what remains is the conclusion.
|
|
95
|
+
|
|
96
|
+
── REASONING (REQUIRED PER CHAIN) ────────────────────────────────────────────
|
|
97
|
+
|
|
98
|
+
For each chain emit a reasoning field that explains WHY in two parts, naming
|
|
99
|
+
specific member blocks:
|
|
100
|
+
|
|
101
|
+
1. WHY THESE MEMBERS: which causal relations make these blocks one cluster
|
|
102
|
+
(cite the specific prompted_by / based_on / supports / supersedes / resolves
|
|
103
|
+
links that bind them; explain why excluded blocks are excluded if relevant).
|
|
104
|
+
2. WHY THIS CONCLUSION: which member block is the committed terminus and
|
|
105
|
+
which terminus test it passes ("decision: chosen from real alternatives" /
|
|
106
|
+
"constraint: established as external boundary" / "insight: synthesised
|
|
107
|
+
from A+B" / "dead_end: definitively abandoned as final").
|
|
108
|
+
|
|
109
|
+
Reasoning must reference SPECIFIC block labels — not generic phrasing. A
|
|
110
|
+
chain whose reasoning cannot name the concrete cluster-link and the concrete
|
|
111
|
+
terminus-block fails the WHAT-IS-A-CHAIN test; do not emit it.
|
|
112
|
+
|
|
113
|
+
── OUTPUT ────────────────────────────────────────────────────────────────────
|
|
114
|
+
|
|
115
|
+
Return chains[] with one entry per valid cluster. Each entry includes the
|
|
116
|
+
reasoning field per the section above.
|
|
117
|
+
If no valid clusters exist → return chains: []`;
|
|
118
|
+
const PASS5_SCHEMA = {
|
|
119
|
+
type: "object",
|
|
120
|
+
properties: {
|
|
121
|
+
chains: {
|
|
122
|
+
type: "array",
|
|
123
|
+
items: {
|
|
124
|
+
type: "object",
|
|
125
|
+
properties: {
|
|
126
|
+
chain_label: { type: "string" },
|
|
127
|
+
chain_essence: { type: "string" },
|
|
128
|
+
arc: { type: "string" },
|
|
129
|
+
conclusion: { type: "string" },
|
|
130
|
+
members: { type: "array", items: { type: "string" } },
|
|
131
|
+
reasoning: { type: "string" }, // per-chain WHY (members + conclusion)
|
|
132
|
+
},
|
|
133
|
+
required: ["chain_label", "chain_essence", "arc", "conclusion", "members", "reasoning"],
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
required: ["chains"],
|
|
138
|
+
};
|
|
139
|
+
export async function callPass5LLM(provider, newBlocks, causalRels) {
|
|
140
|
+
if (newBlocks.length < 2)
|
|
141
|
+
return { result: null, rateLimited: false };
|
|
142
|
+
const blockById = new Map(newBlocks.map(b => [b.id, b]));
|
|
143
|
+
// Only include relations where both ends are in new blocks
|
|
144
|
+
const relevantRels = causalRels.filter(r => blockById.has(r.source_id) && blockById.has(r.target_id));
|
|
145
|
+
if (relevantRels.length === 0)
|
|
146
|
+
return { result: null, rateLimited: false };
|
|
147
|
+
const blocksSection = `NEW BLOCKS THIS TURN:\n${newBlocks.map(b => {
|
|
148
|
+
return ` ${b.label} [${b.type}] — "${b.essence}"`;
|
|
149
|
+
}).join("\n")}\n`;
|
|
150
|
+
const relsSection = `\nCAUSAL RELATIONS BETWEEN THEM:\n${relevantRels.map(r => {
|
|
151
|
+
const src = blockById.get(r.source_id);
|
|
152
|
+
const tgt = blockById.get(r.target_id);
|
|
153
|
+
return ` ${src?.label} --[${r.type}]--> ${tgt?.label}`;
|
|
154
|
+
}).join("\n")}`;
|
|
155
|
+
const userInput = blocksSection + relsSection;
|
|
156
|
+
const r = await provider.generateStructured(PASS5_PROMPT, userInput, PASS5_SCHEMA, {
|
|
157
|
+
thinkingBudget: getThinkingBudget(512), // respects NODEDEX_THINKING_BUDGET; pass5 bills its share
|
|
158
|
+
modelOverride: modelForPass("pass5"),
|
|
159
|
+
});
|
|
160
|
+
// debt-4 §3: pass5 has its OWN bucket. Pre-fix this incremented pass4's bucket
|
|
161
|
+
// ("pass5 is lightweight, no separate counter needed") which inflated pass4
|
|
162
|
+
// cost AND hid pass5 from cost_breakdown. Empirically pass5 wall_ms is ~5-12s
|
|
163
|
+
// and it bills thinking — not lightweight enough to merge.
|
|
164
|
+
if (r.usage) {
|
|
165
|
+
reflectTokenStats.pass5.input += r.usage.input ?? 0;
|
|
166
|
+
reflectTokenStats.pass5.thinking += r.usage.thinking ?? 0;
|
|
167
|
+
reflectTokenStats.pass5.output += r.usage.output ?? 0;
|
|
168
|
+
}
|
|
169
|
+
reflectTokenStats.pass5.calls += 1;
|
|
170
|
+
if (r.result) {
|
|
171
|
+
console.log(`Auto-Reflect Pass 5: ${r.result.chains?.length ?? 0} chain(s) assembled | tokens: in=${r.usage?.input ?? "?"} think=${r.usage?.thinking ?? "?"} out=${r.usage?.output ?? "?"}`);
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
console.warn(`Auto-Reflect Pass 5: ${r.rateLimited ? "rate limited" : "failed"} — skipping (non-critical)`);
|
|
175
|
+
}
|
|
176
|
+
return { result: r.result ?? null, rateLimited: r.rateLimited, model: r.model, attempts: r.attempts };
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=pass5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pass5.js","sourceRoot":"","sources":["../../../src/middleware/reflect/pass5.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { LLMProvider } from "../../engine/ai-provider.js";
|
|
2
|
+
import type { Pass1Item } from "./types.js";
|
|
3
|
+
export declare const PASS_JUDGE_PROMPT = "You receive items extracted from one session of an AI agent\nworking on a project. The extractor maximises RECALL \u2014 it finds every discrete claim it can.\nYour job is to apply a single binary worth test to each item and decide KEEP or DROP.\n\nYou do NOT change item types. You do NOT merge items. You do NOT extract anything new.\nCover every input item exactly once.\n\n\u2500\u2500 THE TEST (one question, applied per item) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\"Could a competent instance of the model \u2014 given the project context, but WITHOUT having\nlived this session \u2014 already know this item, or trivially produce it?\"\n\n YES \u2192 general knowledge / scaffolding the model already carries \u2192 DROP.\n NO \u2192 specific to this session's lived path \u2192 KEEP.\n\nThe session is what makes an item path-specific. \"The model already knows it\" is what makes\nit scaffolding. The test is the same for every type.\n\n\u2500\u2500 ASYMMETRIC COST (calibration, not restraint) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nA dropped decision, dead_end, or constraint is UNRECOVERABLE \u2014 it was forged in this\nsession and will not come back if discarded. So is a session-specific observation,\nmeasurement, or stated value: a model cannot reproduce a number someone measured here,\nand a conclusion loses its grounding when the finding it rests on is dropped.\nOnly a GENERAL-KNOWLEDGE fact \u2014 one the model already carries \u2014 is FREE; that, and only\nthat, the model produces again on demand.\n\n When uncertain \u2192 KEEP.\n The default verdict is KEEP. DROP only when you can name the general source the item\n duplicates, or identify the specific scaffolding test it fails (below).\n\n\u2500\u2500 CLARIFYING TESTS \u2014 two faces of the same one question \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nTEST A \u2014 Considered options.\n If the item describes an approach or option the agent considered:\n \u2022 Did the agent CHOOSE this approach? \u2192 residue (decision). KEEP.\n \u2022 Did the agent ENTER this approach then ABANDON it with a reason? \u2192 residue\n (dead_end). KEEP.\n \u2022 Did the agent merely NAME this approach while thinking, without choosing\n or trying it? \u2192 it left no residue; the list of options is general knowledge\n the model would generate on demand. DROP with reason_category = option_merely_named.\n\nTEST B \u2014 Why vs When.\n If the item describes causality or sequence:\n \u2022 Does it carry a WHY \u2014 the transferable validity condition (this holds because\n of that)? \u2192 residue future sessions can use. KEEP.\n \u2022 Does it carry only a WHEN \u2014 a procedural sequence (do X, then Y, then Z) with\n no reason recorded? \u2192 procedural scaffolding the model can re-derive from\n the decisions. DROP with reason_category = procedural_when_sequence.\n\nIf neither clarifying test applies and the spine question above returns DROP, use\nreason_category = general_knowledge.\n\n\u2500\u2500 PER-ITEM LOCALITY \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nJudge each item INDEPENDENTLY against the spine question. Do not look at how many you\nhave kept or dropped overall. Do not balance the batch. Do not consider what other\nitems might do. Each verdict is local to its item.\n\n\u2500\u2500 OUTPUT \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nFor every input item, emit exactly one verdict record:\n { item_id, verdict: \"KEEP\" | \"DROP\", reason_category, notes? }\n\nreason_category is REQUIRED.\n For KEEP : \"path_specific_residue\"\n For DROP : \"general_knowledge\" | \"option_merely_named\" | \"procedural_when_sequence\"\nnotes is OPTIONAL \u2014 one short sentence \u2014 use only when the standard reason_category does\nnot adequately capture why you decided as you did.\n\nDo not invent item ids. Do not change item types. Do not omit any input item.\n";
|
|
4
|
+
export interface PassJudgeVerdict {
|
|
5
|
+
item_id: string;
|
|
6
|
+
verdict: "KEEP" | "DROP";
|
|
7
|
+
reason_category: "path_specific_residue" | "general_knowledge" | "option_merely_named" | "procedural_when_sequence";
|
|
8
|
+
notes?: string;
|
|
9
|
+
reasoning?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface PassJudgeResult {
|
|
12
|
+
verdicts: PassJudgeVerdict[];
|
|
13
|
+
}
|
|
14
|
+
export declare function callPassJudgeLLM(provider: LLMProvider, pass1Items: Pass1Item[], sceneCard: string | undefined, agentThinking: string, agentOutput: string, thinkingBudget?: number, userMessage?: string, roleById?: Record<string, string>): Promise<{
|
|
15
|
+
result: PassJudgeResult | null;
|
|
16
|
+
rateLimited: boolean;
|
|
17
|
+
model?: string;
|
|
18
|
+
attempts?: Array<{
|
|
19
|
+
model: string;
|
|
20
|
+
outcome: string;
|
|
21
|
+
}>;
|
|
22
|
+
}>;
|
|
23
|
+
/**
|
|
24
|
+
* Apply judge verdicts to Pass 1 items, with safe ref-cleanup.
|
|
25
|
+
*
|
|
26
|
+
* Rules:
|
|
27
|
+
* 1. If judge result is null (call failed), pass-through ALL items — judge failure
|
|
28
|
+
* must never silently drop residue. Precision is an improvement, not a blocker.
|
|
29
|
+
* 2. If a KEPT item references a DROPPED item via extends_id (the only intra-batch
|
|
30
|
+
* reference Pass 1 carries), override the drop and KEEP the parent too. Never
|
|
31
|
+
* lose an anchor of something we're keeping — preserves the asymmetric cost.
|
|
32
|
+
* Records the override for audit.
|
|
33
|
+
* 3. Items missing from the judge's verdicts default to KEEP (defensive — never
|
|
34
|
+
* silently drop on judge omission).
|
|
35
|
+
*
|
|
36
|
+
* Returns the kept item set, the final dropped verdicts (post-override), and the list
|
|
37
|
+
* of anchor overrides for the turn log.
|
|
38
|
+
*/
|
|
39
|
+
export declare function applyJudgeVerdicts(pass1Items: Pass1Item[], judge: PassJudgeResult | null): {
|
|
40
|
+
kept: Pass1Item[];
|
|
41
|
+
dropped: PassJudgeVerdict[];
|
|
42
|
+
anchorOverrides: string[];
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=pass_judge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pass_judge.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/pass_judge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA8B5C,eAAO,MAAM,iBAAiB,g1JAmE7B,CAAC;AA0BF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,eAAe,EAAE,uBAAuB,GAAG,mBAAmB,GAAG,qBAAqB,GAAG,0BAA0B,CAAC;IACpH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAmCD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,WAAW,EACrB,UAAU,EAAE,SAAS,EAAE,EACvB,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,cAAc,SAAO,EACrB,WAAW,GAAE,MAAW,EACxB,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACpC,OAAO,CAAC;IAAE,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAgEzI;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,SAAS,EAAE,EACvB,KAAK,EAAE,eAAe,GAAG,IAAI,GAC5B;IAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CA0B/E"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { reflectTokenStats } from "./context.js";
|
|
2
|
+
import { modelForPass } from "./config.js";
|
|
3
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
4
|
+
// PASS JUDGE — PRECISION FILTER (between Pass 1 and Pass 2)
|
|
5
|
+
//
|
|
6
|
+
// Job: For each Pass 1 item, apply the charter §2.1 path-specificity test and
|
|
7
|
+
// return one binary verdict (KEEP | DROP) with a reason_category.
|
|
8
|
+
// Does NOT change types, merge items, or extract anything new.
|
|
9
|
+
//
|
|
10
|
+
// Role: Pass 1 maximises recall (finds everything). JUDGE filters for
|
|
11
|
+
// precision (drops scaffolding / general knowledge / merely-named
|
|
12
|
+
// options). Pass 2 then dedups and wires what survived.
|
|
13
|
+
//
|
|
14
|
+
// Why this is OK to ask the LLM (where the failed pass1-residue reframe was not):
|
|
15
|
+
// • The reframe asked Pass 1 to NOT-EMIT things during extraction — restraint,
|
|
16
|
+
// a weak LLM skill (charter rule 4). The result was inconsistent across
|
|
17
|
+
// domains (over-extraction doc).
|
|
18
|
+
// • JUDGE asks "given this item, is it path-specific?" — a local binary
|
|
19
|
+
// judgment on an existing artifact. That is the LLM's competence.
|
|
20
|
+
//
|
|
21
|
+
// Charter compliance:
|
|
22
|
+
// rule 3 — semantic per-item judgment → LLM (this), not code.
|
|
23
|
+
// rule 4 — schema enforces per-item local verdict, no batch coordination.
|
|
24
|
+
// rule 6 — never overrides a success: filters at extraction layer, pre-commit;
|
|
25
|
+
// nothing committed to the DB is touched.
|
|
26
|
+
// rule 7 — deterministic on probabilistic input is still probabilistic.
|
|
27
|
+
// Document validation as multi-run + read reasoning, not single-run.
|
|
28
|
+
// rule 14 — uses the §2.1 sharpened worth test verbatim.
|
|
29
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
30
|
+
export const PASS_JUDGE_PROMPT = `You receive items extracted from one session of an AI agent
|
|
31
|
+
working on a project. The extractor maximises RECALL — it finds every discrete claim it can.
|
|
32
|
+
Your job is to apply a single binary worth test to each item and decide KEEP or DROP.
|
|
33
|
+
|
|
34
|
+
You do NOT change item types. You do NOT merge items. You do NOT extract anything new.
|
|
35
|
+
Cover every input item exactly once.
|
|
36
|
+
|
|
37
|
+
── THE TEST (one question, applied per item) ────────────────────────────────
|
|
38
|
+
"Could a competent instance of the model — given the project context, but WITHOUT having
|
|
39
|
+
lived this session — already know this item, or trivially produce it?"
|
|
40
|
+
|
|
41
|
+
YES → general knowledge / scaffolding the model already carries → DROP.
|
|
42
|
+
NO → specific to this session's lived path → KEEP.
|
|
43
|
+
|
|
44
|
+
The session is what makes an item path-specific. "The model already knows it" is what makes
|
|
45
|
+
it scaffolding. The test is the same for every type.
|
|
46
|
+
|
|
47
|
+
── ASYMMETRIC COST (calibration, not restraint) ─────────────────────────────
|
|
48
|
+
A dropped decision, dead_end, or constraint is UNRECOVERABLE — it was forged in this
|
|
49
|
+
session and will not come back if discarded. So is a session-specific observation,
|
|
50
|
+
measurement, or stated value: a model cannot reproduce a number someone measured here,
|
|
51
|
+
and a conclusion loses its grounding when the finding it rests on is dropped.
|
|
52
|
+
Only a GENERAL-KNOWLEDGE fact — one the model already carries — is FREE; that, and only
|
|
53
|
+
that, the model produces again on demand.
|
|
54
|
+
|
|
55
|
+
When uncertain → KEEP.
|
|
56
|
+
The default verdict is KEEP. DROP only when you can name the general source the item
|
|
57
|
+
duplicates, or identify the specific scaffolding test it fails (below).
|
|
58
|
+
|
|
59
|
+
── CLARIFYING TESTS — two faces of the same one question ────────────────────
|
|
60
|
+
|
|
61
|
+
TEST A — Considered options.
|
|
62
|
+
If the item describes an approach or option the agent considered:
|
|
63
|
+
• Did the agent CHOOSE this approach? → residue (decision). KEEP.
|
|
64
|
+
• Did the agent ENTER this approach then ABANDON it with a reason? → residue
|
|
65
|
+
(dead_end). KEEP.
|
|
66
|
+
• Did the agent merely NAME this approach while thinking, without choosing
|
|
67
|
+
or trying it? → it left no residue; the list of options is general knowledge
|
|
68
|
+
the model would generate on demand. DROP with reason_category = option_merely_named.
|
|
69
|
+
|
|
70
|
+
TEST B — Why vs When.
|
|
71
|
+
If the item describes causality or sequence:
|
|
72
|
+
• Does it carry a WHY — the transferable validity condition (this holds because
|
|
73
|
+
of that)? → residue future sessions can use. KEEP.
|
|
74
|
+
• Does it carry only a WHEN — a procedural sequence (do X, then Y, then Z) with
|
|
75
|
+
no reason recorded? → procedural scaffolding the model can re-derive from
|
|
76
|
+
the decisions. DROP with reason_category = procedural_when_sequence.
|
|
77
|
+
|
|
78
|
+
If neither clarifying test applies and the spine question above returns DROP, use
|
|
79
|
+
reason_category = general_knowledge.
|
|
80
|
+
|
|
81
|
+
── PER-ITEM LOCALITY ────────────────────────────────────────────────────────
|
|
82
|
+
Judge each item INDEPENDENTLY against the spine question. Do not look at how many you
|
|
83
|
+
have kept or dropped overall. Do not balance the batch. Do not consider what other
|
|
84
|
+
items might do. Each verdict is local to its item.
|
|
85
|
+
|
|
86
|
+
── OUTPUT ──────────────────────────────────────────────────────────────────
|
|
87
|
+
For every input item, emit exactly one verdict record:
|
|
88
|
+
{ item_id, verdict: "KEEP" | "DROP", reason_category, notes? }
|
|
89
|
+
|
|
90
|
+
reason_category is REQUIRED.
|
|
91
|
+
For KEEP : "path_specific_residue"
|
|
92
|
+
For DROP : "general_knowledge" | "option_merely_named" | "procedural_when_sequence"
|
|
93
|
+
notes is OPTIONAL — one short sentence — use only when the standard reason_category does
|
|
94
|
+
not adequately capture why you decided as you did.
|
|
95
|
+
|
|
96
|
+
Do not invent item ids. Do not change item types. Do not omit any input item.
|
|
97
|
+
`;
|
|
98
|
+
const PASS_JUDGE_SCHEMA = {
|
|
99
|
+
type: "object",
|
|
100
|
+
properties: {
|
|
101
|
+
verdicts: {
|
|
102
|
+
type: "array",
|
|
103
|
+
items: {
|
|
104
|
+
type: "object",
|
|
105
|
+
properties: {
|
|
106
|
+
item_id: { type: "string" },
|
|
107
|
+
verdict: { type: "string", enum: ["KEEP", "DROP"] },
|
|
108
|
+
reason_category: {
|
|
109
|
+
type: "string",
|
|
110
|
+
enum: ["path_specific_residue", "general_knowledge", "option_merely_named", "procedural_when_sequence"],
|
|
111
|
+
},
|
|
112
|
+
notes: { type: "string" },
|
|
113
|
+
reasoning: { type: "string" },
|
|
114
|
+
},
|
|
115
|
+
required: ["item_id", "verdict", "reason_category"],
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
required: ["verdicts"],
|
|
120
|
+
};
|
|
121
|
+
// Appended ONLY when a USER turn is present (NODEDEX_EXTRACT_ALL_SOURCES on). Gives
|
|
122
|
+
// JUDGE the verbatim excerpt + the user turn so the (novelty) worth spine judges the
|
|
123
|
+
// SOURCE not the paraphrase, and requests a per-item rationale (auditability, Rule 8).
|
|
124
|
+
// The worth AXIS is unchanged — the spine's path-specific test (charter §1/§2.1).
|
|
125
|
+
// (The two-prong worth-axis was reverted 2026-06-04: over-extraction is GRANULARITY,
|
|
126
|
+
// not worth — fixed by the Pass 2 fold, not a sharper filter. See fragmentation memo.)
|
|
127
|
+
const PASS_JUDGE_TWO_PARTY_SUFFIX = `
|
|
128
|
+
|
|
129
|
+
── TWO-PARTY INPUT + VERBATIM (present) ────────────────────────────────────
|
|
130
|
+
The session evidence includes a USER turn, and each item now carries its excerpt — the
|
|
131
|
+
verbatim source span. Judge worth against the verbatim and the full exchange, not the
|
|
132
|
+
paraphrased text alone: a paraphrase can read like general knowledge even when the
|
|
133
|
+
source shows it was chosen, tried, or stated by the user this session.
|
|
134
|
+
For each verdict, put a one-line rationale in the reasoning field: what makes it
|
|
135
|
+
path-specific residue, or which general source it duplicates.`;
|
|
136
|
+
// Appended ONLY when the caller supplies each item's structural ROLE (the
|
|
137
|
+
// context-aware judge, NODEDEX_V2_JUDGE_CONTEXT). Lets worth include a block's role in
|
|
138
|
+
// the session's reasoning — NOT a quota signal. Threads the PER-ITEM LOCALITY needle
|
|
139
|
+
// explicitly so the judge doesn't start balancing the batch.
|
|
140
|
+
const PASS_JUDGE_ROLE_SUFFIX = `
|
|
141
|
+
|
|
142
|
+
── STRUCTURAL ROLE (present) ────────────────────────────────────────────────
|
|
143
|
+
Each item now carries a "role" field — what DEPENDS ON it and what it BUILDS ON in this
|
|
144
|
+
session's reasoning (e.g. "needed-by decision; builds-on fact"). Weigh it: a block that
|
|
145
|
+
another block's reasoning RESTS ON is path-specific residue BY ITS ROLE — keep it even
|
|
146
|
+
when its sentence reads like plain knowledge, because dropping it strands what depends on
|
|
147
|
+
it. A block with no role line is judged on its text alone, exactly as before.
|
|
148
|
+
This does NOT relax the per-item rule: you are still judging whether THIS item carries
|
|
149
|
+
residue (now including its structural role) — never balancing the set or matching a quota.
|
|
150
|
+
When the role changed your verdict, say so in the reasoning field (e.g. "kept — needed-by
|
|
151
|
+
a decision, would strand it").`;
|
|
152
|
+
export async function callPassJudgeLLM(provider, pass1Items, sceneCard, agentThinking, agentOutput, thinkingBudget = 1024, userMessage = "", roleById = {}) {
|
|
153
|
+
const sceneCardSection = sceneCard
|
|
154
|
+
? `SCENE CARD (structural shape of this session's path):\n${sceneCard}\n\n---\n\n`
|
|
155
|
+
: "";
|
|
156
|
+
const thinkingSection = agentThinking
|
|
157
|
+
? `AGENT THINKING:\n${agentThinking}\n\n---\n\n`
|
|
158
|
+
: "";
|
|
159
|
+
// Compact items payload — id + provisional_type + text — schema-shaped so the
|
|
160
|
+
// model can address them by id without seeing internal Pass 1 fields.
|
|
161
|
+
const includeUserTurn = !!(userMessage && userMessage.trim());
|
|
162
|
+
const includeRole = Object.keys(roleById).length > 0; // context-aware judge (v2)
|
|
163
|
+
const compactItems = pass1Items.map(i => {
|
|
164
|
+
const c = { id: i.id, provisional_type: i.provisional_type, text: i.text };
|
|
165
|
+
if (includeUserTurn)
|
|
166
|
+
c.excerpt = i.excerpt; // carry the verbatim so worth is judged on source, not paraphrase
|
|
167
|
+
if (includeRole && roleById[i.id])
|
|
168
|
+
c.role = roleById[i.id]; // structural role for context-aware worth
|
|
169
|
+
return c;
|
|
170
|
+
});
|
|
171
|
+
const itemsSection = `ITEMS TO JUDGE (each receives exactly one verdict):\n${JSON.stringify(compactItems, null, 2)}`;
|
|
172
|
+
const userSection = includeUserTurn ? `USER:\n${userMessage}\n\n---\n\n` : "";
|
|
173
|
+
const userInput = `${sceneCardSection}${userSection}${thinkingSection}AGENT OUTPUT:\n${agentOutput}\n\n---\n\n${itemsSection}`;
|
|
174
|
+
let judgePrompt = PASS_JUDGE_PROMPT;
|
|
175
|
+
if (includeUserTurn)
|
|
176
|
+
judgePrompt += PASS_JUDGE_TWO_PARTY_SUFFIX;
|
|
177
|
+
if (includeRole)
|
|
178
|
+
judgePrompt += PASS_JUDGE_ROLE_SUFFIX;
|
|
179
|
+
const r = await provider.generateStructured(judgePrompt, userInput, PASS_JUDGE_SCHEMA, {
|
|
180
|
+
thinkingBudget,
|
|
181
|
+
maxOutputTokens: 8192,
|
|
182
|
+
modelOverride: modelForPass("judge"),
|
|
183
|
+
});
|
|
184
|
+
if (r.result && !Array.isArray(r.result.verdicts)) {
|
|
185
|
+
// SEAM contract: a judge result MUST carry verdicts[]. Provider variance can
|
|
186
|
+
// return a truthy object without it, and consuming that crashes every caller
|
|
187
|
+
// (.filter on undefined took down the whole v2 front-half, 2026-06-11).
|
|
188
|
+
// Malformed = failed → null it so the KEEP-ALL degrade below applies (a failed
|
|
189
|
+
// selector must never drop residue).
|
|
190
|
+
console.warn("Auto-Reflect JUDGE: malformed result (missing verdicts[]) — treating as failed");
|
|
191
|
+
r.result = null;
|
|
192
|
+
}
|
|
193
|
+
if (r.result) {
|
|
194
|
+
// Judge has its own token slot so cost_breakdown attributes it once, to the
|
|
195
|
+
// judge — not double-counted against pass1 (D-fix 2026-05-25).
|
|
196
|
+
reflectTokenStats.pass_judge.input += r.usage?.input ?? 0;
|
|
197
|
+
reflectTokenStats.pass_judge.thinking += r.usage?.thinking ?? 0;
|
|
198
|
+
reflectTokenStats.pass_judge.output += r.usage?.output ?? 0;
|
|
199
|
+
reflectTokenStats.pass_judge.calls += 1;
|
|
200
|
+
const drops = r.result.verdicts.filter(v => v.verdict === "DROP");
|
|
201
|
+
const cats = drops.reduce((acc, v) => { acc[v.reason_category] = (acc[v.reason_category] || 0) + 1; return acc; }, {});
|
|
202
|
+
const catSummary = Object.entries(cats).map(([k, n]) => `${k}=${n}`).join(", ") || "(none)";
|
|
203
|
+
console.log(`Auto-Reflect JUDGE: ${pass1Items.length} → ${pass1Items.length - drops.length} kept (${drops.length} dropped: ${catSummary}) | tokens: in=${r.usage?.input ?? "?"} think=${r.usage?.thinking ?? "?"} out=${r.usage?.output ?? "?"}`);
|
|
204
|
+
for (const v of drops) {
|
|
205
|
+
const note = v.notes ? ` — ${v.notes}` : "";
|
|
206
|
+
console.log(` [JUDGE drop] ${v.item_id} [${v.reason_category}]${note}`);
|
|
207
|
+
}
|
|
208
|
+
// all-sources mode emits a two-prong rationale per item — log it so keep/drop is auditable
|
|
209
|
+
for (const v of r.result.verdicts) {
|
|
210
|
+
if (v.reasoning)
|
|
211
|
+
console.log(` [JUDGE ${v.verdict}] ${v.item_id} :: ${v.reasoning}`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
console.warn(`Auto-Reflect JUDGE: ${r.rateLimited ? "rate limited" : "failed"} — degrading to KEEP-ALL (no items dropped)`);
|
|
216
|
+
}
|
|
217
|
+
return { result: r.result, rateLimited: r.rateLimited, model: r.model, attempts: r.attempts };
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Apply judge verdicts to Pass 1 items, with safe ref-cleanup.
|
|
221
|
+
*
|
|
222
|
+
* Rules:
|
|
223
|
+
* 1. If judge result is null (call failed), pass-through ALL items — judge failure
|
|
224
|
+
* must never silently drop residue. Precision is an improvement, not a blocker.
|
|
225
|
+
* 2. If a KEPT item references a DROPPED item via extends_id (the only intra-batch
|
|
226
|
+
* reference Pass 1 carries), override the drop and KEEP the parent too. Never
|
|
227
|
+
* lose an anchor of something we're keeping — preserves the asymmetric cost.
|
|
228
|
+
* Records the override for audit.
|
|
229
|
+
* 3. Items missing from the judge's verdicts default to KEEP (defensive — never
|
|
230
|
+
* silently drop on judge omission).
|
|
231
|
+
*
|
|
232
|
+
* Returns the kept item set, the final dropped verdicts (post-override), and the list
|
|
233
|
+
* of anchor overrides for the turn log.
|
|
234
|
+
*/
|
|
235
|
+
export function applyJudgeVerdicts(pass1Items, judge) {
|
|
236
|
+
if (!judge)
|
|
237
|
+
return { kept: pass1Items, dropped: [], anchorOverrides: [] };
|
|
238
|
+
const verdictById = new Map(judge.verdicts.map(v => [v.item_id, v]));
|
|
239
|
+
const dropIds = new Set();
|
|
240
|
+
for (const v of judge.verdicts) {
|
|
241
|
+
if (v.verdict === "DROP")
|
|
242
|
+
dropIds.add(v.item_id);
|
|
243
|
+
}
|
|
244
|
+
// Anchor override: if a kept item's extends_id points to a dropped item, override
|
|
245
|
+
// the drop. Pass 1's "extends_id" by definition means the child is meaningless
|
|
246
|
+
// without the parent — keeping the child requires keeping the parent.
|
|
247
|
+
const anchorOverrides = [];
|
|
248
|
+
for (const item of pass1Items) {
|
|
249
|
+
if (!item.extends_id)
|
|
250
|
+
continue;
|
|
251
|
+
if (dropIds.has(item.id))
|
|
252
|
+
continue; // child is dropped too — cascade is fine
|
|
253
|
+
if (dropIds.has(item.extends_id)) {
|
|
254
|
+
dropIds.delete(item.extends_id);
|
|
255
|
+
anchorOverrides.push(item.extends_id);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
// Final dropped set: only verdicts whose ids are still in dropIds after overrides
|
|
259
|
+
const dropped = judge.verdicts.filter(v => v.verdict === "DROP" && dropIds.has(v.item_id));
|
|
260
|
+
const kept = pass1Items.filter(i => !dropIds.has(i.id));
|
|
261
|
+
return { kept, dropped, anchorOverrides };
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=pass_judge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pass_judge.js","sourceRoot":"","sources":["../../../src/middleware/reflect/pass_judge.ts"],"names":[],"mappings":"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"}
|