deepline 0.1.109 → 0.1.111

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 (34) hide show
  1. package/dist/cli/index.js +2634 -1532
  2. package/dist/cli/index.mjs +2547 -1451
  3. package/dist/index.d.mts +21 -14
  4. package/dist/index.d.ts +21 -14
  5. package/dist/index.js +97 -23
  6. package/dist/index.mjs +97 -23
  7. package/dist/repo/apps/play-runner-workers/src/coordinator-entry.ts +192 -121
  8. package/dist/repo/apps/play-runner-workers/src/entry.ts +254 -65
  9. package/dist/repo/apps/play-runner-workers/src/runtime/receipts.ts +18 -27
  10. package/dist/repo/apps/play-runner-workers/src/workflow-instance-create.ts +44 -0
  11. package/dist/repo/apps/play-runner-workers/src/workflow-retry.ts +7 -11
  12. package/dist/repo/sdk/src/client.ts +35 -12
  13. package/dist/repo/sdk/src/errors.ts +2 -2
  14. package/dist/repo/sdk/src/http.ts +87 -7
  15. package/dist/repo/sdk/src/play.ts +1 -1
  16. package/dist/repo/sdk/src/plays/bundle-play-file.ts +5 -1
  17. package/dist/repo/sdk/src/release.ts +13 -10
  18. package/dist/repo/sdk/src/tool-output.ts +2 -2
  19. package/dist/repo/sdk/src/types.ts +9 -6
  20. package/dist/repo/shared_libs/play-runtime/fullenrich-batching.ts +229 -0
  21. package/dist/repo/shared_libs/play-runtime/governor/policy.ts +1 -1
  22. package/dist/repo/shared_libs/play-runtime/play-runtime-batching-registry.ts +20 -0
  23. package/dist/repo/shared_libs/play-runtime/run-failure.ts +20 -12
  24. package/dist/repo/shared_libs/play-runtime/run-ledger.ts +147 -70
  25. package/dist/repo/shared_libs/play-runtime/scheduler-backend.ts +6 -2
  26. package/dist/repo/shared_libs/play-runtime/secret-redaction.ts +15 -0
  27. package/dist/repo/shared_libs/play-runtime/work-receipts.ts +1 -0
  28. package/dist/repo/shared_libs/plays/bundling/index.ts +193 -21
  29. package/dist/repo/shared_libs/plays/static-pipeline.ts +1 -3
  30. package/dist/repo/shared_libs/security/outbound-url-policy.ts +238 -0
  31. package/dist/repo/shared_libs/security/safe-fetch.ts +118 -0
  32. package/dist/viewer/viewer.css +617 -0
  33. package/dist/viewer/viewer.js +1496 -0
  34. package/package.json +5 -1
@@ -0,0 +1,617 @@
1
+
2
+ :root {
3
+ --bg: #0d1117;
4
+ --bg-secondary: #161b22;
5
+ --bg-tertiary: #21262d;
6
+ --border: #30363d;
7
+ --text: #e6edf3;
8
+ --text-dim: #8b949e;
9
+ --text-dimmer: #6e7681;
10
+ --green: #3fb950;
11
+ --red: #f85149;
12
+ --yellow: #d29922;
13
+ --blue: #58a6ff;
14
+ --purple: #bc8cff;
15
+ --orange: #f0883e;
16
+ --cyan: #39d2c0;
17
+ }
18
+ * { margin: 0; padding: 0; box-sizing: border-box; }
19
+ body {
20
+ background: var(--bg);
21
+ color: var(--text);
22
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
23
+ font-size: 14px;
24
+ line-height: 1.5;
25
+ }
26
+ .layout { display: flex; height: 100vh; }
27
+ .sidebar {
28
+ width: 260px;
29
+ background: var(--bg-secondary);
30
+ border-right: 1px solid var(--border);
31
+ overflow-y: auto;
32
+ flex-shrink: 0;
33
+ padding: 12px 0;
34
+ }
35
+ .sidebar-item {
36
+ padding: 10px 16px;
37
+ cursor: pointer;
38
+ border-left: 3px solid transparent;
39
+ transition: background 0.15s;
40
+ font-size: 13px;
41
+ }
42
+ .sidebar-item:hover { background: var(--bg-tertiary); }
43
+ .sidebar-item.active {
44
+ background: var(--bg-tertiary);
45
+ border-left-color: var(--blue);
46
+ }
47
+ .sidebar-item .label { font-weight: 600; color: var(--text); }
48
+ .sidebar-item .sub { color: var(--text-dim); font-size: 12px; margin-top: 2px; }
49
+ .sidebar-compare {
50
+ border-bottom: 1px solid var(--border);
51
+ margin-bottom: 4px;
52
+ }
53
+ .sidebar-compare .label { color: var(--cyan); }
54
+ .sidebar-compare kbd {
55
+ background: var(--bg-tertiary);
56
+ border: 1px solid var(--border);
57
+ border-radius: 3px;
58
+ padding: 0 4px;
59
+ font-size: 10px;
60
+ font-family: inherit;
61
+ }
62
+ .main { flex: 1; overflow-y: auto; padding: 24px 32px; max-width: 1100px; }
63
+ .main.full-width { max-width: none; }
64
+ .header {
65
+ background: var(--bg-secondary);
66
+ border: 1px solid var(--border);
67
+ border-radius: 8px;
68
+ padding: 20px 24px;
69
+ margin-bottom: 20px;
70
+ }
71
+ .header-title-row {
72
+ display: flex;
73
+ align-items: center;
74
+ gap: 8px;
75
+ margin-bottom: 8px;
76
+ }
77
+ .header-title-row h1 { font-size: 18px; font-weight: 600; }
78
+ .header-grid {
79
+ display: grid;
80
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
81
+ gap: 8px 24px;
82
+ }
83
+ .header-grid .item { }
84
+ .header-grid .item .key { color: var(--text-dim); font-size: 12px; text-transform: uppercase; letter-spacing: 0.5px; }
85
+ .header-grid .item .val { font-weight: 500; font-size: 14px; }
86
+
87
+ /* Tool breakdown in header */
88
+ .tool-breakdown {
89
+ display: flex;
90
+ flex-wrap: wrap;
91
+ gap: 6px;
92
+ margin-top: 12px;
93
+ padding-top: 12px;
94
+ border-top: 1px solid var(--border);
95
+ }
96
+ .tb-item {
97
+ display: inline-flex;
98
+ align-items: center;
99
+ gap: 4px;
100
+ background: var(--bg);
101
+ border: 1px solid var(--border);
102
+ border-radius: 4px;
103
+ padding: 2px 8px;
104
+ font-size: 12px;
105
+ }
106
+ .tb-count { color: var(--text-dim); font-weight: 600; }
107
+
108
+ /* Timeline */
109
+ .timeline { }
110
+ .tl-entry { margin-bottom: 2px; }
111
+
112
+ /* Gap indicator between steps */
113
+ .tl-gap {
114
+ display: flex;
115
+ align-items: center;
116
+ gap: 8px;
117
+ padding: 4px 12px;
118
+ margin: 4px 0;
119
+ }
120
+ .gap-line {
121
+ flex: 1;
122
+ height: 1px;
123
+ background: var(--border);
124
+ }
125
+ .gap-label {
126
+ font-size: 10px;
127
+ color: var(--yellow);
128
+ font-weight: 600;
129
+ white-space: nowrap;
130
+ letter-spacing: 0.5px;
131
+ }
132
+
133
+ /* User message */
134
+ .user-label {
135
+ font-size: 10px;
136
+ text-transform: uppercase;
137
+ letter-spacing: 0.5px;
138
+ color: var(--green);
139
+ margin-left: 24px;
140
+ margin-bottom: 2px;
141
+ margin-top: 12px;
142
+ font-weight: 600;
143
+ }
144
+ .user-message {
145
+ padding: 12px 16px;
146
+ border-left: 3px solid var(--green);
147
+ margin-left: 8px;
148
+ color: var(--text);
149
+ font-size: 13px;
150
+ line-height: 1.6;
151
+ white-space: pre-wrap;
152
+ word-break: break-word;
153
+ background: rgba(63,185,80,0.04);
154
+ }
155
+ .user-message.collapsed { max-height: 100px; overflow: hidden; position: relative; }
156
+ .user-message.collapsed::after {
157
+ content: '';
158
+ position: absolute;
159
+ bottom: 0; left: 0; right: 0;
160
+ height: 40px;
161
+ background: linear-gradient(transparent, var(--bg));
162
+ }
163
+
164
+ /* Thinking */
165
+ .tl-thinking {
166
+ position: relative;
167
+ }
168
+ .thinking-label {
169
+ font-size: 10px;
170
+ text-transform: uppercase;
171
+ letter-spacing: 0.5px;
172
+ color: var(--purple);
173
+ margin-left: 24px;
174
+ margin-bottom: 2px;
175
+ font-weight: 600;
176
+ }
177
+ .thinking {
178
+ padding: 12px 16px;
179
+ border-left: 3px solid var(--purple);
180
+ margin-left: 8px;
181
+ color: var(--text-dimmer);
182
+ font-size: 12px;
183
+ line-height: 1.6;
184
+ white-space: pre-wrap;
185
+ word-break: break-word;
186
+ font-style: italic;
187
+ background: rgba(188,140,255,0.03);
188
+ }
189
+ .thinking.collapsed { max-height: 100px; overflow: hidden; position: relative; }
190
+ .thinking.collapsed::after {
191
+ content: '';
192
+ position: absolute;
193
+ bottom: 0; left: 0; right: 0;
194
+ height: 40px;
195
+ background: linear-gradient(transparent, var(--bg));
196
+ }
197
+
198
+ /* Reasoning */
199
+ .reasoning {
200
+ padding: 12px 16px;
201
+ border-left: 3px solid var(--border);
202
+ margin-left: 8px;
203
+ color: var(--text-dim);
204
+ font-size: 13px;
205
+ line-height: 1.6;
206
+ white-space: pre-wrap;
207
+ word-break: break-word;
208
+ }
209
+ .reasoning.collapsed { max-height: 100px; overflow: hidden; position: relative; }
210
+ .reasoning.collapsed::after {
211
+ content: '';
212
+ position: absolute;
213
+ bottom: 0; left: 0; right: 0;
214
+ height: 40px;
215
+ background: linear-gradient(transparent, var(--bg));
216
+ }
217
+ .reasoning-toggle {
218
+ display: inline-block;
219
+ margin-left: 24px;
220
+ margin-bottom: 8px;
221
+ color: var(--blue);
222
+ cursor: pointer;
223
+ font-size: 12px;
224
+ user-select: none;
225
+ }
226
+ .reasoning-toggle:hover { text-decoration: underline; }
227
+
228
+ /* Tool call row */
229
+ .tool-row {
230
+ display: flex;
231
+ align-items: center;
232
+ gap: 12px;
233
+ padding: 6px 12px;
234
+ border-radius: 6px;
235
+ cursor: pointer;
236
+ transition: background 0.15s;
237
+ font-family: 'SF Mono', 'Fira Code', 'Fira Mono', Menlo, Consolas, monospace;
238
+ font-size: 13px;
239
+ }
240
+ .tool-row:hover { background: var(--bg-secondary); }
241
+ .tool-row.expanded { background: var(--bg-secondary); }
242
+ .tool-step { color: var(--text-dimmer); min-width: 30px; text-align: right; }
243
+ .tool-elapsed { color: var(--text-dimmer); min-width: 55px; text-align: right; font-size: 12px; }
244
+ .tool-status {
245
+ display: inline-block;
246
+ padding: 1px 8px;
247
+ border-radius: 10px;
248
+ font-size: 11px;
249
+ font-weight: 600;
250
+ min-width: 42px;
251
+ text-align: center;
252
+ }
253
+ .tool-status.ok { background: rgba(63,185,80,0.15); color: var(--green); }
254
+ .tool-status.fail { background: rgba(248,81,73,0.15); color: var(--red); }
255
+ .tool-status.unknown { background: rgba(139,148,158,0.15); color: var(--text-dim); }
256
+ .tool-name {
257
+ font-weight: 600;
258
+ min-width: 70px;
259
+ }
260
+ .tool-name.bash { color: var(--blue); }
261
+ .tool-name.read, .tool-name.write, .tool-name.edit { color: var(--purple); }
262
+ .tool-name.skill, .tool-name.task { color: var(--orange); }
263
+ .tool-name.grep, .tool-name.glob { color: var(--cyan); }
264
+ .tool-name.webfetch, .tool-name.websearch { color: var(--yellow); }
265
+ .tool-cmd {
266
+ color: var(--text-dim);
267
+ overflow: hidden;
268
+ text-overflow: ellipsis;
269
+ white-space: nowrap;
270
+ flex: 1;
271
+ }
272
+ .parallel-badge, .loop-badge {
273
+ font-size: 10px;
274
+ color: var(--text-dimmer);
275
+ background: var(--bg-tertiary);
276
+ border: 1px solid var(--border);
277
+ border-radius: 4px;
278
+ padding: 0 5px;
279
+ white-space: nowrap;
280
+ }
281
+ .loop-badge {
282
+ color: var(--yellow);
283
+ border-color: rgba(210,153,34,0.4);
284
+ background: rgba(210,153,34,0.08);
285
+ }
286
+ .repeat-badge {
287
+ margin-left: 6px;
288
+ font-size: 10px;
289
+ color: var(--text-dimmer);
290
+ background: rgba(120,120,180,0.08);
291
+ border: 1px solid rgba(120,120,180,0.3);
292
+ border-radius: 4px;
293
+ padding: 0 5px;
294
+ white-space: nowrap;
295
+ cursor: help;
296
+ }
297
+ .reasoning-repeat-header {
298
+ margin-bottom: 4px;
299
+ }
300
+
301
+ /* Error streak + loop highlighting */
302
+ .tl-tool.in-error-streak {
303
+ border-left: 3px solid var(--red);
304
+ margin-left: 0;
305
+ padding-left: 0;
306
+ }
307
+ .tl-tool.in-loop {
308
+ border-left: 3px solid var(--yellow);
309
+ margin-left: 0;
310
+ padding-left: 0;
311
+ }
312
+ .tl-tool.in-error-streak.in-loop {
313
+ border-left: 3px solid var(--red);
314
+ }
315
+
316
+ /* Tool detail (expanded) */
317
+ .tool-detail {
318
+ display: none;
319
+ margin-left: 48px;
320
+ margin-bottom: 12px;
321
+ border: 1px solid var(--border);
322
+ border-radius: 6px;
323
+ overflow: hidden;
324
+ }
325
+ .tool-detail.open { display: block; }
326
+ .tool-detail-section {
327
+ padding: 12px 16px;
328
+ border-bottom: 1px solid var(--border);
329
+ }
330
+ .tool-detail-section:last-child { border-bottom: none; }
331
+ .tool-detail-section .label {
332
+ font-size: 11px;
333
+ text-transform: uppercase;
334
+ letter-spacing: 0.5px;
335
+ color: var(--text-dim);
336
+ margin-bottom: 6px;
337
+ }
338
+ .tool-detail-section pre {
339
+ background: var(--bg);
340
+ border-radius: 4px;
341
+ padding: 10px 14px;
342
+ overflow-x: auto;
343
+ font-size: 12px;
344
+ line-height: 1.5;
345
+ font-family: 'SF Mono', 'Fira Code', 'Fira Mono', Menlo, Consolas, monospace;
346
+ white-space: pre-wrap;
347
+ word-break: break-word;
348
+ max-height: 400px;
349
+ overflow-y: auto;
350
+ color: var(--text);
351
+ }
352
+ .tool-detail-section pre.error-content {
353
+ border: 1px solid var(--red);
354
+ background: rgba(248,81,73,0.06);
355
+ }
356
+
357
+ /* Result card */
358
+ .result-card {
359
+ background: var(--bg-secondary);
360
+ border: 1px solid var(--border);
361
+ border-radius: 8px;
362
+ padding: 20px 24px;
363
+ margin-top: 20px;
364
+ }
365
+ .result-card h3 { font-size: 15px; margin-bottom: 10px; }
366
+ .result-card .stat-row { display: flex; gap: 24px; flex-wrap: wrap; }
367
+ .result-card .stat { }
368
+ .result-card .stat .key { color: var(--text-dim); font-size: 12px; }
369
+ .result-card .stat .val { font-size: 16px; font-weight: 600; }
370
+
371
+ .hidden { display: none; }
372
+
373
+ /* Search */
374
+ .search-bar {
375
+ margin-bottom: 16px;
376
+ display: flex;
377
+ gap: 8px;
378
+ align-items: center;
379
+ }
380
+ .search-bar input {
381
+ flex: 1;
382
+ background: var(--bg-secondary);
383
+ border: 1px solid var(--border);
384
+ border-radius: 6px;
385
+ padding: 8px 12px;
386
+ color: var(--text);
387
+ font-size: 13px;
388
+ font-family: inherit;
389
+ outline: none;
390
+ }
391
+ .search-bar input:focus { border-color: var(--blue); }
392
+ .search-bar input::placeholder { color: var(--text-dimmer); }
393
+ .filter-btn {
394
+ background: var(--bg-secondary);
395
+ border: 1px solid var(--border);
396
+ border-radius: 6px;
397
+ padding: 8px 12px;
398
+ color: var(--text-dim);
399
+ font-size: 12px;
400
+ cursor: pointer;
401
+ white-space: nowrap;
402
+ }
403
+ .filter-btn:hover { background: var(--bg-tertiary); }
404
+ .filter-btn.active { border-color: var(--blue); color: var(--blue); }
405
+
406
+ .prompt-card {
407
+ background: var(--bg-secondary);
408
+ border: 1px solid var(--border);
409
+ border-radius: 8px;
410
+ padding: 16px 20px;
411
+ margin-bottom: 16px;
412
+ }
413
+ .prompt-label {
414
+ font-size: 11px;
415
+ text-transform: uppercase;
416
+ letter-spacing: 0.5px;
417
+ color: var(--text-dim);
418
+ margin-bottom: 6px;
419
+ }
420
+ .prompt-text {
421
+ font-size: 14px;
422
+ line-height: 1.6;
423
+ white-space: pre-wrap;
424
+ word-break: break-word;
425
+ }
426
+
427
+ .timing-badge {
428
+ display: inline-block;
429
+ font-size: 11px;
430
+ font-weight: 600;
431
+ padding: 2px 8px;
432
+ border-radius: 10px;
433
+ vertical-align: middle;
434
+ }
435
+ .timing-badge.exact { background: rgba(63,185,80,0.15); color: var(--green); }
436
+ .timing-badge.estimated { background: rgba(210,153,34,0.15); color: var(--yellow); }
437
+
438
+ /* Live badge */
439
+ .live-badge {
440
+ display: inline-block;
441
+ font-size: 11px;
442
+ font-weight: 700;
443
+ padding: 2px 10px;
444
+ border-radius: 10px;
445
+ background: rgba(248,81,73,0.15);
446
+ color: var(--red);
447
+ animation: live-pulse 2s ease-in-out infinite;
448
+ letter-spacing: 0.5px;
449
+ cursor: pointer;
450
+ user-select: none;
451
+ }
452
+ .live-badge.paused {
453
+ background: rgba(139,148,158,0.15);
454
+ color: var(--text-dim);
455
+ animation: none;
456
+ }
457
+ @keyframes live-pulse {
458
+ 0%, 100% { opacity: 1; }
459
+ 50% { opacity: 0.5; }
460
+ }
461
+
462
+ .download-btn {
463
+ background: var(--bg-secondary);
464
+ border: 1px solid var(--border);
465
+ border-radius: 6px;
466
+ padding: 4px 10px;
467
+ color: var(--text-dim);
468
+ font-size: 12px;
469
+ cursor: pointer;
470
+ white-space: nowrap;
471
+ font-family: inherit;
472
+ }
473
+ .download-btn:hover { background: var(--bg-tertiary); color: var(--text); }
474
+
475
+ /* File touch map */
476
+ .file-map-card {
477
+ background: var(--bg-secondary);
478
+ border: 1px solid var(--border);
479
+ border-radius: 8px;
480
+ margin-bottom: 16px;
481
+ overflow: hidden;
482
+ }
483
+ .file-map-header {
484
+ display: flex;
485
+ justify-content: space-between;
486
+ align-items: center;
487
+ padding: 10px 16px;
488
+ cursor: pointer;
489
+ font-size: 13px;
490
+ font-weight: 600;
491
+ color: var(--text-dim);
492
+ transition: background 0.15s;
493
+ }
494
+ .file-map-header:hover { background: var(--bg-tertiary); }
495
+ .file-map-toggle {
496
+ color: var(--blue);
497
+ font-size: 12px;
498
+ font-weight: 500;
499
+ }
500
+ .file-map-body {
501
+ display: none;
502
+ border-top: 1px solid var(--border);
503
+ }
504
+ .file-map-body.open { display: block; }
505
+ .file-map-table {
506
+ width: 100%;
507
+ border-collapse: collapse;
508
+ font-size: 12px;
509
+ font-family: 'SF Mono', 'Fira Code', Menlo, monospace;
510
+ }
511
+ .file-map-table th {
512
+ background: var(--bg-tertiary);
513
+ color: var(--text-dim);
514
+ font-weight: 600;
515
+ font-size: 10px;
516
+ text-transform: uppercase;
517
+ letter-spacing: 0.5px;
518
+ padding: 6px 12px;
519
+ text-align: left;
520
+ border-bottom: 1px solid var(--border);
521
+ }
522
+ .file-map-table td {
523
+ padding: 4px 12px;
524
+ border-bottom: 1px solid var(--border);
525
+ color: var(--text-dim);
526
+ }
527
+ .file-map-table td:first-child { color: var(--text); }
528
+ .file-map-table tr:hover { background: rgba(88,166,255,0.04); }
529
+
530
+ /* Comparison view */
531
+ .comparison-table-wrap {
532
+ background: var(--bg-secondary);
533
+ border: 1px solid var(--border);
534
+ border-radius: 8px;
535
+ overflow: hidden;
536
+ }
537
+ .comparison-table {
538
+ width: 100%;
539
+ border-collapse: collapse;
540
+ font-size: 13px;
541
+ }
542
+ .comparison-table th {
543
+ background: var(--bg-tertiary);
544
+ color: var(--text-dim);
545
+ font-weight: 600;
546
+ font-size: 12px;
547
+ padding: 10px 16px;
548
+ text-align: left;
549
+ border-bottom: 1px solid var(--border);
550
+ position: sticky;
551
+ top: 0;
552
+ }
553
+ .comparison-table td {
554
+ padding: 8px 16px;
555
+ border-bottom: 1px solid var(--border);
556
+ color: var(--text);
557
+ }
558
+ .comparison-table td:first-child {
559
+ color: var(--text-dim);
560
+ font-weight: 500;
561
+ min-width: 140px;
562
+ }
563
+ .comparison-table tr:hover { background: rgba(88,166,255,0.04); }
564
+ .compare-dim { color: var(--text-dimmer); font-size: 11px; }
565
+ .compare-best { color: var(--green); font-weight: 600; }
566
+ .compare-worst { color: var(--red); }
567
+ .compare-section td {
568
+ background: var(--bg-tertiary);
569
+ color: var(--text-dim) !important;
570
+ font-weight: 600;
571
+ font-size: 11px;
572
+ text-transform: uppercase;
573
+ letter-spacing: 0.5px;
574
+ padding: 6px 16px;
575
+ }
576
+ .compare-indent {
577
+ padding-left: 28px !important;
578
+ }
579
+
580
+ /* Rendered markdown */
581
+ .md-rendered { font-size: 13px; line-height: 1.6; }
582
+ .md-rendered p { margin-bottom: 8px; }
583
+ .md-rendered strong { color: var(--text); font-weight: 600; }
584
+ .md-rendered code {
585
+ background: var(--bg-tertiary); border-radius: 3px; padding: 1px 5px;
586
+ font-family: 'SF Mono', 'Fira Code', Menlo, monospace; font-size: 12px;
587
+ }
588
+ .md-rendered table {
589
+ border-collapse: collapse; margin: 8px 0; width: 100%; font-size: 12px;
590
+ }
591
+ .md-rendered th, .md-rendered td {
592
+ border: 1px solid var(--border); padding: 6px 10px; text-align: left;
593
+ }
594
+ .md-rendered th {
595
+ background: var(--bg-tertiary); color: var(--text-dim); font-weight: 600;
596
+ font-size: 11px; text-transform: uppercase; letter-spacing: 0.3px;
597
+ }
598
+ .md-rendered tr:hover { background: rgba(88,166,255,0.04); }
599
+ .md-rendered a { color: var(--blue); text-decoration: none; }
600
+ .md-rendered a:hover { text-decoration: underline; }
601
+ .md-rendered h1, .md-rendered h2, .md-rendered h3 {
602
+ margin: 12px 0 6px; font-weight: 600;
603
+ }
604
+ .md-rendered h1 { font-size: 16px; }
605
+ .md-rendered h2 { font-size: 15px; }
606
+ .md-rendered h3 { font-size: 14px; }
607
+ .md-rendered ul, .md-rendered ol { margin: 4px 0 8px 20px; }
608
+ .md-rendered li { margin-bottom: 2px; }
609
+ .md-rendered pre {
610
+ background: var(--bg); border-radius: 4px; padding: 10px 14px;
611
+ font-size: 12px; line-height: 1.5; overflow-x: auto;
612
+ font-family: 'SF Mono', 'Fira Code', Menlo, monospace;
613
+ margin: 8px 0;
614
+ white-space: pre-wrap;
615
+ word-break: break-word;
616
+ }
617
+ .md-rendered pre code { background: none; padding: 0; }