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,148 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
// COST PRICING — per-pass $$ telemetry support (D, 2026-05-25)
|
|
3
|
+
//
|
|
4
|
+
// Why this exists (system-level WHY before HOW per
|
|
5
|
+
// feedback-systems-thinking-framework 2026-05-25 lesson):
|
|
6
|
+
//
|
|
7
|
+
// PASS2-SPLIT-DESIGN.md §7: "The bet is unfalsifiable without measurement."
|
|
8
|
+
// Without per-pass $$ in the turn log, we can't:
|
|
9
|
+
// (a) verify the split lands in the Comfortable cost tier ($0.05-0.15/turn)
|
|
10
|
+
// (b) detect cost regressions before they reach the Warning tier
|
|
11
|
+
// (c) compare baseline-vs-split honestly when assessing flip readiness
|
|
12
|
+
// (d) attribute cost shifts (Pass 4 cheaper because Pass 2 is cleaner?
|
|
13
|
+
// or Pass 2c expensive because semantic wiring?)
|
|
14
|
+
//
|
|
15
|
+
// This module converts the already-tracked token counts (reflectTokenStats
|
|
16
|
+
// in context.ts) into $$ per pass, written into the turn log per writeTurnLog
|
|
17
|
+
// in pipeline.ts. Together with splitAudit persistence, this closes the
|
|
18
|
+
// §7 measurement loop that the design declared non-negotiable.
|
|
19
|
+
//
|
|
20
|
+
// Universal framing (charter §5):
|
|
21
|
+
// - Keyed by `model_name: string` — works for ANY provider (Anthropic,
|
|
22
|
+
// Google, OpenAI, Mistral, DeepSeek, anything routed via OpenRouter)
|
|
23
|
+
// - Adding a new model = one entry to the table; no schema change
|
|
24
|
+
// - Returns null on unknown model — NEVER fabricates a cost (charter
|
|
25
|
+
// rule 6: guards catch failure, never override success). The turn log
|
|
26
|
+
// surfacing "we don't know what this costs" is the honest signal.
|
|
27
|
+
// - USD only — explicit in field names (`cost_usd`, `input_per_million`).
|
|
28
|
+
// Not aspirational about EUR/etc.
|
|
29
|
+
//
|
|
30
|
+
// Pricing source (point-in-time, verify against current provider docs):
|
|
31
|
+
// - Anthropic: https://www.anthropic.com/pricing (Haiku 4.5, Sonnet 4.6, Opus 4.7)
|
|
32
|
+
// - Google: https://ai.google.dev/pricing (Gemini 2.5 Flash, Pro)
|
|
33
|
+
// - OpenRouter dashboard: https://openrouter.ai/models (cross-provider rates)
|
|
34
|
+
// COST_PRICING_VERSION below is the safety valve — future agent should
|
|
35
|
+
// bump it when re-verifying rates.
|
|
36
|
+
//
|
|
37
|
+
// What this module does NOT do:
|
|
38
|
+
// - Per-attempt cost (escalations on truncation are billed at the model
|
|
39
|
+
// that ran). Today we use the FINAL successful model. Per-attempt
|
|
40
|
+
// fidelity is a follow-up if/when retry-cost-attribution becomes a
|
|
41
|
+
// validation question.
|
|
42
|
+
// - Reconcile with OpenRouter dashboard automatically — §7 wants ±10%
|
|
43
|
+
// reconciliation, that's a manual check until a separate tool exists.
|
|
44
|
+
// - Live-fetch rates — that would be a runtime dependency on an external
|
|
45
|
+
// API. Static table + version is the right tradeoff for now.
|
|
46
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
47
|
+
/**
|
|
48
|
+
* Bumped whenever the PRICING table below is re-verified against provider
|
|
49
|
+
* docs / OpenRouter dashboard. Surfaced in the turn log so a future agent
|
|
50
|
+
* (or future me) reading old turn logs can tell if the cost figures used
|
|
51
|
+
* stale rates.
|
|
52
|
+
*/
|
|
53
|
+
export const COST_PRICING_VERSION = "2026-06-22";
|
|
54
|
+
/**
|
|
55
|
+
* Pricing table — model name string → per-million-token rates in USD.
|
|
56
|
+
*
|
|
57
|
+
* Add a new model = one entry. The key is the model name as it appears in
|
|
58
|
+
* provider.getName() / GenerateResult.model — these are the strings the
|
|
59
|
+
* pipeline already stamps into the turn log providers[] field. Stay
|
|
60
|
+
* verbatim to what providers emit so lookups are direct.
|
|
61
|
+
*
|
|
62
|
+
* Rates as of 2026-05-25. If you bump these, bump COST_PRICING_VERSION too
|
|
63
|
+
* so old turn-log readers can detect rate drift.
|
|
64
|
+
*/
|
|
65
|
+
export const PRICING = {
|
|
66
|
+
// ── Google Gemini (currently the primary pipeline model) ────────────────────
|
|
67
|
+
"google/gemini-2.5-flash": { input_per_million: 0.30, output_per_million: 2.50 },
|
|
68
|
+
"google/gemini-2.5-pro": { input_per_million: 1.25, output_per_million: 10.00 },
|
|
69
|
+
"gemini-2.5-flash": { input_per_million: 0.30, output_per_million: 2.50 },
|
|
70
|
+
"gemini-2.5-pro": { input_per_million: 1.25, output_per_million: 10.00 },
|
|
71
|
+
// ── Anthropic (target for multi-model routing per PASS2-SPLIT-DESIGN.md §7) ─
|
|
72
|
+
// Haiku for 2a/2b (structural); Sonnet/Opus for harder semantic work if needed.
|
|
73
|
+
// Both bare-name (direct Anthropic API) and "anthropic/" prefixed (OpenRouter
|
|
74
|
+
// routing) forms — these are the same models, the provider emits different
|
|
75
|
+
// model strings depending on the path. Multi-model routing in the orchestrator
|
|
76
|
+
// (NODEDEX_PASS2A_MODEL etc.) generally uses OpenRouter-prefix form because
|
|
77
|
+
// the production agent already routes via OpenRouter (see project-chat-proxy-built).
|
|
78
|
+
"claude-haiku-4-5-20251001": { input_per_million: 1.00, output_per_million: 5.00 },
|
|
79
|
+
"claude-haiku-4-5": { input_per_million: 1.00, output_per_million: 5.00 },
|
|
80
|
+
"claude-sonnet-4-6": { input_per_million: 3.00, output_per_million: 15.00 },
|
|
81
|
+
"claude-opus-4-7": { input_per_million: 15.00, output_per_million: 75.00 },
|
|
82
|
+
"anthropic/claude-haiku-4-5": { input_per_million: 1.00, output_per_million: 5.00 },
|
|
83
|
+
"anthropic/claude-haiku-4.5": { input_per_million: 1.00, output_per_million: 5.00 },
|
|
84
|
+
"anthropic/claude-sonnet-4-6": { input_per_million: 3.00, output_per_million: 15.00 },
|
|
85
|
+
"anthropic/claude-sonnet-4.6": { input_per_million: 3.00, output_per_million: 15.00 },
|
|
86
|
+
"anthropic/claude-opus-4-7": { input_per_million: 15.00, output_per_million: 75.00 },
|
|
87
|
+
"anthropic/claude-opus-4.7": { input_per_million: 15.00, output_per_million: 75.00 },
|
|
88
|
+
// ── Onboarding's recommended PAID option (so the cost panel doesn't show "?"
|
|
89
|
+
// for a model a normal user is told to pick). Free models → FREE_MODELS below.
|
|
90
|
+
"openai/gpt-4o-mini": { input_per_million: 0.15, output_per_million: 0.60 },
|
|
91
|
+
"gpt-4o-mini": { input_per_million: 0.15, output_per_million: 0.60 },
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Genuinely-FREE models ($0 at the provider). Kept OUT of PRICING — whose entries must be
|
|
95
|
+
* paid/non-zero (the "no accidental $0 lines" guard) — so a real free model is recognized as a
|
|
96
|
+
* known $0 rather than an "unknown model" (which would render as "?" in the cost panel). owl-alpha
|
|
97
|
+
* (the onboarding free option) is the case this fixes. Both OpenRouter-slug and bare forms.
|
|
98
|
+
*/
|
|
99
|
+
export const FREE_MODELS = new Set([
|
|
100
|
+
"openrouter/owl-alpha",
|
|
101
|
+
"owl-alpha",
|
|
102
|
+
]);
|
|
103
|
+
/**
|
|
104
|
+
* Compute USD cost for a token-usage record under the given model's rates.
|
|
105
|
+
*
|
|
106
|
+
* Returns `null` if the model is unknown to the pricing table. This is
|
|
107
|
+
* deliberate — fabricating a cost would mislead the validation work the
|
|
108
|
+
* design relies on. Logs once per unknown model so the gap is auditable.
|
|
109
|
+
*
|
|
110
|
+
* Returns 0 (not null) on empty usage with a known model — distinguishes
|
|
111
|
+
* "didn't run" (0) from "ran but we don't know what it cost" (null).
|
|
112
|
+
*/
|
|
113
|
+
const _warnedModels = new Set();
|
|
114
|
+
export function computeCost(usage, model) {
|
|
115
|
+
if (!model) {
|
|
116
|
+
if (!_warnedModels.has("(undefined)")) {
|
|
117
|
+
_warnedModels.add("(undefined)");
|
|
118
|
+
console.warn("cost-pricing: computeCost called with undefined model — returning null");
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
if (FREE_MODELS.has(model))
|
|
123
|
+
return 0; // genuinely free → a KNOWN $0, not "unknown model" ("?")
|
|
124
|
+
const rate = PRICING[model];
|
|
125
|
+
if (!rate) {
|
|
126
|
+
if (!_warnedModels.has(model)) {
|
|
127
|
+
_warnedModels.add(model);
|
|
128
|
+
console.warn(`cost-pricing: no pricing entry for model "${model}" — returning null (add to PRICING table)`);
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
const input = usage?.input ?? 0;
|
|
133
|
+
const output = usage?.output ?? 0;
|
|
134
|
+
const thinking = usage?.thinking ?? 0;
|
|
135
|
+
// Thinking billed as output unless the provider specifies otherwise.
|
|
136
|
+
const thinkingRate = rate.thinking_per_million ?? rate.output_per_million;
|
|
137
|
+
const cost = (input / 1_000_000) * rate.input_per_million +
|
|
138
|
+
(output / 1_000_000) * rate.output_per_million +
|
|
139
|
+
(thinking / 1_000_000) * thinkingRate;
|
|
140
|
+
return cost;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Reset the warn-once memo. Useful for tests; not used in production code.
|
|
144
|
+
*/
|
|
145
|
+
export function _resetWarnings() {
|
|
146
|
+
_warnedModels.clear();
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=cost-pricing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-pricing.js","sourceRoot":"","sources":["../../../src/middleware/reflect/cost-pricing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Pass2Item } from "./types.js";
|
|
2
|
+
import type { LLMProvider } from "../../engine/ai-provider.js";
|
|
3
|
+
export declare function crossGroupLinkEnabled(): boolean;
|
|
4
|
+
/** Orphan-aware linking (default OFF, NODEDEX_V2_CROSSLINK_ORPHAN_AWARE): mark the blocks
|
|
5
|
+
* that have no link yet (⚠ UNLINKED) in the linker's input so it targets those gaps
|
|
6
|
+
* instead of re-deriving blindly — the recall fix for the residual islands. Empirical
|
|
7
|
+
* (could it over-link a genuinely-standalone block?), so opt-in + A/B-able. Off → the
|
|
8
|
+
* linker input is byte-identical to before. */
|
|
9
|
+
export declare function orphanAwareLinkEnabled(): boolean;
|
|
10
|
+
export interface CrossGroupLink {
|
|
11
|
+
from: string;
|
|
12
|
+
to: string;
|
|
13
|
+
type: string;
|
|
14
|
+
reasoning?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare const CROSS_GROUP_LINK_PROMPT = "You are given knowledge blocks from ONE work session, already grouped into THREADS,\nwith each thread's INTERNAL links already drawn. Your only job: add the links that\ncross BETWEEN threads \u2014 where a block in one thread stands in a real relationship to\na block in another. The same kinds of relationships that hold within a thread hold\nacross them.\n\nDecide by reasoning about MEANING \u2014 what actually relates to what across the\nthreads, whether or not any connecting word is present.\n\nEach link is {from, to, type}, where \"from\" holds the relationship. Use the block\nids EXACTLY as given. Choose the type whose MEANING matches:\n prompted_by \u00B7 based_on \u00B7 extends \u00B7 supersedes \u00B7 resolves \u00B7 supports \u00B7\n contradicts \u00B7 related_to \u00B7 derived_from \u00B7 affects\nReach for the SHARPEST relation the meaning supports; related_to and affects are a\nlast resort. The link type MUST be exactly one of these ten.\n\nLook especially for the connections that orphan a block otherwise \u2014 these are easy to\nmiss across threads, for ANY block type: a block in one thread that REPLACED\n(supersedes) an earlier approach, value, or state in another, or that was TRIGGERED BY\n(prompted_by) an event or failure in another \u2014 not only where one thread's block is\nEVIDENCE for another's. A superseded or triggering block left unlinked is the gap to close.\n\nBlocks the input marks \u26A0 UNLINKED have NO link at all yet \u2014 they are the ones most\nlikely to be wrongly orphaned. Give each marked block a deliberate pass: find its\ncross-thread connection (what caused it, what it depends on, what it replaced or\nanswers), or judge it genuinely standalone.\n\nAdd ONLY links whose two blocks are in DIFFERENT threads \u2014 do NOT re-draw links\nwithin a thread, those are already present. Do NOT invent blocks or ids. If no\ngenuine cross-thread relationship exists, return an empty list.";
|
|
17
|
+
/** Block ids that currently have NO link at all — no outgoing causal ref AND no in-set
|
|
18
|
+
* block points at them. These are the islands the cross-group pass should target: the
|
|
19
|
+
* linker sees every block but, without this, can't tell which are already connected, so
|
|
20
|
+
* it re-derives blindly and misses a few. Considers the within-thread links already on
|
|
21
|
+
* the items (based_on/triggered_by/extends/supersedes/resolves/relations). Refs to
|
|
22
|
+
* out-of-set labels (existing-graph) count as "connected". Pure / testable. */
|
|
23
|
+
export declare function unlinkedIds(items: Pass2Item[]): Set<string>;
|
|
24
|
+
/** Render the blocks grouped by thread, each as `id [type] essence`, so the model sees
|
|
25
|
+
* the cluster structure and references blocks by their exact id. Islands (no link yet)
|
|
26
|
+
* are marked ⚠ UNLINKED so the linker prioritises closing those gaps. */
|
|
27
|
+
export declare function buildCrossGroupLinkInput(items: Pass2Item[], groupByItemId: Record<string, string>): string;
|
|
28
|
+
export interface CrossGroupLinkCallResult {
|
|
29
|
+
links: CrossGroupLink[] | null;
|
|
30
|
+
rateLimited: boolean;
|
|
31
|
+
usage?: {
|
|
32
|
+
input: number;
|
|
33
|
+
thinking: number;
|
|
34
|
+
output: number;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export declare function callCrossGroupLinkLLM(provider: LLMProvider, items: Pass2Item[], groupByItemId: Record<string, string>, thinkingBudget?: number): Promise<CrossGroupLinkCallResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Apply cross-group links onto the items' causal fields (via the shared
|
|
40
|
+
* applyLinkToPass2Item). Pure-ish: MUTATES the matched items. Every guard a
|
|
41
|
+
* cross-thread link must pass: both ids resolve, not a self-link, the two blocks
|
|
42
|
+
* are in DIFFERENT groups (within-thread links already exist), and the type is one
|
|
43
|
+
* of the ten relations. Anything failing a guard is skipped (never throws).
|
|
44
|
+
*/
|
|
45
|
+
export declare function applyCrossGroupLinks(items: Pass2Item[], links: CrossGroupLink[], groupByItemId: Record<string, string>): {
|
|
46
|
+
added: number;
|
|
47
|
+
skipped: number;
|
|
48
|
+
};
|
|
49
|
+
export interface CrossGroupLinkResult {
|
|
50
|
+
items: Pass2Item[];
|
|
51
|
+
added: number;
|
|
52
|
+
skipped: number;
|
|
53
|
+
llm_calls: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Run the cross-group linker over the converted items. Default OFF → passthrough.
|
|
57
|
+
* No-op when there are <2 threads (nothing can be cross-group). One bounded LLM
|
|
58
|
+
* call; never blocks the pipeline (any failure → 0 links added).
|
|
59
|
+
*/
|
|
60
|
+
export declare function runCrossGroupLink(provider: LLMProvider, items: Pass2Item[], groupByItemId: Record<string, string>): Promise<CrossGroupLinkResult>;
|
|
61
|
+
//# sourceMappingURL=cross-group-link.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-group-link.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/cross-group-link.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D,wBAAgB,qBAAqB,IAAI,OAAO,CAG/C;AAED;;;;gDAIgD;AAChD,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,uBAAuB,+5DA6B4B,CAAC;AAsBjE;;;;;gFAKgF;AAChF,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAsB3D;AAED;;0EAE0E;AAC1E,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,EAAE,EAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,MAAM,CAqBR;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D;AAED,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,SAAS,EAAE,EAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACrC,cAAc,SAAO,GACpB,OAAO,CAAC,wBAAwB,CAAC,CAOnC;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAAE,EAClB,KAAK,EAAE,cAAc,EAAE,EACvB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAapC;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,WAAW,EACrB,KAAK,EAAE,SAAS,EAAE,EAClB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC,oBAAoB,CAAC,CAc/B"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
// PIPELINE v2 — CROSS-GROUP LINKER (the INTEGRATE cross-thread step; design §15.4)
|
|
3
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
4
|
+
//
|
|
5
|
+
// Per-group PRODUCE wires links only WITHIN each thread (it never sees the other
|
|
6
|
+
// threads' blocks). This step runs AFTER all blocks exist (post-convert) and adds
|
|
7
|
+
// the sparse links that cross BETWEEN threads — e.g. a decision in one cluster
|
|
8
|
+
// grounded in a fact established in another. One bounded LLM call over the block
|
|
9
|
+
// essences (output is just links → can't run away).
|
|
10
|
+
//
|
|
11
|
+
// MEANING-FIRST / GATE-5 (no new vocabulary):
|
|
12
|
+
// - relation types = the SAME 10 (COMPREHEND_LINK_RELS).
|
|
13
|
+
// - fields targeted = the SAME Pass2Item causal fields, via the SHARED
|
|
14
|
+
// applyLinkToPass2Item helper (comprehend.ts) — the converter and this linker
|
|
15
|
+
// never drift on which field a relation lands in.
|
|
16
|
+
// - block identity = the qualified item.id ({group}::{local}); no new id scheme.
|
|
17
|
+
//
|
|
18
|
+
// SCOPE: this builds CROSS-THREAD LINKING only. Cross-thread DEDUP (the duplicate
|
|
19
|
+
// blocks two PRODUCE calls extract from shared transcript) is a separate concern
|
|
20
|
+
// served by the existing block-dedup layer (dedupBySourceAndValue / stage-audit
|
|
21
|
+
// block_dup), not re-implemented here.
|
|
22
|
+
//
|
|
23
|
+
// Default OFF: NODEDEX_V2_CROSSLINK=1 (only meaningful under v2). When off → pure
|
|
24
|
+
// passthrough (no LLM). Reuse-not-rewrite: this IS the §15.4 INTEGRATE linker, now
|
|
25
|
+
// concretely targeted (the roaster↔dark-roast cross-thread edges Run 10/11 missed).
|
|
26
|
+
import { getThinkingBudget } from "./config.js";
|
|
27
|
+
import { COMPREHEND_LINK_RELS, applyLinkToPass2Item, comprehendModel } from "./comprehend.js";
|
|
28
|
+
export function crossGroupLinkEnabled() {
|
|
29
|
+
// DEFAULT ON since 2026-06-12 (part of the validated v2 stack). =0 opts out.
|
|
30
|
+
return process.env.NODEDEX_V2_CROSSLINK !== "0";
|
|
31
|
+
}
|
|
32
|
+
/** Orphan-aware linking (default OFF, NODEDEX_V2_CROSSLINK_ORPHAN_AWARE): mark the blocks
|
|
33
|
+
* that have no link yet (⚠ UNLINKED) in the linker's input so it targets those gaps
|
|
34
|
+
* instead of re-deriving blindly — the recall fix for the residual islands. Empirical
|
|
35
|
+
* (could it over-link a genuinely-standalone block?), so opt-in + A/B-able. Off → the
|
|
36
|
+
* linker input is byte-identical to before. */
|
|
37
|
+
export function orphanAwareLinkEnabled() {
|
|
38
|
+
return process.env.NODEDEX_V2_CROSSLINK_ORPHAN_AWARE === "1";
|
|
39
|
+
}
|
|
40
|
+
export const CROSS_GROUP_LINK_PROMPT = `You are given knowledge blocks from ONE work session, already grouped into THREADS,
|
|
41
|
+
with each thread's INTERNAL links already drawn. Your only job: add the links that
|
|
42
|
+
cross BETWEEN threads — where a block in one thread stands in a real relationship to
|
|
43
|
+
a block in another. The same kinds of relationships that hold within a thread hold
|
|
44
|
+
across them.
|
|
45
|
+
|
|
46
|
+
Decide by reasoning about MEANING — what actually relates to what across the
|
|
47
|
+
threads, whether or not any connecting word is present.
|
|
48
|
+
|
|
49
|
+
Each link is {from, to, type}, where "from" holds the relationship. Use the block
|
|
50
|
+
ids EXACTLY as given. Choose the type whose MEANING matches:
|
|
51
|
+
prompted_by · based_on · extends · supersedes · resolves · supports ·
|
|
52
|
+
contradicts · related_to · derived_from · affects
|
|
53
|
+
Reach for the SHARPEST relation the meaning supports; related_to and affects are a
|
|
54
|
+
last resort. The link type MUST be exactly one of these ten.
|
|
55
|
+
|
|
56
|
+
Look especially for the connections that orphan a block otherwise — these are easy to
|
|
57
|
+
miss across threads, for ANY block type: a block in one thread that REPLACED
|
|
58
|
+
(supersedes) an earlier approach, value, or state in another, or that was TRIGGERED BY
|
|
59
|
+
(prompted_by) an event or failure in another — not only where one thread's block is
|
|
60
|
+
EVIDENCE for another's. A superseded or triggering block left unlinked is the gap to close.
|
|
61
|
+
|
|
62
|
+
Blocks the input marks ⚠ UNLINKED have NO link at all yet — they are the ones most
|
|
63
|
+
likely to be wrongly orphaned. Give each marked block a deliberate pass: find its
|
|
64
|
+
cross-thread connection (what caused it, what it depends on, what it replaced or
|
|
65
|
+
answers), or judge it genuinely standalone.
|
|
66
|
+
|
|
67
|
+
Add ONLY links whose two blocks are in DIFFERENT threads — do NOT re-draw links
|
|
68
|
+
within a thread, those are already present. Do NOT invent blocks or ids. If no
|
|
69
|
+
genuine cross-thread relationship exists, return an empty list.`;
|
|
70
|
+
const CROSS_GROUP_LINK_SCHEMA = {
|
|
71
|
+
type: "object",
|
|
72
|
+
properties: {
|
|
73
|
+
links: {
|
|
74
|
+
type: "array",
|
|
75
|
+
items: {
|
|
76
|
+
type: "object",
|
|
77
|
+
properties: {
|
|
78
|
+
from: { type: "string" },
|
|
79
|
+
to: { type: "string" },
|
|
80
|
+
type: { type: "string" },
|
|
81
|
+
reasoning: { type: "string" },
|
|
82
|
+
},
|
|
83
|
+
required: ["from", "to", "type"],
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
required: ["links"],
|
|
88
|
+
};
|
|
89
|
+
/** Block ids that currently have NO link at all — no outgoing causal ref AND no in-set
|
|
90
|
+
* block points at them. These are the islands the cross-group pass should target: the
|
|
91
|
+
* linker sees every block but, without this, can't tell which are already connected, so
|
|
92
|
+
* it re-derives blindly and misses a few. Considers the within-thread links already on
|
|
93
|
+
* the items (based_on/triggered_by/extends/supersedes/resolves/relations). Refs to
|
|
94
|
+
* out-of-set labels (existing-graph) count as "connected". Pure / testable. */
|
|
95
|
+
export function unlinkedIds(items) {
|
|
96
|
+
const idSet = new Set(items.map((it) => it.id));
|
|
97
|
+
const hasOut = new Set(); // blocks with >=1 outgoing causal ref
|
|
98
|
+
const isTarget = new Set(); // in-set blocks something points at
|
|
99
|
+
for (const it of items) {
|
|
100
|
+
const refs = [
|
|
101
|
+
...(it.based_on_items ?? []),
|
|
102
|
+
...(it.triggered_by_items ?? []),
|
|
103
|
+
it.extends_item,
|
|
104
|
+
it.supersedes_ref,
|
|
105
|
+
it.resolved_ref,
|
|
106
|
+
...((it.relations ?? []).map((r) => r?.target)),
|
|
107
|
+
];
|
|
108
|
+
for (const r of refs) {
|
|
109
|
+
if (!r)
|
|
110
|
+
continue;
|
|
111
|
+
hasOut.add(it.id);
|
|
112
|
+
if (idSet.has(r))
|
|
113
|
+
isTarget.add(r);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const out = new Set();
|
|
117
|
+
for (const it of items)
|
|
118
|
+
if (!hasOut.has(it.id) && !isTarget.has(it.id))
|
|
119
|
+
out.add(it.id);
|
|
120
|
+
return out;
|
|
121
|
+
}
|
|
122
|
+
/** Render the blocks grouped by thread, each as `id [type] essence`, so the model sees
|
|
123
|
+
* the cluster structure and references blocks by their exact id. Islands (no link yet)
|
|
124
|
+
* are marked ⚠ UNLINKED so the linker prioritises closing those gaps. */
|
|
125
|
+
export function buildCrossGroupLinkInput(items, groupByItemId) {
|
|
126
|
+
const islands = orphanAwareLinkEnabled() ? unlinkedIds(items) : new Set();
|
|
127
|
+
const byGroup = new Map();
|
|
128
|
+
for (const it of items) {
|
|
129
|
+
const g = groupByItemId[it.id] ?? "?";
|
|
130
|
+
let arr = byGroup.get(g);
|
|
131
|
+
if (!arr) {
|
|
132
|
+
arr = [];
|
|
133
|
+
byGroup.set(g, arr);
|
|
134
|
+
}
|
|
135
|
+
arr.push(it);
|
|
136
|
+
}
|
|
137
|
+
const parts = [];
|
|
138
|
+
for (const [g, its] of byGroup) {
|
|
139
|
+
parts.push(`[thread: ${g}]`);
|
|
140
|
+
for (const it of its) {
|
|
141
|
+
const mark = islands.has(it.id) ? " ⚠ UNLINKED" : "";
|
|
142
|
+
parts.push(` - ${it.id} [${it.type}]${mark} ${(it.text ?? "").replace(/\s+/g, " ").slice(0, 140)}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const islandNote = islands.size > 0
|
|
146
|
+
? `\n\n${islands.size} block(s) are marked ⚠ UNLINKED — give each a deliberate pass (see prompt).`
|
|
147
|
+
: "";
|
|
148
|
+
return `THREADS (each block's within-thread links are already drawn; add ONLY links BETWEEN threads):\n\n${parts.join("\n")}${islandNote}`;
|
|
149
|
+
}
|
|
150
|
+
export async function callCrossGroupLinkLLM(provider, items, groupByItemId, thinkingBudget = 2048) {
|
|
151
|
+
const userInput = buildCrossGroupLinkInput(items, groupByItemId);
|
|
152
|
+
const r = await provider.generateStructured(CROSS_GROUP_LINK_PROMPT, userInput, CROSS_GROUP_LINK_SCHEMA, { thinkingBudget: getThinkingBudget(thinkingBudget), maxOutputTokens: 4096, modelOverride: comprehendModel() });
|
|
153
|
+
return { links: r.result?.links ?? null, rateLimited: r.rateLimited, usage: r.usage };
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Apply cross-group links onto the items' causal fields (via the shared
|
|
157
|
+
* applyLinkToPass2Item). Pure-ish: MUTATES the matched items. Every guard a
|
|
158
|
+
* cross-thread link must pass: both ids resolve, not a self-link, the two blocks
|
|
159
|
+
* are in DIFFERENT groups (within-thread links already exist), and the type is one
|
|
160
|
+
* of the ten relations. Anything failing a guard is skipped (never throws).
|
|
161
|
+
*/
|
|
162
|
+
export function applyCrossGroupLinks(items, links, groupByItemId) {
|
|
163
|
+
const byId = new Map(items.map((it) => [it.id, it]));
|
|
164
|
+
let added = 0, skipped = 0;
|
|
165
|
+
for (const link of links ?? []) {
|
|
166
|
+
const from = byId.get(link?.from);
|
|
167
|
+
if (!from || !byId.has(link?.to)) {
|
|
168
|
+
skipped++;
|
|
169
|
+
continue;
|
|
170
|
+
} // unknown id
|
|
171
|
+
if (link.from === link.to) {
|
|
172
|
+
skipped++;
|
|
173
|
+
continue;
|
|
174
|
+
} // self-link
|
|
175
|
+
if (groupByItemId[link.from] === groupByItemId[link.to]) {
|
|
176
|
+
skipped++;
|
|
177
|
+
continue;
|
|
178
|
+
} // SAME thread → not cross-group
|
|
179
|
+
if (!COMPREHEND_LINK_RELS.has(link.type)) {
|
|
180
|
+
skipped++;
|
|
181
|
+
continue;
|
|
182
|
+
} // unknown relation type
|
|
183
|
+
applyLinkToPass2Item(from, link.type, link.to, link.reasoning);
|
|
184
|
+
added++;
|
|
185
|
+
}
|
|
186
|
+
return { added, skipped };
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Run the cross-group linker over the converted items. Default OFF → passthrough.
|
|
190
|
+
* No-op when there are <2 threads (nothing can be cross-group). One bounded LLM
|
|
191
|
+
* call; never blocks the pipeline (any failure → 0 links added).
|
|
192
|
+
*/
|
|
193
|
+
export async function runCrossGroupLink(provider, items, groupByItemId) {
|
|
194
|
+
if (!crossGroupLinkEnabled())
|
|
195
|
+
return { items, added: 0, skipped: 0, llm_calls: 0 };
|
|
196
|
+
const groupCount = new Set(Object.values(groupByItemId)).size;
|
|
197
|
+
if (groupCount < 2 || items.length < 2)
|
|
198
|
+
return { items, added: 0, skipped: 0, llm_calls: 0 };
|
|
199
|
+
try {
|
|
200
|
+
const r = await callCrossGroupLinkLLM(provider, items, groupByItemId);
|
|
201
|
+
if (!r.links)
|
|
202
|
+
return { items, added: 0, skipped: 0, llm_calls: 1 };
|
|
203
|
+
const { added, skipped } = applyCrossGroupLinks(items, r.links, groupByItemId);
|
|
204
|
+
console.log(`[cross-group-link] added ${added} cross-thread link(s), skipped ${skipped} — 1 LLM call`);
|
|
205
|
+
return { items, added, skipped, llm_calls: 1 };
|
|
206
|
+
}
|
|
207
|
+
catch (e) {
|
|
208
|
+
console.warn(`[cross-group-link] threw (${e?.message ?? e}) — 0 links added`);
|
|
209
|
+
return { items, added: 0, skipped: 0, llm_calls: 1 };
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=cross-group-link.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cross-group-link.js","sourceRoot":"","sources":["../../../src/middleware/reflect/cross-group-link.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { Pass2Item } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Core extractor: given a block TYPE + its unique{} object, return the canonical
|
|
4
|
+
* "what is this block" primary value. The identity-bearing field per type
|
|
5
|
+
* (per [[feedback-identity-is-unique-not-label]] — identity is unique{} content,
|
|
6
|
+
* NOT label/essence). Returns "" when no primary value found.
|
|
7
|
+
*
|
|
8
|
+
* Exported so OTHER producers that hold a (type, unique) pair rather than a
|
|
9
|
+
* Pass2Item — e.g. Stage AUDIT's scope_disagreement detector, which works off
|
|
10
|
+
* persisted Block rows — extract the SAME identity value (Rule 5: one notion of
|
|
11
|
+
* "block identity value," one implementation).
|
|
12
|
+
*/
|
|
13
|
+
export declare function extractPrimaryValueFromUnique(type: string, unique: Record<string, unknown>): string;
|
|
14
|
+
/**
|
|
15
|
+
* Extract the canonical primary value for a Pass2Item, used as the second
|
|
16
|
+
* tuple element in dedup. Returns "" when no primary value found (the item
|
|
17
|
+
* then dedups only on source_excerpt, which is conservative).
|
|
18
|
+
*/
|
|
19
|
+
export declare function extractPrimaryValue(item: Pass2Item): string;
|
|
20
|
+
export interface DedupResult {
|
|
21
|
+
/**
|
|
22
|
+
* Items list returned to the caller. Sub-step 1.4 semantics: kept ALWAYS
|
|
23
|
+
* equals input items (no drop). Pre-1.4 this auto-dropped duplicates;
|
|
24
|
+
* post-1.4 the caller writes pipeline_flags rows for an async LLM
|
|
25
|
+
* reviewer (Slice 2) to decide merge/leave/split with full graph context.
|
|
26
|
+
*
|
|
27
|
+
* Until Slice 2 lands, the graph may accumulate duplicate atomic blocks.
|
|
28
|
+
* That's the trade-off versus auto-drop, which violated the flag-not-merge
|
|
29
|
+
* principle the user established in PIPELINE-AUDIT-DEPENDENCY-MAP.md §2.
|
|
30
|
+
*/
|
|
31
|
+
kept: Pass2Item[];
|
|
32
|
+
/**
|
|
33
|
+
* Duplicate-candidate pairs detected. The caller (pipeline.ts) resolves
|
|
34
|
+
* these item_ids to block_ids after Pass 3 createBlock loop, then calls
|
|
35
|
+
* writePipelineFlag with flag_type='atomic_dup_candidate'.
|
|
36
|
+
*/
|
|
37
|
+
duplicates: Array<{
|
|
38
|
+
id: string;
|
|
39
|
+
duplicate_of: string;
|
|
40
|
+
key: string;
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Detect candidate duplicate items by (source_excerpt, primary_value).
|
|
45
|
+
*
|
|
46
|
+
* Sub-step 1.4 change: this function NO LONGER drops items. Returns input
|
|
47
|
+
* unchanged + the duplicate-pair list. See DedupResult.kept comment for
|
|
48
|
+
* full rationale.
|
|
49
|
+
*
|
|
50
|
+
* RULES (unchanged from prior behavior):
|
|
51
|
+
* - Two items are duplicate-CANDIDATES iff:
|
|
52
|
+
* a) Both have non-empty excerpt AND
|
|
53
|
+
* b) Both have non-empty primary value AND
|
|
54
|
+
* c) Both tuples match exactly (case-sensitive — Pass 1 deterministically
|
|
55
|
+
* extracts from transcript, so case should be stable)
|
|
56
|
+
* - First occurrence is the "winner" for FK target purposes in the flag.
|
|
57
|
+
* - NULL/empty excerpt items NEVER detected (treated as pre-Debt-5 atomic —
|
|
58
|
+
* can't determine sameness without source pin).
|
|
59
|
+
* - Empty primary value items NEVER detected (defensive — risk false-positive
|
|
60
|
+
* on unrelated items that happen to share a source line).
|
|
61
|
+
*
|
|
62
|
+
* Returns:
|
|
63
|
+
* - kept: ALL input items (never drops; same array reference)
|
|
64
|
+
* - duplicates: list of {id, duplicate_of, key} for downstream flag writing
|
|
65
|
+
*
|
|
66
|
+
* Function name preserved (dedupBySourceAndValue) for backward compat with
|
|
67
|
+
* callers, but semantics flipped from "dedup" to "detect duplicates."
|
|
68
|
+
*/
|
|
69
|
+
export declare function dedupBySourceAndValue(items: Pass2Item[]): DedupResult;
|
|
70
|
+
//# sourceMappingURL=dedup-by-source-and-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup-by-source-and-value.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/dedup-by-source-and-value.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AA+B5C;;;;;;;;;;GAUG;AACH,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAeR;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAE3D;AAID,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;OASG;IACH,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB;;;;OAIG;IACH,UAAU,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,WAAW,CAqBrE"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup-by-source-and-value.js","sourceRoot":"","sources":["../../../src/middleware/reflect/dedup-by-source-and-value.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { WorkspaceDB, Block } from "../../store/database.js";
|
|
2
|
+
import type { LLMProvider } from "../../engine/ai-provider.js";
|
|
3
|
+
export interface RootDescribeInput {
|
|
4
|
+
root: Block;
|
|
5
|
+
memberCount: number;
|
|
6
|
+
/** content.last_described_member_count; null = never described. */
|
|
7
|
+
lastDescribedCount: number | null;
|
|
8
|
+
}
|
|
9
|
+
/** Returns the reason a root needs (re)describing, or false. Pure. */
|
|
10
|
+
export declare function rootNeedsDescription(inp: {
|
|
11
|
+
memberCount: number;
|
|
12
|
+
lastDescribedCount: number | null;
|
|
13
|
+
}, opts: {
|
|
14
|
+
minMembers: number;
|
|
15
|
+
growthThreshold: number;
|
|
16
|
+
}): false | "never" | "grew";
|
|
17
|
+
export declare function selectRootsNeedingDescription(inputs: RootDescribeInput[], opts: {
|
|
18
|
+
minMembers: number;
|
|
19
|
+
growthThreshold: number;
|
|
20
|
+
}): Array<RootDescribeInput & {
|
|
21
|
+
reason: "never" | "grew";
|
|
22
|
+
}>;
|
|
23
|
+
export declare const DESCRIBE_ROOT_PROMPT = "You are writing a one-line SURFACE description of a project root in a knowledge graph.\nIts ONLY job: let a later step decide \"does a new piece of knowledge belong in THIS project?\"\n\nCapture TWO things in one line:\n 1. DOMAIN \u2014 what this project is about (the topic).\n 2. OWNER / SCOPE \u2014 whose it is (a client/customer name, a system name, or \"personal\")\n IF the members reveal one. Omit only if genuinely unknown.\n\nRULES:\n - SIGNPOST, not table-of-contents. Do NOT list the individual members/decisions/facts.\n - Surface only. ONE line, <= 140 characters.\n - Base it ONLY on the MEMBERS shown. Never invent a domain or owner the members don't evidence.\n - Plain language. No label syntax, no underscores.";
|
|
24
|
+
export declare function buildDescribeInput(root: Block, members: Block[], cap: number): string;
|
|
25
|
+
export declare function describeRoot(provider: LLMProvider, root: Block, members: Block[]): Promise<{
|
|
26
|
+
description: string | null;
|
|
27
|
+
rateLimited: boolean;
|
|
28
|
+
usage?: {
|
|
29
|
+
input?: number;
|
|
30
|
+
thinking?: number;
|
|
31
|
+
output?: number;
|
|
32
|
+
};
|
|
33
|
+
}>;
|
|
34
|
+
export interface DescriberTickResult {
|
|
35
|
+
roots_total: number;
|
|
36
|
+
roots_needing: number;
|
|
37
|
+
described: number;
|
|
38
|
+
llm_calls: number;
|
|
39
|
+
rate_limited: number;
|
|
40
|
+
errors: number;
|
|
41
|
+
wall_ms: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* One describer tick: find roots needing a (re)description, describe up to
|
|
45
|
+
* `limit` of them, write essence + the lazy marker. Async (LLM). Bounded.
|
|
46
|
+
*/
|
|
47
|
+
export declare function runDescriberTick(opts: {
|
|
48
|
+
db: WorkspaceDB;
|
|
49
|
+
provider: LLMProvider;
|
|
50
|
+
limit?: number;
|
|
51
|
+
}): Promise<DescriberTickResult>;
|
|
52
|
+
/** Start the describer timer. Idempotent; returns true if started. Default OFF. */
|
|
53
|
+
export declare function startDescriberTimer(db: WorkspaceDB): boolean;
|
|
54
|
+
/** Stop the describer timer. Used on shutdown + by tests. */
|
|
55
|
+
export declare function stopDescriberTimer(): void;
|
|
56
|
+
/** For tests only — reports whether the timer is currently running. */
|
|
57
|
+
export declare function _isDescriberTimerRunningForTests(): boolean;
|
|
58
|
+
//# sourceMappingURL=describe-roots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describe-roots.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/describe-roots.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AA4B/D,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,KAAK,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,sEAAsE;AACtE,wBAAgB,oBAAoB,CAClC,GAAG,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EAC/D,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GACpD,KAAK,GAAG,OAAO,GAAG,MAAM,CAK1B;AAED,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,iBAAiB,EAAE,EAC3B,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,GACpD,KAAK,CAAC,iBAAiB,GAAG;IAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAAA;CAAE,CAAC,CAOzD;AAID,eAAO,MAAM,oBAAoB,yuBAYoB,CAAC;AAQtD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAerF;AAID,wBAAsB,YAAY,CAChC,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,KAAK,EAAE,GACf,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAc/H;AAID,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,EAAE,EAAE,WAAW,CAAC;IAChB,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAgF/B;AAwCD,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAa5D;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC;AAED,uEAAuE;AACvE,wBAAgB,gCAAgC,IAAI,OAAO,CAE1D"}
|