kiku-agent 1.2.0 → 1.3.1

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.
Files changed (131) hide show
  1. package/README.md +459 -407
  2. package/package.json +32 -3
  3. package/server/agent/agentCore.js +635 -267
  4. package/server/agent/appPaths.js +2 -0
  5. package/server/agent/catalogEntityResolver.js +637 -0
  6. package/server/agent/citations.js +0 -21
  7. package/server/agent/clarificationAnalytics.js +1 -1
  8. package/server/agent/clarifyingQuestions.js +286 -216
  9. package/server/agent/cli.js +532 -73
  10. package/server/agent/commandFeatures.js +123 -24
  11. package/server/agent/commandRegistry.js +128 -62
  12. package/server/agent/commands.js +1410 -95
  13. package/server/agent/config.js +253 -163
  14. package/server/agent/contextCompactor.js +239 -25
  15. package/server/agent/dynamicCatalog.js +192 -0
  16. package/server/agent/envBootstrap.js +46 -0
  17. package/server/agent/envManager.js +317 -0
  18. package/server/agent/eventBus.js +3 -3
  19. package/server/agent/feedbackLearning.js +0 -8
  20. package/server/agent/gpuMetrics.js +188 -55
  21. package/server/agent/ingestionWorker.js +339 -0
  22. package/server/agent/ink/App.jsx +348 -0
  23. package/server/agent/ink/Panel.jsx +54 -0
  24. package/server/agent/ink/PromptInput.jsx +321 -0
  25. package/server/agent/ink/TaskPlanPanel.jsx +88 -0
  26. package/server/agent/ink/ThinkingPanel.jsx +68 -0
  27. package/server/agent/ink/ToolResult.jsx +133 -0
  28. package/server/agent/ink/main.jsx +195 -0
  29. package/server/agent/ink/useEventBus.js +218 -0
  30. package/server/agent/lanDiscovery.js +369 -0
  31. package/server/agent/llmClient.js +111 -39
  32. package/server/agent/lmStudioWakeup.js +144 -0
  33. package/server/agent/mcpClient.js +2 -2
  34. package/server/agent/memory/contextAllocator.js +214 -0
  35. package/server/agent/memory/hierarchicalStore.js +523 -0
  36. package/server/agent/memory/reflectionWorker.js +110 -0
  37. package/server/agent/memory.js +635 -494
  38. package/server/agent/modelConfig.js +487 -0
  39. package/server/agent/newsIntelligence.js +219 -0
  40. package/server/agent/newsWatch.js +85 -0
  41. package/server/agent/prompts.js +146 -0
  42. package/server/agent/publicTools.js +7 -0
  43. package/server/agent/queryDetails.js +62 -1
  44. package/server/agent/research.js +314 -35
  45. package/server/agent/routingInterceptor.js +77 -0
  46. package/server/agent/rumoredProjects.js +15 -0
  47. package/server/agent/sanitizer.js +117 -17
  48. package/server/agent/subagent.js +52 -9
  49. package/server/agent/suggestionTui.js +33 -13
  50. package/server/agent/suggestions.js +29 -13
  51. package/server/agent/telemetry/hardwareTiers.js +332 -0
  52. package/server/agent/telemetry/runtimeWatchdog.js +66 -0
  53. package/server/agent/telemetry/techPowerUpClient.js +682 -0
  54. package/server/agent/telemetry/techpowerup-mcp.json +22 -0
  55. package/server/agent/telemetry.js +0 -11
  56. package/server/agent/terminalImage.js +0 -1
  57. package/server/agent/textToolProtocol.js +190 -0
  58. package/server/agent/tokenTracker.js +220 -0
  59. package/server/agent/toolRouter.js +362 -216
  60. package/server/agent/tools.js +1155 -194
  61. package/server/agent/ui.js +144 -41
  62. package/server/agent/vramService.js +572 -0
  63. package/server/agent/webSearch.js +2279 -273
  64. package/server/agent/websearch/adapters/duckduckgo.js +97 -0
  65. package/server/agent/websearch/adapters/jina.js +77 -0
  66. package/server/agent/websearch/adapters/searxng.js +57 -0
  67. package/server/agent/websearch/core/canonical.js +89 -0
  68. package/server/agent/websearch/core/fusion.js +81 -0
  69. package/server/agent/websearch/core/types.js +29 -0
  70. package/server/agent/websearch/extract.js +605 -0
  71. package/server/agent/websearch/index.js +43 -0
  72. package/server/agent/websearch/orchestrator.js +266 -0
  73. package/server/agent/websearch/resilience/breaker.js +97 -0
  74. package/server/agent/websearch/resilience/cache.js +59 -0
  75. package/server/agent/websearch/resilience/limiter.js +93 -0
  76. package/server/agent/websearch/security/filter.js +36 -0
  77. package/server/agent/websearch/security/ssrf.js +289 -0
  78. package/server/agent/websearch/telemetry.js +71 -0
  79. package/server/agent/youtubeAuth.js +82 -73
  80. package/server/agent/youtubeTranscript.js +209 -0
  81. package/server/apiRouter.js +390 -190
  82. package/server/mcp/data/brands.js +5 -5
  83. package/server/mcp/data/discography.js +56 -45
  84. package/server/mcp/data/gallery.js +9 -0
  85. package/server/mcp/data/index.js +1 -0
  86. package/server/mcp/data/industryIndex.js +251 -0
  87. package/server/mcp/data/profile.js +5 -5
  88. package/server/mcp/data/timeline.js +2 -2
  89. package/server/mcp/data/works.js +2 -2
  90. package/server/mcp/handler.js +0 -2
  91. package/server/mcp/prompts.js +42 -2
  92. package/server/mcp/resources.js +5 -1
  93. package/server/mcp/security.js +25 -14
  94. package/server/mcp/server.js +92 -3
  95. package/server/mcp/tools.js +20 -11
  96. package/server/routes/agent.js +55 -0
  97. package/server/web-chat/core/connection.js +218 -194
  98. package/server/web-chat/core/conversationContext.js +1 -1
  99. package/server/web-chat/core/directCatalogEngine.js +190 -184
  100. package/server/web-chat/core/followUpEngine.js +88 -11
  101. package/server/web-chat/core/security.js +7 -4
  102. package/server/web-chat/router.js +54 -17
  103. package/server/web-chat/routes/bilibiliRoute.js +34 -0
  104. package/server/web-chat/routes/chatRoute.js +488 -397
  105. package/server/web-chat/routes/clarifyConfigRoute.js +1 -2
  106. package/server/web-chat/routes/exportRoute.js +2 -1
  107. package/server/web-chat/routes/lanDiscoveryRoute.js +90 -0
  108. package/server/web-chat/routes/newsRoute.js +36 -6
  109. package/server/web-chat/routes/providerRoute.js +87 -0
  110. package/server/web-chat/routes/staticRoute.js +61 -13
  111. package/server/web-chat/routes/statusRoute.js +23 -2
  112. package/server/web-chat/routes/vramRoute.js +22 -0
  113. package/server/web-chat/server.js +135 -106
  114. package/server/web-chat/ui/htmlBuilder.js +8 -8
  115. package/server/web-chat/ui/previews/modelSettings.preview.html +41 -0
  116. package/server/web-chat/ui/scripts/agentBubbleSystem.js +0 -5
  117. package/server/web-chat/ui/scripts/client.js +10526 -8397
  118. package/server/web-chat/ui/scripts/webchatI18n.js +190 -138
  119. package/server/web-chat/ui/styles/main.css +7471 -4246
  120. package/server/web-chat/ui/templates/body.html +305 -179
  121. package/src/data/brandsData.js +29 -6
  122. package/src/data/discographyData.js +918 -900
  123. package/src/data/galleryData.js +66 -0
  124. package/src/data/industryIndexData.js +292 -0
  125. package/src/data/musicVideoData.js +48 -5
  126. package/src/data/profileData.js +15 -1
  127. package/src/data/timelineData.js +4 -3
  128. package/src/data/worksData.js +536 -535
  129. package/src/lib/vram/estimator.js +464 -0
  130. package/src/lib/vram/modelRegistry.js +387 -0
  131. package/tokens.css +33 -2
@@ -0,0 +1,387 @@
1
+ /**
2
+ * Built-in architecture registry for LM Studio models that advertise
3
+ * TOOL CALLING, VISION, or REASONING capabilities.
4
+ *
5
+ * Used as a fallback when neither GGUF metadata nor a HuggingFace config.json
6
+ * can be resolved. Geometry fields were verified against each model's published
7
+ * HuggingFace config.json (and HF safetensors totals where available) — see the
8
+ * `verified` tag per entry. All entries remain flagged `approx` because exact
9
+ * checkpoint metadata always wins when it can be read directly.
10
+ *
11
+ * paramCount semantics: total parameters loaded into VRAM (HF `safetensors.total`
12
+ * where shown, i.e. INCLUDING the vision encoder for multimodal models). For MoE
13
+ * models this is the TOTAL parameter count, not the active routing parameters.
14
+ *
15
+ * `capabilities` mirrors what LM Studio badges for the family:
16
+ * - 'tools' → native function/tool calling support
17
+ * - 'vision' → image input support in LM Studio
18
+ * - 'reasoning' → thinking/reasoning channels (harmony, <think>, Z1, etc.)
19
+ */
20
+
21
+ export const MODEL_REGISTRY = Object.freeze([
22
+ {
23
+ label: 'Gemma 3n E4B (incl. community "gemma-4-e4b")',
24
+ patterns: ['gemma-4-e4b', 'gemma4-e4b', 'gemma-3n-e4b', 'gemma3n-e4b'],
25
+ capabilities: ['vision'],
26
+ paramsB: 8.0,
27
+ layers: 35,
28
+ queryHeads: 8,
29
+ kvHeads: 2,
30
+ headDim: 256,
31
+ hiddenSize: 2048,
32
+ contextLength: 32768,
33
+ swa: { windowTokens: 512, patternLocal: 5, patternGlobal: 1 },
34
+ vision: { encoderParamsB: null, tokensPerImage: 576 },
35
+ approx: true,
36
+ verified: 'hf-config (mlx-community/gemma-3n-E4B-it-4bit)',
37
+ notes: 'Raw ~8B params loaded incl. MobileNet-V5 vision + audio encoders; MatFormer effective-4B class. Vision emits ~256 tokens/image — 576 here is the conservative floor.',
38
+ },
39
+ {
40
+ label: 'Gemma 3 4B IT',
41
+ patterns: ['gemma-3-4b', 'gemma3-4b'],
42
+ capabilities: ['vision'],
43
+ paramsB: 4.3,
44
+ layers: 34,
45
+ queryHeads: 8,
46
+ kvHeads: 4,
47
+ headDim: 256,
48
+ hiddenSize: 2560,
49
+ contextLength: 131072,
50
+ swa: { windowTokens: 1024, patternLocal: 5, patternGlobal: 1 },
51
+ vision: { encoderParamsB: null, tokensPerImage: 2048 },
52
+ approx: true,
53
+ verified: 'hf-config+api (unsloth/gemma-3-4b-it)',
54
+ notes: 'Total 4.30B incl. SigLIP-400M vision (paramsB already includes it). 5:1 local:global sliding-window hybrid; image tokens scale with resolution (896px ≈ 4k raw, clamped).',
55
+ },
56
+ {
57
+ label: 'Gemma 3 12B IT',
58
+ patterns: ['gemma-3-12b', 'gemma3-12b'],
59
+ capabilities: ['vision'],
60
+ paramsB: 12.19,
61
+ layers: 48,
62
+ queryHeads: 16,
63
+ kvHeads: 8,
64
+ headDim: 256,
65
+ hiddenSize: 3840,
66
+ contextLength: 131072,
67
+ swa: { windowTokens: 1024, patternLocal: 5, patternGlobal: 1 },
68
+ vision: { encoderParamsB: null, tokensPerImage: 2048 },
69
+ approx: true,
70
+ verified: 'hf-config+api (unsloth/gemma-3-12b-it)',
71
+ notes: 'Total 12.19B incl. vision encoder.',
72
+ },
73
+ {
74
+ label: 'Gemma 3 27B IT',
75
+ patterns: ['gemma-3-27b', 'gemma3-27b'],
76
+ capabilities: ['vision'],
77
+ paramsB: 27.43,
78
+ layers: 62,
79
+ queryHeads: 32,
80
+ kvHeads: 16,
81
+ headDim: 128,
82
+ hiddenSize: 5376,
83
+ contextLength: 131072,
84
+ swa: { windowTokens: 1024, patternLocal: 5, patternGlobal: 1 },
85
+ vision: { encoderParamsB: null, tokensPerImage: 2048 },
86
+ approx: true,
87
+ verified: 'hf-config+api (unsloth/gemma-3-27b-it)',
88
+ notes: 'Total 27.43B incl. vision encoder.',
89
+ },
90
+ {
91
+ label: 'Qwen2.5 7B Instruct (+ Coder 7B)',
92
+ patterns: ['qwen2.5-7b', 'qwen25-7b', 'qwen2.5-coder-7b'],
93
+ capabilities: ['tools'],
94
+ paramsB: 7.62,
95
+ layers: 28,
96
+ queryHeads: 28,
97
+ kvHeads: 4,
98
+ headDim: 128,
99
+ hiddenSize: 3584,
100
+ contextLength: 32768,
101
+ approx: true,
102
+ verified: 'hf-config+api (Qwen/Qwen2.5-7B-Instruct)',
103
+ notes: 'Native LM Studio tool use. 7.6156B exact.',
104
+ },
105
+ {
106
+ label: 'Qwen2.5 14B Instruct (+ Coder 14B)',
107
+ patterns: ['qwen2.5-14b', 'qwen25-14b', 'qwen2.5-coder-14b'],
108
+ capabilities: ['tools'],
109
+ paramsB: 14.77,
110
+ layers: 48,
111
+ queryHeads: 40,
112
+ kvHeads: 8,
113
+ headDim: 128,
114
+ hiddenSize: 5120,
115
+ contextLength: 32768,
116
+ approx: true,
117
+ verified: 'hf-config+api (Qwen/Qwen2.5-14B-Instruct)',
118
+ notes: 'Native tool use; 128k window reachable only via YaRN.',
119
+ },
120
+ {
121
+ label: 'Qwen2.5-Coder-32B-Instruct',
122
+ patterns: ['qwen2.5-coder-32b', 'qwen2.5-32b'],
123
+ capabilities: ['tools'],
124
+ paramsB: 32.76,
125
+ layers: 64,
126
+ queryHeads: 40,
127
+ kvHeads: 8,
128
+ headDim: 128,
129
+ hiddenSize: 5120,
130
+ contextLength: 32768,
131
+ approx: true,
132
+ verified: 'hf-config+api (Qwen/Qwen2.5-Coder-32B-Instruct)',
133
+ notes: '32.7639B exact; config ctx 32,768 (sliding window to 131,072 via YaRN).',
134
+ },
135
+ {
136
+ label: 'Qwen2.5-VL 7B Instruct',
137
+ patterns: ['qwen2.5-vl-7b', 'qwen2-vl-7b'],
138
+ capabilities: ['vision'],
139
+ paramsB: 8.29,
140
+ layers: 28,
141
+ queryHeads: 28,
142
+ kvHeads: 4,
143
+ headDim: 128,
144
+ hiddenSize: 3584,
145
+ contextLength: 128000,
146
+ vision: { encoderParamsB: null, tokensPerImage: 1024 },
147
+ approx: true,
148
+ verified: 'hf-config+api (Qwen/Qwen2.5-VL-7B-Instruct)',
149
+ notes: 'Total 8.292B incl. dynamic-resolution ViT (paramsB already includes it). Image tokens vary heavily with resolution — 1024 is a mid-range placeholder.',
150
+ },
151
+ {
152
+ label: 'Qwen3 8B (hybrid thinking)',
153
+ patterns: ['qwen3-8b'],
154
+ capabilities: ['tools', 'reasoning'],
155
+ paramsB: 8.19,
156
+ layers: 36,
157
+ queryHeads: 32,
158
+ kvHeads: 8,
159
+ headDim: 128,
160
+ hiddenSize: 4096,
161
+ contextLength: 40960,
162
+ approx: true,
163
+ verified: 'hf-config+api (Qwen/Qwen3-8B)',
164
+ notes: 'Single-model tool use + <think> reasoning; enable/disable thinking via chat template kwargs.',
165
+ },
166
+ {
167
+ label: 'Qwen3 30B-A3B 2507 (MoE, total params)',
168
+ patterns: ['qwen3-30b-a3b-instruct-2507', 'qwen3-30b-a3b-thinking-2507', 'qwen3-30b-a3b', 'qwen3-30b'],
169
+ capabilities: ['tools', 'reasoning'],
170
+ paramsB: 30.53,
171
+ layers: 48,
172
+ queryHeads: 32,
173
+ kvHeads: 4,
174
+ headDim: 128,
175
+ hiddenSize: 2048,
176
+ contextLength: 262144,
177
+ isMoE: true,
178
+ approx: true,
179
+ verified: 'hf-config+api (Qwen/Qwen3-30B-A3B-Instruct-2507)',
180
+ notes: 'MoE: all 30.53B params sit in VRAM, ~3.3B active per token. Thinking-2507 twin has the same geometry (reasoning); Instruct-2507 drops the thinking channel. 262,144 native context.',
181
+ },
182
+ {
183
+ label: 'Llama 3.1 8B Instruct',
184
+ patterns: ['llama-3.1-8b', 'llama3.1-8b', 'meta-llama-3.1-8b'],
185
+ capabilities: ['tools'],
186
+ paramsB: 8.03,
187
+ layers: 32,
188
+ queryHeads: 32,
189
+ kvHeads: 8,
190
+ headDim: 128,
191
+ hiddenSize: 4096,
192
+ contextLength: 131072,
193
+ approx: true,
194
+ verified: 'hf-config+api (NousResearch/Meta-Llama-3.1-8B-Instruct)',
195
+ notes: 'Baseline GQA tool-caller supported by LM Studio.',
196
+ },
197
+ {
198
+ label: 'Llama 3.3 70B Instruct',
199
+ patterns: ['llama-3.3-70b', 'llama3.3-70b'],
200
+ capabilities: ['tools'],
201
+ paramsB: 70.6,
202
+ layers: 80,
203
+ queryHeads: 64,
204
+ kvHeads: 8,
205
+ headDim: 128,
206
+ hiddenSize: 8192,
207
+ contextLength: 131072,
208
+ approx: true,
209
+ verified: 'documented (shares Llama-3.1-70B architecture)',
210
+ notes: 'Multi-GPU territory: ~40 GB at Q4_K_M before KV cache.',
211
+ },
212
+ {
213
+ label: 'Hermes 3 Llama 3.1 8B',
214
+ patterns: ['hermes-3-llama-3.1-8b', 'hermes-3-8b', 'hermes-3'],
215
+ capabilities: ['tools'],
216
+ paramsB: 8.03,
217
+ layers: 32,
218
+ queryHeads: 32,
219
+ kvHeads: 8,
220
+ headDim: 128,
221
+ hiddenSize: 4096,
222
+ contextLength: 131072,
223
+ approx: true,
224
+ verified: 'hf-config+api (NousResearch/Hermes-3-Llama-3.1-8B)',
225
+ notes: 'Strong agentic/function-calling fine-tune on the Llama 3.1 8B base.',
226
+ },
227
+ {
228
+ label: 'DeepSeek-R1-Distill-Qwen-14B',
229
+ patterns: ['r1-distill-qwen-14b', 'deepseek-r1-distill-qwen-14b'],
230
+ capabilities: ['reasoning'],
231
+ paramsB: 14.77,
232
+ layers: 48,
233
+ queryHeads: 40,
234
+ kvHeads: 8,
235
+ headDim: 128,
236
+ hiddenSize: 5120,
237
+ contextLength: 131072,
238
+ approx: true,
239
+ verified: 'hf-config+api (deepseek-ai/DeepSeek-R1-Distill-Qwen-14B)',
240
+ notes: 'Qwen2.5-14B geometry fine-tuned for <think> reasoning; no native tool calling.',
241
+ },
242
+ {
243
+ label: 'DeepSeek-R1-Distill-Llama-8B',
244
+ patterns: ['r1-distill-llama-8b', 'deepseek-r1-distill-llama-8b'],
245
+ capabilities: ['reasoning'],
246
+ paramsB: 8.03,
247
+ layers: 32,
248
+ queryHeads: 32,
249
+ kvHeads: 8,
250
+ headDim: 128,
251
+ hiddenSize: 4096,
252
+ contextLength: 131072,
253
+ approx: true,
254
+ verified: 'hf-config (deepseek-ai/DeepSeek-R1-Distill-Llama-8B, Llama-3.1 geometry)',
255
+ notes: 'Llama-3.1-8B geometry; reasoning-only.',
256
+ },
257
+ {
258
+ label: 'GPT-OSS 20B (MoE, total params)',
259
+ patterns: ['gpt-oss-20b'],
260
+ capabilities: ['tools', 'reasoning'],
261
+ paramsB: 20.91,
262
+ layers: 24,
263
+ queryHeads: 64,
264
+ kvHeads: 8,
265
+ headDim: 64,
266
+ hiddenSize: 2880,
267
+ contextLength: 131072,
268
+ isMoE: true,
269
+ defaultQuant: 'mxfp4',
270
+ approx: true,
271
+ verified: 'hf-config+api (openai/gpt-oss-20b)',
272
+ notes: 'Native MXFP4 checkpoint (~4.25 bpw) — all 20.91B params in VRAM, ~3.6B active. Harmony format with reasoning + tool channels.',
273
+ },
274
+ {
275
+ label: 'GLM-4 9B 0414 / GLM-Z1 9B 0414',
276
+ patterns: ['glm-4-9b-0414', 'glm-z1-9b-0414', 'glm4-9b'],
277
+ capabilities: ['tools', 'reasoning'],
278
+ paramsB: 9.4,
279
+ layers: 40,
280
+ queryHeads: 32,
281
+ kvHeads: 2,
282
+ headDim: 128,
283
+ hiddenSize: 4096,
284
+ contextLength: 32768,
285
+ approx: true,
286
+ verified: 'hf-config+api (zai-org/GLM-4-9B-0414)',
287
+ notes: 'GLM-4-9B-0414 = tool calling; GLM-Z1-9B-0414 twin = thinking/reasoning, same geometry. Only 2 KV heads — cheap cache.',
288
+ },
289
+ {
290
+ label: 'GLM-4.1V 9B Thinking (VLM)',
291
+ patterns: ['glm-4.1v-9b-thinking', 'glm-4.1v-9b', 'glm4.1v'],
292
+ capabilities: ['vision', 'reasoning'],
293
+ paramsB: 10.29,
294
+ layers: 40,
295
+ queryHeads: 32,
296
+ kvHeads: 2,
297
+ headDim: 128,
298
+ hiddenSize: 4096,
299
+ contextLength: 65536,
300
+ vision: { encoderParamsB: null, tokensPerImage: 576 },
301
+ approx: true,
302
+ verified: 'hf-config+api (zai-org/GLM-4.1V-9B-Thinking)',
303
+ notes: 'Total 10.293B incl. AIMv2 vision encoder (paramsB already includes it); <think> reasoning over images.',
304
+ },
305
+ {
306
+ label: 'Mistral Small 3.2 24B Instruct',
307
+ patterns: ['mistral-small-3.2-24b', 'mistral-small-3.1-24b', 'mistral-small-24b'],
308
+ capabilities: ['tools', 'vision'],
309
+ paramsB: 23.57,
310
+ layers: 40,
311
+ queryHeads: 32,
312
+ kvHeads: 8,
313
+ headDim: 128,
314
+ hiddenSize: 5120,
315
+ contextLength: 131072,
316
+ vision: { encoderParamsB: null, tokensPerImage: 2048 },
317
+ approx: true,
318
+ verified: 'hf-config+api (mlx-community/Mistral-Small-3.2-24B-Instruct-2506-4bit)',
319
+ notes: 'Total 23.57B incl. SigLIP vision encoder (paramsB already includes it). Tool use + image input; no thinking channel.',
320
+ },
321
+ {
322
+ label: 'Pixtral 12B (VLM)',
323
+ patterns: ['pixtral-12b', 'pixtral'],
324
+ capabilities: ['vision'],
325
+ paramsB: 12.68,
326
+ layers: 40,
327
+ queryHeads: 32,
328
+ kvHeads: 8,
329
+ headDim: 128,
330
+ hiddenSize: 5120,
331
+ contextLength: 131072,
332
+ vision: { encoderParamsB: null, tokensPerImage: 2048 },
333
+ approx: true,
334
+ verified: 'hf-config+api (mlx-community/Pixtral-12B-4bit)',
335
+ notes: 'Total 12.683B incl. vision encoder. config max_position_embeddings is 1,024,000 — practical LM Studio default used here; image tokens scale with resolution.',
336
+ },
337
+ {
338
+ label: 'Phi-4-reasoning-plus 14B',
339
+ patterns: ['phi-4-reasoning-plus', 'phi-4-reasoning', 'phi4-reasoning'],
340
+ capabilities: ['reasoning'],
341
+ paramsB: 14.66,
342
+ layers: 40,
343
+ queryHeads: 40,
344
+ kvHeads: 10,
345
+ headDim: 128,
346
+ hiddenSize: 5120,
347
+ contextLength: 32768,
348
+ approx: true,
349
+ verified: 'hf-config+api (microsoft/phi-4-reasoning-plus)',
350
+ notes: 'Chain-of-thought fine-tune of Phi-4 (14.659B); no vision, tool use is not native.',
351
+ },
352
+ {
353
+ label: 'LLaVA 1.6 Mistral 7B (VLM)',
354
+ patterns: ['llava-v1.6-mistral-7b', 'llava-mistral-7b'],
355
+ capabilities: ['vision'],
356
+ paramsB: 7.57,
357
+ layers: 32,
358
+ queryHeads: 32,
359
+ kvHeads: 8,
360
+ headDim: 128,
361
+ hiddenSize: 4096,
362
+ contextLength: 32768,
363
+ vision: { encoderParamsB: null, tokensPerImage: 576 },
364
+ approx: true,
365
+ verified: 'hf-config+api (llava-hf/llava-v1.6-mistral-7b-hf)',
366
+ notes: 'Total 7.567B incl. CLIP ViT-L/14-336px (577 tokens/image; paramsB already includes it). Vision only — no tool calling.',
367
+ },
368
+ ]);
369
+
370
+ const SORTED_REGISTRY = [...MODEL_REGISTRY].sort(
371
+ (a, b) => Math.max(...b.patterns.map(p => p.length)) - Math.max(...a.patterns.map(p => p.length))
372
+ );
373
+
374
+ function normalizeForMatch(name) {
375
+ return String(name || '').toLowerCase().replace(/[^a-z0-9.\-]/g, '');
376
+ }
377
+
378
+ export function findRegistryEntry(name) {
379
+ const normalized = normalizeForMatch(name);
380
+ if (!normalized) return null;
381
+ for (const entry of SORTED_REGISTRY) {
382
+ for (const pattern of entry.patterns) {
383
+ if (normalized.includes(pattern)) return entry;
384
+ }
385
+ }
386
+ return null;
387
+ }
package/tokens.css CHANGED
@@ -23,6 +23,21 @@
23
23
  --color-agent-status-done: oklch(76% 0.15 158);
24
24
  --color-agent-status-done-ink: oklch(20% 0.035 158);
25
25
  --color-agent-status-error: oklch(70% 0.19 24);
26
+ --color-settings-canvas: oklch(15% 0.018 270);
27
+ --color-settings-surface: oklch(19% 0.02 270);
28
+ --color-settings-surface-raised: oklch(23% 0.022 270);
29
+ --color-settings-rule: oklch(34% 0.025 270);
30
+ --color-settings-rule-strong: oklch(50% 0.035 270);
31
+ --color-settings-ink: oklch(95% 0.008 270);
32
+ --color-settings-muted: oklch(73% 0.02 270);
33
+ --color-settings-accent: oklch(72% 0.16 248);
34
+ --color-settings-accent-soft: oklch(26% 0.055 248);
35
+ --color-settings-accent-ink: oklch(16% 0.025 248);
36
+ --color-settings-focus: oklch(78% 0.16 248);
37
+ --color-settings-success: oklch(75% 0.14 158);
38
+ --color-settings-warning: oklch(80% 0.14 78);
39
+ --color-settings-error: oklch(70% 0.19 24);
40
+ --color-settings-overlay: oklch(8% 0.015 270 / 0.82);
26
41
  --user-msg: linear-gradient(135deg, #e11d48 0%, #be123c 60%, #9f1239 100%);
27
42
 
28
43
  --font-sans: 'Google Sans', 'Google Sans Text', 'Product Sans', 'Noto Sans Thai', 'Noto Sans SC', sans-serif;
@@ -59,7 +74,8 @@
59
74
  --radius-sm: 0.625rem;
60
75
  --radius-card: 1.25rem;
61
76
  --radius-input: 1.75rem;
62
- --radius-pill: 999px;
77
+ --radius-pill: 999px;
78
+ --radius-settings: 0.75rem;
63
79
  --rule-hair: 1px;
64
80
 
65
81
  --z-base: 1;
@@ -71,7 +87,7 @@
71
87
  --z-tooltip: 600;
72
88
  }
73
89
 
74
- [data-theme='light'] {
90
+ [data-theme='light'] {
75
91
  --color-paper: #FFFDF9;
76
92
  --color-paper-2: rgba(255, 255, 255, 0.94);
77
93
  --color-paper-3: rgba(255, 250, 252, 0.96);
@@ -93,5 +109,20 @@
93
109
  --color-agent-status-done: oklch(48% 0.14 158);
94
110
  --color-agent-status-done-ink: oklch(98% 0.008 158);
95
111
  --color-agent-status-error: oklch(52% 0.2 24);
112
+ --color-settings-canvas: oklch(98% 0.008 255);
113
+ --color-settings-surface: oklch(95% 0.012 255);
114
+ --color-settings-surface-raised: oklch(100% 0.004 255);
115
+ --color-settings-rule: oklch(84% 0.025 255);
116
+ --color-settings-rule-strong: oklch(66% 0.04 255);
117
+ --color-settings-ink: oklch(22% 0.035 270);
118
+ --color-settings-muted: oklch(46% 0.035 270);
119
+ --color-settings-accent: oklch(48% 0.18 248);
120
+ --color-settings-accent-soft: oklch(92% 0.045 248);
121
+ --color-settings-accent-ink: oklch(98% 0.008 255);
122
+ --color-settings-focus: oklch(44% 0.2 248);
123
+ --color-settings-success: oklch(48% 0.14 158);
124
+ --color-settings-warning: oklch(52% 0.14 70);
125
+ --color-settings-error: oklch(52% 0.2 24);
126
+ --color-settings-overlay: oklch(18% 0.02 270 / 0.52);
96
127
  --user-msg: linear-gradient(135deg, #f43f5e 0%, #e11d48 100%);
97
128
  }