free-coding-models 0.5.86 → 0.5.88

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 (165) hide show
  1. package/README.md +109 -888
  2. package/bin/free-coding-models.js +4 -1
  3. package/changelog/v0.5.87.md +48 -0
  4. package/changelog/v0.5.88.md +16 -0
  5. package/package.json +13 -5
  6. package/sources.js +4 -4
  7. package/src/core/cache.js +3 -1
  8. package/src/core/config.js +43 -5
  9. package/src/core/endpoint-installer.js +23 -12
  10. package/src/core/installed-models-manager.js +43 -20
  11. package/src/core/kilo-config.js +51 -5
  12. package/src/core/kilo.js +5 -3
  13. package/src/core/legacy-proxy-cleanup.js +22 -5
  14. package/src/core/model-merger.js +4 -0
  15. package/src/core/models-drift.js +9 -0
  16. package/src/core/opencode-config.js +57 -5
  17. package/src/core/opencode.js +67 -41
  18. package/src/core/playground.js +7 -0
  19. package/src/core/probe-cache.js +35 -4
  20. package/src/core/provider-key-tester.js +10 -2
  21. package/src/core/provider-metadata.js +10 -0
  22. package/src/core/provider-quota-fetchers.js +14 -7
  23. package/src/core/router-daemon.js +208 -26
  24. package/src/core/runtime-telemetry.js +27 -1
  25. package/src/core/security.js +170 -24
  26. package/src/core/shared-helpers.js +12 -1
  27. package/src/core/shell-env.js +3 -1
  28. package/src/core/telemetry.js +18 -5
  29. package/src/core/tool-launchers.js +9 -6
  30. package/src/core/updater.js +28 -2
  31. package/src/core/utils.js +173 -71
  32. package/src/tui/app.js +38 -14
  33. package/src/tui/command-palette.js +22 -2
  34. package/src/tui/key-handler.js +123 -179
  35. package/src/tui/overlays.js +21 -71
  36. package/src/tui/render-helpers.js +62 -4
  37. package/src/tui/render-table.js +34 -3
  38. package/src/tui/theme.js +36 -5
  39. package/src/tui/tui-filters.js +28 -8
  40. package/src/tui/tui-state.js +22 -6
  41. package/web/dist/assets/index-CAzFIt8P.css +1 -0
  42. package/web/dist/assets/index-DFg1h0Nd.js +44 -0
  43. package/web/dist/index.html +5 -9
  44. package/web/index.html +3 -7
  45. package/web/server.js +97 -23
  46. package/web/vite.config.js +8 -0
  47. package/web/app.legacy.js +0 -900
  48. package/web/dist/assets/index-C5-Ywvv3.css +0 -1
  49. package/web/dist/assets/index-Dm-Xfby9.js +0 -40
  50. package/web/public/favicon.ico +0 -0
  51. package/web/public/favicons/apple-touch-icon.png +0 -0
  52. package/web/public/favicons/browserconfig.xml +0 -12
  53. package/web/public/favicons/favicon-16x16.png +0 -0
  54. package/web/public/favicons/favicon-192x192.png +0 -0
  55. package/web/public/favicons/favicon-32x32.png +0 -0
  56. package/web/public/favicons/favicon-48x48.png +0 -0
  57. package/web/public/favicons/favicon-512x512.png +0 -0
  58. package/web/public/favicons/favicon-96x96.png +0 -0
  59. package/web/public/favicons/favicon.ico +0 -0
  60. package/web/public/favicons/mstile-150x150.png +0 -0
  61. package/web/public/favicons/mstile-310x150.png +0 -0
  62. package/web/public/favicons/mstile-310x310.png +0 -0
  63. package/web/public/favicons/mstile-512x512.png +0 -0
  64. package/web/public/favicons/mstile-70x70.png +0 -0
  65. package/web/public/favicons/site.webmanifest +0 -25
  66. package/web/src/App.jsx +0 -521
  67. package/web/src/components/analytics/AnalyticsView.jsx +0 -147
  68. package/web/src/components/analytics/AnalyticsView.module.css +0 -190
  69. package/web/src/components/analytics/TokenUsagePanel.jsx +0 -105
  70. package/web/src/components/analytics/TokenUsagePanel.module.css +0 -126
  71. package/web/src/components/atoms/AILatencyCell.jsx +0 -38
  72. package/web/src/components/atoms/AILatencyCell.module.css +0 -51
  73. package/web/src/components/atoms/HealthCell.jsx +0 -143
  74. package/web/src/components/atoms/HealthCell.module.css +0 -60
  75. package/web/src/components/atoms/LastPingCell.jsx +0 -35
  76. package/web/src/components/atoms/LastPingCell.module.css +0 -45
  77. package/web/src/components/atoms/MoodCell.jsx +0 -25
  78. package/web/src/components/atoms/MoodCell.module.css +0 -6
  79. package/web/src/components/atoms/NoKeyIcon.jsx +0 -65
  80. package/web/src/components/atoms/NoKeyIcon.module.css +0 -30
  81. package/web/src/components/atoms/ProviderLogo.jsx +0 -187
  82. package/web/src/components/atoms/ProviderLogo.module.css +0 -103
  83. package/web/src/components/atoms/RankCell.jsx +0 -9
  84. package/web/src/components/atoms/RankCell.module.css +0 -9
  85. package/web/src/components/atoms/Sparkline.jsx +0 -63
  86. package/web/src/components/atoms/StabilityCell.jsx +0 -18
  87. package/web/src/components/atoms/StabilityCell.module.css +0 -13
  88. package/web/src/components/atoms/StatusDot.jsx +0 -13
  89. package/web/src/components/atoms/StatusDot.module.css +0 -29
  90. package/web/src/components/atoms/TPSCell.jsx +0 -36
  91. package/web/src/components/atoms/TPSCell.module.css +0 -44
  92. package/web/src/components/atoms/TierBadge.jsx +0 -10
  93. package/web/src/components/atoms/TierBadge.module.css +0 -29
  94. package/web/src/components/atoms/Toast.jsx +0 -25
  95. package/web/src/components/atoms/Toast.module.css +0 -41
  96. package/web/src/components/atoms/ToastContainer.jsx +0 -16
  97. package/web/src/components/atoms/ToastContainer.module.css +0 -10
  98. package/web/src/components/atoms/VerdictBadge.jsx +0 -36
  99. package/web/src/components/atoms/VerdictBadge.module.css +0 -40
  100. package/web/src/components/changelog/ChangelogView.jsx +0 -135
  101. package/web/src/components/changelog/ChangelogView.module.css +0 -159
  102. package/web/src/components/dashboard/DetailPanel.jsx +0 -217
  103. package/web/src/components/dashboard/DetailPanel.module.css +0 -260
  104. package/web/src/components/dashboard/ExpandedDetailRow.jsx +0 -361
  105. package/web/src/components/dashboard/ExpandedDetailRow.module.css +0 -356
  106. package/web/src/components/dashboard/ExportModal.jsx +0 -84
  107. package/web/src/components/dashboard/ExportModal.module.css +0 -99
  108. package/web/src/components/dashboard/FilterBar.jsx +0 -338
  109. package/web/src/components/dashboard/FilterBar.module.css +0 -342
  110. package/web/src/components/dashboard/ModelTable.jsx +0 -672
  111. package/web/src/components/dashboard/ModelTable.module.css +0 -446
  112. package/web/src/components/dashboard/ProviderDropdown.jsx +0 -156
  113. package/web/src/components/dashboard/ProviderDropdown.module.css +0 -248
  114. package/web/src/components/help/HelpView.jsx +0 -201
  115. package/web/src/components/help/HelpView.module.css +0 -156
  116. package/web/src/components/install/InstallEndpointsView.jsx +0 -309
  117. package/web/src/components/install/InstallEndpointsView.module.css +0 -427
  118. package/web/src/components/installed/InstalledModelsView.jsx +0 -89
  119. package/web/src/components/installed/InstalledModelsView.module.css +0 -200
  120. package/web/src/components/launch/IncompatibleFallbackModal.jsx +0 -69
  121. package/web/src/components/launch/LaunchButton.jsx +0 -30
  122. package/web/src/components/launch/LaunchButton.module.css +0 -35
  123. package/web/src/components/launch/LaunchModal.module.css +0 -125
  124. package/web/src/components/layout/Footer.jsx +0 -19
  125. package/web/src/components/layout/Footer.module.css +0 -10
  126. package/web/src/components/layout/Header.jsx +0 -265
  127. package/web/src/components/layout/Header.module.css +0 -357
  128. package/web/src/components/palette/CommandPalette.jsx +0 -301
  129. package/web/src/components/palette/CommandPalette.module.css +0 -121
  130. package/web/src/components/playground/PlaygroundChat.jsx +0 -527
  131. package/web/src/components/playground/PlaygroundChat.module.css +0 -382
  132. package/web/src/components/playground/PlaygroundView.jsx +0 -371
  133. package/web/src/components/playground/PlaygroundView.module.css +0 -504
  134. package/web/src/components/recommend/RecommendView.jsx +0 -121
  135. package/web/src/components/recommend/RecommendView.module.css +0 -57
  136. package/web/src/components/router/RouterView.jsx +0 -1212
  137. package/web/src/components/router/RouterView.module.css +0 -1289
  138. package/web/src/components/settings/SettingsView.jsx +0 -555
  139. package/web/src/components/settings/SettingsView.module.css +0 -550
  140. package/web/src/components/tools/ToolPicker.jsx +0 -86
  141. package/web/src/components/tools/ToolPicker.module.css +0 -97
  142. package/web/src/components/update/UpdateChip.jsx +0 -104
  143. package/web/src/components/update/UpdateChip.module.css +0 -146
  144. package/web/src/global.css +0 -298
  145. package/web/src/hooks/urlState.constants.js +0 -28
  146. package/web/src/hooks/useChangelog.js +0 -51
  147. package/web/src/hooks/useColumnSizing.js +0 -211
  148. package/web/src/hooks/useFavorites.js +0 -150
  149. package/web/src/hooks/useFilter.js +0 -310
  150. package/web/src/hooks/useInstalledModels.js +0 -42
  151. package/web/src/hooks/useRecommend.js +0 -67
  152. package/web/src/hooks/useRouterDashboard.js +0 -133
  153. package/web/src/hooks/useSSE.js +0 -73
  154. package/web/src/hooks/useSocket.js +0 -203
  155. package/web/src/hooks/useTheme.js +0 -83
  156. package/web/src/hooks/useTokenUsage.js +0 -103
  157. package/web/src/hooks/useToolMode.js +0 -77
  158. package/web/src/hooks/useUpdateChecker.js +0 -91
  159. package/web/src/hooks/useUrlState.js +0 -170
  160. package/web/src/main.jsx +0 -15
  161. package/web/src/utils/download.js +0 -15
  162. package/web/src/utils/format.js +0 -42
  163. package/web/src/utils/m3.js +0 -57
  164. package/web/src/utils/ranks.js +0 -37
  165. package/web/styles.legacy.css +0 -963
@@ -1,382 +0,0 @@
1
- /**
2
- * @file web/src/components/playground/PlaygroundChat.module.css
3
- * @description Styles for the shared PlaygroundChat core. Two density variants
4
- * (`full` for the modal playground, `mini` for the router + model-row
5
- * playgrounds) share the same visual language so every playground looks
6
- * identical — same bubbles, same metadata chips, same input bar.
7
- *
8
- * 📖 Design tokens come from the app's CSS variables (set by the theme), with
9
- * 📖 sensible hard-coded fallbacks so the component degrades gracefully.
10
- */
11
-
12
- .root {
13
- display: flex;
14
- flex-direction: column;
15
- height: 100%;
16
- min-height: 0;
17
- background: transparent;
18
- }
19
-
20
- /* ── Transcript ─────────────────────────────────────────────────────────── */
21
- .transcript {
22
- flex: 1;
23
- min-height: 0;
24
- overflow-y: auto;
25
- display: flex;
26
- flex-direction: column;
27
- gap: 12px;
28
- }
29
-
30
- .root.full .transcript {
31
- padding: 16px;
32
- }
33
-
34
- .root.mini .transcript {
35
- padding: 8px;
36
- gap: 8px;
37
- }
38
-
39
- /* ── Empty state ────────────────────────────────────────────────────────── */
40
- .empty {
41
- flex: 1;
42
- display: flex;
43
- flex-direction: column;
44
- align-items: center;
45
- justify-content: center;
46
- text-align: center;
47
- gap: 6px;
48
- color: var(--text-muted, #888);
49
- padding: 24px 16px;
50
- }
51
-
52
- .root.mini .empty {
53
- padding: 18px 12px;
54
- justify-content: flex-start;
55
- }
56
-
57
- .emptyIcon {
58
- opacity: 0.55;
59
- margin-bottom: 4px;
60
- }
61
-
62
- .emptyTitle {
63
- font-size: 15px;
64
- font-weight: 600;
65
- color: var(--text, #eee);
66
- }
67
-
68
- .root.mini .emptyTitle {
69
- font-size: 13px;
70
- }
71
-
72
- .emptyHint {
73
- font-size: 12px;
74
- line-height: 1.5;
75
- max-width: 420px;
76
- opacity: 0.8;
77
- }
78
-
79
- .root.mini .emptyHint {
80
- font-size: 11px;
81
- max-width: 100%;
82
- }
83
-
84
- .emptyHint code {
85
- background: var(--bg-secondary, #16161e);
86
- border: 1px solid var(--border, #1e1e2e);
87
- border-radius: 4px;
88
- padding: 1px 5px;
89
- font-family: 'Menlo', 'Monaco', monospace;
90
- font-size: 11px;
91
- }
92
-
93
- .suggestions {
94
- display: flex;
95
- flex-wrap: wrap;
96
- gap: 6px;
97
- justify-content: center;
98
- margin-top: 10px;
99
- }
100
-
101
- /* ── Message bubble ─────────────────────────────────────────────────────── */
102
- .message {
103
- display: flex;
104
- flex-direction: column;
105
- gap: 4px;
106
- max-width: 88%;
107
- animation: msgIn 0.15s ease;
108
- }
109
-
110
- .root.mini .message {
111
- max-width: 92%;
112
- gap: 3px;
113
- }
114
-
115
- @keyframes msgIn {
116
- from { opacity: 0; transform: translateY(2px); }
117
- to { opacity: 1; transform: translateY(0); }
118
- }
119
-
120
- .message.user {
121
- align-self: flex-end;
122
- align-items: flex-end;
123
- }
124
-
125
- .message.assistant {
126
- align-self: flex-start;
127
- align-items: flex-start;
128
- }
129
-
130
- .bubbleRow {
131
- display: flex;
132
- align-items: center;
133
- gap: 6px;
134
- padding: 0 4px;
135
- }
136
-
137
- .role {
138
- font-size: 10px;
139
- text-transform: uppercase;
140
- letter-spacing: 0.05em;
141
- color: var(--text-muted, #888);
142
- font-weight: 600;
143
- }
144
-
145
- .copyBtn {
146
- display: inline-flex;
147
- align-items: center;
148
- background: transparent;
149
- border: none;
150
- color: var(--text-muted, #888);
151
- cursor: pointer;
152
- padding: 2px;
153
- border-radius: 4px;
154
- opacity: 0;
155
- transition: opacity 0.12s;
156
- }
157
-
158
- .message.assistant:hover .copyBtn,
159
- .copyBtn:focus-visible {
160
- opacity: 0.8;
161
- }
162
-
163
- .bubble {
164
- padding: 10px 14px;
165
- border-radius: 12px;
166
- font-size: 13px;
167
- line-height: 1.5;
168
- white-space: pre-wrap;
169
- word-wrap: break-word;
170
- overflow-wrap: break-word;
171
- }
172
-
173
- .root.mini .bubble {
174
- padding: 8px 11px;
175
- font-size: 12.5px;
176
- border-radius: 10px;
177
- }
178
-
179
- .message.user .bubble {
180
- background: var(--accent, #22c55e);
181
- color: #061a08;
182
- border-bottom-right-radius: 4px;
183
- }
184
-
185
- .message.assistant .bubble {
186
- background: var(--bg-secondary, #16161e);
187
- border: 1px solid var(--border, #1e1e2e);
188
- color: var(--text, #eee);
189
- border-bottom-left-radius: 4px;
190
- }
191
-
192
- .typing {
193
- color: var(--text-muted, #888);
194
- font-style: italic;
195
- font-size: 12px;
196
- }
197
-
198
- .codeBlock {
199
- background: rgba(0, 0, 0, 0.35);
200
- border: 1px solid var(--border, #1e1e2e);
201
- border-radius: 6px;
202
- padding: 8px 10px;
203
- font-family: 'Menlo', 'Monaco', 'Courier New', monospace;
204
- font-size: 12px;
205
- overflow-x: auto;
206
- margin: 6px 0;
207
- white-space: pre;
208
- }
209
-
210
- /* ── Streaming cursor ───────────────────────────────────────────────────── */
211
- .cursor {
212
- display: inline-block;
213
- width: 7px;
214
- height: 14px;
215
- background: var(--accent, #22c55e);
216
- margin-left: 2px;
217
- vertical-align: text-bottom;
218
- animation: blink 0.9s infinite;
219
- }
220
-
221
- @keyframes blink {
222
- 0%, 50% { opacity: 1; }
223
- 51%, 100% { opacity: 0; }
224
- }
225
-
226
- /* ── Metadata chips (the harmonized stats row) ──────────────────────────── */
227
- .meta {
228
- display: flex;
229
- align-items: center;
230
- flex-wrap: wrap;
231
- gap: 6px;
232
- font-size: 11px;
233
- color: var(--text-muted, #888);
234
- padding: 0 4px;
235
- }
236
-
237
- .root.mini .meta {
238
- gap: 5px;
239
- font-size: 10.5px;
240
- }
241
-
242
- .metaChip {
243
- display: inline-flex;
244
- align-items: center;
245
- gap: 4px;
246
- background: var(--bg-secondary, #16161e);
247
- border: 1px solid var(--border, #1e1e2e);
248
- border-radius: 4px;
249
- padding: 2px 6px;
250
- font-family: 'Menlo', 'Monaco', monospace;
251
- line-height: 1.4;
252
- }
253
-
254
- /* addressed model under the user bubble */
255
- .target {
256
- color: var(--text-muted, #aaa);
257
- opacity: 0.85;
258
- }
259
-
260
- /* served model chip — accent-tinted so it stands out */
261
- .modelChip {
262
- color: var(--accent, #22c55e);
263
- border-color: rgba(34, 197, 94, 0.3);
264
- }
265
-
266
- .latencyChip {
267
- color: #fbbf24;
268
- border-color: rgba(251, 191, 36, 0.3);
269
- }
270
-
271
- .tpsChip {
272
- color: #60a5fa;
273
- border-color: rgba(96, 165, 250, 0.3);
274
- }
275
-
276
- .errorChip {
277
- color: #f87171;
278
- border-color: rgba(248, 113, 113, 0.3);
279
- }
280
-
281
- /* ── Input bar ──────────────────────────────────────────────────────────── */
282
- .inputBar {
283
- display: flex;
284
- gap: 8px;
285
- align-items: flex-end;
286
- flex-shrink: 0;
287
- background: var(--bg-secondary, #16161e);
288
- }
289
-
290
- .root.full .inputBar {
291
- padding: 12px 16px;
292
- border-top: 1px solid var(--border, #1e1e2e);
293
- }
294
-
295
- .root.mini .inputBar {
296
- padding: 8px 0 0;
297
- gap: 6px;
298
- }
299
-
300
- .input {
301
- flex: 1;
302
- resize: none;
303
- min-height: 40px;
304
- max-height: 180px;
305
- background: var(--bg-primary, #0f0f17);
306
- border: 1px solid var(--border, #1e1e2e);
307
- border-radius: 8px;
308
- color: var(--text, #eee);
309
- padding: 9px 12px;
310
- font-size: 13px;
311
- font-family: inherit;
312
- line-height: 1.4;
313
- transition: border-color 0.12s;
314
- }
315
-
316
- .root.mini .input {
317
- min-height: 34px;
318
- padding: 7px 10px;
319
- font-size: 12.5px;
320
- border-radius: 7px;
321
- }
322
-
323
- .input:focus {
324
- outline: none;
325
- border-color: var(--accent, #22c55e);
326
- }
327
-
328
- .input:disabled {
329
- opacity: 0.5;
330
- cursor: not-allowed;
331
- }
332
-
333
- .sendBtn,
334
- .stopBtn {
335
- background: var(--accent, #22c55e);
336
- color: #061a08;
337
- border: none;
338
- border-radius: 8px;
339
- padding: 9px 14px;
340
- font-size: 13px;
341
- font-weight: 600;
342
- cursor: pointer;
343
- display: inline-flex;
344
- align-items: center;
345
- gap: 6px;
346
- height: 40px;
347
- font-family: inherit;
348
- transition: filter 0.12s, opacity 0.12s;
349
- flex-shrink: 0;
350
- }
351
-
352
- .stopBtn {
353
- background: #ef4444;
354
- color: #fff;
355
- }
356
-
357
- .root.mini .sendBtn,
358
- .root.mini .stopBtn {
359
- height: 34px;
360
- width: 34px;
361
- padding: 0;
362
- justify-content: center;
363
- border-radius: 7px;
364
- }
365
-
366
- .sendBtn:disabled {
367
- opacity: 0.5;
368
- cursor: not-allowed;
369
- }
370
-
371
- .sendBtn:hover:not(:disabled),
372
- .stopBtn:hover {
373
- filter: brightness(1.1);
374
- }
375
-
376
- .spin {
377
- animation: spin 0.9s linear infinite;
378
- }
379
-
380
- @keyframes spin {
381
- to { transform: rotate(360deg); }
382
- }