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.
- package/LICENSE +21 -0
- package/README.md +155 -0
- package/dist/ai-invalidation.d.ts +29 -0
- package/dist/ai-invalidation.d.ts.map +1 -0
- package/dist/ai-invalidation.js +121 -0
- package/dist/ai-invalidation.js.map +1 -0
- package/dist/contrast.d.ts +87 -0
- package/dist/contrast.d.ts.map +1 -0
- package/dist/contrast.js +151 -0
- package/dist/contrast.js.map +1 -0
- package/dist/directive.d.ts +37 -0
- package/dist/directive.d.ts.map +1 -0
- package/dist/directive.js +87 -0
- package/dist/directive.js.map +1 -0
- package/dist/dom.d.ts +83 -0
- package/dist/dom.d.ts.map +1 -0
- package/dist/dom.js +146 -0
- package/dist/dom.js.map +1 -0
- package/dist/host-actions.d.ts +192 -0
- package/dist/host-actions.d.ts.map +1 -0
- package/dist/host-actions.js +443 -0
- package/dist/host-actions.js.map +1 -0
- package/dist/icons.d.ts +21 -0
- package/dist/icons.d.ts.map +1 -0
- package/dist/icons.js +84 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.d.ts +600 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4833 -0
- package/dist/index.js.map +1 -0
- package/dist/labels.d.ts +187 -0
- package/dist/labels.d.ts.map +1 -0
- package/dist/labels.js +232 -0
- package/dist/labels.js.map +1 -0
- package/dist/limits.d.ts +43 -0
- package/dist/limits.d.ts.map +1 -0
- package/dist/limits.js +48 -0
- package/dist/limits.js.map +1 -0
- package/dist/markdown.d.ts +23 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +0 -0
- package/dist/markdown.js.map +1 -0
- package/dist/message-chrome.d.ts +45 -0
- package/dist/message-chrome.d.ts.map +1 -0
- package/dist/message-chrome.js +101 -0
- package/dist/message-chrome.js.map +1 -0
- package/dist/pane-follow.d.ts +67 -0
- package/dist/pane-follow.d.ts.map +1 -0
- package/dist/pane-follow.js +61 -0
- package/dist/pane-follow.js.map +1 -0
- package/dist/prefix.d.ts +9 -0
- package/dist/prefix.d.ts.map +1 -0
- package/dist/prefix.js +9 -0
- package/dist/prefix.js.map +1 -0
- package/dist/proposal-summary.d.ts +19 -0
- package/dist/proposal-summary.d.ts.map +1 -0
- package/dist/proposal-summary.js +73 -0
- package/dist/proposal-summary.js.map +1 -0
- package/dist/replay.d.ts +125 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +172 -0
- package/dist/replay.js.map +1 -0
- package/dist/safe-url.d.ts +47 -0
- package/dist/safe-url.d.ts.map +1 -0
- package/dist/safe-url.js +80 -0
- package/dist/safe-url.js.map +1 -0
- package/dist/sgiant-ai-widget.global.js +778 -0
- package/dist/sgiant-ai-widget.global.js.map +7 -0
- package/dist/specs.d.ts +173 -0
- package/dist/specs.d.ts.map +1 -0
- package/dist/specs.js +231 -0
- package/dist/specs.js.map +1 -0
- package/dist/storage.d.ts +77 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +124 -0
- package/dist/storage.js.map +1 -0
- package/dist/styles.d.ts +29 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +876 -0
- package/dist/styles.js.map +1 -0
- package/dist/ui-control.d.ts +8 -0
- package/dist/ui-control.d.ts.map +1 -0
- package/dist/ui-control.js +8 -0
- package/dist/ui-control.js.map +1 -0
- package/dist/ui-render.d.ts +75 -0
- package/dist/ui-render.d.ts.map +1 -0
- package/dist/ui-render.js +617 -0
- package/dist/ui-render.js.map +1 -0
- package/dist/ui-spec.d.ts +143 -0
- package/dist/ui-spec.d.ts.map +1 -0
- package/dist/ui-spec.js +288 -0
- package/dist/ui-spec.js.map +1 -0
- 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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"}
|