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