sgiant-ai-widget 1.0.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 (93) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +155 -0
  3. package/dist/ai-invalidation.d.ts +29 -0
  4. package/dist/ai-invalidation.d.ts.map +1 -0
  5. package/dist/ai-invalidation.js +121 -0
  6. package/dist/ai-invalidation.js.map +1 -0
  7. package/dist/contrast.d.ts +87 -0
  8. package/dist/contrast.d.ts.map +1 -0
  9. package/dist/contrast.js +151 -0
  10. package/dist/contrast.js.map +1 -0
  11. package/dist/directive.d.ts +37 -0
  12. package/dist/directive.d.ts.map +1 -0
  13. package/dist/directive.js +87 -0
  14. package/dist/directive.js.map +1 -0
  15. package/dist/dom.d.ts +83 -0
  16. package/dist/dom.d.ts.map +1 -0
  17. package/dist/dom.js +146 -0
  18. package/dist/dom.js.map +1 -0
  19. package/dist/host-actions.d.ts +192 -0
  20. package/dist/host-actions.d.ts.map +1 -0
  21. package/dist/host-actions.js +443 -0
  22. package/dist/host-actions.js.map +1 -0
  23. package/dist/icons.d.ts +21 -0
  24. package/dist/icons.d.ts.map +1 -0
  25. package/dist/icons.js +84 -0
  26. package/dist/icons.js.map +1 -0
  27. package/dist/index.d.ts +600 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +4833 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/labels.d.ts +187 -0
  32. package/dist/labels.d.ts.map +1 -0
  33. package/dist/labels.js +232 -0
  34. package/dist/labels.js.map +1 -0
  35. package/dist/limits.d.ts +43 -0
  36. package/dist/limits.d.ts.map +1 -0
  37. package/dist/limits.js +48 -0
  38. package/dist/limits.js.map +1 -0
  39. package/dist/markdown.d.ts +23 -0
  40. package/dist/markdown.d.ts.map +1 -0
  41. package/dist/markdown.js +0 -0
  42. package/dist/markdown.js.map +1 -0
  43. package/dist/message-chrome.d.ts +45 -0
  44. package/dist/message-chrome.d.ts.map +1 -0
  45. package/dist/message-chrome.js +101 -0
  46. package/dist/message-chrome.js.map +1 -0
  47. package/dist/pane-follow.d.ts +67 -0
  48. package/dist/pane-follow.d.ts.map +1 -0
  49. package/dist/pane-follow.js +61 -0
  50. package/dist/pane-follow.js.map +1 -0
  51. package/dist/prefix.d.ts +9 -0
  52. package/dist/prefix.d.ts.map +1 -0
  53. package/dist/prefix.js +9 -0
  54. package/dist/prefix.js.map +1 -0
  55. package/dist/proposal-summary.d.ts +19 -0
  56. package/dist/proposal-summary.d.ts.map +1 -0
  57. package/dist/proposal-summary.js +73 -0
  58. package/dist/proposal-summary.js.map +1 -0
  59. package/dist/replay.d.ts +125 -0
  60. package/dist/replay.d.ts.map +1 -0
  61. package/dist/replay.js +172 -0
  62. package/dist/replay.js.map +1 -0
  63. package/dist/safe-url.d.ts +47 -0
  64. package/dist/safe-url.d.ts.map +1 -0
  65. package/dist/safe-url.js +80 -0
  66. package/dist/safe-url.js.map +1 -0
  67. package/dist/sgiant-ai-widget.global.js +778 -0
  68. package/dist/sgiant-ai-widget.global.js.map +7 -0
  69. package/dist/specs.d.ts +173 -0
  70. package/dist/specs.d.ts.map +1 -0
  71. package/dist/specs.js +231 -0
  72. package/dist/specs.js.map +1 -0
  73. package/dist/storage.d.ts +77 -0
  74. package/dist/storage.d.ts.map +1 -0
  75. package/dist/storage.js +124 -0
  76. package/dist/storage.js.map +1 -0
  77. package/dist/styles.d.ts +29 -0
  78. package/dist/styles.d.ts.map +1 -0
  79. package/dist/styles.js +876 -0
  80. package/dist/styles.js.map +1 -0
  81. package/dist/ui-control.d.ts +8 -0
  82. package/dist/ui-control.d.ts.map +1 -0
  83. package/dist/ui-control.js +8 -0
  84. package/dist/ui-control.js.map +1 -0
  85. package/dist/ui-render.d.ts +75 -0
  86. package/dist/ui-render.d.ts.map +1 -0
  87. package/dist/ui-render.js +617 -0
  88. package/dist/ui-render.js.map +1 -0
  89. package/dist/ui-spec.d.ts +143 -0
  90. package/dist/ui-spec.d.ts.map +1 -0
  91. package/dist/ui-spec.js +288 -0
  92. package/dist/ui-spec.js.map +1 -0
  93. package/package.json +61 -0
@@ -0,0 +1,617 @@
1
+ import { el, wrapPreviewHtml } from "./dom.js";
2
+ import { PREFIX } from "./prefix.js";
3
+ import { UI_SAY_ACTION, normalizeUiSpec, uiSpecMediaIds, } from "./ui-spec.js";
4
+ export function createUiRenderers(ctx) {
5
+ const { L, log, scrollDown, send, richDisposers, dispatchAction, subscribeJob, showPaneWidget, input, opts, } = ctx;
6
+ /** Render an inline data widget (stat / kpis / list / table) in the log. */
7
+ function renderWidget(spec) {
8
+ const card = el("div", `${PREFIX}-widget`);
9
+ if (spec.title) {
10
+ const t = el("div", `${PREFIX}-widget-title`);
11
+ t.textContent = spec.title;
12
+ card.appendChild(t);
13
+ }
14
+ const kind = spec.kind ?? (spec.rows ? "table" : spec.items ? "kpis" : "list");
15
+ if (kind === "stat") {
16
+ const v = el("div", `${PREFIX}-widget-stat`);
17
+ v.textContent = String(spec.value ?? "");
18
+ card.appendChild(v);
19
+ if (spec.caption) {
20
+ const c = el("div", `${PREFIX}-widget-cap`);
21
+ c.textContent = spec.caption;
22
+ card.appendChild(c);
23
+ }
24
+ if (spec.delta) {
25
+ const d = el("div", `${PREFIX}-widget-delta`);
26
+ d.textContent = spec.delta;
27
+ card.appendChild(d);
28
+ }
29
+ }
30
+ else if (kind === "kpis") {
31
+ const grid = el("div", `${PREFIX}-widget-kpis`);
32
+ for (const it of (spec.items ?? []).slice(0, 8)) {
33
+ const tile = el("div", `${PREFIX}-kpi`);
34
+ const kv = el("div", `${PREFIX}-kpi-v`);
35
+ kv.textContent = String(it.value ?? "");
36
+ const kl = el("div", `${PREFIX}-kpi-l`);
37
+ kl.textContent = it.label ?? "";
38
+ tile.append(kv, kl);
39
+ if (it.delta) {
40
+ const kd = el("div", `${PREFIX}-kpi-d`);
41
+ kd.textContent = it.delta;
42
+ tile.appendChild(kd);
43
+ }
44
+ grid.appendChild(tile);
45
+ }
46
+ card.appendChild(grid);
47
+ }
48
+ else if (kind === "table" && spec.rows) {
49
+ const table = document.createElement("table");
50
+ table.className = `${PREFIX}-widget-table`;
51
+ if (spec.columns?.length) {
52
+ const thead = table.createTHead().insertRow();
53
+ for (const c of spec.columns) {
54
+ const th = document.createElement("th");
55
+ th.textContent = String(c);
56
+ thead.appendChild(th);
57
+ }
58
+ }
59
+ const tbody = table.createTBody();
60
+ for (const row of spec.rows.slice(0, 30)) {
61
+ const tr = tbody.insertRow();
62
+ for (const cell of row)
63
+ tr.insertCell().textContent = String(cell);
64
+ }
65
+ card.appendChild(table);
66
+ }
67
+ else {
68
+ const ul = el("ul", `${PREFIX}-widget-list`);
69
+ for (const line of (spec.lines ?? []).slice(0, 30)) {
70
+ const li = document.createElement("li");
71
+ li.textContent = line;
72
+ ul.appendChild(li);
73
+ }
74
+ card.appendChild(ul);
75
+ }
76
+ log.appendChild(card);
77
+ scrollDown(true);
78
+ }
79
+ // ── Composed UI cards — `[[ui:{…}]]` ────────────────────────────────────────
80
+ //
81
+ // The assistant composes a card out of primitives this widget knows how to
82
+ // draw (see ui-spec.ts for the vocabulary and why it is a vocabulary rather
83
+ // than markup). Nothing here knows what a storyboard is, or a shortlist, or a
84
+ // room-type picker: it draws tiles with media, a state and buttons, and the
85
+ // buttons go to the host by name through the SAME `dispatchAction` an
86
+ // `[[action:…]]` uses — so a composed card can never do anything the host
87
+ // doesn't already allow.
88
+ /** The label for a tile's state: ours to translate for the four we know,
89
+ * the model's own words for anything else. */
90
+ function uiStatusLabel(status) {
91
+ if (status === "pending")
92
+ return L("uiStatusPending");
93
+ if (status === "running")
94
+ return L("uiStatusRunning");
95
+ if (status === "ready")
96
+ return L("uiStatusReady");
97
+ if (status === "failed")
98
+ return L("uiStatusFailed");
99
+ return status;
100
+ }
101
+ /** One button on a card or tile. */
102
+ function buildUiAction(a, itemId) {
103
+ const wrap = el("span", `${PREFIX}-ui-act`);
104
+ const variant = a.variant === "primary"
105
+ ? ` ${PREFIX}-ui-btn-primary`
106
+ : a.variant === "danger"
107
+ ? ` ${PREFIX}-ui-btn-danger`
108
+ : "";
109
+ const btn = el("button", `${PREFIX}-ui-btn${variant}`);
110
+ btn.type = "button";
111
+ const label = a.label || a.name;
112
+ btn.textContent = label;
113
+ // The tile's own id rides along, so a handler knows WHICH tile was acted on
114
+ // without the model having to repeat it inside every button's data.
115
+ const data = { ...(a.data ?? {}), ...(itemId ? { itemId } : {}) };
116
+ const run = async () => {
117
+ btn.disabled = true;
118
+ // `say` is answered here, not by the host: it puts its text into the
119
+ // conversation as an ordinary user message (exactly as a chip does), so
120
+ // the assistant's own tools carry it out and the transcript records the
121
+ // click as the sentence it stood for.
122
+ if (a.name === UI_SAY_ACTION) {
123
+ void send((a.data?.text || label).trim());
124
+ return;
125
+ }
126
+ try {
127
+ const msg = await dispatchAction(a.name, data);
128
+ btn.textContent =
129
+ (typeof msg === "string" && msg) || L("actionDone", { label });
130
+ }
131
+ catch {
132
+ btn.disabled = false;
133
+ btn.textContent = `${label} — ${L("tryAgain")}`;
134
+ }
135
+ };
136
+ btn.addEventListener("click", () => {
137
+ if (!a.confirm) {
138
+ void run();
139
+ return;
140
+ }
141
+ // The confirm replaces THIS BUTTON, not the card. A single [[action:…]]
142
+ // card can take itself over to ask, because it is the only thing there;
143
+ // a composed card holds many actions, and hiding a whole storyboard
144
+ // behind one question would lose the very thing being confirmed.
145
+ wrap.textContent = "";
146
+ const q = el("span", `${PREFIX}-ui-confirm-q`);
147
+ q.textContent = a.confirm;
148
+ const yes = el("button", `${PREFIX}-ui-btn`);
149
+ yes.type = "button";
150
+ yes.textContent = L("confirm");
151
+ const no = el("button", `${PREFIX}-ui-btn-ghost`);
152
+ no.type = "button";
153
+ no.textContent = L("cancel");
154
+ const restore = () => {
155
+ wrap.textContent = "";
156
+ wrap.appendChild(btn);
157
+ };
158
+ yes.addEventListener("click", () => {
159
+ restore();
160
+ void run();
161
+ });
162
+ no.addEventListener("click", restore);
163
+ wrap.append(q, yes, no);
164
+ });
165
+ wrap.appendChild(btn);
166
+ return wrap;
167
+ }
168
+ /** One tile. The media box is drawn EMPTY-BUT-SIZED and filled in later, so
169
+ * the card doesn't reflow (and scroll out from under a reading user) when
170
+ * the pictures land. */
171
+ /** The badge class for a status — the known four are coloured, anything the
172
+ * model invented gets the neutral one. */
173
+ function uiBadgeClass(status) {
174
+ const known = status === "pending" ||
175
+ status === "running" ||
176
+ status === "ready" ||
177
+ status === "failed";
178
+ return `${PREFIX}-ui-badge ${PREFIX}-ui-badge-${known ? status : "other"}`;
179
+ }
180
+ /**
181
+ * A job's coarse lifecycle as the tile vocabulary's own status.
182
+ *
183
+ * `cancelled` deliberately lands on `failed` rather than on its own badge:
184
+ * from the tile's point of view — "is there a clip here?" — a cancelled
185
+ * render and a failed one are the same answer, and the card-level job view
186
+ * is where the difference is spelled out.
187
+ */
188
+ function uiStatusForJob(status) {
189
+ if (status === "done")
190
+ return "ready";
191
+ if (status === "failed" || status === "cancelled")
192
+ return "failed";
193
+ if (status === "queued")
194
+ return "pending";
195
+ return "running";
196
+ }
197
+ /**
198
+ * Repaint one tile from a job poll — the thing that stops a composed card
199
+ * being a snapshot of the moment it was written.
200
+ *
201
+ * Only ever ADDS what it learns: media it did not have, and a status it can
202
+ * now state. It never clears a media id the model already gave, because a
203
+ * tile can legitimately show a reference still while the render it names is
204
+ * still running.
205
+ */
206
+ function paintUiTileLive(tile, view) {
207
+ const box = tile.querySelector(`.${PREFIX}-ui-media`);
208
+ if (!box)
209
+ return;
210
+ const badge = tile.querySelector(`.${PREFIX}-ui-badge`);
211
+ if (badge) {
212
+ const s = uiStatusForJob(view.status);
213
+ badge.className = uiBadgeClass(s);
214
+ badge.textContent = uiStatusLabel(s);
215
+ }
216
+ const produced = view.resultMediaId;
217
+ if (!produced || box.dataset.mid === produced)
218
+ return;
219
+ box.dataset.mid = produced;
220
+ // The clip has landed, so the box stops being a placeholder — one more
221
+ // batched resolve, scoped to this tile, and `fillUiMedia` does the rest
222
+ // (it queries `.…-ui-media` inside whatever element it is handed).
223
+ void fillUiMedia([produced], tile);
224
+ }
225
+ function buildUiTile(it) {
226
+ const tile = el("div", `${PREFIX}-ui-tile`);
227
+ const box = el("div", `${PREFIX}-ui-media`);
228
+ if (it.mediaId) {
229
+ box.dataset.mid = it.mediaId;
230
+ if (it.posterMediaId)
231
+ box.dataset.poster = it.posterMediaId;
232
+ if (it.media)
233
+ box.dataset.kind = it.media;
234
+ }
235
+ const ph = el("span", `${PREFIX}-ui-media-ph`);
236
+ ph.textContent = it.mediaId ? "" : L("uiMediaPending");
237
+ box.appendChild(ph);
238
+ // A tile watching a job always gets a badge, even when the model named no
239
+ // status: the badge is where the job's progress is going to be written, and
240
+ // one added later would make the tile jump as it filled in.
241
+ const initialStatus = it.status ?? (it.jobId ? "running" : undefined);
242
+ if (initialStatus) {
243
+ const badge = el("span", uiBadgeClass(initialStatus));
244
+ badge.textContent = uiStatusLabel(initialStatus);
245
+ box.appendChild(badge);
246
+ }
247
+ tile.appendChild(box);
248
+ if (it.jobId) {
249
+ subscribeJob({ kind: "job", id: it.jobId }, tile, (view) => paintUiTileLive(tile, view));
250
+ }
251
+ if (it.title) {
252
+ const t = el("div", `${PREFIX}-ui-tile-title`);
253
+ t.textContent = it.title;
254
+ tile.appendChild(t);
255
+ }
256
+ if (it.caption) {
257
+ const c = el("div", `${PREFIX}-ui-tile-cap`);
258
+ c.textContent = it.caption;
259
+ tile.appendChild(c);
260
+ }
261
+ if (it.actions?.length) {
262
+ const row = el("div", `${PREFIX}-ui-tile-actions`);
263
+ for (const a of it.actions)
264
+ row.appendChild(buildUiAction(a, it.id));
265
+ tile.appendChild(row);
266
+ }
267
+ return tile;
268
+ }
269
+ /** Does this URL point at something to PLAY rather than show? The id alone
270
+ * can't say, so the model's own `media` hint wins and the extension is the
271
+ * fallback — a clip drawn as an <img> is a broken tile, which is worse than
272
+ * a still drawn in a <video> (that still shows the frame). */
273
+ function looksLikeVideo(url) {
274
+ return /\.(mp4|webm|mov|m4v)(\?|#|$)/i.test(url);
275
+ }
276
+ /** Resolve a card's media ids and paint them in. One batched call for the
277
+ * whole card — a request per tile would be a burst of round-trips for what
278
+ * is conceptually one picture set. */
279
+ async function fillUiMedia(ids, card) {
280
+ let urls = {};
281
+ if (ids.length && opts.resolveMediaUrls) {
282
+ try {
283
+ urls = (await opts.resolveMediaUrls(ids)) ?? {};
284
+ }
285
+ catch {
286
+ urls = {}; // every tile then says "Unavailable" — never a blank box
287
+ }
288
+ }
289
+ const boxes = card.querySelectorAll(`.${PREFIX}-ui-media`);
290
+ for (const box of Array.from(boxes)) {
291
+ const mid = box.dataset.mid;
292
+ if (!mid)
293
+ continue;
294
+ const url = urls[mid];
295
+ const ph = box.querySelector(`.${PREFIX}-ui-media-ph`);
296
+ if (!url) {
297
+ if (ph)
298
+ ph.textContent = L("uiMediaMissing");
299
+ continue;
300
+ }
301
+ // AUDIO must be declared, never guessed: our URLs are signed and carry no
302
+ // extension, so an mp3 left to inference is drawn as an <img> and reads as
303
+ // a broken tile.
304
+ const kind = box.dataset.kind
305
+ ? box.dataset.kind
306
+ : looksLikeVideo(url)
307
+ ? "video"
308
+ : "image";
309
+ const isVideo = kind === "video";
310
+ const isAudio = kind === "audio";
311
+ const node = el(isAudio ? "audio" : isVideo ? "video" : "img", `${PREFIX}-ui-media-el`);
312
+ node.src = url;
313
+ if (isVideo || isAudio) {
314
+ node.controls = true;
315
+ node.preload = "metadata";
316
+ if (isVideo) {
317
+ node.playsInline = true;
318
+ const poster = box.dataset.poster ? urls[box.dataset.poster] : "";
319
+ if (poster)
320
+ node.poster = poster;
321
+ }
322
+ }
323
+ else {
324
+ node.loading = "lazy";
325
+ node.alt = "";
326
+ }
327
+ // A media id that resolves to a URL the browser then refuses (expired
328
+ // signature, deleted object) must still read as a state, not a blank.
329
+ node.addEventListener("error", () => {
330
+ node.remove();
331
+ const p = el("span", `${PREFIX}-ui-media-ph`);
332
+ p.textContent = L("uiMediaMissing");
333
+ box.appendChild(p);
334
+ });
335
+ ph?.remove();
336
+ box.insertBefore(node, box.firstChild);
337
+ }
338
+ }
339
+ /**
340
+ * Wrap a tile row in paging: one visible at a time, arrows and dots overlaid.
341
+ *
342
+ * Overlaid rather than stacked beneath — controls that are flex siblings
343
+ * steal height from the media, so a square tile renders visibly smaller
344
+ * than the space it was given and reads as a lesser thing than it is.
345
+ */
346
+ function buildUiCarousel(items, count) {
347
+ const wrap = el("div", `${PREFIX}-ui-carousel`);
348
+ const stage = el("div", `${PREFIX}-ui-carousel-stage`);
349
+ stage.appendChild(items);
350
+ wrap.appendChild(stage);
351
+ let index = 0;
352
+ const dots = [];
353
+ const paint = () => {
354
+ items.style.transform = `translateX(-${index * 100}%)`;
355
+ dots.forEach((d, i) => d.classList.toggle(`${PREFIX}-ui-dot-on`, i === index));
356
+ counter.textContent = `${index + 1}/${count}`;
357
+ };
358
+ const go = (delta) => {
359
+ index = (index + delta + count) % count;
360
+ paint();
361
+ };
362
+ const arrow = (side) => {
363
+ const b = el("button", `${PREFIX}-ui-arrow ${PREFIX}-ui-arrow-${side}`);
364
+ b.type = "button";
365
+ b.setAttribute("aria-label", side === "left" ? L("prev") : L("next"));
366
+ b.textContent = side === "left" ? "‹" : "›";
367
+ b.addEventListener("click", (e) => {
368
+ // The card sits inside a scrollable log and may sit inside other
369
+ // clickable chrome; paging must never reach either.
370
+ e.preventDefault();
371
+ e.stopPropagation();
372
+ go(side === "left" ? -1 : 1);
373
+ });
374
+ return b;
375
+ };
376
+ stage.append(arrow("left"), arrow("right"));
377
+ const counter = el("span", `${PREFIX}-ui-counter`);
378
+ stage.appendChild(counter);
379
+ const dotRow = el("div", `${PREFIX}-ui-dots`);
380
+ for (let i = 0; i < count; i++) {
381
+ const d = el("button", `${PREFIX}-ui-dot`);
382
+ d.type = "button";
383
+ d.setAttribute("aria-label", `${i + 1}`);
384
+ d.addEventListener("click", (e) => {
385
+ e.preventDefault();
386
+ e.stopPropagation();
387
+ index = i;
388
+ paint();
389
+ });
390
+ dots.push(d);
391
+ dotRow.appendChild(d);
392
+ }
393
+ stage.appendChild(dotRow);
394
+ paint();
395
+ return wrap;
396
+ }
397
+ /** Draw a composed UI card in the log. */
398
+ function renderUiCard(raw) {
399
+ const spec = normalizeUiSpec(raw);
400
+ if (!spec)
401
+ return; // nothing worth drawing — the reply's text stands alone
402
+ const card = el("div", `${PREFIX}-ui`);
403
+ if (spec.title) {
404
+ const t = el("div", `${PREFIX}-ui-title`);
405
+ t.textContent = spec.title;
406
+ card.appendChild(t);
407
+ }
408
+ if (spec.caption) {
409
+ const c = el("div", `${PREFIX}-ui-cap`);
410
+ c.textContent = spec.caption;
411
+ card.appendChild(c);
412
+ }
413
+ if (spec.items.length) {
414
+ const items = el("div", `${PREFIX}-ui-items ${PREFIX}-ui-${spec.layout} ${PREFIX}-ui-a-${spec.aspect}`);
415
+ for (const it of spec.items)
416
+ items.appendChild(buildUiTile(it));
417
+ // A CAROUSEL shows one item at a time, because the client is judging each
418
+ // one rather than scanning a set: six thumbnails in a row invites
419
+ // approving what was never really looked at. Paging is added around the
420
+ // same tiles, so nothing about how a tile is built changes.
421
+ if (spec.layout === "carousel" && spec.items.length > 1) {
422
+ card.appendChild(buildUiCarousel(items, spec.items.length));
423
+ }
424
+ else {
425
+ card.appendChild(items);
426
+ }
427
+ }
428
+ if (spec.actions.length) {
429
+ const row = el("div", `${PREFIX}-ui-actions`);
430
+ for (const a of spec.actions)
431
+ row.appendChild(buildUiAction(a));
432
+ card.appendChild(row);
433
+ }
434
+ log.appendChild(card);
435
+ scrollDown(true);
436
+ void fillUiMedia(uiSpecMediaIds(spec), card);
437
+ }
438
+ /** Map an analytics render_chart frame (spec + StatsQueryRow[]) to an inline
439
+ * widget. kpi → a stat; everything else → a table of the returned rows. */
440
+ function renderServerWidget(spec, rows, comparisonRows) {
441
+ // ADVANCED VIEW: the big surface is the right place for a chart.
442
+ //
443
+ // A computed widget used to land in the 368px chat column while half the
444
+ // screen next to it showed a page nobody was reading. Same principle as
445
+ // the report narration collapsing when the pane shows the run: whichever
446
+ // surface can render it properly gets it, and the chat says where it went
447
+ // rather than drawing a second, smaller copy.
448
+ //
449
+ // Falls through to the log when the pane cannot take it (no host renderer,
450
+ // or the renderer threw), so a failure here costs nothing.
451
+ if (showPaneWidget(spec, rows, comparisonRows)) {
452
+ const note = el("div", `${PREFIX}-job-mirrored`);
453
+ note.textContent = L("jobWatchingInPane");
454
+ log.appendChild(note);
455
+ scrollDown(true);
456
+ return;
457
+ }
458
+ // In-app: hand the frame to the host's REAL dashboard renderer (charts).
459
+ if (opts.renderDataWidget) {
460
+ const host = el("div", `${PREFIX}-widget ${PREFIX}-widget-host`);
461
+ log.appendChild(host);
462
+ const dispose = opts.renderDataWidget(host, spec, rows, comparisonRows);
463
+ if (dispose)
464
+ richDisposers.push(dispose);
465
+ scrollDown(true);
466
+ return;
467
+ }
468
+ // Embedder-supplied chart fallback (no React host) — real charts in a
469
+ // standalone embed via whatever lightweight lib the embedder plugs in.
470
+ if (opts.renderChartFallback) {
471
+ const host = el("div", `${PREFIX}-widget ${PREFIX}-widget-host`);
472
+ log.appendChild(host);
473
+ try {
474
+ const dispose = opts.renderChartFallback(host, spec, rows, comparisonRows);
475
+ if (dispose)
476
+ richDisposers.push(dispose);
477
+ scrollDown(true);
478
+ return;
479
+ }
480
+ catch {
481
+ host.remove(); // fall through to the built-in degrade
482
+ }
483
+ }
484
+ // External embed: lightweight fallback (kpi → stat, else a table).
485
+ const title = spec?.title;
486
+ const data = Array.isArray(rows)
487
+ ? rows
488
+ : [];
489
+ if (spec?.chartType === "kpi" && data[0]) {
490
+ const first = data[0];
491
+ const keys = Object.keys(first);
492
+ const valueKey = keys[keys.length - 1];
493
+ renderWidget({
494
+ kind: "stat",
495
+ title,
496
+ value: String(first[valueKey] ?? ""),
497
+ caption: valueKey,
498
+ });
499
+ return;
500
+ }
501
+ if (!data.length) {
502
+ renderWidget({ kind: "list", title, lines: ["(no data)"] });
503
+ return;
504
+ }
505
+ const columns = Object.keys(data[0]);
506
+ const tableRows = data
507
+ .slice(0, 30)
508
+ .map((r) => columns.map((c) => (r[c] == null ? "" : String(r[c]))));
509
+ renderWidget({ kind: "table", title, columns, rows: tableRows });
510
+ }
511
+ function renderChips(spec) {
512
+ const options = (Array.isArray(spec.options) ? spec.options : [])
513
+ .map((o) => String(o).trim())
514
+ .filter(Boolean)
515
+ .slice(0, 8);
516
+ if (!options.length)
517
+ return;
518
+ const multi = spec.multi === true;
519
+ const wrap = el("div", `${PREFIX}-chips`);
520
+ const chosen = new Set();
521
+ let answered = false;
522
+ const answer = (text) => {
523
+ if (answered || !text.trim())
524
+ return;
525
+ answered = true;
526
+ wrap
527
+ .querySelectorAll("button")
528
+ .forEach((b) => (b.disabled = true));
529
+ void send(text.trim());
530
+ };
531
+ for (const opt of options) {
532
+ const b = el("button", `${PREFIX}-chip`);
533
+ b.type = "button";
534
+ b.textContent = opt;
535
+ b.addEventListener("click", () => {
536
+ if (answered)
537
+ return;
538
+ if (!multi) {
539
+ answer(opt);
540
+ return;
541
+ }
542
+ if (chosen.has(opt)) {
543
+ chosen.delete(opt);
544
+ b.classList.remove(`${PREFIX}-chip-on`);
545
+ }
546
+ else {
547
+ chosen.add(opt);
548
+ b.classList.add(`${PREFIX}-chip-on`);
549
+ }
550
+ });
551
+ wrap.appendChild(b);
552
+ }
553
+ // "Other" — let the user type a free answer instead of picking.
554
+ if (spec.other !== false) {
555
+ const other = el("button", `${PREFIX}-chip ${PREFIX}-chip-other`);
556
+ other.type = "button";
557
+ other.textContent = L("otherOption");
558
+ other.addEventListener("click", () => input.focus());
559
+ wrap.appendChild(other);
560
+ }
561
+ // Multi-select needs an explicit Send (collect the toggled options).
562
+ if (multi) {
563
+ const go = el("button", `${PREFIX}-chip ${PREFIX}-chip-send`);
564
+ go.type = "button";
565
+ go.textContent = L("send");
566
+ go.addEventListener("click", () => {
567
+ const picks = options.filter((o) => chosen.has(o));
568
+ if (picks.length)
569
+ answer(picks.join(", "));
570
+ });
571
+ wrap.appendChild(go);
572
+ }
573
+ log.appendChild(wrap);
574
+ scrollDown(true);
575
+ }
576
+ /** Render an AI-authored HTML preview in a sandboxed iframe. Scripts stay
577
+ * OFF (static HTML, can't execute), but allow-same-origin is granted so the
578
+ * parent page's blob: URLs (resolved private media) can paint — an
579
+ * opaque-origin frame refuses them and every resolved image breaks. */
580
+ function renderPreview(spec) {
581
+ const wrap = el("div", `${PREFIX}-preview`);
582
+ const bar = el("div", `${PREFIX}-preview-bar`);
583
+ const dots = el("span", `${PREFIX}-preview-dots`);
584
+ dots.innerHTML = `<i></i><i></i><i></i>`;
585
+ const title = el("span", `${PREFIX}-preview-title`);
586
+ title.textContent = spec.title || L("preview");
587
+ bar.append(dots, title);
588
+ const frame = el("iframe", `${PREFIX}-preview-frame`);
589
+ frame.setAttribute("sandbox", "allow-same-origin");
590
+ frame.setAttribute("title", spec.title || L("preview"));
591
+ frame.srcdoc = wrapPreviewHtml(spec.html);
592
+ wrap.append(bar, frame);
593
+ log.appendChild(wrap);
594
+ scrollDown(true);
595
+ }
596
+ // Default confirm copy for a state-changing UI action the model didn't caption.
597
+ function operateConfirmText(spec) {
598
+ const target = spec.data?.target ?? "this control";
599
+ if (spec.name === "fill") {
600
+ const v = spec.data?.value ?? "";
601
+ const short = v.length > 40 ? `${v.slice(0, 40)}…` : v;
602
+ return short
603
+ ? `Type “${short}” into ${target}?`
604
+ : `Fill ${target} for you?`;
605
+ }
606
+ return `Click ${target} for you?`;
607
+ }
608
+ return {
609
+ renderWidget,
610
+ renderUiCard,
611
+ renderServerWidget,
612
+ renderChips,
613
+ renderPreview,
614
+ operateConfirmText,
615
+ };
616
+ }
617
+ //# sourceMappingURL=ui-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-render.js","sourceRoot":"","sources":["../src/ui-render.ts"],"names":[],"mappings":"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"}