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,131 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
// INLINE DEDUP — recognize-before-write (run dedup BEFORE Pass 4 links)
|
|
3
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// DO: For each block this turn just wrote (Pass 3, still status='pending'),
|
|
6
|
+
// find a same-scope existing block that is the SAME claim (exact /
|
|
7
|
+
// token-overlap / drift-embedding), flag it, and run the universal
|
|
8
|
+
// flag-reviewer so a confirmed duplicate is MERGED — all BEFORE Pass 4
|
|
9
|
+
// gets a chance to wire a relation between the pair.
|
|
10
|
+
//
|
|
11
|
+
// SERVE: compounding. One piece of residue should be ONE block. A dead_end the
|
|
12
|
+
// agent reached once, restated (reworded) in a later turn, must collapse
|
|
13
|
+
// to a single block — not accrete near-copies that bury each other and
|
|
14
|
+
// erode the agent's trust in the graph.
|
|
15
|
+
//
|
|
16
|
+
// CARRY: this exists at THIS seam (pre-Pass-4) for one reason. The async AUDIT
|
|
17
|
+
// already detects + the reviewer already merges — but the AUDIT runs
|
|
18
|
+
// AFTER Pass 4, and Pass 4 wires `extends` between a block and its own
|
|
19
|
+
// restatement. The reviewer then correctly reads `extends` as
|
|
20
|
+
// "elaboration, keep both" and LEAVES the pair. Running the SAME detection
|
|
21
|
+
// + the SAME reviewer one step EARLIER (before the linker) means the
|
|
22
|
+
// reviewer judges the pair on content, with no spurious edge in the way.
|
|
23
|
+
// The async AUDIT stays as the cross-SESSION backstop + healer.
|
|
24
|
+
//
|
|
25
|
+
// REUSE (no new logic, no new prompt):
|
|
26
|
+
// - judgeBlockDupPair / toAuditBlock / blockDupJudgeOpts / the idempotency
|
|
27
|
+
// helpers ← stage-audit-graph.ts (the ONE detection implementation)
|
|
28
|
+
// - writePipelineFlag ← pipeline-flags.ts
|
|
29
|
+
// - runFlagReviewerTick + executeMerge (edge-union) ← flag-reviewer.ts
|
|
30
|
+
//
|
|
31
|
+
// Containment: gated behind NODEDEX_INLINE_DEDUP (default OFF). The reviewer's
|
|
32
|
+
// executeMerge ARCHIVES the loser (recoverable, charter Rule 2 — never deletes)
|
|
33
|
+
// and UNIONS its edges onto the survivor (a block can belong to many chains:
|
|
34
|
+
// "write once, belong to many" — merging must not cost connections).
|
|
35
|
+
import { writePipelineFlag } from "./pipeline-flags.js";
|
|
36
|
+
import { runFlagReviewerTick } from "./flag-reviewer.js";
|
|
37
|
+
import { toAuditBlock, judgeBlockDupPair, blockDupJudgeOpts, hasSupersedesBetween, flagAlreadyExists, sharedConceptCount, } from "./stage-audit-graph.js";
|
|
38
|
+
/** Gate. Default OFF — the inline merge only runs when explicitly opted in. */
|
|
39
|
+
export function inlineDedupEnabled() {
|
|
40
|
+
return (process.env.NODEDEX_INLINE_DEDUP ?? "").toLowerCase() === "on";
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Dedup this turn's new blocks against the existing graph, BEFORE Pass 4 links.
|
|
44
|
+
*
|
|
45
|
+
* @param newBlockIds the ids Pass 3 just created (still status='pending').
|
|
46
|
+
* @returns which of those ids the reviewer merged away (archived) — the caller
|
|
47
|
+
* drops them from the pending set so they never reach Pass 4 / Pass 5.
|
|
48
|
+
*/
|
|
49
|
+
export async function dedupNewBlocksInline(db, provider, newBlockIds) {
|
|
50
|
+
const mergedAway = new Set();
|
|
51
|
+
const mergedAwayLabels = new Set();
|
|
52
|
+
if (newBlockIds.length === 0)
|
|
53
|
+
return { flagsWritten: 0, merges: 0, routed: 0, mergedAway, mergedAwayLabels };
|
|
54
|
+
const raw = db.db;
|
|
55
|
+
const opts = blockDupJudgeOpts();
|
|
56
|
+
// Snapshot the graph ONCE (pre-merge). getAllBlocks excludes archived. byId
|
|
57
|
+
// also lets us recover a merged-away loser's label after it is archived.
|
|
58
|
+
const all = db.getAllBlocks().map(toAuditBlock);
|
|
59
|
+
const byId = new Map(all.map((b) => [b.id, b]));
|
|
60
|
+
const newSet = new Set(newBlockIds);
|
|
61
|
+
let flagsWritten = 0;
|
|
62
|
+
for (const nid of newBlockIds) {
|
|
63
|
+
const a = byId.get(nid);
|
|
64
|
+
// Unscoped blocks can't be safely deduped — same-scope is the merge guard.
|
|
65
|
+
if (!a || a.project_id == null)
|
|
66
|
+
continue;
|
|
67
|
+
for (const b of all) {
|
|
68
|
+
if (b.id === a.id)
|
|
69
|
+
continue;
|
|
70
|
+
// A new-vs-new pair would otherwise be judged twice (a→b and b→a); let the
|
|
71
|
+
// lower id initiate it once. (flagAlreadyExists is the real backstop; this
|
|
72
|
+
// just avoids redundant work.) Existing(b) blocks are always judged.
|
|
73
|
+
if (newSet.has(b.id) && b.id < a.id)
|
|
74
|
+
continue;
|
|
75
|
+
if (b.project_id !== a.project_id)
|
|
76
|
+
continue; // cheap same-scope pre-filter
|
|
77
|
+
const v = judgeBlockDupPair(a, b, opts);
|
|
78
|
+
if (!v.isCandidate)
|
|
79
|
+
continue;
|
|
80
|
+
if (hasSupersedesBetween(raw, a.id, b.id))
|
|
81
|
+
continue;
|
|
82
|
+
if (flagAlreadyExists(raw, "block_dup_candidate", a.id, b.id))
|
|
83
|
+
continue;
|
|
84
|
+
writePipelineFlag(raw, {
|
|
85
|
+
flag_type: "block_dup_candidate",
|
|
86
|
+
block_id_a: a.id,
|
|
87
|
+
block_id_b: b.id,
|
|
88
|
+
criteria: {
|
|
89
|
+
signal: v.signal,
|
|
90
|
+
claim_tokens: v.claimTokens,
|
|
91
|
+
embed_sim: v.signal === "essence_embedding" ? Number(v.embedSim.toFixed(3)) : undefined,
|
|
92
|
+
shared_concepts: sharedConceptCount(a.concepts, b.concepts),
|
|
93
|
+
primary_value: a.primary_value.slice(0, 200),
|
|
94
|
+
scope: a.project_id,
|
|
95
|
+
type_a: a.type, type_b: b.type,
|
|
96
|
+
label_a: a.label, label_b: b.label,
|
|
97
|
+
},
|
|
98
|
+
scope_check: "same",
|
|
99
|
+
origin_writer: "inline_dedup",
|
|
100
|
+
origin_range_id: null,
|
|
101
|
+
});
|
|
102
|
+
flagsWritten += 1;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (flagsWritten === 0)
|
|
106
|
+
return { flagsWritten: 0, merges: 0, routed: 0, mergedAway, mergedAwayLabels };
|
|
107
|
+
// REUSE the universal reviewer + executeMerge. forceAutoMerge: TRUE — inline
|
|
108
|
+
// dedup's whole purpose is to MERGE before Pass 4; a verdict-only pass would
|
|
109
|
+
// leave the block to enter Pass 4 and acquire the very `extends` edge this
|
|
110
|
+
// seam exists to prevent. Contained: gated (default off), archives (never
|
|
111
|
+
// deletes), and only fires on a high-confidence merge verdict. Single tick
|
|
112
|
+
// (reviewer batch default 5): a turn producing >5 dups leans on the async
|
|
113
|
+
// AUDIT backstop for the remainder.
|
|
114
|
+
const tick = await runFlagReviewerTick({ db, provider, forceAutoMerge: true });
|
|
115
|
+
// Which NEW blocks did the reviewer archive? getAllBlocks excludes archived,
|
|
116
|
+
// so a new id absent from the post-merge snapshot was merged away. NOTE: a merge
|
|
117
|
+
// may instead archive the EXISTING block (keeping the new one as winner) — that
|
|
118
|
+
// is still a real merge but won't appear in mergedAway, so the honest merge count
|
|
119
|
+
// comes from the reviewer tick (tick.actions_executed), not mergedAway.size.
|
|
120
|
+
const liveIds = new Set(db.getAllBlocks().map((b) => b.id));
|
|
121
|
+
for (const nid of newBlockIds) {
|
|
122
|
+
if (!liveIds.has(nid)) {
|
|
123
|
+
mergedAway.add(nid);
|
|
124
|
+
const lbl = byId.get(nid)?.label;
|
|
125
|
+
if (lbl)
|
|
126
|
+
mergedAwayLabels.add(lbl);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return { flagsWritten, merges: tick.actions_executed, routed: tick.routed_to_agent, mergedAway, mergedAwayLabels };
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=inline-dedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inline-dedup.js","sourceRoot":"","sources":["../../../src/middleware/reflect/inline-dedup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { LLMProvider } from "../../engine/ai-provider.js";
|
|
2
|
+
import type { Pass2Item } from "./types.js";
|
|
3
|
+
export declare function v2JustifyEnabled(): boolean;
|
|
4
|
+
/** Types that must rest on a based_on edge when they ground out of a finding.
|
|
5
|
+
* decision REQUIRES one (block-types.md). hypothesis / insight require one WHEN
|
|
6
|
+
* they rest on a finding (COMPREHEND STEP 3) — the detector flags every empty one
|
|
7
|
+
* and lets REPAIR return empty for the genuinely-self-standing ones (precision is
|
|
8
|
+
* the LLM's job, not the filter's). preference is excluded on purpose: it extends
|
|
9
|
+
* decision, and a standing lean is actionable without an evidence trail. */
|
|
10
|
+
export declare const GROUNDED_TYPES: ReadonlySet<string>;
|
|
11
|
+
/** Grounded-type items with NO based_on wiring. */
|
|
12
|
+
export declare function findUngroundedConclusions(items: Pass2Item[]): Pass2Item[];
|
|
13
|
+
export interface JustifyVerdict {
|
|
14
|
+
conclusion_id: string;
|
|
15
|
+
evidence_ids: string[];
|
|
16
|
+
reasoning: string;
|
|
17
|
+
}
|
|
18
|
+
/** Apply repair verdicts. Sanitizes hard: a cited id must be in the candidate
|
|
19
|
+
* set OFFERED for that conclusion (falsifiable contract — the model can only
|
|
20
|
+
* cite what it was shown), no self-refs, dedup, and existing links are never
|
|
21
|
+
* overwritten (repair fills absence; it does not re-judge presence).
|
|
22
|
+
* Mutates the matched items' based_on_items in place; returns repaired count. */
|
|
23
|
+
export declare function applyJustifications(items: Pass2Item[], verdicts: JustifyVerdict[], offeredCandidates: Map<string, ReadonlySet<string>>): number;
|
|
24
|
+
/** Build the one batched user input: each ungrounded conclusion + its own group's
|
|
25
|
+
* sibling items as candidates. Returns the input text + the per-conclusion
|
|
26
|
+
* candidate sets (the falsifiable offer applyJustifications checks against). */
|
|
27
|
+
export declare function buildJustifyInput(ungrounded: Pass2Item[], items: Pass2Item[], groupByItemId?: Record<string, string>): {
|
|
28
|
+
input: string;
|
|
29
|
+
offered: Map<string, ReadonlySet<string>>;
|
|
30
|
+
};
|
|
31
|
+
export interface JustifyResult {
|
|
32
|
+
ran: boolean;
|
|
33
|
+
ungrounded: number;
|
|
34
|
+
repaired: number;
|
|
35
|
+
}
|
|
36
|
+
export declare function runJustifyConclusions(provider: LLMProvider, items: Pass2Item[], groupByItemId?: Record<string, string>): Promise<JustifyResult>;
|
|
37
|
+
//# sourceMappingURL=justify-decisions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"justify-decisions.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/justify-decisions.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,wBAAgB,gBAAgB,IAAI,OAAO,CAG1C;AAID;;;;;6EAK6E;AAC7E,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,CAAkD,CAAC;AAElG,mDAAmD;AACnD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAIzE;AAID,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;kFAIkF;AAClF,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAAE,EAClB,QAAQ,EAAE,cAAc,EAAE,EAC1B,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,GAClD,MAAM,CAiBR;AA6CD;;iFAEiF;AACjF,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,SAAS,EAAE,EACvB,KAAK,EAAE,SAAS,EAAE,EAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAA;CAAE,CAiB9D;AAID,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,OAAO,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,SAAS,EAAE,EAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACrC,OAAO,CAAC,aAAa,CAAC,CAqBxB"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
// v2 JUSTIFY — repair missing conclusion→evidence wiring (the route-back pattern)
|
|
3
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// THE GAP (2026-06-11 React-arc retest): COMPREHEND's prompt demands "every
|
|
6
|
+
// decision needs >=1 based_on" and SEAM-1 already WARNS when one is missing
|
|
7
|
+
// (comprehend.ts validateComprehendResult) — but nothing consumed the warning.
|
|
8
|
+
// 7/7 decisions arrived with empty based_on_items → Pass 5 correctly assembled
|
|
9
|
+
// 0 chains (no causal path reached a committed conclusion) and the decisions
|
|
10
|
+
// lost their re-openable WHY. Prompt-asking is not enforcement (charter rule 4).
|
|
11
|
+
//
|
|
12
|
+
// GENERALIZED to all GROUNDED conclusions (2026-06-15): the same gap bites a
|
|
13
|
+
// hypothesis or insight that rests on a finding — COMPREHEND STEP 3 demands their
|
|
14
|
+
// based_on too. It paired with the evidence_for fix (the hypothesis observation now
|
|
15
|
+
// becomes its OWN block instead of folding into an evidence_for field), so the edge
|
|
16
|
+
// from conclusion → that observation must be enforced, not just asked for. DETECT now
|
|
17
|
+
// covers {decision, hypothesis, insight}; preference stays excluded (it extends
|
|
18
|
+
// decision — a standing lean is actionable without an evidence trail).
|
|
19
|
+
//
|
|
20
|
+
// THE FIX, each part at its competence (charter rule 3):
|
|
21
|
+
// DETECT (code, pure) — grounded-type items whose based_on_items is empty,
|
|
22
|
+
// checked on the POST-MERGE composed items.
|
|
23
|
+
// REPAIR (LLM, judgment) — ONE batched call: each ungrounded conclusion + its
|
|
24
|
+
// OWN GROUP's sibling items; the model names which ids
|
|
25
|
+
// actually ground it. EMPTY IS A VALID ANSWER — the
|
|
26
|
+
// justifying evidence may be out-of-scope this session
|
|
27
|
+
// (missing-link discipline: never fabricate).
|
|
28
|
+
// APPLY (code, pure) — sanitize: only ids from the offered candidate list,
|
|
29
|
+
// no self-refs, dedup, never overwrite existing links.
|
|
30
|
+
// One attempt, no retry loop (seam-α's locked budget).
|
|
31
|
+
// Malformed result → no-op (the pass_judge lesson:
|
|
32
|
+
// a failed repairer must never make things worse).
|
|
33
|
+
//
|
|
34
|
+
// Default ON: NODEDEX_V2_JUSTIFY=0 opts out. Runs in v2-integrate after the
|
|
35
|
+
// cross-group MERGE (so candidates are the surviving items) and before the
|
|
36
|
+
// cross-group LINK / INTEGRATE.
|
|
37
|
+
import { getThinkingBudget } from "./config.js";
|
|
38
|
+
export function v2JustifyEnabled() {
|
|
39
|
+
// DEFAULT ON since 2026-06-12 (part of the validated v2 stack). =0 opts out.
|
|
40
|
+
return process.env.NODEDEX_V2_JUSTIFY !== "0";
|
|
41
|
+
}
|
|
42
|
+
// ─── DETECT (pure) ─────────────────────────────────────────────────────────────
|
|
43
|
+
/** Types that must rest on a based_on edge when they ground out of a finding.
|
|
44
|
+
* decision REQUIRES one (block-types.md). hypothesis / insight require one WHEN
|
|
45
|
+
* they rest on a finding (COMPREHEND STEP 3) — the detector flags every empty one
|
|
46
|
+
* and lets REPAIR return empty for the genuinely-self-standing ones (precision is
|
|
47
|
+
* the LLM's job, not the filter's). preference is excluded on purpose: it extends
|
|
48
|
+
* decision, and a standing lean is actionable without an evidence trail. */
|
|
49
|
+
export const GROUNDED_TYPES = new Set(["decision", "hypothesis", "insight"]);
|
|
50
|
+
/** Grounded-type items with NO based_on wiring. */
|
|
51
|
+
export function findUngroundedConclusions(items) {
|
|
52
|
+
return items.filter((it) => GROUNDED_TYPES.has(it.type) && (!Array.isArray(it.based_on_items) || it.based_on_items.length === 0));
|
|
53
|
+
}
|
|
54
|
+
/** Apply repair verdicts. Sanitizes hard: a cited id must be in the candidate
|
|
55
|
+
* set OFFERED for that conclusion (falsifiable contract — the model can only
|
|
56
|
+
* cite what it was shown), no self-refs, dedup, and existing links are never
|
|
57
|
+
* overwritten (repair fills absence; it does not re-judge presence).
|
|
58
|
+
* Mutates the matched items' based_on_items in place; returns repaired count. */
|
|
59
|
+
export function applyJustifications(items, verdicts, offeredCandidates) {
|
|
60
|
+
const byId = new Map(items.map((it) => [it.id, it]));
|
|
61
|
+
let repaired = 0;
|
|
62
|
+
for (const v of verdicts) {
|
|
63
|
+
if (!v || typeof v.conclusion_id !== "string" || !Array.isArray(v.evidence_ids))
|
|
64
|
+
continue;
|
|
65
|
+
const it = byId.get(v.conclusion_id);
|
|
66
|
+
const offered = offeredCandidates.get(v.conclusion_id);
|
|
67
|
+
if (!it || !offered)
|
|
68
|
+
continue; // only conclusions we actually asked about
|
|
69
|
+
if (Array.isArray(it.based_on_items) && it.based_on_items.length > 0)
|
|
70
|
+
continue; // never overwrite
|
|
71
|
+
const clean = [...new Set(v.evidence_ids)].filter((id) => typeof id === "string" && id !== v.conclusion_id && offered.has(id));
|
|
72
|
+
if (clean.length === 0)
|
|
73
|
+
continue; // legitimate-empty → stays unwired
|
|
74
|
+
it.based_on_items = clean;
|
|
75
|
+
repaired++;
|
|
76
|
+
}
|
|
77
|
+
return repaired;
|
|
78
|
+
}
|
|
79
|
+
// ─── REPAIR prompt (definitional, falsifiable, universal) ──────────────────────
|
|
80
|
+
const JUSTIFY_PROMPT = `Some CONCLUSIONS extracted from a session are missing their evidence wiring — the
|
|
81
|
+
link to what each one was actually reasoned from. Your job is to restore ONLY the
|
|
82
|
+
links that the session itself supports.
|
|
83
|
+
|
|
84
|
+
A based_on link means: the conclusion RESTS ON that block — the finding, limit,
|
|
85
|
+
observation, or prior conclusion that grounds it. Remove the evidence and the
|
|
86
|
+
conclusion loses its footing.
|
|
87
|
+
|
|
88
|
+
For each conclusion below, read its candidate blocks (the other knowledge from the
|
|
89
|
+
SAME thread of the session) and name the ids whose content grounds it.
|
|
90
|
+
|
|
91
|
+
RULES:
|
|
92
|
+
- Cite ONLY ids from that conclusion's own candidate list.
|
|
93
|
+
- Nearness is not grounding: a block from the same thread that the conclusion
|
|
94
|
+
does not rest on is NOT evidence. To cite a block you must be able to state how
|
|
95
|
+
the conclusion depends on it.
|
|
96
|
+
- EMPTY is a correct answer: when the grounding evidence is not among the
|
|
97
|
+
candidates (it may live outside this session), return an empty list. Never
|
|
98
|
+
pick a "best available" block that does not actually ground the conclusion.
|
|
99
|
+
- reasoning: one line per conclusion naming HOW the cited blocks ground it (or
|
|
100
|
+
why the list is empty).`;
|
|
101
|
+
const JUSTIFY_SCHEMA = {
|
|
102
|
+
type: "object",
|
|
103
|
+
properties: {
|
|
104
|
+
justifications: {
|
|
105
|
+
type: "array",
|
|
106
|
+
items: {
|
|
107
|
+
type: "object",
|
|
108
|
+
properties: {
|
|
109
|
+
conclusion_id: { type: "string" },
|
|
110
|
+
evidence_ids: { type: "array", items: { type: "string" } },
|
|
111
|
+
reasoning: { type: "string" },
|
|
112
|
+
},
|
|
113
|
+
required: ["conclusion_id", "evidence_ids", "reasoning"],
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
required: ["justifications"],
|
|
118
|
+
};
|
|
119
|
+
/** Build the one batched user input: each ungrounded conclusion + its own group's
|
|
120
|
+
* sibling items as candidates. Returns the input text + the per-conclusion
|
|
121
|
+
* candidate sets (the falsifiable offer applyJustifications checks against). */
|
|
122
|
+
export function buildJustifyInput(ungrounded, items, groupByItemId) {
|
|
123
|
+
const groupOf = (it) => groupByItemId?.[it.id] ?? it.id.split("::")[0] ?? "_";
|
|
124
|
+
const offered = new Map();
|
|
125
|
+
const sections = [];
|
|
126
|
+
for (const d of ungrounded) {
|
|
127
|
+
const g = groupOf(d);
|
|
128
|
+
const candidates = items.filter((it) => it.id !== d.id && groupOf(it) === g);
|
|
129
|
+
offered.set(d.id, new Set(candidates.map((c) => c.id)));
|
|
130
|
+
const candLines = candidates
|
|
131
|
+
.map((c) => ` - ${c.id} [${c.type}] ${String(c.text ?? "").slice(0, 160)}`)
|
|
132
|
+
.join("\n");
|
|
133
|
+
sections.push(`CONCLUSION ${d.id} [${d.type}]: ${String(d.text ?? "").slice(0, 200)}\n` +
|
|
134
|
+
` CANDIDATES (this conclusion's thread):\n${candLines || " (none)"}`);
|
|
135
|
+
}
|
|
136
|
+
return { input: sections.join("\n\n"), offered };
|
|
137
|
+
}
|
|
138
|
+
export async function runJustifyConclusions(provider, items, groupByItemId) {
|
|
139
|
+
if (!v2JustifyEnabled())
|
|
140
|
+
return { ran: false, ungrounded: 0, repaired: 0 };
|
|
141
|
+
const ungrounded = findUngroundedConclusions(items);
|
|
142
|
+
if (ungrounded.length === 0)
|
|
143
|
+
return { ran: false, ungrounded: 0, repaired: 0 };
|
|
144
|
+
const { input, offered } = buildJustifyInput(ungrounded, items, groupByItemId);
|
|
145
|
+
try {
|
|
146
|
+
const r = await provider.generateStructured(JUSTIFY_PROMPT, input, JUSTIFY_SCHEMA, { thinkingBudget: getThinkingBudget(1024), maxOutputTokens: 4096 });
|
|
147
|
+
// SEAM contract: a truthy result without justifications[] is malformed → no-op
|
|
148
|
+
// (a failed repairer must never make things worse).
|
|
149
|
+
const verdicts = Array.isArray(r.result?.justifications) ? r.result.justifications : [];
|
|
150
|
+
const repaired = applyJustifications(items, verdicts, offered);
|
|
151
|
+
console.log(`Auto-Reflect v2 JUSTIFY: ${ungrounded.length} ungrounded conclusion(s) → ${repaired} repaired`);
|
|
152
|
+
return { ran: true, ungrounded: ungrounded.length, repaired };
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
console.warn(`Auto-Reflect v2 JUSTIFY failed (${e?.message ?? e}) — conclusions left as-is (already SEAM-1-warned)`);
|
|
156
|
+
return { ran: true, ungrounded: ungrounded.length, repaired: 0 };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=justify-decisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"justify-decisions.js","sourceRoot":"","sources":["../../../src/middleware/reflect/justify-decisions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
import type { WorkspaceDB } from "../../store/database.js";
|
|
3
|
+
import type { LLMProvider } from "../../engine/ai-provider.js";
|
|
4
|
+
import type { PipelineFlag } from "./types.js";
|
|
5
|
+
/** Opt-in. Default OFF — auto-mutation from parsed NL stays gated until validated. */
|
|
6
|
+
export declare function nlAcceptEnabled(): boolean;
|
|
7
|
+
export interface NlResolution {
|
|
8
|
+
flag_id: string;
|
|
9
|
+
verdict: "merge" | "leave" | "split" | "none";
|
|
10
|
+
winning_block_id?: string;
|
|
11
|
+
confidence: "high" | "medium" | "low";
|
|
12
|
+
quote: string;
|
|
13
|
+
}
|
|
14
|
+
export interface NlAcceptResult {
|
|
15
|
+
addressed: number;
|
|
16
|
+
merged: number;
|
|
17
|
+
left: number;
|
|
18
|
+
split: number;
|
|
19
|
+
skipped_low_conf: number;
|
|
20
|
+
errors: number;
|
|
21
|
+
}
|
|
22
|
+
/** Build the parse input: the agent's message + each open question with its two
|
|
23
|
+
* candidate ids (the agent-facing surface hides ids; the internal parser needs
|
|
24
|
+
* them to name a winner). */
|
|
25
|
+
export declare function buildNlAcceptInput(raw: Database.Database, agentText: string, flags: PipelineFlag[]): string;
|
|
26
|
+
/**
|
|
27
|
+
* Read the agent's reply, match it to its routed flags, apply the confident verdicts.
|
|
28
|
+
* Gated + work-gated + cost-aware: returns a no-op result with no LLM call when
|
|
29
|
+
* disabled or when nothing is routed. `opts.force` bypasses ONLY the enabled-gate
|
|
30
|
+
* (tests); the work-gate + safety checks always hold.
|
|
31
|
+
*/
|
|
32
|
+
export declare function resolveRoutedFlagsFromText(db: WorkspaceDB, provider: LLMProvider, agentText: string, opts?: {
|
|
33
|
+
force?: boolean;
|
|
34
|
+
}): Promise<NlAcceptResult>;
|
|
35
|
+
//# sourceMappingURL=nl-accept.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nl-accept.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/nl-accept.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAW/C,sFAAsF;AACtF,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAyCD;;8BAE8B;AAC9B,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,MAAM,CAgB3G;AAyBD;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,WAAW,EACf,QAAQ,EAAE,WAAW,EACrB,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7B,OAAO,CAAC,cAAc,CAAC,CA4CzB"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// nl-accept.ts — flag-resolution part (b): apply the agent's NL decision.
|
|
2
|
+
//
|
|
3
|
+
// The agent is read-only and passive — it can't call a write endpoint. So when the
|
|
4
|
+
// system routes a question to it (a possible-duplicate it couldn't resolve alone,
|
|
5
|
+
// surfaced via workspace_stats.flags), the agent just STATES its decision in its
|
|
6
|
+
// normal reply ("those two are the same — keep customer-c's"). This module reads that
|
|
7
|
+
// reply, matches it back to the open flags, and applies the verdict via the shared
|
|
8
|
+
// applier. Read-only-preserving: the agent never writes; the pipeline does.
|
|
9
|
+
//
|
|
10
|
+
// SAFETY (this is auto-mutation triggered by parsing free text):
|
|
11
|
+
// • DEFAULT OFF — NODEDEX_FLAG_NL_ACCEPT=on to enable (opt-in, per the 3-tier
|
|
12
|
+
// release model: auto-mutation stays opt-in until validated).
|
|
13
|
+
// • WORK-GATED — $0 when no flags are routed to the agent (no LLM call).
|
|
14
|
+
// • NEVER-FABRICATE — a resolution is applied only if the LLM can QUOTE the agent's
|
|
15
|
+
// own words for it AND that quote actually appears in the reply.
|
|
16
|
+
// • CONSERVATIVE MERGE — a destructive merge fires only at high confidence with a
|
|
17
|
+
// valid winner; a weak merge-lean is LEFT PENDING (explicit confirmation needed),
|
|
18
|
+
// mirroring the autonomous reviewer. leave/split are non-destructive.
|
|
19
|
+
import { getAgentPendingFlags } from "./pipeline-flags.js";
|
|
20
|
+
import { loadBlockSnapshot } from "./flag-reviewer.js";
|
|
21
|
+
import { scopeSegmentOfLabel } from "./retrieve-graph-slice.js";
|
|
22
|
+
import { renderAgentFlag } from "./render-agent-flag.js";
|
|
23
|
+
import { normalizeForMatch } from "./provenance-check.js";
|
|
24
|
+
import { applyFlagVerdict } from "./apply-flag-verdict.js";
|
|
25
|
+
import { getThinkingBudget } from "./config.js";
|
|
26
|
+
const NL_BATCH = 8; // bound the questions handed to one parse call
|
|
27
|
+
/** Opt-in. Default OFF — auto-mutation from parsed NL stays gated until validated. */
|
|
28
|
+
export function nlAcceptEnabled() {
|
|
29
|
+
return (process.env.NODEDEX_FLAG_NL_ACCEPT ?? "").toLowerCase() === "on";
|
|
30
|
+
}
|
|
31
|
+
const NL_ACCEPT_PROMPT = `You apply an agent's stated decisions about pending memory-graph questions.
|
|
32
|
+
|
|
33
|
+
You are given the AGENT'S MESSAGE (free text it just wrote) and a list of OPEN QUESTIONS the system asked it. Each question is a possible-duplicate the system couldn't resolve alone: two candidate entries A and B (each with an id).
|
|
34
|
+
|
|
35
|
+
For EACH open question, decide whether the agent's message EXPLICITLY answered it, and if so what it decided:
|
|
36
|
+
- "merge": the agent said the two entries are the SAME thing. Set winning_block_id to the id of the entry it wants to KEEP (must be A's id or B's id for that question).
|
|
37
|
+
- "leave": the agent said they are DIFFERENT / keep both separate.
|
|
38
|
+
- "split": the agent said keep both but something structural must change, or it needs more work.
|
|
39
|
+
- "none": the agent did NOT clearly address this question. THIS IS THE DEFAULT.
|
|
40
|
+
|
|
41
|
+
HARD RULES (a wrong apply corrupts the graph — be conservative):
|
|
42
|
+
- NEVER invent a decision. If the agent did not clearly speak to a question, output "none".
|
|
43
|
+
- \`quote\` MUST be the agent's own words (a verbatim substring of its message) that express the decision. If you cannot quote them, the verdict is "none".
|
|
44
|
+
- winning_block_id must be exactly one of the two candidate ids GIVEN for that question.
|
|
45
|
+
- "high" confidence only when the agent was explicit and unambiguous.
|
|
46
|
+
|
|
47
|
+
OUTPUT JSON per schema: one entry per question you were given (use "none" + empty quote for the ones the agent didn't address).`;
|
|
48
|
+
const NL_ACCEPT_SCHEMA = {
|
|
49
|
+
type: "object",
|
|
50
|
+
properties: {
|
|
51
|
+
resolutions: {
|
|
52
|
+
type: "array",
|
|
53
|
+
items: {
|
|
54
|
+
type: "object",
|
|
55
|
+
properties: {
|
|
56
|
+
flag_id: { type: "string" },
|
|
57
|
+
verdict: { type: "string", enum: ["merge", "leave", "split", "none"] },
|
|
58
|
+
winning_block_id: { type: "string" },
|
|
59
|
+
confidence: { type: "string", enum: ["high", "medium", "low"] },
|
|
60
|
+
quote: { type: "string" },
|
|
61
|
+
},
|
|
62
|
+
required: ["flag_id", "verdict", "confidence", "quote"],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
required: ["resolutions"],
|
|
67
|
+
};
|
|
68
|
+
/** Build the parse input: the agent's message + each open question with its two
|
|
69
|
+
* candidate ids (the agent-facing surface hides ids; the internal parser needs
|
|
70
|
+
* them to name a winner). */
|
|
71
|
+
export function buildNlAcceptInput(raw, agentText, flags) {
|
|
72
|
+
const sections = ["AGENT'S MESSAGE:", agentText.trim(), "", "OPEN QUESTIONS:"];
|
|
73
|
+
for (const flag of flags) {
|
|
74
|
+
const rendered = renderAgentFlag(raw, flag);
|
|
75
|
+
if (!rendered)
|
|
76
|
+
continue;
|
|
77
|
+
const a = loadBlockSnapshot(raw, flag.block_id_a);
|
|
78
|
+
const b = flag.block_id_b ? loadBlockSnapshot(raw, flag.block_id_b) : null;
|
|
79
|
+
sections.push("", `QUESTION flag_id=${flag.id}:`, ` asked: ${rendered.question}`, a ? ` Candidate A: id=${a.id} owner=${scopeSegmentOfLabel(a.label)} says="${a.primary_value || a.essence}"` : ` Candidate A: (gone)`, b ? ` Candidate B: id=${b.id} owner=${scopeSegmentOfLabel(b.label)} says="${b.primary_value || b.essence}"` : ` Candidate B: (none)`);
|
|
80
|
+
}
|
|
81
|
+
return sections.join("\n");
|
|
82
|
+
}
|
|
83
|
+
async function callNlAcceptLLM(provider, input) {
|
|
84
|
+
try {
|
|
85
|
+
const r = await provider.generateStructured(NL_ACCEPT_PROMPT, input, NL_ACCEPT_SCHEMA, { thinkingBudget: getThinkingBudget(1024), maxOutputTokens: 4096 });
|
|
86
|
+
return r.result ?? null;
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** The agent's quote must actually be in its message (never-fabricate anchor). */
|
|
93
|
+
function quoteIsGrounded(agentText, quote) {
|
|
94
|
+
if (!quote || !quote.trim())
|
|
95
|
+
return false;
|
|
96
|
+
const nt = normalizeForMatch(agentText);
|
|
97
|
+
const nq = normalizeForMatch(quote);
|
|
98
|
+
return nq.length > 0 && nt.includes(nq);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Read the agent's reply, match it to its routed flags, apply the confident verdicts.
|
|
102
|
+
* Gated + work-gated + cost-aware: returns a no-op result with no LLM call when
|
|
103
|
+
* disabled or when nothing is routed. `opts.force` bypasses ONLY the enabled-gate
|
|
104
|
+
* (tests); the work-gate + safety checks always hold.
|
|
105
|
+
*/
|
|
106
|
+
export async function resolveRoutedFlagsFromText(db, provider, agentText, opts = {}) {
|
|
107
|
+
const result = { addressed: 0, merged: 0, left: 0, split: 0, skipped_low_conf: 0, errors: 0 };
|
|
108
|
+
if (!opts.force && !nlAcceptEnabled())
|
|
109
|
+
return result; // gate (default off)
|
|
110
|
+
if (!agentText || agentText.trim().length < 20)
|
|
111
|
+
return result;
|
|
112
|
+
const raw = db.db;
|
|
113
|
+
const flags = getAgentPendingFlags(raw, { limit: NL_BATCH });
|
|
114
|
+
if (flags.length === 0)
|
|
115
|
+
return result; // work-gate ($0)
|
|
116
|
+
const llm = await callNlAcceptLLM(provider, buildNlAcceptInput(raw, agentText, flags));
|
|
117
|
+
if (!llm || !Array.isArray(llm.resolutions)) {
|
|
118
|
+
result.errors += 1;
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
const flagById = new Map(flags.map((f) => [f.id, f]));
|
|
122
|
+
for (const r of llm.resolutions) {
|
|
123
|
+
const flag = flagById.get(r.flag_id);
|
|
124
|
+
if (!flag)
|
|
125
|
+
continue; // defense vs hallucinated id
|
|
126
|
+
if (r.verdict === "none")
|
|
127
|
+
continue;
|
|
128
|
+
if (!quoteIsGrounded(agentText, r.quote))
|
|
129
|
+
continue; // never-fabricate
|
|
130
|
+
result.addressed += 1;
|
|
131
|
+
if (r.verdict === "merge") {
|
|
132
|
+
const validWinner = r.winning_block_id === flag.block_id_a || r.winning_block_id === flag.block_id_b;
|
|
133
|
+
if (r.confidence === "high" && validWinner) {
|
|
134
|
+
const applied = applyFlagVerdict(db, flag, {
|
|
135
|
+
verdict: "merge", execute: true, winning_block_id: r.winning_block_id,
|
|
136
|
+
reason: `Agent confirmed duplicate in conversation: "${r.quote}"`,
|
|
137
|
+
});
|
|
138
|
+
if (applied.ok && applied.action_taken !== "none")
|
|
139
|
+
result.merged += 1;
|
|
140
|
+
else
|
|
141
|
+
result.errors += 1;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
// Merge-lean but weak (low/medium confidence, or winner not in the pair) —
|
|
145
|
+
// do NOT auto-archive on weak NL evidence. Leave the flag PENDING so it can
|
|
146
|
+
// be confirmed explicitly (the agent can re-state, or the user decides).
|
|
147
|
+
result.skipped_low_conf += 1;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else if (r.verdict === "leave" || r.verdict === "split") {
|
|
151
|
+
const applied = applyFlagVerdict(db, flag, {
|
|
152
|
+
verdict: r.verdict,
|
|
153
|
+
reason: `Agent decided in conversation: "${r.quote}"`,
|
|
154
|
+
});
|
|
155
|
+
if (applied.ok) {
|
|
156
|
+
if (r.verdict === "leave")
|
|
157
|
+
result.left += 1;
|
|
158
|
+
else
|
|
159
|
+
result.split += 1;
|
|
160
|
+
}
|
|
161
|
+
else
|
|
162
|
+
result.errors += 1;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return result;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=nl-accept.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nl-accept.js","sourceRoot":"","sources":["../../../src/middleware/reflect/nl-accept.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { LLMProvider } from "../../engine/ai-provider.js";
|
|
2
|
+
import type { Pass0Result } from "./types.js";
|
|
3
|
+
export declare const PASS0_PROMPT = "You receive raw agent output \u2014 thinking and final response from an AI assistant.\nRead the ENTIRE content as a whole before filling out this scene card.\n\n\u2500\u2500 STATE CONVENTION \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\"State\" in this prompt = text in marked regions below (TRANSCRIPT, AGENT THINKING,\nKNOWN PROJECTS, OPEN BLUEPRINTS). Your training knowledge, pretrained familiarity,\nand what is \"well-known in the field\" are NOT state. When you reference state \u2014\ne.g. matching a term against KNOWN PROJECTS \u2014 you must be able to point to the\nexact line in the marked region. Familiarity \u2260 recorded state.\n\nYour goal: describe what happened in this session so that downstream extraction can\ncorrectly classify and link each piece of information. Observe and describe \u2014 do not\nassign types. Be concise \u2014 one line per entry.\n\nRecord names, labels, and terms exactly as they appear in the transcript. Do not\nexpand abbreviations or add parenthetical clarifications to terms not spelled out in\nthe source \u2014 your job is to record what is there, not infer what it means.\n\n\u2500\u2500 INPUT TYPE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nAsk: \"Does this text describe decisions and events from a specific session \u2014\nor does it synthesize general domain knowledge with no session frame?\"\n\n Session-scoped: references to \"this session\", choices made now, trials run,\n approaches adopted or rejected in a specific context, work in progress,\n temporal markers (\"today\", \"this sprint\", \"the team decided\") \u2192 CONVERSATIONAL\n Note: the input is always an agent's summary \u2014 single voice narrating session\n events is still CONVERSATIONAL if the events have a session temporal frame.\n\n Domain knowledge synthesis: no session frame, conclusions stated as general\n findings (\"X is proven\", \"Y has been superseded in the field\", \"Z remains\n an open problem\"), no choices being made now \u2192 KNOWLEDGE_SYNTHESIS\n For KS input, SECTION 3 (actor-actions) and SECTION 4 (tasks) will be sparse\n or empty \u2014 that is correct. SECTION 7 (REPLACEMENTS) should also be empty\n unless a participant in THIS session is actively deciding to replace X with Y.\n \"The industry moved from X to Y\" is a domain fact, not a session replacement.\n\nSet input_type field to CONVERSATIONAL or KNOWLEDGE_SYNTHESIS. This field is used\nby downstream passes to adjust their framing.\n\n\u2500\u2500 SECTION 1: PROJECTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nEvery project, product, or system this session is about.\nName + one-line scope.\n\nIf KNOWN PROJECTS are provided, check them first.\nTranscripts use generic self-referential terms to describe participants: \"the company\",\n\"the team\", \"the organization\", \"our group\", \"the lab\", \"the division\", \"the firm\".\nThese are pronouns \u2014 how participants refer to themselves. They are NOT project names.\n\nProject names are specific coined identifiers: a code name, product name, initiative name,\nor organization-specific proper noun. A generic noun that could describe any organization\nis never a project name.\n\nRule: if the transcript uses a generic term that clearly refers to a known project \u2192\nuse the known project name, not the generic term.\nRule: if no known project matches, use the most specific identifier from the transcript\n(a product name, initiative name, proper noun) \u2014 never the generic noun itself.\nRule: express every project name in label format \u2014 lowercase, hyphens only, no underscores,\nno spaces (e.g. \"x-initiative\" not \"X Initiative\"). This name becomes the project_creates[]\nlabel in Pass 3. A name that is not label-safe breaks downstream processing.\n\nSCOPE PROJECT \u2014 also identify the ONE overarching subject of the whole transcript.\nEvery transcript has exactly one. Specific systems and products still go in projects[];\nthe scope project is the umbrella they sit under \u2014 and the home for cross-cutting\nknowledge that belongs to no single project. If the transcript is about a single\nproject, the scope project IS that project. Set scope_project = { name, scope },\nname in the same label format. It must always be filled.\n\n\u2500\u2500 SECTION 2: PEOPLE AND ROLES \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nEveryone mentioned. For each person, set:\n role = what they contributed (decision_maker, constraint_source, executor, observer)\n signal_type = how they appear in the transcript (named, inferred, role_only)\nRoles:\n decision_maker \u2014 confirmed, approved, or chose something\n constraint_source \u2014 imposed an external requirement (auditor, vendor, regulator)\n executor \u2014 will build or implement something\n observer \u2014 described facts without making choices\n\n\u2500\u2500 SECTION 3: ACTOR-ACTION LOG \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nSignificant actions as tuples: [actor] \u2192 [verb] \u2192 [object] \u2192 [outcome or nil]\nOnly actions with lasting consequences. Skip narration and logistics.\n\n\u2500\u2500 SECTION 4: APPROACHES AND OPTIONS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nEvery approach, tool, system, method, model, hypothesis, methodology, or strategy\nthat appeared as a choice point \u2014 regardless of domain.\nFor each: name, project (if known), and a description of what happened to it.\nDescribe what was observed. Do not assign a type \u2014 use the descriptions below.\n\nFor each approach, ask: \"What does the text say about this concept's current standing?\"\n\nDescription formats \u2014 for CONVERSATIONAL input (session-temporal framing):\n In prior use, being replaced this session:\n \"[name] has been in active use for [period], being replaced by Y this session\"\n Adopted or confirmed this session:\n \"[name] selected as the [role], confirmed this session\"\n Explicitly excluded by named authority:\n \"[name] ruled out by [authority]: [reason]\"\n Formally evaluated and rejected (requires an actual trial, pilot, or dedicated time):\n \"[name] formally evaluated for [duration], rejected: [reason]\"\n Casually mentioned, no engagement:\n \"[name] mentioned speculatively only: '[quote]'\"\n \"[name] briefly dismissed with reasons but no prior use\"\n Currently in use, no change: \"[name] in active use, no change this session\"\n Committed for future evaluation: \"[name] committed to formal evaluation in [period]: [what]\"\n\nDescription formats \u2014 for KNOWLEDGE_SYNTHESIS input (domain-status framing):\n Historically dominant, now generally superseded:\n \"[name] was the dominant approach for [period/context], now generally superseded by [Y]\"\n Currently standard or widely adopted:\n \"[name] is the current standard approach for [function]\"\n Proposed or emerging, not yet established:\n \"[name] proposed as alternative to [Y], [current evidence status]\"\n Evaluated and abandoned in domain practice:\n \"[name] tried in [context], abandoned: [reason]\"\n Mentioned for comparison only:\n \"[name] mentioned for comparison: [brief context]\"\n\nFormat: \"name [project] \u2014 description\"\nThe [project] MUST be a short project label from SECTION 1 (e.g., \"project-a\", \"my-initiative\").\nNever use a block ID, a full label string, or any value that contains underscores or numbers.\nJSON field mapping: name \u2192 name field | [project] \u2192 project field (label only) | description \u2192 context field.\nThe project field contains ONLY the short label. The context field contains ONLY the description phrase. Never mix them.\nExamples:\n \"approach-A [project-x] \u2014 has been in use for months, being replaced by approach-B this session\"\n \"option-C [project-x] \u2014 mentioned speculatively only: 'would have handled problem P differently'\"\n \"option-D [project-y] \u2014 ruled out by [authority]: violates standing policy\"\n \"methodology-F [org] \u2014 formally evaluated for 3 months, rejected: high inter-rater variability\"\n\nKEY DISTINCTION \u2014 speculative mention vs substantive rejection:\n Ask: \"Was a path into X actually entered \u2014 did anyone commit resources to it\n (time to investigate, a trial, a deployment, a structured comparison) \u2014\n or did X enter this conversation as a suggestion and leave as a dismissal?\n Reasoning about what X would cost is not entering the path.\"\n\n Path entered \u2014 in active use:\n X was in use before this session, now being replaced \u2192 \"in prior use, being replaced\"\n Path entered \u2014 committed investigation:\n Someone was assigned to evaluate X, a trial ran, or resources were allocated to it.\n \"Did someone actually try X \u2014 or reason about what trying X would cost?\"\n Estimating the expense of X is not investing in X. \u2192 \"formally evaluated, rejected\"\n Path not entered \u2014 speculative:\n X raised and dismissed, no follow-up committed. Expert reasoning against X\n reflects knowledge about X, not prior investigation of X for this project.\n \u2192 \"mentioned speculatively\" or \"briefly dismissed with reasons but no prior use\"\n\n When ambiguous: default to \"briefly dismissed\" description.\n A misplaced speculative is recoverable. A misplaced \"formally evaluated\" creates false signal.\n\n\u2500\u2500 SECTION 5: TASKS (work actively in progress) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nWork that is currently underway \u2014 NOT yet complete.\nAsk: \"Are resources actively committed to this \u2014 in progress, not yet done?\"\nFormat: \"project_name: person \u2014 what they are doing\"\nDO NOT include: status-only confirmations with no new content (\"X is on track\", \"X is going well\",\n\"X has no blockers\"). Those add no new graph knowledge.\nDO NOT include future evaluations or investigations not yet started \u2014 these belong in\nSECTION 4 APPROACHES with the \"committed for future evaluation\" description.\n\n\u2500\u2500 SECTION 6: CAUSAL LINKS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nX \u2192 Y where X caused Y, even if they appear in different paragraphs.\nOnly clear causal chains. Keep entries short.\n\nJOINT CAUSATION \u2014 multiple abandonments/failures jointly driving one adoption:\n Capture as ONE entry with compound cause. Format: \"cause-A + cause-B \u2192 effect\"\n Example: \"[X-abandoned] + [Y-abandoned] \u2192 [Z-adopted]\"\n\n\u2500\u2500 SECTION 7: REPLACEMENTS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nThings that were in active use and are being replaced THIS session \u2014 announced now, not already done.\nScan the ENTIRE transcript for replacement pairs \u2014 these are mandatory dead_end\ncandidates for Pass 1.\n\nGATE: If INPUT TYPE = KNOWLEDGE SYNTHESIS, ask:\n \"Is a participant in THIS session deciding to replace X with Y \u2014 or is the text\n reporting that X has generally been replaced by Y in the domain?\"\n Reporting a domain-wide shift \u2192 not a replacement pair. Put in UNCHANGED instead.\n\nA replacement pair exists when ALL THREE are true:\n - X was actively in use AND\n - X is being replaced or retired by Y AND\n - This replacement is announced NOW in this session, not referenced as already done\n\nAsk: \"Is this replacement happening now \u2014 or referenced as prior-session context?\"\n Happening now \u2192 REPLACEMENTS. Already done \u2192 UNCHANGED instead.\n\nFormat: { predecessor: \"X\", replacement: \"Y\", function: \"what both served\" }\nUse actual names from transcript. Leave empty if no replacement pairs exist.\n\n\u2500\u2500 SECTION 8: UNCHANGED \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nThings being reported as already resolved \u2014 surfaced as context for the current work,\nnot being worked out in this session.\n\nGATE: If INPUT TYPE = KNOWLEDGE_SYNTHESIS, this section should be EMPTY.\n KS has no prior session \u2014 all content is domain knowledge, not recap.\n Downstream passes use UNCHANGED to skip items as duplicates \u2014 filling it for KS kills correct items.\n\nFor CONVERSATIONAL input only:\n\nFor each entry in SECTION 4 (APPROACHES), ask:\n \"Is the speaker explicitly presenting this as carried-over context from a prior session \u2014\n or is it being worked out now?\"\n Being worked out now (chosen, rejected, evaluated, investigated this session) \u2192 SECTION 4 only\n Speaker presents it as prior-session context, not active work \u2192 SECTION 4 AND here\n\nAlso ask for anything else in the transcript:\n \"Is a speaker explicitly presenting this as resolved prior context \u2014 or as something new?\"\n Resolved prior context \u2192 include here\n New this session \u2192 do not include here\n\nAn entry can appear in both SECTION 4 and SECTION 8. They serve different purposes:\nSECTION 4 = engagement description (Pass 2). SECTION 8 = recap signal (Pass 1). Both needed.\n\n\u2500\u2500 SCENE CARD REASONING (diagnostic) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nscene_card_reasoning: In 1-2 sentences \u2014 what input type did you identify\n(CONVERSATIONAL or KNOWLEDGE SYNTHESIS), and what drove the key APPROACHES\ndescriptions you chose (especially for any \"formally evaluated\" or \"in prior use\" entries)?";
|
|
4
|
+
export declare function formatSceneCard(card: Pass0Result): string;
|
|
5
|
+
export declare function callPass0LLM(provider: LLMProvider, agentThinking: string, agentOutput: string, openBlueprints?: Array<{
|
|
6
|
+
label: string;
|
|
7
|
+
essence: string;
|
|
8
|
+
}>, knownRoots?: Array<{
|
|
9
|
+
label: string;
|
|
10
|
+
essence: string;
|
|
11
|
+
}>, userMessage?: string): Promise<{
|
|
12
|
+
result: Pass0Result | null;
|
|
13
|
+
rateLimited: boolean;
|
|
14
|
+
model?: string;
|
|
15
|
+
attempts?: Array<{
|
|
16
|
+
model: string;
|
|
17
|
+
outcome: string;
|
|
18
|
+
}>;
|
|
19
|
+
}>;
|
|
20
|
+
//# sourceMappingURL=pass0.d.ts.map
|