@bendyline/gezel-inference 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +13 -2
- package/dist/cache/adapter.d.ts +115 -0
- package/dist/cache/adapter.js +23 -0
- package/dist/cache/budget.d.ts +15 -0
- package/dist/cache/budget.js +31 -0
- package/dist/cache/controller.d.ts +205 -0
- package/dist/cache/controller.js +377 -0
- package/dist/catalog/LICENSE +21 -0
- package/dist/catalog/chat-models/bt/btl4-35b-q4/manifest.json +146 -0
- package/dist/catalog/chat-models/bt/btl4-35b-q4/versions/1.0.0/manifest.json +15 -0
- package/dist/catalog/chat-models/bt/btl4-35b-q4/versions/1.0.1/manifest.json +15 -0
- package/dist/catalog/chat-models/bt/btl4-compact-iq2/manifest.json +146 -0
- package/dist/catalog/chat-models/bt/btl4-compact-iq2/versions/1.0.0/manifest.json +15 -0
- package/dist/catalog/chat-models/bt/btl4-compact-iq2/versions/1.0.1/manifest.json +15 -0
- package/dist/catalog/chat-models/bt/btl4-compact-iq2/versions/1.0.2/manifest.json +15 -0
- package/dist/catalog/chat-models/de/deepseek-r1-8b-q4/manifest.json +166 -0
- package/dist/catalog/chat-models/de/deepseek-r1-8b-q4/versions/1.1.0/manifest.json +62 -0
- package/dist/catalog/chat-models/de/deepseek-r1-8b-q4/versions/1.1.1/manifest.json +61 -0
- package/dist/catalog/chat-models/de/deepseek-v4-flash-284b-mxfp4/manifest.json +125 -0
- package/dist/catalog/chat-models/de/deepseek-v4-flash-284b-mxfp4/versions/1.0.0/manifest.json +27 -0
- package/dist/catalog/chat-models/de/deepseek-v4-flash-284b-q2/manifest.json +125 -0
- package/dist/catalog/chat-models/de/deepseek-v4-flash-284b-q2/versions/1.0.0/manifest.json +27 -0
- package/dist/catalog/chat-models/de/deepseek-v4-flash-284b-q2/versions/1.1.0/manifest.json +27 -0
- package/dist/catalog/chat-models/de/deepseek-v4-flash-284b-q2q4/manifest.json +126 -0
- package/dist/catalog/chat-models/de/deepseek-v4-flash-284b-q2q4/versions/1.0.0/manifest.json +27 -0
- package/dist/catalog/chat-models/de/deepseek-v4-flash-284b-q4/manifest.json +318 -0
- package/dist/catalog/chat-models/de/deepseek-v4-flash-284b-q4/versions/1.0.0/manifest.json +225 -0
- package/dist/catalog/chat-models/de/deepseek-v4-flash-284b-q4/versions/1.1.0/manifest.json +225 -0
- package/dist/catalog/chat-models/ge/gemma4-12b-q4/manifest.json +249 -0
- package/dist/catalog/chat-models/ge/gemma4-12b-q4/versions/1.0.0/manifest.json +70 -0
- package/dist/catalog/chat-models/ge/gemma4-12b-q4/versions/1.1.0/manifest.json +72 -0
- package/dist/catalog/chat-models/ge/gemma4-12b-q4/versions/1.1.2/manifest.json +78 -0
- package/dist/catalog/chat-models/ge/gemma4-12b-q4/versions/1.1.3/manifest.json +78 -0
- package/dist/catalog/chat-models/ge/gemma4-12b-q4/versions/1.2.0/manifest.json +98 -0
- package/dist/catalog/chat-models/ge/gemma4-12b-q8/manifest.json +228 -0
- package/dist/catalog/chat-models/ge/gemma4-12b-q8/versions/1.0.0/manifest.json +72 -0
- package/dist/catalog/chat-models/ge/gemma4-12b-q8/versions/1.0.2/manifest.json +78 -0
- package/dist/catalog/chat-models/ge/gemma4-12b-q8/versions/1.0.3/manifest.json +78 -0
- package/dist/catalog/chat-models/ge/gemma4-12b-q8/versions/1.1.0/manifest.json +78 -0
- package/dist/catalog/chat-models/ge/gemma4-26b-q4/manifest.json +220 -0
- package/dist/catalog/chat-models/ge/gemma4-26b-q4/versions/1.1.0/manifest.json +75 -0
- package/dist/catalog/chat-models/ge/gemma4-26b-q4/versions/1.2.0/manifest.json +75 -0
- package/dist/catalog/chat-models/ge/gemma4-26b-q4/versions/1.2.1/manifest.json +80 -0
- package/dist/catalog/chat-models/ge/gemma4-26b-q4/versions/1.2.2/manifest.json +80 -0
- package/dist/catalog/chat-models/ge/gemma4-26b-q4/versions/1.3.0/manifest.json +81 -0
- package/dist/catalog/chat-models/ge/gemma4-31b-q4/manifest.json +226 -0
- package/dist/catalog/chat-models/ge/gemma4-31b-q4/versions/1.1.0/manifest.json +80 -0
- package/dist/catalog/chat-models/ge/gemma4-31b-q4/versions/1.1.1/manifest.json +82 -0
- package/dist/catalog/chat-models/ge/gemma4-31b-q4/versions/1.2.0/manifest.json +82 -0
- package/dist/catalog/chat-models/ge/gemma4-31b-q4/versions/1.2.1/manifest.json +95 -0
- package/dist/catalog/chat-models/ge/gemma4-31b-q4/versions/1.2.2/manifest.json +95 -0
- package/dist/catalog/chat-models/ge/gemma4-31b-q4/versions/1.3.0/manifest.json +86 -0
- package/dist/catalog/chat-models/ge/gemma4-e2b-q4/manifest.json +213 -0
- package/dist/catalog/chat-models/ge/gemma4-e2b-q4/versions/1.1.0/manifest.json +67 -0
- package/dist/catalog/chat-models/ge/gemma4-e2b-q4/versions/1.1.2/manifest.json +75 -0
- package/dist/catalog/chat-models/ge/gemma4-e2b-q4/versions/1.2.0/manifest.json +71 -0
- package/dist/catalog/chat-models/ge/gemma4-e2b-q4/versions/1.2.1/manifest.json +71 -0
- package/dist/catalog/chat-models/ge/gemma4-e2b-q4/versions/1.3.0/manifest.json +71 -0
- package/dist/catalog/chat-models/ge/gemma4-e4b-q4/manifest.json +205 -0
- package/dist/catalog/chat-models/ge/gemma4-e4b-q4/versions/1.1.0/manifest.json +72 -0
- package/dist/catalog/chat-models/ge/gemma4-e4b-q4/versions/1.1.2/manifest.json +75 -0
- package/dist/catalog/chat-models/ge/gemma4-e4b-q4/versions/1.2.0/manifest.json +76 -0
- package/dist/catalog/chat-models/ge/gemma4-e4b-q4/versions/1.2.1/manifest.json +76 -0
- package/dist/catalog/chat-models/ge/gemma4-e4b-q4/versions/1.3.0/manifest.json +76 -0
- package/dist/catalog/chat-models/gl/glm-5.2-754b-q2/manifest.json +127 -0
- package/dist/catalog/chat-models/gl/glm-5.2-754b-q2/versions/1.0.0/manifest.json +20 -0
- package/dist/catalog/chat-models/gl/glm-5.3-flash-320b-q2/manifest.json +140 -0
- package/dist/catalog/chat-models/gl/glm-5.3-flash-320b-q2/versions/1.0.0/manifest.json +23 -0
- package/dist/catalog/chat-models/gl/glm-5.3-flash-320b-q2/versions/1.0.1/manifest.json +26 -0
- package/dist/catalog/chat-models/gp/gpt-oss-120b-q4/manifest.json +247 -0
- package/dist/catalog/chat-models/gp/gpt-oss-120b-q4/versions/1.0.0/manifest.json +137 -0
- package/dist/catalog/chat-models/gp/gpt-oss-120b-q4/versions/1.1.0/manifest.json +135 -0
- package/dist/catalog/chat-models/gp/gpt-oss-20b-q4/manifest.json +195 -0
- package/dist/catalog/chat-models/gp/gpt-oss-20b-q4/versions/1.1.0/manifest.json +72 -0
- package/dist/catalog/chat-models/gp/gpt-oss-20b-q4/versions/1.1.1/manifest.json +71 -0
- package/dist/catalog/chat-models/gr/granite4.2-30b-q4/manifest.json +200 -0
- package/dist/catalog/chat-models/gr/granite4.2-30b-q4/versions/1.0.0/manifest.json +72 -0
- package/dist/catalog/chat-models/gr/granite4.2-3b-q4/manifest.json +196 -0
- package/dist/catalog/chat-models/gr/granite4.2-3b-q4/versions/1.0.0/manifest.json +57 -0
- package/dist/catalog/chat-models/gr/granite4.2-8b-q4/manifest.json +189 -0
- package/dist/catalog/chat-models/gr/granite4.2-8b-q4/versions/1.0.0/manifest.json +57 -0
- package/dist/catalog/chat-models/index.json +1 -0
- package/dist/catalog/chat-models/la/laguna-s-2.1-118b-q4/manifest.json +235 -0
- package/dist/catalog/chat-models/la/laguna-s-2.1-118b-q4/versions/1.0.0/manifest.json +124 -0
- package/dist/catalog/chat-models/la/laguna-s-2.1-118b-q4/versions/1.0.1/manifest.json +124 -0
- package/dist/catalog/chat-models/la/laguna-s-2.1-118b-q4/versions/1.0.2/manifest.json +123 -0
- package/dist/catalog/chat-models/la/laguna-s-2.1-118b-q6/manifest.json +257 -0
- package/dist/catalog/chat-models/la/laguna-s-2.1-118b-q6/versions/1.0.0/manifest.json +145 -0
- package/dist/catalog/chat-models/la/laguna-s-2.1-118b-q6/versions/1.0.1/manifest.json +145 -0
- package/dist/catalog/chat-models/la/laguna-s-2.1-118b-q8/manifest.json +285 -0
- package/dist/catalog/chat-models/la/laguna-s-2.1-118b-q8/versions/1.0.0/manifest.json +174 -0
- package/dist/catalog/chat-models/la/laguna-s-2.1-118b-q8/versions/1.0.1/manifest.json +174 -0
- package/dist/catalog/chat-models/la/laguna-s-2.1-118b-q8/versions/1.0.2/manifest.json +173 -0
- package/dist/catalog/chat-models/lf/lfm2.5-2.6b-q4/manifest.json +162 -0
- package/dist/catalog/chat-models/lf/lfm2.5-2.6b-q4/versions/1.0.0/manifest.json +59 -0
- package/dist/catalog/chat-models/lf/lfm2.5-2.6b-q4/versions/1.0.1/manifest.json +58 -0
- package/dist/catalog/chat-models/ll/llama3.2-3b-q4/manifest.json +134 -0
- package/dist/catalog/chat-models/ll/llama3.2-3b-q4/versions/1.1.0/manifest.json +57 -0
- package/dist/catalog/chat-models/ll/llama3.2-3b-q4/versions/1.1.1/manifest.json +56 -0
- package/dist/catalog/chat-models/mi/minicpm5-1b-q4/manifest.json +156 -0
- package/dist/catalog/chat-models/mi/minicpm5-1b-q4/versions/1.0.0/manifest.json +57 -0
- package/dist/catalog/chat-models/mi/minicpm5-2b-q4/manifest.json +161 -0
- package/dist/catalog/chat-models/mi/minicpm5-2b-q4/versions/1.0.0/manifest.json +57 -0
- package/dist/catalog/chat-models/mi/mistral-7b-q4/manifest.json +159 -0
- package/dist/catalog/chat-models/mi/mistral-7b-q4/versions/1.1.0/manifest.json +62 -0
- package/dist/catalog/chat-models/mi/mistral-7b-q4/versions/1.1.1/manifest.json +61 -0
- package/dist/catalog/chat-models/mi/mistral-medium-3.5-128b-q4/manifest.json +275 -0
- package/dist/catalog/chat-models/mi/mistral-medium-3.5-128b-q4/versions/1.0.0/manifest.json +154 -0
- package/dist/catalog/chat-models/mi/mistral-medium-3.5-128b-q4/versions/1.0.1/manifest.json +153 -0
- package/dist/catalog/chat-models/mu/muse-glimmer-30b-q4/manifest.json +135 -0
- package/dist/catalog/chat-models/mu/muse-glimmer-30b-q4/versions/1.0.0/manifest.json +20 -0
- package/dist/catalog/chat-models/mu/muse-glimmer-30b-q4/versions/1.0.1/manifest.json +20 -0
- package/dist/catalog/chat-models/mu/muse-glimmer-30b-q4/versions/1.0.2/manifest.json +20 -0
- package/dist/catalog/chat-models/na/nanbeige4.2-3b-q4/manifest.json +138 -0
- package/dist/catalog/chat-models/na/nanbeige4.2-3b-q4/versions/1.0.0/manifest.json +14 -0
- package/dist/catalog/chat-models/ne/nemotron3-nano-30b-q4/manifest.json +212 -0
- package/dist/catalog/chat-models/ne/nemotron3-nano-30b-q4/versions/1.0.0/manifest.json +94 -0
- package/dist/catalog/chat-models/ne/nemotron3-nano-30b-q4/versions/1.0.1/manifest.json +94 -0
- package/dist/catalog/chat-models/ne/nemotron3-nano-30b-q4/versions/1.0.2/manifest.json +93 -0
- package/dist/catalog/chat-models/ne/nemotron3-super-120b-q4/manifest.json +135 -0
- package/dist/catalog/chat-models/ne/nemotron3-super-120b-q4/versions/1.0.0/manifest.json +30 -0
- package/dist/catalog/chat-models/ne/nemotron3-super-120b-q4/versions/1.0.1/manifest.json +30 -0
- package/dist/catalog/chat-models/ne/nemotron3.5-lightning-30b-q4/manifest.json +192 -0
- package/dist/catalog/chat-models/ne/nemotron3.5-lightning-30b-q4/versions/1.0.0/manifest.json +74 -0
- package/dist/catalog/chat-models/ne/nemotron3.5-lightning-30b-q4/versions/1.0.1/manifest.json +73 -0
- package/dist/catalog/chat-models/ne/nemotron3.5-lightning-30b-q8/manifest.json +207 -0
- package/dist/catalog/chat-models/ne/nemotron3.5-lightning-30b-q8/versions/1.0.0/manifest.json +89 -0
- package/dist/catalog/chat-models/ne/nemotron3.5-lightning-30b-q8/versions/1.0.1/manifest.json +88 -0
- package/dist/catalog/chat-models/or/ornith-35b-q4/manifest.json +224 -0
- package/dist/catalog/chat-models/or/ornith-35b-q4/versions/1.0.0/manifest.json +94 -0
- package/dist/catalog/chat-models/or/ornith-35b-q4/versions/1.0.1/manifest.json +93 -0
- package/dist/catalog/chat-models/or/ornith-35b-q8/manifest.json +244 -0
- package/dist/catalog/chat-models/or/ornith-35b-q8/versions/1.0.0/manifest.json +114 -0
- package/dist/catalog/chat-models/or/ornith-35b-q8/versions/1.0.1/manifest.json +113 -0
- package/dist/catalog/chat-models/or/ornith-9b-q4/manifest.json +215 -0
- package/dist/catalog/chat-models/or/ornith-9b-q4/versions/1.0.0/manifest.json +84 -0
- package/dist/catalog/chat-models/or/ornith-9b-q4/versions/1.0.1/manifest.json +83 -0
- package/dist/catalog/chat-models/or/ornith1.5-35b-a3b-q4/manifest.json +208 -0
- package/dist/catalog/chat-models/or/ornith1.5-35b-a3b-q4/versions/1.0.0/manifest.json +74 -0
- package/dist/catalog/chat-models/or/ornith1.5-35b-a3b-q8/manifest.json +223 -0
- package/dist/catalog/chat-models/or/ornith1.5-35b-a3b-q8/versions/1.0.0/manifest.json +89 -0
- package/dist/catalog/chat-models/or/ornith1.5-9b-q4/manifest.json +187 -0
- package/dist/catalog/chat-models/or/ornith1.5-9b-q4/versions/1.0.0/manifest.json +53 -0
- package/dist/catalog/chat-models/or/ornith1.5-9b-q4/versions/1.0.1/manifest.json +77 -0
- package/dist/catalog/chat-models/or/ornith1.5-9b-q8/manifest.json +192 -0
- package/dist/catalog/chat-models/or/ornith1.5-9b-q8/versions/1.0.0/manifest.json +58 -0
- package/dist/catalog/chat-models/or/ornith1.5-9b-q8/versions/1.0.1/manifest.json +82 -0
- package/dist/catalog/chat-models/qw/qwen3.5-0.8b-q4/manifest.json +192 -0
- package/dist/catalog/chat-models/qw/qwen3.5-0.8b-q4/versions/1.0.0/manifest.json +75 -0
- package/dist/catalog/chat-models/qw/qwen3.5-122b-a10b-q4/manifest.json +315 -0
- package/dist/catalog/chat-models/qw/qwen3.5-122b-a10b-q4/versions/1.0.0/manifest.json +164 -0
- package/dist/catalog/chat-models/qw/qwen3.5-122b-a10b-q4/versions/1.0.1/manifest.json +164 -0
- package/dist/catalog/chat-models/qw/qwen3.5-122b-a10b-q4/versions/1.0.2/manifest.json +164 -0
- package/dist/catalog/chat-models/qw/qwen3.5-122b-a10b-q4/versions/1.0.3/manifest.json +163 -0
- package/dist/catalog/chat-models/qw/qwen3.5-27b-q4/manifest.json +217 -0
- package/dist/catalog/chat-models/qw/qwen3.5-27b-q4/versions/1.0.0/manifest.json +90 -0
- package/dist/catalog/chat-models/qw/qwen3.5-2b-q4/manifest.json +194 -0
- package/dist/catalog/chat-models/qw/qwen3.5-2b-q4/versions/1.1.0/manifest.json +77 -0
- package/dist/catalog/chat-models/qw/qwen3.5-2b-q4/versions/1.1.2/manifest.json +76 -0
- package/dist/catalog/chat-models/qw/qwen3.5-2b-q4/versions/1.1.3/manifest.json +76 -0
- package/dist/catalog/chat-models/qw/qwen3.5-4b-q4/manifest.json +188 -0
- package/dist/catalog/chat-models/qw/qwen3.5-4b-q4/versions/1.1.0/manifest.json +77 -0
- package/dist/catalog/chat-models/qw/qwen3.5-4b-q4/versions/1.1.2/manifest.json +76 -0
- package/dist/catalog/chat-models/qw/qwen3.5-4b-q4/versions/1.1.3/manifest.json +76 -0
- package/dist/catalog/chat-models/qw/qwen3.5-9b-q4/manifest.json +205 -0
- package/dist/catalog/chat-models/qw/qwen3.5-9b-q4/versions/1.1.0/manifest.json +82 -0
- package/dist/catalog/chat-models/qw/qwen3.5-9b-q4/versions/1.1.2/manifest.json +81 -0
- package/dist/catalog/chat-models/qw/qwen3.5-9b-q4/versions/1.1.3/manifest.json +81 -0
- package/dist/catalog/chat-models/qw/qwen3.6-27b-q4/manifest.json +230 -0
- package/dist/catalog/chat-models/qw/qwen3.6-27b-q4/versions/1.1.0/manifest.json +92 -0
- package/dist/catalog/chat-models/qw/qwen3.6-27b-q4/versions/1.1.4/manifest.json +91 -0
- package/dist/catalog/chat-models/qw/qwen3.6-27b-q4/versions/1.1.5/manifest.json +91 -0
- package/dist/catalog/chat-models/qw/qwen3.6-27b-q4/versions/1.1.6/manifest.json +115 -0
- package/dist/catalog/chat-models/qw/qwen3.6-27b-q8/manifest.json +240 -0
- package/dist/catalog/chat-models/qw/qwen3.6-27b-q8/versions/1.0.0/manifest.json +102 -0
- package/dist/catalog/chat-models/qw/qwen3.6-27b-q8/versions/1.0.2/manifest.json +103 -0
- package/dist/catalog/chat-models/qw/qwen3.6-27b-q8/versions/1.0.3/manifest.json +103 -0
- package/dist/catalog/chat-models/qw/qwen3.6-27b-q8/versions/1.0.4/manifest.json +127 -0
- package/dist/catalog/chat-models/qw/qwen3.6-35b-a3b-q4/manifest.json +233 -0
- package/dist/catalog/chat-models/qw/qwen3.6-35b-a3b-q4/versions/1.0.0/manifest.json +92 -0
- package/dist/catalog/chat-models/qw/qwen3.6-35b-a3b-q4/versions/1.0.1/manifest.json +93 -0
- package/dist/catalog/chat-models/qw/qwen3.6-35b-a3b-q4/versions/1.0.2/manifest.json +93 -0
- package/dist/catalog/chat-models/qw/qwen3.6-35b-a3b-q4/versions/1.0.3/manifest.json +117 -0
- package/dist/catalog/chat-models/qw/qwen3.6-35b-a3b-q8/manifest.json +252 -0
- package/dist/catalog/chat-models/qw/qwen3.6-35b-a3b-q8/versions/1.0.0/manifest.json +112 -0
- package/dist/catalog/chat-models/qw/qwen3.6-35b-a3b-q8/versions/1.0.1/manifest.json +113 -0
- package/dist/catalog/chat-models/qw/qwen3.6-35b-a3b-q8/versions/1.0.2/manifest.json +113 -0
- package/dist/catalog/chat-models/qw/qwen3.6-35b-a3b-q8/versions/1.0.3/manifest.json +137 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-iq1-s/manifest.json +195 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-iq1-s/versions/1.0.0/manifest.json +19 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q2/manifest.json +194 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q2/versions/1.0.0/manifest.json +19 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q3/manifest.json +194 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q3/versions/1.0.0/manifest.json +19 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q3/versions/1.0.1/manifest.json +19 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q4/manifest.json +291 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q4/versions/1.0.0/manifest.json +20 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q4/versions/1.0.1/manifest.json +93 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q4/versions/1.0.2/manifest.json +92 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q4/versions/1.0.3/manifest.json +116 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q4/versions/1.0.4/manifest.json +116 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q4/versions/1.0.5/manifest.json +116 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q6/manifest.json +278 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q6/versions/1.0.0/manifest.json +20 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q6/versions/1.0.1/manifest.json +104 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q6/versions/1.0.2/manifest.json +103 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q6/versions/1.0.3/manifest.json +127 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q8/manifest.json +278 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q8/versions/1.0.0/manifest.json +113 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q8/versions/1.0.1/manifest.json +113 -0
- package/dist/catalog/chat-models/qw/qwen3.8-27b-q8/versions/1.0.2/manifest.json +137 -0
- package/dist/catalog/chat-models/qw/qwen3.8-flash-next-iq3/manifest.json +221 -0
- package/dist/catalog/chat-models/qw/qwen3.8-flash-next-iq3/versions/1.0.0/manifest.json +36 -0
- package/dist/catalog/chat-models/qw/qwen3.8-flash-next-iq4/manifest.json +429 -0
- package/dist/catalog/chat-models/qw/qwen3.8-flash-next-iq4/versions/1.0.0/manifest.json +36 -0
- package/dist/catalog/chat-models/qw/qwen3.8-flash-next-iq4/versions/1.1.0/manifest.json +205 -0
- package/dist/catalog/chat-models/qw/qwen3.8-flash-next-iq4/versions/1.1.1/manifest.json +244 -0
- package/dist/catalog/chat-models/qw/qwen3.8-flash-next-q2/manifest.json +203 -0
- package/dist/catalog/chat-models/qw/qwen3.8-flash-next-q2/versions/1.0.0/manifest.json +21 -0
- package/dist/catalog/chat-models/qw/qwen3.8-flash-next-q2/versions/1.0.1/manifest.json +31 -0
- package/dist/catalog/chat-models/qw/qwen3.8-flash-next-q2/versions/1.0.2/manifest.json +30 -0
- package/dist/catalog/chat-models/raw-index.json +1 -0
- package/dist/catalog/chat-models/ta/talkie-1930-13b-q4/manifest.json +79 -0
- package/dist/catalog/chat-models/ta/talkie-1930-13b-q4/versions/1.0.0/manifest.json +15 -0
- package/dist/catalog/chat-models/ta/talkie-1930-13b-q4/versions/1.0.1/manifest.json +15 -0
- package/dist/catalog/chat-models/te/ternary-bonsai-27b-q2/manifest.json +204 -0
- package/dist/catalog/chat-models/te/ternary-bonsai-27b-q2/versions/1.0.0/manifest.json +70 -0
- package/dist/catalog/chat-models/te/ternary-bonsai-27b-q2/versions/1.0.1/manifest.json +70 -0
- package/dist/catalog/chat-models/un/underdog-saluki-27b-iq2-mix/manifest.json +164 -0
- package/dist/catalog/chat-models/un/underdog-saluki-27b-iq2-mix/versions/1.0.0/manifest.json +14 -0
- package/dist/catalog/knowledge-catalogs/be/bendyline-how-to-books/manifest.json +26 -0
- package/dist/catalog/knowledge-catalogs/be/bendyline-how-to-books/versions/2026.10.8/manifest.json +8950 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-alaska-part-0001/manifest.json +24 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-alaska-part-0001/versions/2026.10.1/manifest.json +658 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-nevada-part-0001/manifest.json +24 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-nevada-part-0001/versions/2026.10.1/manifest.json +666 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-us-300-399-part-0001/manifest.json +24 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-us-300-399-part-0001/versions/2026.10.2/manifest.json +182 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-us-347-349/manifest.json +25 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-us-347-349/versions/2026.10.5/manifest.json +38 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-utah-part-0001/manifest.json +24 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-utah-part-0001/versions/2026.10.1/manifest.json +558 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-utah-part-0002/manifest.json +24 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-utah-part-0002/versions/2026.10.1/manifest.json +258 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0001/manifest.json +24 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0001/versions/2026.10.1/manifest.json +318 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0002/manifest.json +24 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0002/versions/2026.10.1/manifest.json +266 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0003/manifest.json +24 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0003/versions/2026.10.1/manifest.json +186 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0004/manifest.json +24 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0004/versions/2026.10.1/manifest.json +138 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0005/manifest.json +24 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-washington-part-0005/versions/2026.10.1/manifest.json +138 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-wyoming-part-0001/manifest.json +24 -0
- package/dist/catalog/knowledge-catalogs/ca/caselaw-wyoming-part-0001/versions/2026.10.3/manifest.json +626 -0
- package/dist/catalog/knowledge-catalogs/index.json +1 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-aspnet-core-en/manifest.json +22 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-aspnet-core-en/versions/2026.10.16/manifest.json +18270 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-ai-platform-en/manifest.json +23 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-ai-platform-en/versions/2026.10.16/manifest.json +1098 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-apps-compute-en/manifest.json +23 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-apps-compute-en/versions/2026.10.16/manifest.json +722 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-data-aiot-en/manifest.json +23 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-data-aiot-en/versions/2026.10.16/manifest.json +530 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-management-hybrid-en/manifest.json +23 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-management-hybrid-en/versions/2026.10.16/manifest.json +602 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-network-security-en/manifest.json +23 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-azure-network-security-en/versions/2026.10.16/manifest.json +250 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-dotnet-en/manifest.json +22 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-dotnet-en/versions/2026.10.16/manifest.json +16794 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-entity-framework-en/manifest.json +22 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-entity-framework-en/versions/2026.10.16/manifest.json +1106 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-microsoft-365-en/manifest.json +22 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-microsoft-365-en/versions/2026.10.16/manifest.json +234 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-powershell-en/manifest.json +22 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-powershell-en/versions/2026.10.16/manifest.json +522 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-sql-server-en/manifest.json +22 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-sql-server-en/versions/2026.10.16/manifest.json +1850 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-windows-apps-en/manifest.json +22 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-windows-apps-en/versions/2026.10.16/manifest.json +1734 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-windows-server-en/manifest.json +22 -0
- package/dist/catalog/knowledge-catalogs/mi/microsoftdocs-windows-server-en/versions/2026.10.16/manifest.json +774 -0
- package/dist/catalog/knowledge-catalogs/raw-index.json +1 -0
- package/dist/catalog/knowledge-catalogs/re/regional-american-south/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-american-south/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-american-south/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-american-south/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-andes-amazon/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-andes-amazon/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-andes-amazon/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-andes-amazon/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-australia-nz/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-australia-nz/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-australia-nz/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-australia-nz/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-brazil/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-brazil/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-brazil/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-brazil/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-britain-ireland/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-britain-ireland/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-britain-ireland/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-britain-ireland/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-california-southwest/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-california-southwest/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-california-southwest/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-california-southwest/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-canada-alaska/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-canada-alaska/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-canada-alaska/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-canada-alaska/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-central-eastern-europe/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-central-eastern-europe/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-central-eastern-europe/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-central-eastern-europe/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-east-asia/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-east-asia/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-east-asia/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-east-asia/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-east-southern-africa/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-east-southern-africa/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-east-southern-africa/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-east-southern-africa/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-mediterranean/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-mediterranean/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-mediterranean/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-mediterranean/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-mexico-central-america/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-mexico-central-america/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-mexico-central-america/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-mexico-central-america/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-middle-east/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-middle-east/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-middle-east/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-middle-east/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-midwest/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-midwest/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-midwest/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-midwest/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-north-africa/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-north-africa/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-north-africa/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-north-africa/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northeast/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northeast/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northeast/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northeast/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northern-eurasia/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northern-eurasia/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northern-eurasia/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northern-eurasia/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northern-europe/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northern-europe/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northern-europe/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-northern-europe/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-pacific-islands/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-pacific-islands/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-pacific-islands/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-pacific-islands/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-pacific-northwest/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-pacific-northwest/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-pacific-northwest/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-pacific-northwest/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-rockies-plains/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-rockies-plains/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-rockies-plains/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-rockies-plains/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-south-asia/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-south-asia/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-south-asia/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-south-asia/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-southeast-asia/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-southeast-asia/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-southeast-asia/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-southeast-asia/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-southern-cone/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-southern-cone/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-southern-cone/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-southern-cone/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-west-central-africa/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-west-central-africa/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-west-central-africa/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-west-central-africa/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/re/regional-western-europe/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/re/regional-western-europe/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/re/regional-western-europe/manifest.json +48 -0
- package/dist/catalog/knowledge-catalogs/re/regional-western-europe/versions/2026.10.3/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-arts/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-arts/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-arts/manifest.json +28 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-arts/versions/2026.4.2/manifest.json +53 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-arts/versions/2026.4.3/manifest.json +885 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-arts/versions/2026.4.5/manifest.json +157 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-astronomy/art.json +11 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-astronomy/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-astronomy/manifest.json +32 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-astronomy/versions/2026.4.2/manifest.json +69 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-astronomy/versions/2026.4.3/manifest.json +741 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-astronomy/versions/2026.4.5/manifest.json +173 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-biology/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-biology/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-biology/manifest.json +69 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-biology/versions/2026.4.4/manifest.json +217 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-biology/versions/2026.4.5/manifest.json +217 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-business/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-business/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-business/manifest.json +64 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-business/versions/2026.4.4/manifest.json +197 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-business/versions/2026.4.5/manifest.json +197 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-film-tv/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-film-tv/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-film-tv/manifest.json +64 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-film-tv/versions/2026.4.5/manifest.json +197 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-food-drink/art.json +11 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-food-drink/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-food-drink/manifest.json +29 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-food-drink/versions/2026.4.2/manifest.json +57 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-food-drink/versions/2026.4.3/manifest.json +925 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-food-drink/versions/2026.4.5/manifest.json +185 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-games/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-games/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-games/manifest.json +28 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-games/versions/2026.4.2/manifest.json +53 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-games/versions/2026.4.3/manifest.json +1665 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-games/versions/2026.4.5/manifest.json +133 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-language/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-language/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-language/manifest.json +29 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-language/versions/2026.4.2/manifest.json +57 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-language/versions/2026.4.3/manifest.json +1233 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-language/versions/2026.4.5/manifest.json +141 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-law/art.json +11 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-law/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-law/manifest.json +29 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-law/versions/2026.4.2/manifest.json +57 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-law/versions/2026.4.3/manifest.json +493 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-law/versions/2026.4.5/manifest.json +185 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-literature/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-literature/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-literature/manifest.json +63 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-literature/versions/2026.4.4/manifest.json +193 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-literature/versions/2026.4.5/manifest.json +193 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-mathematics/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-mathematics/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-mathematics/manifest.json +30 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-mathematics/versions/2026.4.2/manifest.json +61 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-mathematics/versions/2026.4.3/manifest.json +665 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-mathematics/versions/2026.4.5/manifest.json +177 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-medicine/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-medicine/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-medicine/manifest.json +29 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-medicine/versions/2026.4.2/manifest.json +57 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-medicine/versions/2026.4.3/manifest.json +745 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-medicine/versions/2026.4.5/manifest.json +185 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-military/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-military/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-military/manifest.json +62 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-military/versions/2026.4.4/manifest.json +189 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-military/versions/2026.4.5/manifest.json +189 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-music/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-music/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-music/manifest.json +64 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-music/versions/2026.4.5/manifest.json +197 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-politics/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-politics/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-politics/manifest.json +64 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-politics/versions/2026.4.4/manifest.json +197 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-politics/versions/2026.4.5/manifest.json +197 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-religion-philosophy/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-religion-philosophy/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-religion-philosophy/manifest.json +30 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-religion-philosophy/versions/2026.4.2/manifest.json +61 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-religion-philosophy/versions/2026.4.3/manifest.json +1253 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-religion-philosophy/versions/2026.4.5/manifest.json +189 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-science/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-science/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-science/manifest.json +29 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-science/versions/2026.4.2/manifest.json +57 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-science/versions/2026.4.3/manifest.json +1957 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-science/versions/2026.4.5/manifest.json +185 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-sports/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-sports/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-sports/manifest.json +63 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-sports/versions/2026.4.5/manifest.json +193 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-technology/art.json +11 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-technology/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-technology/manifest.json +45 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-technology/versions/2026.4.4/manifest.json +121 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-technology/versions/2026.4.5/manifest.json +173 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-transportation/art.json +12 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-transportation/logo.webp +0 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-transportation/manifest.json +62 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-transportation/versions/2026.4.4/manifest.json +189 -0
- package/dist/catalog/knowledge-catalogs/wi/wikipedia-transportation/versions/2026.4.5/manifest.json +189 -0
- package/dist/catalog/provenance.json +8 -0
- package/dist/chat/catalog-model-lookup.d.ts +21 -0
- package/dist/chat/catalog-model-lookup.js +48 -0
- package/dist/chat/local-model-tier.d.ts +1 -0
- package/dist/chat/local-model-tier.js +2 -0
- package/dist/chat/vision-capability.d.ts +1 -0
- package/dist/chat/vision-capability.js +3 -0
- package/dist/engine-components.d.ts +30 -0
- package/dist/engine-components.js +144 -0
- package/dist/engines/electron-native-reuse.d.ts +65 -0
- package/dist/engines/electron-native-reuse.js +305 -0
- package/dist/engines/native-file-manifest.json +1320 -0
- package/dist/engines/native-manifest.d.ts +70 -0
- package/dist/engines/native-manifest.js +98 -0
- package/dist/engines/registry.d.ts +88 -0
- package/dist/engines/registry.js +217 -0
- package/dist/engines/resolver.d.ts +121 -0
- package/dist/engines/resolver.js +894 -0
- package/dist/engines/signature.d.ts +85 -0
- package/dist/engines/signature.js +231 -0
- package/dist/fs/atomic.d.ts +53 -0
- package/dist/fs/atomic.js +202 -0
- package/dist/fs/config-store.d.ts +14 -0
- package/dist/fs/config-store.js +101 -0
- package/dist/fs/home-permissions.d.ts +18 -0
- package/dist/fs/home-permissions.js +27 -0
- package/dist/fs/safe-paths.d.ts +107 -0
- package/dist/fs/safe-paths.js +264 -0
- package/dist/fs/security-json.d.ts +13 -0
- package/dist/fs/security-json.js +67 -0
- package/dist/http/auth-context.d.ts +23 -0
- package/dist/http/auth-context.js +1 -0
- package/dist/http/engine-runtime-context.d.ts +30 -0
- package/dist/http/engine-runtime-context.js +1 -0
- package/dist/http/external-conversation-contract.d.ts +49 -0
- package/dist/http/external-conversation-contract.js +1 -0
- package/dist/http/external-conversation-headers.d.ts +11 -0
- package/dist/http/external-conversation-headers.js +11 -0
- package/dist/http/inference-context.d.ts +36 -0
- package/dist/http/inference-context.js +1 -0
- package/dist/http/model-inventory-cache.d.ts +8 -0
- package/dist/http/model-inventory-cache.js +8 -0
- package/dist/http/openai-compat/action-ledger.d.ts +15 -0
- package/dist/http/openai-compat/action-ledger.js +119 -0
- package/dist/http/openai-compat/apple-model.d.ts +3 -0
- package/dist/http/openai-compat/apple-model.js +44 -0
- package/dist/http/openai-compat/caller-owned-profile.d.ts +7 -0
- package/dist/http/openai-compat/caller-owned-profile.js +18 -0
- package/dist/http/openai-compat/chat-progress.d.ts +9 -0
- package/dist/http/openai-compat/chat-progress.js +69 -0
- package/dist/http/openai-compat/chat-target.d.ts +76 -0
- package/dist/http/openai-compat/chat-target.js +97 -0
- package/dist/http/openai-compat/embeddings.d.ts +37 -0
- package/dist/http/openai-compat/embeddings.js +86 -0
- package/dist/http/openai-compat/request-tuning.d.ts +35 -0
- package/dist/http/openai-compat/request-tuning.js +87 -0
- package/dist/http/openai-compat/responses-streaming.d.ts +351 -0
- package/dist/http/openai-compat/responses-streaming.js +717 -0
- package/dist/http/openai-compat/responses-translate.d.ts +215 -0
- package/dist/http/openai-compat/responses-translate.js +377 -0
- package/dist/http/openai-compat/streaming-telemetry.d.ts +30 -0
- package/dist/http/openai-compat/streaming-telemetry.js +88 -0
- package/dist/http/openai-compat/streaming.d.ts +141 -0
- package/dist/http/openai-compat/streaming.js +687 -0
- package/dist/http/openai-compat/tool-call-stream-filter.d.ts +33 -0
- package/dist/http/openai-compat/tool-call-stream-filter.js +110 -0
- package/dist/http/openai-compat/translate.d.ts +254 -0
- package/dist/http/openai-compat/translate.js +485 -0
- package/dist/http/routes/engines.d.ts +13 -0
- package/dist/http/routes/engines.js +366 -0
- package/dist/http/routes/machine-engine-proxy.d.ts +26 -0
- package/dist/http/routes/machine-engine-proxy.js +43 -0
- package/dist/http/routes/model-bundles.d.ts +4 -0
- package/dist/http/routes/model-bundles.js +190 -0
- package/dist/http/routes/v1-chat.d.ts +72 -0
- package/dist/http/routes/v1-chat.js +645 -0
- package/dist/http/routes/v1-embeddings.d.ts +3 -0
- package/dist/http/routes/v1-embeddings.js +82 -0
- package/dist/http/routes/v1-knowledge.d.ts +4 -0
- package/dist/http/routes/v1-knowledge.js +304 -0
- package/dist/http/routes/v1-models-ensure.d.ts +32 -0
- package/dist/http/routes/v1-models-ensure.js +122 -0
- package/dist/http/routes/v1-models.d.ts +8 -0
- package/dist/http/routes/v1-models.js +189 -0
- package/dist/http/routes/v1-responses.d.ts +20 -0
- package/dist/http/routes/v1-responses.js +327 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/inference-service.d.ts +28 -0
- package/dist/inference-service.js +275 -0
- package/dist/knowledge/admission.d.ts +3 -0
- package/dist/knowledge/admission.js +22 -0
- package/dist/knowledge/bundled-catalog.d.ts +2 -0
- package/dist/knowledge/bundled-catalog.js +2 -0
- package/dist/knowledge/catalog-host.d.ts +103 -0
- package/dist/knowledge/catalog-host.js +180 -0
- package/dist/knowledge/catalog-source.d.ts +22 -0
- package/dist/knowledge/catalog-source.js +35 -0
- package/dist/knowledge/install.d.ts +55 -0
- package/dist/knowledge/install.js +274 -0
- package/dist/knowledge/manager.d.ts +287 -0
- package/dist/knowledge/manager.js +1540 -0
- package/dist/knowledge/registry.d.ts +35 -0
- package/dist/knowledge/registry.js +123 -0
- package/dist/knowledge/search-worker.d.ts +17 -0
- package/dist/knowledge/search-worker.js +36 -0
- package/dist/knowledge/shared-install-contract.d.ts +19 -0
- package/dist/knowledge/shared-install-contract.js +1 -0
- package/dist/knowledge/spatial-query.d.ts +11 -0
- package/dist/knowledge/spatial-query.js +33 -0
- package/dist/knowledge/trust-anchors.d.ts +11 -0
- package/dist/knowledge/trust-anchors.js +51 -0
- package/dist/knowledge/vector-floors.d.ts +44 -0
- package/dist/knowledge/vector-floors.js +92 -0
- package/dist/knowledge/worker-host.d.ts +9 -0
- package/dist/knowledge/worker-host.js +179 -0
- package/dist/kokoro-lexicon/LICENSE +202 -0
- package/dist/kokoro-lexicon/lexicon-gb-en.txt.gz +0 -0
- package/dist/kokoro-lexicon/lexicon-us-en.txt.gz +0 -0
- package/dist/kokoro-lexicon/manifest.json +23 -0
- package/dist/machine-engine/inspect-runtime.d.ts +3 -0
- package/dist/machine-engine/inspect-runtime.js +48 -0
- package/dist/machine-engine/knowledge-assets.d.ts +79 -0
- package/dist/machine-engine/knowledge-assets.js +505 -0
- package/dist/memory/embed-core.d.ts +131 -0
- package/dist/memory/embed-core.js +398 -0
- package/dist/memory/embed-worker.d.ts +23 -0
- package/dist/memory/embed-worker.js +49 -0
- package/dist/memory/embeddings.d.ts +105 -0
- package/dist/memory/embeddings.js +467 -0
- package/dist/model-profile/behaviors/tools-mlx-template-fix.d.ts +1 -0
- package/dist/model-profile/behaviors/tools-mlx-template-fix.js +2 -0
- package/dist/model-profile/behaviors/turn-ramble-detection.d.ts +1 -0
- package/dist/model-profile/behaviors/turn-ramble-detection.js +2 -0
- package/dist/model-profile/defaults.d.ts +1 -0
- package/dist/model-profile/defaults.js +2 -0
- package/dist/model-profile/index.d.ts +9 -0
- package/dist/model-profile/index.js +7 -0
- package/dist/model-profile/registry.d.ts +15 -0
- package/dist/model-profile/registry.js +18 -0
- package/dist/model-profile/runtime.d.ts +48 -0
- package/dist/model-profile/runtime.js +131 -0
- package/dist/model-profile/tool-grammar.d.ts +1 -0
- package/dist/model-profile/tool-grammar.js +2 -0
- package/dist/model-profile/tuning.d.ts +19 -0
- package/dist/model-profile/tuning.js +21 -0
- package/dist/model-profile/types.d.ts +1 -0
- package/dist/model-profile/types.js +2 -0
- package/dist/models/bundle-storage.d.ts +28 -0
- package/dist/models/bundle-storage.js +80 -0
- package/dist/models/catalog-drift.d.ts +48 -0
- package/dist/models/catalog-drift.js +94 -0
- package/dist/models/catalog-payload-identity.d.ts +107 -0
- package/dist/models/catalog-payload-identity.js +254 -0
- package/dist/models/ensure.d.ts +125 -0
- package/dist/models/ensure.js +205 -0
- package/dist/models/gezmodel.d.ts +47 -0
- package/dist/models/gezmodel.js +742 -0
- package/dist/models/install-registry.d.ts +101 -0
- package/dist/models/install-registry.js +216 -0
- package/dist/models/model-id.d.ts +22 -0
- package/dist/models/model-id.js +40 -0
- package/dist/models/storage-roots.d.ts +274 -0
- package/dist/models/storage-roots.js +865 -0
- package/dist/native-release-entry.d.ts +16 -0
- package/dist/native-release-entry.js +16 -0
- package/dist/perf/redact-path.d.ts +2 -0
- package/dist/perf/redact-path.js +27 -0
- package/dist/perf/responsiveness.d.ts +70 -0
- package/dist/perf/responsiveness.js +560 -0
- package/dist/providers/active-install-message.d.ts +42 -0
- package/dist/providers/active-install-message.js +49 -0
- package/dist/providers/apple-foundation-models/binary.d.ts +4 -0
- package/dist/providers/apple-foundation-models/binary.js +18 -0
- package/dist/providers/apple-foundation-models/helper.d.ts +66 -0
- package/dist/providers/apple-foundation-models/helper.js +262 -0
- package/dist/providers/apple-foundation-models/provider.d.ts +82 -0
- package/dist/providers/apple-foundation-models/provider.js +389 -0
- package/dist/providers/apple-foundation-models/status.d.ts +9 -0
- package/dist/providers/apple-foundation-models/status.js +49 -0
- package/dist/providers/audio/kokoro-frontend.d.ts +50 -0
- package/dist/providers/audio/kokoro-frontend.js +113 -0
- package/dist/providers/audio/managed-speech-model.d.ts +9 -0
- package/dist/providers/audio/managed-speech-model.js +86 -0
- package/dist/providers/audio/types.d.ts +202 -0
- package/dist/providers/audio/types.js +17 -0
- package/dist/providers/audio/whisper-cpp.d.ts +99 -0
- package/dist/providers/audio/whisper-cpp.js +420 -0
- package/dist/providers/audio-persister-contract.d.ts +13 -0
- package/dist/providers/audio-persister-contract.js +1 -0
- package/dist/providers/catalog-model-config.d.ts +63 -0
- package/dist/providers/catalog-model-config.js +95 -0
- package/dist/providers/code-block-salvage.d.ts +1 -0
- package/dist/providers/code-block-salvage.js +2 -0
- package/dist/providers/codex-cli/reasoning.d.ts +8 -0
- package/dist/providers/codex-cli/reasoning.js +17 -0
- package/dist/providers/complete-tool-call.d.ts +16 -0
- package/dist/providers/complete-tool-call.js +25 -0
- package/dist/providers/constrained-turn.d.ts +1 -0
- package/dist/providers/constrained-turn.js +2 -0
- package/dist/providers/deliverable-read-pacing.d.ts +1 -0
- package/dist/providers/deliverable-read-pacing.js +2 -0
- package/dist/providers/direct-file-work-prompt.d.ts +1 -0
- package/dist/providers/direct-file-work-prompt.js +2 -0
- package/dist/providers/ds4/build-provider.d.ts +100 -0
- package/dist/providers/ds4/build-provider.js +539 -0
- package/dist/providers/ds4/cache-adapter.d.ts +42 -0
- package/dist/providers/ds4/cache-adapter.js +110 -0
- package/dist/providers/ds4/dspark.d.ts +83 -0
- package/dist/providers/ds4/dspark.js +107 -0
- package/dist/providers/ds4/mtp.d.ts +32 -0
- package/dist/providers/ds4/mtp.js +46 -0
- package/dist/providers/ds4/provider.d.ts +67 -0
- package/dist/providers/ds4/provider.js +104 -0
- package/dist/providers/ds4/residency.d.ts +143 -0
- package/dist/providers/ds4/residency.js +139 -0
- package/dist/providers/ds4/stdout-parser.d.ts +47 -0
- package/dist/providers/ds4/stdout-parser.js +134 -0
- package/dist/providers/duplicate-tool-calls.d.ts +1 -0
- package/dist/providers/duplicate-tool-calls.js +2 -0
- package/dist/providers/file-repair-policy.d.ts +1 -0
- package/dist/providers/file-repair-policy.js +2 -0
- package/dist/providers/gpu-arbiter.d.ts +159 -0
- package/dist/providers/gpu-arbiter.js +301 -0
- package/dist/providers/image-persister-contract.d.ts +15 -0
- package/dist/providers/image-persister-contract.js +1 -0
- package/dist/providers/llama-cpp/build-metadata.d.ts +13 -0
- package/dist/providers/llama-cpp/build-metadata.js +39 -0
- package/dist/providers/llama-cpp/build-provider.d.ts +66 -0
- package/dist/providers/llama-cpp/build-provider.js +1491 -0
- package/dist/providers/llama-cpp/cache-adapter.d.ts +242 -0
- package/dist/providers/llama-cpp/cache-adapter.js +689 -0
- package/dist/providers/llama-cpp/devices.d.ts +130 -0
- package/dist/providers/llama-cpp/devices.js +256 -0
- package/dist/providers/llama-cpp/disk-cache.d.ts +8 -0
- package/dist/providers/llama-cpp/disk-cache.js +112 -0
- package/dist/providers/llama-cpp/engine-flags.d.ts +181 -0
- package/dist/providers/llama-cpp/engine-flags.js +279 -0
- package/dist/providers/llama-cpp/gguf-metadata-async.d.ts +11 -0
- package/dist/providers/llama-cpp/gguf-metadata-async.js +180 -0
- package/dist/providers/llama-cpp/gguf-metadata-worker.d.ts +7 -0
- package/dist/providers/llama-cpp/gguf-metadata-worker.js +27 -0
- package/dist/providers/llama-cpp/gguf-metadata.d.ts +198 -0
- package/dist/providers/llama-cpp/gguf-metadata.js +615 -0
- package/dist/providers/llama-cpp/gguf-quantization-backfill.d.ts +32 -0
- package/dist/providers/llama-cpp/gguf-quantization-backfill.js +75 -0
- package/dist/providers/llama-cpp/index.d.ts +10 -0
- package/dist/providers/llama-cpp/index.js +13 -0
- package/dist/providers/llama-cpp/kv-cache-type.d.ts +118 -0
- package/dist/providers/llama-cpp/kv-cache-type.js +140 -0
- package/dist/providers/llama-cpp/log.d.ts +92 -0
- package/dist/providers/llama-cpp/log.js +280 -0
- package/dist/providers/llama-cpp/models.d.ts +389 -0
- package/dist/providers/llama-cpp/models.js +1011 -0
- package/dist/providers/llama-cpp/offload-planner.d.ts +339 -0
- package/dist/providers/llama-cpp/offload-planner.js +524 -0
- package/dist/providers/llama-cpp/provider.d.ts +493 -0
- package/dist/providers/llama-cpp/provider.js +862 -0
- package/dist/providers/llama-cpp/reasoning-launch.d.ts +7 -0
- package/dist/providers/llama-cpp/reasoning-launch.js +14 -0
- package/dist/providers/llama-cpp/spec-draft.d.ts +44 -0
- package/dist/providers/llama-cpp/spec-draft.js +44 -0
- package/dist/providers/llama-cpp/stdout-parser.d.ts +70 -0
- package/dist/providers/llama-cpp/stdout-parser.js +197 -0
- package/dist/providers/local-tool-call-salvage.d.ts +1 -0
- package/dist/providers/local-tool-call-salvage.js +2 -0
- package/dist/providers/local-turn-policy.d.ts +1 -0
- package/dist/providers/local-turn-policy.js +2 -0
- package/dist/providers/mlx/async-file-handoff.d.ts +11 -0
- package/dist/providers/mlx/async-file-handoff.js +25 -0
- package/dist/providers/mlx/build-provider.d.ts +65 -0
- package/dist/providers/mlx/build-provider.js +717 -0
- package/dist/providers/mlx/cache-adapter.d.ts +161 -0
- package/dist/providers/mlx/cache-adapter.js +445 -0
- package/dist/providers/mlx/chat-protocol.d.ts +48 -0
- package/dist/providers/mlx/chat-protocol.js +8 -0
- package/dist/providers/mlx/config-parser.d.ts +29 -0
- package/dist/providers/mlx/config-parser.js +81 -0
- package/dist/providers/mlx/engine-gate.d.ts +51 -0
- package/dist/providers/mlx/engine-gate.js +207 -0
- package/dist/providers/mlx/engine-hold.d.ts +41 -0
- package/dist/providers/mlx/engine-hold.js +59 -0
- package/dist/providers/mlx/engine-log-router.d.ts +84 -0
- package/dist/providers/mlx/engine-log-router.js +137 -0
- package/dist/providers/mlx/engine-stats-sampler.d.ts +36 -0
- package/dist/providers/mlx/engine-stats-sampler.js +59 -0
- package/dist/providers/mlx/index.d.ts +10 -0
- package/dist/providers/mlx/index.js +10 -0
- package/dist/providers/mlx/log.d.ts +55 -0
- package/dist/providers/mlx/log.js +157 -0
- package/dist/providers/mlx/model-geometry.d.ts +35 -0
- package/dist/providers/mlx/model-geometry.js +118 -0
- package/dist/providers/mlx/models.d.ts +289 -0
- package/dist/providers/mlx/models.js +1079 -0
- package/dist/providers/mlx/provider.d.ts +404 -0
- package/dist/providers/mlx/provider.js +3017 -0
- package/dist/providers/mlx/python/cache_persist.py +348 -0
- package/dist/providers/mlx/python/cache_seed.py +402 -0
- package/dist/providers/mlx/python/gezel_mlx_server.py +4491 -0
- package/dist/providers/mlx/python/lfm2_compat.py +55 -0
- package/dist/providers/mlx/python/qwen3_5_text_compat.py +60 -0
- package/dist/providers/mlx/python/qwen4_ple.py +159 -0
- package/dist/providers/mlx/python/spec_decode.py +775 -0
- package/dist/providers/mlx/python/template_stability.py +133 -0
- package/dist/providers/mlx/python/think_budget.py +113 -0
- package/dist/providers/mlx/python/tool_args_json.py +297 -0
- package/dist/providers/mlx/python/tool_call_stream.py +265 -0
- package/dist/providers/mlx/python/tool_grammar.py +794 -0
- package/dist/providers/mlx/python/vision_inputs.py +64 -0
- package/dist/providers/mlx/python/wave_policy.py +147 -0
- package/dist/providers/mlx/reasoning-stream.d.ts +85 -0
- package/dist/providers/mlx/reasoning-stream.js +196 -0
- package/dist/providers/mlx/request-shape.d.ts +34 -0
- package/dist/providers/mlx/request-shape.js +42 -0
- package/dist/providers/mlx/runtime-diagnostics.d.ts +29 -0
- package/dist/providers/mlx/runtime-diagnostics.js +162 -0
- package/dist/providers/mlx/spec-drafter.d.ts +25 -0
- package/dist/providers/mlx/spec-drafter.js +73 -0
- package/dist/providers/mlx/stdout-parser.d.ts +60 -0
- package/dist/providers/mlx/stdout-parser.js +254 -0
- package/dist/providers/mlx/textual-tool-call-salvage.d.ts +46 -0
- package/dist/providers/mlx/textual-tool-call-salvage.js +396 -0
- package/dist/providers/mlx/tool-call-protocol.d.ts +65 -0
- package/dist/providers/mlx/tool-call-protocol.js +140 -0
- package/dist/providers/mlx/tool-call-stripper.d.ts +68 -0
- package/dist/providers/mlx/tool-call-stripper.js +153 -0
- package/dist/providers/mlx/tool-image-retention.d.ts +23 -0
- package/dist/providers/mlx/tool-image-retention.js +43 -0
- package/dist/providers/mlx/turn-telemetry.d.ts +22 -0
- package/dist/providers/mlx/turn-telemetry.js +45 -0
- package/dist/providers/mlx/venv.d.ts +91 -0
- package/dist/providers/mlx/venv.js +111 -0
- package/dist/providers/mlx/vision-mode.d.ts +92 -0
- package/dist/providers/mlx/vision-mode.js +187 -0
- package/dist/providers/mlx/vision.d.ts +2 -0
- package/dist/providers/mlx/vision.js +12 -0
- package/dist/providers/mlx/wire-transcript.d.ts +14 -0
- package/dist/providers/mlx/wire-transcript.js +43 -0
- package/dist/providers/native/capacity-broker.d.ts +812 -0
- package/dist/providers/native/capacity-broker.js +1058 -0
- package/dist/providers/native/capacity-budget.d.ts +133 -0
- package/dist/providers/native/capacity-budget.js +265 -0
- package/dist/providers/native/device-capacity-ledger.d.ts +31 -0
- package/dist/providers/native/device-capacity-ledger.js +196 -0
- package/dist/providers/native/device-capacity.d.ts +84 -0
- package/dist/providers/native/device-capacity.js +431 -0
- package/dist/providers/native/engine-api-key.d.ts +57 -0
- package/dist/providers/native/engine-api-key.js +72 -0
- package/dist/providers/native/engine-key.d.ts +18 -0
- package/dist/providers/native/engine-key.js +41 -0
- package/dist/providers/native/engine-router.d.ts +145 -0
- package/dist/providers/native/engine-router.js +191 -0
- package/dist/providers/native/gpu-panic-guard.d.ts +54 -0
- package/dist/providers/native/gpu-panic-guard.js +59 -0
- package/dist/providers/native/inference.d.ts +33 -0
- package/dist/providers/native/inference.js +49 -0
- package/dist/providers/native/local-engine-runtime.d.ts +412 -0
- package/dist/providers/native/local-engine-runtime.js +1714 -0
- package/dist/providers/native/measured-budget.d.ts +32 -0
- package/dist/providers/native/measured-budget.js +54 -0
- package/dist/providers/native/port.d.ts +11 -0
- package/dist/providers/native/port.js +29 -0
- package/dist/providers/native/provider-pool.d.ts +474 -0
- package/dist/providers/native/provider-pool.js +1166 -0
- package/dist/providers/native/supervisor.d.ts +503 -0
- package/dist/providers/native/supervisor.js +1466 -0
- package/dist/providers/observation-context.d.ts +16 -0
- package/dist/providers/observation-context.js +1 -0
- package/dist/providers/openai-compatible/sse.d.ts +1 -0
- package/dist/providers/openai-compatible/sse.js +2 -0
- package/dist/providers/patient-fetch.d.ts +36 -0
- package/dist/providers/patient-fetch.js +44 -0
- package/dist/providers/project-macro-loop-bail.d.ts +7 -0
- package/dist/providers/project-macro-loop-bail.js +21 -0
- package/dist/providers/prose-document-salvage.d.ts +1 -0
- package/dist/providers/prose-document-salvage.js +2 -0
- package/dist/providers/provider-disposal.d.ts +1 -0
- package/dist/providers/provider-disposal.js +2 -0
- package/dist/providers/queue.d.ts +15 -0
- package/dist/providers/queue.js +23 -0
- package/dist/providers/ramble-abort-message.d.ts +1 -0
- package/dist/providers/ramble-abort-message.js +2 -0
- package/dist/providers/ramble-detector.d.ts +1 -0
- package/dist/providers/ramble-detector.js +2 -0
- package/dist/providers/reasoning-depth.d.ts +1 -0
- package/dist/providers/reasoning-depth.js +2 -0
- package/dist/providers/required-input-reads.d.ts +1 -0
- package/dist/providers/required-input-reads.js +2 -0
- package/dist/providers/session-defaults.d.ts +13 -0
- package/dist/providers/session-defaults.js +49 -0
- package/dist/providers/session-hooks.d.ts +26 -0
- package/dist/providers/session-hooks.js +1 -0
- package/dist/providers/streaming-session.d.ts +1 -0
- package/dist/providers/streaming-session.js +2 -0
- package/dist/providers/terminal-tool-policy.d.ts +1 -0
- package/dist/providers/terminal-tool-policy.js +2 -0
- package/dist/providers/tool-arg-schema-coercion.d.ts +1 -0
- package/dist/providers/tool-arg-schema-coercion.js +2 -0
- package/dist/providers/tool-executor.d.ts +12 -0
- package/dist/providers/tool-executor.js +20 -0
- package/dist/providers/tool-failure-tracker.d.ts +1 -0
- package/dist/providers/tool-failure-tracker.js +2 -0
- package/dist/providers/tool-repeat-tracker.d.ts +1 -0
- package/dist/providers/tool-repeat-tracker.js +2 -0
- package/dist/providers/turn-timeout.d.ts +1 -0
- package/dist/providers/turn-timeout.js +1 -0
- package/dist/providers/types.d.ts +834 -0
- package/dist/providers/types.js +42 -0
- package/dist/providers/usage-builder.d.ts +1 -0
- package/dist/providers/usage-builder.js +2 -0
- package/dist/providers/vision-capability.d.ts +109 -0
- package/dist/providers/vision-capability.js +137 -0
- package/dist/python/mlx-runtime-status-bus.d.ts +39 -0
- package/dist/python/mlx-runtime-status-bus.js +27 -0
- package/dist/python/uv-runtime.d.ts +176 -0
- package/dist/python/uv-runtime.js +492 -0
- package/dist/relevance/install.d.ts +28 -0
- package/dist/relevance/install.js +114 -0
- package/dist/relevance/manager.d.ts +79 -0
- package/dist/relevance/manager.js +211 -0
- package/dist/relevance/registry.d.ts +11 -0
- package/dist/relevance/registry.js +158 -0
- package/dist/relevance/relevance-core.d.ts +67 -0
- package/dist/relevance/relevance-core.js +189 -0
- package/dist/relevance/relevance-model.d.ts +42 -0
- package/dist/relevance/relevance-model.js +292 -0
- package/dist/relevance/relevance-worker.d.ts +20 -0
- package/dist/relevance/relevance-worker.js +57 -0
- package/dist/relevance/settings.d.ts +30 -0
- package/dist/relevance/settings.js +81 -0
- package/dist/remotes/identity.d.ts +121 -0
- package/dist/remotes/identity.js +348 -0
- package/dist/remotes/pinned-fetch.d.ts +45 -0
- package/dist/remotes/pinned-fetch.js +193 -0
- package/dist/remotes/types.d.ts +54 -0
- package/dist/remotes/types.js +1 -0
- package/dist/runtime-lock.d.ts +29 -0
- package/dist/runtime-lock.js +85 -0
- package/dist/search/relevance-stage.d.ts +81 -0
- package/dist/search/relevance-stage.js +177 -0
- package/dist/secrets/types.d.ts +63 -0
- package/dist/secrets/types.js +64 -0
- package/dist/speech.d.ts +1 -0
- package/dist/speech.js +1 -0
- package/dist/system/darwin-memory.d.ts +26 -0
- package/dist/system/darwin-memory.js +81 -0
- package/dist/system/gezel-process-memory.d.ts +55 -0
- package/dist/system/gezel-process-memory.js +156 -0
- package/dist/system/memory.d.ts +154 -0
- package/dist/system/memory.js +501 -0
- package/dist/transformers-cache.d.ts +112 -0
- package/dist/transformers-cache.js +392 -0
- package/dist/utils/disk-space.d.ts +55 -0
- package/dist/utils/disk-space.js +72 -0
- package/dist/utils/download-common.d.ts +138 -0
- package/dist/utils/download-common.js +196 -0
- package/dist/utils/download-with-retry.d.ts +85 -0
- package/dist/utils/download-with-retry.js +522 -0
- package/dist/utils/extract-zip.d.ts +22 -0
- package/dist/utils/extract-zip.js +103 -0
- package/dist/utils/retire-model-worker.d.ts +15 -0
- package/dist/utils/retire-model-worker.js +24 -0
- package/dist/utils/service-worker-entry.d.ts +59 -0
- package/dist/utils/service-worker-entry.js +69 -0
- package/dist/utils/xet-download.d.ts +40 -0
- package/dist/utils/xet-download.js +526 -0
- package/dist/utils/xet.d.ts +86 -0
- package/dist/utils/xet.js +201 -0
- package/package.json +103 -3
- package/scripts/embedding-packaging.cjs +264 -0
- package/scripts/embedding-packaging.d.cts +16 -0
|
@@ -0,0 +1,689 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* llama-server cache adapter.
|
|
3
|
+
*
|
|
4
|
+
* llama-server keeps KV cache per "slot" — a small, fixed pool of
|
|
5
|
+
* inference contexts (configured at server start via `--parallel N`).
|
|
6
|
+
* Each request can name an `id_slot` to bind itself to; without an
|
|
7
|
+
* `id_slot` the server picks a free slot itself and may evict an
|
|
8
|
+
* unrelated session's cache. With `id_slot` we get explicit per-session
|
|
9
|
+
* pinning: turn N+1 reuses turn N's cache iff both went to the same
|
|
10
|
+
* slot.
|
|
11
|
+
*
|
|
12
|
+
* Slot allocation strategy: we maintain a `Map<sessionId, slotId>`. On
|
|
13
|
+
* `buildRequestExtras`, return the existing mapping or allocate a fresh
|
|
14
|
+
* slot id (round-robin within the configured slot count, recycling the
|
|
15
|
+
* least-recently-used when we wrap). Slots are 0-indexed integers; the
|
|
16
|
+
* default `--parallel` is 1, so we conservatively assume 1 slot until
|
|
17
|
+
* the operator configures more.
|
|
18
|
+
*
|
|
19
|
+
* `cache_prompt: true` is always sent — that's the master switch for
|
|
20
|
+
* cache reuse on llama-server. Without it, even slot pinning wouldn't
|
|
21
|
+
* preserve KV state across requests.
|
|
22
|
+
*
|
|
23
|
+
* `reportUsage()` scrapes `/slots` (llama-server's introspection
|
|
24
|
+
* endpoint) for per-slot cached-token counts. Mapping back to
|
|
25
|
+
* sessionIds happens via our own `slotToSession` reverse map — the
|
|
26
|
+
* server doesn't know our session ids.
|
|
27
|
+
*
|
|
28
|
+
* ## Disk persistence (Phase 1.2)
|
|
29
|
+
*
|
|
30
|
+
* llama-server supports per-slot save/restore via `POST
|
|
31
|
+
* /slots/{id}?action=save&filename=…` (and `…?action=restore`) when
|
|
32
|
+
* launched with `--slot-save-path <dir>`. The endpoint writes a potentially large
|
|
33
|
+
* binary file containing the slot's KV state; restore mmap-loads it
|
|
34
|
+
* back into the slot in milliseconds. We wire this in:
|
|
35
|
+
*
|
|
36
|
+
* - On evict (controller-driven LRU or LRU slot recycle): save the
|
|
37
|
+
* slot to `sess-<sessionId>.bin` before forgetting the mapping. The
|
|
38
|
+
* next time that session shows up, allocateSlot tries to restore
|
|
39
|
+
* from disk before binding the slot fresh.
|
|
40
|
+
* - On allocateSlot for a session we haven't seen: check disk for
|
|
41
|
+
* `sess-<sessionId>.bin`; restore into the chosen slot before
|
|
42
|
+
* binding so the session resumes exactly where it left off.
|
|
43
|
+
* - On shutdown: `flushAll()` saves every currently-bound slot, so
|
|
44
|
+
* the next supervisor boot can resume any session whose user comes
|
|
45
|
+
* back.
|
|
46
|
+
* - On first session-save for a given gezel: ALSO copy the file under
|
|
47
|
+
* `prefix-<hash>.bin`. New sessions for the same gezel restore that
|
|
48
|
+
* when no per-session cache exists; llama-server's `cache_prompt`
|
|
49
|
+
* prefix-matching reuses up to the system-prompt boundary even
|
|
50
|
+
* though the file holds a longer conversation. Net effect: cold-
|
|
51
|
+
* starting a fresh session for an existing gezel skips the
|
|
52
|
+
* system-prompt prefill entirely.
|
|
53
|
+
*/
|
|
54
|
+
import { createHash } from 'node:crypto';
|
|
55
|
+
import { constants } from 'node:fs';
|
|
56
|
+
import { copyFile, stat, statfs, utimes } from 'node:fs/promises';
|
|
57
|
+
import { join } from 'node:path';
|
|
58
|
+
import { DEFAULT_LLAMA_DISK_CACHE_MB, pruneLlamaDiskCache, withLlamaDiskCache, } from './disk-cache.js';
|
|
59
|
+
import { createLogger } from '@bendyline/gezel';
|
|
60
|
+
// This layer is best-effort by design, but silent best-effort is
|
|
61
|
+
// unauditable: the 2026-08-03 KV-thrash investigation could not tell from
|
|
62
|
+
// any log whether save/restore ever ran, fired-and-failed, or latched
|
|
63
|
+
// unsupported — the answer had to be reverse-engineered from llama-server
|
|
64
|
+
// binary help and prefill chunk traces. Debug-level so steady-state stays
|
|
65
|
+
// quiet; the unsupported latch is a warn because it silently disables the
|
|
66
|
+
// whole disk layer for the process lifetime.
|
|
67
|
+
const log = createLogger('llama-kv-cache');
|
|
68
|
+
/**
|
|
69
|
+
* Bytes-per-token estimate for llama.cpp KV cache. Default Q4_K_M-class
|
|
70
|
+
* 7B-13B model weights round to roughly 100 KB / token of context. We
|
|
71
|
+
* use the same conservative figure as the controller's default — the
|
|
72
|
+
* estimate matters for telemetry, not correctness; any per-request
|
|
73
|
+
* `/slots` poll surfaces the engine's view of cache size in tokens
|
|
74
|
+
* which we multiply by this constant to get bytes.
|
|
75
|
+
*/
|
|
76
|
+
const ESTIMATED_BYTES_PER_TOKEN = 100 * 1024;
|
|
77
|
+
/** Filename for a session's saved slot cache. Kept stable so resume
|
|
78
|
+
* works across supervisor restarts. */
|
|
79
|
+
function sessFilename(sessionId) {
|
|
80
|
+
// sessionIds are uuid-shape so this is mostly cosmetic safety.
|
|
81
|
+
const safe = sessionId.replace(/[^A-Za-z0-9._-]/g, '_');
|
|
82
|
+
return `sess-${safe}.bin`;
|
|
83
|
+
}
|
|
84
|
+
/** Filename for a per-gezel prefix slot cache. The hash is the same
|
|
85
|
+
* shape used by the MLX adapter so logs read consistently. */
|
|
86
|
+
function prefixFilename(prefixId) {
|
|
87
|
+
return `${prefixId}.bin`;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Stable per-gezel prefix identifier. Hashes the verbatim system
|
|
91
|
+
* prompt; drift produces a new id and a new disk file (the old one
|
|
92
|
+
* becomes orphaned and is pruned by the disk-LRU eventually).
|
|
93
|
+
*/
|
|
94
|
+
export function llamaPrefixId(systemPrompt) {
|
|
95
|
+
const hex = createHash('sha256').update(systemPrompt, 'utf8').digest('hex');
|
|
96
|
+
return `prefix-${hex.slice(0, 16)}`;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Layered prefix ids (flag `layeredPrefixCache`). Distinct `gp` / `gezel`
|
|
100
|
+
* namespaces so a gezel-layer disk file never collides with a
|
|
101
|
+
* gezel+project-layer file. `gp` is the workhorse (full stable system,
|
|
102
|
+
* shared across sessions of the same model+gezel+project); `gezel` is the
|
|
103
|
+
* identity-only prefix (shared across projects of the same gezel).
|
|
104
|
+
*/
|
|
105
|
+
export function llamaLayerPrefixIds(layers) {
|
|
106
|
+
const h = (s) => createHash('sha256').update(s, 'utf8').digest('hex').slice(0, 16);
|
|
107
|
+
return { gp: `prefix-gp-${h(layers.project)}`, gezel: `prefix-gezel-${h(layers.gezel)}` };
|
|
108
|
+
}
|
|
109
|
+
export class LlamaCppCacheAdapter {
|
|
110
|
+
providerName = 'llama-cpp';
|
|
111
|
+
sessionToSlot = new Map();
|
|
112
|
+
slotToSession = new Map();
|
|
113
|
+
/** Slot LRU — the head is the oldest assignment, evicted first on wrap. */
|
|
114
|
+
slotOrder = [];
|
|
115
|
+
nextSlotToTry = 0;
|
|
116
|
+
/**
|
|
117
|
+
* Allocation includes asynchronous disk restore work. Without a small
|
|
118
|
+
* critical section, two callers can both observe the same slot as free
|
|
119
|
+
* before either one reaches {@link bind}, then issue concurrent requests
|
|
120
|
+
* with the same explicit `id_slot`. Keep the allocator itself serial while
|
|
121
|
+
* still allowing the provider to stream on all configured engine slots once
|
|
122
|
+
* each mapping has been established.
|
|
123
|
+
*/
|
|
124
|
+
allocationTail = Promise.resolve();
|
|
125
|
+
engineGeneration = 0;
|
|
126
|
+
slotCount;
|
|
127
|
+
resolveBaseUrl;
|
|
128
|
+
resolveAuthToken;
|
|
129
|
+
fetchImpl;
|
|
130
|
+
/** Directory used by llama-server's --slot-save-path. */
|
|
131
|
+
slotSavePath;
|
|
132
|
+
diskCacheRoot;
|
|
133
|
+
diskCacheBudgetBytes;
|
|
134
|
+
diskCacheInitialized = false;
|
|
135
|
+
/** Per-session prefix mapping for cross-session cache sharing. */
|
|
136
|
+
sessionPrefix = new Map();
|
|
137
|
+
/**
|
|
138
|
+
* Per-session LAYERED prefix ids (flag ON), ordered most-specific-first
|
|
139
|
+
* (`[gp, gezel]`). `tryRestoreForSession` walks them after the
|
|
140
|
+
* per-session file so a new session inherits the warmest matching layer.
|
|
141
|
+
*/
|
|
142
|
+
sessionLayerPrefixes = new Map();
|
|
143
|
+
/** Tracks which prefix files have been seeded on disk this process. */
|
|
144
|
+
seededPrefixes = new Set();
|
|
145
|
+
/**
|
|
146
|
+
* Sessions we've successfully restored from disk this process. We
|
|
147
|
+
* track these so the next save also seeds the prefix file (if the
|
|
148
|
+
* session arrived from a supervisor-restart resume, the prefix file
|
|
149
|
+
* may have been pruned in between — re-seeding keeps it warm).
|
|
150
|
+
*/
|
|
151
|
+
restoredSessions = new Set();
|
|
152
|
+
/**
|
|
153
|
+
* Latched off when this llama-server refuses slot save/restore (501
|
|
154
|
+
* "This feature is not supported by multimodal" — fires for mmproj-
|
|
155
|
+
* backed models like nemotron-nano-30b). Without the latch we'd POST
|
|
156
|
+
* to /slots/{id}?action=save+restore on every turn, spamming the
|
|
157
|
+
* server log with the same 501 and adding 5-15ms of useless
|
|
158
|
+
* roundtrip. Wild-caught nemotron-nano tankcombat
|
|
159
|
+
* run: `srv send_error: task id = X, error: This feature is not
|
|
160
|
+
* supported by multimodal` fired on every turn. Once any slot action
|
|
161
|
+
* returns a 501, we stop trying for the rest of the process — the
|
|
162
|
+
* server's capability doesn't change at runtime.
|
|
163
|
+
*/
|
|
164
|
+
slotActionsUnsupported = false;
|
|
165
|
+
constructor(opts) {
|
|
166
|
+
this.resolveBaseUrl = opts.resolveBaseUrl;
|
|
167
|
+
this.resolveAuthToken = opts.resolveAuthToken ?? (() => null);
|
|
168
|
+
this.slotCount = Math.max(1, opts.slotCount ?? 1);
|
|
169
|
+
this.fetchImpl = opts.fetchImpl ?? fetch;
|
|
170
|
+
if (opts.slotSavePath)
|
|
171
|
+
this.slotSavePath = opts.slotSavePath;
|
|
172
|
+
if (opts.slotSavePath)
|
|
173
|
+
this.diskCacheRoot = opts.diskCacheRoot ?? opts.slotSavePath;
|
|
174
|
+
const budget = opts.diskCacheBudgetMb ?? DEFAULT_LLAMA_DISK_CACHE_MB;
|
|
175
|
+
if (!Number.isSafeInteger(budget) || budget < 0 || !Number.isSafeInteger(budget * 1024 * 1024))
|
|
176
|
+
throw new Error('Invalid llama disk cache budget');
|
|
177
|
+
this.diskCacheBudgetBytes = budget * 1024 * 1024;
|
|
178
|
+
}
|
|
179
|
+
/** The provider survives engine restarts, but its resident slot contents do not. */
|
|
180
|
+
resetEngineState() {
|
|
181
|
+
this.engineGeneration++;
|
|
182
|
+
this.sessionToSlot.clear();
|
|
183
|
+
this.slotToSession.clear();
|
|
184
|
+
this.slotOrder.length = 0;
|
|
185
|
+
this.nextSlotToTry = 0;
|
|
186
|
+
this.restoredSessions.clear();
|
|
187
|
+
this.slotActionsUnsupported = false;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Register the gezel-prefix mapping for a session. Called by the
|
|
191
|
+
* session implementation before each send so the adapter knows where
|
|
192
|
+
* to find the prefix file when (re)allocating a slot for this session.
|
|
193
|
+
*/
|
|
194
|
+
setSessionPrefix(sessionId, systemPrompt) {
|
|
195
|
+
const prefixId = llamaPrefixId(systemPrompt);
|
|
196
|
+
this.sessionPrefix.set(sessionId, prefixId);
|
|
197
|
+
return prefixId;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Async session prep. Sessions call this once before each send so
|
|
201
|
+
* the adapter can:
|
|
202
|
+
* 1. Register the gezel-prefix mapping (cheap, in-memory).
|
|
203
|
+
* 2. Allocate a slot for this session if not already bound,
|
|
204
|
+
* recycling the LRU victim (saving its state to disk first).
|
|
205
|
+
* 3. Try to restore the freshly-allocated slot from disk: per-
|
|
206
|
+
* session file first, then gezel-prefix file. Either fills
|
|
207
|
+
* the slot's KV state with a useful starting point so
|
|
208
|
+
* llama-server's `cache_prompt` reuses the matching prefix on
|
|
209
|
+
* the next request.
|
|
210
|
+
*
|
|
211
|
+
* Idempotent for already-bound sessions — fast in-memory promote
|
|
212
|
+
* with no I/O. Sessions await this; `buildRequestExtras` then reads
|
|
213
|
+
* the resolved slot mapping synchronously.
|
|
214
|
+
*/
|
|
215
|
+
async prepareForSend(sessionId, systemPrompt, layers) {
|
|
216
|
+
if (this.diskCacheRoot && !this.diskCacheInitialized) {
|
|
217
|
+
await withLlamaDiskCache(this.diskCacheRoot, () => this.pruneDiskCache());
|
|
218
|
+
this.diskCacheInitialized = true;
|
|
219
|
+
}
|
|
220
|
+
if (layers) {
|
|
221
|
+
const { gp, gezel } = llamaLayerPrefixIds(layers);
|
|
222
|
+
// Most-specific first: a restore tries gp (full stable system) then
|
|
223
|
+
// gezel (identity only).
|
|
224
|
+
this.sessionLayerPrefixes.set(sessionId, [gp, gezel]);
|
|
225
|
+
// The legacy single-prefix path seeds the most-specific (gp) file on
|
|
226
|
+
// save, so set sessionPrefix to gp too.
|
|
227
|
+
this.sessionPrefix.set(sessionId, gp);
|
|
228
|
+
}
|
|
229
|
+
else if (systemPrompt) {
|
|
230
|
+
this.setSessionPrefix(sessionId, systemPrompt);
|
|
231
|
+
}
|
|
232
|
+
await this.allocateSlot(sessionId);
|
|
233
|
+
}
|
|
234
|
+
buildRequestExtras(sessionId) {
|
|
235
|
+
// Sync path: assumes prepareForSend has already run for new
|
|
236
|
+
// sessions. If not (test paths, code that skipped prep), fall back
|
|
237
|
+
// to the in-memory-only allocator that doesn't touch disk.
|
|
238
|
+
const slot = this.allocateSlotInMemory(sessionId);
|
|
239
|
+
return {
|
|
240
|
+
cache_prompt: true,
|
|
241
|
+
// Promote this session in our LRU — recently-used slots are
|
|
242
|
+
// last to recycle.
|
|
243
|
+
id_slot: slot,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
async evict(sessionIds) {
|
|
247
|
+
const generation = this.engineGeneration;
|
|
248
|
+
// Save before forgetting so the session can resume on next access.
|
|
249
|
+
// Persistence is best-effort; failures are logged and the local
|
|
250
|
+
// mapping is still cleared (controller view stays consistent).
|
|
251
|
+
for (const id of sessionIds) {
|
|
252
|
+
const slot = this.sessionToSlot.get(id);
|
|
253
|
+
if (slot === undefined)
|
|
254
|
+
continue;
|
|
255
|
+
await this.saveSlotForSession(slot, id);
|
|
256
|
+
if (generation !== this.engineGeneration)
|
|
257
|
+
return;
|
|
258
|
+
this.sessionToSlot.delete(id);
|
|
259
|
+
this.slotToSession.delete(slot);
|
|
260
|
+
const idx = this.slotOrder.indexOf(slot);
|
|
261
|
+
if (idx !== -1)
|
|
262
|
+
this.slotOrder.splice(idx, 1);
|
|
263
|
+
this.sessionPrefix.delete(id);
|
|
264
|
+
this.sessionLayerPrefixes.delete(id);
|
|
265
|
+
this.restoredSessions.delete(id);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
async reportUsage() {
|
|
269
|
+
const generation = this.engineGeneration;
|
|
270
|
+
const baseUrl = await this.resolveBaseUrl().catch(() => null);
|
|
271
|
+
if (!baseUrl || generation !== this.engineGeneration)
|
|
272
|
+
return [];
|
|
273
|
+
let res;
|
|
274
|
+
try {
|
|
275
|
+
const token = this.resolveAuthToken();
|
|
276
|
+
res = await this.fetchImpl(`${baseUrl}/slots`, {
|
|
277
|
+
headers: token ? { Authorization: `Bearer ${token}` } : {},
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
return [];
|
|
282
|
+
}
|
|
283
|
+
if (!res.ok)
|
|
284
|
+
return [];
|
|
285
|
+
let payload;
|
|
286
|
+
try {
|
|
287
|
+
payload = await res.json();
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
return [];
|
|
291
|
+
}
|
|
292
|
+
if (!Array.isArray(payload) || generation !== this.engineGeneration)
|
|
293
|
+
return [];
|
|
294
|
+
const usage = [];
|
|
295
|
+
const now = Date.now();
|
|
296
|
+
for (const entry of payload) {
|
|
297
|
+
if (!entry || typeof entry !== 'object')
|
|
298
|
+
continue;
|
|
299
|
+
const slot = entry.id;
|
|
300
|
+
const cachedTokens = entry.n_cache_tokens;
|
|
301
|
+
if (typeof slot !== 'number' || typeof cachedTokens !== 'number' || cachedTokens <= 0) {
|
|
302
|
+
continue;
|
|
303
|
+
}
|
|
304
|
+
const sessionId = this.slotToSession.get(slot);
|
|
305
|
+
if (!sessionId)
|
|
306
|
+
continue;
|
|
307
|
+
usage.push({
|
|
308
|
+
sessionId,
|
|
309
|
+
tokenCount: cachedTokens,
|
|
310
|
+
estBytes: cachedTokens * ESTIMATED_BYTES_PER_TOKEN,
|
|
311
|
+
// /slots doesn't report a wall-clock; use our local "last
|
|
312
|
+
// touched" approximation. Good enough for LRU comparisons.
|
|
313
|
+
lastUsedAt: now,
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
return usage;
|
|
317
|
+
}
|
|
318
|
+
async warm(_sessionId, _messages) {
|
|
319
|
+
// llama-server doesn't expose a dedicated warm endpoint and the
|
|
320
|
+
// n_predict:0 trick on /v1/completions would still need to claim
|
|
321
|
+
// a slot exclusively — risking starvation of real sessions on
|
|
322
|
+
// tight slot budgets. Phase 1.3 instead establishes prefix files
|
|
323
|
+
// as a side effect of the first session save (see saveSlotForSession),
|
|
324
|
+
// which pays no extra HTTP round-trip on hot path. Subsequent
|
|
325
|
+
// session opens for the same gezel restore the prefix file on
|
|
326
|
+
// allocate.
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Flush every currently-bound slot to disk. Called by the provider's
|
|
330
|
+
* shutdown path so a clean supervisor stop preserves all live
|
|
331
|
+
* sessions for the next boot.
|
|
332
|
+
*/
|
|
333
|
+
async flushAll() {
|
|
334
|
+
if (!this.slotSavePath)
|
|
335
|
+
return 0;
|
|
336
|
+
const generation = this.engineGeneration;
|
|
337
|
+
let saved = 0;
|
|
338
|
+
for (const [sessionId, slot] of this.sessionToSlot) {
|
|
339
|
+
if (await this.saveSlotForSession(slot, sessionId))
|
|
340
|
+
saved++;
|
|
341
|
+
if (generation !== this.engineGeneration)
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
return saved;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Async path: allocate a slot for `sessionId`, save the LRU victim
|
|
348
|
+
* (if any) to disk, and try to restore the new slot from disk
|
|
349
|
+
* (per-session file or gezel-prefix file). Called from
|
|
350
|
+
* {@link prepareForSend}.
|
|
351
|
+
*/
|
|
352
|
+
async allocateSlot(sessionId) {
|
|
353
|
+
const generation = this.engineGeneration;
|
|
354
|
+
const previous = this.allocationTail;
|
|
355
|
+
let release;
|
|
356
|
+
this.allocationTail = new Promise((resolve) => {
|
|
357
|
+
release = resolve;
|
|
358
|
+
});
|
|
359
|
+
await previous;
|
|
360
|
+
try {
|
|
361
|
+
this.assertEngineGeneration(generation);
|
|
362
|
+
return await this.allocateSlotUnlocked(sessionId, generation);
|
|
363
|
+
}
|
|
364
|
+
finally {
|
|
365
|
+
release();
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
assertEngineGeneration(generation) {
|
|
369
|
+
if (generation !== this.engineGeneration) {
|
|
370
|
+
throw new Error('The local engine stopped while preparing the conversation cache. Retry the turn.');
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
async allocateSlotUnlocked(sessionId, generation) {
|
|
374
|
+
const existing = this.sessionToSlot.get(sessionId);
|
|
375
|
+
if (existing !== undefined) {
|
|
376
|
+
// Promote in LRU.
|
|
377
|
+
const idx = this.slotOrder.indexOf(existing);
|
|
378
|
+
if (idx !== -1)
|
|
379
|
+
this.slotOrder.splice(idx, 1);
|
|
380
|
+
this.slotOrder.push(existing);
|
|
381
|
+
return existing;
|
|
382
|
+
}
|
|
383
|
+
// First, claim any unused slot.
|
|
384
|
+
let chosen = null;
|
|
385
|
+
if (this.sessionToSlot.size < this.slotCount) {
|
|
386
|
+
for (let s = 0; s < this.slotCount; s++) {
|
|
387
|
+
if (!this.slotToSession.has(s)) {
|
|
388
|
+
chosen = s;
|
|
389
|
+
break;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// All slots taken — recycle the LRU slot. Save victim to disk
|
|
394
|
+
// before recycling so it can resume on next access.
|
|
395
|
+
if (chosen === null) {
|
|
396
|
+
const victimSlot = this.slotOrder.shift();
|
|
397
|
+
if (victimSlot === undefined) {
|
|
398
|
+
// Shouldn't happen — if all slots are bound, slotOrder must be
|
|
399
|
+
// populated. Fall back to round-robin to stay alive.
|
|
400
|
+
chosen = this.nextSlotToTry % this.slotCount;
|
|
401
|
+
this.nextSlotToTry++;
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
chosen = victimSlot;
|
|
405
|
+
}
|
|
406
|
+
const victimSession = this.slotToSession.get(chosen);
|
|
407
|
+
if (victimSession !== undefined) {
|
|
408
|
+
const saved = await this.saveSlotForSession(chosen, victimSession);
|
|
409
|
+
this.assertEngineGeneration(generation);
|
|
410
|
+
log.debug(`slot ${chosen} recycled: evicting session ${victimSession.slice(0, 8)} for ${sessionId.slice(0, 8)} (disk save: ${saved ? 'ok' : 'MISSED'})`);
|
|
411
|
+
this.sessionToSlot.delete(victimSession);
|
|
412
|
+
this.slotToSession.delete(chosen);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// We now have a slot id `chosen` that's free of any current binding.
|
|
416
|
+
// Try to restore: per-session file first, then gezel-prefix file.
|
|
417
|
+
// Restore is best-effort; failure leaves the slot empty and the
|
|
418
|
+
// next request just prefills from scratch.
|
|
419
|
+
const restored = await this.tryRestoreForSession(chosen, sessionId);
|
|
420
|
+
this.assertEngineGeneration(generation);
|
|
421
|
+
if (restored)
|
|
422
|
+
this.restoredSessions.add(sessionId);
|
|
423
|
+
log.debug(`slot ${chosen} bound to session ${sessionId.slice(0, 8)} (disk restore: ${restored ? 'hit' : 'none — next request prefills from scratch'})`);
|
|
424
|
+
this.bind(sessionId, chosen);
|
|
425
|
+
return chosen;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Synchronous fallback. Used by {@link buildRequestExtras} so the
|
|
429
|
+
* existing call sites that don't await `prepareForSend` (unit tests,
|
|
430
|
+
* code paths that don't have a system prompt to share) still get a
|
|
431
|
+
* deterministic slot assignment. No disk I/O — just the in-memory
|
|
432
|
+
* LRU allocator we shipped in Phase 1.
|
|
433
|
+
*/
|
|
434
|
+
allocateSlotInMemory(sessionId) {
|
|
435
|
+
const existing = this.sessionToSlot.get(sessionId);
|
|
436
|
+
if (existing !== undefined) {
|
|
437
|
+
const idx = this.slotOrder.indexOf(existing);
|
|
438
|
+
if (idx !== -1)
|
|
439
|
+
this.slotOrder.splice(idx, 1);
|
|
440
|
+
this.slotOrder.push(existing);
|
|
441
|
+
return existing;
|
|
442
|
+
}
|
|
443
|
+
if (this.sessionToSlot.size < this.slotCount) {
|
|
444
|
+
for (let s = 0; s < this.slotCount; s++) {
|
|
445
|
+
if (!this.slotToSession.has(s)) {
|
|
446
|
+
this.bind(sessionId, s);
|
|
447
|
+
return s;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
const victimSlot = this.slotOrder.shift();
|
|
452
|
+
if (victimSlot === undefined) {
|
|
453
|
+
const slot = this.nextSlotToTry % this.slotCount;
|
|
454
|
+
this.nextSlotToTry++;
|
|
455
|
+
this.evictSlot(slot);
|
|
456
|
+
this.bind(sessionId, slot);
|
|
457
|
+
return slot;
|
|
458
|
+
}
|
|
459
|
+
this.evictSlot(victimSlot);
|
|
460
|
+
this.bind(sessionId, victimSlot);
|
|
461
|
+
return victimSlot;
|
|
462
|
+
}
|
|
463
|
+
evictSlot(slot) {
|
|
464
|
+
const prev = this.slotToSession.get(slot);
|
|
465
|
+
if (prev === undefined)
|
|
466
|
+
return;
|
|
467
|
+
this.sessionToSlot.delete(prev);
|
|
468
|
+
this.slotToSession.delete(slot);
|
|
469
|
+
}
|
|
470
|
+
bind(sessionId, slot) {
|
|
471
|
+
this.sessionToSlot.set(sessionId, slot);
|
|
472
|
+
this.slotToSession.set(slot, sessionId);
|
|
473
|
+
this.slotOrder.push(slot);
|
|
474
|
+
}
|
|
475
|
+
/**
|
|
476
|
+
* POST /slots/{id}?action=save with the session's stable filename.
|
|
477
|
+
* Also seeds the prefix-<hash>.bin file on the FIRST save for a
|
|
478
|
+
* given gezel-prefix this process — subsequent sessions sharing the
|
|
479
|
+
* prefix can then restore that file on allocate. Returns true on
|
|
480
|
+
* success.
|
|
481
|
+
*/
|
|
482
|
+
async pruneDiskCache() {
|
|
483
|
+
if (!this.diskCacheRoot)
|
|
484
|
+
return;
|
|
485
|
+
try {
|
|
486
|
+
const result = await pruneLlamaDiskCache(this.diskCacheRoot, this.diskCacheBudgetBytes);
|
|
487
|
+
if (result.removedFiles)
|
|
488
|
+
log.info(`Pruned ${result.removedFiles} llama snapshots (${result.removedBytes} bytes); retained ${result.bytes} bytes`);
|
|
489
|
+
if (this.diskCacheBudgetBytes && result.bytes > this.diskCacheBudgetBytes)
|
|
490
|
+
log.warn('Llama disk cache remains over budget; some files could not be removed');
|
|
491
|
+
}
|
|
492
|
+
catch (error) {
|
|
493
|
+
log.warn(`Could not enforce llama disk cache budget: ${String(error)}`);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
async saveSlotForSession(slot, sessionId) {
|
|
497
|
+
if (!this.slotSavePath || !this.diskCacheRoot)
|
|
498
|
+
return false;
|
|
499
|
+
const slotSavePath = this.slotSavePath;
|
|
500
|
+
const generation = this.engineGeneration;
|
|
501
|
+
return withLlamaDiskCache(this.diskCacheRoot, async () => {
|
|
502
|
+
await this.pruneDiskCache();
|
|
503
|
+
// Cache persistence is optional. Leave headroom for a large snapshot
|
|
504
|
+
// plus durable product state; prefix copies receive their own check.
|
|
505
|
+
// This is a conservative preflight, not a filesystem reservation.
|
|
506
|
+
try {
|
|
507
|
+
const disk = await statfs(slotSavePath);
|
|
508
|
+
const reserve = DEFAULT_LLAMA_DISK_CACHE_MB * 1024 * 1024 + 1024 ** 3;
|
|
509
|
+
if (disk.bavail * disk.bsize < reserve) {
|
|
510
|
+
log.warn('Skipping optional llama snapshot: insufficient free disk space');
|
|
511
|
+
return false;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
catch {
|
|
515
|
+
log.warn('Skipping optional llama snapshot: could not inspect free disk space');
|
|
516
|
+
return false;
|
|
517
|
+
}
|
|
518
|
+
try {
|
|
519
|
+
return await this.saveSlotForSessionUnlocked(slot, sessionId, generation);
|
|
520
|
+
}
|
|
521
|
+
finally {
|
|
522
|
+
// Includes prefix copies and removes even a single oversized snapshot.
|
|
523
|
+
await this.pruneDiskCache();
|
|
524
|
+
}
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
async saveSlotForSessionUnlocked(slot, sessionId, generation) {
|
|
528
|
+
if (!this.slotSavePath)
|
|
529
|
+
return false;
|
|
530
|
+
if (this.slotActionsUnsupported)
|
|
531
|
+
return false;
|
|
532
|
+
if (generation !== this.engineGeneration)
|
|
533
|
+
return false;
|
|
534
|
+
const baseUrl = await this.resolveBaseUrl().catch(() => null);
|
|
535
|
+
if (!baseUrl || generation !== this.engineGeneration)
|
|
536
|
+
return false;
|
|
537
|
+
const filename = sessFilename(sessionId);
|
|
538
|
+
const ok = await this.invokeSlotAction(baseUrl, slot, 'save', filename, generation);
|
|
539
|
+
if (!ok)
|
|
540
|
+
return false;
|
|
541
|
+
// Seed the gezel prefix file on first save. We use copyFile (not
|
|
542
|
+
// hardlink) so a future session's slot save under sess-<id>.bin
|
|
543
|
+
// can't truncate-overwrite the prefix file via shared inode.
|
|
544
|
+
// Skipped if the prefix file already exists (best-effort stat
|
|
545
|
+
// check) so we only pay the extra copy cost once per gezel-prefix
|
|
546
|
+
// per process.
|
|
547
|
+
const prefixId = this.sessionPrefix.get(sessionId);
|
|
548
|
+
if (prefixId && !this.seededPrefixes.has(prefixId)) {
|
|
549
|
+
const sessPath = join(this.slotSavePath, filename);
|
|
550
|
+
const prefixPath = join(this.slotSavePath, prefixFilename(prefixId));
|
|
551
|
+
try {
|
|
552
|
+
// Skip if a file with this prefix name already exists from a
|
|
553
|
+
// prior process — we don't need to overwrite a sibling save.
|
|
554
|
+
const existing = await stat(prefixPath).catch(() => null);
|
|
555
|
+
if (!existing) {
|
|
556
|
+
const snapshot = await stat(sessPath);
|
|
557
|
+
// Do not double an oversized snapshot only to immediately prune it.
|
|
558
|
+
if (this.diskCacheBudgetBytes && snapshot.size > this.diskCacheBudgetBytes)
|
|
559
|
+
return true;
|
|
560
|
+
const disk = await statfs(this.slotSavePath);
|
|
561
|
+
if (disk.bavail * disk.bsize < snapshot.size + 1024 ** 3)
|
|
562
|
+
return true;
|
|
563
|
+
await copyFile(sessPath, prefixPath, constants.COPYFILE_EXCL);
|
|
564
|
+
}
|
|
565
|
+
this.seededPrefixes.add(prefixId);
|
|
566
|
+
}
|
|
567
|
+
catch {
|
|
568
|
+
// Disk-level errors here are silent — the per-session file
|
|
569
|
+
// saved fine, prefix sharing just doesn't kick in this turn.
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
return true;
|
|
573
|
+
}
|
|
574
|
+
/** Try restore-by-session, then restore-by-prefix. Returns true if
|
|
575
|
+
* any restore succeeded. */
|
|
576
|
+
async tryRestoreForSession(slot, sessionId) {
|
|
577
|
+
if (!this.slotSavePath || !this.diskCacheRoot)
|
|
578
|
+
return false;
|
|
579
|
+
const generation = this.engineGeneration;
|
|
580
|
+
return withLlamaDiskCache(this.diskCacheRoot, () => this.tryRestoreForSessionUnlocked(slot, sessionId, generation));
|
|
581
|
+
}
|
|
582
|
+
async tryRestoreForSessionUnlocked(slot, sessionId, generation) {
|
|
583
|
+
if (!this.slotSavePath)
|
|
584
|
+
return false;
|
|
585
|
+
if (this.slotActionsUnsupported)
|
|
586
|
+
return false;
|
|
587
|
+
if (generation !== this.engineGeneration)
|
|
588
|
+
return false;
|
|
589
|
+
const baseUrl = await this.resolveBaseUrl().catch(() => null);
|
|
590
|
+
if (!baseUrl || generation !== this.engineGeneration)
|
|
591
|
+
return false;
|
|
592
|
+
const sessPath = join(this.slotSavePath, sessFilename(sessionId));
|
|
593
|
+
if (await stat(sessPath).catch(() => null)) {
|
|
594
|
+
const ok = await this.invokeSlotAction(baseUrl, slot, 'restore', sessFilename(sessionId), generation);
|
|
595
|
+
if (ok) {
|
|
596
|
+
await utimes(sessPath, new Date(), new Date()).catch(() => { });
|
|
597
|
+
return true;
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
if (generation !== this.engineGeneration)
|
|
601
|
+
return false;
|
|
602
|
+
// Layered cascade (flag ON): try most-specific (gp) then gezel. Once a
|
|
603
|
+
// layer file restores, llama-server's `cache_prompt` LCP-matches it
|
|
604
|
+
// against the actual prompt and reuses the common leading prefix.
|
|
605
|
+
const layered = this.sessionLayerPrefixes.get(sessionId);
|
|
606
|
+
if (layered && layered.length > 0) {
|
|
607
|
+
for (const pid of layered) {
|
|
608
|
+
const path = join(this.slotSavePath, prefixFilename(pid));
|
|
609
|
+
if (!(await stat(path).catch(() => null)))
|
|
610
|
+
continue;
|
|
611
|
+
if (await this.invokeSlotAction(baseUrl, slot, 'restore', prefixFilename(pid), generation)) {
|
|
612
|
+
await utimes(path, new Date(), new Date()).catch(() => { });
|
|
613
|
+
return true;
|
|
614
|
+
}
|
|
615
|
+
if (generation !== this.engineGeneration)
|
|
616
|
+
return false;
|
|
617
|
+
}
|
|
618
|
+
return false;
|
|
619
|
+
}
|
|
620
|
+
const prefixId = this.sessionPrefix.get(sessionId);
|
|
621
|
+
if (!prefixId)
|
|
622
|
+
return false;
|
|
623
|
+
const prefixPath = join(this.slotSavePath, prefixFilename(prefixId));
|
|
624
|
+
if (!(await stat(prefixPath).catch(() => null)))
|
|
625
|
+
return false;
|
|
626
|
+
const restored = await this.invokeSlotAction(baseUrl, slot, 'restore', prefixFilename(prefixId), generation);
|
|
627
|
+
if (restored)
|
|
628
|
+
await utimes(prefixPath, new Date(), new Date()).catch(() => { });
|
|
629
|
+
return restored;
|
|
630
|
+
}
|
|
631
|
+
/**
|
|
632
|
+
* POST /slots/{id}?action={save|restore} with `{filename}` body.
|
|
633
|
+
* llama-server returns 200 on success or 4xx/5xx with a JSON error
|
|
634
|
+
* payload on failure (e.g. file missing on restore, server lacks
|
|
635
|
+
* --slot-save-path). All failures are best-effort: the caller treats
|
|
636
|
+
* them as "no cache" and proceeds.
|
|
637
|
+
*/
|
|
638
|
+
async invokeSlotAction(baseUrl, slot, action, filename, generation) {
|
|
639
|
+
if (generation !== this.engineGeneration)
|
|
640
|
+
return false;
|
|
641
|
+
const token = this.resolveAuthToken();
|
|
642
|
+
try {
|
|
643
|
+
const res = await this.fetchImpl(`${baseUrl}/slots/${slot}?action=${action}`, {
|
|
644
|
+
method: 'POST',
|
|
645
|
+
headers: {
|
|
646
|
+
'Content-Type': 'application/json',
|
|
647
|
+
...(token ? { Authorization: `Bearer ${token}` } : {}),
|
|
648
|
+
},
|
|
649
|
+
body: JSON.stringify({ filename }),
|
|
650
|
+
});
|
|
651
|
+
if (generation !== this.engineGeneration)
|
|
652
|
+
return false;
|
|
653
|
+
if (!res.ok) {
|
|
654
|
+
// 501 Not Implemented (or 5xx with a multimodal-specific body)
|
|
655
|
+
// means this server permanently refuses slot save/restore — flip
|
|
656
|
+
// the latch so we stop trying for the rest of the process.
|
|
657
|
+
// Reading the body is best-effort; if anything throws we still
|
|
658
|
+
// latch on the bare status because that's the unambiguous
|
|
659
|
+
// server-side capability gate.
|
|
660
|
+
if (res.status === 501) {
|
|
661
|
+
this.slotActionsUnsupported = true;
|
|
662
|
+
}
|
|
663
|
+
else if (res.status >= 500) {
|
|
664
|
+
try {
|
|
665
|
+
const body = await res.text();
|
|
666
|
+
if (generation !== this.engineGeneration)
|
|
667
|
+
return false;
|
|
668
|
+
if (/not supported by multimodal/i.test(body)) {
|
|
669
|
+
this.slotActionsUnsupported = true;
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
catch {
|
|
673
|
+
// ignore — `res.ok` is already false, the action failed
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
if (this.slotActionsUnsupported) {
|
|
677
|
+
log.warn(`slot ${action} returned ${res.status}: server refuses slot save/restore — disk persistence disabled for this process`);
|
|
678
|
+
}
|
|
679
|
+
else {
|
|
680
|
+
log.debug(`slot ${action} slot=${slot} file=${filename} failed: HTTP ${res.status}`);
|
|
681
|
+
}
|
|
682
|
+
}
|
|
683
|
+
return res.ok;
|
|
684
|
+
}
|
|
685
|
+
catch {
|
|
686
|
+
return false;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
}
|