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,610 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
// PIPELINE v2 — PER-GROUP COMPREHEND (the structural truncate fix; design §17)
|
|
3
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// Splits the one monolithic COMPREHEND call (comprehend.ts) into two, each with ONE
|
|
6
|
+
// job, so each call's OUTPUT is BOUNDED and can't run away (the 307s truncate-retry
|
|
7
|
+
// root cause):
|
|
8
|
+
// CALL 1 SEGMENT (1 call, whole transcript) → the group SKELETON only.
|
|
9
|
+
// CALL 2 PRODUCE (N calls, one per group, PARALLEL) → one group's blocks + links.
|
|
10
|
+
// A thin stitch reassembles the EXISTING ComprehendResult shape, so everything
|
|
11
|
+
// downstream (converter, Pass 2b, recognizer, checkpoint, Pass 3/4/5) is UNCHANGED.
|
|
12
|
+
//
|
|
13
|
+
// Default OFF: NODEDEX_COMPREHEND_PERGROUP=1 (only meaningful under v2). When off,
|
|
14
|
+
// runComprehendFrontHalf uses the original single callComprehendLLM.
|
|
15
|
+
//
|
|
16
|
+
// Prompt discipline (PROMPT-CHARTER): the STATE CONVENTION / worth-spine / STEP
|
|
17
|
+
// text is reused VERBATIM from COMPREHEND_PROMPT (copied, not refactored, to leave
|
|
18
|
+
// the validated 1-call prompt byte-untouched), recomposed for each narrower job.
|
|
19
|
+
// Each stage's MUST-NOTs (design §17.2) are stated in-prompt: SEGMENT never produces
|
|
20
|
+
// content; PRODUCE never re-decides the root or links across threads.
|
|
21
|
+
import { getThinkingBudget } from "./config.js";
|
|
22
|
+
import { validateComprehendResult, summarizeWarnings, comprehendModel, } from "./comprehend.js";
|
|
23
|
+
import { appendFileSync } from "node:fs";
|
|
24
|
+
export function pergroupEnabled() {
|
|
25
|
+
// DEFAULT ON since 2026-06-12 (v2 promoted to default; chooseHolistic still
|
|
26
|
+
// size-decides holistic-vs-pergroup per arc). NODEDEX_COMPREHEND_PERGROUP=0 opts out.
|
|
27
|
+
return process.env.NODEDEX_COMPREHEND_PERGROUP !== "0";
|
|
28
|
+
}
|
|
29
|
+
/** DIAGNOSTIC (flag-gated NODEDEX_DEBUG_PERGROUP=1): dump what each group was told to
|
|
30
|
+
* extract (topic + turn_numbers — note PRODUCE also gets the FULL transcript) and what
|
|
31
|
+
* each block CITES (provenance), so cross-group duplicates can be traced to their cause
|
|
32
|
+
* (overlapping turn_numbers / the same source line claimed by >1 group). Off = no-op. */
|
|
33
|
+
function dumpPerGroupDebug(seg, stitched) {
|
|
34
|
+
const file = process.env.NODEDEX_DEBUG_PERGROUP_FILE || "C:/tmp/pergroup-debug.jsonl";
|
|
35
|
+
const segByGid = new Map((seg.groups ?? []).map((g) => [g.group_id, g]));
|
|
36
|
+
const rec = {
|
|
37
|
+
ts: new Date().toISOString(),
|
|
38
|
+
segment_reasoning: seg.reasoning ?? "",
|
|
39
|
+
groups: (stitched.groups ?? []).map((g) => {
|
|
40
|
+
const sg = segByGid.get(g.group_id);
|
|
41
|
+
return {
|
|
42
|
+
group_id: g.group_id,
|
|
43
|
+
topic: sg?.topic ?? "",
|
|
44
|
+
turn_numbers: sg?.turn_numbers ?? [],
|
|
45
|
+
blocks: (g.blocks ?? []).map((b) => ({
|
|
46
|
+
local_id: b.local_id, type: b.type, unique: b.unique, essence: b.essence, provenance: b.provenance,
|
|
47
|
+
keep_reason: b.keep_reason, type_reasoning: b.type_reasoning,
|
|
48
|
+
})),
|
|
49
|
+
};
|
|
50
|
+
}),
|
|
51
|
+
};
|
|
52
|
+
try {
|
|
53
|
+
appendFileSync(file, JSON.stringify(rec) + "\n");
|
|
54
|
+
}
|
|
55
|
+
catch { /* diagnostic only */ }
|
|
56
|
+
}
|
|
57
|
+
export const SEGMENT_PROMPT = `You read ONE complete work session between a user and an AI agent and split it into
|
|
58
|
+
the THREADS it contains. You do NOT extract any content yet — only the thread
|
|
59
|
+
structure. Read the whole session first.
|
|
60
|
+
|
|
61
|
+
Decide EVERYTHING by reasoning about MEANING in this session's context — what each
|
|
62
|
+
part was trying to DO. Never decide by matching surface words, phrasings, or
|
|
63
|
+
connectors. The same meaning appears in countless wordings across domains; you are
|
|
64
|
+
reading for the structure beneath the words.
|
|
65
|
+
|
|
66
|
+
── STATE CONVENTION ─────────────────────────────────────────────────────────
|
|
67
|
+
"State" = text in the TRANSCRIPT below. Your training knowledge and "what's
|
|
68
|
+
commonly known" are NOT state. If it is not in the transcript, it is not a thread
|
|
69
|
+
here. Familiarity ≠ recorded.
|
|
70
|
+
|
|
71
|
+
── SEGMENT into GROUPS (clusters under a root) ──────────────────────────────
|
|
72
|
+
Split the session into GROUPS. A group is one coherent sub-thread — a single
|
|
73
|
+
problem worked, question pursued, or thing decided. KEEP DISTINCT SUB-THREADS AS
|
|
74
|
+
SEPARATE GROUPS even when they belong to the same overall project; one sub-thread
|
|
75
|
+
scattered across the session is one group. Judge by what the participants were
|
|
76
|
+
trying to do, not by topic words. Do NOT collapse several sub-threads into one big
|
|
77
|
+
group — keep them fine-grained.
|
|
78
|
+
|
|
79
|
+
THEN assign each group a provisional_project — the ONE overarching ROOT it belongs
|
|
80
|
+
to. The ROOT is the project; the GROUP is a CLUSTER under it; ONE root has MANY
|
|
81
|
+
clusters. Sub-threads of the same overall effort SHARE a root but STAY SEPARATE
|
|
82
|
+
GROUPS — same root, several clusters; do NOT merge them into one group.
|
|
83
|
+
• Use a DIFFERENT provisional_project ONLY for a genuinely separate topic — a
|
|
84
|
+
real context-switch or an unrelated tangent.
|
|
85
|
+
• A separate root must have a NAMEABLE SUBJECT: you must be able to say what the
|
|
86
|
+
group's work is ABOUT without referring to the speaker's own remembering,
|
|
87
|
+
reasoning, or composing of replies in this conversation. Recalling, weighing,
|
|
88
|
+
and planning how to respond are the MEANS of every conversation, never a topic
|
|
89
|
+
of their own — claims born of that procedure belong under the root of the work
|
|
90
|
+
they serve.
|
|
91
|
+
• When unsure whether two groups share a root, prefer the SAME root — splitting
|
|
92
|
+
one topic across many roots (fragmentation) is worse than a slightly-broad root.
|
|
93
|
+
NAME the root with the most SPECIFIC identifier the session gives the SUBJECT the work
|
|
94
|
+
is ABOUT — named as specifically as the session itself names it. NEVER a generic
|
|
95
|
+
category word, a placeholder, or the group_id; if nothing that specific is named, use
|
|
96
|
+
the clearest phrase for what the work is about — never a bare "group"/number. Project
|
|
97
|
+
names are lowercase with hyphens only (no underscores), and provisional_project must
|
|
98
|
+
always be filled. This is provisional; cross-SESSION matching to existing roots happens later.
|
|
99
|
+
|
|
100
|
+
For each group, also list turn_numbers: the [TURN N] numbers whose content belongs
|
|
101
|
+
to this thread. A turn may belong to more than one group, and a thread may span
|
|
102
|
+
non-contiguous turns — list every turn the thread touches.
|
|
103
|
+
|
|
104
|
+
Output ONLY the thread structure: each group's group_id, topic, provisional_project
|
|
105
|
+
(the root), and turn_numbers. Do NOT produce any blocks, fields, content, or links —
|
|
106
|
+
a later step extracts those, one thread at a time. You need not emit a group for
|
|
107
|
+
pure greeting/closing chatter that did no work.`;
|
|
108
|
+
const SEGMENT_SCHEMA = {
|
|
109
|
+
type: "object",
|
|
110
|
+
properties: {
|
|
111
|
+
groups: {
|
|
112
|
+
type: "array",
|
|
113
|
+
items: {
|
|
114
|
+
type: "object",
|
|
115
|
+
properties: {
|
|
116
|
+
group_id: { type: "string" },
|
|
117
|
+
topic: { type: "string" },
|
|
118
|
+
provisional_project: { type: "string" },
|
|
119
|
+
turn_numbers: { type: "array", items: { type: "number" } },
|
|
120
|
+
},
|
|
121
|
+
required: ["group_id", "topic", "provisional_project"],
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
reasoning: { type: "string" },
|
|
125
|
+
},
|
|
126
|
+
required: ["groups"],
|
|
127
|
+
};
|
|
128
|
+
/** Run the SEGMENT call. Tiny maxOutputTokens (just the skeleton) — bounded by
|
|
129
|
+
* construction. Graph-blind (transcript only), like callComprehendLLM. */
|
|
130
|
+
export async function callSegmentLLM(provider, transcript, thinkingBudget = 2048) {
|
|
131
|
+
const userInput = `TRANSCRIPT (one work session — read all of it, then list its threads):\n\n${transcript}`;
|
|
132
|
+
const r = await provider.generateStructured(SEGMENT_PROMPT, userInput, SEGMENT_SCHEMA, { thinkingBudget: getThinkingBudget(thinkingBudget), maxOutputTokens: 4096, modelOverride: comprehendModel() });
|
|
133
|
+
return { result: r.result ?? null, rateLimited: r.rateLimited, model: r.model, usage: r.usage };
|
|
134
|
+
}
|
|
135
|
+
// SEAM 1.5 — validate the skeleton before fanning out to PRODUCE.
|
|
136
|
+
export function validateSegmentResult(result) {
|
|
137
|
+
const errors = [];
|
|
138
|
+
const warnings = [];
|
|
139
|
+
const r = result;
|
|
140
|
+
if (!r || typeof r !== "object" || !Array.isArray(r.groups)) {
|
|
141
|
+
errors.push({ severity: "error", message: "segment result.groups is missing or not an array" });
|
|
142
|
+
return { valid: false, errors, warnings };
|
|
143
|
+
}
|
|
144
|
+
if (r.groups.length === 0)
|
|
145
|
+
return { valid: true, errors, warnings }; // no residue — valid
|
|
146
|
+
const seen = new Set();
|
|
147
|
+
for (const g of r.groups) {
|
|
148
|
+
const gid = g?.group_id;
|
|
149
|
+
if (!gid) {
|
|
150
|
+
errors.push({ severity: "error", message: "group missing group_id" });
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (seen.has(gid))
|
|
154
|
+
errors.push({ severity: "error", message: `duplicate group_id "${gid}"`, group_id: gid });
|
|
155
|
+
seen.add(gid);
|
|
156
|
+
if (!g.topic || !String(g.topic).trim())
|
|
157
|
+
warnings.push({ severity: "warning", message: "group missing topic", group_id: gid });
|
|
158
|
+
if (!g.provisional_project || !String(g.provisional_project).trim())
|
|
159
|
+
warnings.push({ severity: "warning", message: "group missing provisional_project", group_id: gid });
|
|
160
|
+
}
|
|
161
|
+
return { valid: errors.length === 0, errors, warnings };
|
|
162
|
+
}
|
|
163
|
+
export const PRODUCE_PROMPT = `You are extracting ONE thread from a work session between a user and an AI agent.
|
|
164
|
+
The whole transcript is given for context, but you extract ONLY the thread identified
|
|
165
|
+
below — its TOPIC and PROJECT are already decided (do not change them) and its turns
|
|
166
|
+
are listed.
|
|
167
|
+
|
|
168
|
+
Decide EVERYTHING by reasoning about MEANING in this session's context — what role
|
|
169
|
+
each piece played in what actually happened here. Never decide by matching surface
|
|
170
|
+
words, phrasings, or connectors. The same meaning appears in countless wordings
|
|
171
|
+
across domains; you are reading for the structure beneath the words.
|
|
172
|
+
|
|
173
|
+
── STATE CONVENTION ─────────────────────────────────────────────────────────
|
|
174
|
+
"State" = text in the TRANSCRIPT below. Your training knowledge and "what's
|
|
175
|
+
commonly known" are NOT state. Every block must quote a verbatim excerpt from the
|
|
176
|
+
transcript as its provenance. If it is not in the transcript, do not write it.
|
|
177
|
+
Familiarity ≠ recorded.
|
|
178
|
+
|
|
179
|
+
── WHAT TO KEEP (reason per candidate, from this thread) ────────────────────
|
|
180
|
+
Keep the irreplaceable RESIDUE of this thread — what was DECIDED, TRIED-AND-
|
|
181
|
+
ABANDONED, CONSTRAINED, OBSERVED, or STATED here — together with the REASONING.
|
|
182
|
+
|
|
183
|
+
The spine question, per candidate:
|
|
184
|
+
"Could a competent model — given the project context but WITHOUT having lived
|
|
185
|
+
this session — already produce this?"
|
|
186
|
+
YES → it is knowledge the model already carries → do not emit.
|
|
187
|
+
NO → it exists only because this session happened → emit it.
|
|
188
|
+
|
|
189
|
+
Asymmetric cost: anything that exists ONLY because this session happened is
|
|
190
|
+
unrecoverable once dropped — not just a decision / dead_end / constraint, but also a
|
|
191
|
+
session-specific observation, measurement, or stated value. Only what the model
|
|
192
|
+
ALREADY carries regenerates for free; a value measured or stated here is not that.
|
|
193
|
+
When unsure → keep.
|
|
194
|
+
|
|
195
|
+
Consulting the agent's own memory is not such a happening. A statement whose subject
|
|
196
|
+
is that MEMORY itself — that what is already stored is complete, was reviewed, or that
|
|
197
|
+
reading it changed nothing — is not residue, even though the reading occurred this
|
|
198
|
+
session; reading memory is not an action in the work. Emit only what the work produced
|
|
199
|
+
about ITS subject, never the agent's reading of what it had already stored.
|
|
200
|
+
|
|
201
|
+
A conclusion's EVIDENCE is residue too — the observation, measurement, or result it
|
|
202
|
+
is reasoned from. Keep it as its own block and ground the conclusion to it
|
|
203
|
+
(based_on / supports); a conclusion saved without what it rests on is
|
|
204
|
+
half the record. Keep that evidence EVEN when nothing links to it yet — a later
|
|
205
|
+
session grounds it; never drop a session-specific observation for lack of a link.
|
|
206
|
+
|
|
207
|
+
Do not emit:
|
|
208
|
+
• an option that was only RAISED in thought — never chosen, entered, or acted on.
|
|
209
|
+
• a bare sequence of steps carrying no reason that nothing rests on — the WHEN with
|
|
210
|
+
no WHY. (A step or value a conclusion is reasoned from is not bare — keep it.)
|
|
211
|
+
|
|
212
|
+
If the same claim appears more than once (e.g. restated in a recap), write it once,
|
|
213
|
+
using its most complete statement. If this thread holds no residue at all — pure
|
|
214
|
+
procedure, scaffolding, or chatter — output no blocks.
|
|
215
|
+
|
|
216
|
+
Every block carries keep_reason: one line, from the session, naming what makes it
|
|
217
|
+
residue (it was chosen / entered-then-abandoned / imposed / measured / asserted by
|
|
218
|
+
a party), or why you kept it when it was borderline.
|
|
219
|
+
|
|
220
|
+
Every block also carries type_reasoning: one line stating why THIS type's epistemic
|
|
221
|
+
role fits — what distinguishes it from the neighbouring types, judged by the role the
|
|
222
|
+
block plays for a future reader, not by surface wording. Decide this before you commit
|
|
223
|
+
the type.
|
|
224
|
+
|
|
225
|
+
── WRITE TYPED blocks for THIS thread ───────────────────────────────────────
|
|
226
|
+
A type is the agent's RELATIONSHIP to the knowledge, not its subject matter — the
|
|
227
|
+
same type spans every domain. For each piece of residue, reason about which
|
|
228
|
+
relationship fits, then FILL THAT TYPE'S unique{} FIELDS — this is the block's
|
|
229
|
+
structured identity and is REQUIRED, never empty. Put the actual content there
|
|
230
|
+
(the choice + reason, the value, the limit, the approach + why it failed), in the
|
|
231
|
+
session's own language. essence is only a one-line SUMMARY of those fields — it
|
|
232
|
+
does not replace them. One passage can carry several relationships → several blocks.
|
|
233
|
+
|
|
234
|
+
CORE relationships (consider these first):
|
|
235
|
+
decision {choice, reason, alternatives_rejected} — the participants CLOSED a
|
|
236
|
+
fork: a path was committed to, adopted, or acted on. The decision is
|
|
237
|
+
the path TAKEN; a path they CLOSED OFF is a dead_end (below), not a
|
|
238
|
+
decision — even when one passage both settles the choice and rules out
|
|
239
|
+
the alternative. A path one participant PUT FORWARD for another to
|
|
240
|
+
accept leaves the fork open — that is a blueprint (below), not a
|
|
241
|
+
decision, no matter how strongly it was urged. To type decision you
|
|
242
|
+
must be able to point at WHERE the fork closed, not just where a path
|
|
243
|
+
was proposed. Justify it: link based_on >=1 fact/constraint (below).
|
|
244
|
+
dead_end {approach, reason, alternative} — an approach CLOSED OFF for a stated
|
|
245
|
+
reason, so a future reader should not re-open it. Covers one tried then
|
|
246
|
+
abandoned AND one evaluated and definitively rejected before trying. A
|
|
247
|
+
path merely floated with no verdict is NOT a dead_end — the close-off
|
|
248
|
+
must be definite and reasoned.
|
|
249
|
+
constraint {limit, reason, source} — a boundary that bounds EVERY option and that
|
|
250
|
+
the participants must work within. May be imposed from outside OR set by
|
|
251
|
+
the participants as a fixed limit; what makes it a constraint is that it
|
|
252
|
+
GOVERNS the other choices rather than being one of them.
|
|
253
|
+
fact {value, why_matters} — a specific observed value or concrete state.
|
|
254
|
+
insight {observation, implication} — a realization drawn from combining things.
|
|
255
|
+
blueprint {purpose, status, trigger_to_implement} — a planned or proposed path
|
|
256
|
+
whose outcome is not yet settled: a plan adopted but not yet executed,
|
|
257
|
+
OR a path put forward that no one has yet accepted. The fork is still
|
|
258
|
+
open; when it later closes, a decision supersedes this.
|
|
259
|
+
preference {lean, over, condition} — a standing lean that shapes future choices,
|
|
260
|
+
short of a committed decision.
|
|
261
|
+
question {question, why_matters} — left genuinely open, with no path forward.
|
|
262
|
+
|
|
263
|
+
When the level of commitment is unclear, type the LESS-committed role (blueprint
|
|
264
|
+
over decision, preference over constraint): the residue is still captured, and a
|
|
265
|
+
later session promotes it (a decision supersedes its blueprint). A false decision
|
|
266
|
+
misleads every future reader into treating an open fork as closed.
|
|
267
|
+
|
|
268
|
+
OTHER roles, with their REQUIRED fields (fill these exact field names), when none of
|
|
269
|
+
the above fits:
|
|
270
|
+
hypothesis {proposal, evidence_against} — a claim offered as possibly true but
|
|
271
|
+
NOT yet verified: reasoned TOWARD, not asserted as established. What it
|
|
272
|
+
rests on is recorded as its OWN block and linked (based_on), not
|
|
273
|
+
restated here; evidence_against is only what would weigh against it.
|
|
274
|
+
entity {name, role} — a thing the work REFERS TO by name, not a claim about it;
|
|
275
|
+
identity is the name, role is the part it plays in the work.
|
|
276
|
+
task {status, description, owner} — work still TO BE DONE, tracked by its state
|
|
277
|
+
of completion and who holds it.
|
|
278
|
+
event {what_happened, outcome, date} — a thing that OCCURRED at a point in time,
|
|
279
|
+
as opposed to a standing truth that simply holds.
|
|
280
|
+
note {} — no field schema; the catch-all, only when no sharper role fits.
|
|
281
|
+
If a genuinely distinct epistemic role STILL fits none of these, name the type and
|
|
282
|
+
include schema{} (field -> what it captures).
|
|
283
|
+
|
|
284
|
+
Each block also carries: essence (one sentence, <=120 chars — what it is and why
|
|
285
|
+
it matters), concepts (a few terms naming what it is about), provisional_name (a
|
|
286
|
+
short slug for the thing — provisional, not a final label), provenance, keep_reason.
|
|
287
|
+
|
|
288
|
+
── WIRE the relationships WITHIN this thread ────────────────────────────────
|
|
289
|
+
Where the thread shows one block standing in a real relationship to another — one
|
|
290
|
+
thing led to another, justified it, replaced it, answered it, elaborates it,
|
|
291
|
+
provides evidence for it, or conflicts with it — record that link. Infer it from
|
|
292
|
+
what happened, whether or not any connecting word is present.
|
|
293
|
+
|
|
294
|
+
Each link is {from, to, type}, where "from" holds the relationship. Choose the
|
|
295
|
+
type whose MEANING matches:
|
|
296
|
+
prompted_by — from happened as a consequence of to (to is the trigger)
|
|
297
|
+
based_on — from is a conclusion grounded in to (evidence)
|
|
298
|
+
extends — from is a more specific case of to (broader)
|
|
299
|
+
supersedes — from replaces an earlier to
|
|
300
|
+
resolves — from answers the open question to
|
|
301
|
+
supports — from is evidence for the proposal to
|
|
302
|
+
contradicts — from and to conflict
|
|
303
|
+
related_to — from and to are associated, with no sharper relationship
|
|
304
|
+
derived_from — from was reasoned out from to
|
|
305
|
+
affects — from has an impact on to
|
|
306
|
+
|
|
307
|
+
Reach for the SHARPEST relation the meaning supports. related_to and affects are
|
|
308
|
+
the WEAKEST — a last resort, used ONLY when no grounding, consequence, replacement,
|
|
309
|
+
or answer actually holds between the two. When a sharper relation is true, name it.
|
|
310
|
+
|
|
311
|
+
Every block sits in a HISTORY — wire each way it connects BACKWARD to what came
|
|
312
|
+
before, not only its evidence:
|
|
313
|
+
- what it was REASONED FROM: the observation, measurement, or result a later
|
|
314
|
+
realization, boundary, choice, or lean rests on (based_on / supports / derived_from);
|
|
315
|
+
- what it REPLACED: an earlier approach, value, or state this makes obsolete. The
|
|
316
|
+
earlier block stays as history and MUST be linked FROM the newer one (supersedes) —
|
|
317
|
+
never leave a superseded block standing as if nothing replaced it;
|
|
318
|
+
- what TRIGGERED it: the event, failure, or need it arose as a consequence of
|
|
319
|
+
(prompted_by);
|
|
320
|
+
- the open QUESTION it answers (resolves).
|
|
321
|
+
The trap to avoid, for ANY block type: a block that REPLACED or was TRIGGERED BY
|
|
322
|
+
another, but is wired only to its supporting evidence, leaves that other block
|
|
323
|
+
ORPHANED — you recorded why it is justified but dropped what it displaced or
|
|
324
|
+
responded to. Both are how the state was reached; wire both.
|
|
325
|
+
|
|
326
|
+
The link type MUST be exactly one of these ten relations — never invent one, and
|
|
327
|
+
never use a block's unique{} field name as a link type. A detail that belongs to a
|
|
328
|
+
single block (a decision's rejected alternatives, a constraint's source, and the
|
|
329
|
+
like) is recorded INSIDE that block's own fields — never as a link, and never as a
|
|
330
|
+
separate block created only so something can link to it.
|
|
331
|
+
|
|
332
|
+
Every decision — and every hypothesis or insight that rests on a finding — needs >=1
|
|
333
|
+
based_on to the observation it is reasoned from. If that evidence is genuinely not in
|
|
334
|
+
this session, mark the block uncertain — never supply the evidence yourself.
|
|
335
|
+
|
|
336
|
+
The PROJECT is already assigned — do not change it. Do not assign final names, do
|
|
337
|
+
not match against any existing memory, and do NOT link to blocks in OTHER threads
|
|
338
|
+
(cross-thread links are a later stage). Output only this thread's blocks and
|
|
339
|
+
within-thread links.`;
|
|
340
|
+
// Block + link item schemas — identical to COMPREHEND_SCHEMA's (kept in sync by
|
|
341
|
+
// copy; the per-group path is default-OFF/experimental).
|
|
342
|
+
const PRODUCE_SCHEMA = {
|
|
343
|
+
type: "object",
|
|
344
|
+
properties: {
|
|
345
|
+
blocks: {
|
|
346
|
+
type: "array",
|
|
347
|
+
items: {
|
|
348
|
+
type: "object",
|
|
349
|
+
properties: {
|
|
350
|
+
local_id: { type: "string" },
|
|
351
|
+
type: { type: "string" },
|
|
352
|
+
unique: {
|
|
353
|
+
type: "object",
|
|
354
|
+
description: "REQUIRED structured identity fields for the type — never empty. e.g. decision: {choice, reason, alternatives_rejected}; fact: {value, why_matters}; dead_end: {approach, reason, alternative}; constraint: {limit, reason, source}; insight: {observation, implication}. Fill from the transcript.",
|
|
355
|
+
},
|
|
356
|
+
schema: { type: "object" },
|
|
357
|
+
essence: { type: "string" },
|
|
358
|
+
concepts: { type: "array", items: { type: "string" } },
|
|
359
|
+
provisional_name: { type: "string" },
|
|
360
|
+
provenance: { type: "string" },
|
|
361
|
+
keep_reason: { type: "string" },
|
|
362
|
+
type_reasoning: { type: "string" },
|
|
363
|
+
uncertain: { type: "boolean" },
|
|
364
|
+
},
|
|
365
|
+
required: ["local_id", "type", "unique", "essence", "provenance", "keep_reason"],
|
|
366
|
+
},
|
|
367
|
+
},
|
|
368
|
+
within_group_links: {
|
|
369
|
+
type: "array",
|
|
370
|
+
items: {
|
|
371
|
+
type: "object",
|
|
372
|
+
properties: {
|
|
373
|
+
from: { type: "string" },
|
|
374
|
+
to: { type: "string" },
|
|
375
|
+
type: { type: "string" },
|
|
376
|
+
reasoning: { type: "string" },
|
|
377
|
+
},
|
|
378
|
+
required: ["from", "to", "type"],
|
|
379
|
+
},
|
|
380
|
+
},
|
|
381
|
+
},
|
|
382
|
+
required: ["blocks", "within_group_links"],
|
|
383
|
+
};
|
|
384
|
+
/** Produce ONE group's blocks + within-group links. maxOutputTokens is bounded to
|
|
385
|
+
* one thread's worth (24576, still under the 32768 cap) — the runaway can't fire.
|
|
386
|
+
* Was 16384, but a normal group in a 6-turn convo occasionally overflowed it →
|
|
387
|
+
* truncation-bump round-trip (worktest run 5); 24576 absorbs the dense-group case
|
|
388
|
+
* up front. Genuine over-generation past this still splits via produceGroupBounded. */
|
|
389
|
+
export async function callProduceGroupLLM(provider, transcript, group, thinkingBudget = 4096) {
|
|
390
|
+
const turns = group.turn_numbers?.length ? ` (turns ${group.turn_numbers.join(", ")})` : "";
|
|
391
|
+
const userInput = `THREAD TO EXTRACT — topic: "${group.topic}"; project: "${group.provisional_project ?? ""}"${turns}\n\n` +
|
|
392
|
+
`FULL TRANSCRIPT (context; extract ONLY the thread above):\n\n${transcript}`;
|
|
393
|
+
const r = await provider.generateStructured(PRODUCE_PROMPT, userInput, PRODUCE_SCHEMA, { thinkingBudget: getThinkingBudget(thinkingBudget), maxOutputTokens: 24576, modelOverride: comprehendModel() });
|
|
394
|
+
// truncated = the call failed specifically because output hit the token ceiling
|
|
395
|
+
// (finish=length → openai.ts marks the attempt "truncated"), distinct from empty/
|
|
396
|
+
// rate-limit/other. Only this case is worth a split-and-retry (the output was too big).
|
|
397
|
+
const truncated = !r.result && (r.attempts ?? []).some((a) => a.outcome === "truncated");
|
|
398
|
+
return { result: r.result ?? null, rateLimited: r.rateLimited, truncated, usage: r.usage };
|
|
399
|
+
}
|
|
400
|
+
// ── Output-bound (Fix 2 Layer 1, 2026-06-07) ─────────────────────────────────────
|
|
401
|
+
// A statement-dense group can make PRODUCE emit more JSON than the output-token budget
|
|
402
|
+
// → genuine truncation (finish=length) → the whole group was silently dropped by
|
|
403
|
+
// keep-partial. Instead: on truncation, split the transcript in half and recurse,
|
|
404
|
+
// merging the sub-results. local_ids are namespaced so they stay unique; within-group
|
|
405
|
+
// links across the split seam are dropped (the cross-group linker bridges boundaries
|
|
406
|
+
// later). Depth-capped; past the cap, keep whatever parsed. GUARANTEES a group is never
|
|
407
|
+
// silently lost to truncation. (Dogfood doc-feed 2026-06-07: a 19KB doc truncated a
|
|
408
|
+
// PRODUCE call at finish=length and lost the group.)
|
|
409
|
+
const MAX_PRODUCE_SPLIT_DEPTH = 3;
|
|
410
|
+
/** Split a transcript roughly in half by lines. Returns [t] when it can't be split. */
|
|
411
|
+
export function splitTranscriptForRetry(transcript) {
|
|
412
|
+
const lines = transcript.split("\n");
|
|
413
|
+
if (lines.length < 2)
|
|
414
|
+
return [transcript];
|
|
415
|
+
const mid = Math.floor(lines.length / 2);
|
|
416
|
+
return [lines.slice(0, mid).join("\n"), lines.slice(mid).join("\n")];
|
|
417
|
+
}
|
|
418
|
+
/** Merge PRODUCE sub-results, NAMESPACING each part's local_ids (and the link endpoints
|
|
419
|
+
* that reference them) so the merged group has unique ids. within_group_links only ever
|
|
420
|
+
* reference blocks within their own part, so prefixing both endpoints per-part is safe. */
|
|
421
|
+
export function mergeProduceResults(parts) {
|
|
422
|
+
const blocks = [];
|
|
423
|
+
const within_group_links = [];
|
|
424
|
+
parts.forEach((part, i) => {
|
|
425
|
+
const pfx = `s${i}_`;
|
|
426
|
+
for (const b of part?.blocks ?? [])
|
|
427
|
+
blocks.push({ ...b, local_id: pfx + b.local_id });
|
|
428
|
+
for (const l of part?.within_group_links ?? [])
|
|
429
|
+
within_group_links.push({ ...l, from: pfx + l.from, to: pfx + l.to });
|
|
430
|
+
});
|
|
431
|
+
return { blocks, within_group_links };
|
|
432
|
+
}
|
|
433
|
+
/** PRODUCE one group, BOUNDED against truncation: on a genuine truncation, split the
|
|
434
|
+
* transcript and recurse. ok=false only when it truly couldn't produce (a non-truncation
|
|
435
|
+
* failure, or still truncating at the depth cap) — a legit empty group is ok=true.
|
|
436
|
+
* `onCall` is invoked once per actual (sub-)call so the caller can count them. */
|
|
437
|
+
export async function produceGroupBounded(provider, transcript, group, depth, onCall) {
|
|
438
|
+
onCall();
|
|
439
|
+
const p = await callProduceGroupLLM(provider, transcript, group);
|
|
440
|
+
if (p.result && Array.isArray(p.result.blocks))
|
|
441
|
+
return { result: p.result, ok: true };
|
|
442
|
+
if (p.truncated && depth < MAX_PRODUCE_SPLIT_DEPTH) {
|
|
443
|
+
const halves = splitTranscriptForRetry(transcript);
|
|
444
|
+
if (halves.length === 2) {
|
|
445
|
+
console.warn(` [per-group PRODUCE] group "${group.group_id}" truncated — splitting transcript (depth ${depth + 1}) and retrying`);
|
|
446
|
+
const [a, b] = await Promise.all([
|
|
447
|
+
produceGroupBounded(provider, halves[0], group, depth + 1, onCall),
|
|
448
|
+
produceGroupBounded(provider, halves[1], group, depth + 1, onCall),
|
|
449
|
+
]);
|
|
450
|
+
return { result: mergeProduceResults([a.result, b.result]), ok: a.ok || b.ok };
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
return { result: { blocks: [], within_group_links: [] }, ok: false };
|
|
454
|
+
}
|
|
455
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
456
|
+
// STITCH + ORCHESTRATE
|
|
457
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
458
|
+
/** Reassemble the SEGMENT skeleton + per-group PRODUCE outputs into the EXISTING
|
|
459
|
+
* ComprehendResult shape. A group with no produce output → empty blocks/links
|
|
460
|
+
* (valid; keep-partial). Pure. */
|
|
461
|
+
export function stitchToComprehendResult(seg, produced) {
|
|
462
|
+
const groups = (seg.groups ?? []).map((g) => {
|
|
463
|
+
const p = produced.get(g.group_id);
|
|
464
|
+
return {
|
|
465
|
+
group_id: g.group_id,
|
|
466
|
+
topic: g.topic,
|
|
467
|
+
provisional_project: g.provisional_project,
|
|
468
|
+
blocks: Array.isArray(p?.blocks) ? p.blocks : [],
|
|
469
|
+
within_group_links: Array.isArray(p?.within_group_links) ? p.within_group_links : [],
|
|
470
|
+
};
|
|
471
|
+
});
|
|
472
|
+
return { groups, reasoning: seg.reasoning };
|
|
473
|
+
}
|
|
474
|
+
// ── REDO + QUARANTINE helpers (per-group SEAM-1 recovery, 2026-06-07) ─────────────
|
|
475
|
+
/** The group_ids that appear in any validation ERROR — i.e. which groups are "bad".
|
|
476
|
+
* Every post-stitch hard error carries a group_id (SEAM 1.5 guarantees each stitched
|
|
477
|
+
* group has one), so this attributes a failed validation to the responsible group(s),
|
|
478
|
+
* letting us redo / quarantine ONLY those — never the whole arc. */
|
|
479
|
+
export function groupIdsWithErrors(errors) {
|
|
480
|
+
const ids = new Set();
|
|
481
|
+
for (const e of errors ?? [])
|
|
482
|
+
if (e.group_id)
|
|
483
|
+
ids.add(e.group_id);
|
|
484
|
+
return ids;
|
|
485
|
+
}
|
|
486
|
+
/** Empty the named groups (blocks + within-group links), leaving the rest untouched —
|
|
487
|
+
* the QUARANTINE floor. Pure. An emptied group is VALID (0 blocks), exactly like
|
|
488
|
+
* keep-partial, and carries no dangling links (cross-group links don't exist yet at
|
|
489
|
+
* this stage). The group skeleton stays so counts/grouping downstream are unchanged. */
|
|
490
|
+
export function quarantineGroups(result, gids) {
|
|
491
|
+
if (!gids.size)
|
|
492
|
+
return result;
|
|
493
|
+
return {
|
|
494
|
+
...result,
|
|
495
|
+
groups: (result.groups ?? []).map((g) => gids.has(g.group_id) ? { ...g, blocks: [], within_group_links: [] } : g),
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Orchestrate per-group COMPREHEND: SEGMENT → SEAM 1.5 → PRODUCE per group
|
|
500
|
+
* (parallel, bounded) → stitch → SEAM 1 (validateComprehendResult). Returns the
|
|
501
|
+
* SAME {result, validation} shape as callComprehendLLM so runComprehendFrontHalf
|
|
502
|
+
* uses it interchangeably. KEEP-PARTIAL: one group's PRODUCE failing → that group
|
|
503
|
+
* is empty, the rest proceed (the single-point-of-failure removal). Degrades
|
|
504
|
+
* (result=null) only when SEGMENT itself fails/invalidates.
|
|
505
|
+
*/
|
|
506
|
+
export async function runComprehendPerGroup(provider, transcript, opts = {}) {
|
|
507
|
+
const base = {
|
|
508
|
+
result: null, validation: null, rateLimited: false,
|
|
509
|
+
segmentGroups: 0, produceCalls: 0, produceFailures: 0,
|
|
510
|
+
redoneGroups: 0, quarantinedGroups: 0,
|
|
511
|
+
};
|
|
512
|
+
// CALL 1 — SEGMENT
|
|
513
|
+
const seg = await callSegmentLLM(provider, transcript);
|
|
514
|
+
if (!seg.result) {
|
|
515
|
+
console.warn(`Auto-Reflect COMPREHEND (per-group): SEGMENT ${seg.rateLimited ? "rate limited" : "failed"} — degrade to v1`);
|
|
516
|
+
return { ...base, rateLimited: seg.rateLimited };
|
|
517
|
+
}
|
|
518
|
+
const segVal = validateSegmentResult(seg.result);
|
|
519
|
+
if (!segVal.valid) {
|
|
520
|
+
console.warn(`Auto-Reflect COMPREHEND (per-group): SEAM 1.5 invalid (${segVal.errors.length} error(s)) — degrade to v1`);
|
|
521
|
+
return base;
|
|
522
|
+
}
|
|
523
|
+
const groups = seg.result.groups ?? [];
|
|
524
|
+
base.segmentGroups = groups.length;
|
|
525
|
+
base.model = seg.model;
|
|
526
|
+
// No residue → a valid empty result (the caller treats groups.length===0 as "nothing to save").
|
|
527
|
+
if (groups.length === 0) {
|
|
528
|
+
const emptyResult = { groups: [] };
|
|
529
|
+
return { ...base, result: emptyResult, validation: validateComprehendResult(emptyResult) };
|
|
530
|
+
}
|
|
531
|
+
// CALL 2 — PRODUCE per group, parallel + bounded; keep-partial on failure.
|
|
532
|
+
const produced = new Map();
|
|
533
|
+
const CONC = opts.produceConcurrency ?? 4;
|
|
534
|
+
for (let i = 0; i < groups.length; i += CONC) {
|
|
535
|
+
await Promise.all(groups.slice(i, i + CONC).map(async (g) => {
|
|
536
|
+
try {
|
|
537
|
+
// Output-bound (Fix 2 Layer 1): split-and-retry on genuine truncation so a
|
|
538
|
+
// dense group is never silently dropped. onCall counts every (sub-)call.
|
|
539
|
+
const { result, ok } = await produceGroupBounded(provider, transcript, g, 0, () => { base.produceCalls += 1; });
|
|
540
|
+
produced.set(g.group_id, result);
|
|
541
|
+
if (!ok)
|
|
542
|
+
base.produceFailures += 1;
|
|
543
|
+
}
|
|
544
|
+
catch (e) {
|
|
545
|
+
base.produceFailures += 1;
|
|
546
|
+
produced.set(g.group_id, { blocks: [], within_group_links: [] });
|
|
547
|
+
console.warn(` [per-group PRODUCE] group "${g.group_id}" threw: ${e?.message ?? e}`);
|
|
548
|
+
}
|
|
549
|
+
}));
|
|
550
|
+
}
|
|
551
|
+
let stitched = stitchToComprehendResult(seg.result, produced);
|
|
552
|
+
let validation = validateComprehendResult(stitched);
|
|
553
|
+
// ── REDO bad groups, then QUARANTINE the unrecoverable ───────────────────────
|
|
554
|
+
// Per-group PRODUCE isolates failures, but SEAM 1 validates the WHOLE stitched
|
|
555
|
+
// result: ONE group's HARD error (e.g. a block missing its provenance excerpt —
|
|
556
|
+
// common when an empty draw escalated to a weaker fallback model) fails the entire
|
|
557
|
+
// arc → the caller degrades to v1 → the whole session's residue is lost. Instead:
|
|
558
|
+
// 1. RE-RUN PRODUCE for ONLY the invalid groups. Each redo gets the SAME context
|
|
559
|
+
// the first call did (full transcript + that group's scope, via
|
|
560
|
+
// produceGroupBounded) and re-uses the provider's empty→escalate path, so a
|
|
561
|
+
// redraw usually lands valid.
|
|
562
|
+
// 2. Any group STILL invalid after the redo is QUARANTINED (emptied) so the VALID
|
|
563
|
+
// groups survive — one bad thread no longer sinks the others.
|
|
564
|
+
// Degrade to v1 only when NO group survives (every group bad, or errors that can't
|
|
565
|
+
// be attributed to a group) — the existing total-failure path, unchanged.
|
|
566
|
+
if (!validation.valid) {
|
|
567
|
+
const badIds = groupIdsWithErrors(validation.errors);
|
|
568
|
+
if (badIds.size > 0) {
|
|
569
|
+
const segByGid = new Map((seg.result.groups ?? []).map((g) => [g.group_id, g]));
|
|
570
|
+
console.warn(`Auto-Reflect COMPREHEND (per-group): ${badIds.size} group(s) invalid at SEAM 1 — redoing ONLY those`);
|
|
571
|
+
await Promise.all([...badIds].map(async (gid) => {
|
|
572
|
+
const g = segByGid.get(gid);
|
|
573
|
+
if (!g)
|
|
574
|
+
return; // no segment to redo from (shouldn't happen)
|
|
575
|
+
try {
|
|
576
|
+
const { result } = await produceGroupBounded(provider, transcript, g, 0, () => { base.produceCalls += 1; });
|
|
577
|
+
produced.set(gid, result);
|
|
578
|
+
base.redoneGroups += 1;
|
|
579
|
+
}
|
|
580
|
+
catch (e) {
|
|
581
|
+
console.warn(` [per-group REDO] group "${gid}" threw: ${e?.message ?? e}`);
|
|
582
|
+
}
|
|
583
|
+
}));
|
|
584
|
+
stitched = stitchToComprehendResult(seg.result, produced);
|
|
585
|
+
validation = validateComprehendResult(stitched);
|
|
586
|
+
// QUARANTINE floor — keep the good groups, empty the still-bad ones. Only when at
|
|
587
|
+
// least one group survives; if every group is still bad, leave it invalid so the
|
|
588
|
+
// caller degrades to v1.
|
|
589
|
+
if (!validation.valid) {
|
|
590
|
+
const stillBad = groupIdsWithErrors(validation.errors);
|
|
591
|
+
if (stillBad.size > 0 && stillBad.size < stitched.groups.length) {
|
|
592
|
+
stitched = quarantineGroups(stitched, stillBad);
|
|
593
|
+
validation = validateComprehendResult(stitched);
|
|
594
|
+
base.quarantinedGroups = stillBad.size;
|
|
595
|
+
console.warn(`Auto-Reflect COMPREHEND (per-group): quarantined ${stillBad.size} unrecoverable group(s) — kept ${stitched.groups.length - stillBad.size} valid group(s)`);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
const blockCount = stitched.groups.reduce((n, g) => n + (g.blocks?.length ?? 0), 0);
|
|
601
|
+
const extra = (base.redoneGroups ? `, ${base.redoneGroups} redone` : "") +
|
|
602
|
+
(base.quarantinedGroups ? `, ${base.quarantinedGroups} quarantined` : "");
|
|
603
|
+
console.log(`Auto-Reflect COMPREHEND (per-group): ${groups.length} group(s), ${blockCount} block(s) | ` +
|
|
604
|
+
`produce ${base.produceCalls} call(s), ${base.produceFailures} fail${extra} | valid=${validation.valid} ` +
|
|
605
|
+
`errors=${validation.errors.length} warnings: ${summarizeWarnings(validation.warnings)}`);
|
|
606
|
+
if (process.env.NODEDEX_DEBUG_PERGROUP === "1")
|
|
607
|
+
dumpPerGroupDebug(seg.result, stitched);
|
|
608
|
+
return { ...base, result: stitched, validation };
|
|
609
|
+
}
|
|
610
|
+
//# sourceMappingURL=comprehend-pergroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comprehend-pergroup.js","sourceRoot":"","sources":["../../../src/middleware/reflect/comprehend-pergroup.ts"],"names":[],"mappings":"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"}
|