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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/providers/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EmbeddingProvider } from "../ai-provider.js";
|
|
2
|
+
export declare class LocalEmbeddingProvider implements EmbeddingProvider {
|
|
3
|
+
private readonly model;
|
|
4
|
+
private extractorP;
|
|
5
|
+
constructor(model?: string);
|
|
6
|
+
/** Lazy-load the pipeline once (dynamic import so the dep is only pulled when this
|
|
7
|
+
* provider is actually selected). The first call downloads + caches the model. */
|
|
8
|
+
private getExtractor;
|
|
9
|
+
embed(text: string): Promise<number[] | null>;
|
|
10
|
+
isAvailable(): boolean;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=local.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/engine/providers/local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAY3D,qBAAa,sBAAuB,YAAW,iBAAiB;IAC9D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,UAAU,CAA6B;gBAEnC,KAAK,CAAC,EAAE,MAAM;IAI1B;uFACmF;IACnF,OAAO,CAAC,YAAY;IAcd,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAWnD,WAAW,IAAI,OAAO;CACvB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
// ─── Local, free, offline embeddings (transformers.js / ONNX) ─────────────────
|
|
2
|
+
// Runs an embedding model IN-PROCESS — no API, no quota, no network after the
|
|
3
|
+
// one-time model download (cached). The local-first default: works on any
|
|
4
|
+
// machine (CPU is plenty for embedding models; a GPU is optional/overkill).
|
|
5
|
+
//
|
|
6
|
+
// Enable with EMBEDDING_PROVIDER=local. Model via NODEDEX_LOCAL_EMBED_MODEL
|
|
7
|
+
// (default bge-small-en-v1.5 — 384-dim, fast, strong on technical text).
|
|
8
|
+
//
|
|
9
|
+
// NOTE: vectors are model-specific (dim + space). Switching to/from this provider
|
|
10
|
+
// requires re-embedding existing blocks (POST /api/admin/reembed-all).
|
|
11
|
+
export class LocalEmbeddingProvider {
|
|
12
|
+
model;
|
|
13
|
+
extractorP = null;
|
|
14
|
+
constructor(model) {
|
|
15
|
+
this.model = model ?? process.env.NODEDEX_LOCAL_EMBED_MODEL ?? "Xenova/bge-small-en-v1.5";
|
|
16
|
+
}
|
|
17
|
+
/** Lazy-load the pipeline once (dynamic import so the dep is only pulled when this
|
|
18
|
+
* provider is actually selected). The first call downloads + caches the model. */
|
|
19
|
+
getExtractor() {
|
|
20
|
+
if (!this.extractorP) {
|
|
21
|
+
this.extractorP = (async () => {
|
|
22
|
+
const tf = await import("@huggingface/transformers");
|
|
23
|
+
if (tf.env)
|
|
24
|
+
tf.env.allowRemoteModels = true; // download once, then served from cache
|
|
25
|
+
console.log(`[local-embed] loading model ${this.model} (one-time download on first run)…`);
|
|
26
|
+
const extractor = await tf.pipeline("feature-extraction", this.model);
|
|
27
|
+
console.log(`[local-embed] model ready: ${this.model}`);
|
|
28
|
+
return extractor;
|
|
29
|
+
})();
|
|
30
|
+
}
|
|
31
|
+
return this.extractorP;
|
|
32
|
+
}
|
|
33
|
+
async embed(text) {
|
|
34
|
+
try {
|
|
35
|
+
const extractor = await this.getExtractor();
|
|
36
|
+
const out = await extractor(text, { pooling: "mean", normalize: true });
|
|
37
|
+
return Array.from(out.data);
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
console.error("[local-embed] embed failed:", String(e?.message ?? e).slice(0, 200));
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
isAvailable() { return true; }
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=local.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.js","sourceRoot":"","sources":["../../../src/engine/providers/local.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,8EAA8E;AAC9E,0EAA0E;AAC1E,4EAA4E;AAC5E,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,EAAE;AACF,kFAAkF;AAClF,uEAAuE;AACvE,MAAM,OAAO,sBAAsB;IAChB,KAAK,CAAS;IACvB,UAAU,GAAwB,IAAI,CAAC;IAE/C,YAAY,KAAc;QACxB,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,0BAA0B,CAAC;IAC5F,CAAC;IAED;uFACmF;IAC3E,YAAY;QAClB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC5B,MAAM,EAAE,GAAQ,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;gBAC1D,IAAI,EAAE,CAAC,GAAG;oBAAE,EAAE,CAAC,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC,wCAAwC;gBACrF,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,CAAC,KAAK,oCAAoC,CAAC,CAAC;gBAC3F,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,oBAAoB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBACxD,OAAO,SAAS,CAAC;YACnB,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAA+B,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,MAAM,CAAE,CAAS,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YAC7F,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,WAAW,KAAc,OAAO,IAAI,CAAC,CAAC,CAAC;CACxC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare const KNOWN_CAPS: Record<string, number>;
|
|
2
|
+
declare const DEFAULT_CEILING = 16384;
|
|
3
|
+
/** Hard output-token ceiling for `model`. Override → known map → conservative default. */
|
|
4
|
+
export declare function modelOutputCeiling(model: string | undefined): number;
|
|
5
|
+
export { KNOWN_CAPS, DEFAULT_CEILING };
|
|
6
|
+
//# sourceMappingURL=model-caps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-caps.d.ts","sourceRoot":"","sources":["../../../src/engine/providers/model-caps.ts"],"names":[],"mappings":"AAiBA,QAAA,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAWtC,CAAC;AAIF,QAAA,MAAM,eAAe,QAAQ,CAAC;AAS9B,0FAA0F;AAC1F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAIpE;AAED,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// model-caps.ts — per-model hard OUTPUT-token ceiling.
|
|
2
|
+
//
|
|
3
|
+
// WHY: the provider request is `maxOutputTokens + thinkingBudget`, and that SUM must
|
|
4
|
+
// stay under the MODEL's hard output limit or the provider returns a broken/empty
|
|
5
|
+
// response that masquerades as a truncation but can't be recovered (2026-06-16 Pass 3
|
|
6
|
+
// glitch). A single hardcoded ceiling broke model-portability — e.g. Pass 3 (32768)
|
|
7
|
+
// over-requests on GPT-4o (16384). So the ceiling is PER MODEL.
|
|
8
|
+
//
|
|
9
|
+
// Source of truth, in order:
|
|
10
|
+
// 1. NODEDEX_MODEL_CAPS override — JSON map the web-UI model picker populates from the
|
|
11
|
+
// provider's live /models data (OpenRouter exposes top_provider.max_completion_tokens).
|
|
12
|
+
// 2. KNOWN_CAPS — the configured/common models, so the pipeline is correct with no
|
|
13
|
+
// network dependency in the hot path.
|
|
14
|
+
// 3. DEFAULT_CEILING — conservative fallback for a genuinely unknown model.
|
|
15
|
+
// Verified against OpenRouter /models (2026-06-16). Keyed by both prefixed id and bare
|
|
16
|
+
// AI_MODEL form (AI_MODEL may or may not carry the vendor prefix).
|
|
17
|
+
const KNOWN_CAPS = {
|
|
18
|
+
"google/gemini-2.5-flash": 65535,
|
|
19
|
+
"google/gemini-2.5-pro": 65535,
|
|
20
|
+
"gemini-2.5-flash": 65535,
|
|
21
|
+
"gemini-2.5-pro": 65535,
|
|
22
|
+
"openai/gpt-4o": 16384,
|
|
23
|
+
"openai/gpt-4o-mini": 16384,
|
|
24
|
+
"gpt-4o": 16384,
|
|
25
|
+
"gpt-4o-mini": 16384,
|
|
26
|
+
"anthropic/claude-3.5-sonnet": 8192,
|
|
27
|
+
"anthropic/claude-3.7-sonnet": 64000,
|
|
28
|
+
};
|
|
29
|
+
// Most pipeline-capable models allow at least this; low enough to avoid an over-request
|
|
30
|
+
// glitch on a smaller unknown model (the truncation bump then earns its room up to here).
|
|
31
|
+
const DEFAULT_CEILING = 16384;
|
|
32
|
+
function overrides() {
|
|
33
|
+
try {
|
|
34
|
+
const o = JSON.parse(process.env.NODEDEX_MODEL_CAPS ?? "{}");
|
|
35
|
+
return o && typeof o === "object" ? o : {};
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return {};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Hard output-token ceiling for `model`. Override → known map → conservative default. */
|
|
42
|
+
export function modelOutputCeiling(model) {
|
|
43
|
+
if (!model)
|
|
44
|
+
return DEFAULT_CEILING;
|
|
45
|
+
const cap = overrides()[model] ?? KNOWN_CAPS[model];
|
|
46
|
+
return typeof cap === "number" && cap > 0 ? cap : DEFAULT_CEILING;
|
|
47
|
+
}
|
|
48
|
+
export { KNOWN_CAPS, DEFAULT_CEILING };
|
|
49
|
+
//# sourceMappingURL=model-caps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-caps.js","sourceRoot":"","sources":["../../../src/engine/providers/model-caps.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,EAAE;AACF,qFAAqF;AACrF,kFAAkF;AAClF,sFAAsF;AACtF,oFAAoF;AACpF,gEAAgE;AAChE,EAAE;AACF,6BAA6B;AAC7B,yFAAyF;AACzF,6FAA6F;AAC7F,qFAAqF;AACrF,2CAA2C;AAC3C,8EAA8E;AAE9E,uFAAuF;AACvF,mEAAmE;AACnE,MAAM,UAAU,GAA2B;IACzC,yBAAyB,EAAE,KAAK;IAChC,uBAAuB,EAAI,KAAK;IAChC,kBAAkB,EAAS,KAAK;IAChC,gBAAgB,EAAW,KAAK;IAChC,eAAe,EAAY,KAAK;IAChC,oBAAoB,EAAO,KAAK;IAChC,QAAQ,EAAmB,KAAK;IAChC,aAAa,EAAc,KAAK;IAChC,6BAA6B,EAAE,IAAI;IACnC,6BAA6B,EAAE,KAAK;CACrC,CAAC;AAEF,wFAAwF;AACxF,0FAA0F;AAC1F,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B,SAAS,SAAS;IAChB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,IAAI,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACxB,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,kBAAkB,CAAC,KAAyB;IAC1D,IAAI,CAAC,KAAK;QAAE,OAAO,eAAe,CAAC;IACnC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACpD,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC;AACpE,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { LLMProvider, EmbeddingProvider, GenerateResult } from "../ai-provider.js";
|
|
2
|
+
export { EmptyResponseError, classifyGenError } from "./failure-policy.js";
|
|
3
|
+
export type SoMechanism = "response_format" | "tool_use" | "prompt_json";
|
|
4
|
+
export declare function primaryMechanism(model: string): SoMechanism;
|
|
5
|
+
/** Strip ```json ... ``` fences + surrounding whitespace (prompt-JSON models often
|
|
6
|
+
* wrap output in markdown despite instructions). */
|
|
7
|
+
export declare function stripJsonFences(s: string): string;
|
|
8
|
+
export declare class OpenAIProvider implements LLMProvider {
|
|
9
|
+
private client;
|
|
10
|
+
constructor(apiKey: string, baseURL?: string);
|
|
11
|
+
private get model();
|
|
12
|
+
private get fallbackModel();
|
|
13
|
+
isAvailable(): boolean;
|
|
14
|
+
getName(): string;
|
|
15
|
+
generateStructured<T>(systemPrompt: string, userInput: string, schema: object, options?: {
|
|
16
|
+
thinkingBudget?: number;
|
|
17
|
+
maxOutputTokens?: number;
|
|
18
|
+
modelOverride?: string;
|
|
19
|
+
}): Promise<GenerateResult<T>>;
|
|
20
|
+
generate(prompt: string): Promise<string | null>;
|
|
21
|
+
ping(): Promise<boolean>;
|
|
22
|
+
}
|
|
23
|
+
export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
|
|
24
|
+
private client;
|
|
25
|
+
private readonly embModel;
|
|
26
|
+
constructor(apiKey: string, baseURL?: string);
|
|
27
|
+
isAvailable(): boolean;
|
|
28
|
+
embed(text: string): Promise<number[] | null>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/engine/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAIxF,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAU3E,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,UAAU,GAAG,aAAa,CAAC;AAEzE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAI3D;AAED;qDACqD;AACrD,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,qBAAa,cAAe,YAAW,WAAW;IAChD,OAAO,CAAC,MAAM,CAAgB;gBAElB,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAW5C,OAAO,KAAK,KAAK,GAAuD;IACxE,OAAO,KAAK,aAAa,GAGxB;IAED,WAAW,IAAI,OAAO;IACtB,OAAO,IAAI,MAAM;IAEX,kBAAkB,CAAC,CAAC,EACxB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GACtF,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IA4OvB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAahD,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC;CAG/B;AAED,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmE;gBAEhF,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAM5C,WAAW,IAAI,OAAO;IAEhB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC;CASpD"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import OpenAI from "openai";
|
|
2
|
+
import { EmptyResponseError, classifyGenError, isEmptyResult, llmTimeoutMs, decideEmptyOrTimeoutAction, isInsufficientCreditError } from "./failure-policy.js";
|
|
3
|
+
import { modelOutputCeiling } from "./model-caps.js";
|
|
4
|
+
// Re-exported for back-compat (callers/tests that imported these from openai.js):
|
|
5
|
+
export { EmptyResponseError, classifyGenError } from "./failure-policy.js";
|
|
6
|
+
export function primaryMechanism(model) {
|
|
7
|
+
const m = (model ?? "").toLowerCase();
|
|
8
|
+
// Anthropic models reject response_format → use their native tool-use.
|
|
9
|
+
return (m.startsWith("anthropic/") || m.includes("claude")) ? "tool_use" : "response_format";
|
|
10
|
+
}
|
|
11
|
+
/** Strip ```json ... ``` fences + surrounding whitespace (prompt-JSON models often
|
|
12
|
+
* wrap output in markdown despite instructions). */
|
|
13
|
+
export function stripJsonFences(s) {
|
|
14
|
+
return (s ?? "").trim().replace(/^```(?:json)?\s*/i, "").replace(/```$/i, "").trim();
|
|
15
|
+
}
|
|
16
|
+
export class OpenAIProvider {
|
|
17
|
+
client;
|
|
18
|
+
constructor(apiKey, baseURL) {
|
|
19
|
+
this.client = apiKey
|
|
20
|
+
? new OpenAI({ apiKey, ...(baseURL ? { baseURL } : {}) })
|
|
21
|
+
: null;
|
|
22
|
+
}
|
|
23
|
+
// Default + fallback model resolved LIVE from env (NOT cached at construction) so a
|
|
24
|
+
// web-UI / config-endpoint model change takes effect on the NEXT call without a
|
|
25
|
+
// restart. The CLIENT (apiKey/baseURL) stays construction-cached, so key/base-url
|
|
26
|
+
// changes still require resetProviders() (they're in the config endpoint's reset
|
|
27
|
+
// list); only the model is live. A per-call modelOverride still wins (modelsToTry).
|
|
28
|
+
get model() { return process.env.AI_MODEL ?? "gpt-4o"; }
|
|
29
|
+
get fallbackModel() {
|
|
30
|
+
const fb = process.env.NODEDEX_FALLBACK_MODEL ?? "";
|
|
31
|
+
return fb && fb !== this.model ? fb : null;
|
|
32
|
+
}
|
|
33
|
+
isAvailable() { return this.client !== null; }
|
|
34
|
+
getName() { return process.env.OPENAI_BASE_URL ? "openai-compatible" : "openai"; }
|
|
35
|
+
async generateStructured(systemPrompt, userInput, schema, options) {
|
|
36
|
+
if (!this.client)
|
|
37
|
+
return { result: null, rateLimited: false };
|
|
38
|
+
const modelsToTry = options?.modelOverride
|
|
39
|
+
? [options.modelOverride]
|
|
40
|
+
: this.fallbackModel ? [this.model, this.fallbackModel] : [this.model];
|
|
41
|
+
const client = this.client; // narrowed non-null (guarded above) — safe inside closures
|
|
42
|
+
// Extraction is deterministic by nature → default temperature 0. This is the main lever
|
|
43
|
+
// on run-to-run variance: 6 stochastic passes compound and the swing lands on borderline
|
|
44
|
+
// items. Configurable via NODEDEX_REFLECT_TEMPERATURE; the call auto-drops temperature if
|
|
45
|
+
// a model rejects it (some reasoning models require 1). 0 is the most-deterministic value
|
|
46
|
+
// on every provider — ranges/defaults otherwise differ across providers.
|
|
47
|
+
const tEnv = process.env.NODEDEX_REFLECT_TEMPERATURE;
|
|
48
|
+
const temperature = tEnv !== undefined && tEnv !== "" && Number.isFinite(Number(tEnv)) ? Number(tEnv) : 0;
|
|
49
|
+
// Failure-mode policy (2026-05-23):
|
|
50
|
+
// - JSON truncation → SAME-MODEL retry with max_tokens × 1.5 (capped). If it
|
|
51
|
+
// still truncates, fail loudly. Truncation is a budget problem, not a model-
|
|
52
|
+
// capacity problem — silently swapping to a different model with different
|
|
53
|
+
// classification semantics is a non-determinism trap (we proved this: same
|
|
54
|
+
// input, two graphs depending on whether the primary truncated). The pipeline-
|
|
55
|
+
// level retry / re-queue handles persistent failure.
|
|
56
|
+
// - 429 rate-limit → escalate to fallback model. Different problem (capacity);
|
|
57
|
+
// a different model is the right answer.
|
|
58
|
+
// - Other errors → fail without escalation.
|
|
59
|
+
const attempts = [];
|
|
60
|
+
const thinkBudget = options?.thinkingBudget;
|
|
61
|
+
const requestedMaxOut = options?.maxOutputTokens ?? 16384;
|
|
62
|
+
// The provider request is maxOut + thinkBudget — OUTPUT and REASONING share the
|
|
63
|
+
// model's output budget, so that SUM must never exceed the model's hard output
|
|
64
|
+
// ceiling. Over-requesting returns a broken, empty response (completion_tokens=0,
|
|
65
|
+
// finish=null) that masquerades as a truncation but can't be recovered. The ceiling
|
|
66
|
+
// is PER-MODEL (modelOutputCeiling) — a single constant broke portability: Pass 3's
|
|
67
|
+
// 32768 over-requests on GPT-4o's 16384 cap. So baseMaxOut + the 1.5× truncation-bump
|
|
68
|
+
// are clamped to (ceiling − thinking) INSIDE the model loop, recomputed when an
|
|
69
|
+
// escalation switches models, and the bump stays EFFECTIVE whenever a pass leaves
|
|
70
|
+
// headroom below the ceiling.
|
|
71
|
+
// 2026-06-16: Pass 3 was set to Gemini's 65536 ceiling and +thinking pushed every
|
|
72
|
+
// call over it → a glitch silently dropped a whole arc's write. Caught by the
|
|
73
|
+
// deep-stress long-arc run; the old bump min(base*1.5, 65536) was a no-op at ceiling.
|
|
74
|
+
// Shared call-timeout bound (NODEDEX_LLM_TIMEOUT_MS, 180s default) — bounds the
|
|
75
|
+
// ~200s hangs that precede empty responses (Run 12). Native SDK timeout aborts the
|
|
76
|
+
// request; a timed-out call escalates to the fallback model. <=0 disables it.
|
|
77
|
+
const callTimeoutMs = llmTimeoutMs();
|
|
78
|
+
for (let i = 0; i < modelsToTry.length; i++) {
|
|
79
|
+
const modelName = modelsToTry[i];
|
|
80
|
+
const isFallback = i > 0;
|
|
81
|
+
// Per-model output ceiling — an escalation may switch models with very different
|
|
82
|
+
// caps (Gemini 2.5 Flash 65535 vs GPT-4o 16384), so recompute for THIS model.
|
|
83
|
+
const outBudgetCeiling = modelOutputCeiling(modelName) - (thinkBudget ?? 0);
|
|
84
|
+
const baseMaxOut = Math.min(requestedMaxOut, outBudgetCeiling);
|
|
85
|
+
const bumpedMaxOut = Math.min(Math.round(baseMaxOut * 1.5), outBudgetCeiling);
|
|
86
|
+
let truncBumped = false;
|
|
87
|
+
let emptyRetried = false;
|
|
88
|
+
// Structured-output mechanism for this model: native by provider, switched
|
|
89
|
+
// to the universal prompt-JSON floor on a hard provider error (below).
|
|
90
|
+
let mechanism = primaryMechanism(modelName);
|
|
91
|
+
// Inner loop: original + one truncation bump + (on hard error) a one-time
|
|
92
|
+
// prompt-JSON fallback retry.
|
|
93
|
+
while (true) {
|
|
94
|
+
const maxOut = truncBumped ? bumpedMaxOut : baseMaxOut;
|
|
95
|
+
const sysContent = mechanism === "prompt_json"
|
|
96
|
+
? `${systemPrompt}\n\nReturn ONLY a valid JSON object matching this schema (no markdown fences, no prose):\n${JSON.stringify(schema)}`
|
|
97
|
+
: systemPrompt;
|
|
98
|
+
const callWith = (useTemp) => client.chat.completions.create({
|
|
99
|
+
model: modelName,
|
|
100
|
+
messages: [
|
|
101
|
+
{ role: "system", content: sysContent },
|
|
102
|
+
{ role: "user", content: userInput },
|
|
103
|
+
],
|
|
104
|
+
// Mechanism-specific structured-output enforcement (prompt_json sends neither):
|
|
105
|
+
...(mechanism === "response_format"
|
|
106
|
+
? { response_format: { type: "json_schema", json_schema: { name: "response", strict: false, schema } } }
|
|
107
|
+
: {}),
|
|
108
|
+
...(mechanism === "tool_use"
|
|
109
|
+
? { tools: [{ type: "function", function: { name: "structured_result", description: "Return the result as arguments matching the schema.", parameters: schema } }],
|
|
110
|
+
tool_choice: { type: "function", function: { name: "structured_result" } } }
|
|
111
|
+
: {}),
|
|
112
|
+
max_tokens: maxOut + (thinkBudget ?? 0),
|
|
113
|
+
...(thinkBudget ? { reasoning: { max_tokens: thinkBudget } } : {}),
|
|
114
|
+
...(useTemp && Number.isFinite(temperature) ? { temperature } : {}),
|
|
115
|
+
}, callTimeoutMs > 0 ? { timeout: callTimeoutMs } : undefined);
|
|
116
|
+
try {
|
|
117
|
+
let completion;
|
|
118
|
+
try {
|
|
119
|
+
completion = await callWith(true);
|
|
120
|
+
}
|
|
121
|
+
catch (te) {
|
|
122
|
+
// Some reasoning models forbid a non-default temperature — drop it and retry once.
|
|
123
|
+
if (Number.isFinite(temperature) && /temperat/i.test(String(te?.message ?? ""))) {
|
|
124
|
+
console.warn(`[openai] ${modelName} rejected temperature=${temperature} — retrying without it`);
|
|
125
|
+
completion = await callWith(false);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
throw te;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Extract the JSON text per mechanism: tool-use returns it as the tool
|
|
132
|
+
// call's arguments; response_format/prompt_json return it as content
|
|
133
|
+
// (prompt_json may wrap it in markdown fences → strip them).
|
|
134
|
+
const _msg = completion.choices[0].message;
|
|
135
|
+
let text = mechanism === "tool_use"
|
|
136
|
+
? (_msg.tool_calls?.[0]?.function?.arguments ?? "")
|
|
137
|
+
: (_msg.content ?? "");
|
|
138
|
+
if (mechanism === "prompt_json")
|
|
139
|
+
text = stripJsonFences(text);
|
|
140
|
+
text = text.trim();
|
|
141
|
+
const usage = completion.usage;
|
|
142
|
+
const thinkingTokens = usage?.completion_tokens_details?.reasoning_tokens ?? 0;
|
|
143
|
+
// OpenAI/OpenRouter `completion_tokens` is INCLUSIVE of reasoning_tokens.
|
|
144
|
+
// Split it so output + thinking sums back to completion_tokens exactly —
|
|
145
|
+
// otherwise the reasoning portion is billed twice in computeCost (once
|
|
146
|
+
// inside output, once as thinking). (Telemetry over-count fix 2026-05-25,
|
|
147
|
+
// caught by the §7 dashboard reconciliation: telemetry ~1.5x the bill.)
|
|
148
|
+
const completionTokens = usage?.completion_tokens ?? 0;
|
|
149
|
+
const outputTokens = Math.max(0, completionTokens - thinkingTokens);
|
|
150
|
+
// EMPTY/HUNG-response guard (BEFORE JSON.parse): the model returned no
|
|
151
|
+
// content at all. JSON.parse("") would throw a SyntaxError the catch
|
|
152
|
+
// can't tell apart from a genuine mid-structure truncation, so detect
|
|
153
|
+
// it here and raise a DISTINCT error — the catch treats empty as a
|
|
154
|
+
// transient hang (retry/escalate), not as truncation (same-model bump).
|
|
155
|
+
// See EmptyResponseError + classifyGenError in ./failure-policy.
|
|
156
|
+
if (isEmptyResult(text)) {
|
|
157
|
+
if (process.env.NODEDEX_DEBUG_TRUNCATION === "1") {
|
|
158
|
+
const fin = completion.choices?.[0]?.finish_reason;
|
|
159
|
+
console.warn(`[trunc-debug] ${modelName} EMPTY: completion_tokens=${completionTokens}, reasoning=${thinkingTokens}, finish=${fin}`);
|
|
160
|
+
}
|
|
161
|
+
throw new EmptyResponseError(modelName);
|
|
162
|
+
}
|
|
163
|
+
// Parse BEFORE pushing the ok attempt — a truncation-induced SyntaxError must
|
|
164
|
+
// not be preceded by a phantom "ok" in the attempts trail.
|
|
165
|
+
// DIAGNOSTIC (NODEDEX_DEBUG_TRUNCATION=1): on a parse failure, dump the
|
|
166
|
+
// token split + the tail of the unparseable text so a runaway's repetition
|
|
167
|
+
// pattern is visible (which array/field looped). Off by default.
|
|
168
|
+
let result;
|
|
169
|
+
try {
|
|
170
|
+
result = JSON.parse(text);
|
|
171
|
+
}
|
|
172
|
+
catch (pe) {
|
|
173
|
+
if (process.env.NODEDEX_DEBUG_TRUNCATION === "1") {
|
|
174
|
+
const fin = completion.choices?.[0]?.finish_reason;
|
|
175
|
+
console.warn(`[trunc-debug] ${modelName} PARSE-FAIL: text=${text.length} chars, finish=${fin}, ` +
|
|
176
|
+
`completion_tokens=${completionTokens}, reasoning=${thinkingTokens}, output=${outputTokens}\n` +
|
|
177
|
+
`[trunc-debug] TAIL:\n${text.slice(-900)}`);
|
|
178
|
+
}
|
|
179
|
+
throw pe;
|
|
180
|
+
}
|
|
181
|
+
if (isFallback)
|
|
182
|
+
console.log(`[openai] escalated to fallback model ${modelName}`);
|
|
183
|
+
if (truncBumped)
|
|
184
|
+
console.log(`[openai] ${modelName} succeeded after truncation bump (max_tokens ${baseMaxOut} → ${bumpedMaxOut})`);
|
|
185
|
+
if (thinkBudget)
|
|
186
|
+
console.log(`[openai] thinking: requested=${thinkBudget} actual=${thinkingTokens}`);
|
|
187
|
+
attempts.push({ model: modelName, outcome: "ok" });
|
|
188
|
+
// Actual billed cost from OpenRouter (usage.cost), when present — the
|
|
189
|
+
// real number, preferred over the static-table estimate downstream.
|
|
190
|
+
const actualCost = typeof usage?.cost === "number" ? usage.cost : undefined;
|
|
191
|
+
return {
|
|
192
|
+
result,
|
|
193
|
+
rateLimited: false,
|
|
194
|
+
usage: { input: usage?.prompt_tokens ?? 0, thinking: thinkingTokens, output: outputTokens, costUsd: actualCost },
|
|
195
|
+
model: modelName,
|
|
196
|
+
attempts,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
// Out-of-credit (402) — surface it DEFINITIVELY rather than wasting the
|
|
201
|
+
// prompt-JSON mechanism retry + escalation (every model on an unfunded account
|
|
202
|
+
// 402s identically) and then swallowing it into a generic null the reflect queue
|
|
203
|
+
// can't tell from a real comprehend failure (→ retried 3x then DROPPED the turn).
|
|
204
|
+
// creditExhausted lets the queue pause-the-spend + requeue instead of dropping.
|
|
205
|
+
if (isInsufficientCreditError(e)) {
|
|
206
|
+
attempts.push({ model: modelName, outcome: "error" });
|
|
207
|
+
console.error(`[openai] ${modelName} insufficient credit (status=${e?.status ?? "?"}) — credit exhausted; not retrying/escalating (account unfunded)`);
|
|
208
|
+
return { result: null, rateLimited: false, creditExhausted: true, model: modelName, attempts };
|
|
209
|
+
}
|
|
210
|
+
const kind = classifyGenError(e);
|
|
211
|
+
const rateLimited = kind === "rate_limited";
|
|
212
|
+
// EMPTY or TIMEOUT — neither is truncation (no partial output → never a
|
|
213
|
+
// max_tokens bump, and switching models is SAFE: no determinism trap). Shared
|
|
214
|
+
// policy (./failure-policy decideEmptyOrTimeoutAction): escalate to a fallback
|
|
215
|
+
// model FIRST when one exists (a different model is the likeliest recovery for
|
|
216
|
+
// an input-specific empty, and skips the slow same-model draw); only a single-
|
|
217
|
+
// key setup with no fallback retries the SAME model once (its one recovery).
|
|
218
|
+
if (kind === "empty" || kind === "timeout") {
|
|
219
|
+
const action = decideEmptyOrTimeoutAction({ kind, hasNextModel: i + 1 < modelsToTry.length, emptyRetried });
|
|
220
|
+
attempts.push({ model: modelName, outcome: kind === "timeout" ? "timeout" : "empty" });
|
|
221
|
+
if (action === "escalate") {
|
|
222
|
+
console.warn(`[openai] ${modelName} ${kind === "timeout" ? "timed out" : "returned EMPTY/hung response"} — escalating to fallback ${modelsToTry[i + 1]}`);
|
|
223
|
+
break; // exit inner while; outer for tries the next model
|
|
224
|
+
}
|
|
225
|
+
if (action === "retry_same") {
|
|
226
|
+
console.warn(`[openai] ${modelName} returned EMPTY/hung response — no fallback; retrying same model once`);
|
|
227
|
+
emptyRetried = true;
|
|
228
|
+
continue; // retry same model (same mechanism, same budget)
|
|
229
|
+
}
|
|
230
|
+
console.error(`[openai] ${modelName} ${kind === "timeout" ? "timed out" : "EMPTY/hung"} — no recovery left, failing pass`);
|
|
231
|
+
return { result: null, rateLimited: false, model: modelName, attempts };
|
|
232
|
+
}
|
|
233
|
+
if (kind === "truncated" && !truncBumped) {
|
|
234
|
+
// Same-model retry with bumped max_tokens — preserves determinism.
|
|
235
|
+
attempts.push({ model: modelName, outcome: "truncated" });
|
|
236
|
+
console.warn(`[openai] ${modelName} truncated at max_tokens=${baseMaxOut} — retrying SAME model with bumped max_tokens=${bumpedMaxOut}`);
|
|
237
|
+
truncBumped = true;
|
|
238
|
+
continue; // retry same model
|
|
239
|
+
}
|
|
240
|
+
// Hard provider error (e.g. 400 — the model rejects this structured-output
|
|
241
|
+
// mechanism/schema, like Anthropic on a complex response_format schema) →
|
|
242
|
+
// one-time fallback to the UNIVERSAL prompt-JSON mechanism on the SAME model
|
|
243
|
+
// before giving up. This is what makes the pipeline model-portable: no model
|
|
244
|
+
// ever empties the graph just because it doesn't speak response_format/tool-use.
|
|
245
|
+
if (kind === "mechanism_or_other" && mechanism !== "prompt_json") {
|
|
246
|
+
attempts.push({ model: modelName, outcome: "error" });
|
|
247
|
+
console.warn(`[openai] ${modelName} ${mechanism} failed (status=${e?.status}) — falling back to prompt-JSON mechanism on same model`);
|
|
248
|
+
mechanism = "prompt_json";
|
|
249
|
+
truncBumped = false;
|
|
250
|
+
continue; // retry same model with the universal prompt-JSON mechanism
|
|
251
|
+
}
|
|
252
|
+
attempts.push({ model: modelName, outcome: kind === "truncated" ? "truncated" : rateLimited ? "rate_limited" : "error" });
|
|
253
|
+
if (kind === "truncated")
|
|
254
|
+
console.error(`[openai] ${modelName} truncated AGAIN after bump — failing pass (truncation does NOT escalate to fallback model; that would silently change classification semantics)`);
|
|
255
|
+
else if (!rateLimited)
|
|
256
|
+
console.error(`[openai] generateStructured error (${modelName}): status=${e?.status} msg=${String(e?.message ?? e).slice(0, 200)}`);
|
|
257
|
+
// Only rate-limit escalates to fallback model (empty/timeout handled above).
|
|
258
|
+
if (rateLimited && !isFallback && this.fallbackModel) {
|
|
259
|
+
console.log(`[openai] 429 on ${modelName} — escalating to fallback ${this.fallbackModel}`);
|
|
260
|
+
break; // exit inner while; outer for tries the next model
|
|
261
|
+
}
|
|
262
|
+
if (rateLimited && isFallback)
|
|
263
|
+
return { result: null, rateLimited: true, model: modelName, attempts };
|
|
264
|
+
return { result: null, rateLimited, model: modelName, attempts };
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return { result: null, rateLimited: true, attempts };
|
|
269
|
+
}
|
|
270
|
+
async generate(prompt) {
|
|
271
|
+
if (!this.client)
|
|
272
|
+
return null;
|
|
273
|
+
try {
|
|
274
|
+
const completion = await this.client.chat.completions.create({
|
|
275
|
+
model: this.model,
|
|
276
|
+
messages: [{ role: "user", content: prompt }],
|
|
277
|
+
});
|
|
278
|
+
return completion.choices[0].message.content ?? null;
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
async ping() {
|
|
285
|
+
return (await this.generate("Say OK")) !== null;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
export class OpenAIEmbeddingProvider {
|
|
289
|
+
client;
|
|
290
|
+
embModel = process.env.NODEDEX_EMBEDDING_MODEL ?? "text-embedding-3-small";
|
|
291
|
+
constructor(apiKey, baseURL) {
|
|
292
|
+
this.client = apiKey
|
|
293
|
+
? new OpenAI({ apiKey, ...(baseURL ? { baseURL } : {}) })
|
|
294
|
+
: null;
|
|
295
|
+
}
|
|
296
|
+
isAvailable() { return this.client !== null; }
|
|
297
|
+
async embed(text) {
|
|
298
|
+
if (!this.client)
|
|
299
|
+
return null;
|
|
300
|
+
try {
|
|
301
|
+
const response = await this.client.embeddings.create({ model: this.embModel, input: text });
|
|
302
|
+
return response.data[0]?.embedding ?? null;
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/engine/providers/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { LLMProvider } from "../ai-provider.js";
|
|
2
|
+
/**
|
|
3
|
+
* Provenance of an entry's cost_usd, so a total is never a silent mix of real and
|
|
4
|
+
* guessed numbers:
|
|
5
|
+
* - "openrouter_actual": the provider's real billed cost (most accurate)
|
|
6
|
+
* - "estimated": computed from the static PRICING table (approximate)
|
|
7
|
+
* - "unknown": model not priced and no actual cost reported
|
|
8
|
+
*/
|
|
9
|
+
export type CostSource = "openrouter_actual" | "estimated" | "unknown";
|
|
10
|
+
/** One recorded API-key call. cost_usd is null when no cost is known. */
|
|
11
|
+
export interface UsageLedgerEntry {
|
|
12
|
+
ts: string;
|
|
13
|
+
model: string;
|
|
14
|
+
input: number | null;
|
|
15
|
+
output: number | null;
|
|
16
|
+
thinking: number | null;
|
|
17
|
+
cost_usd: number | null;
|
|
18
|
+
cost_source: CostSource;
|
|
19
|
+
wall_ms: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Wrap a provider so every generateStructured() call is metered into the ledger.
|
|
23
|
+
* The single seam — applied once in getLLMProvider(). All other methods delegate
|
|
24
|
+
* untouched. Only calls that actually hit the API (result.model set) are recorded.
|
|
25
|
+
*/
|
|
26
|
+
export declare function wrapWithUsageLedger(inner: LLMProvider): LLMProvider;
|
|
27
|
+
interface ModelTotal {
|
|
28
|
+
calls: number;
|
|
29
|
+
input: number;
|
|
30
|
+
output: number;
|
|
31
|
+
thinking: number;
|
|
32
|
+
cost_usd: number;
|
|
33
|
+
}
|
|
34
|
+
export interface UsageSummary {
|
|
35
|
+
ledger_path: string;
|
|
36
|
+
enabled: boolean;
|
|
37
|
+
total: ModelTotal & {
|
|
38
|
+
unpriced_calls: number;
|
|
39
|
+
};
|
|
40
|
+
/** How many calls' cost is real vs estimated — tells you how much to trust cost_usd. */
|
|
41
|
+
cost_sources: Record<CostSource, number>;
|
|
42
|
+
by_model: Record<string, ModelTotal>;
|
|
43
|
+
since: string | null;
|
|
44
|
+
latest: string | null;
|
|
45
|
+
recent: UsageLedgerEntry[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Summarize the ledger file (all-time — survives restarts, unlike any in-memory
|
|
49
|
+
* counter). Returns zeros if the ledger doesn't exist. Reads the whole file per
|
|
50
|
+
* call (fine for a local dev ledger); `recent` caps the tail (default 20).
|
|
51
|
+
* Malformed lines are skipped, not fatal.
|
|
52
|
+
*/
|
|
53
|
+
export declare function getUsageSummary(opts?: {
|
|
54
|
+
recent?: number;
|
|
55
|
+
}): UsageSummary;
|
|
56
|
+
/**
|
|
57
|
+
* Sum cost_usd for ledger entries with `startMs <= ts <= endMs` (epoch millis) —
|
|
58
|
+
* the fast, LOCAL windowed-spend read. Two consumers: the cost breaker's
|
|
59
|
+
* rolling-window guard (via getSpendSince), and per-stage v2 front-half cost
|
|
60
|
+
* attribution (each stage's [start,end] timing window → its spend, since the
|
|
61
|
+
* stages run sequentially so windows don't overlap). Accurate because 97.8% of
|
|
62
|
+
* entries carry the real billed cost; the blind spots (free-form generate(),
|
|
63
|
+
* embeddings) aren't ledgered. Missing/unreadable ledger → 0. Malformed lines
|
|
64
|
+
* skipped; null-cost entries contribute 0.
|
|
65
|
+
*/
|
|
66
|
+
export declare function getSpendBetween(startMs: number, endMs: number): number;
|
|
67
|
+
export declare function getSpendSince(sinceMs: number): number;
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=usage-ledger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-ledger.d.ts","sourceRoot":"","sources":["../../../src/engine/providers/usage-ledger.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAAE,WAAW,EAAkB,MAAM,mBAAmB,CAAC;AAcrE;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG,mBAAmB,GAAG,WAAW,GAAG,SAAS,CAAC;AAEvE,yEAAyE;AACzE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,UAAU,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAmCD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,WAAW,CAuBnE;AAID,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,UAAU,GAAG;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,wFAAwF;IACxF,YAAY,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B;AAMD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,YAAY,CAkE5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBtE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD"}
|