@remnic/core 9.69.61 → 9.69.64
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-admin-ops-surface.js +27 -27
- package/dist/access-authorization-probe.js +28 -28
- package/dist/access-boundary.js +27 -27
- package/dist/access-cli.js +68 -68
- package/dist/access-extraction-force-flush.js +27 -27
- package/dist/access-http-briefing.js +28 -28
- package/dist/access-http-query.js +29 -29
- package/dist/access-http.js +44 -44
- package/dist/access-identity-continuity-surface.js +27 -27
- package/dist/access-lcm-surface.js +27 -27
- package/dist/access-mcp-output-schemas.d.ts.map +1 -1
- package/dist/access-mcp-output-schemas.js +1 -1
- package/dist/access-mcp.js +37 -37
- package/dist/access-namespace-preflight.js +27 -27
- package/dist/access-observe-write-surface.js +27 -27
- package/dist/access-operations-batch.js +28 -28
- package/dist/access-operations.js +35 -35
- package/dist/access-recall-concurrency.js +27 -27
- package/dist/access-recall-response.d.ts.map +1 -1
- package/dist/access-recall-response.js +27 -27
- package/dist/access-recall-surface.js +27 -27
- package/dist/access-service.d.ts +4 -0
- package/dist/access-service.d.ts.map +1 -1
- package/dist/access-service.js +27 -27
- package/dist/access-surface-catalog.js +29 -29
- package/dist/active-recall.js +9 -9
- package/dist/briefing.js +10 -10
- package/dist/buffer.js +5 -5
- package/dist/causal-consolidation.js +11 -11
- package/dist/{chunk-52VL6LCY.js → chunk-2VH2JWYN.js} +2 -2
- package/dist/{chunk-WD32KTVI.js → chunk-2ZVSQPAA.js} +32 -16
- package/dist/chunk-2ZVSQPAA.js.map +1 -0
- package/dist/{chunk-G4WZDQ32.js → chunk-3NG5OOCX.js} +2 -2
- package/dist/{chunk-KG2OOAFF.js → chunk-3NTVCMDD.js} +2 -2
- package/dist/{chunk-7OC3Q5X4.js → chunk-3S4R2HA5.js} +2 -2
- package/dist/{chunk-NORFVW2H.js → chunk-4RWPQZYD.js} +2 -2
- package/dist/{chunk-B5GMOOY2.js → chunk-5AABWM72.js} +3 -3
- package/dist/{chunk-KRPMISWO.js → chunk-5C765XYU.js} +2 -2
- package/dist/{chunk-WLZYGLJ4.js → chunk-5MA7ZLPD.js} +5 -7
- package/dist/chunk-5MA7ZLPD.js.map +1 -0
- package/dist/{chunk-XOLVM3AT.js → chunk-5WXJE5TV.js} +2 -2
- package/dist/{chunk-2C5Z7CWB.js → chunk-6YTL3JYX.js} +2 -2
- package/dist/{chunk-F4PEETM4.js → chunk-755VRFBS.js} +2 -2
- package/dist/{chunk-HNOKNHFO.js → chunk-7L747CFR.js} +2 -2
- package/dist/{chunk-WPGR3RW4.js → chunk-7VO6E5UD.js} +2 -2
- package/dist/{chunk-LMLPLIT4.js → chunk-AQ6IBVFQ.js} +2 -2
- package/dist/{chunk-XN4CPSCN.js → chunk-B2JE56NB.js} +2 -2
- package/dist/{chunk-L4WBADKG.js → chunk-B5EZWPSM.js} +2 -2
- package/dist/{chunk-EIU642TN.js → chunk-BE4GMH45.js} +2 -2
- package/dist/{chunk-NLE6TSLG.js → chunk-BLVHDY2U.js} +5 -7
- package/dist/chunk-BLVHDY2U.js.map +1 -0
- package/dist/{chunk-JTTLH646.js → chunk-C2W6JKQQ.js} +2 -2
- package/dist/{chunk-FG5QU7A2.js → chunk-CFCAFAJC.js} +2 -2
- package/dist/{chunk-ZJ6MEVTX.js → chunk-CZM4MHZF.js} +37 -32
- package/dist/chunk-CZM4MHZF.js.map +1 -0
- package/dist/{chunk-M4PHCEPU.js → chunk-DDY7LJMP.js} +2 -2
- package/dist/{chunk-2L5DIVDU.js → chunk-DT33WNG2.js} +4 -4
- package/dist/{chunk-SZAWZPY6.js → chunk-E7SKAUEW.js} +7 -7
- package/dist/{chunk-NRVGODSE.js → chunk-EK4MOTHM.js} +6 -6
- package/dist/{chunk-QEGKMZNQ.js → chunk-FO5NDQZH.js} +3 -3
- package/dist/chunk-G26YNEOC.js +37 -0
- package/dist/chunk-G26YNEOC.js.map +1 -0
- package/dist/{chunk-GMHWCPLP.js → chunk-GZLSIPYU.js} +2 -2
- package/dist/{chunk-ZFUPRODV.js → chunk-HPWJ5B7D.js} +39 -3
- package/dist/chunk-HPWJ5B7D.js.map +1 -0
- package/dist/{chunk-SEHKTE4F.js → chunk-I4IKTNZP.js} +3 -3
- package/dist/{chunk-W65KK3X6.js → chunk-II4TIQCU.js} +2 -2
- package/dist/{chunk-FWVDTLRK.js → chunk-IJQEVNEF.js} +1 -1
- package/dist/{chunk-KXJ7XYUT.js → chunk-IOUQUXHO.js} +2 -2
- package/dist/{chunk-V3JM4XEI.js → chunk-ITLFUILH.js} +2 -2
- package/dist/{chunk-ZNFHWNDM.js → chunk-IULYVB5X.js} +5 -5
- package/dist/{chunk-Z3YQOV45.js → chunk-JLU7WK22.js} +2 -2
- package/dist/{chunk-NRTVZSPO.js → chunk-L4HT5QZ5.js} +2 -2
- package/dist/{chunk-5QZHDS4X.js → chunk-LI4IWBLN.js} +2 -2
- package/dist/{chunk-LY3SDHMI.js → chunk-LQ4OSM5V.js} +3 -3
- package/dist/{chunk-2OUSWDY6.js → chunk-M3TMVHQ2.js} +2 -2
- package/dist/{chunk-IDRSTHVR.js → chunk-MB3HMRXM.js} +2 -2
- package/dist/{chunk-4P3ZBL5E.js → chunk-MUGLJAZ3.js} +2 -2
- package/dist/{chunk-ZOASYXBS.js → chunk-MY2PLXSM.js} +6 -2
- package/dist/chunk-MY2PLXSM.js.map +1 -0
- package/dist/{chunk-4IFSMCRS.js → chunk-NYN4ZMPL.js} +2 -2
- package/dist/{chunk-K7S2IMGJ.js → chunk-O7QF3TCV.js} +322 -25
- package/dist/{chunk-K7S2IMGJ.js.map → chunk-O7QF3TCV.js.map} +1 -1
- package/dist/{chunk-KV44HTMJ.js → chunk-OBD77TYC.js} +2 -2
- package/dist/{chunk-GYNCJSQ7.js → chunk-OCEIHKH5.js} +3 -3
- package/dist/{chunk-DC5CTLCZ.js → chunk-PSGRZFBH.js} +10 -10
- package/dist/{chunk-FQGY7XB2.js → chunk-S52VKUUW.js} +2 -2
- package/dist/{chunk-D7MAYFQP.js → chunk-S7LWX2PQ.js} +2 -2
- package/dist/{chunk-TYP7GYRI.js → chunk-SB4ZWVKI.js} +2 -2
- package/dist/{chunk-KVO2BTA4.js → chunk-T2YX56QI.js} +2 -2
- package/dist/{chunk-G6NQ3L4T.js → chunk-T3FMRLWQ.js} +2 -2
- package/dist/{chunk-CDQO5DCD.js → chunk-TO3G56GM.js} +2 -2
- package/dist/{chunk-WEQZ5OYK.js → chunk-U6GKPSZH.js} +2 -2
- package/dist/{chunk-FM5HN7LL.js → chunk-WQC54W25.js} +9 -17
- package/dist/chunk-WQC54W25.js.map +1 -0
- package/dist/{chunk-XDH5MO6L.js → chunk-WZ33AIOP.js} +2 -2
- package/dist/{chunk-TM7S5UHD.js → chunk-XDIFADVN.js} +2 -2
- package/dist/{chunk-SVWYZXIL.js → chunk-XDOXR3U6.js} +2 -2
- package/dist/{chunk-VKDWYDFQ.js → chunk-XGLBVYEA.js} +5 -5
- package/dist/{chunk-5Y7VCE3A.js → chunk-XJNSOI23.js} +2 -2
- package/dist/{chunk-LDP6LBDS.js → chunk-Y3AFTYK4.js} +2 -2
- package/dist/{chunk-YL2W6NUG.js → chunk-YGJMMMPN.js} +4 -4
- package/dist/{chunk-KIOXEHWF.js → chunk-YIDBKTZJ.js} +2 -2
- package/dist/{chunk-F5ZCNJ3V.js → chunk-ZPPWW576.js} +2 -2
- package/dist/{chunk-TQAXUYUE.js → chunk-ZSXSMVW6.js} +2 -2
- package/dist/{chunk-6RD7MSIO.js → chunk-ZUT4FK5W.js} +2 -2
- package/dist/cli.js +54 -54
- package/dist/coding/export-okf-codegraph.js +9 -9
- package/dist/compounding/engine.js +10 -10
- package/dist/config.js +9 -9
- package/dist/connectors/codex-materialize-runner.js +10 -10
- package/dist/connectors/index.js +10 -10
- package/dist/convergence-refresh.js +12 -12
- package/dist/corpus-watermark.js +12 -12
- package/dist/entity-retrieval.js +10 -10
- package/dist/external-wiki-access.js +28 -28
- package/dist/extraction.js +16 -16
- package/dist/harmonic-retrieval.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +70 -68
- package/dist/location/index.js +12 -12
- package/dist/maintenance/memory-governance.js +10 -10
- package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +10 -10
- package/dist/maintenance/rebuild-memory-projection.js +11 -11
- package/dist/memory-browse-operations.js +28 -28
- package/dist/memory-browse.js +5 -5
- package/dist/model-registry.d.ts.map +1 -1
- package/dist/model-registry.js +1 -1
- package/dist/namespaces/migrate.js +11 -11
- package/dist/namespaces/search.js +8 -8
- package/dist/namespaces/storage.js +10 -10
- package/dist/operator-doctor-corpus.js +13 -13
- package/dist/operator-toolkit.js +18 -18
- package/dist/orchestration/maintenance.js +18 -18
- package/dist/orchestration/recall-internal.d.ts.map +1 -1
- package/dist/orchestrator.js +68 -68
- package/dist/profiling.d.ts.map +1 -1
- package/dist/profiling.js +1 -1
- package/dist/qmd.js +2 -2
- package/dist/recall-composition-decision.d.ts +9 -0
- package/dist/recall-composition-decision.d.ts.map +1 -1
- package/dist/recall-composition-decision.js +2 -1
- package/dist/recall-navigation-operations.js +28 -28
- package/dist/recall-navigation.js +27 -27
- package/dist/recall-state-view-admission.js +5 -5
- package/dist/recall-why-service.d.ts.map +1 -1
- package/dist/recall-why-service.js +5 -5
- package/dist/resume-bundles.js +9 -9
- package/dist/search/factory.js +7 -7
- package/dist/search/index.js +7 -7
- package/dist/search/lancedb-backend.js +2 -2
- package/dist/search/meilisearch-backend.js +2 -2
- package/dist/search/orama-backend.js +2 -2
- package/dist/search/port.d.ts +9 -0
- package/dist/search/port.d.ts.map +1 -1
- package/dist/search/port.js +7 -1
- package/dist/search/remote-backend.js +2 -2
- package/dist/security/audit-memory-cli.d.ts.map +1 -1
- package/dist/security/audit-memory.d.ts +10 -0
- package/dist/security/audit-memory.d.ts.map +1 -1
- package/dist/security/injection-screen.d.ts +1 -2
- package/dist/security/injection-screen.d.ts.map +1 -1
- package/dist/semantic-consolidation.js +11 -11
- package/dist/semantic-rule-promotion.js +10 -10
- package/dist/semantic-rule-verifier.js +10 -10
- package/dist/source-agent-qualifier.js +13 -13
- package/dist/standup/build.js +10 -10
- package/dist/storage.js +9 -9
- package/dist/summarizer.js +2 -2
- package/dist/support-passport/index.js +30 -30
- package/dist/transfer/export-okf.js +10 -10
- package/dist/verified-recall.js +10 -10
- package/dist/who-knows-cli.js +11 -11
- package/dist/who-knows.js +10 -10
- package/package.json +12 -2
- package/src/access-mcp-output-schemas.ts +4 -0
- package/src/access-recall-response.ts +26 -1
- package/src/access-service.ts +1 -0
- package/src/index.ts +1 -1
- package/src/model-registry.test.ts +22 -1
- package/src/model-registry.ts +7 -6
- package/src/orchestration/recall-internal.ts +8 -5
- package/src/profiling.test.ts +20 -1
- package/src/profiling.ts +7 -7
- package/src/recall-composition-decision.test.ts +75 -0
- package/src/recall-composition-decision.ts +52 -3
- package/src/recall-retrieval-failure.test.ts +245 -0
- package/src/recall-why-service.ts +8 -24
- package/src/search/port.ts +32 -0
- package/src/security/audit-memory-cli.test.ts +90 -0
- package/src/security/audit-memory-cli.ts +7 -0
- package/src/security/audit-memory.ts +14 -0
- package/src/security/injection-screen.test.ts +245 -0
- package/src/security/injection-screen.ts +341 -11
- package/dist/chunk-FM5HN7LL.js.map +0 -1
- package/dist/chunk-NLE6TSLG.js.map +0 -1
- package/dist/chunk-U2VDCFXW.js +0 -19
- package/dist/chunk-U2VDCFXW.js.map +0 -1
- package/dist/chunk-WD32KTVI.js.map +0 -1
- package/dist/chunk-WLZYGLJ4.js.map +0 -1
- package/dist/chunk-ZFUPRODV.js.map +0 -1
- package/dist/chunk-ZJ6MEVTX.js.map +0 -1
- package/dist/chunk-ZOASYXBS.js.map +0 -1
- /package/dist/{chunk-52VL6LCY.js.map → chunk-2VH2JWYN.js.map} +0 -0
- /package/dist/{chunk-G4WZDQ32.js.map → chunk-3NG5OOCX.js.map} +0 -0
- /package/dist/{chunk-KG2OOAFF.js.map → chunk-3NTVCMDD.js.map} +0 -0
- /package/dist/{chunk-7OC3Q5X4.js.map → chunk-3S4R2HA5.js.map} +0 -0
- /package/dist/{chunk-NORFVW2H.js.map → chunk-4RWPQZYD.js.map} +0 -0
- /package/dist/{chunk-B5GMOOY2.js.map → chunk-5AABWM72.js.map} +0 -0
- /package/dist/{chunk-KRPMISWO.js.map → chunk-5C765XYU.js.map} +0 -0
- /package/dist/{chunk-XOLVM3AT.js.map → chunk-5WXJE5TV.js.map} +0 -0
- /package/dist/{chunk-2C5Z7CWB.js.map → chunk-6YTL3JYX.js.map} +0 -0
- /package/dist/{chunk-F4PEETM4.js.map → chunk-755VRFBS.js.map} +0 -0
- /package/dist/{chunk-HNOKNHFO.js.map → chunk-7L747CFR.js.map} +0 -0
- /package/dist/{chunk-WPGR3RW4.js.map → chunk-7VO6E5UD.js.map} +0 -0
- /package/dist/{chunk-LMLPLIT4.js.map → chunk-AQ6IBVFQ.js.map} +0 -0
- /package/dist/{chunk-XN4CPSCN.js.map → chunk-B2JE56NB.js.map} +0 -0
- /package/dist/{chunk-L4WBADKG.js.map → chunk-B5EZWPSM.js.map} +0 -0
- /package/dist/{chunk-EIU642TN.js.map → chunk-BE4GMH45.js.map} +0 -0
- /package/dist/{chunk-JTTLH646.js.map → chunk-C2W6JKQQ.js.map} +0 -0
- /package/dist/{chunk-FG5QU7A2.js.map → chunk-CFCAFAJC.js.map} +0 -0
- /package/dist/{chunk-M4PHCEPU.js.map → chunk-DDY7LJMP.js.map} +0 -0
- /package/dist/{chunk-2L5DIVDU.js.map → chunk-DT33WNG2.js.map} +0 -0
- /package/dist/{chunk-SZAWZPY6.js.map → chunk-E7SKAUEW.js.map} +0 -0
- /package/dist/{chunk-NRVGODSE.js.map → chunk-EK4MOTHM.js.map} +0 -0
- /package/dist/{chunk-QEGKMZNQ.js.map → chunk-FO5NDQZH.js.map} +0 -0
- /package/dist/{chunk-GMHWCPLP.js.map → chunk-GZLSIPYU.js.map} +0 -0
- /package/dist/{chunk-SEHKTE4F.js.map → chunk-I4IKTNZP.js.map} +0 -0
- /package/dist/{chunk-W65KK3X6.js.map → chunk-II4TIQCU.js.map} +0 -0
- /package/dist/{chunk-FWVDTLRK.js.map → chunk-IJQEVNEF.js.map} +0 -0
- /package/dist/{chunk-KXJ7XYUT.js.map → chunk-IOUQUXHO.js.map} +0 -0
- /package/dist/{chunk-V3JM4XEI.js.map → chunk-ITLFUILH.js.map} +0 -0
- /package/dist/{chunk-ZNFHWNDM.js.map → chunk-IULYVB5X.js.map} +0 -0
- /package/dist/{chunk-Z3YQOV45.js.map → chunk-JLU7WK22.js.map} +0 -0
- /package/dist/{chunk-NRTVZSPO.js.map → chunk-L4HT5QZ5.js.map} +0 -0
- /package/dist/{chunk-5QZHDS4X.js.map → chunk-LI4IWBLN.js.map} +0 -0
- /package/dist/{chunk-LY3SDHMI.js.map → chunk-LQ4OSM5V.js.map} +0 -0
- /package/dist/{chunk-2OUSWDY6.js.map → chunk-M3TMVHQ2.js.map} +0 -0
- /package/dist/{chunk-IDRSTHVR.js.map → chunk-MB3HMRXM.js.map} +0 -0
- /package/dist/{chunk-4P3ZBL5E.js.map → chunk-MUGLJAZ3.js.map} +0 -0
- /package/dist/{chunk-4IFSMCRS.js.map → chunk-NYN4ZMPL.js.map} +0 -0
- /package/dist/{chunk-KV44HTMJ.js.map → chunk-OBD77TYC.js.map} +0 -0
- /package/dist/{chunk-GYNCJSQ7.js.map → chunk-OCEIHKH5.js.map} +0 -0
- /package/dist/{chunk-DC5CTLCZ.js.map → chunk-PSGRZFBH.js.map} +0 -0
- /package/dist/{chunk-FQGY7XB2.js.map → chunk-S52VKUUW.js.map} +0 -0
- /package/dist/{chunk-D7MAYFQP.js.map → chunk-S7LWX2PQ.js.map} +0 -0
- /package/dist/{chunk-TYP7GYRI.js.map → chunk-SB4ZWVKI.js.map} +0 -0
- /package/dist/{chunk-KVO2BTA4.js.map → chunk-T2YX56QI.js.map} +0 -0
- /package/dist/{chunk-G6NQ3L4T.js.map → chunk-T3FMRLWQ.js.map} +0 -0
- /package/dist/{chunk-CDQO5DCD.js.map → chunk-TO3G56GM.js.map} +0 -0
- /package/dist/{chunk-WEQZ5OYK.js.map → chunk-U6GKPSZH.js.map} +0 -0
- /package/dist/{chunk-XDH5MO6L.js.map → chunk-WZ33AIOP.js.map} +0 -0
- /package/dist/{chunk-TM7S5UHD.js.map → chunk-XDIFADVN.js.map} +0 -0
- /package/dist/{chunk-SVWYZXIL.js.map → chunk-XDOXR3U6.js.map} +0 -0
- /package/dist/{chunk-VKDWYDFQ.js.map → chunk-XGLBVYEA.js.map} +0 -0
- /package/dist/{chunk-5Y7VCE3A.js.map → chunk-XJNSOI23.js.map} +0 -0
- /package/dist/{chunk-LDP6LBDS.js.map → chunk-Y3AFTYK4.js.map} +0 -0
- /package/dist/{chunk-YL2W6NUG.js.map → chunk-YGJMMMPN.js.map} +0 -0
- /package/dist/{chunk-KIOXEHWF.js.map → chunk-YIDBKTZJ.js.map} +0 -0
- /package/dist/{chunk-F5ZCNJ3V.js.map → chunk-ZPPWW576.js.map} +0 -0
- /package/dist/{chunk-TQAXUYUE.js.map → chunk-ZSXSMVW6.js.map} +0 -0
- /package/dist/{chunk-6RD7MSIO.js.map → chunk-ZUT4FK5W.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/model-registry.ts"],"sourcesContent":["/**\n * Model Registry - Stores and retrieves model capabilities\n * Avoids repeated external lookups by caching model info locally\n */\n\nimport { log } from \"./logger.js\";\nimport fs from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface ModelCapabilities {\n modelId: string;\n maxPositionEmbeddings: number;\n contextWindow: number;\n supportsExtendedContext: boolean;\n ropeScaling?: {\n type: string;\n factor: number;\n originalMaxPositionEmbeddings: number;\n };\n typicalOutputTokens: number;\n source: \"huggingface\" | \"lmstudio\" | \"manual\" | \"default\";\n fetchedAt: string;\n}\n\ninterface ModelRegistryData {\n models: Record<string, ModelCapabilities>;\n version: number;\n}\n\nconst DEFAULT_CAPABILITIES: ModelCapabilities = {\n modelId: \"default\",\n maxPositionEmbeddings: 32768,\n contextWindow: 32768,\n supportsExtendedContext: false,\n typicalOutputTokens: 8192,\n source: \"default\",\n fetchedAt: new Date().toISOString(),\n};\n\n// Known model capabilities (fallback when offline)\n// NOTE: Context windows here are the MODEL's theoretical maximum. Local LLM servers\n// (LM Studio, Ollama, etc.) often load models with smaller default context windows.\n// If you get \"context length exceeded\" errors, either:\n// 1. Increase the context window in your LLM server UI (recommended)\n// 2. Set localLlmMaxContext in openclaw.json to limit prompts (fallback)\nconst KNOWN_MODELS: Record<string, Partial<ModelCapabilities>> = {\n \"qwen3-30b-a3b-instruct\": {\n maxPositionEmbeddings: 40960,\n contextWindow: 131072, // 128K with YaRN - but LM Studio defaults to ~32K\n supportsExtendedContext: true,\n ropeScaling: {\n type: \"yarn\",\n factor: 4.0,\n originalMaxPositionEmbeddings: 32768,\n },\n typicalOutputTokens: 8192,\n },\n \"qwen3-coder-30b-a3b-instruct\": {\n maxPositionEmbeddings: 40960,\n contextWindow: 131072, // 128K with YaRN - but LM Studio defaults to ~32K\n supportsExtendedContext: true,\n ropeScaling: {\n type: \"yarn\",\n factor: 4.0,\n originalMaxPositionEmbeddings: 32768,\n },\n typicalOutputTokens: 8192,\n },\n \"qwen3-8b\": {\n maxPositionEmbeddings: 40960,\n contextWindow: 131072,\n supportsExtendedContext: true,\n typicalOutputTokens: 4096,\n },\n \"qwen3-14b\": {\n maxPositionEmbeddings: 40960,\n contextWindow: 131072,\n supportsExtendedContext: true,\n typicalOutputTokens: 4096,\n },\n \"qwen3-32b\": {\n maxPositionEmbeddings: 40960,\n contextWindow: 131072,\n supportsExtendedContext: true,\n typicalOutputTokens: 4096,\n },\n \"llama-3.1\": {\n maxPositionEmbeddings: 131072,\n contextWindow: 131072,\n supportsExtendedContext: false,\n typicalOutputTokens: 8192,\n },\n \"llama-3.2\": {\n maxPositionEmbeddings: 131072,\n contextWindow: 131072,\n supportsExtendedContext: false,\n typicalOutputTokens: 8192,\n },\n \"mistral-nemo\": {\n maxPositionEmbeddings: 131072,\n contextWindow: 131072,\n supportsExtendedContext: false,\n typicalOutputTokens: 8192,\n },\n \"gemma-2\": {\n maxPositionEmbeddings: 8192,\n contextWindow: 8192,\n supportsExtendedContext: false,\n typicalOutputTokens: 4096,\n },\n};\n\nexport class ModelRegistry {\n private registryPath: string;\n private data: ModelRegistryData;\n private readonly CACHE_TTL_DAYS = 7;\n\n constructor(memoryDir: string) {\n const registryDir = join(memoryDir, \".registry\");\n if (!fs.existsSync(registryDir)) {\n fs.mkdirSync(registryDir, { recursive: true });\n }\n this.registryPath = join(registryDir, \"model-capabilities.json\");\n this.data = this.loadRegistry();\n }\n\n private loadRegistry(): ModelRegistryData {\n try {\n if (fs.existsSync(this.registryPath)) {\n const content = fs.readFileSync(this.registryPath, \"utf-8\");\n const data = JSON.parse(content) as ModelRegistryData;\n log.info(`ModelRegistry: loaded ${Object.keys(data.models).length} cached models`);\n return data;\n }\n } catch (err) {\n log.warn(`ModelRegistry: failed to load registry: ${err}`);\n }\n return { models: {}, version: 1 };\n }\n\n private saveRegistry(): void {\n try {\n fs.writeFileSync(this.registryPath, JSON.stringify(this.data, null, 2));\n } catch (err) {\n log.warn(`ModelRegistry: failed to save registry: ${err}`);\n }\n }\n\n private isCacheExpired(model: ModelCapabilities): boolean {\n const fetched = new Date(model.fetchedAt);\n const now = new Date();\n const daysDiff = (now.getTime() - fetched.getTime()) / (1000 * 60 * 60 * 24);\n return daysDiff > this.CACHE_TTL_DAYS;\n }\n\n private normalizeModelId(modelId: string): string {\n // Remove common suffixes and prefixes for matching\n return modelId\n .toLowerCase()\n .replace(/@\\d+bit$/, \"\") // Remove @4bit, @8bit\n .replace(/-mlx$/, \"\")\n .replace(/-awq$/, \"\")\n .replace(/-gptq$/, \"\")\n .replace(/-gguf$/, \"\")\n .replace(/^mlx-community\\//, \"\")\n .replace(/^models\\//, \"\")\n .trim();\n }\n\n /**\n * Get capabilities for a model, using cache if available\n */\n getCapabilities(modelId: string): ModelCapabilities {\n const normalizedId = this.normalizeModelId(modelId);\n\n // Check cache first\n if (this.data.models[normalizedId]) {\n const cached = this.data.models[normalizedId];\n if (!this.isCacheExpired(cached)) {\n log.info(`ModelRegistry: using cached capabilities for ${modelId}`);\n return cached;\n }\n log.info(`ModelRegistry: cache expired for ${modelId}, will refresh`);\n }\n\n // Check known models\n for (const [knownId, capabilities] of Object.entries(KNOWN_MODELS)) {\n if (normalizedId.includes(knownId)) {\n log.info(`ModelRegistry: using known capabilities for ${modelId}`);\n const caps: ModelCapabilities = {\n ...DEFAULT_CAPABILITIES,\n ...capabilities,\n modelId: normalizedId,\n source: \"default\",\n fetchedAt: new Date().toISOString(),\n };\n this.data.models[normalizedId] = caps;\n this.saveRegistry();\n return caps;\n }\n }\n\n // Return defaults\n log.info(`ModelRegistry: using default capabilities for ${modelId}`);\n return {\n ...DEFAULT_CAPABILITIES,\n modelId: normalizedId,\n };\n }\n\n /**\n * Store capabilities for a model\n */\n setCapabilities(modelId: string, capabilities: Omit<ModelCapabilities, \"modelId\" | \"fetchedAt\">): void {\n const normalizedId = this.normalizeModelId(modelId);\n const caps: ModelCapabilities = {\n ...capabilities,\n modelId: normalizedId,\n fetchedAt: new Date().toISOString(),\n };\n this.data.models[normalizedId] = caps;\n this.saveRegistry();\n log.info(`ModelRegistry: stored capabilities for ${modelId}`);\n }\n\n /**\n * Calculate optimal input/output sizes for a model\n * @param maxContextOverride - Optional override for max context (e.g., if LLM server defaults to smaller window)\n */\n calculateContextSizes(modelId: string, maxContextOverride?: number): {\n maxInputChars: number;\n maxOutputTokens: number;\n description: string;\n } {\n const caps = this.getCapabilities(modelId);\n\n // Use override if provided (e.g., user knows their LLM server limits), otherwise use detected caps\n const sanitizedOverride =\n typeof maxContextOverride === \"number\" &&\n Number.isFinite(maxContextOverride) &&\n Number.isInteger(maxContextOverride) &&\n maxContextOverride >= 1024\n ? maxContextOverride\n : undefined;\n const effectiveContextWindow = sanitizedOverride ?? Math.max(1024, Math.floor(caps.contextWindow));\n\n // Guardrails: never allow output budget to exceed the model/server context window.\n // If we do, input budget goes negative and we end up generating huge, invalid prompts.\n const overheadTokens = Math.min(1000, Math.floor(effectiveContextWindow / 10)); // <=10% overhead, max 1k\n const minInputTokens = Math.min(512, Math.floor(effectiveContextWindow / 4)); // keep some room even on small contexts\n const minOutputTokens = Math.min(256, Math.max(1, effectiveContextWindow - overheadTokens - minInputTokens));\n\n // Base output budget: typical output, but scaled down for small contexts.\n let outputTokens = caps.typicalOutputTokens;\n\n // For very large contexts, default to ~12.5% output (capped), which tends to be plenty for JSON extraction.\n if (effectiveContextWindow > 65536) {\n outputTokens = Math.min(Math.floor(effectiveContextWindow / 8), 16384);\n }\n\n // Never let output exceed 25% of context.\n outputTokens = Math.min(outputTokens, Math.floor(effectiveContextWindow / 4));\n\n // Clamp output so we always have positive input headroom.\n const maxOutputTokens = Math.max(1, effectiveContextWindow - overheadTokens - minInputTokens);\n outputTokens = Math.min(maxOutputTokens, Math.max(minOutputTokens, outputTokens));\n\n const availableForInput = Math.max(\n 0,\n effectiveContextWindow - outputTokens - overheadTokens,\n );\n\n // Convert to characters (rough estimate: 1 token ≈ 4 chars)\n const maxInputChars = Math.max(0, Math.floor(availableForInput * 3.5)); // Conservative: 3.5 chars/token\n\n const source = sanitizedOverride ? \"user override\" : caps.source;\n return {\n maxInputChars,\n maxOutputTokens: outputTokens,\n description: `${caps.modelId}: ${effectiveContextWindow.toLocaleString()} context (${source}), using ${maxInputChars.toLocaleString()} chars input / ${outputTokens} tokens output`,\n };\n }\n\n /**\n * Fetch capabilities from Hugging Face (if available)\n * Returns true if successful\n */\n async fetchFromHuggingFace(modelId: string): Promise<boolean> {\n // This would be implemented to fetch from HF Hub API\n // For now, we rely on the known models and manual updates\n log.info(`ModelRegistry: fetchFromHuggingFace not yet implemented for ${modelId}`);\n return false;\n }\n\n /**\n * List all cached models\n */\n listCached(): string[] {\n return Object.keys(this.data.models);\n }\n\n /**\n * Clear expired cache entries\n */\n cleanExpired(): number {\n const before = Object.keys(this.data.models).length;\n this.data.models = Object.fromEntries(\n Object.entries(this.data.models).filter(([_, caps]) => !this.isCacheExpired(caps))\n );\n const after = Object.keys(this.data.models).length;\n const removed = before - after;\n if (removed > 0) {\n this.saveRegistry();\n log.info(`ModelRegistry: cleaned ${removed} expired entries`);\n }\n return removed;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/recall-composition-decision.ts"],"sourcesContent":["/**\n * Recall composition decision (#2972 layer 2).\n *\n * Extracted from recall-internal so that file stays under its ratchet\n * ceiling. Classifies injected memory context as complete / degraded /\n * missing, builds the compact (first-line) form from section buckets,\n * and turns outer-recall failures into the missing-note instead of \"\".\n */\n\nimport { isAbortError } from \"./abort-error.js\";\nimport {\n boundRecallContextComposition,\n composeMissingMemoryContext,\n composeRecallContext,\n RECALL_CONTEXT_SEPARATOR,\n type RecallContextComposition,\n} from \"./recall-context-composition.js\";\n\nexport type RecallCompositionChunk = string | { readonly content: string };\n\nexport interface DecideRecallContextCompositionInput {\n context: string;\n compactContext?: string;\n footer?: string;\n maxChars: number;\n}\n\nexport interface DecidedRecallContextComposition {\n composition: RecallContextComposition;\n context: string;\n truncated: boolean;\n}\n\nfunction firstLine(content: string): string {\n const trimmed = content.trim();\n if (trimmed.length === 0) return \"\";\n const newline = trimmed.indexOf(\"\\n\");\n return newline === -1 ? trimmed : trimmed.slice(0, newline).trimEnd();\n}\n\nfunction chunkContent(chunk: RecallCompositionChunk): string {\n return typeof chunk === \"string\" ? chunk : chunk.content;\n}\n\n/**\n * Shallow form of every section chunk: the first line of each entry,\n * so a budget miss prefers breadth-complete-but-shallow over a clipped\n * tail. Empty chunks contribute nothing.\n */\nexport function compactRecallContextFromBuckets(\n buckets: Iterable<readonly [unknown, readonly RecallCompositionChunk[]]>,\n): string {\n const sections: string[] = [];\n for (const [, chunks] of buckets) {\n const lines: string[] = [];\n for (const chunk of chunks) {\n const line = firstLine(chunkContent(chunk));\n if (line.length > 0) lines.push(line);\n }\n if (lines.length > 0) sections.push(lines.join(\"\\n\"));\n }\n return sections.join(RECALL_CONTEXT_SEPARATOR);\n}\n\nexport function decideRecallContextComposition(\n input: DecideRecallContextCompositionInput,\n): DecidedRecallContextComposition {\n const composition = boundRecallContextComposition({\n context: input.context,\n footer: input.footer,\n maxChars: input.maxChars,\n compactContext: input.compactContext,\n });\n return {\n composition,\n context: composeRecallContext(composition),\n truncated:\n composition.degradation?.reason === \"budget-clipped\" ||\n composition.degradation?.reason === \"budget-compacted\",\n };\n}\n\nexport function notifyContextComposition(\n onContextComposition:\n | ((composition: RecallContextComposition) => void | PromiseLike<void>)\n | undefined,\n composition: RecallContextComposition,\n onError: (err: unknown) => void,\n): void {\n if (!onContextComposition) return;\n try {\n const result = onContextComposition(composition);\n if (result && typeof result.then === \"function\") {\n void Promise.resolve(result).catch(onError);\n }\n } catch (err) {\n onError(err);\n }\n}\n\n/**\n * Outer-recall failure: abort stays silent (empty string). Timeout and\n * other errors become the missing-note so a failed query is never\n * indistinguishable from \"no matches\".\n */\nexport function recallFailureComposition(err: unknown): RecallContextComposition | null {\n if (isAbortError(err)) return null;\n const detail =\n err instanceof Error && err.message === \"recall timeout\"\n ? \"timeout\"\n : \"recall_failed\";\n return composeMissingMemoryContext({ detail });\n}\n"],"mappings":";;;;;;;;;;;AAiCA,SAAS,UAAU,SAAyB;AAC1C,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,QAAM,UAAU,QAAQ,QAAQ,IAAI;AACpC,SAAO,YAAY,KAAK,UAAU,QAAQ,MAAM,GAAG,OAAO,EAAE,QAAQ;AACtE;AAEA,SAAS,aAAa,OAAuC;AAC3D,SAAO,OAAO,UAAU,WAAW,QAAQ,MAAM;AACnD;AAOO,SAAS,gCACd,SACQ;AACR,QAAM,WAAqB,CAAC;AAC5B,aAAW,CAAC,EAAE,MAAM,KAAK,SAAS;AAChC,UAAM,QAAkB,CAAC;AACzB,eAAW,SAAS,QAAQ;AAC1B,YAAM,OAAO,UAAU,aAAa,KAAK,CAAC;AAC1C,UAAI,KAAK,SAAS,EAAG,OAAM,KAAK,IAAI;AAAA,IACtC;AACA,QAAI,MAAM,SAAS,EAAG,UAAS,KAAK,MAAM,KAAK,IAAI,CAAC;AAAA,EACtD;AACA,SAAO,SAAS,KAAK,wBAAwB;AAC/C;AAEO,SAAS,+BACd,OACiC;AACjC,QAAM,cAAc,8BAA8B;AAAA,IAChD,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,UAAU,MAAM;AAAA,IAChB,gBAAgB,MAAM;AAAA,EACxB,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA,SAAS,qBAAqB,WAAW;AAAA,IACzC,WACE,YAAY,aAAa,WAAW,oBACpC,YAAY,aAAa,WAAW;AAAA,EACxC;AACF;AAEO,SAAS,yBACd,sBAGA,aACA,SACM;AACN,MAAI,CAAC,qBAAsB;AAC3B,MAAI;AACF,UAAM,SAAS,qBAAqB,WAAW;AAC/C,QAAI,UAAU,OAAO,OAAO,SAAS,YAAY;AAC/C,WAAK,QAAQ,QAAQ,MAAM,EAAE,MAAM,OAAO;AAAA,IAC5C;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,GAAG;AAAA,EACb;AACF;AAOO,SAAS,yBAAyB,KAA+C;AACtF,MAAI,aAAa,GAAG,EAAG,QAAO;AAC9B,QAAM,SACJ,eAAe,SAAS,IAAI,YAAY,mBACpC,YACA;AACN,SAAO,4BAA4B,EAAE,OAAO,CAAC;AAC/C;","names":[]}
|