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,92 @@
|
|
|
1
|
+
// root-relatedness.ts — derive a MEANING-CLASSIFIED root-relatedness map from the
|
|
2
|
+
// CROSS-ROOT edges already in the graph. The "Venn overlap" of two project roots,
|
|
3
|
+
// grounded in real edges (no LLM, no hallucination).
|
|
4
|
+
//
|
|
5
|
+
// "Related" is NOT one thing — each relation type carries a DIFFERENT meaning, so
|
|
6
|
+
// edges are classified into categories rather than lumped:
|
|
7
|
+
// dependency — based_on/prompted_by/derived_from/supports/extends/depends_on/affects
|
|
8
|
+
// ("A reasons from / is triggered by B") — the real cross-root overlap
|
|
9
|
+
// containment — part_of/contains ("A is INSIDE B") — the nesting signal, strongest
|
|
10
|
+
// evolution — supersedes/superseded_by ("A replaced B") — shared topic revisited
|
|
11
|
+
// conflict — contradicts — a conflict to resolve, surfaced distinctly
|
|
12
|
+
// loose — related_to — generic association
|
|
13
|
+
// EXCLUDED: member_of (chain grouping — would double-count) + provenance types
|
|
14
|
+
// (extracted_from/produced/describes/implements…) — not topic relatedness.
|
|
15
|
+
// Directional for the SUBORDINATING types, so "gear belongs under wind-river" falls out.
|
|
16
|
+
const CATEGORY = {
|
|
17
|
+
based_on: "dependency", prompted_by: "dependency", derived_from: "dependency",
|
|
18
|
+
supports: "dependency", extends: "dependency", depends_on: "dependency",
|
|
19
|
+
affects: "dependency", affected_by: "dependency", triggered: "dependency", enables: "dependency",
|
|
20
|
+
part_of: "containment", contains: "containment",
|
|
21
|
+
supersedes: "evolution", superseded_by: "evolution",
|
|
22
|
+
contradicts: "conflict",
|
|
23
|
+
related_to: "loose",
|
|
24
|
+
};
|
|
25
|
+
// Types where SOURCE is subordinate to TARGET (source depends on / sits under target).
|
|
26
|
+
const SUBORDINATING = new Set(["based_on", "prompted_by", "derived_from", "depends_on", "part_of", "triggered", "affected_by"]);
|
|
27
|
+
// Grouping + provenance — NOT topic relatedness.
|
|
28
|
+
const EXCLUDE = new Set(["member_of", "extracted_from", "produced", "describes", "described_by", "implements", "implemented_by"]);
|
|
29
|
+
/** Pure: classify cross-root edges into a meaning-categorized relatedness map. Testable. */
|
|
30
|
+
export function classifyRootRelatedness(blocks, edges) {
|
|
31
|
+
const byId = new Map(blocks.map((b) => [b.id, b]));
|
|
32
|
+
const rootOf = (id) => {
|
|
33
|
+
const b = byId.get(id);
|
|
34
|
+
if (!b)
|
|
35
|
+
return null;
|
|
36
|
+
return b.type === "project" ? b.id : b.project_id;
|
|
37
|
+
};
|
|
38
|
+
const labelOf = (rid) => byId.get(rid)?.label ?? rid;
|
|
39
|
+
const pairs = new Map();
|
|
40
|
+
for (const e of edges) {
|
|
41
|
+
if (EXCLUDE.has(e.type))
|
|
42
|
+
continue;
|
|
43
|
+
const cat = CATEGORY[e.type];
|
|
44
|
+
if (!cat)
|
|
45
|
+
continue;
|
|
46
|
+
const rs = rootOf(e.source_id), rt = rootOf(e.target_id);
|
|
47
|
+
if (!rs || !rt || rs === rt)
|
|
48
|
+
continue;
|
|
49
|
+
const [a, b] = rs < rt ? [rs, rt] : [rt, rs];
|
|
50
|
+
const k = `${a}|${b}`;
|
|
51
|
+
let acc = pairs.get(k);
|
|
52
|
+
if (!acc) {
|
|
53
|
+
acc = { a, b, cats: new Map(), subUp: new Map() };
|
|
54
|
+
pairs.set(k, acc);
|
|
55
|
+
}
|
|
56
|
+
acc.cats.set(cat, (acc.cats.get(cat) ?? 0) + 1);
|
|
57
|
+
if (SUBORDINATING.has(e.type))
|
|
58
|
+
acc.subUp.set(rt, (acc.subUp.get(rt) ?? 0) + 1); // target is the parent
|
|
59
|
+
}
|
|
60
|
+
const out = [];
|
|
61
|
+
const related = new Set();
|
|
62
|
+
for (const acc of pairs.values()) {
|
|
63
|
+
related.add(acc.a);
|
|
64
|
+
related.add(acc.b);
|
|
65
|
+
const categories = {};
|
|
66
|
+
let total = 0;
|
|
67
|
+
for (const [c, n] of acc.cats) {
|
|
68
|
+
categories[c] = n;
|
|
69
|
+
total += n;
|
|
70
|
+
}
|
|
71
|
+
let parent = null, parentEdges = 0;
|
|
72
|
+
for (const [rid, n] of acc.subUp)
|
|
73
|
+
if (n > parentEdges) {
|
|
74
|
+
parent = labelOf(rid);
|
|
75
|
+
parentEdges = n;
|
|
76
|
+
}
|
|
77
|
+
out.push({ root_a: labelOf(acc.a), root_b: labelOf(acc.b), categories, total, parent, parent_subordinating_edges: parentEdges });
|
|
78
|
+
}
|
|
79
|
+
out.sort((x, y) => y.total - x.total);
|
|
80
|
+
const standalone = blocks.filter((b) => b.type === "project" && !related.has(b.id)).map((b) => b.label);
|
|
81
|
+
return { pairs: out, standalone };
|
|
82
|
+
}
|
|
83
|
+
/** DB wrapper: read blocks + active relations, classify. */
|
|
84
|
+
export function deriveRootRelatedness(db) {
|
|
85
|
+
const blocks = db.getAllBlocks().map((b) => ({
|
|
86
|
+
id: b.id, label: b.label, type: b.type, project_id: b.project_id ?? null,
|
|
87
|
+
}));
|
|
88
|
+
const raw = db.db;
|
|
89
|
+
const edges = raw.prepare("SELECT source_id, target_id, type FROM relations WHERE valid_to IS NULL").all();
|
|
90
|
+
return classifyRootRelatedness(blocks, edges);
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=root-relatedness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-relatedness.js","sourceRoot":"","sources":["../../../src/middleware/reflect/root-relatedness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { WorkspaceDB } from "../../store/database.js";
|
|
2
|
+
export interface SchemaHealResult {
|
|
3
|
+
flagged: number;
|
|
4
|
+
healed: number;
|
|
5
|
+
collided: number;
|
|
6
|
+
skipped: number;
|
|
7
|
+
healed_labels: string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Apply demoteForSave() retroactively to every needs_review block. Pure use of the
|
|
11
|
+
* existing rule + db.updateBlock (which records block_history). Idempotent: a healed
|
|
12
|
+
* block becomes review_status='corrected' and is no longer picked up on a re-run.
|
|
13
|
+
*/
|
|
14
|
+
export declare function healSchemaDemotes(db: WorkspaceDB): SchemaHealResult;
|
|
15
|
+
export declare function schemaHealEnabled(): boolean;
|
|
16
|
+
/** Start the $0 deterministic schema-heal sweep. Default-ON (Tier-1). Idempotent.
|
|
17
|
+
* Runs an initial sweep ~15s after boot (let the server settle), then periodically. */
|
|
18
|
+
export declare function startSchemaHealTimer(db: WorkspaceDB): boolean;
|
|
19
|
+
export declare function stopSchemaHealTimer(): void;
|
|
20
|
+
/** Tests only — is the timer running? */
|
|
21
|
+
export declare function _isSchemaHealTimerRunningForTests(): boolean;
|
|
22
|
+
//# sourceMappingURL=schema-heal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-heal.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/schema-heal.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAI3D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,WAAW,GAAG,gBAAgB,CA4BnE;AAWD,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAuBD;wFACwF;AACxF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAa7D;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,yCAAyC;AACzC,wBAAgB,iCAAiC,IAAI,OAAO,CAE3D"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// schema-heal.ts — retroactive backfill of the deterministic demote-at-save heal.
|
|
2
|
+
//
|
|
3
|
+
// WHY: demoteForSave() (schema-validator.ts) re-types a block whose content fits a
|
|
4
|
+
// DIFFERENT type better — an `insight` with no `implication` IS, by definition, a
|
|
5
|
+
// `fact` whose value is the observation. But it runs at SAVE time, forward-only, so
|
|
6
|
+
// blocks created before it shipped (2026-06-12) sit FLAGGED
|
|
7
|
+
// (review_status='needs_review', schema_mismatch) instead of demoted. This applies the
|
|
8
|
+
// SAME deterministic rule retroactively to already-flagged blocks.
|
|
9
|
+
//
|
|
10
|
+
// CORRECTS, never deletes (Rule 2):
|
|
11
|
+
// - clean case → re-type via the demote (insight→fact: label segment renamed,
|
|
12
|
+
// observation mapped to value), flag cleared.
|
|
13
|
+
// - collision → the demoted label already exists, so this block DUPLICATES it.
|
|
14
|
+
// That's a MERGE judgment, not a clean demote — LEFT flagged for the
|
|
15
|
+
// dup-reviewer; never auto-merged here on a label match alone.
|
|
16
|
+
// - not eligible→ no DEMOTE_TARGETS row / extras / source field missing → LEFT flagged.
|
|
17
|
+
//
|
|
18
|
+
// $0 — no LLM, pure deterministic rule. Run via POST /api/admin/heal-schema-demotes
|
|
19
|
+
// (the server's single DB connection). NEVER run as a script against a server-held DB.
|
|
20
|
+
import { demoteForSave } from "./schema-validator.js";
|
|
21
|
+
import { intFromEnv } from "./config.js";
|
|
22
|
+
/**
|
|
23
|
+
* Apply demoteForSave() retroactively to every needs_review block. Pure use of the
|
|
24
|
+
* existing rule + db.updateBlock (which records block_history). Idempotent: a healed
|
|
25
|
+
* block becomes review_status='corrected' and is no longer picked up on a re-run.
|
|
26
|
+
*/
|
|
27
|
+
export function healSchemaDemotes(db) {
|
|
28
|
+
const flagged = db.getAllBlocks().filter((b) => b.review_status === "needs_review");
|
|
29
|
+
const res = { flagged: flagged.length, healed: 0, collided: 0, skipped: 0, healed_labels: [] };
|
|
30
|
+
for (const b of flagged) {
|
|
31
|
+
let content = {};
|
|
32
|
+
try {
|
|
33
|
+
content = typeof b.content === "string" ? JSON.parse(b.content) : (b.content ?? {});
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
content = {};
|
|
37
|
+
}
|
|
38
|
+
const unique = content.unique ?? {};
|
|
39
|
+
const demotion = demoteForSave(b.type, unique, b.label);
|
|
40
|
+
if (!demotion) {
|
|
41
|
+
res.skipped++;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
// Collision: the demoted label is already taken → this block duplicates an
|
|
45
|
+
// existing one. Merging is a judgment for the dup-reviewer; leave it flagged.
|
|
46
|
+
if (db.getBlock(demotion.label)) {
|
|
47
|
+
res.collided++;
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
content.unique = demotion.unique;
|
|
51
|
+
db.updateBlock(b.id, { type: demotion.type, label: demotion.label, content, review_status: "corrected", review_reason: "" }, `schema-heal: demoted ${demotion.from_type}→${demotion.type} (required field unfillable)`, "schema_heal");
|
|
52
|
+
res.healed++;
|
|
53
|
+
res.healed_labels.push(demotion.label);
|
|
54
|
+
}
|
|
55
|
+
return res;
|
|
56
|
+
}
|
|
57
|
+
// ─── Background sweep (Tier-1 LOCKED-ON per docs/RELEASE-DEFAULTS-AND-SELF-MAINTENANCE.md) ──
|
|
58
|
+
// The doc lists schema-heal as a default-on essential ($0 deterministic), but only the
|
|
59
|
+
// save-time demote (forward) + the manual /api/admin/heal-schema-demotes endpoint were ever
|
|
60
|
+
// wired — so OLD flagged blocks never got swept (the doc↔code drift the backpacking DB's 8
|
|
61
|
+
// schema_mismatch flags exposed, 2026-06-21). This timer makes the doc true: a periodic $0
|
|
62
|
+
// deterministic sweep over the server's OWN db connection (the safe path — NEVER a script
|
|
63
|
+
// against a server-held DB). Idempotent (healed → review_status='corrected', not re-picked),
|
|
64
|
+
// so re-running is free. Opt-out only: NODEDEX_SCHEMA_HEAL_ENABLED=off.
|
|
65
|
+
export function schemaHealEnabled() {
|
|
66
|
+
return (process.env.NODEDEX_SCHEMA_HEAL_ENABLED ?? "on").toLowerCase() !== "off";
|
|
67
|
+
}
|
|
68
|
+
function intervalMs() {
|
|
69
|
+
return intFromEnv("NODEDEX_SCHEMA_HEAL_INTERVAL_MS", 1_800_000); // 30 min (slow background)
|
|
70
|
+
}
|
|
71
|
+
let _handle = null;
|
|
72
|
+
let _inFlight = false;
|
|
73
|
+
function tick(db) {
|
|
74
|
+
if (_inFlight)
|
|
75
|
+
return;
|
|
76
|
+
_inFlight = true;
|
|
77
|
+
try {
|
|
78
|
+
const r = healSchemaDemotes(db);
|
|
79
|
+
if (r.healed > 0 || r.collided > 0) {
|
|
80
|
+
console.log(`[schema-heal] swept: flagged=${r.flagged} healed=${r.healed} collided=${r.collided} skipped=${r.skipped}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
console.warn(`[schema-heal] sweep threw: ${e?.message ?? e}`);
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
_inFlight = false;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Start the $0 deterministic schema-heal sweep. Default-ON (Tier-1). Idempotent.
|
|
91
|
+
* Runs an initial sweep ~15s after boot (let the server settle), then periodically. */
|
|
92
|
+
export function startSchemaHealTimer(db) {
|
|
93
|
+
if (!schemaHealEnabled()) {
|
|
94
|
+
console.log("[schema-heal] disabled (NODEDEX_SCHEMA_HEAL_ENABLED=off)");
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
if (_handle !== null)
|
|
98
|
+
return false;
|
|
99
|
+
const ms = intervalMs();
|
|
100
|
+
const initial = setTimeout(() => tick(db), 15_000);
|
|
101
|
+
if (typeof initial.unref === "function")
|
|
102
|
+
initial.unref();
|
|
103
|
+
_handle = setInterval(() => tick(db), ms);
|
|
104
|
+
if (typeof _handle.unref === "function")
|
|
105
|
+
_handle.unref();
|
|
106
|
+
console.log(`[schema-heal] started: $0 deterministic sweep, interval=${ms}ms (initial in 15s)`);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
export function stopSchemaHealTimer() {
|
|
110
|
+
if (_handle !== null) {
|
|
111
|
+
clearInterval(_handle);
|
|
112
|
+
_handle = null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/** Tests only — is the timer running? */
|
|
116
|
+
export function _isSchemaHealTimerRunningForTests() {
|
|
117
|
+
return _handle !== null;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=schema-heal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-heal.js","sourceRoot":"","sources":["../../../src/middleware/reflect/schema-heal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Required and optional unique{} keys per block type.
|
|
3
|
+
*
|
|
4
|
+
* `required[]` — keys that MUST be present (non-empty) for the type to be valid.
|
|
5
|
+
* `optional[]` — keys that MAY appear. Anything outside required ∪ optional is
|
|
6
|
+
* an "extras" violation (probably wrong type for the content).
|
|
7
|
+
* Empty arrays in BOTH → freeform / no-schema type (project, process, note),
|
|
8
|
+
* always passes validation.
|
|
9
|
+
*/
|
|
10
|
+
export declare const TYPE_UNIQUE_SCHEMA: Record<string, {
|
|
11
|
+
required: string[];
|
|
12
|
+
optional: string[];
|
|
13
|
+
}>;
|
|
14
|
+
export type SchemaCheckResult = {
|
|
15
|
+
ok: true;
|
|
16
|
+
} | {
|
|
17
|
+
ok: false;
|
|
18
|
+
missing: string[];
|
|
19
|
+
extras: string[];
|
|
20
|
+
detail: string;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Check if `unique{}` matches the type's declared schema.
|
|
24
|
+
*
|
|
25
|
+
* Returns `{ ok: true }` if:
|
|
26
|
+
* - the type has no declared schema (novel/freeform), OR
|
|
27
|
+
* - all required keys are present (non-empty) AND no unexpected keys are present.
|
|
28
|
+
*
|
|
29
|
+
* Returns `{ ok: false, missing, extras, detail }` otherwise.
|
|
30
|
+
*
|
|
31
|
+
* "Present" means: the key exists AND its value is not null/undefined/empty-string.
|
|
32
|
+
* Whitespace-only strings are treated as empty.
|
|
33
|
+
*/
|
|
34
|
+
export declare function validateUniqueSchema(type: string | undefined | null, unique: Record<string, unknown> | undefined | null): SchemaCheckResult;
|
|
35
|
+
/**
|
|
36
|
+
* Compose a review_reason string for a schema mismatch, prefixed so downstream
|
|
37
|
+
* consumers (UI, audits) can recognize the source.
|
|
38
|
+
*/
|
|
39
|
+
export declare function schemaMismatchReason(check: SchemaCheckResult): string | null;
|
|
40
|
+
/**
|
|
41
|
+
* DEMOTE_TARGETS — type re-targeting map for the demote-edge (2026-05-27, debt-3
|
|
42
|
+
* structural-small; relocated here 2026-06-12 so seam-α and the save-time demote
|
|
43
|
+
* share ONE source of truth — pass2-seams re-exports it).
|
|
44
|
+
*
|
|
45
|
+
* Each row encodes a UNIVERSAL meaning-equivalence (per docs/reference/block-types.md
|
|
46
|
+
* definitions), NEVER a domain-specific heuristic. The gate for adding a row:
|
|
47
|
+
*
|
|
48
|
+
* "If type X's required field is genuinely unfillable AND the equivalent content
|
|
49
|
+
* is fillable as type Y, then 'X without that field' IS Y, by Y's definition."
|
|
50
|
+
*
|
|
51
|
+
* Current rows:
|
|
52
|
+
* - insight → fact: an insight is `observation + implication`; a fact is
|
|
53
|
+
* `value + why_matters?`. An insight whose implication is unfillable while
|
|
54
|
+
* observation is present IS, by definition, a fact whose value is that
|
|
55
|
+
* observation. The demote encodes this; it does not invent it.
|
|
56
|
+
*/
|
|
57
|
+
export declare const DEMOTE_TARGETS: Record<string, {
|
|
58
|
+
to: string;
|
|
59
|
+
field_map: Record<string, string>;
|
|
60
|
+
}>;
|
|
61
|
+
export interface SaveDemotion {
|
|
62
|
+
type: string;
|
|
63
|
+
unique: Record<string, unknown>;
|
|
64
|
+
label: string;
|
|
65
|
+
from_type: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Tier 1B demote-at-save (2026-06-12). The v1 path applies DEMOTE_TARGETS at
|
|
69
|
+
* seam-α (before naming); the v2 TRANSFORM path enters at Pass 3 and SKIPS that
|
|
70
|
+
* seam — so schema-clean-but-demotable blocks were arriving at save flagged
|
|
71
|
+
* (`schema_mismatch: missing=[implication]`) instead of demoted (6/6 of the
|
|
72
|
+
* 2026-06-12 audit's flags). This applies the SAME equivalence at the final seam.
|
|
73
|
+
*
|
|
74
|
+
* CONSERVATIVE by contract — demotes ONLY the exact case:
|
|
75
|
+
* - the type has a DEMOTE_TARGETS row, AND
|
|
76
|
+
* - the ONLY schema problem is that every missing key is a mapped source key
|
|
77
|
+
* whose target content is present (no extras, nothing else missing), AND
|
|
78
|
+
* - the label's type segment can be renamed so label and type stay in
|
|
79
|
+
* agreement (a half-demote that leaves `_insight_` in the label would break
|
|
80
|
+
* findability — then we keep the flag instead).
|
|
81
|
+
* Anything outside that → return null → the existing soft-flag path applies
|
|
82
|
+
* (capture-first: a wrong flag is recoverable; a wrong rewrite is not).
|
|
83
|
+
*/
|
|
84
|
+
export declare function demoteForSave(type: string | undefined | null, unique: Record<string, unknown> | undefined | null, label: string | undefined | null): SaveDemotion | null;
|
|
85
|
+
//# sourceMappingURL=schema-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../../src/middleware/reflect/schema-validator.ts"],"names":[],"mappings":"AAwBA;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAyCzF,CAAC;AAEF,MAAM,MAAM,iBAAiB,GACzB;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,GACjD,iBAAiB,CA4BnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAG5E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAE5F,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,EAClD,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAC/B,YAAY,GAAG,IAAI,CAyBrB"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
2
|
+
// SCHEMA VALIDATOR — Tier 1B (2026-05-24)
|
|
3
|
+
//
|
|
4
|
+
// Role: At save time, verify that a block's `content.unique{}` key-set matches
|
|
5
|
+
// the schema declared for its `type`. Catches type-vs-shape mismatches
|
|
6
|
+
// that the type discriminator (Pass 1/2) failed to prevent.
|
|
7
|
+
//
|
|
8
|
+
// Mode: SOFT — never rejects a save. On mismatch, flags the block with
|
|
9
|
+
// review_status="needs_review" and a structured review_reason. Charter
|
|
10
|
+
// rule 2 (never delete vetted blocks) + rule 6 (guards catch failure,
|
|
11
|
+
// never override success). The flag is recoverable; deletion is not.
|
|
12
|
+
//
|
|
13
|
+
// Source of truth: docs/reference/block-types.md (last verified 2026-05-24).
|
|
14
|
+
// When a type's schema changes there, update TYPE_UNIQUE_SCHEMA
|
|
15
|
+
// here too — the doc and code drift independently otherwise.
|
|
16
|
+
//
|
|
17
|
+
// Not validated by this module:
|
|
18
|
+
// - Whether the type name itself is in KNOWN_BLOCK_TYPES (pipeline already
|
|
19
|
+
// handles that elsewhere).
|
|
20
|
+
// - Whether the values inside unique{} are non-empty / semantically valid.
|
|
21
|
+
// That's Pass 2/Pass 3's job; this validator only checks key-set shape.
|
|
22
|
+
// - Novel types created by Pass 2 with their own schema{} — they're trusted.
|
|
23
|
+
// ═══════════════════════════════════════════════════════════════════════════════
|
|
24
|
+
/**
|
|
25
|
+
* Required and optional unique{} keys per block type.
|
|
26
|
+
*
|
|
27
|
+
* `required[]` — keys that MUST be present (non-empty) for the type to be valid.
|
|
28
|
+
* `optional[]` — keys that MAY appear. Anything outside required ∪ optional is
|
|
29
|
+
* an "extras" violation (probably wrong type for the content).
|
|
30
|
+
* Empty arrays in BOTH → freeform / no-schema type (project, process, note),
|
|
31
|
+
* always passes validation.
|
|
32
|
+
*/
|
|
33
|
+
export const TYPE_UNIQUE_SCHEMA = {
|
|
34
|
+
// Permanent core types
|
|
35
|
+
decision: { required: ["choice"], optional: ["reason", "alternatives_rejected"] },
|
|
36
|
+
dead_end: { required: ["approach", "reason"], optional: ["alternative"] },
|
|
37
|
+
constraint: { required: ["limit"], optional: ["reason", "source"] },
|
|
38
|
+
blueprint: { required: ["purpose"], optional: ["status", "trigger_to_implement"] },
|
|
39
|
+
preference: { required: ["lean"], optional: ["over", "condition"] },
|
|
40
|
+
// Chain — narrative summary. `conclusion` added 2026-05-18 (commit e0e41b8).
|
|
41
|
+
chain: { required: ["arc"], optional: ["conclusion"] },
|
|
42
|
+
// Project-scoped types
|
|
43
|
+
fact: { required: ["value"], optional: ["why_matters"] },
|
|
44
|
+
insight: { required: ["observation", "implication"], optional: [] },
|
|
45
|
+
// reasoning_chain collapsed → insight (2026-06-15): validator-identical; "derived-ness"
|
|
46
|
+
// lives in the derived_from relations + workspace_derive's content sub-object, not the type.
|
|
47
|
+
task: { required: ["status", "description"], optional: ["owner"] },
|
|
48
|
+
question: { required: ["question"], optional: ["why_matters"] },
|
|
49
|
+
hypothesis: { required: ["proposal"], optional: ["evidence_for", "evidence_against"] },
|
|
50
|
+
entity: { required: ["name"], optional: ["role"] },
|
|
51
|
+
artifact: { required: ["path"], optional: ["description"] },
|
|
52
|
+
// claim / metric collapsed → fact (2026-06-15): the system never branched on them (a
|
|
53
|
+
// fact + flavor); the distinguishing detail lives in fact.value/why_matters or a relation.
|
|
54
|
+
// KEPT: hypothesis (an unverified guess ≠ a verified fact = a real stance) and entity (the
|
|
55
|
+
// pipeline auto-creates entity blocks as label sub-group containers — a structural role).
|
|
56
|
+
// An event is a timestamped OCCURRENCE — something that happened. It is distinct
|
|
57
|
+
// from a `fact` (a standing truth) and a `task` (a not-yet-done). `what_happened`
|
|
58
|
+
// is the irreducible core (the occurrence itself); the TYPE label carries the
|
|
59
|
+
// happened-vs-true distinction, so the field schema stays thin. CAUSALITY lives in
|
|
60
|
+
// RELATIONS (the causal chain is the unit of meaning), never in a field — so
|
|
61
|
+
// `outcome` is optional and only for a trivial inline result (a significant
|
|
62
|
+
// consequence becomes its own chain node), and `date` is optional, only when the
|
|
63
|
+
// absolute time is itself the recall key. (2026-06-15: reconciled the prompt /
|
|
64
|
+
// validator / doc, which had drifted — the validator wrongly required `value`;
|
|
65
|
+
// `what_happened` is the honest field the extraction prompt already teaches.)
|
|
66
|
+
event: { required: ["what_happened"], optional: ["outcome", "date"] },
|
|
67
|
+
// Freeform / no-schema — always pass
|
|
68
|
+
project: { required: [], optional: [] },
|
|
69
|
+
process: { required: [], optional: [] },
|
|
70
|
+
note: { required: [], optional: [] },
|
|
71
|
+
draft: { required: [], optional: [] },
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Check if `unique{}` matches the type's declared schema.
|
|
75
|
+
*
|
|
76
|
+
* Returns `{ ok: true }` if:
|
|
77
|
+
* - the type has no declared schema (novel/freeform), OR
|
|
78
|
+
* - all required keys are present (non-empty) AND no unexpected keys are present.
|
|
79
|
+
*
|
|
80
|
+
* Returns `{ ok: false, missing, extras, detail }` otherwise.
|
|
81
|
+
*
|
|
82
|
+
* "Present" means: the key exists AND its value is not null/undefined/empty-string.
|
|
83
|
+
* Whitespace-only strings are treated as empty.
|
|
84
|
+
*/
|
|
85
|
+
export function validateUniqueSchema(type, unique) {
|
|
86
|
+
if (!type)
|
|
87
|
+
return { ok: true }; // can't validate without a type label
|
|
88
|
+
const schema = TYPE_UNIQUE_SCHEMA[type];
|
|
89
|
+
if (!schema)
|
|
90
|
+
return { ok: true }; // novel/unknown type — Pass 2 trusted for these
|
|
91
|
+
// Freeform: both arrays empty → always pass.
|
|
92
|
+
if (schema.required.length === 0 && schema.optional.length === 0)
|
|
93
|
+
return { ok: true };
|
|
94
|
+
const u = unique || {};
|
|
95
|
+
const present = new Set();
|
|
96
|
+
for (const [k, v] of Object.entries(u)) {
|
|
97
|
+
if (v === null || v === undefined)
|
|
98
|
+
continue;
|
|
99
|
+
if (typeof v === "string" && v.trim() === "")
|
|
100
|
+
continue;
|
|
101
|
+
present.add(k);
|
|
102
|
+
}
|
|
103
|
+
const missing = schema.required.filter((k) => !present.has(k));
|
|
104
|
+
const allowed = new Set([...schema.required, ...schema.optional]);
|
|
105
|
+
const extras = [...present].filter((k) => !allowed.has(k));
|
|
106
|
+
if (missing.length === 0 && extras.length === 0)
|
|
107
|
+
return { ok: true };
|
|
108
|
+
const parts = [];
|
|
109
|
+
if (missing.length > 0)
|
|
110
|
+
parts.push(`missing=[${missing.join(",")}]`);
|
|
111
|
+
if (extras.length > 0)
|
|
112
|
+
parts.push(`extras=[${extras.join(",")}]`);
|
|
113
|
+
const detail = `type=${type} ${parts.join(" ")}`;
|
|
114
|
+
return { ok: false, missing, extras, detail };
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Compose a review_reason string for a schema mismatch, prefixed so downstream
|
|
118
|
+
* consumers (UI, audits) can recognize the source.
|
|
119
|
+
*/
|
|
120
|
+
export function schemaMismatchReason(check) {
|
|
121
|
+
if (check.ok)
|
|
122
|
+
return null;
|
|
123
|
+
return `schema_mismatch: ${check.detail}`;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* DEMOTE_TARGETS — type re-targeting map for the demote-edge (2026-05-27, debt-3
|
|
127
|
+
* structural-small; relocated here 2026-06-12 so seam-α and the save-time demote
|
|
128
|
+
* share ONE source of truth — pass2-seams re-exports it).
|
|
129
|
+
*
|
|
130
|
+
* Each row encodes a UNIVERSAL meaning-equivalence (per docs/reference/block-types.md
|
|
131
|
+
* definitions), NEVER a domain-specific heuristic. The gate for adding a row:
|
|
132
|
+
*
|
|
133
|
+
* "If type X's required field is genuinely unfillable AND the equivalent content
|
|
134
|
+
* is fillable as type Y, then 'X without that field' IS Y, by Y's definition."
|
|
135
|
+
*
|
|
136
|
+
* Current rows:
|
|
137
|
+
* - insight → fact: an insight is `observation + implication`; a fact is
|
|
138
|
+
* `value + why_matters?`. An insight whose implication is unfillable while
|
|
139
|
+
* observation is present IS, by definition, a fact whose value is that
|
|
140
|
+
* observation. The demote encodes this; it does not invent it.
|
|
141
|
+
*/
|
|
142
|
+
export const DEMOTE_TARGETS = {
|
|
143
|
+
insight: { to: "fact", field_map: { observation: "value" } },
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Tier 1B demote-at-save (2026-06-12). The v1 path applies DEMOTE_TARGETS at
|
|
147
|
+
* seam-α (before naming); the v2 TRANSFORM path enters at Pass 3 and SKIPS that
|
|
148
|
+
* seam — so schema-clean-but-demotable blocks were arriving at save flagged
|
|
149
|
+
* (`schema_mismatch: missing=[implication]`) instead of demoted (6/6 of the
|
|
150
|
+
* 2026-06-12 audit's flags). This applies the SAME equivalence at the final seam.
|
|
151
|
+
*
|
|
152
|
+
* CONSERVATIVE by contract — demotes ONLY the exact case:
|
|
153
|
+
* - the type has a DEMOTE_TARGETS row, AND
|
|
154
|
+
* - the ONLY schema problem is that every missing key is a mapped source key
|
|
155
|
+
* whose target content is present (no extras, nothing else missing), AND
|
|
156
|
+
* - the label's type segment can be renamed so label and type stay in
|
|
157
|
+
* agreement (a half-demote that leaves `_insight_` in the label would break
|
|
158
|
+
* findability — then we keep the flag instead).
|
|
159
|
+
* Anything outside that → return null → the existing soft-flag path applies
|
|
160
|
+
* (capture-first: a wrong flag is recoverable; a wrong rewrite is not).
|
|
161
|
+
*/
|
|
162
|
+
export function demoteForSave(type, unique, label) {
|
|
163
|
+
if (!type || !label)
|
|
164
|
+
return null;
|
|
165
|
+
const row = DEMOTE_TARGETS[type];
|
|
166
|
+
if (!row)
|
|
167
|
+
return null;
|
|
168
|
+
const check = validateUniqueSchema(type, unique);
|
|
169
|
+
if (check.ok)
|
|
170
|
+
return null; // nothing to repair
|
|
171
|
+
if (check.extras.length > 0)
|
|
172
|
+
return null; // shape doesn't cleanly fit either type
|
|
173
|
+
const mappedSources = new Set(Object.keys(row.field_map)); // e.g. {observation}
|
|
174
|
+
const u = unique || {};
|
|
175
|
+
// every missing key must be a non-source required key (i.e. the unfillable one),
|
|
176
|
+
// and every mapped source must be present with real content
|
|
177
|
+
for (const m of check.missing) {
|
|
178
|
+
if (mappedSources.has(m))
|
|
179
|
+
return null; // the SOURCE itself is missing → worse failure, keep flag
|
|
180
|
+
}
|
|
181
|
+
const newUnique = {};
|
|
182
|
+
for (const [src, dst] of Object.entries(row.field_map)) {
|
|
183
|
+
const v = u[src];
|
|
184
|
+
if (typeof v !== "string" || v.trim() === "")
|
|
185
|
+
return null;
|
|
186
|
+
newUnique[dst] = v;
|
|
187
|
+
}
|
|
188
|
+
// the demoted shape must actually validate as the target type
|
|
189
|
+
if (!validateUniqueSchema(row.to, newUnique).ok)
|
|
190
|
+
return null;
|
|
191
|
+
const newLabel = label.replace(`_${type}_`, `_${row.to}_`);
|
|
192
|
+
if (newLabel === label)
|
|
193
|
+
return null; // type segment not found → don't half-demote
|
|
194
|
+
return { type: row.to, unique: newUnique, label: newLabel, from_type: type };
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=schema-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.js","sourceRoot":"","sources":["../../../src/middleware/reflect/schema-validator.ts"],"names":[],"mappings":"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"}
|