pi-studio-opencode 0.1.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 (60) hide show
  1. package/ARCHITECTURE.md +122 -0
  2. package/LICENSE +21 -0
  3. package/README.md +108 -0
  4. package/dist/demo-host-pi.d.ts +1 -0
  5. package/dist/demo-host-pi.js +71 -0
  6. package/dist/demo-host-pi.js.map +1 -0
  7. package/dist/demo-host.d.ts +1 -0
  8. package/dist/demo-host.js +154 -0
  9. package/dist/demo-host.js.map +1 -0
  10. package/dist/host-opencode-plugin.d.ts +52 -0
  11. package/dist/host-opencode-plugin.js +396 -0
  12. package/dist/host-opencode-plugin.js.map +1 -0
  13. package/dist/host-opencode.d.ts +154 -0
  14. package/dist/host-opencode.js +627 -0
  15. package/dist/host-opencode.js.map +1 -0
  16. package/dist/host-pi.d.ts +45 -0
  17. package/dist/host-pi.js +258 -0
  18. package/dist/host-pi.js.map +1 -0
  19. package/dist/install-config.d.ts +36 -0
  20. package/dist/install-config.js +136 -0
  21. package/dist/install-config.js.map +1 -0
  22. package/dist/install.d.ts +16 -0
  23. package/dist/install.js +168 -0
  24. package/dist/install.js.map +1 -0
  25. package/dist/launcher.d.ts +2 -0
  26. package/dist/launcher.js +124 -0
  27. package/dist/launcher.js.map +1 -0
  28. package/dist/main.d.ts +1 -0
  29. package/dist/main.js +732 -0
  30. package/dist/main.js.map +1 -0
  31. package/dist/mock-pi-session.d.ts +27 -0
  32. package/dist/mock-pi-session.js +138 -0
  33. package/dist/mock-pi-session.js.map +1 -0
  34. package/dist/open-browser.d.ts +1 -0
  35. package/dist/open-browser.js +29 -0
  36. package/dist/open-browser.js.map +1 -0
  37. package/dist/opencode-plugin.d.ts +3 -0
  38. package/dist/opencode-plugin.js +326 -0
  39. package/dist/opencode-plugin.js.map +1 -0
  40. package/dist/prototype-pdf.d.ts +12 -0
  41. package/dist/prototype-pdf.js +991 -0
  42. package/dist/prototype-pdf.js.map +1 -0
  43. package/dist/prototype-server.d.ts +88 -0
  44. package/dist/prototype-server.js +1002 -0
  45. package/dist/prototype-server.js.map +1 -0
  46. package/dist/prototype-theme.d.ts +36 -0
  47. package/dist/prototype-theme.js +1471 -0
  48. package/dist/prototype-theme.js.map +1 -0
  49. package/dist/studio-core.d.ts +63 -0
  50. package/dist/studio-core.js +251 -0
  51. package/dist/studio-core.js.map +1 -0
  52. package/dist/studio-host-types.d.ts +50 -0
  53. package/dist/studio-host-types.js +14 -0
  54. package/dist/studio-host-types.js.map +1 -0
  55. package/examples/opencode/INSTALL.md +67 -0
  56. package/examples/opencode/opencode.local-path.jsonc +16 -0
  57. package/package.json +68 -0
  58. package/static/prototype.css +1277 -0
  59. package/static/prototype.html +173 -0
  60. package/static/prototype.js +3198 -0
@@ -0,0 +1,1277 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ --bg: #0f1117;
4
+ --panel: #171b24;
5
+ --panel-2: #11161f;
6
+ --card: #171b24;
7
+ --editor-bg: #171b24;
8
+ --text: #e6edf3;
9
+ --muted: #9aa5b1;
10
+ --border: #2d3748;
11
+ --border-muted: #242b38;
12
+ --accent: #5ea1ff;
13
+ --accent-contrast: #0e1616;
14
+ --accent-soft: rgba(94, 161, 255, 0.35);
15
+ --accent-soft-strong: rgba(94, 161, 255, 0.40);
16
+ --ok: #73d13d;
17
+ --warn: #f9c74f;
18
+ --error: #ff6b6b;
19
+ --error-contrast: #0e1616;
20
+ --marker-bg: rgba(94, 161, 255, 0.25);
21
+ --marker-border: rgba(94, 161, 255, 0.65);
22
+ --ok-border: rgba(115, 209, 61, 0.70);
23
+ --warn-border: rgba(249, 199, 79, 0.70);
24
+ --panel-shadow: 0 1px 2px rgba(0, 0, 0, 0.36), 0 6px 18px rgba(0, 0, 0, 0.22);
25
+ --font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
26
+ --md-heading: #f0c674;
27
+ --md-link: #81a2be;
28
+ --md-link-url: #666666;
29
+ --md-code: #8abeb7;
30
+ --md-codeblock: #b5bd68;
31
+ --md-codeblock-border: #808080;
32
+ --md-quote: #808080;
33
+ --md-quote-border: #808080;
34
+ --md-hr: #808080;
35
+ --md-list-bullet: #8abeb7;
36
+ --syntax-comment: #6A9955;
37
+ --syntax-keyword: #569CD6;
38
+ --syntax-function: #DCDCAA;
39
+ --syntax-variable: #9CDCFE;
40
+ --syntax-string: #CE9178;
41
+ --syntax-number: #B5CEA8;
42
+ --syntax-type: #4EC9B0;
43
+ --syntax-operator: #D4D4D4;
44
+ --syntax-punctuation: #D4D4D4;
45
+ --blockquote-bg: rgba(128, 128, 128, 0.16);
46
+ --table-alt-bg: rgba(128, 128, 128, 0.14);
47
+ }
48
+
49
+ * {
50
+ box-sizing: border-box;
51
+ }
52
+
53
+ html,
54
+ body {
55
+ margin: 0;
56
+ height: 100%;
57
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
58
+ background: var(--bg);
59
+ color: var(--text);
60
+ }
61
+
62
+ body {
63
+ display: flex;
64
+ flex-direction: column;
65
+ min-height: 100%;
66
+ }
67
+
68
+ header {
69
+ border-bottom: 1px solid var(--border-muted);
70
+ padding: 12px 16px;
71
+ background: var(--panel);
72
+ display: flex;
73
+ flex-wrap: wrap;
74
+ gap: 12px;
75
+ align-items: center;
76
+ justify-content: space-between;
77
+ }
78
+
79
+ h1 {
80
+ margin: 0;
81
+ font-size: 18px;
82
+ font-weight: 600;
83
+ display: inline-flex;
84
+ align-items: baseline;
85
+ gap: 8px;
86
+ }
87
+
88
+ .app-logo {
89
+ color: var(--accent);
90
+ font-weight: 700;
91
+ font-size: 21px;
92
+ line-height: 1;
93
+ display: inline-block;
94
+ }
95
+
96
+ .app-subtitle {
97
+ font-size: 12px;
98
+ font-weight: 500;
99
+ color: var(--muted);
100
+ }
101
+
102
+ .controls {
103
+ display: flex;
104
+ gap: 8px;
105
+ align-items: center;
106
+ flex-wrap: wrap;
107
+ }
108
+
109
+ button,
110
+ select {
111
+ border: 1px solid var(--border-muted);
112
+ background: var(--panel);
113
+ color: var(--text);
114
+ border-radius: 8px;
115
+ padding: 8px 10px;
116
+ font-size: 13px;
117
+ transition: background-color 120ms ease, border-color 120ms ease, filter 120ms ease;
118
+ }
119
+
120
+ button {
121
+ cursor: pointer;
122
+ }
123
+
124
+ button:not(:disabled):hover,
125
+ select:hover {
126
+ background: var(--panel-2);
127
+ }
128
+
129
+ button:focus-visible,
130
+ select:focus-visible,
131
+ textarea:focus-visible {
132
+ outline: 2px solid var(--accent-soft-strong);
133
+ outline-offset: 1px;
134
+ }
135
+
136
+ button:disabled {
137
+ opacity: 0.6;
138
+ cursor: not-allowed;
139
+ }
140
+
141
+ #runBtn,
142
+ #queueBtn,
143
+ #loadResponseBtn {
144
+ min-width: 10rem;
145
+ display: inline-flex;
146
+ justify-content: center;
147
+ align-items: center;
148
+ }
149
+
150
+ #runBtn:not(:disabled):not(.request-stop-active),
151
+ #queueBtn:not(:disabled),
152
+ #loadResponseBtn:not(:disabled) {
153
+ background: var(--accent);
154
+ border-color: var(--accent);
155
+ color: var(--accent-contrast);
156
+ font-weight: 600;
157
+ }
158
+
159
+ #runBtn:not(:disabled):not(.request-stop-active):hover,
160
+ #queueBtn:not(:disabled):hover,
161
+ #loadResponseBtn:not(:disabled):hover {
162
+ filter: brightness(0.95);
163
+ }
164
+
165
+ #runBtn.request-stop-active {
166
+ background: var(--error);
167
+ border-color: var(--error);
168
+ color: var(--error-contrast);
169
+ font-weight: 600;
170
+ }
171
+
172
+ #runBtn.request-stop-active:not(:disabled):hover {
173
+ filter: brightness(0.95);
174
+ }
175
+
176
+ #diagnosticsBtn.active {
177
+ background: var(--accent-soft);
178
+ border-color: var(--border);
179
+ }
180
+
181
+ main {
182
+ flex: 1;
183
+ min-height: 0;
184
+ display: grid;
185
+ grid-template-columns: 1fr 1fr;
186
+ gap: 12px;
187
+ padding: 12px;
188
+ }
189
+
190
+ section {
191
+ border: 1px solid var(--border-muted);
192
+ border-radius: 10px;
193
+ background: var(--panel);
194
+ min-height: 0;
195
+ display: flex;
196
+ flex-direction: column;
197
+ overflow: hidden;
198
+ box-shadow: var(--panel-shadow);
199
+ }
200
+
201
+ section.pane-active {
202
+ border-color: var(--border);
203
+ }
204
+
205
+ body.pane-focus-left main,
206
+ body.pane-focus-right main {
207
+ grid-template-columns: 1fr;
208
+ }
209
+
210
+ body.pane-focus-left #rightPane,
211
+ body.pane-focus-right #leftPane {
212
+ display: none;
213
+ }
214
+
215
+ body.pane-focus-left #leftPane,
216
+ body.pane-focus-right #rightPane {
217
+ border-color: var(--border);
218
+ }
219
+
220
+ .section-header {
221
+ padding: 10px 12px;
222
+ border-bottom: 1px solid var(--border-muted);
223
+ background: var(--panel-2);
224
+ font-weight: 600;
225
+ font-size: 14px;
226
+ display: flex;
227
+ align-items: center;
228
+ justify-content: space-between;
229
+ gap: 8px;
230
+ flex-wrap: wrap;
231
+ }
232
+
233
+ .section-header-main {
234
+ display: inline-flex;
235
+ align-items: center;
236
+ min-width: 0;
237
+ }
238
+
239
+ .section-header-actions {
240
+ display: inline-flex;
241
+ align-items: center;
242
+ gap: 8px;
243
+ flex-wrap: wrap;
244
+ justify-content: flex-end;
245
+ }
246
+
247
+ .section-header-actions button {
248
+ padding: 6px 9px;
249
+ font-size: 12px;
250
+ border-radius: 7px;
251
+ }
252
+
253
+ .pane-focus-btn.is-active {
254
+ background: var(--accent);
255
+ border-color: var(--accent);
256
+ color: var(--accent-contrast);
257
+ font-weight: 600;
258
+ }
259
+
260
+ button.pane-focus-btn.is-active:not(:disabled):hover {
261
+ background: var(--accent);
262
+ border-color: var(--accent);
263
+ color: var(--accent-contrast);
264
+ filter: brightness(0.95);
265
+ }
266
+
267
+ .section-header select {
268
+ font-weight: 600;
269
+ font-size: 14px;
270
+ border: none;
271
+ border-radius: 4px;
272
+ background: inherit;
273
+ color: inherit;
274
+ cursor: pointer;
275
+ padding: 2px 4px;
276
+ margin: 0;
277
+ -webkit-appearance: menulist;
278
+ appearance: menulist;
279
+ }
280
+
281
+ .source-wrap {
282
+ padding: 10px;
283
+ display: flex;
284
+ flex-direction: column;
285
+ gap: 8px;
286
+ flex: 1 1 auto;
287
+ min-height: 0;
288
+ }
289
+
290
+ .source-meta {
291
+ display: flex;
292
+ align-items: center;
293
+ justify-content: space-between;
294
+ gap: 8px;
295
+ flex-wrap: wrap;
296
+ }
297
+
298
+ .badge-row {
299
+ display: inline-flex;
300
+ align-items: center;
301
+ gap: 6px;
302
+ flex-wrap: wrap;
303
+ }
304
+
305
+ .source-badge {
306
+ border: 1px solid var(--border-muted);
307
+ background: var(--panel);
308
+ border-radius: 999px;
309
+ padding: 4px 10px;
310
+ font-size: 12px;
311
+ color: var(--muted);
312
+ white-space: nowrap;
313
+ }
314
+
315
+ .sync-badge.sync {
316
+ opacity: 0.88;
317
+ }
318
+
319
+ .resource-dir-btn {
320
+ padding: 4px 10px;
321
+ font-size: 12px;
322
+ border-radius: 999px;
323
+ }
324
+
325
+ .resource-dir-label {
326
+ cursor: pointer;
327
+ }
328
+
329
+ .hl-heading {
330
+ color: var(--md-heading);
331
+ font-weight: 700;
332
+ }
333
+
334
+ .hl-fence {
335
+ color: var(--muted);
336
+ }
337
+
338
+ .hl-code {
339
+ color: var(--md-code);
340
+ }
341
+
342
+ .hl-code-kw {
343
+ color: var(--syntax-keyword);
344
+ font-weight: 600;
345
+ }
346
+
347
+ .hl-code-str {
348
+ color: var(--syntax-string);
349
+ }
350
+
351
+ .hl-code-num {
352
+ color: var(--syntax-number);
353
+ }
354
+
355
+ .hl-code-com {
356
+ color: var(--syntax-comment);
357
+ }
358
+
359
+ .hl-code-var,
360
+ .hl-code-key {
361
+ color: var(--syntax-variable);
362
+ }
363
+
364
+ .hl-code-fn {
365
+ color: var(--syntax-function);
366
+ }
367
+
368
+ .hl-code-op {
369
+ color: var(--syntax-operator);
370
+ }
371
+
372
+ .hl-list {
373
+ color: var(--md-list-bullet);
374
+ font-weight: 600;
375
+ }
376
+
377
+ .hl-quote {
378
+ color: var(--md-quote);
379
+ }
380
+
381
+ .hl-link {
382
+ color: var(--md-link);
383
+ text-decoration: underline;
384
+ }
385
+
386
+ .hl-url {
387
+ color: var(--md-link-url);
388
+ }
389
+
390
+ .hl-annotation {
391
+ color: var(--accent);
392
+ background: var(--accent-soft);
393
+ border-radius: 4px;
394
+ box-shadow: inset 0 0 0 1px var(--marker-border);
395
+ }
396
+
397
+ .hl-annotation-muted {
398
+ color: var(--muted);
399
+ opacity: 0.65;
400
+ }
401
+
402
+ .annotation-preview-marker {
403
+ color: var(--accent);
404
+ background: var(--accent-soft);
405
+ border: 1px solid var(--marker-border);
406
+ border-radius: 4px;
407
+ padding: 0 4px;
408
+ }
409
+
410
+ .hl-diff-add {
411
+ color: var(--ok);
412
+ background: rgba(46, 160, 67, 0.12);
413
+ display: inline-block;
414
+ width: 100%;
415
+ }
416
+
417
+ .hl-diff-del {
418
+ color: var(--error);
419
+ background: rgba(248, 81, 73, 0.12);
420
+ display: inline-block;
421
+ width: 100%;
422
+ }
423
+
424
+ .source-actions,
425
+ .response-actions {
426
+ display: flex;
427
+ flex-direction: column;
428
+ gap: 8px;
429
+ align-items: stretch;
430
+ width: 100%;
431
+ }
432
+
433
+ .source-actions-row,
434
+ .response-actions-row {
435
+ display: flex;
436
+ gap: 8px;
437
+ flex-wrap: wrap;
438
+ align-items: center;
439
+ min-width: 0;
440
+ }
441
+
442
+ .response-actions-row.history-row {
443
+ flex-wrap: nowrap;
444
+ overflow-x: auto;
445
+ padding-bottom: 2px;
446
+ scrollbar-width: thin;
447
+ }
448
+
449
+ .response-actions-row.history-row > * {
450
+ flex: 0 0 auto;
451
+ }
452
+
453
+ .editor-highlight-wrap {
454
+ position: relative;
455
+ display: flex;
456
+ flex: 1 1 auto;
457
+ min-height: 0;
458
+ border: 1px solid var(--border-muted);
459
+ border-radius: 8px;
460
+ background: var(--editor-bg);
461
+ overflow: hidden;
462
+ overscroll-behavior: none;
463
+ }
464
+
465
+ .editor-highlight {
466
+ position: absolute;
467
+ inset: 0;
468
+ margin: 0;
469
+ border: 0;
470
+ border-radius: 8px;
471
+ padding: 10px;
472
+ overflow: auto;
473
+ pointer-events: none;
474
+ white-space: pre-wrap;
475
+ word-break: normal;
476
+ overflow-wrap: break-word;
477
+ overscroll-behavior: none;
478
+ font-family: var(--font-mono);
479
+ font-size: 13px;
480
+ line-height: 1.45;
481
+ tab-size: 2;
482
+ color: var(--text);
483
+ background: transparent;
484
+ }
485
+
486
+ textarea {
487
+ width: 100%;
488
+ border: 0;
489
+ border-radius: 0;
490
+ background: transparent;
491
+ color: var(--text);
492
+ padding: 10px;
493
+ font-size: 13px;
494
+ line-height: 1.45;
495
+ tab-size: 2;
496
+ font-family: var(--font-mono);
497
+ resize: none;
498
+ outline: none;
499
+ min-height: 180px;
500
+ flex: 1 1 auto;
501
+ position: relative;
502
+ z-index: 1;
503
+ overscroll-behavior: none;
504
+ }
505
+
506
+ #promptInput.highlight-active {
507
+ color: transparent;
508
+ -webkit-text-fill-color: transparent;
509
+ caret-color: var(--text);
510
+ background: transparent;
511
+ }
512
+
513
+ #promptInput.highlight-active::selection {
514
+ background: var(--accent-soft);
515
+ color: transparent;
516
+ -webkit-text-fill-color: transparent;
517
+ }
518
+
519
+ .reference-meta {
520
+ padding: 8px 10px;
521
+ border-bottom: 1px solid var(--border-muted);
522
+ background: var(--panel-2);
523
+ }
524
+
525
+ .panel-scroll {
526
+ position: relative;
527
+ min-height: 0;
528
+ overflow: auto;
529
+ padding: 12px;
530
+ line-height: 1.52;
531
+ font-size: 14px;
532
+ }
533
+
534
+ #responseView {
535
+ flex: 1 1 auto;
536
+ }
537
+
538
+ .rendered-markdown {
539
+ overflow-wrap: anywhere;
540
+ line-height: 1.58;
541
+ font-size: 15px;
542
+ }
543
+
544
+ .rendered-markdown h1,
545
+ .rendered-markdown h2,
546
+ .rendered-markdown h3,
547
+ .rendered-markdown h4,
548
+ .rendered-markdown h5,
549
+ .rendered-markdown h6 {
550
+ margin-top: 1.2em;
551
+ margin-bottom: 0.5em;
552
+ line-height: 1.25;
553
+ letter-spacing: -0.01em;
554
+ }
555
+
556
+ .rendered-markdown h1 {
557
+ font-size: 1.6em;
558
+ }
559
+
560
+ .rendered-markdown h2 {
561
+ font-size: 1.25em;
562
+ }
563
+
564
+ .rendered-markdown p,
565
+ .rendered-markdown ul,
566
+ .rendered-markdown ol,
567
+ .rendered-markdown blockquote,
568
+ .rendered-markdown table {
569
+ margin-top: 0;
570
+ margin-bottom: 1em;
571
+ }
572
+
573
+ .rendered-markdown li::marker {
574
+ color: var(--accent);
575
+ }
576
+
577
+ .rendered-markdown a {
578
+ color: var(--accent);
579
+ text-decoration: none;
580
+ }
581
+
582
+ .rendered-markdown a:hover {
583
+ text-decoration: underline;
584
+ }
585
+
586
+ .rendered-markdown blockquote {
587
+ margin-left: 0;
588
+ padding: 0.2em 1em;
589
+ border-left: 0.25em solid var(--md-quote-border);
590
+ border-radius: 0 8px 8px 0;
591
+ background: var(--blockquote-bg);
592
+ color: var(--md-quote);
593
+ }
594
+
595
+ .rendered-markdown .callout-note,
596
+ .rendered-markdown .callout-tip,
597
+ .rendered-markdown .callout-warning,
598
+ .rendered-markdown .callout-important,
599
+ .rendered-markdown .callout-caution {
600
+ margin: 1.15em 0;
601
+ padding: 0.8em 1rem 0.95em;
602
+ border: 1px solid var(--border-muted);
603
+ border-left-width: 4px;
604
+ border-radius: 10px;
605
+ background: var(--panel-2);
606
+ color: inherit;
607
+ }
608
+
609
+ .rendered-markdown .callout-note::before,
610
+ .rendered-markdown .callout-tip::before,
611
+ .rendered-markdown .callout-warning::before,
612
+ .rendered-markdown .callout-important::before,
613
+ .rendered-markdown .callout-caution::before {
614
+ display: inline-block;
615
+ margin-bottom: 0.45rem;
616
+ font-size: 0.76em;
617
+ font-weight: 700;
618
+ letter-spacing: 0.08em;
619
+ text-transform: uppercase;
620
+ }
621
+
622
+ .rendered-markdown .callout-note::before {
623
+ content: "Note";
624
+ color: var(--accent);
625
+ }
626
+
627
+ .rendered-markdown .callout-tip::before {
628
+ content: "Tip";
629
+ color: var(--ok);
630
+ }
631
+
632
+ .rendered-markdown .callout-warning::before {
633
+ content: "Warning";
634
+ color: var(--warn);
635
+ }
636
+
637
+ .rendered-markdown .callout-important::before {
638
+ content: "Important";
639
+ color: var(--error);
640
+ }
641
+
642
+ .rendered-markdown .callout-caution::before {
643
+ content: "Caution";
644
+ color: var(--error);
645
+ }
646
+
647
+ .rendered-markdown .callout-note {
648
+ border-left-color: var(--accent);
649
+ }
650
+
651
+ .rendered-markdown .callout-tip {
652
+ border-left-color: var(--ok);
653
+ }
654
+
655
+ .rendered-markdown .callout-warning {
656
+ border-left-color: var(--warn);
657
+ }
658
+
659
+ .rendered-markdown .callout-important,
660
+ .rendered-markdown .callout-caution {
661
+ border-left-color: var(--error);
662
+ }
663
+
664
+ .rendered-markdown .callout-note > :first-child,
665
+ .rendered-markdown .callout-tip > :first-child,
666
+ .rendered-markdown .callout-warning > :first-child,
667
+ .rendered-markdown .callout-important > :first-child,
668
+ .rendered-markdown .callout-caution > :first-child {
669
+ margin-top: 0;
670
+ }
671
+
672
+ .rendered-markdown .callout-note > :last-child,
673
+ .rendered-markdown .callout-tip > :last-child,
674
+ .rendered-markdown .callout-warning > :last-child,
675
+ .rendered-markdown .callout-important > :last-child,
676
+ .rendered-markdown .callout-caution > :last-child {
677
+ margin-bottom: 0;
678
+ }
679
+
680
+ .rendered-markdown pre {
681
+ background: var(--panel-2);
682
+ border: 1px solid var(--md-codeblock-border, var(--border-muted));
683
+ border-radius: 8px;
684
+ padding: 12px 14px;
685
+ overflow: auto;
686
+ margin-top: 0;
687
+ margin-bottom: 1em;
688
+ }
689
+
690
+ .rendered-markdown code {
691
+ font-family: var(--font-mono);
692
+ font-size: 0.9em;
693
+ color: var(--md-code);
694
+ }
695
+
696
+ .rendered-markdown pre code {
697
+ color: var(--md-codeblock, var(--text));
698
+ }
699
+
700
+ .rendered-markdown :not(pre) > code {
701
+ background: rgba(127, 127, 127, 0.13);
702
+ border: 1px solid var(--md-codeblock-border, var(--border-muted));
703
+ border-radius: 6px;
704
+ padding: 0.12em 0.35em;
705
+ }
706
+
707
+ .rendered-markdown code span.kw,
708
+ .rendered-markdown code span.cf,
709
+ .rendered-markdown code span.im {
710
+ color: var(--syntax-keyword);
711
+ font-weight: 600;
712
+ }
713
+
714
+ .rendered-markdown code span.dt {
715
+ color: var(--syntax-type, var(--syntax-function));
716
+ font-weight: 600;
717
+ }
718
+
719
+ .rendered-markdown code span.fu,
720
+ .rendered-markdown code span.bu {
721
+ color: var(--syntax-function);
722
+ }
723
+
724
+ .rendered-markdown code span.va,
725
+ .rendered-markdown code span.ot {
726
+ color: var(--syntax-variable);
727
+ }
728
+
729
+ .rendered-markdown code span.st,
730
+ .rendered-markdown code span.ss,
731
+ .rendered-markdown code span.sc,
732
+ .rendered-markdown code span.ch {
733
+ color: var(--syntax-string);
734
+ }
735
+
736
+ .rendered-markdown code span.dv,
737
+ .rendered-markdown code span.bn,
738
+ .rendered-markdown code span.fl {
739
+ color: var(--syntax-number);
740
+ }
741
+
742
+ .rendered-markdown code span.co {
743
+ color: var(--syntax-comment);
744
+ font-style: italic;
745
+ }
746
+
747
+ .rendered-markdown code span.op {
748
+ color: var(--syntax-operator);
749
+ }
750
+
751
+ .rendered-markdown code span.pp,
752
+ .rendered-markdown code span.pu {
753
+ color: var(--syntax-punctuation, var(--muted));
754
+ }
755
+
756
+ .rendered-markdown code span.er,
757
+ .rendered-markdown code span.al {
758
+ color: var(--error);
759
+ font-weight: 600;
760
+ }
761
+
762
+ .rendered-markdown pre.sourceCode.diff code > span:has(> .va) {
763
+ color: var(--ok);
764
+ background: rgba(46, 160, 67, 0.12);
765
+ }
766
+
767
+ .rendered-markdown pre.sourceCode.diff code > span:has(> .st) {
768
+ color: var(--error);
769
+ background: rgba(248, 81, 73, 0.12);
770
+ }
771
+
772
+ .rendered-markdown pre.sourceCode.diff code > span:has(> .dt) {
773
+ color: var(--syntax-function);
774
+ }
775
+
776
+ .rendered-markdown pre.sourceCode.diff code > span:has(> .kw) {
777
+ color: var(--syntax-keyword);
778
+ }
779
+
780
+ .rendered-markdown pre.sourceCode.diff .va,
781
+ .rendered-markdown pre.sourceCode.diff .st,
782
+ .rendered-markdown pre.sourceCode.diff .dt,
783
+ .rendered-markdown pre.sourceCode.diff .kw {
784
+ color: inherit;
785
+ font-weight: inherit;
786
+ }
787
+
788
+ .rendered-markdown table {
789
+ border-collapse: collapse;
790
+ display: block;
791
+ max-width: 100%;
792
+ overflow: auto;
793
+ }
794
+
795
+ .rendered-markdown th,
796
+ .rendered-markdown td {
797
+ border: 1px solid var(--border-muted);
798
+ padding: 6px 12px;
799
+ }
800
+
801
+ .rendered-markdown thead th {
802
+ background: var(--panel-2);
803
+ }
804
+
805
+ .rendered-markdown tbody tr:nth-child(even) {
806
+ background: var(--table-alt-bg);
807
+ }
808
+
809
+ .rendered-markdown hr {
810
+ border: 0;
811
+ border-top: 1px solid var(--md-hr);
812
+ margin: 1.25em 0;
813
+ }
814
+
815
+ .rendered-markdown .studio-page-break {
816
+ display: flex;
817
+ align-items: center;
818
+ gap: 0.85rem;
819
+ margin: 1.75em 0;
820
+ color: var(--muted);
821
+ font-size: 0.88em;
822
+ text-transform: uppercase;
823
+ letter-spacing: 0.08em;
824
+ }
825
+
826
+ .rendered-markdown .studio-page-break-rule {
827
+ flex: 1 1 auto;
828
+ height: 1px;
829
+ background: var(--border-muted);
830
+ opacity: 0.95;
831
+ }
832
+
833
+ .rendered-markdown .studio-page-break-label {
834
+ flex: 0 0 auto;
835
+ white-space: nowrap;
836
+ }
837
+
838
+ .rendered-markdown img {
839
+ max-width: 100%;
840
+ }
841
+
842
+ .rendered-markdown img[data-fig-align="center"],
843
+ .rendered-markdown embed[data-fig-align="center"],
844
+ .rendered-markdown .studio-pdf-preview[data-fig-align="center"] {
845
+ display: block;
846
+ margin-left: auto;
847
+ margin-right: auto;
848
+ }
849
+
850
+ .rendered-markdown img[data-fig-align="right"],
851
+ .rendered-markdown embed[data-fig-align="right"],
852
+ .rendered-markdown .studio-pdf-preview[data-fig-align="right"] {
853
+ display: block;
854
+ margin-left: auto;
855
+ margin-right: 0;
856
+ }
857
+
858
+ .rendered-markdown embed[type="application/pdf"],
859
+ .rendered-markdown embed[src^="data:application/pdf"],
860
+ .rendered-markdown embed[src$=".pdf"] {
861
+ display: block;
862
+ width: 100%;
863
+ min-height: 18rem;
864
+ border: 1px solid var(--border-muted);
865
+ border-radius: 10px;
866
+ background: #fff;
867
+ overflow: hidden;
868
+ }
869
+
870
+ .rendered-markdown .studio-pdf-preview {
871
+ display: block;
872
+ max-width: 100%;
873
+ border: 1px solid var(--border-muted);
874
+ border-radius: 10px;
875
+ background: #fff;
876
+ overflow: hidden;
877
+ line-height: 0;
878
+ }
879
+
880
+ .rendered-markdown .studio-pdf-preview[data-fig-align="center"] {
881
+ margin-left: auto;
882
+ margin-right: auto;
883
+ }
884
+
885
+ .rendered-markdown .studio-pdf-preview canvas {
886
+ display: block;
887
+ width: 100%;
888
+ height: auto;
889
+ max-width: 100%;
890
+ }
891
+
892
+ .rendered-markdown math {
893
+ font-family: "STIX Two Math", "Cambria Math", "Latin Modern Math", "STIXGeneral", serif;
894
+ }
895
+
896
+ .rendered-markdown mjx-container[display="true"] {
897
+ display: block;
898
+ width: fit-content;
899
+ max-width: 100%;
900
+ margin: 1em auto;
901
+ text-align: center;
902
+ overflow-x: auto;
903
+ overflow-y: hidden;
904
+ }
905
+
906
+ .rendered-markdown math[display="block"] {
907
+ display: block;
908
+ width: fit-content;
909
+ max-width: 100%;
910
+ margin: 1em auto;
911
+ text-align: center;
912
+ overflow-x: auto;
913
+ overflow-y: hidden;
914
+ }
915
+
916
+ .rendered-markdown .studio-mathjax-fallback-display,
917
+ .rendered-markdown .studio-mathjax-fallback-display mjx-container[display="true"] {
918
+ margin-left: auto;
919
+ margin-right: auto;
920
+ }
921
+
922
+ .panel-scroll.preview-pending::after {
923
+ content: "Updating";
924
+ position: absolute;
925
+ top: 10px;
926
+ right: 12px;
927
+ color: var(--muted);
928
+ font-size: 10px;
929
+ line-height: 1.2;
930
+ letter-spacing: 0.01em;
931
+ pointer-events: none;
932
+ opacity: 0.64;
933
+ }
934
+
935
+ .panel-scroll.response-repaint-nudge {
936
+ outline: 1px solid transparent;
937
+ -webkit-transform: translateZ(0);
938
+ transform: translateZ(0);
939
+ }
940
+
941
+ .preview-error {
942
+ color: var(--warn);
943
+ margin-bottom: 0.75em;
944
+ font-size: 12px;
945
+ }
946
+
947
+ .preview-warning {
948
+ color: var(--warn);
949
+ margin-top: 0.75em;
950
+ font-size: 12px;
951
+ font-style: italic;
952
+ }
953
+
954
+ .plain-markdown {
955
+ margin: 0;
956
+ white-space: pre-wrap;
957
+ word-break: break-word;
958
+ font-family: var(--font-mono);
959
+ font-size: 13px;
960
+ line-height: 1.5;
961
+ }
962
+
963
+ .response-markdown-highlight {
964
+ margin: 0;
965
+ white-space: pre-wrap;
966
+ word-break: break-word;
967
+ overflow-wrap: anywhere;
968
+ font-family: var(--font-mono);
969
+ font-size: 13px;
970
+ line-height: 1.5;
971
+ }
972
+
973
+ .response-wrap {
974
+ border-top: 1px solid var(--border-muted);
975
+ padding: 10px;
976
+ display: flex;
977
+ flex-direction: column;
978
+ gap: 8px;
979
+ }
980
+
981
+ .diagnostics-panel {
982
+ margin: 0 12px 12px;
983
+ padding: 12px;
984
+ border: 1px solid var(--border-muted);
985
+ border-radius: 10px;
986
+ background: var(--panel);
987
+ box-shadow: var(--panel-shadow);
988
+ }
989
+
990
+ .diagnostics-panel[hidden] {
991
+ display: none !important;
992
+ }
993
+
994
+ .diagnostics-grid {
995
+ display: grid;
996
+ grid-template-columns: repeat(3, minmax(0, 1fr));
997
+ gap: 12px;
998
+ }
999
+
1000
+ .diagnostic-card {
1001
+ min-height: 0;
1002
+ }
1003
+
1004
+ .diagnostic-wide {
1005
+ grid-column: 1 / -1;
1006
+ }
1007
+
1008
+ .diagnostics-header {
1009
+ padding: 8px 10px;
1010
+ font-size: 13px;
1011
+ }
1012
+
1013
+ .diagnostics-body {
1014
+ min-height: 0;
1015
+ background: var(--panel);
1016
+ }
1017
+
1018
+ .detail-body {
1019
+ display: grid;
1020
+ gap: 10px;
1021
+ }
1022
+
1023
+ .detail-block {
1024
+ border: 1px solid var(--border-muted);
1025
+ background: var(--panel-2);
1026
+ border-radius: 8px;
1027
+ padding: 10px;
1028
+ }
1029
+
1030
+ .detail-block h4 {
1031
+ margin: 0 0 0.5rem 0;
1032
+ font-size: 12px;
1033
+ color: var(--muted);
1034
+ text-transform: uppercase;
1035
+ letter-spacing: 0.03em;
1036
+ }
1037
+
1038
+ .empty-state {
1039
+ color: var(--muted);
1040
+ font-style: italic;
1041
+ }
1042
+
1043
+ .history-list {
1044
+ display: grid;
1045
+ gap: 10px;
1046
+ }
1047
+
1048
+ .history-group {
1049
+ display: grid;
1050
+ gap: 8px;
1051
+ }
1052
+
1053
+ .history-group-header {
1054
+ display: flex;
1055
+ align-items: center;
1056
+ justify-content: space-between;
1057
+ gap: 8px;
1058
+ padding: 8px 10px;
1059
+ border-radius: 8px;
1060
+ background: var(--panel-2);
1061
+ border: 1px solid var(--border-muted);
1062
+ color: var(--muted);
1063
+ font-size: 12px;
1064
+ }
1065
+
1066
+ .history-group-items {
1067
+ display: grid;
1068
+ gap: 8px;
1069
+ }
1070
+
1071
+ .history-item {
1072
+ border: 1px solid var(--border-muted);
1073
+ background: var(--panel-2);
1074
+ border-radius: 8px;
1075
+ padding: 10px;
1076
+ cursor: pointer;
1077
+ }
1078
+
1079
+ .history-item.selected {
1080
+ border-color: var(--border);
1081
+ box-shadow: inset 0 0 0 1px var(--accent-soft-strong);
1082
+ }
1083
+
1084
+ .history-item .row {
1085
+ display: flex;
1086
+ align-items: center;
1087
+ justify-content: space-between;
1088
+ gap: 8px;
1089
+ margin-bottom: 6px;
1090
+ }
1091
+
1092
+ .badges {
1093
+ display: flex;
1094
+ gap: 6px;
1095
+ flex-wrap: wrap;
1096
+ margin-bottom: 6px;
1097
+ }
1098
+
1099
+ .badge {
1100
+ padding: 2px 8px;
1101
+ border-radius: 999px;
1102
+ font-size: 11px;
1103
+ border: 1px solid var(--border-muted);
1104
+ background: rgba(255, 255, 255, 0.03);
1105
+ color: var(--muted);
1106
+ }
1107
+
1108
+ .badge.run {
1109
+ color: var(--text);
1110
+ }
1111
+
1112
+ .badge.steer {
1113
+ color: #e9d5ff;
1114
+ }
1115
+
1116
+ .badge.error {
1117
+ color: var(--error);
1118
+ border-color: rgba(255, 123, 114, 0.4);
1119
+ }
1120
+
1121
+ .snippet,
1122
+ .log-output,
1123
+ .detail-block pre {
1124
+ margin: 0;
1125
+ white-space: pre-wrap;
1126
+ word-break: break-word;
1127
+ font-family: var(--font-mono);
1128
+ font-size: 12px;
1129
+ line-height: 1.45;
1130
+ }
1131
+
1132
+ .meta {
1133
+ color: var(--muted);
1134
+ font-size: 11px;
1135
+ }
1136
+
1137
+ .log-output {
1138
+ min-height: 160px;
1139
+ max-height: 260px;
1140
+ overflow: auto;
1141
+ border: 0;
1142
+ padding: 12px;
1143
+ background: var(--panel);
1144
+ }
1145
+
1146
+ footer {
1147
+ border-top: 1px solid var(--border-muted);
1148
+ padding: 7px 12px;
1149
+ color: var(--muted);
1150
+ font-size: 12px;
1151
+ min-height: 32px;
1152
+ background: var(--panel-2);
1153
+ display: grid;
1154
+ grid-template-columns: minmax(0, 1fr) auto;
1155
+ grid-template-areas:
1156
+ "status status"
1157
+ "meta hint";
1158
+ column-gap: 12px;
1159
+ row-gap: 2px;
1160
+ align-items: start;
1161
+ }
1162
+
1163
+ #statusLine {
1164
+ grid-area: status;
1165
+ display: inline-flex;
1166
+ align-items: center;
1167
+ gap: 0;
1168
+ min-width: 0;
1169
+ justify-self: start;
1170
+ text-align: left;
1171
+ }
1172
+
1173
+ #statusLine.with-spinner {
1174
+ gap: 6px;
1175
+ }
1176
+
1177
+ #statusSpinner {
1178
+ width: 0;
1179
+ max-width: 0;
1180
+ overflow: hidden;
1181
+ opacity: 0;
1182
+ text-align: center;
1183
+ color: var(--accent);
1184
+ font-family: var(--font-mono);
1185
+ flex: 0 0 auto;
1186
+ transition: opacity 120ms ease;
1187
+ }
1188
+
1189
+ #statusLine.with-spinner #statusSpinner {
1190
+ width: 1.1em;
1191
+ max-width: 1.1em;
1192
+ opacity: 1;
1193
+ }
1194
+
1195
+ #status {
1196
+ min-width: 0;
1197
+ white-space: nowrap;
1198
+ overflow: hidden;
1199
+ text-overflow: ellipsis;
1200
+ text-align: left;
1201
+ }
1202
+
1203
+ #status.error {
1204
+ color: var(--error);
1205
+ }
1206
+
1207
+ #status.warning {
1208
+ color: var(--warn);
1209
+ }
1210
+
1211
+ #status.success {
1212
+ color: var(--ok);
1213
+ }
1214
+
1215
+ .footer-meta {
1216
+ grid-area: meta;
1217
+ justify-self: start;
1218
+ color: var(--muted);
1219
+ font-size: 11px;
1220
+ text-align: left;
1221
+ max-width: 100%;
1222
+ display: inline-flex;
1223
+ align-items: center;
1224
+ gap: 8px;
1225
+ min-width: 0;
1226
+ opacity: 0.84;
1227
+ }
1228
+
1229
+ .footer-meta-text {
1230
+ min-width: 0;
1231
+ white-space: nowrap;
1232
+ overflow: hidden;
1233
+ text-overflow: ellipsis;
1234
+ }
1235
+
1236
+ .shortcut-hint {
1237
+ grid-area: hint;
1238
+ justify-self: end;
1239
+ align-self: center;
1240
+ color: var(--muted);
1241
+ font-size: 11px;
1242
+ white-space: nowrap;
1243
+ text-align: right;
1244
+ opacity: 0.72;
1245
+ }
1246
+
1247
+ @media (max-width: 1240px) {
1248
+ .diagnostics-grid {
1249
+ grid-template-columns: 1fr 1fr;
1250
+ }
1251
+ }
1252
+
1253
+ @media (max-width: 1080px) {
1254
+ main {
1255
+ grid-template-columns: 1fr;
1256
+ }
1257
+
1258
+ .diagnostics-grid {
1259
+ grid-template-columns: 1fr;
1260
+ }
1261
+ }
1262
+
1263
+ @media (max-width: 980px) {
1264
+ footer {
1265
+ grid-template-columns: 1fr;
1266
+ grid-template-areas:
1267
+ "status"
1268
+ "meta"
1269
+ "hint";
1270
+ }
1271
+
1272
+ .shortcut-hint {
1273
+ justify-self: start;
1274
+ text-align: left;
1275
+ white-space: normal;
1276
+ }
1277
+ }