@remnic/core 9.3.612 → 9.3.614
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/dist/access-cli.js +58 -57
- package/dist/access-cli.js.map +1 -1
- package/dist/access-http.d.ts +4 -2
- package/dist/access-http.js +22 -22
- package/dist/access-mcp.d.ts +9 -2
- package/dist/access-mcp.js +19 -19
- package/dist/access-schema.d.ts +12 -12
- package/dist/access-schema.js +3 -3
- package/dist/{access-service-D2J9dh_9.d.ts → access-service-DGG_2xPK.d.ts} +1 -1
- package/dist/access-service.d.ts +2 -2
- package/dist/access-service.js +16 -16
- package/dist/active-recall.js +20 -3
- package/dist/active-recall.js.map +1 -1
- package/dist/adapters/index.js +4 -4
- package/dist/adapters/registry.js +2 -2
- package/dist/behavior-learner.js +2 -3
- package/dist/behavior-learner.js.map +1 -1
- package/dist/bootstrap.d.ts +1 -1
- package/dist/briefing.js +3 -3
- package/dist/buffer.d.ts +1 -1
- package/dist/buffer.js +1 -1
- package/dist/calibration.d.ts +5 -2
- package/dist/calibration.js +7 -5
- package/dist/calibration.js.map +1 -1
- package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
- package/dist/causal-consolidation.d.ts +8 -2
- package/dist/causal-consolidation.js +13 -11
- package/dist/causal-consolidation.js.map +1 -1
- package/dist/{chunk-3BP57I6J.js → chunk-2F6NP3NT.js} +2 -1
- package/dist/{chunk-3BP57I6J.js.map → chunk-2F6NP3NT.js.map} +1 -1
- package/dist/{chunk-AU7Q3LSC.js → chunk-2QSZNTDO.js} +4 -4
- package/dist/{chunk-HSVJGWYS.js → chunk-2ROPI5OE.js} +2 -2
- package/dist/{chunk-C4SQJZAF.js → chunk-2SGJY2UY.js} +6 -3
- package/dist/chunk-2SGJY2UY.js.map +1 -0
- package/dist/{chunk-ZDTVJXIP.js → chunk-3MAONBX3.js} +13 -5
- package/dist/chunk-3MAONBX3.js.map +1 -0
- package/dist/{chunk-G3Z3QEF5.js → chunk-3PY7VHV7.js} +2 -2
- package/dist/chunk-3PY7VHV7.js.map +1 -0
- package/dist/{chunk-CF3ZF2YU.js → chunk-3QSU4NFF.js} +3 -3
- package/dist/{chunk-AJA46VX5.js → chunk-3T74IZB3.js} +11 -2
- package/dist/chunk-3T74IZB3.js.map +1 -0
- package/dist/{chunk-KVEVLBKC.js → chunk-4HFJQCJZ.js} +13 -8
- package/dist/chunk-4HFJQCJZ.js.map +1 -0
- package/dist/{chunk-KGK2QKWL.js → chunk-4R4KTDIE.js} +1 -1
- package/dist/chunk-4R4KTDIE.js.map +1 -0
- package/dist/{chunk-OI27U2HT.js → chunk-5BTCT236.js} +2 -2
- package/dist/{chunk-CO7ZO4TU.js → chunk-5VDJMYTF.js} +2 -2
- package/dist/{chunk-BFBF3XEF.js → chunk-6BDVBBBY.js} +33 -25
- package/dist/{chunk-BFBF3XEF.js.map → chunk-6BDVBBBY.js.map} +1 -1
- package/dist/{chunk-EAZGEEG2.js → chunk-6L46YAEZ.js} +45 -9
- package/dist/chunk-6L46YAEZ.js.map +1 -0
- package/dist/{chunk-YFS5OEKO.js → chunk-7MLB4NCL.js} +2 -2
- package/dist/{chunk-IOTENEVL.js → chunk-7YQFWOF7.js} +57 -50
- package/dist/chunk-7YQFWOF7.js.map +1 -0
- package/dist/{chunk-2QANQKSQ.js → chunk-ADNZVFXG.js} +15 -15
- package/dist/{chunk-LZ3VEOU5.js → chunk-AL4RAJL5.js} +22 -5
- package/dist/chunk-AL4RAJL5.js.map +1 -0
- package/dist/{chunk-557IAFPD.js → chunk-APRRL26Q.js} +2 -2
- package/dist/{chunk-QDDHYAKV.js → chunk-AZDOWD2L.js} +2 -2
- package/dist/{chunk-TH67Q46T.js → chunk-B6FDZPCF.js} +17 -9
- package/dist/chunk-B6FDZPCF.js.map +1 -0
- package/dist/{chunk-MLT75J5S.js → chunk-B6SU7YSE.js} +3 -3
- package/dist/{chunk-FXKPZ3H6.js → chunk-BPSGLMQ4.js} +2 -2
- package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
- package/dist/{chunk-NOMEVTUD.js → chunk-C6C7XVKG.js} +5 -4
- package/dist/chunk-C6C7XVKG.js.map +1 -0
- package/dist/{chunk-XKIQZXUB.js → chunk-CI7RKSRE.js} +7 -1
- package/dist/chunk-CI7RKSRE.js.map +1 -0
- package/dist/{chunk-IK34DVAC.js → chunk-CIOMS6DI.js} +2 -2
- package/dist/{chunk-2I5JGH3M.js → chunk-CYEPCZN5.js} +2 -2
- package/dist/{chunk-2I5JGH3M.js.map → chunk-CYEPCZN5.js.map} +1 -1
- package/dist/{chunk-JHMFYY7L.js → chunk-DCGT4FPP.js} +13 -5
- package/dist/chunk-DCGT4FPP.js.map +1 -0
- package/dist/{chunk-7DZRO2DC.js → chunk-DEPRLVLK.js} +2 -2
- package/dist/{chunk-CSKLPDN6.js → chunk-DEVUWMME.js} +52 -19
- package/dist/chunk-DEVUWMME.js.map +1 -0
- package/dist/{chunk-DHGSZ3UD.js → chunk-DGNQRNLL.js} +2 -2
- package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
- package/dist/chunk-FAV25DUZ.js +12 -0
- package/dist/chunk-FAV25DUZ.js.map +1 -0
- package/dist/{chunk-ETUPBUHB.js → chunk-GDASG7NC.js} +2 -2
- package/dist/{chunk-L227SKTB.js → chunk-GDB4J2H3.js} +17 -1
- package/dist/chunk-GDB4J2H3.js.map +1 -0
- package/dist/{chunk-IP73YCZP.js → chunk-GLPBYIXN.js} +4 -2
- package/dist/chunk-GLPBYIXN.js.map +1 -0
- package/dist/{chunk-4HP7HIE3.js → chunk-HP5FMB6L.js} +2 -2
- package/dist/{chunk-EVZFIAPG.js → chunk-IBTZEBUD.js} +23 -10
- package/dist/chunk-IBTZEBUD.js.map +1 -0
- package/dist/{chunk-DOX2CG6Y.js → chunk-IEUU7O4F.js} +2 -2
- package/dist/{chunk-JNANKJLN.js → chunk-JOASJWQR.js} +2 -2
- package/dist/chunk-JOASJWQR.js.map +1 -0
- package/dist/{chunk-WSGF57U2.js → chunk-JQDZQ4TB.js} +2 -2
- package/dist/{chunk-HINSGUA7.js → chunk-KBL3JJR6.js} +9 -13
- package/dist/chunk-KBL3JJR6.js.map +1 -0
- package/dist/{chunk-W7L6HXUC.js → chunk-LXOM6IQU.js} +2 -2
- package/dist/{chunk-G6R5UD3Q.js → chunk-MGN7VHWQ.js} +42 -1
- package/dist/{chunk-G6R5UD3Q.js.map → chunk-MGN7VHWQ.js.map} +1 -1
- package/dist/{chunk-DLJ4IR6M.js → chunk-MHQC2WU2.js} +2 -2
- package/dist/chunk-MHQC2WU2.js.map +1 -0
- package/dist/{chunk-6JGNHWCI.js → chunk-OBIRVF36.js} +3 -3
- package/dist/{chunk-CHCA44C3.js → chunk-ODPLEWB6.js} +3 -3
- package/dist/chunk-ODPLEWB6.js.map +1 -0
- package/dist/{chunk-HENLZHIT.js → chunk-OIF36KGD.js} +7 -4
- package/dist/chunk-OIF36KGD.js.map +1 -0
- package/dist/{chunk-GUPISBV2.js → chunk-PP2JH3GP.js} +2 -2
- package/dist/{chunk-OXJBNGBK.js → chunk-PSUB67YB.js} +2 -2
- package/dist/{chunk-UWY7GIVS.js → chunk-PYIFUBRK.js} +45 -13
- package/dist/chunk-PYIFUBRK.js.map +1 -0
- package/dist/{chunk-KIB7SDIJ.js → chunk-Q6YIJGXJ.js} +2 -2
- package/dist/{chunk-PPPZY2EU.js → chunk-QEMCQFDW.js} +2 -2
- package/dist/{chunk-ZT3EGNLR.js → chunk-QPD426WT.js} +2 -2
- package/dist/{chunk-RLV3PQGH.js → chunk-QVO4YOB7.js} +6 -6
- package/dist/{chunk-GMAG2HS4.js → chunk-RG3LBSGH.js} +46 -9
- package/dist/chunk-RG3LBSGH.js.map +1 -0
- package/dist/{chunk-XSWKORGM.js → chunk-S53OYO3F.js} +3 -1
- package/dist/chunk-S53OYO3F.js.map +1 -0
- package/dist/{chunk-YCN4BVDK.js → chunk-SCPFRKIT.js} +4 -2
- package/dist/chunk-SCPFRKIT.js.map +1 -0
- package/dist/{chunk-HJNQQICM.js → chunk-T5XWMMU2.js} +107 -50
- package/dist/chunk-T5XWMMU2.js.map +1 -0
- package/dist/{chunk-NZPF2SYV.js → chunk-T7N6KQGS.js} +138 -5
- package/dist/chunk-T7N6KQGS.js.map +1 -0
- package/dist/{chunk-VJXSUAO7.js → chunk-TNOWU6RP.js} +13 -10
- package/dist/chunk-TNOWU6RP.js.map +1 -0
- package/dist/{chunk-PCI747N2.js → chunk-TZVQQTG4.js} +48 -19
- package/dist/chunk-TZVQQTG4.js.map +1 -0
- package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
- package/dist/{chunk-IK7DCC5H.js → chunk-VMGLYN42.js} +2 -2
- package/dist/{chunk-5RPTH6AU.js → chunk-VPGUMLBA.js} +8 -7
- package/dist/chunk-VPGUMLBA.js.map +1 -0
- package/dist/{chunk-KM2A35EO.js → chunk-WB3LYXC5.js} +11 -7
- package/dist/chunk-WB3LYXC5.js.map +1 -0
- package/dist/{chunk-NSKYFGDL.js → chunk-X4QQB7O6.js} +2 -2
- package/dist/{chunk-HPWVAEET.js → chunk-X6IRLNOO.js} +3 -7
- package/dist/chunk-X6IRLNOO.js.map +1 -0
- package/dist/{chunk-46GJIW5M.js → chunk-XAZOWLW4.js} +5 -5
- package/dist/{chunk-46GJIW5M.js.map → chunk-XAZOWLW4.js.map} +1 -1
- package/dist/{chunk-XPSVGJYA.js → chunk-YRMKDTKF.js} +12 -9
- package/dist/chunk-YRMKDTKF.js.map +1 -0
- package/dist/{chunk-6ZZP4EJF.js → chunk-ZJR7VG5L.js} +3 -3
- package/dist/{chunk-6ZZP4EJF.js.map → chunk-ZJR7VG5L.js.map} +1 -1
- package/dist/{cli-OrfKXNU4.d.ts → cli-DWeu7eTY.d.ts} +6 -2
- package/dist/cli.d.ts +3 -3
- package/dist/cli.js +60 -59
- package/dist/compounding/engine.js +3 -3
- package/dist/compounding/preference-consolidator.js +39 -11
- package/dist/compounding/preference-consolidator.js.map +1 -1
- package/dist/config.js +1 -1
- package/dist/connectors/codex-materialize-runner.js +3 -3
- package/dist/connectors/index.js +3 -3
- package/dist/consolidation-provenance-check.js +1 -1
- package/dist/contradiction/index.js +4 -4
- package/dist/conversation-index/backend.js +2 -2
- package/dist/conversation-index/indexer.js +1 -1
- package/dist/cross-namespace-budget.js +1 -1
- package/dist/enrichment/index.js +1 -1
- package/dist/entity-retrieval.js +3 -3
- package/dist/evals.js +1 -1
- package/dist/explicit-capture.d.ts +1 -1
- package/dist/extraction-judge.js +8 -1
- package/dist/extraction.js +2 -2
- package/dist/fallback-llm.d.ts +23 -6
- package/dist/fallback-llm.js +5 -3
- package/dist/{first-start-migration-GYJWIH36.js → first-start-migration-FF7YFGRP.js} +6 -6
- package/dist/index.d.ts +3 -3
- package/dist/index.js +94 -93
- package/dist/index.js.map +1 -1
- package/dist/lcm/archive.js +2 -2
- package/dist/lcm/engine.js +5 -5
- package/dist/lcm/index.js +7 -7
- package/dist/lcm/summarizer.js +3 -3
- package/dist/maintenance/memory-governance-cron.d.ts +6 -4
- package/dist/maintenance/memory-governance-cron.js +1 -1
- package/dist/maintenance/memory-governance.js +3 -3
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
- package/dist/maintenance/rebuild-memory-projection.js +4 -4
- package/dist/mcp-memory-inspector-app.d.ts +2 -2
- package/dist/mcp-memory-inspector-app.js +1 -1
- package/dist/migrate/from-engram.js +1 -1
- package/dist/namespaces/migrate.js +16 -15
- package/dist/namespaces/search.js +12 -11
- package/dist/namespaces/storage.js +3 -3
- package/dist/network/webdav.d.ts +2 -0
- package/dist/network/webdav.js +1 -1
- package/dist/objective-state-writers.js +2 -2
- package/dist/operator-toolkit.d.ts +3 -1
- package/dist/operator-toolkit.js +21 -20
- package/dist/{orchestrator-DTRQG75J.d.ts → orchestrator-CqWOjfgl.d.ts} +46 -3
- package/dist/orchestrator.d.ts +1 -1
- package/dist/orchestrator.js +47 -44
- package/dist/patterns-cli.js +1 -1
- package/dist/qmd-recall-cache.d.ts +2 -0
- package/dist/qmd-recall-cache.js +1 -1
- package/dist/qmd.d.ts +37 -2
- package/dist/qmd.js +4 -1
- package/dist/recall-explain-renderer.js +3 -3
- package/dist/recall-planner-llm.d.ts +57 -0
- package/dist/recall-planner-llm.js +167 -0
- package/dist/recall-planner-llm.js.map +1 -0
- package/dist/recall-xray-cli.js +4 -4
- package/dist/recall-xray-renderer.js +3 -3
- package/dist/recall-xray.js +2 -2
- package/dist/resume-bundles.js +2 -2
- package/dist/retrieval-agents.js +2 -2
- package/dist/routing/store.js +1 -1
- package/dist/search/factory.js +11 -10
- package/dist/search/index.js +11 -10
- package/dist/search/lancedb-backend.d.ts +1 -1
- package/dist/search/lancedb-backend.js +3 -2
- package/dist/search/meilisearch-backend.d.ts +1 -1
- package/dist/search/meilisearch-backend.js +3 -2
- package/dist/search/noop-backend.d.ts +1 -1
- package/dist/search/noop-backend.js +1 -1
- package/dist/search/orama-backend.d.ts +1 -1
- package/dist/search/orama-backend.js +3 -2
- package/dist/search/port.d.ts +6 -1
- package/dist/search/port.js +7 -0
- package/dist/search/remote-backend.d.ts +1 -1
- package/dist/search/remote-backend.js +1 -1
- package/dist/semantic-consolidation.js +4 -4
- package/dist/semantic-rule-promotion.js +3 -3
- package/dist/semantic-rule-verifier.js +3 -3
- package/dist/session-observer-state.js +1 -1
- package/dist/storage.js +2 -2
- package/dist/summarizer.js +2 -2
- package/dist/temporal-index.js +1 -1
- package/dist/{tier-stats-SKML2OSF.js → tier-stats-3LYQ3VV5.js} +3 -3
- package/dist/transfer/backup.js +2 -2
- package/dist/transfer/capsule-export.js +2 -2
- package/dist/transfer/capsule-import.js +2 -2
- package/dist/transfer/export-sqlite.js +1 -1
- package/dist/types.d.ts +32 -0
- package/dist/types.js +1 -1
- package/dist/utility-learner.js +1 -1
- package/dist/utility-runtime.js +2 -2
- package/dist/verified-recall.js +3 -3
- package/dist/work/board.js +2 -2
- package/dist/work/storage.d.ts +2 -0
- package/dist/work/storage.js +1 -1
- package/package.json +1 -1
- package/src/access-http.ts +3 -0
- package/src/access-mcp.test.ts +51 -0
- package/src/access-mcp.ts +26 -5
- package/src/active-recall.test.ts +40 -0
- package/src/active-recall.ts +19 -2
- package/src/behavior-learner.ts +5 -3
- package/src/buffer-session.test.ts +58 -0
- package/src/buffer-surprise-trigger.test.ts +4 -18
- package/src/buffer.ts +39 -11
- package/src/calibration.ts +10 -4
- package/src/causal-consolidation.test.ts +47 -2
- package/src/causal-consolidation.ts +13 -9
- package/src/cli.ts +19 -4
- package/src/compounding/engine.ts +2 -0
- package/src/compounding/preference-consolidator.test.ts +292 -0
- package/src/compounding/preference-consolidator.ts +55 -19
- package/src/config.test.ts +213 -0
- package/src/config.ts +175 -4
- package/src/connectors/codex-materialize-runner.ts +7 -4
- package/src/consolidation-provenance-check.ts +24 -5
- package/src/conversation-index/indexer.test.ts +22 -0
- package/src/conversation-index/indexer.ts +7 -3
- package/src/cross-namespace-budget.test.ts +44 -21
- package/src/cross-namespace-budget.ts +2 -2
- package/src/enrichment/pipeline.ts +11 -16
- package/src/evals.ts +1 -1
- package/src/extraction-judge-chain.test.ts +55 -0
- package/src/extraction-judge.ts +7 -9
- package/src/extraction.ts +16 -5
- package/src/fallback-llm.test.ts +600 -1
- package/src/fallback-llm.ts +91 -22
- package/src/maintenance/memory-governance-cron.ts +39 -29
- package/src/mcp-memory-inspector-app.ts +54 -12
- package/src/message-parts/index.ts +6 -0
- package/src/message-parts/message-parts.test.ts +30 -0
- package/src/migrate/from-engram.ts +19 -5
- package/src/namespaces/search.test.ts +15 -2
- package/src/namespaces/search.ts +1 -1
- package/src/network/webdav.ts +61 -21
- package/src/operator-toolkit.ts +6 -2
- package/src/orchestrator.ts +173 -20
- package/src/qmd-client.test.ts +85 -0
- package/src/qmd-recall-cache.test.ts +16 -0
- package/src/qmd-recall-cache.ts +7 -0
- package/src/qmd.test.ts +54 -0
- package/src/qmd.ts +119 -19
- package/src/recall-planner-llm.test.ts +224 -0
- package/src/recall-planner-llm.ts +289 -0
- package/src/routing/store.ts +4 -8
- package/src/search/factory.ts +3 -0
- package/src/search/lancedb-backend.ts +15 -3
- package/src/search/meilisearch-backend.ts +70 -7
- package/src/search/noop-backend.ts +5 -1
- package/src/search/orama-backend.ts +15 -3
- package/src/search/port.ts +15 -0
- package/src/search/remote-backend.ts +5 -1
- package/src/session-observer-state.ts +1 -1
- package/src/summarizer.ts +3 -3
- package/src/temporal-index.test.ts +18 -0
- package/src/temporal-index.ts +45 -0
- package/src/training-export/cli-date-validation.test.ts +36 -0
- package/src/training-export/date-parse.ts +21 -2
- package/src/transfer/export-sqlite.ts +3 -0
- package/src/types.ts +35 -0
- package/src/utility-learner.ts +1 -0
- package/src/work/storage.ts +23 -0
- package/dist/chunk-5RPTH6AU.js.map +0 -1
- package/dist/chunk-AJA46VX5.js.map +0 -1
- package/dist/chunk-C4SQJZAF.js.map +0 -1
- package/dist/chunk-CHCA44C3.js.map +0 -1
- package/dist/chunk-CSKLPDN6.js.map +0 -1
- package/dist/chunk-DLJ4IR6M.js.map +0 -1
- package/dist/chunk-EAZGEEG2.js.map +0 -1
- package/dist/chunk-EVZFIAPG.js.map +0 -1
- package/dist/chunk-G3Z3QEF5.js.map +0 -1
- package/dist/chunk-GMAG2HS4.js.map +0 -1
- package/dist/chunk-HENLZHIT.js.map +0 -1
- package/dist/chunk-HINSGUA7.js.map +0 -1
- package/dist/chunk-HJNQQICM.js.map +0 -1
- package/dist/chunk-HPWVAEET.js.map +0 -1
- package/dist/chunk-IOTENEVL.js.map +0 -1
- package/dist/chunk-IP73YCZP.js.map +0 -1
- package/dist/chunk-JHMFYY7L.js.map +0 -1
- package/dist/chunk-JNANKJLN.js.map +0 -1
- package/dist/chunk-KGK2QKWL.js.map +0 -1
- package/dist/chunk-KM2A35EO.js.map +0 -1
- package/dist/chunk-KVEVLBKC.js.map +0 -1
- package/dist/chunk-L227SKTB.js.map +0 -1
- package/dist/chunk-LZ3VEOU5.js.map +0 -1
- package/dist/chunk-NOMEVTUD.js.map +0 -1
- package/dist/chunk-NZPF2SYV.js.map +0 -1
- package/dist/chunk-PCI747N2.js.map +0 -1
- package/dist/chunk-TH67Q46T.js.map +0 -1
- package/dist/chunk-UWY7GIVS.js.map +0 -1
- package/dist/chunk-VJXSUAO7.js.map +0 -1
- package/dist/chunk-XKIQZXUB.js.map +0 -1
- package/dist/chunk-XPSVGJYA.js.map +0 -1
- package/dist/chunk-XSWKORGM.js.map +0 -1
- package/dist/chunk-YCN4BVDK.js.map +0 -1
- package/dist/chunk-ZDTVJXIP.js.map +0 -1
- /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
- /package/dist/{chunk-AU7Q3LSC.js.map → chunk-2QSZNTDO.js.map} +0 -0
- /package/dist/{chunk-HSVJGWYS.js.map → chunk-2ROPI5OE.js.map} +0 -0
- /package/dist/{chunk-CF3ZF2YU.js.map → chunk-3QSU4NFF.js.map} +0 -0
- /package/dist/{chunk-OI27U2HT.js.map → chunk-5BTCT236.js.map} +0 -0
- /package/dist/{chunk-CO7ZO4TU.js.map → chunk-5VDJMYTF.js.map} +0 -0
- /package/dist/{chunk-YFS5OEKO.js.map → chunk-7MLB4NCL.js.map} +0 -0
- /package/dist/{chunk-2QANQKSQ.js.map → chunk-ADNZVFXG.js.map} +0 -0
- /package/dist/{chunk-557IAFPD.js.map → chunk-APRRL26Q.js.map} +0 -0
- /package/dist/{chunk-QDDHYAKV.js.map → chunk-AZDOWD2L.js.map} +0 -0
- /package/dist/{chunk-MLT75J5S.js.map → chunk-B6SU7YSE.js.map} +0 -0
- /package/dist/{chunk-FXKPZ3H6.js.map → chunk-BPSGLMQ4.js.map} +0 -0
- /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
- /package/dist/{chunk-IK34DVAC.js.map → chunk-CIOMS6DI.js.map} +0 -0
- /package/dist/{chunk-7DZRO2DC.js.map → chunk-DEPRLVLK.js.map} +0 -0
- /package/dist/{chunk-DHGSZ3UD.js.map → chunk-DGNQRNLL.js.map} +0 -0
- /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
- /package/dist/{chunk-ETUPBUHB.js.map → chunk-GDASG7NC.js.map} +0 -0
- /package/dist/{chunk-4HP7HIE3.js.map → chunk-HP5FMB6L.js.map} +0 -0
- /package/dist/{chunk-DOX2CG6Y.js.map → chunk-IEUU7O4F.js.map} +0 -0
- /package/dist/{chunk-WSGF57U2.js.map → chunk-JQDZQ4TB.js.map} +0 -0
- /package/dist/{chunk-W7L6HXUC.js.map → chunk-LXOM6IQU.js.map} +0 -0
- /package/dist/{chunk-6JGNHWCI.js.map → chunk-OBIRVF36.js.map} +0 -0
- /package/dist/{chunk-GUPISBV2.js.map → chunk-PP2JH3GP.js.map} +0 -0
- /package/dist/{chunk-OXJBNGBK.js.map → chunk-PSUB67YB.js.map} +0 -0
- /package/dist/{chunk-KIB7SDIJ.js.map → chunk-Q6YIJGXJ.js.map} +0 -0
- /package/dist/{chunk-PPPZY2EU.js.map → chunk-QEMCQFDW.js.map} +0 -0
- /package/dist/{chunk-ZT3EGNLR.js.map → chunk-QPD426WT.js.map} +0 -0
- /package/dist/{chunk-RLV3PQGH.js.map → chunk-QVO4YOB7.js.map} +0 -0
- /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
- /package/dist/{chunk-IK7DCC5H.js.map → chunk-VMGLYN42.js.map} +0 -0
- /package/dist/{chunk-NSKYFGDL.js.map → chunk-X4QQB7O6.js.map} +0 -0
- /package/dist/{first-start-migration-GYJWIH36.js.map → first-start-migration-FF7YFGRP.js.map} +0 -0
- /package/dist/{tier-stats-SKML2OSF.js.map → tier-stats-3LYQ3VV5.js.map} +0 -0
|
@@ -40,18 +40,47 @@ test("enabled budget warns past soft and denies past hard", () => {
|
|
|
40
40
|
const limiter = new CrossNamespaceBudget({
|
|
41
41
|
enabled: true,
|
|
42
42
|
softLimit: 2,
|
|
43
|
-
hardLimit:
|
|
43
|
+
hardLimit: 4,
|
|
44
44
|
windowMs: 10_000,
|
|
45
45
|
});
|
|
46
46
|
assert.equal(limiter.record("p1", 1).reason, "allowed-under-soft");
|
|
47
47
|
assert.equal(limiter.record("p1", 2).reason, "allowed-under-soft");
|
|
48
48
|
assert.equal(limiter.record("p1", 3).reason, "warn-over-soft");
|
|
49
|
-
// 4th call
|
|
49
|
+
// 4th call reaches hardLimit and is denied.
|
|
50
50
|
const deny = limiter.record("p1", 4);
|
|
51
51
|
assert.equal(deny.allowed, false);
|
|
52
52
|
assert.equal(deny.reason, "deny-over-hard");
|
|
53
53
|
});
|
|
54
54
|
|
|
55
|
+
test("enabled budget denies the threshold-crossing hard-limit request", () => {
|
|
56
|
+
const limiter = new CrossNamespaceBudget({
|
|
57
|
+
enabled: true,
|
|
58
|
+
softLimit: 0,
|
|
59
|
+
hardLimit: 2,
|
|
60
|
+
windowMs: 10_000,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const first = limiter.record("p1", 1);
|
|
64
|
+
assert.equal(first.allowed, true);
|
|
65
|
+
assert.equal(first.reason, "warn-over-soft");
|
|
66
|
+
assert.equal(first.count, 1);
|
|
67
|
+
|
|
68
|
+
const beforeSecond = limiter.peek({
|
|
69
|
+
principal: "p1",
|
|
70
|
+
principalNamespace: "alice",
|
|
71
|
+
queryNamespace: "bob",
|
|
72
|
+
now: 2,
|
|
73
|
+
});
|
|
74
|
+
assert.equal(beforeSecond.allowed, false);
|
|
75
|
+
assert.equal(beforeSecond.reason, "deny-over-hard");
|
|
76
|
+
assert.equal(beforeSecond.count, 1);
|
|
77
|
+
|
|
78
|
+
const second = limiter.record("p1", 2);
|
|
79
|
+
assert.equal(second.allowed, false);
|
|
80
|
+
assert.equal(second.reason, "deny-over-hard");
|
|
81
|
+
assert.equal(second.count, 1);
|
|
82
|
+
});
|
|
83
|
+
|
|
55
84
|
test("sliding window drops old timestamps", () => {
|
|
56
85
|
const limiter = new CrossNamespaceBudget({
|
|
57
86
|
enabled: true,
|
|
@@ -61,10 +90,9 @@ test("sliding window drops old timestamps", () => {
|
|
|
61
90
|
});
|
|
62
91
|
// Fill to hard.
|
|
63
92
|
limiter.record("p1", 0);
|
|
64
|
-
limiter.record("p1", 50);
|
|
65
|
-
assert.equal(limiter.record("p1", 80).reason, "deny-over-hard");
|
|
93
|
+
assert.equal(limiter.record("p1", 50).reason, "deny-over-hard");
|
|
66
94
|
|
|
67
|
-
// Walk past the window so the first
|
|
95
|
+
// Walk past the window so the first allowed timestamp slides out.
|
|
68
96
|
const d = limiter.record("p1", 201);
|
|
69
97
|
assert.equal(d.allowed, true);
|
|
70
98
|
assert.equal(d.reason, "allowed-under-soft");
|
|
@@ -75,7 +103,7 @@ test("per-principal isolation: one principal's denial does not affect another",
|
|
|
75
103
|
const limiter = new CrossNamespaceBudget({
|
|
76
104
|
enabled: true,
|
|
77
105
|
softLimit: 1,
|
|
78
|
-
hardLimit:
|
|
106
|
+
hardLimit: 2,
|
|
79
107
|
windowMs: 10_000,
|
|
80
108
|
});
|
|
81
109
|
limiter.record("alice", 10);
|
|
@@ -107,7 +135,7 @@ test("check() engages on cross-namespace", () => {
|
|
|
107
135
|
const limiter = new CrossNamespaceBudget({
|
|
108
136
|
enabled: true,
|
|
109
137
|
softLimit: 1,
|
|
110
|
-
hardLimit:
|
|
138
|
+
hardLimit: 2,
|
|
111
139
|
windowMs: 10_000,
|
|
112
140
|
});
|
|
113
141
|
const d1 = limiter.check({
|
|
@@ -131,7 +159,7 @@ test("denied calls do not push bucket forward", () => {
|
|
|
131
159
|
const limiter = new CrossNamespaceBudget({
|
|
132
160
|
enabled: true,
|
|
133
161
|
softLimit: 1,
|
|
134
|
-
hardLimit:
|
|
162
|
+
hardLimit: 2,
|
|
135
163
|
windowMs: 100,
|
|
136
164
|
});
|
|
137
165
|
limiter.record("p1", 0);
|
|
@@ -150,7 +178,7 @@ test("missing principal is bucketed under __anonymous__ rather than failing open
|
|
|
150
178
|
const limiter = new CrossNamespaceBudget({
|
|
151
179
|
enabled: true,
|
|
152
180
|
softLimit: 0,
|
|
153
|
-
hardLimit:
|
|
181
|
+
hardLimit: 2,
|
|
154
182
|
windowMs: 10_000,
|
|
155
183
|
});
|
|
156
184
|
// An empty-string principal shares the anonymous bucket.
|
|
@@ -168,8 +196,7 @@ test("reset clears all state", () => {
|
|
|
168
196
|
windowMs: 10_000,
|
|
169
197
|
});
|
|
170
198
|
limiter.record("p1", 1);
|
|
171
|
-
limiter.record("p1", 2);
|
|
172
|
-
assert.equal(limiter.record("p1", 3).reason, "deny-over-hard");
|
|
199
|
+
assert.equal(limiter.record("p1", 2).reason, "deny-over-hard");
|
|
173
200
|
limiter.reset();
|
|
174
201
|
const after = limiter.record("p1", 4);
|
|
175
202
|
assert.equal(after.allowed, true);
|
|
@@ -231,7 +258,7 @@ test("record() normalizes non-finite clocks before mutating limiter state", () =
|
|
|
231
258
|
const limiter = new CrossNamespaceBudget({
|
|
232
259
|
enabled: true,
|
|
233
260
|
softLimit: 1,
|
|
234
|
-
hardLimit:
|
|
261
|
+
hardLimit: 2,
|
|
235
262
|
windowMs: 100,
|
|
236
263
|
});
|
|
237
264
|
|
|
@@ -254,7 +281,7 @@ test("peek() with a non-finite clock is read-only and does not poison state", ()
|
|
|
254
281
|
const limiter = new CrossNamespaceBudget({
|
|
255
282
|
enabled: true,
|
|
256
283
|
softLimit: 0,
|
|
257
|
-
hardLimit:
|
|
284
|
+
hardLimit: 2,
|
|
258
285
|
windowMs: 100,
|
|
259
286
|
});
|
|
260
287
|
|
|
@@ -293,14 +320,10 @@ test("bucket is evicted after a denial rolls the only timestamp back", () => {
|
|
|
293
320
|
hardLimit: 1,
|
|
294
321
|
windowMs: 100,
|
|
295
322
|
});
|
|
296
|
-
limiter.record("p1", 0);
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
limiter.record("p1", 150);
|
|
301
|
-
// (wait — the above is allowed because the earlier timestamp slid out.)
|
|
302
|
-
// Force a deny path differently:
|
|
303
|
-
assert.equal(limiter.bucketCount(), 1);
|
|
323
|
+
const denied = limiter.record("p1", 0);
|
|
324
|
+
assert.equal(denied.allowed, false);
|
|
325
|
+
assert.equal(denied.reason, "deny-over-hard");
|
|
326
|
+
assert.equal(limiter.bucketCount(), 0);
|
|
304
327
|
});
|
|
305
328
|
|
|
306
329
|
test("check() does NOT fail-open when both namespaces are empty or undefined", () => {
|
|
@@ -207,7 +207,7 @@ export class CrossNamespaceBudget {
|
|
|
207
207
|
this.buckets.set(principal, bucket);
|
|
208
208
|
const count = bucket.timestamps.length;
|
|
209
209
|
|
|
210
|
-
if (count
|
|
210
|
+
if (count >= hardLimit) {
|
|
211
211
|
// Denied: roll back the timestamp we just added so a repeated denied
|
|
212
212
|
// call does not push the bucket further into the future. This keeps
|
|
213
213
|
// the limiter stateless with respect to denied attempts.
|
|
@@ -290,7 +290,7 @@ export class CrossNamespaceBudget {
|
|
|
290
290
|
if (ts >= cutoff) liveCount++;
|
|
291
291
|
}
|
|
292
292
|
const projected = liveCount + 1; // +1 for the current call
|
|
293
|
-
if (projected
|
|
293
|
+
if (projected >= hardLimit) {
|
|
294
294
|
return { allowed: false, reason: "deny-over-hard", count: liveCount, limit };
|
|
295
295
|
}
|
|
296
296
|
if (projected > softLimit) {
|
|
@@ -32,12 +32,12 @@ interface RateLimitBucket {
|
|
|
32
32
|
|
|
33
33
|
const rateBuckets = new Map<string, RateLimitBucket>();
|
|
34
34
|
|
|
35
|
-
function
|
|
35
|
+
function reserveRateLimitSlot(
|
|
36
36
|
provider: EnrichmentProvider,
|
|
37
37
|
config: EnrichmentPipelineConfig,
|
|
38
38
|
): boolean {
|
|
39
39
|
const providerCfg = config.providers.find((p) => p.id === provider.id);
|
|
40
|
-
if (!providerCfg?.rateLimit) return
|
|
40
|
+
if (!providerCfg?.rateLimit) return true;
|
|
41
41
|
|
|
42
42
|
const now = Date.now();
|
|
43
43
|
let bucket = rateBuckets.get(provider.id);
|
|
@@ -62,17 +62,13 @@ function isRateLimited(
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
const { maxPerMinute, maxPerDay } = providerCfg.rateLimit;
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
function recordCall(
|
|
69
|
-
providerId: string,
|
|
70
|
-
): void {
|
|
71
|
-
const bucket = rateBuckets.get(providerId);
|
|
72
|
-
if (bucket) {
|
|
73
|
-
bucket.minuteCount += 1;
|
|
74
|
-
bucket.dayCount += 1;
|
|
65
|
+
if (bucket.minuteCount >= maxPerMinute || bucket.dayCount >= maxPerDay) {
|
|
66
|
+
return false;
|
|
75
67
|
}
|
|
68
|
+
|
|
69
|
+
bucket.minuteCount += 1;
|
|
70
|
+
bucket.dayCount += 1;
|
|
71
|
+
return true;
|
|
76
72
|
}
|
|
77
73
|
|
|
78
74
|
// ---------------------------------------------------------------------------
|
|
@@ -129,8 +125,9 @@ export async function runEnrichmentPipeline(
|
|
|
129
125
|
continue;
|
|
130
126
|
}
|
|
131
127
|
|
|
132
|
-
//
|
|
133
|
-
|
|
128
|
+
// Reserve quota before the awaited provider call so concurrent pipelines
|
|
129
|
+
// cannot all pass the same pre-await rate-limit check.
|
|
130
|
+
if (!reserveRateLimitSlot(provider, config)) {
|
|
134
131
|
log.debug?.(
|
|
135
132
|
`enrichment: skipping provider ${provider.id} for ${entity.name} — rate limited`,
|
|
136
133
|
);
|
|
@@ -154,7 +151,6 @@ export async function runEnrichmentPipeline(
|
|
|
154
151
|
try {
|
|
155
152
|
candidates = await provider.enrich(entity);
|
|
156
153
|
} catch (err) {
|
|
157
|
-
recordCall(provider.id);
|
|
158
154
|
log.error?.(
|
|
159
155
|
`enrichment: provider ${provider.id} failed for ${entity.name}: ${err instanceof Error ? err.message : String(err)}`,
|
|
160
156
|
);
|
|
@@ -169,7 +165,6 @@ export async function runEnrichmentPipeline(
|
|
|
169
165
|
});
|
|
170
166
|
continue;
|
|
171
167
|
}
|
|
172
|
-
recordCall(provider.id);
|
|
173
168
|
|
|
174
169
|
// Tag each candidate with provider id
|
|
175
170
|
for (const candidate of candidates) {
|
package/src/evals.ts
CHANGED
|
@@ -359,7 +359,7 @@ export function validateEvalBenchmarkManifest(
|
|
|
359
359
|
|
|
360
360
|
return {
|
|
361
361
|
schemaVersion: 1,
|
|
362
|
-
benchmarkId: assertString(raw.benchmarkId, "benchmarkId"),
|
|
362
|
+
benchmarkId: assertSafeBenchmarkId(assertString(raw.benchmarkId, "benchmarkId")),
|
|
363
363
|
benchmarkType,
|
|
364
364
|
title: assertString(raw.title, "title"),
|
|
365
365
|
description:
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import test from "node:test";
|
|
3
|
+
|
|
4
|
+
import { parseConfig } from "./config.js";
|
|
5
|
+
import { judgeFactDurability } from "./extraction-judge.js";
|
|
6
|
+
import type { FallbackLlmClient } from "./fallback-llm.js";
|
|
7
|
+
|
|
8
|
+
// Regression for cursor review on #1425: the extraction judge must route gateway
|
|
9
|
+
// fallback calls through the SAME precedence as ExtractionEngine.withGatewayAgent
|
|
10
|
+
// — taskModelChain wins over gatewayAgentId — so judge-gated extractions use the
|
|
11
|
+
// configured task chain instead of silently using the persona/default chain.
|
|
12
|
+
|
|
13
|
+
function captureLlm(captured: Array<Record<string, unknown>>): FallbackLlmClient {
|
|
14
|
+
return {
|
|
15
|
+
isAvailable: () => true,
|
|
16
|
+
chatCompletion: async (_messages: unknown, options: Record<string, unknown>) => {
|
|
17
|
+
captured.push(options);
|
|
18
|
+
// A parseable batch verdict so the judge doesn't error after the call.
|
|
19
|
+
return { content: JSON.stringify([{ index: 0, durable: true, reason: "ok" }]) };
|
|
20
|
+
},
|
|
21
|
+
} as unknown as FallbackLlmClient;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// "preference" is not auto-approved (only "correction"/"principle" are), so a
|
|
25
|
+
// non-critical preference candidate reaches the LLM path.
|
|
26
|
+
const candidate = { text: "user prefers dark mode", category: "preference", confidence: 0.5 };
|
|
27
|
+
|
|
28
|
+
test("judge forwards taskModelChain to the fallback LLM in gateway mode", async () => {
|
|
29
|
+
const config = parseConfig({
|
|
30
|
+
modelSource: "gateway",
|
|
31
|
+
gatewayAgentId: "persona-agent",
|
|
32
|
+
taskModelChain: { primary: "zai/glm-4.7-flash", fallbacks: ["fireworks/x/glm-5p1"] },
|
|
33
|
+
});
|
|
34
|
+
const captured: Array<Record<string, unknown>> = [];
|
|
35
|
+
|
|
36
|
+
await judgeFactDurability([candidate], config, null, captureLlm(captured), new Map(), new Map());
|
|
37
|
+
|
|
38
|
+
assert.equal(captured.length, 1, "judge should call the fallback LLM once");
|
|
39
|
+
assert.deepEqual(captured[0]?.modelChain, {
|
|
40
|
+
primary: "zai/glm-4.7-flash",
|
|
41
|
+
fallbacks: ["fireworks/x/glm-5p1"],
|
|
42
|
+
});
|
|
43
|
+
assert.equal(captured[0]?.agentId, undefined, "taskModelChain takes precedence over gatewayAgentId");
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("judge falls back to gatewayAgentId when no taskModelChain is set", async () => {
|
|
47
|
+
const config = parseConfig({ modelSource: "gateway", gatewayAgentId: "persona-agent" });
|
|
48
|
+
const captured: Array<Record<string, unknown>> = [];
|
|
49
|
+
|
|
50
|
+
await judgeFactDurability([candidate], config, null, captureLlm(captured), new Map(), new Map());
|
|
51
|
+
|
|
52
|
+
assert.equal(captured.length, 1);
|
|
53
|
+
assert.equal(captured[0]?.agentId, "persona-agent");
|
|
54
|
+
assert.equal(captured[0]?.modelChain, undefined);
|
|
55
|
+
});
|
package/src/extraction-judge.ts
CHANGED
|
@@ -17,7 +17,7 @@ import { createHash } from "node:crypto";
|
|
|
17
17
|
import { log } from "./logger.js";
|
|
18
18
|
import type { PluginConfig, ImportanceLevel } from "./types.js";
|
|
19
19
|
import type { LocalLlmClient } from "./local-llm.js";
|
|
20
|
-
import type
|
|
20
|
+
import { type FallbackLlmClient, gatewayTaskChainOptions } from "./fallback-llm.js";
|
|
21
21
|
import { extractJsonCandidates } from "./json-extract.js";
|
|
22
22
|
import { normalizeProcedureSteps } from "./procedural/procedure-types.js";
|
|
23
23
|
|
|
@@ -656,13 +656,11 @@ async function callJudgeLlm(
|
|
|
656
656
|
// routing preference.
|
|
657
657
|
const skipLocal = config.modelSource === "gateway";
|
|
658
658
|
|
|
659
|
-
//
|
|
660
|
-
//
|
|
661
|
-
//
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
? (config.gatewayAgentId || undefined)
|
|
665
|
-
: undefined;
|
|
659
|
+
// Route judge-gated extractions through the SAME shared resolution as every
|
|
660
|
+
// other background task (taskModelChain > gatewayAgentId in gateway mode), so
|
|
661
|
+
// the judge never silently falls back to the persona/default chain when a
|
|
662
|
+
// task chain is configured (gotcha #22, #39). Issue #1365 / PR #1425.
|
|
663
|
+
const gatewayChain = gatewayTaskChainOptions(config);
|
|
666
664
|
|
|
667
665
|
// Try local LLM first (unless modelSource says gateway)
|
|
668
666
|
if (localLlm && !skipLocal) {
|
|
@@ -695,7 +693,7 @@ async function callJudgeLlm(
|
|
|
695
693
|
maxTokens: 2048,
|
|
696
694
|
timeoutMs: 1500,
|
|
697
695
|
...(modelOverride ? { model: modelOverride } : {}),
|
|
698
|
-
...
|
|
696
|
+
...gatewayChain,
|
|
699
697
|
},
|
|
700
698
|
);
|
|
701
699
|
if (result?.content) {
|
package/src/extraction.ts
CHANGED
|
@@ -2,7 +2,7 @@ import OpenAI from "openai";
|
|
|
2
2
|
import { log } from "./logger.js";
|
|
3
3
|
import { delinearize } from "./delinearize.js";
|
|
4
4
|
import { LocalLlmClient } from "./local-llm.js";
|
|
5
|
-
import { FallbackLlmClient, fallbackLlmRuntimeContextFromConfig } from "./fallback-llm.js";
|
|
5
|
+
import { FallbackLlmClient, fallbackLlmRuntimeContextFromConfig, gatewayTaskChainOptions } from "./fallback-llm.js";
|
|
6
6
|
import {
|
|
7
7
|
ExtractionResultSchema,
|
|
8
8
|
ConsolidationResultSchema,
|
|
@@ -123,7 +123,16 @@ export class ExtractionEngine {
|
|
|
123
123
|
if (config.modelSource === "gateway") {
|
|
124
124
|
log.debug(
|
|
125
125
|
`extraction engine: gateway model source active; extraction uses the gateway chain as its primary path` +
|
|
126
|
-
(config.
|
|
126
|
+
(config.taskModelChain ? " (taskModelChain)" :
|
|
127
|
+
config.gatewayAgentId ? ` (agent: ${config.gatewayAgentId})` : " (defaults)"),
|
|
128
|
+
);
|
|
129
|
+
} else if (config.taskModelChain) {
|
|
130
|
+
// taskModelChain resolves through gateway providers, so it only applies
|
|
131
|
+
// under modelSource: "gateway". Warn rather than silently ignore it so a
|
|
132
|
+
// misconfigured plugin-mode setup is visible. Issue #1365 / PR #1370.
|
|
133
|
+
log.warn(
|
|
134
|
+
`taskModelChain is set but modelSource is "${config.modelSource}"; the chain is ignored. ` +
|
|
135
|
+
`Set modelSource: "gateway" to use it for extraction/consolidation/summarization.`,
|
|
127
136
|
);
|
|
128
137
|
}
|
|
129
138
|
}
|
|
@@ -157,8 +166,9 @@ export class ExtractionEngine {
|
|
|
157
166
|
*/
|
|
158
167
|
private withGatewayAgent(options: import("./fallback-llm.js").FallbackLlmOptions): import("./fallback-llm.js").FallbackLlmOptions {
|
|
159
168
|
if (!this.useGatewayModelSource) return options;
|
|
160
|
-
|
|
161
|
-
|
|
169
|
+
// Shared resolution (taskModelChain > gatewayAgentId) so every background
|
|
170
|
+
// task routes identically (gotcha #22). Issue #1365.
|
|
171
|
+
return { ...options, ...gatewayTaskChainOptions(this.config) };
|
|
162
172
|
}
|
|
163
173
|
|
|
164
174
|
private emit(event: LlmTraceEvent): void {
|
|
@@ -1098,7 +1108,8 @@ export class ExtractionEngine {
|
|
|
1098
1108
|
if (this.useGatewayModelSource) {
|
|
1099
1109
|
log.debug(
|
|
1100
1110
|
`extraction: using gateway model chain as primary path` +
|
|
1101
|
-
(this.config.
|
|
1111
|
+
(this.config.taskModelChain ? " (taskModelChain)" :
|
|
1112
|
+
this.config.gatewayAgentId ? ` (agent: ${this.config.gatewayAgentId})` : " (defaults)"),
|
|
1102
1113
|
);
|
|
1103
1114
|
} else {
|
|
1104
1115
|
log.info("extraction: falling back to gateway default AI");
|