@leterhong/multichat 1.6.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.
Files changed (214) hide show
  1. package/.agents/plugins/marketplace.json +32 -0
  2. package/.agents/plugins/plugins/developer-toolkit/.codex-plugin/plugin.json +24 -0
  3. package/.agents/plugins/plugins/developer-toolkit/skills/code-review/SKILL.md +9 -0
  4. package/.agents/plugins/plugins/developer-toolkit/skills/code-review/agents/openai.yaml +3 -0
  5. package/.agents/plugins/plugins/developer-toolkit/skills/release-notes/SKILL.md +9 -0
  6. package/.agents/plugins/plugins/developer-toolkit/skills/release-notes/agents/openai.yaml +3 -0
  7. package/.agents/plugins/plugins/developer-toolkit/skills/security-review/SKILL.md +9 -0
  8. package/.agents/plugins/plugins/developer-toolkit/skills/security-review/agents/openai.yaml +3 -0
  9. package/.agents/plugins/plugins/developer-toolkit/skills/test-plan/SKILL.md +9 -0
  10. package/.agents/plugins/plugins/developer-toolkit/skills/test-plan/agents/openai.yaml +3 -0
  11. package/.agents/plugins/plugins/writing-toolkit/.codex-plugin/plugin.json +24 -0
  12. package/.agents/plugins/plugins/writing-toolkit/skills/meeting-notes/SKILL.md +9 -0
  13. package/.agents/plugins/plugins/writing-toolkit/skills/meeting-notes/agents/openai.yaml +3 -0
  14. package/.agents/plugins/plugins/writing-toolkit/skills/resume-tune/SKILL.md +9 -0
  15. package/.agents/plugins/plugins/writing-toolkit/skills/resume-tune/agents/openai.yaml +3 -0
  16. package/.agents/plugins/plugins/writing-toolkit/skills/weekly-report/SKILL.md +9 -0
  17. package/.agents/plugins/plugins/writing-toolkit/skills/weekly-report/agents/openai.yaml +3 -0
  18. package/.agents/skills/.gitkeep +1 -0
  19. package/.agents/skills/wanghong-handwritten-ppt/SKILL.md +172 -0
  20. package/.agents/skills/wanghong-handwritten-ppt/assets/HTML-PPT-LICENSE +21 -0
  21. package/.agents/skills/wanghong-handwritten-ppt/assets/NEAT-ANNOTATIONS-LICENSE +21 -0
  22. package/.agents/skills/wanghong-handwritten-ppt/assets/animations.css +138 -0
  23. package/.agents/skills/wanghong-handwritten-ppt/assets/base.css +150 -0
  24. package/.agents/skills/wanghong-handwritten-ppt/assets/deepseek-example.css +893 -0
  25. package/.agents/skills/wanghong-handwritten-ppt/assets/neat-annotations.css +152 -0
  26. package/.agents/skills/wanghong-handwritten-ppt/assets/preview-cover.png +0 -0
  27. package/.agents/skills/wanghong-handwritten-ppt/assets/preview-diagram.png +0 -0
  28. package/.agents/skills/wanghong-handwritten-ppt/assets/preview-summary.png +0 -0
  29. package/.agents/skills/wanghong-handwritten-ppt/assets/preview-table.png +0 -0
  30. package/.agents/skills/wanghong-handwritten-ppt/assets/runtime.js +960 -0
  31. package/.agents/skills/wanghong-handwritten-ppt/assets/template.css +198 -0
  32. package/.agents/skills/wanghong-handwritten-ppt/evals/evals.json +20 -0
  33. package/.agents/skills/wanghong-handwritten-ppt/examples/deepseek-v4-flash/index.html +414 -0
  34. package/.agents/skills/wanghong-handwritten-ppt/examples/deepseek-v4-flash/style.css +897 -0
  35. package/.agents/skills/wanghong-handwritten-ppt/references/prompts.md +170 -0
  36. package/.agents/skills/wanghong-handwritten-ppt/references/style-guide.md +133 -0
  37. package/.agents/skills/wanghong-handwritten-ppt/scripts/check_deck.py +41 -0
  38. package/.agents/skills/wanghong-handwritten-ppt/scripts/prepare_render_html.py +137 -0
  39. package/.agents/skills/wanghong-handwritten-ppt/scripts/render.sh +110 -0
  40. package/.agents/skills/wanghong-handwritten-ppt/templates/deck.html +94 -0
  41. package/.agents/skills/wanghong-handwritten-ppt/tests/test_font_contract.py +73 -0
  42. package/LICENSE +21 -0
  43. package/README.md +186 -0
  44. package/backend/adapters/README.md +77 -0
  45. package/backend/adapters/anthropic.ts +115 -0
  46. package/backend/adapters/base.ts +47 -0
  47. package/backend/adapters/index.ts +41 -0
  48. package/backend/adapters/lmstudio.ts +7 -0
  49. package/backend/adapters/moonshot.ts +7 -0
  50. package/backend/adapters/ollama.ts +7 -0
  51. package/backend/adapters/openai-compatible.ts +51 -0
  52. package/backend/adapters/openai.ts +7 -0
  53. package/backend/adapters/qwen.ts +112 -0
  54. package/backend/adapters/wenxin.ts +136 -0
  55. package/backend/adapters/zhipu.ts +93 -0
  56. package/backend/dist/adapters/anthropic.js +130 -0
  57. package/backend/dist/adapters/anthropic.js.map +1 -0
  58. package/backend/dist/adapters/base.js +38 -0
  59. package/backend/dist/adapters/base.js.map +1 -0
  60. package/backend/dist/adapters/index.js +39 -0
  61. package/backend/dist/adapters/index.js.map +1 -0
  62. package/backend/dist/adapters/lmstudio.js +8 -0
  63. package/backend/dist/adapters/lmstudio.js.map +1 -0
  64. package/backend/dist/adapters/moonshot.js +8 -0
  65. package/backend/dist/adapters/moonshot.js.map +1 -0
  66. package/backend/dist/adapters/ollama.js +8 -0
  67. package/backend/dist/adapters/ollama.js.map +1 -0
  68. package/backend/dist/adapters/openai-compatible.js +47 -0
  69. package/backend/dist/adapters/openai-compatible.js.map +1 -0
  70. package/backend/dist/adapters/openai.js +8 -0
  71. package/backend/dist/adapters/openai.js.map +1 -0
  72. package/backend/dist/adapters/qwen.js +103 -0
  73. package/backend/dist/adapters/qwen.js.map +1 -0
  74. package/backend/dist/adapters/wenxin.js +114 -0
  75. package/backend/dist/adapters/wenxin.js.map +1 -0
  76. package/backend/dist/adapters/zhipu.js +86 -0
  77. package/backend/dist/adapters/zhipu.js.map +1 -0
  78. package/backend/dist/extensions/demo-mcp-server.js +75 -0
  79. package/backend/dist/extensions/demo-mcp-server.js.map +1 -0
  80. package/backend/dist/extensions/importer.js +828 -0
  81. package/backend/dist/extensions/importer.js.map +1 -0
  82. package/backend/dist/extensions/manager.js +1154 -0
  83. package/backend/dist/extensions/manager.js.map +1 -0
  84. package/backend/dist/lib/catalog.js +30 -0
  85. package/backend/dist/lib/catalog.js.map +1 -0
  86. package/backend/dist/lib/context.js +59 -0
  87. package/backend/dist/lib/context.js.map +1 -0
  88. package/backend/dist/lib/errors.js +75 -0
  89. package/backend/dist/lib/errors.js.map +1 -0
  90. package/backend/dist/lib/provider-store.js +116 -0
  91. package/backend/dist/lib/provider-store.js.map +1 -0
  92. package/backend/dist/lib/redact.js +11 -0
  93. package/backend/dist/lib/redact.js.map +1 -0
  94. package/backend/dist/lib/runtime-store.js +28 -0
  95. package/backend/dist/lib/runtime-store.js.map +1 -0
  96. package/backend/dist/lib/sqlite-store.js +218 -0
  97. package/backend/dist/lib/sqlite-store.js.map +1 -0
  98. package/backend/dist/lib/sse.js +46 -0
  99. package/backend/dist/lib/sse.js.map +1 -0
  100. package/backend/dist/lib/ssrf.js +131 -0
  101. package/backend/dist/lib/ssrf.js.map +1 -0
  102. package/backend/dist/lib/store.js +84 -0
  103. package/backend/dist/lib/store.js.map +1 -0
  104. package/backend/dist/lib/usage.js +219 -0
  105. package/backend/dist/lib/usage.js.map +1 -0
  106. package/backend/dist/lib/util.js +38 -0
  107. package/backend/dist/lib/util.js.map +1 -0
  108. package/backend/dist/lib/workspace-store.js +152 -0
  109. package/backend/dist/lib/workspace-store.js.map +1 -0
  110. package/backend/dist/mcp.js +429 -0
  111. package/backend/dist/mcp.js.map +1 -0
  112. package/backend/dist/routes/agents.js +51 -0
  113. package/backend/dist/routes/agents.js.map +1 -0
  114. package/backend/dist/routes/assistants.js +32 -0
  115. package/backend/dist/routes/assistants.js.map +1 -0
  116. package/backend/dist/routes/chat.js +697 -0
  117. package/backend/dist/routes/chat.js.map +1 -0
  118. package/backend/dist/routes/control-plane.js +200 -0
  119. package/backend/dist/routes/control-plane.js.map +1 -0
  120. package/backend/dist/routes/conversations.js +66 -0
  121. package/backend/dist/routes/conversations.js.map +1 -0
  122. package/backend/dist/routes/extensions-import.js +22 -0
  123. package/backend/dist/routes/extensions-import.js.map +1 -0
  124. package/backend/dist/routes/import.js +85 -0
  125. package/backend/dist/routes/import.js.map +1 -0
  126. package/backend/dist/routes/mcp-servers.js +56 -0
  127. package/backend/dist/routes/mcp-servers.js.map +1 -0
  128. package/backend/dist/routes/meta.js +37 -0
  129. package/backend/dist/routes/meta.js.map +1 -0
  130. package/backend/dist/routes/mock.js +28 -0
  131. package/backend/dist/routes/mock.js.map +1 -0
  132. package/backend/dist/routes/plugins.js +41 -0
  133. package/backend/dist/routes/plugins.js.map +1 -0
  134. package/backend/dist/routes/providers.js +197 -0
  135. package/backend/dist/routes/providers.js.map +1 -0
  136. package/backend/dist/routes/runs.js +57 -0
  137. package/backend/dist/routes/runs.js.map +1 -0
  138. package/backend/dist/routes/skills.js +73 -0
  139. package/backend/dist/routes/skills.js.map +1 -0
  140. package/backend/dist/routes/tools.js +40 -0
  141. package/backend/dist/routes/tools.js.map +1 -0
  142. package/backend/dist/routes/usage.js +14 -0
  143. package/backend/dist/routes/usage.js.map +1 -0
  144. package/backend/dist/routes/workspaces.js +158 -0
  145. package/backend/dist/routes/workspaces.js.map +1 -0
  146. package/backend/dist/runtime/agent.js +518 -0
  147. package/backend/dist/runtime/agent.js.map +1 -0
  148. package/backend/dist/server.js +103 -0
  149. package/backend/dist/server.js.map +1 -0
  150. package/backend/dist/types.js +3 -0
  151. package/backend/dist/types.js.map +1 -0
  152. package/backend/extensions/demo-mcp-server.js +70 -0
  153. package/backend/extensions/importer.ts +709 -0
  154. package/backend/extensions/manager.ts +1055 -0
  155. package/backend/lib/catalog.ts +28 -0
  156. package/backend/lib/context.ts +61 -0
  157. package/backend/lib/errors.ts +78 -0
  158. package/backend/lib/provider-store.ts +116 -0
  159. package/backend/lib/redact.ts +9 -0
  160. package/backend/lib/runtime-store.ts +38 -0
  161. package/backend/lib/sqlite-store.ts +220 -0
  162. package/backend/lib/sse.ts +42 -0
  163. package/backend/lib/ssrf.ts +120 -0
  164. package/backend/lib/store.ts +79 -0
  165. package/backend/lib/usage.ts +212 -0
  166. package/backend/lib/util.ts +31 -0
  167. package/backend/lib/workspace-store.ts +150 -0
  168. package/backend/mcp.ts +417 -0
  169. package/backend/package.json +34 -0
  170. package/backend/prompts.json +82 -0
  171. package/backend/routes/agents.ts +55 -0
  172. package/backend/routes/assistants.ts +30 -0
  173. package/backend/routes/chat.ts +660 -0
  174. package/backend/routes/control-plane.ts +165 -0
  175. package/backend/routes/conversations.ts +62 -0
  176. package/backend/routes/extensions-import.ts +15 -0
  177. package/backend/routes/import.ts +72 -0
  178. package/backend/routes/mcp-servers.ts +36 -0
  179. package/backend/routes/meta.ts +38 -0
  180. package/backend/routes/mock.ts +25 -0
  181. package/backend/routes/plugins.ts +27 -0
  182. package/backend/routes/providers.ts +166 -0
  183. package/backend/routes/runs.ts +55 -0
  184. package/backend/routes/skills.ts +52 -0
  185. package/backend/routes/tools.ts +40 -0
  186. package/backend/routes/usage.ts +13 -0
  187. package/backend/routes/workspaces.ts +124 -0
  188. package/backend/runtime/agent.ts +474 -0
  189. package/backend/server.ts +106 -0
  190. package/backend/types.ts +126 -0
  191. package/bin/multichat.mjs +535 -0
  192. package/frontend/dist/assets/agentPicker-C39VzmYa.js +13 -0
  193. package/frontend/dist/assets/compare-BpaGD32J.js +1 -0
  194. package/frontend/dist/assets/conversations-COuLmg99.js +7 -0
  195. package/frontend/dist/assets/data-ZH7Dux1K.js +1 -0
  196. package/frontend/dist/assets/extensionImport-CnTWKtWm.js +28 -0
  197. package/frontend/dist/assets/importExport-B3mB-9zs.js +70 -0
  198. package/frontend/dist/assets/index-CASVCOUO.js +34 -0
  199. package/frontend/dist/assets/index-DSvbjNLc.css +1 -0
  200. package/frontend/dist/assets/init-ZPK483vB.js +1 -0
  201. package/frontend/dist/assets/jsx-runtime-ZSsbr0oW.js +9 -0
  202. package/frontend/dist/assets/modal-CgHocv3n.js +2 -0
  203. package/frontend/dist/assets/modelPicker-EUmmVnbj.js +14 -0
  204. package/frontend/dist/assets/pluginsUI-B6jGUQkx.js +16 -0
  205. package/frontend/dist/assets/render-DgAg1K8A.js +1 -0
  206. package/frontend/dist/assets/send-BJhZ_5YA.js +14 -0
  207. package/frontend/dist/assets/settings-DdnYwZl-.js +2 -0
  208. package/frontend/dist/assets/shell-DFV2khQl.js +1 -0
  209. package/frontend/dist/assets/workbench-BY2J4vWC.js +41 -0
  210. package/frontend/dist/icon-maskable.svg +4 -0
  211. package/frontend/dist/icon.svg +4 -0
  212. package/frontend/dist/index.html +21 -0
  213. package/frontend/dist/manifest.webmanifest +26 -0
  214. package/package.json +58 -0
@@ -0,0 +1,897 @@
1
+ :root {
2
+ --paper: #f6f5ee;
3
+ --ink: #171a46;
4
+ --ink-soft: #3f4260;
5
+ --blue: #1f54d8;
6
+ --magenta: #c52563;
7
+ --green: #4ce52e;
8
+ --yellow: #f4ec35;
9
+ --coral: #ef8e91;
10
+ --purple: #6e50a5;
11
+ --sky: #74ace7;
12
+ --hand-font: "HanziPen SC";
13
+ --bg: var(--paper);
14
+ --bg-soft: var(--paper);
15
+ --surface: transparent;
16
+ --surface-2: transparent;
17
+ --border: color-mix(in srgb, var(--ink) 18%, transparent);
18
+ --text-1: var(--ink);
19
+ --text-2: var(--ink-soft);
20
+ --text-3: color-mix(in srgb, var(--ink) 58%, transparent);
21
+ --accent: var(--magenta);
22
+ --accent-2: var(--blue);
23
+ --radius: 0;
24
+ --shadow: none;
25
+ --font-sans: var(--hand-font);
26
+ --font-display: var(--hand-font);
27
+ --font-mono: var(--hand-font);
28
+ --font-serif: var(--hand-font);
29
+ --letter-tight: .02em;
30
+ --letter-normal: .02em;
31
+ }
32
+
33
+ .progress-bar {
34
+ display: none;
35
+ }
36
+
37
+ html,
38
+ body {
39
+ width: 100%;
40
+ height: 100%;
41
+ overflow: hidden;
42
+ background: var(--paper);
43
+ }
44
+
45
+ body {
46
+ color: var(--ink);
47
+ font-family: var(--hand-font);
48
+ }
49
+
50
+ .deck {
51
+ aspect-ratio: 16 / 9;
52
+ background: var(--paper);
53
+ }
54
+
55
+ .slide {
56
+ padding: 62px 86px 56px;
57
+ justify-content: flex-start;
58
+ background: transparent;
59
+ transition: opacity .25s ease;
60
+ transform: none;
61
+ }
62
+
63
+ .slide.is-prev {
64
+ transform: none;
65
+ }
66
+
67
+ .hand-title {
68
+ display: inline-block;
69
+ width: max-content;
70
+ max-width: 100%;
71
+ margin: 0;
72
+ color: var(--ink);
73
+ font-size: 45px;
74
+ font-weight: 500;
75
+ line-height: 1.18;
76
+ letter-spacing: .04em;
77
+ }
78
+
79
+ .title-line {
80
+ width: 100%;
81
+ height: 4px;
82
+ margin-top: 8px;
83
+ background: var(--magenta);
84
+ border-radius: 55% 45% 48% 52%;
85
+ transform: rotate(-.15deg);
86
+ }
87
+
88
+ .cover {
89
+ align-items: center;
90
+ text-align: center;
91
+ padding-top: 166px;
92
+ }
93
+
94
+ .cover .hand-title {
95
+ font-size: 54px;
96
+ white-space: nowrap;
97
+ }
98
+
99
+ .cover .title-line {
100
+ height: 4px;
101
+ }
102
+
103
+ .cover-meta {
104
+ margin-top: 90px;
105
+ display: grid;
106
+ gap: 38px;
107
+ font-size: 31px;
108
+ line-height: 1;
109
+ }
110
+
111
+ .page-heading {
112
+ display: inline-block;
113
+ margin-bottom: 38px;
114
+ }
115
+
116
+ .page-heading .hand-title {
117
+ font-size: 40px;
118
+ }
119
+
120
+ .page-heading .title-line {
121
+ width: 102%;
122
+ height: 3px;
123
+ background: var(--blue);
124
+ }
125
+
126
+ .note-line {
127
+ margin: 0;
128
+ font-size: 31px;
129
+ line-height: 1.5;
130
+ }
131
+
132
+ .small-note {
133
+ font-size: 23px;
134
+ line-height: 1.35;
135
+ }
136
+
137
+ .ink-blue { color: var(--blue); }
138
+ .ink-magenta { color: var(--magenta); }
139
+ .ink-green { color: #238a24; }
140
+
141
+ .marker {
142
+ display: inline-block;
143
+ padding: 0 .2em .06em;
144
+ border-radius: 42% 55% 46% 54%;
145
+ color: var(--ink);
146
+ }
147
+
148
+ .marker-yellow { background: color-mix(in srgb, var(--yellow) 88%, transparent); }
149
+ .marker-green { background: color-mix(in srgb, var(--green) 84%, transparent); }
150
+ .marker-coral { background: color-mix(in srgb, var(--coral) 68%, transparent); }
151
+
152
+ .thin-box {
153
+ border: 3px solid var(--magenta);
154
+ padding: 15px 22px 13px;
155
+ transform: rotate(-.12deg);
156
+ }
157
+
158
+ .s2-layout {
159
+ display: grid;
160
+ grid-template-columns: 48% 52%;
161
+ align-items: center;
162
+ min-height: 680px;
163
+ }
164
+
165
+ .scatter-copy {
166
+ display: grid;
167
+ gap: 31px;
168
+ align-content: center;
169
+ padding-left: 34px;
170
+ }
171
+
172
+ .scatter-copy .equation {
173
+ width: max-content;
174
+ margin-top: 18px;
175
+ color: var(--magenta);
176
+ font-size: 34px;
177
+ }
178
+
179
+ .diagram {
180
+ width: 100%;
181
+ height: auto;
182
+ overflow: visible;
183
+ }
184
+
185
+ .diagram text {
186
+ font-family: var(--hand-font);
187
+ fill: var(--ink);
188
+ }
189
+
190
+ .scribble {
191
+ fill: none;
192
+ stroke: var(--ink);
193
+ stroke-width: 3.2;
194
+ stroke-linecap: round;
195
+ stroke-linejoin: round;
196
+ filter: url(#wobble);
197
+ }
198
+
199
+ .scribble-blue { stroke: var(--blue); }
200
+ .scribble-magenta { stroke: var(--magenta); }
201
+ .scribble-green { stroke: #2aaf2d; }
202
+ .scribble-coral { stroke: #d76569; }
203
+
204
+ .quant-layout {
205
+ display: grid;
206
+ grid-template-columns: 55% 45%;
207
+ gap: 40px;
208
+ align-items: center;
209
+ min-height: 650px;
210
+ }
211
+
212
+ .quant-copy {
213
+ display: grid;
214
+ gap: 34px;
215
+ align-content: center;
216
+ }
217
+
218
+ .quant-copy .thin-box {
219
+ width: max-content;
220
+ margin-top: 12px;
221
+ font-size: 34px;
222
+ }
223
+
224
+ .conclusion-arrow {
225
+ display: flex;
226
+ align-items: center;
227
+ gap: 14px;
228
+ color: var(--blue);
229
+ font-size: 30px;
230
+ }
231
+
232
+ .conclusion-arrow strong {
233
+ color: var(--ink);
234
+ font-weight: 500;
235
+ }
236
+
237
+ .choice-layout {
238
+ display: grid;
239
+ grid-template-columns: 52% 48%;
240
+ gap: 22px;
241
+ align-items: center;
242
+ min-height: 600px;
243
+ }
244
+
245
+ .choice-list {
246
+ display: grid;
247
+ gap: 31px;
248
+ padding-left: 20px;
249
+ }
250
+
251
+ .choice-row {
252
+ display: grid;
253
+ grid-template-columns: 165px 44px 1fr;
254
+ align-items: baseline;
255
+ column-gap: 12px;
256
+ font-size: 29px;
257
+ line-height: 1.3;
258
+ }
259
+
260
+ .choice-row .arrow {
261
+ color: var(--blue);
262
+ font-size: 36px;
263
+ }
264
+
265
+ .choice-result {
266
+ position: absolute;
267
+ left: 260px;
268
+ right: 230px;
269
+ bottom: 42px;
270
+ padding: 12px 18px 10px;
271
+ border: 3px solid var(--magenta);
272
+ color: var(--magenta);
273
+ text-align: center;
274
+ font-size: 31px;
275
+ line-height: 1.25;
276
+ transform: rotate(.08deg);
277
+ }
278
+
279
+ .ann {
280
+ --ann-font: var(--hand-font);
281
+ --ann-color: var(--magenta);
282
+ --ann-label-max-width: 220px;
283
+ }
284
+
285
+ .ann::after {
286
+ font-size: 22px;
287
+ font-weight: 500;
288
+ line-height: 1.1;
289
+ letter-spacing: .02em;
290
+ }
291
+
292
+ .annotation-anchor {
293
+ width: 1px;
294
+ height: 1px;
295
+ min-width: 1px;
296
+ padding: 0;
297
+ font-size: 0;
298
+ line-height: 0;
299
+ color: transparent;
300
+ background: transparent;
301
+ box-shadow: none;
302
+ }
303
+
304
+ .ann-blue { --ann-color: var(--blue); }
305
+ .ann-green { --ann-color: #248c2a; }
306
+ .ann-red { --ann-color: var(--magenta); }
307
+ .ann-amber { --ann-color: #9f7700; }
308
+
309
+ .progress-bar,
310
+ .deck-header,
311
+ .deck-footer {
312
+ display: none !important;
313
+ }
314
+
315
+ @media (max-aspect-ratio: 16/9) {
316
+ .deck {
317
+ width: 100vw;
318
+ height: 56.25vw;
319
+ top: 50%;
320
+ transform: translateY(-50%);
321
+ }
322
+ }
323
+
324
+ /* Full-deck layouts */
325
+ .release-sub {
326
+ margin: 6px 0 36px 54px;
327
+ }
328
+
329
+ .release-flow {
330
+ display: grid;
331
+ grid-template-columns: 1fr 90px 1.45fr 90px 1fr;
332
+ align-items: center;
333
+ gap: 18px;
334
+ margin: 42px 80px 0;
335
+ }
336
+
337
+ .sketch-box {
338
+ padding: 22px 30px 18px;
339
+ border: 3px solid var(--ink);
340
+ text-align: center;
341
+ font-size: 40px;
342
+ line-height: 1.1;
343
+ transform: rotate(-.2deg);
344
+ }
345
+
346
+ .flow-arrow {
347
+ color: var(--blue);
348
+ text-align: center;
349
+ font-size: 56px;
350
+ line-height: 1;
351
+ }
352
+
353
+ .training-notes {
354
+ display: flex;
355
+ justify-content: center;
356
+ gap: 64px;
357
+ margin-top: 42px;
358
+ font-size: 28px;
359
+ }
360
+
361
+ .training-notes span {
362
+ padding-bottom: 4px;
363
+ border-bottom: 2px solid var(--blue);
364
+ }
365
+
366
+ .wide-result {
367
+ position: absolute;
368
+ left: 310px;
369
+ right: 310px;
370
+ bottom: 68px;
371
+ padding: 14px 22px 11px;
372
+ border: 3px solid var(--magenta);
373
+ color: var(--magenta);
374
+ text-align: center;
375
+ font-size: 31px;
376
+ line-height: 1.25;
377
+ transform: rotate(-.08deg);
378
+ }
379
+
380
+ .compact-result {
381
+ left: 610px;
382
+ right: 610px;
383
+ }
384
+
385
+ .model-stats {
386
+ display: grid;
387
+ grid-template-columns: repeat(3, 1fr);
388
+ gap: 64px;
389
+ margin: 54px 64px 0;
390
+ align-items: start;
391
+ }
392
+
393
+ .model-stats > div {
394
+ display: grid;
395
+ justify-items: center;
396
+ gap: 13px;
397
+ }
398
+
399
+ .model-stats strong {
400
+ font-size: 62px;
401
+ font-weight: 500;
402
+ line-height: 1;
403
+ }
404
+
405
+ .model-stats span {
406
+ font-size: 26px;
407
+ }
408
+
409
+ .local-row {
410
+ display: grid;
411
+ grid-template-columns: 1fr 1fr;
412
+ gap: 80px;
413
+ align-items: center;
414
+ margin: 62px 110px 0;
415
+ }
416
+
417
+ .local-boundary {
418
+ position: relative;
419
+ display: grid;
420
+ grid-template-columns: auto 35px 84px 35px auto;
421
+ align-items: center;
422
+ justify-content: center;
423
+ min-height: 195px;
424
+ padding: 44px 35px 26px;
425
+ border: 3px solid var(--blue);
426
+ border-radius: 42% 39% 46% 41%;
427
+ font-size: 25px;
428
+ }
429
+
430
+ .boundary-title {
431
+ position: absolute;
432
+ top: -25px;
433
+ left: 42%;
434
+ padding: 0 18px;
435
+ background: var(--paper);
436
+ font-size: 30px;
437
+ }
438
+
439
+ .server-doodle {
440
+ font-family: var(--font-mono);
441
+ font-size: 64px;
442
+ }
443
+
444
+ .ram-line {
445
+ position: absolute;
446
+ left: 0;
447
+ right: 0;
448
+ bottom: 8px;
449
+ text-align: center;
450
+ font-size: 22px;
451
+ }
452
+
453
+ .why-local {
454
+ display: grid;
455
+ gap: 35px;
456
+ width: 740px;
457
+ margin: 42px 0 0 70px;
458
+ }
459
+
460
+ .why-line {
461
+ display: grid;
462
+ grid-template-columns: 120px 1fr;
463
+ gap: 26px;
464
+ align-items: center;
465
+ }
466
+
467
+ .why-line > span {
468
+ text-align: center;
469
+ font-size: 32px;
470
+ }
471
+
472
+ .why-line p {
473
+ margin: 0;
474
+ font-size: 28px;
475
+ }
476
+
477
+ .model-weight-compare {
478
+ position: absolute;
479
+ top: 236px;
480
+ right: 92px;
481
+ width: 760px;
482
+ display: grid;
483
+ gap: 42px;
484
+ }
485
+
486
+ .model-weight-compare > div {
487
+ display: grid;
488
+ grid-template-columns: 150px 1fr 170px;
489
+ gap: 18px;
490
+ align-items: center;
491
+ font-size: 25px;
492
+ }
493
+
494
+ .model-weight-compare i {
495
+ display: block;
496
+ height: 20px;
497
+ border: 2px solid var(--ink);
498
+ background: repeating-linear-gradient(120deg, transparent 0 12px, color-mix(in srgb, var(--blue) 34%, transparent) 12px 16px);
499
+ }
500
+
501
+ .model-weight-compare .weight-short {
502
+ width: 52%;
503
+ border-color: var(--magenta);
504
+ background: repeating-linear-gradient(120deg, transparent 0 12px, color-mix(in srgb, var(--green) 40%, transparent) 12px 16px);
505
+ }
506
+
507
+ .model-weight-compare em {
508
+ font-style: normal;
509
+ color: var(--magenta);
510
+ }
511
+
512
+ .deploy-split {
513
+ display: grid;
514
+ grid-template-columns: 48% 52%;
515
+ align-items: center;
516
+ min-height: 620px;
517
+ }
518
+
519
+ .deploy-notes {
520
+ display: grid;
521
+ gap: 42px;
522
+ padding-left: 55px;
523
+ }
524
+
525
+ .gpu-diagram {
526
+ width: 90%;
527
+ margin: 0 auto;
528
+ }
529
+
530
+ .pd-layout {
531
+ display: grid;
532
+ grid-template-columns: 1fr 300px 1fr;
533
+ gap: 45px;
534
+ align-items: center;
535
+ margin-top: 110px;
536
+ }
537
+
538
+ .gpu-group {
539
+ position: relative;
540
+ display: grid;
541
+ grid-template-columns: repeat(2, 110px);
542
+ gap: 20px;
543
+ justify-content: center;
544
+ padding: 48px 32px 32px;
545
+ border: 3px solid var(--blue);
546
+ transform: rotate(-.2deg);
547
+ }
548
+
549
+ .gpu-group:last-child { border-color: var(--magenta); }
550
+
551
+ .gpu-group span {
552
+ position: absolute;
553
+ top: -28px;
554
+ left: 50%;
555
+ padding: 0 18px;
556
+ background: var(--paper);
557
+ font-size: 34px;
558
+ transform: translateX(-50%);
559
+ }
560
+
561
+ .gpu-group b {
562
+ padding: 16px 10px 12px;
563
+ border: 2px solid var(--ink);
564
+ text-align: center;
565
+ font-size: 22px;
566
+ font-weight: 500;
567
+ }
568
+
569
+ .kv-bridge {
570
+ display: grid;
571
+ justify-items: center;
572
+ gap: 20px;
573
+ font-size: 25px;
574
+ }
575
+
576
+ .kv-bridge i {
577
+ color: var(--magenta);
578
+ font-size: 64px;
579
+ line-height: .7;
580
+ }
581
+
582
+ .pd-caption {
583
+ display: flex;
584
+ justify-content: space-between;
585
+ margin: 36px 190px 0;
586
+ color: var(--ink-soft);
587
+ font-size: 25px;
588
+ }
589
+
590
+ .levels-list {
591
+ display: grid;
592
+ gap: 24px;
593
+ margin: 24px 80px 0;
594
+ }
595
+
596
+ .levels-list > div {
597
+ display: grid;
598
+ grid-template-columns: 150px repeat(4, minmax(0, 1fr));
599
+ gap: 28px;
600
+ align-items: center;
601
+ min-height: 62px;
602
+ border-bottom: 2px solid color-mix(in srgb, var(--blue) 40%, transparent);
603
+ font-size: 25px;
604
+ }
605
+
606
+ .levels-list span {
607
+ color: var(--magenta);
608
+ font-size: 30px;
609
+ }
610
+
611
+ .levels-list b {
612
+ font-weight: 500;
613
+ text-align: center;
614
+ }
615
+
616
+ .levels-scale {
617
+ display: grid;
618
+ grid-template-columns: 120px 1fr 120px;
619
+ gap: 18px;
620
+ align-items: center;
621
+ margin: 30px 210px 0;
622
+ font-size: 23px;
623
+ }
624
+
625
+ .levels-scale i {
626
+ height: 5px;
627
+ background: var(--blue);
628
+ border-radius: 50%;
629
+ }
630
+
631
+ .method-compare,
632
+ .metrics-table {
633
+ display: grid;
634
+ margin: 36px 70px 0;
635
+ border-top: 3px solid var(--ink);
636
+ border-bottom: 3px solid var(--ink);
637
+ }
638
+
639
+ .method-compare > div,
640
+ .metrics-table > div {
641
+ display: grid;
642
+ align-items: center;
643
+ min-height: 82px;
644
+ border-bottom: 2px solid color-mix(in srgb, var(--ink) 30%, transparent);
645
+ font-size: 25px;
646
+ }
647
+
648
+ .method-compare > div { grid-template-columns: 1.35fr 1fr .7fr .55fr; }
649
+ .metrics-table > div { grid-template-columns: 1.5fr .75fr .7fr .75fr .75fr; }
650
+
651
+ .method-compare > div:last-child,
652
+ .metrics-table > div:last-child { border-bottom: 0; }
653
+
654
+ .method-compare span,
655
+ .metrics-table span { text-align: center; }
656
+
657
+ .compare-head,
658
+ .metrics-head {
659
+ color: var(--blue);
660
+ font-size: 27px !important;
661
+ }
662
+
663
+ .metric-highlight {
664
+ background: color-mix(in srgb, var(--green) 20%, transparent);
665
+ }
666
+
667
+ .callout-pair {
668
+ display: flex;
669
+ justify-content: center;
670
+ align-items: center;
671
+ gap: 34px;
672
+ margin-top: 34px;
673
+ color: var(--magenta);
674
+ font-size: 34px;
675
+ }
676
+
677
+ .callout-pair p { margin: 0; }
678
+
679
+ .metric-note {
680
+ position: absolute;
681
+ right: 310px;
682
+ top: 353px;
683
+ color: transparent;
684
+ font-size: 0;
685
+ background: transparent;
686
+ box-shadow: none;
687
+ }
688
+
689
+ .curve-layout {
690
+ display: grid;
691
+ grid-template-columns: 43% 57%;
692
+ gap: 30px;
693
+ align-items: center;
694
+ min-height: 670px;
695
+ }
696
+
697
+ .curve-copy {
698
+ display: grid;
699
+ gap: 38px;
700
+ padding-left: 55px;
701
+ }
702
+
703
+ .curve-copy .thin-box {
704
+ width: 600px;
705
+ font-size: 27px;
706
+ }
707
+
708
+ .memory-scale {
709
+ display: grid;
710
+ gap: 28px;
711
+ margin: 30px 150px 0;
712
+ }
713
+
714
+ .memory-scale > div {
715
+ display: grid;
716
+ grid-template-columns: 110px 150px 1fr;
717
+ align-items: center;
718
+ gap: 24px;
719
+ font-size: 27px;
720
+ }
721
+
722
+ .memory-scale b { font-weight: 500; }
723
+
724
+ .memory-scale i {
725
+ display: block;
726
+ width: var(--w);
727
+ height: 18px;
728
+ border: 2px solid var(--blue);
729
+ background: repeating-linear-gradient(120deg, transparent 0 12px, color-mix(in srgb, var(--blue) 40%, transparent) 12px 16px);
730
+ }
731
+
732
+ .memory-scale .bar-green {
733
+ border-color: #2aaf2d;
734
+ background: color-mix(in srgb, var(--green) 42%, transparent);
735
+ }
736
+
737
+ .memory-scale .bar-yellow {
738
+ border-color: #9f7700;
739
+ background: color-mix(in srgb, var(--yellow) 65%, transparent);
740
+ }
741
+
742
+ .memory-notes {
743
+ display: flex;
744
+ justify-content: space-between;
745
+ margin: 42px 170px 0;
746
+ font-size: 24px;
747
+ }
748
+
749
+ .code-slide .page-heading { margin-bottom: 18px; }
750
+
751
+ .command-block {
752
+ display: grid;
753
+ gap: 12px;
754
+ margin: 24px 90px 0;
755
+ padding: 30px 36px;
756
+ border: 3px solid var(--blue);
757
+ transform: rotate(-.08deg);
758
+ }
759
+
760
+ .command-block code,
761
+ .thinking-modes code,
762
+ .mono-note {
763
+ font-family: var(--hand-font);
764
+ }
765
+
766
+ .command-block code {
767
+ color: var(--ink);
768
+ font-size: 24px;
769
+ line-height: 1.35;
770
+ }
771
+
772
+ .download-note {
773
+ display: flex;
774
+ align-items: center;
775
+ justify-content: center;
776
+ gap: 44px;
777
+ margin-top: 36px;
778
+ }
779
+
780
+ .download-note .thin-box { font-size: 25px; }
781
+
782
+ .run-platforms {
783
+ display: flex;
784
+ justify-content: center;
785
+ gap: 80px;
786
+ margin-top: 34px;
787
+ color: var(--blue);
788
+ font-size: 27px;
789
+ }
790
+
791
+ .thinking-modes {
792
+ display: grid;
793
+ gap: 26px;
794
+ margin: 50px 120px 0;
795
+ }
796
+
797
+ .thinking-modes > div {
798
+ display: grid;
799
+ grid-template-columns: 180px 1fr 260px;
800
+ gap: 28px;
801
+ align-items: center;
802
+ min-height: 82px;
803
+ border-bottom: 2px solid color-mix(in srgb, var(--ink) 28%, transparent);
804
+ font-size: 27px;
805
+ }
806
+
807
+ .thinking-modes span { color: var(--magenta); font-size: 32px; }
808
+ .thinking-modes code { font-size: 24px; }
809
+ .thinking-modes em { color: var(--ink-soft); font-style: normal; }
810
+
811
+ .sampling-row {
812
+ display: flex;
813
+ justify-content: center;
814
+ gap: 70px;
815
+ margin-top: 44px;
816
+ font-size: 25px;
817
+ }
818
+
819
+ .template-flow {
820
+ display: grid;
821
+ grid-template-columns: 1fr 90px 1fr 90px 1.2fr;
822
+ gap: 24px;
823
+ align-items: center;
824
+ margin: 80px 70px 0;
825
+ }
826
+
827
+ .template-flow > div:not(.flow-arrow) {
828
+ display: grid;
829
+ gap: 20px;
830
+ padding: 30px 20px;
831
+ border: 3px solid var(--ink);
832
+ text-align: center;
833
+ font-size: 24px;
834
+ }
835
+
836
+ .template-flow span { color: var(--blue); font-size: 31px; }
837
+ .template-flow b { font-weight: 500; }
838
+ .template-flow em { color: var(--ink-soft); font-style: normal; }
839
+
840
+ .check-pair {
841
+ display: flex;
842
+ justify-content: center;
843
+ gap: 100px;
844
+ margin-top: 66px;
845
+ color: var(--magenta);
846
+ font-size: 29px;
847
+ }
848
+
849
+ .route-notes {
850
+ display: grid;
851
+ gap: 38px;
852
+ margin: 55px 0 0 115px;
853
+ font-size: 31px;
854
+ }
855
+
856
+ .route-notes p { margin: 0; }
857
+
858
+ .enterprise-formula {
859
+ display: flex;
860
+ justify-content: center;
861
+ align-items: center;
862
+ gap: 32px;
863
+ margin-top: 76px;
864
+ font-size: 38px;
865
+ }
866
+
867
+ .enterprise-formula span {
868
+ padding: 4px 18px;
869
+ border-bottom: 3px solid var(--blue);
870
+ }
871
+
872
+ .enterprise-formula span:nth-of-type(4) { border-color: var(--magenta); }
873
+ .enterprise-formula b { color: var(--magenta); font-weight: 500; }
874
+
875
+ .thanks {
876
+ align-items: center;
877
+ justify-content: center;
878
+ text-align: center;
879
+ }
880
+
881
+ .thanks-main {
882
+ font-family: var(--hand-font);
883
+ font-size: 82px;
884
+ color: var(--ink);
885
+ }
886
+
887
+ .thanks-line {
888
+ margin-top: 95px;
889
+ padding-bottom: 9px;
890
+ border-bottom: 4px solid var(--magenta);
891
+ font-size: 42px;
892
+ }
893
+
894
+ .thanks-meta {
895
+ margin-top: 52px;
896
+ font-size: 27px;
897
+ }