@guuey/chat 0.4.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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +137 -0
  3. package/dist/history-inputs.d.ts +24 -0
  4. package/dist/history-inputs.d.ts.map +1 -0
  5. package/dist/history-inputs.js +34 -0
  6. package/dist/index.d.ts +19 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +17 -0
  9. package/dist/plan.d.ts +5 -0
  10. package/dist/plan.d.ts.map +1 -0
  11. package/dist/plan.js +629 -0
  12. package/dist/policy.d.ts +110 -0
  13. package/dist/policy.d.ts.map +1 -0
  14. package/dist/policy.js +75 -0
  15. package/dist/react/components.d.ts +87 -0
  16. package/dist/react/components.d.ts.map +1 -0
  17. package/dist/react/components.js +270 -0
  18. package/dist/react/guuey-chat.d.ts +84 -0
  19. package/dist/react/guuey-chat.d.ts.map +1 -0
  20. package/dist/react/guuey-chat.js +103 -0
  21. package/dist/react/markdown.d.ts +32 -0
  22. package/dist/react/markdown.d.ts.map +1 -0
  23. package/dist/react/markdown.js +40 -0
  24. package/dist/react/theme-css.d.ts +16 -0
  25. package/dist/react/theme-css.d.ts.map +1 -0
  26. package/dist/react/theme-css.js +37 -0
  27. package/dist/react/transcript.d.ts +42 -0
  28. package/dist/react/transcript.d.ts.map +1 -0
  29. package/dist/react/transcript.js +88 -0
  30. package/dist/react/use-transcript.d.ts +39 -0
  31. package/dist/react/use-transcript.d.ts.map +1 -0
  32. package/dist/react/use-transcript.js +201 -0
  33. package/dist/react.d.ts +21 -0
  34. package/dist/react.d.ts.map +1 -0
  35. package/dist/react.js +20 -0
  36. package/dist/strings.d.ts +74 -0
  37. package/dist/strings.d.ts.map +1 -0
  38. package/dist/strings.js +45 -0
  39. package/dist/theme.d.ts +99 -0
  40. package/dist/theme.d.ts.map +1 -0
  41. package/dist/theme.js +182 -0
  42. package/dist/types.d.ts +283 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +1 -0
  45. package/package.json +87 -0
  46. package/src/corpus/README.md +40 -0
  47. package/src/corpus/__snapshots__/corpus.test.ts.snap +1590 -0
  48. package/src/corpus/capture.ts +67 -0
  49. package/src/corpus/captures/issue2627-render-capture.coalesced.sse.txt +173 -0
  50. package/src/corpus/drive.ts +184 -0
  51. package/src/corpus/fixtures.ts +338 -0
  52. package/src/history-inputs.ts +48 -0
  53. package/src/index.ts +58 -0
  54. package/src/plan.ts +740 -0
  55. package/src/policy.ts +146 -0
  56. package/src/react/components.tsx +655 -0
  57. package/src/react/guuey-chat.tsx +227 -0
  58. package/src/react/markdown.tsx +114 -0
  59. package/src/react/theme-css.ts +50 -0
  60. package/src/react/transcript.tsx +187 -0
  61. package/src/react/use-transcript.ts +274 -0
  62. package/src/react.tsx +51 -0
  63. package/src/strings.ts +144 -0
  64. package/src/theme.ts +195 -0
  65. package/src/types.ts +320 -0
  66. package/styles.css +514 -0
package/styles.css ADDED
@@ -0,0 +1,514 @@
1
+ /**
2
+ * @guuey/chat — the default stylesheet (wave 3b, guuey#135).
3
+ *
4
+ * One import: `import "@guuey/chat/styles.css"`. Every color/shape value
5
+ * comes from the `--guuey-chat-*` custom properties `<Transcript>` sets
6
+ * from the resolved `GuueyChatTheme` — restyle by theming (the schema is
7
+ * platform data), or replace this sheet entirely (the class names are the
8
+ * stable surface).
9
+ *
10
+ * Shimmer/pulse are CSS-only and disabled under prefers-reduced-motion
11
+ * (spec §3.2).
12
+ */
13
+
14
+ .guuey-chat {
15
+ position: relative;
16
+ display: flex;
17
+ flex-direction: column;
18
+ height: 100%;
19
+ min-height: 0;
20
+ background: var(--guuey-chat-canvas);
21
+ color: var(--guuey-chat-ink);
22
+ font-family: var(--guuey-chat-font, system-ui, -apple-system, sans-serif);
23
+ font-size: calc(15px * var(--guuey-chat-scale, 1));
24
+ line-height: 1.45;
25
+ }
26
+
27
+ .guuey-chat-scroller {
28
+ flex: 1;
29
+ min-height: 0;
30
+ overflow-y: auto;
31
+ overscroll-behavior: contain;
32
+ }
33
+
34
+ .guuey-chat-column {
35
+ display: flex;
36
+ flex-direction: column;
37
+ gap: var(--guuey-chat-gap);
38
+ padding: calc(var(--guuey-chat-gap) * 1.5);
39
+ max-width: 48rem;
40
+ margin-inline: auto;
41
+ }
42
+
43
+ /* ── R0 user ── */
44
+ .guuey-chat-user {
45
+ align-self: flex-end;
46
+ max-width: 85%;
47
+ }
48
+ .guuey-chat-user-bubble {
49
+ background: var(--guuey-chat-accent);
50
+ color: var(--guuey-chat-on-accent);
51
+ border-radius: var(--guuey-chat-radius);
52
+ border-end-end-radius: 4px;
53
+ padding: 8px 12px;
54
+ white-space: pre-wrap;
55
+ overflow-wrap: anywhere;
56
+ }
57
+ .guuey-chat-user-sending .guuey-chat-user-bubble {
58
+ opacity: 0.6;
59
+ }
60
+ .guuey-chat-send-failed {
61
+ margin: 4px 0 0;
62
+ font-size: 0.85em;
63
+ color: var(--guuey-chat-error);
64
+ text-align: end;
65
+ }
66
+ .guuey-chat-retry {
67
+ margin-inline-start: 8px;
68
+ border: 1px solid var(--guuey-chat-error);
69
+ background: none;
70
+ color: var(--guuey-chat-error);
71
+ border-radius: 6px;
72
+ padding: 1px 8px;
73
+ cursor: pointer;
74
+ font: inherit;
75
+ font-size: inherit;
76
+ }
77
+
78
+ /* ── R1 assistant text ── */
79
+ .guuey-chat-text {
80
+ align-self: flex-start;
81
+ max-width: 92%;
82
+ background: var(--guuey-chat-surface);
83
+ border: 1px solid color-mix(in srgb, var(--guuey-chat-ink) 8%, transparent);
84
+ border-radius: var(--guuey-chat-radius);
85
+ border-end-start-radius: 4px;
86
+ padding: 8px 12px;
87
+ overflow-wrap: anywhere;
88
+ }
89
+ .guuey-chat-text p {
90
+ margin: 0;
91
+ }
92
+ .guuey-chat-text p + p,
93
+ .guuey-chat-text pre + p,
94
+ .guuey-chat-text p + pre,
95
+ .guuey-chat-text ul + p,
96
+ .guuey-chat-text p + ul,
97
+ .guuey-chat-text p + ol {
98
+ margin-top: 8px;
99
+ }
100
+ .guuey-chat-heading {
101
+ font-weight: 600;
102
+ }
103
+ .guuey-chat-heading-major {
104
+ font-size: 1.1em;
105
+ }
106
+ .guuey-chat-inline-code,
107
+ .guuey-chat-code-fence {
108
+ font-family: var(--guuey-chat-mono-font, ui-monospace, monospace);
109
+ font-size: 0.88em;
110
+ background: color-mix(in srgb, var(--guuey-chat-ink) 7%, transparent);
111
+ border-radius: 5px;
112
+ }
113
+ .guuey-chat-inline-code {
114
+ padding: 0 4px;
115
+ }
116
+ .guuey-chat-code-fence {
117
+ padding: 8px 10px;
118
+ overflow-x: auto;
119
+ }
120
+ .guuey-chat-verbatim {
121
+ white-space: pre-wrap;
122
+ margin: 0;
123
+ }
124
+ .guuey-chat-cursor {
125
+ color: var(--guuey-chat-accent);
126
+ }
127
+ .guuey-chat-stopped {
128
+ margin: 6px 0 0;
129
+ font-size: 0.85em;
130
+ color: var(--guuey-chat-ink-muted);
131
+ }
132
+
133
+ /* ── Toggles (R2/R3/R4/R9/R15 headers) ── */
134
+ .guuey-chat-toggle {
135
+ display: inline-flex;
136
+ align-items: center;
137
+ gap: 6px;
138
+ border: 0;
139
+ background: none;
140
+ color: var(--guuey-chat-ink-muted);
141
+ font: inherit;
142
+ font-size: 0.9em;
143
+ padding: 2px 4px;
144
+ border-radius: 6px;
145
+ cursor: pointer;
146
+ }
147
+ .guuey-chat-toggle:hover {
148
+ background: color-mix(in srgb, var(--guuey-chat-ink) 6%, transparent);
149
+ }
150
+ .guuey-chat-toggle:focus-visible {
151
+ outline: 2px solid var(--guuey-chat-accent);
152
+ outline-offset: 1px;
153
+ }
154
+ .guuey-chat-body {
155
+ margin-top: 4px;
156
+ padding-inline-start: 14px;
157
+ }
158
+
159
+ /* ── R3 tools ── */
160
+ .guuey-chat-tool-line {
161
+ display: inline-flex;
162
+ align-items: center;
163
+ gap: 6px;
164
+ }
165
+ .guuey-chat-tool-running .guuey-chat-tool-glyph {
166
+ display: inline-block;
167
+ animation: guuey-chat-spin 1s linear infinite;
168
+ }
169
+ .guuey-chat-tool-failed {
170
+ color: var(--guuey-chat-error);
171
+ }
172
+ .guuey-chat-tool-note {
173
+ color: var(--guuey-chat-ink-muted);
174
+ font-size: 0.85em;
175
+ }
176
+ .guuey-chat-tool-args,
177
+ .guuey-chat-data-preview {
178
+ font-family: var(--guuey-chat-mono-font, ui-monospace, monospace);
179
+ font-size: 0.82em;
180
+ background: color-mix(in srgb, var(--guuey-chat-ink) 5%, transparent);
181
+ border-radius: 6px;
182
+ padding: 6px 8px;
183
+ margin: 4px 0;
184
+ max-height: var(--guuey-chat-data-cap, 16rem);
185
+ overflow: auto;
186
+ }
187
+
188
+ /* ── R4 group ── */
189
+ .guuey-chat-failure-badge {
190
+ margin-inline-start: 8px;
191
+ color: var(--guuey-chat-error);
192
+ font-size: 0.85em;
193
+ }
194
+
195
+ /* ── R5 data ── */
196
+ .guuey-chat-data-meta {
197
+ display: flex;
198
+ gap: 8px;
199
+ align-items: center;
200
+ color: var(--guuey-chat-ink-muted);
201
+ font-size: 0.8em;
202
+ }
203
+ .guuey-chat-data-empty,
204
+ .guuey-chat-data-binary {
205
+ color: var(--guuey-chat-ink-muted);
206
+ font-size: 0.85em;
207
+ margin: 2px 0;
208
+ }
209
+ .guuey-chat-copy {
210
+ border: 0;
211
+ background: none;
212
+ color: var(--guuey-chat-ink-muted);
213
+ font: inherit;
214
+ font-size: 0.9em;
215
+ cursor: pointer;
216
+ text-decoration: underline;
217
+ }
218
+
219
+ /* ── R6 views ── */
220
+ .guuey-chat-view {
221
+ border: 1px solid color-mix(in srgb, var(--guuey-chat-ink) 8%, transparent);
222
+ border-radius: var(--guuey-chat-radius);
223
+ overflow: hidden;
224
+ background: var(--guuey-chat-surface);
225
+ min-height: 3rem;
226
+ }
227
+ .guuey-chat-view iframe {
228
+ min-height: 16rem;
229
+ }
230
+ .guuey-chat-view-negotiating p,
231
+ .guuey-chat-view-expired p {
232
+ margin: 0;
233
+ padding: 12px;
234
+ color: var(--guuey-chat-ink-muted);
235
+ font-size: 0.9em;
236
+ }
237
+ .guuey-chat-attribution {
238
+ margin: 0;
239
+ padding: 4px 12px;
240
+ color: var(--guuey-chat-ink-muted);
241
+ font-size: 0.78em;
242
+ border-top: 1px solid color-mix(in srgb, var(--guuey-chat-ink) 6%, transparent);
243
+ }
244
+
245
+ /* ── R7 media ── */
246
+ .guuey-chat-media-image img {
247
+ max-width: 100%;
248
+ max-height: var(--guuey-chat-image-cap, 20rem);
249
+ border-radius: var(--guuey-chat-radius);
250
+ display: block;
251
+ }
252
+ .guuey-chat-media-chip {
253
+ display: inline-block;
254
+ border: 1px solid color-mix(in srgb, var(--guuey-chat-ink) 12%, transparent);
255
+ border-radius: 999px;
256
+ padding: 2px 10px;
257
+ font-size: 0.85em;
258
+ color: var(--guuey-chat-ink-muted);
259
+ }
260
+
261
+ /* ── R8 code ── */
262
+ .guuey-chat-code pre {
263
+ font-family: var(--guuey-chat-mono-font, ui-monospace, monospace);
264
+ font-size: 0.85em;
265
+ background: color-mix(in srgb, var(--guuey-chat-ink) 6%, transparent);
266
+ border-radius: var(--guuey-chat-radius);
267
+ padding: 10px 12px;
268
+ margin: 0;
269
+ max-height: var(--guuey-chat-code-cap, 16rem);
270
+ overflow: auto;
271
+ }
272
+ .guuey-chat-code-wrap {
273
+ white-space: pre-wrap;
274
+ }
275
+ .guuey-chat-code-meta {
276
+ display: flex;
277
+ justify-content: space-between;
278
+ color: var(--guuey-chat-ink-muted);
279
+ font-size: 0.8em;
280
+ padding: 2px 4px;
281
+ }
282
+
283
+ /* ── R9 citations ── */
284
+ .guuey-chat-citations ul {
285
+ margin: 4px 0 0;
286
+ padding-inline-start: 18px;
287
+ }
288
+ .guuey-chat-citations-chips li {
289
+ display: inline-block;
290
+ margin-inline-end: 10px;
291
+ }
292
+
293
+ /* ── R10 prompts ── */
294
+ .guuey-chat-prompt {
295
+ border: 1px solid var(--guuey-chat-accent);
296
+ border-radius: var(--guuey-chat-radius);
297
+ background: var(--guuey-chat-surface);
298
+ padding: 12px;
299
+ }
300
+ .guuey-chat-prompt-ask {
301
+ margin: 0 0 8px;
302
+ }
303
+ .guuey-chat-prompt-actions {
304
+ display: flex;
305
+ gap: 8px;
306
+ }
307
+ .guuey-chat-prompt-actions button {
308
+ font: inherit;
309
+ border-radius: 8px;
310
+ padding: 4px 14px;
311
+ cursor: pointer;
312
+ border: 1px solid color-mix(in srgb, var(--guuey-chat-ink) 15%, transparent);
313
+ background: var(--guuey-chat-surface);
314
+ color: var(--guuey-chat-ink);
315
+ }
316
+ .guuey-chat-prompt-accept {
317
+ background: var(--guuey-chat-accent) !important;
318
+ color: var(--guuey-chat-on-accent) !important;
319
+ border-color: transparent !important;
320
+ }
321
+ .guuey-chat-prompt-actions button:focus-visible {
322
+ outline: 2px solid var(--guuey-chat-accent);
323
+ outline-offset: 1px;
324
+ }
325
+ .guuey-chat-prompt-record {
326
+ color: var(--guuey-chat-ink-muted);
327
+ font-size: 0.85em;
328
+ margin: 0;
329
+ }
330
+
331
+ /* ── R11 errors ── */
332
+ .guuey-chat-error {
333
+ border: 1px solid color-mix(in srgb, var(--guuey-chat-error) 45%, transparent);
334
+ border-radius: var(--guuey-chat-radius);
335
+ background: color-mix(in srgb, var(--guuey-chat-error) 7%, var(--guuey-chat-surface));
336
+ padding: 10px 12px;
337
+ }
338
+ .guuey-chat-error p {
339
+ margin: 0;
340
+ }
341
+ .guuey-chat-error-action {
342
+ margin-top: 6px;
343
+ font: inherit;
344
+ border: 1px solid var(--guuey-chat-error);
345
+ color: var(--guuey-chat-error);
346
+ background: none;
347
+ border-radius: 8px;
348
+ padding: 2px 10px;
349
+ cursor: pointer;
350
+ }
351
+ .guuey-chat-error-verbatim {
352
+ margin: 8px 0 0;
353
+ font-family: var(--guuey-chat-mono-font, ui-monospace, monospace);
354
+ font-size: 0.8em;
355
+ color: var(--guuey-chat-ink-muted);
356
+ white-space: pre-wrap;
357
+ }
358
+
359
+ /* ── R12 status ── */
360
+ .guuey-chat-status {
361
+ margin: 0;
362
+ color: var(--guuey-chat-ink-muted);
363
+ font-size: 0.9em;
364
+ }
365
+ .guuey-chat-status-detail {
366
+ font-family: var(--guuey-chat-mono-font, ui-monospace, monospace);
367
+ font-size: 0.85em;
368
+ }
369
+
370
+ /* ── R13/R14/R15 ── */
371
+ .guuey-chat-history {
372
+ color: var(--guuey-chat-ink-muted);
373
+ text-align: center;
374
+ font-size: 0.9em;
375
+ padding: 8px;
376
+ }
377
+ .guuey-chat-compaction {
378
+ color: var(--guuey-chat-ink-muted);
379
+ font-size: 0.8em;
380
+ text-align: center;
381
+ border-top: 1px solid color-mix(in srgb, var(--guuey-chat-ink) 8%, transparent);
382
+ padding-top: 6px;
383
+ margin-top: 4px;
384
+ }
385
+ .guuey-chat-unknown-type,
386
+ .guuey-chat-unknown-size {
387
+ color: var(--guuey-chat-ink-muted);
388
+ font-size: 0.85em;
389
+ }
390
+ .guuey-chat-unknown-raw {
391
+ font-family: var(--guuey-chat-mono-font, ui-monospace, monospace);
392
+ font-size: 0.8em;
393
+ max-height: 16rem;
394
+ overflow: auto;
395
+ }
396
+
397
+ /* ── Chrome ── */
398
+ .guuey-chat-show-earlier {
399
+ align-self: center;
400
+ font: inherit;
401
+ font-size: 0.85em;
402
+ border: 1px solid color-mix(in srgb, var(--guuey-chat-ink) 12%, transparent);
403
+ background: var(--guuey-chat-surface);
404
+ color: var(--guuey-chat-ink-muted);
405
+ border-radius: 999px;
406
+ padding: 3px 14px;
407
+ cursor: pointer;
408
+ }
409
+ .guuey-chat-jump {
410
+ position: absolute;
411
+ inset-inline-end: 16px;
412
+ inset-block-end: 16px;
413
+ font: inherit;
414
+ font-size: 0.85em;
415
+ border: 0;
416
+ background: var(--guuey-chat-ink);
417
+ color: var(--guuey-chat-canvas);
418
+ border-radius: 999px;
419
+ padding: 6px 14px;
420
+ cursor: pointer;
421
+ box-shadow: 0 2px 8px rgb(0 0 0 / 0.25);
422
+ }
423
+ .guuey-chat-jump:focus-visible,
424
+ .guuey-chat-show-earlier:focus-visible,
425
+ .guuey-chat-copy:focus-visible,
426
+ .guuey-chat-retry:focus-visible {
427
+ outline: 2px solid var(--guuey-chat-accent);
428
+ outline-offset: 1px;
429
+ }
430
+
431
+ /* ── Motion (disabled under prefers-reduced-motion, §3.2) ── */
432
+ @keyframes guuey-chat-spin {
433
+ to {
434
+ transform: rotate(360deg);
435
+ }
436
+ }
437
+ @keyframes guuey-chat-pulse {
438
+ 50% {
439
+ opacity: 0.55;
440
+ }
441
+ }
442
+ .guuey-chat-pulse {
443
+ animation: guuey-chat-pulse 1.6s ease-in-out infinite;
444
+ }
445
+ .guuey-chat-shimmer {
446
+ animation: guuey-chat-pulse 1.2s ease-in-out infinite;
447
+ }
448
+ @media (prefers-reduced-motion: reduce) {
449
+ .guuey-chat-pulse,
450
+ .guuey-chat-shimmer,
451
+ .guuey-chat-tool-running .guuey-chat-tool-glyph {
452
+ animation: none;
453
+ }
454
+ }
455
+
456
+ /* ── The 3c surface: <GuueyChat> = transcript + composer ─────────────── */
457
+ .guuey-chat-surface {
458
+ display: flex;
459
+ flex-direction: column;
460
+ height: 100%;
461
+ min-height: 0;
462
+ }
463
+ .guuey-chat-surface .guuey-chat {
464
+ flex: 1;
465
+ min-height: 0;
466
+ }
467
+ .guuey-chat-composer {
468
+ display: flex;
469
+ align-items: flex-end;
470
+ gap: 8px;
471
+ padding: 8px 12px;
472
+ background: var(--guuey-chat-canvas);
473
+ border-top: 1px solid var(--guuey-chat-canvas-muted);
474
+ }
475
+ .guuey-chat-composer-input {
476
+ flex: 1;
477
+ resize: none;
478
+ max-height: 9rem;
479
+ overflow-y: auto;
480
+ padding: 10px 14px;
481
+ border: 1px solid var(--guuey-chat-canvas-muted);
482
+ border-radius: var(--guuey-chat-radius);
483
+ background: var(--guuey-chat-surface);
484
+ color: var(--guuey-chat-ink);
485
+ font: inherit;
486
+ }
487
+ .guuey-chat-composer-input:focus {
488
+ outline: none;
489
+ border-color: var(--guuey-chat-accent);
490
+ }
491
+ .guuey-chat-composer-input:disabled {
492
+ opacity: 0.5;
493
+ }
494
+ .guuey-chat-composer-send,
495
+ .guuey-chat-composer-stop {
496
+ flex-shrink: 0;
497
+ padding: 10px 16px;
498
+ border: 0;
499
+ border-radius: var(--guuey-chat-radius);
500
+ font: inherit;
501
+ cursor: pointer;
502
+ }
503
+ .guuey-chat-composer-send {
504
+ background: var(--guuey-chat-accent);
505
+ color: var(--guuey-chat-on-accent);
506
+ }
507
+ .guuey-chat-composer-send:disabled {
508
+ cursor: not-allowed;
509
+ opacity: 0.4;
510
+ }
511
+ .guuey-chat-composer-stop {
512
+ background: var(--guuey-chat-canvas-muted);
513
+ color: var(--guuey-chat-ink);
514
+ }