@engenty/wizards-runtime 0.7.8 → 0.7.9

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 (89) hide show
  1. package/apps/runtime/dist/clients.js +118 -0
  2. package/apps/runtime/dist/db/client.js +37 -3
  3. package/apps/runtime/dist/db/migrations/tenant/0017_run_client.sql +1 -0
  4. package/apps/runtime/dist/db/migrations/tenant/meta/0017_snapshot.json +3333 -0
  5. package/apps/runtime/dist/db/migrations/tenant/meta/_journal.json +7 -0
  6. package/apps/runtime/dist/db/schema.js +2 -0
  7. package/apps/runtime/dist/docs/dev/api.md +39 -0
  8. package/apps/runtime/dist/docs/dev/index.md +1 -0
  9. package/apps/runtime/dist/docs/dev/integration/openui.md +5 -3
  10. package/apps/runtime/dist/docs/dev/meta.json +1 -1
  11. package/apps/runtime/dist/docs/user/ai-apps.md +14 -3
  12. package/apps/runtime/dist/engine/runner.js +1 -0
  13. package/apps/runtime/dist/index.js +13 -4
  14. package/apps/runtime/dist/plugin.js +24 -8
  15. package/apps/runtime/dist/routes/runs.js +9 -0
  16. package/apps/web/dist/assets/AboutDialog-CShc0mRo.js +1 -0
  17. package/apps/web/dist/assets/ChangelogDialog-C4dVSwtN.js +1 -0
  18. package/apps/web/dist/assets/ChatView-KkOboyOo.js +10 -0
  19. package/apps/web/dist/assets/EditorPage-lQ3YgsFT.js +4 -0
  20. package/apps/web/dist/assets/{FlowPreview-Dx8AjXvE.js → FlowPreview-oX_Emm7u.js} +1 -1
  21. package/apps/web/dist/assets/{Harness-NvIb36TG.js → Harness-D6mgLWTb.js} +2 -2
  22. package/apps/web/dist/assets/{NewWizardChannels-B2YgtJlt.js → NewWizardChannels-CPlh_37J.js} +1 -1
  23. package/apps/web/dist/assets/NewWizardPage-D0FVJtXK.js +7 -0
  24. package/apps/web/dist/assets/OnboardingPage-BXPOMrQR.js +1 -0
  25. package/apps/web/dist/assets/ProjectPage-DroTprqs.js +1 -0
  26. package/apps/web/dist/assets/PublicRunner-j3qoKjQQ.js +1 -0
  27. package/apps/web/dist/assets/{ReadOnly-CGNHlgUT.js → ReadOnly-CKgSQ2z1.js} +1 -1
  28. package/apps/web/dist/assets/RunDrawer-CJZ_ISAd.js +4 -0
  29. package/apps/web/dist/assets/RunnerView-BW1h4x63.js +1 -0
  30. package/apps/web/dist/assets/SettingsPage-BHZ0Z-og.js +1 -0
  31. package/apps/web/dist/assets/SetupPage-CDkYkjJX.js +1 -0
  32. package/apps/web/dist/assets/{SharePage-hG7Z6SLy.js → SharePage-BlVjVjHG.js} +1 -1
  33. package/apps/web/dist/assets/changelog-Be0i5Jjw.js +1 -0
  34. package/apps/web/dist/assets/engenty-WpMi3xwq.js +1 -0
  35. package/apps/web/dist/assets/{esm-DVk3RJij.js → esm-C-ZWeuhU.js} +1 -1
  36. package/apps/web/dist/assets/{fluffy-engenty-ClRou7yu.js → fluffy-engenty-DPNHytrz.js} +135 -16
  37. package/apps/web/dist/assets/goose-helmet-Cvc7KjUg.bin +0 -0
  38. package/apps/web/dist/assets/goose-helmet-livery-CZD9u0XS.webp +0 -0
  39. package/apps/web/dist/assets/index-C4aHMcg9.css +1 -0
  40. package/apps/web/dist/assets/index-C61HAltK.js +14 -0
  41. package/apps/web/dist/assets/oss-credits-qGhcbqiM.js +1 -0
  42. package/apps/web/dist/assets/{phone-CXXHXYnA.js → phone-BjmhIKuT.js} +1 -1
  43. package/apps/web/dist/assets/{settings-menu-DXzZCIMx.js → settings-menu-Dpkp3f56.js} +1 -1
  44. package/apps/web/dist/assets/{ui-DQ4L2npj.js → ui-DMmT-cSO.js} +4 -4
  45. package/apps/web/dist/assets/{upload-BnYHIfu5.js → upload-JX9BcMTq.js} +1 -1
  46. package/apps/web/dist/assets/{wrench-BrUJ7SV6.js → wrench-BSxnPs2_.js} +1 -1
  47. package/apps/web/dist/index.html +4 -4
  48. package/apps/web/dist/mcp/flow.html +141 -22
  49. package/node_modules/@engenty/wizards/package.json +1 -4
  50. package/node_modules/@engenty-wizards/shared/dist/claude-plugin.d.ts +7 -0
  51. package/node_modules/@engenty-wizards/shared/dist/claude-plugin.js +10 -0
  52. package/node_modules/@engenty-wizards/shared/dist/run.d.ts +2 -0
  53. package/node_modules/@engenty-wizards/shared/dist/run.js +4 -0
  54. package/package.json +1 -1
  55. package/plugin/.claude-plugin/plugin.json +28 -6
  56. package/plugin/README.md +58 -0
  57. package/plugin/hooks/engenty.ts +140 -0
  58. package/plugin/hooks/hooks.json +1 -0
  59. package/plugin/hooks/pane.test.tsx +177 -0
  60. package/plugin/hooks/register.tsx +396 -0
  61. package/plugin/types/index.d.ts +44 -0
  62. package/apps/web/dist/assets/AboutDialog-ByZyHXDj.js +0 -1
  63. package/apps/web/dist/assets/ChangelogDialog-QHYP0jAv.js +0 -1
  64. package/apps/web/dist/assets/ChatView-DupTtI8K.js +0 -10
  65. package/apps/web/dist/assets/EditorPage-k6qouLeS.js +0 -4
  66. package/apps/web/dist/assets/NewWizardPage-BgLY6SL6.js +0 -7
  67. package/apps/web/dist/assets/OnboardingPage-CxhwefJU.js +0 -1
  68. package/apps/web/dist/assets/ProjectPage-6ceSSS7W.js +0 -1
  69. package/apps/web/dist/assets/PublicRunner-6lQvReDx.js +0 -1
  70. package/apps/web/dist/assets/RunDrawer-TVGNnWyx.js +0 -4
  71. package/apps/web/dist/assets/RunnerView-DInSK0VZ.js +0 -1
  72. package/apps/web/dist/assets/SettingsPage-D3k5pXN5.js +0 -1
  73. package/apps/web/dist/assets/SetupPage-Bj5frdzY.js +0 -1
  74. package/apps/web/dist/assets/changelog-CO9vKjV0.js +0 -1
  75. package/apps/web/dist/assets/engenty-eXZ-EAwd.js +0 -1
  76. package/apps/web/dist/assets/index-DfaoPjNW.css +0 -1
  77. package/apps/web/dist/assets/index-DlDsr9Lc.js +0 -14
  78. package/apps/web/dist/assets/oss-credits-X2JPiMOR.js +0 -1
  79. package/node_modules/@engenty/wizards/dist/openui/Wizard.d.ts +0 -20
  80. package/node_modules/@engenty/wizards/dist/openui/Wizard.js +0 -62
  81. package/node_modules/@engenty/wizards/dist/openui/index.d.ts +0 -9
  82. package/node_modules/@engenty/wizards/dist/openui/index.js +0 -9
  83. package/node_modules/@engenty/wizards/dist/openui/message.d.ts +0 -11
  84. package/node_modules/@engenty/wizards/dist/openui/message.js +0 -69
  85. package/node_modules/@engenty/wizards/dist/openui/run.d.ts +0 -8
  86. package/node_modules/@engenty/wizards/dist/openui/run.js +0 -137
  87. package/node_modules/@engenty/wizards/dist/openui/server.d.ts +0 -37
  88. package/node_modules/@engenty/wizards/dist/openui/server.js +0 -77
  89. package/plugin/.mcp.json +0 -8
@@ -0,0 +1,396 @@
1
+ import type { EngineInterface, Register, RenderSurface } from "claude-code";
2
+ import { atom, read, update } from "claude-code";
3
+
4
+ import type { RunView, WizardDetails, WizardRow } from "../types";
5
+ import { engentyColor, engentySvg } from "./engenty";
6
+
7
+ const PANE = "wizards";
8
+
9
+ const wizards = atom({ plugin: "wizards", key: "wizards" } as const, []);
10
+ const details = atom({ plugin: "wizards", key: "details" } as const, {}, { shape: "v2" });
11
+ const message = atom({ plugin: "wizards", key: "message" } as const, null);
12
+ const shown = atom({ plugin: "wizards", key: "shown" } as const, null);
13
+ const runtime = atom({ plugin: "wizards", key: "runtime" } as const, null);
14
+ const fallback = atom({ plugin: "wizards", key: "fallback" } as const, null);
15
+
16
+ /** The runtime's MCP tools whose answer is a run report: a run the model drives. */
17
+ const RUN_TOOLS = new Set([
18
+ "run_wizard",
19
+ "get_run",
20
+ "answer_page",
21
+ "answer_ask",
22
+ "review_step",
23
+ "control_run",
24
+ ]);
25
+
26
+ type Called = { ok: true; body: unknown } | { ok: false; error: string };
27
+
28
+ /** What the hooks need beyond `$`: the two MCP servers the pane talks to. */
29
+ type Servers = { server: string; browser: string };
30
+
31
+ /** This plugin's name in its manifest: a server bundled with it is listed under it. */
32
+ const PLUGIN = "wizards";
33
+
34
+ /** A server's spelling inside a tool name: anything but letters, digits, `_` and `-` becomes `_`. */
35
+ const slug = (name: string) => name.replace(/[^A-Za-z0-9_-]/g, "_");
36
+
37
+ /** The tool-name prefixes under which the runtime's tools may appear. */
38
+ const prefixesOf = (server: string) => [
39
+ `mcp__${slug(server)}__`,
40
+ `mcp__plugin_${PLUGIN}_${slug(server)}__`,
41
+ ];
42
+
43
+ const isRecord = (v: unknown): v is Record<string, unknown> =>
44
+ typeof v === "object" && v !== null && !Array.isArray(v);
45
+
46
+ const parse = (text: string): unknown => {
47
+ try {
48
+ return JSON.parse(text);
49
+ } catch {
50
+ return text;
51
+ }
52
+ };
53
+
54
+ /** The text of a tool result, whatever shape the engine hands it in. */
55
+ const textOf = (result: unknown): string | undefined => {
56
+ if (typeof result === "string") return result;
57
+ const blocks = Array.isArray(result)
58
+ ? result
59
+ : isRecord(result) && Array.isArray(result.content)
60
+ ? result.content
61
+ : [];
62
+ const block = blocks.find((b) => isRecord(b) && b.type === "text" && typeof b.text === "string");
63
+ return isRecord(block) ? String(block.text) : undefined;
64
+ };
65
+
66
+ const isReport = (v: unknown): v is RunView =>
67
+ isRecord(v) && typeof v.runId === "string" && typeof v.status === "string";
68
+
69
+ const isOver = (r: RunView) =>
70
+ r.status === "done" || r.status === "failed" || r.status === "cancelled";
71
+
72
+ const originOf = (url: string | null | undefined): string | undefined => {
73
+ if (!url) return undefined;
74
+ try {
75
+ return new URL(url).origin;
76
+ } catch {
77
+ return undefined;
78
+ }
79
+ };
80
+
81
+ /** What get_wizard answers, kept to what the pane draws. */
82
+ const detailsOf = (body: unknown): WizardDetails | undefined => {
83
+ if (!isRecord(body) || !isRecord(body.draft)) return undefined;
84
+ const d = body.draft;
85
+ const steps = Array.isArray(d.steps) ? d.steps.filter(isRecord) : [];
86
+ const shareUrl =
87
+ typeof body.shareUrl === "string" && body.shareEnabled !== false ? body.shareUrl : undefined;
88
+ return {
89
+ title: typeof d.title === "string" && d.title ? d.title : String(body.wizardId ?? ""),
90
+ ...(typeof d.description === "string" && d.description ? { description: d.description } : {}),
91
+ ...(typeof d.avatar === "string" ? { avatar: d.avatar } : {}),
92
+ ...(shareUrl ? { shareUrl } : {}),
93
+ steps: steps.map((s) => ({
94
+ id: String(s.id),
95
+ type: typeof s.type === "string" ? s.type : "step",
96
+ title: typeof s.title === "string" && s.title ? s.title : String(s.id),
97
+ })),
98
+ };
99
+ };
100
+
101
+ async function call(
102
+ $: EngineInterface,
103
+ server: string,
104
+ tool: string,
105
+ args: Record<string, unknown>,
106
+ isRetry = false,
107
+ ): Promise<Called> {
108
+ try {
109
+ const result = await $.mcp.call(server, tool, args);
110
+ const text = result.content.find((b) => b.type === "text")?.text ?? "";
111
+ const body = parse(text);
112
+ if (result.isError) {
113
+ const reason = isRecord(body) && typeof body.message === "string" ? body.message : text;
114
+ return { ok: false, error: reason || `${tool} failed.` };
115
+ }
116
+ return { ok: true, body };
117
+ } catch (err) {
118
+ const error = err instanceof Error ? err.message : String(err);
119
+ // The auto-mode classifier's "no verdict" asks for one more try, as-is.
120
+ if (!isRetry && /no verdict/i.test(error)) return call($, server, tool, args, true);
121
+ return { ok: false, error };
122
+ }
123
+ }
124
+
125
+ function say($: EngineInterface, text: string | null) {
126
+ return update($, message, () => text);
127
+ }
128
+
129
+ /** Opens a page in the app's browser pane, beside the transcript; refused, offers a link. */
130
+ async function show($: EngineInterface, browser: string, url: string) {
131
+ const got = await call($, browser, "navigate", { url });
132
+ if (got.ok) {
133
+ await update($, fallback, () => null);
134
+ await say($, null);
135
+ return true;
136
+ }
137
+ await update($, fallback, () => url);
138
+ await say($, `The browser pane did not open it: ${got.error}`);
139
+ return false;
140
+ }
141
+
142
+ /** The run's own page, the wizard as it greets a person; a test run has the studio instead. */
143
+ async function showRun($: EngineInterface, browser: string, current: RunView) {
144
+ const url = current.browserUrl ?? current.studioUrl;
145
+ if (!url) {
146
+ await say($, "This run has no page of its own.");
147
+ return false;
148
+ }
149
+ await update($, shown, () => current.runId);
150
+ return show($, browser, url);
151
+ }
152
+
153
+ /** A wizard's name, engenty, steps and page, fetched once per wizard. */
154
+ async function ensureDetails($: EngineInterface, server: string, wizardId: string) {
155
+ const known = await read($, details);
156
+ if (known[wizardId]) return;
157
+ const got = await call($, server, "get_wizard", { wizardId });
158
+ if (!got.ok) {
159
+ await say($, `The wizard's details did not load: ${got.error}`);
160
+ return;
161
+ }
162
+ const found = detailsOf(got.body);
163
+ if (found) await update($, details, (d) => ({ ...d, [wizardId]: found }));
164
+ }
165
+
166
+ /** The list, then each wizard's details, so every row has its engenty and page. */
167
+ async function loadWizards($: EngineInterface, server: string) {
168
+ const got = await call($, server, "list_wizards", {});
169
+ if (!got.ok) {
170
+ await say($, got.error);
171
+ return false;
172
+ }
173
+ const rows: WizardRow[] = (Array.isArray(got.body) ? got.body : []).filter(isRecord).map((w) => ({
174
+ id: String(w.id),
175
+ title: typeof w.title === "string" && w.title ? w.title : String(w.id),
176
+ published: Boolean(w.published),
177
+ ...(typeof w.studioUrl === "string" ? { studioUrl: w.studioUrl } : {}),
178
+ }));
179
+ await update($, wizards, () => rows);
180
+ await say($, null);
181
+ const origin = originOf(rows.find((r) => r.studioUrl)?.studioUrl);
182
+ if (origin) await update($, runtime, () => origin);
183
+ for (const row of rows) await ensureDetails($, server, row.id);
184
+ return true;
185
+ }
186
+
187
+ /** Runs a wizard: its own page where it has one, else a run started here and its page. */
188
+ async function runWizard($: EngineInterface, at: Servers, wizard: WizardRow) {
189
+ if (!wizard.published) {
190
+ await say($, `"${wizard.title}" is not published yet.`);
191
+ return false;
192
+ }
193
+ const page = (await read($, details))[wizard.id]?.shareUrl;
194
+ if (page) return show($, at.browser, page);
195
+ const got = await call($, at.server, "run_wizard", { wizardId: wizard.id, answers: {} });
196
+ if (!got.ok) {
197
+ await say($, got.error);
198
+ return false;
199
+ }
200
+ if (!isReport(got.body)) return false;
201
+ return showRun($, at.browser, got.body);
202
+ }
203
+
204
+ /**
205
+ * Puts a change request for the wizard into the chat, for the person to finish; where no box
206
+ * takes it, the sentence goes to the clipboard instead.
207
+ */
208
+ async function askForChanges($: EngineInterface, title: string, surface?: RenderSurface) {
209
+ const text = `For my engenty wizard "${title}" I need the following changes: `;
210
+ const filled = await $.prompt.fill({ text, mode: "replace" });
211
+ if (filled.isFilled) {
212
+ await say($, null);
213
+ return;
214
+ }
215
+ const copied = await $.ui.copy({ text, ...(surface ? { surface } : {}) });
216
+ const why =
217
+ filled.refusal === "dialog" ? "a dialog holds the keys" : "this surface has no prompt box";
218
+ await say(
219
+ $,
220
+ copied.isCopied
221
+ ? `The chat box did not take the text (${why}). It is on your clipboard: paste it into the chat.`
222
+ : `The chat box did not take the text (${why}), and the clipboard is not reachable either.`,
223
+ );
224
+ }
225
+
226
+ function openPane($: EngineInterface, focus?: true) {
227
+ return $.ui.open({ id: PANE, title: "engenty.wizards", ...(focus ? { focus } : {}) });
228
+ }
229
+
230
+ export const register: Register = (on, options) => {
231
+ const at: Servers = {
232
+ server:
233
+ typeof options.server === "string" && options.server ? options.server : "engenty-wizards",
234
+ browser:
235
+ typeof options.browser === "string" && options.browser ? options.browser : "Claude_Browser",
236
+ };
237
+ let prefixes = prefixesOf(at.server);
238
+
239
+ on("session.start", async ($, e, next) => {
240
+ // The plugin's own server (plugin/.mcp.json) answers under the name the engine gave it;
241
+ // a server configured elsewhere under the same name keeps it.
242
+ const own = await $.mcp.connect(at.server);
243
+ if (own.isConnected) {
244
+ at.server = own.server;
245
+ prefixes = prefixesOf(own.server);
246
+ }
247
+ await $.command.register({
248
+ name: "wizards",
249
+ description: "The engenty.wizards list in a pane; each runs beside the chat",
250
+ argumentHint: "[run <wizard> | reload | close]",
251
+ });
252
+ await say($, null);
253
+ // The list is a sidebar: it opens by itself where someone can see it.
254
+ if (e.isInteractive) await openPane($);
255
+ if ((await read($, wizards)).length === 0) await loadWizards($, at.server);
256
+ return next(e);
257
+ });
258
+
259
+ on("command.run", { command: "wizards" }, async ($, e) => {
260
+ const [verb = "", ...rest] = e.args.trim().split(/\s+/).filter(Boolean);
261
+ if (verb === "close") {
262
+ await $.ui.close({ id: PANE });
263
+ return { text: "Wizards pane closed." };
264
+ }
265
+ const opened = await openPane($, true);
266
+ const where = opened.isPlaced ? "" : ` It waits undrawn: ${opened.reason}`;
267
+ if (verb === "run" && rest.length) {
268
+ if (!(await loadWizards($, at.server))) return { text: `Wizards: ${await read($, message)}` };
269
+ const want = rest.join(" ").toLowerCase();
270
+ const list = await read($, wizards);
271
+ const found =
272
+ list.find((w) => w.id === want) ??
273
+ list.find((w) => w.title.toLowerCase() === want) ??
274
+ list.find((w) => w.title.toLowerCase().includes(want));
275
+ if (!found) return { text: `No wizard "${rest.join(" ")}".` };
276
+ const ran = await runWizard($, at, found);
277
+ return {
278
+ text: ran
279
+ ? `"${found.title}" is open beside the chat.${where}`
280
+ : `Wizards: ${await read($, message)}`,
281
+ };
282
+ }
283
+ if (verb === "reload" || (await read($, wizards)).length === 0) await loadWizards($, at.server);
284
+ return { text: `Wizards pane opened.${where}` };
285
+ });
286
+
287
+ // A run the model drives through the runtime's MCP tools opens beside the chat once it
288
+ // waits for the person, one time per run.
289
+ on("tool.call", async ($, e, next) => {
290
+ const ran = await next(e);
291
+ const prefix = prefixes.find((p) => e.tool.startsWith(p));
292
+ if (!prefix || ran.deny !== undefined || ran.result === undefined) return ran;
293
+ if (!RUN_TOOLS.has(e.tool.slice(prefix.length))) return ran;
294
+ const text = textOf(ran.result);
295
+ if (text === undefined) return ran;
296
+ const report = parse(text);
297
+ if (!isReport(report) || isOver(report) || !report.waitingFor) return ran;
298
+ if ((await read($, shown)) === report.runId) return ran;
299
+ const origin = originOf(report.browserUrl);
300
+ if (origin) await update($, runtime, () => origin);
301
+ await showRun($, at.browser, report);
302
+ return ran;
303
+ }).catch((_, e, next) => next(e));
304
+
305
+ on("ui.render", { component: "Pane", requestId: PANE }, async ($, e) => {
306
+ const table = $.ui.resolve(e);
307
+ const { Box, Text, Button, Link } = table;
308
+ const Svg = "Svg" in table ? table.Svg : undefined;
309
+ const width = e.props.bodyColumns;
310
+ const [list, known, note, origin, link] = await Promise.all([
311
+ read($, wizards),
312
+ read($, details),
313
+ read($, message),
314
+ read($, runtime),
315
+ read($, fallback),
316
+ ]);
317
+
318
+ /** The engenty of a wizard, as the studio draws it; a glyph where no surface draws SVG. */
319
+ const mascot = (kind: string | undefined, size: number) =>
320
+ Svg ? (
321
+ <Svg source={engentySvg(kind, size)} alt="engenty" width={size} height={size} />
322
+ ) : (
323
+ <Text color={engentyColor(kind)}>◉</Text>
324
+ );
325
+
326
+ /** One wizard: its engenty, name and description; Run opens its page, Edit asks the chat. */
327
+ const row = (w: WizardRow, i: number) => {
328
+ const about = known[w.id];
329
+ const title = about?.title ?? w.title;
330
+ return (
331
+ <Box key={`w:${w.id}`} gap={1} alignItems="center">
332
+ {mascot(about?.avatar, 36)}
333
+ <Box flexDirection="column" flexGrow={1}>
334
+ <Text bold={w.published} dimColor={!w.published}>
335
+ {title}
336
+ {w.published ? "" : " · draft"}
337
+ </Text>
338
+ {about?.description && (
339
+ <Text dimColor wrap="truncate">
340
+ {about.description}
341
+ </Text>
342
+ )}
343
+ </Box>
344
+ {w.published && (
345
+ <Button
346
+ key={`run:${w.id}`}
347
+ variant="primary"
348
+ {...(i < 9 ? { hotkey: String(i + 1) } : {})}
349
+ onPress={() => runWizard($, at, w)}
350
+ >
351
+ Run
352
+ </Button>
353
+ )}
354
+ <Button
355
+ key={`edit:${w.id}`}
356
+ plain
357
+ dimColor
358
+ onPress={(press) => askForChanges($, title, press.surface)}
359
+ >
360
+ Edit
361
+ </Button>
362
+ </Box>
363
+ );
364
+ };
365
+
366
+ return (
367
+ <Box flexDirection="column" width={width} gap={1}>
368
+ {note && <Text color="error">{note}</Text>}
369
+ {link && <Link href={link} label="Open it in your browser instead" />}
370
+ {list.length === 0 ? (
371
+ <Text dimColor>No wizards yet. Press Reload, or start the wizards runtime first.</Text>
372
+ ) : (
373
+ <Box flexDirection="column" gap={1}>
374
+ {list.map(row)}
375
+ </Box>
376
+ )}
377
+ <Box gap={1} alignItems="center">
378
+ {origin && <Text dimColor>{origin.replace(/^https?:\/\//, "")}</Text>}
379
+ {origin && (
380
+ <Button
381
+ plain
382
+ dimColor
383
+ hotkey="o"
384
+ onPress={() => show($, at.browser, `${origin}/studio`)}
385
+ >
386
+ Studio
387
+ </Button>
388
+ )}
389
+ <Button plain dimColor hotkey="l" onPress={() => loadWizards($, at.server)}>
390
+ Reload
391
+ </Button>
392
+ </Box>
393
+ </Box>
394
+ );
395
+ });
396
+ };
@@ -0,0 +1,44 @@
1
+ export type WizardRow = {
2
+ id: string;
3
+ title: string;
4
+ published: boolean;
5
+ studioUrl?: string;
6
+ };
7
+
8
+ /** What the pane keeps of a wizard: its name, its engenty, its steps, its own page. */
9
+ export type WizardDetails = {
10
+ title: string;
11
+ description?: string;
12
+ avatar?: string;
13
+ steps: { id: string; type: string; title: string }[];
14
+ /** The wizard's page behind its share link, where a person runs it. */
15
+ shareUrl?: string;
16
+ };
17
+
18
+ /** The run report the runtime's MCP tools answer (runReport in apps/runtime/src/services/runs.ts). */
19
+ export type RunView = {
20
+ runId: string;
21
+ wizardId: string;
22
+ mode: string;
23
+ status: string;
24
+ waitingFor?: unknown;
25
+ browserUrl: string | null;
26
+ studioUrl?: string;
27
+ };
28
+
29
+ declare module "claude-code" {
30
+ interface PluginState {
31
+ wizards: {
32
+ wizards: WizardRow[];
33
+ /** Kept under a shape tag: a newer module reading another tag starts afresh. */
34
+ details: { shape: string; value: Record<string, WizardDetails> };
35
+ message: string | null;
36
+ /** The run whose page the browser pane was opened at, so a polled run opens once. */
37
+ shown: string | null;
38
+ /** The runtime's origin, read off its links: where the pane is connected. */
39
+ runtime: string | null;
40
+ /** A page the browser pane refused to open, offered as a plain link instead. */
41
+ fallback: string | null;
42
+ };
43
+ }
44
+ }
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-BNakU3Ej.js";import{$t as r,Ft as i,It as a,Kt as o,Nt as s,Pt as c,Vn as l,Vt as u,Wt as d,_r as f,dr as p}from"./ui-DQ4L2npj.js";import{t as m}from"./preload-helper-CNEI7N0N.js";import{Nt as h,nt as g,rt as _,tt as v}from"./index-DlDsr9Lc.js";import{c as y,f as b}from"./settings-menu-DXzZCIMx.js";import{ReleaseNotes as x,loadReleases as S,releaseDate as C,releaseLabel as w}from"./ChangelogDialog-QHYP0jAv.js";var T=e(t(),1),E=[{name:`engenty wizards`,description:`credit.engenty-wizards`,homepage:`https://github.com/engenty/wizards`,license:`FSL-1.1-MIT`},{name:`engenty`,description:`credit.engenty`,homepage:`https://github.com/engenty/engenty`,license:`FSL-1.1-MIT`}],D=[{name:`Mastra`,description:`credit.mastra`,homepage:`https://github.com/mastra-ai/mastra`,license:`Apache-2.0`},{name:`AI SDK`,description:`credit.ai-sdk`,homepage:`https://github.com/vercel/ai`,license:`Apache-2.0`},{name:`Model Context Protocol`,description:`credit.model-context-protocol`,homepage:`https://github.com/modelcontextprotocol/typescript-sdk`,license:`MIT`},{name:`Hono`,description:`credit.hono`,homepage:`https://github.com/honojs/hono`,license:`MIT`},{name:`Drizzle ORM`,description:`credit.drizzle-orm`,homepage:`https://github.com/drizzle-team/drizzle-orm`,license:`Apache-2.0`},{name:`libSQL`,description:`credit.libsql`,homepage:`https://github.com/tursodatabase/libsql`,license:`MIT`},{name:`Playwright`,description:`credit.playwright`,homepage:`https://github.com/microsoft/playwright`,license:`Apache-2.0`},{name:`React`,description:`credit.react`,homepage:`https://github.com/facebook/react`,license:`MIT`},{name:`Vite`,description:`credit.vite`,homepage:`https://github.com/vitejs/vite`,license:`MIT`},{name:`Tailwind CSS`,description:`credit.tailwind-css`,homepage:`https://github.com/tailwindlabs/tailwindcss`,license:`MIT`},{name:`React Flow`,description:`credit.react-flow`,homepage:`https://github.com/xyflow/xyflow`,license:`MIT`},{name:`TanStack Query`,description:`credit.tanstack-query`,homepage:`https://github.com/TanStack/query`,license:`MIT`},{name:`xterm.js`,description:`credit.xterm-js`,homepage:`https://github.com/xtermjs/xterm.js`,license:`MIT`},{name:`Lucide`,description:`credit.lucide`,homepage:`https://github.com/lucide-icons/lucide`,license:`ISC`},{name:`Geist & Geist Mono`,description:`credit.geist-geist-mono`,homepage:`https://github.com/vercel/geist-font`,license:`OFL-1.1`},{name:`Space Grotesk`,description:`credit.space-grotesk`,homepage:`https://github.com/floriankarsten/space-grotesk`,license:`OFL-1.1`},{name:`git-cliff`,description:`credit.git-cliff`,homepage:`https://github.com/orhun/git-cliff`,license:`MIT OR Apache-2.0`}],O=e(n(),1),k=(e,...t)=>t.some(t=>t?.toLowerCase().includes(e));function A({name:e,homepage:t,version:n,license:r,description:i}){return(0,O.jsxs)(`li`,{className:`py-2.5`,children:[(0,O.jsxs)(`div`,{className:`flex flex-wrap items-baseline gap-x-2.5 gap-y-0.5`,children:[t?(0,O.jsxs)(`a`,{href:t,target:`_blank`,rel:`noreferrer`,className:`inline-flex items-center gap-1 font-medium text-[0.875rem] text-ink underline-offset-4 hover:underline`,children:[e,(0,O.jsx)(p,{"aria-hidden":!0,className:`size-3 text-ink-4`})]}):(0,O.jsx)(`span`,{className:`font-medium text-[0.875rem] text-ink`,children:e}),n?(0,O.jsx)(`span`,{className:`text-[0.75rem] text-ink-3 tabular-nums`,children:n}):null,(0,O.jsx)(`span`,{className:`text-[0.75rem] text-ink-3`,children:r})]}),i?(0,O.jsx)(`p`,{className:`mt-0.5 text-[0.8125rem] text-ink-3`,children:i}):null]})}function j({title:e,hint:t,children:n}){return(0,O.jsxs)(`section`,{className:`mt-6`,children:[(0,O.jsx)(`h3`,{className:`border-border-soft border-b pb-2 font-display font-semibold text-[1rem]`,children:e}),t?(0,O.jsx)(`p`,{className:`mt-2 text-[0.8125rem] text-ink-3`,children:t}):null,n]})}function M({credits:e}){return(0,O.jsx)(`ul`,{className:`divide-y divide-border-soft`,children:e.map(e=>(0,O.jsx)(A,{name:e.name,homepage:e.homepage,license:e.license,description:r(e.description)},e.name))})}function N({label:e,packages:t}){return(0,O.jsxs)(`div`,{className:`mt-4`,children:[(0,O.jsx)(`h4`,{className:`font-medium text-[0.75rem] text-ink-3 tracking-wide`,children:e}),(0,O.jsx)(`ul`,{className:`divide-y divide-border-soft`,children:t.map(e=>(0,O.jsx)(A,{...e},e.name))})]})}function P({active:e}){let[t,n]=(0,T.useState)(null),[i,o]=(0,T.useState)(``);(0,T.useEffect)(()=>{if(!e||t)return;let r=!1;return m(()=>import(`./oss-credits-X2JPiMOR.js`).then(e=>{r||n(e.default)}),[]),()=>{r=!0}},[e,t]),(0,T.useEffect)(()=>{e||o(``)},[e]);let s=i.trim().toLowerCase(),l=e=>s?e.filter(e=>k(s,e.name,e.license,r(e.description))):e,d=e=>s?e.filter(e=>k(s,e.name,e.license,e.version)):e,f=l(E),p=l(D),h=t?[{id:`shared`,label:r(`about.creditsShared`),packages:d(t.shared)},...t.groups.map(e=>({id:e.id,label:e.label,packages:d(e.packages)}))].filter(e=>e.packages.length>0):[],g=f.length===0&&p.length===0&&h.length===0;return(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`p`,{className:`mb-4 text-[0.875rem] text-ink-3`,children:r(`about.creditsHint`)}),(0,O.jsx)(a,{type:`search`,value:i,placeholder:r(`about.search`),onChange:e=>o(e.target.value)}),f.length>0?(0,O.jsx)(j,{title:r(`about.creditsProduct`),children:(0,O.jsx)(M,{credits:f})}):null,p.length>0?(0,O.jsx)(j,{title:r(`about.creditsBuiltWith`),children:(0,O.jsx)(M,{credits:p})}):null,t===null?(0,O.jsx)(`div`,{className:`flex justify-center py-10 text-ink-3`,children:(0,O.jsx)(u,{})}):h.length>0?(0,O.jsx)(j,{title:r(`about.creditsDeps`),hint:s?void 0:r(`about.creditsDepsHint`),children:h.map(e=>(0,O.jsx)(N,{label:e.label,packages:e.packages},e.id))}):null,t!==null&&g?(0,O.jsx)(c,{children:r(`about.noMatches`)}):null]})}var F=[`new`,`earlier`,`credits`],I=e=>r(e===`new`?`about.tab.new`:e===`earlier`?`about.tab.earlier`:`about.credits`),L=e=>e===1?r(`about.change`):r(`about.changes`,{n:e});function R({open:e,onClose:t,me:n}){let a=n?.mode===`local`,{data:c,latest:p}=_(a&&e),[m,E]=(0,T.useState)(null),[D,k]=(0,T.useState)(`new`),A=b(F.indexOf(D)),j=c?.newer&&p?p:g;(0,T.useEffect)(()=>{if(!e)return;let t=!1;return E(null),S(j===`0.7.8`?void 0:j).then(e=>{t||E(e)}),()=>{t=!0}},[e,j]);let M=m?.find(e=>e.version===`v${j}`)??m?.[0]??null,N=m?.filter(e=>e!==M)??[],R=a?c?.kind??null:`cloud`;return(0,O.jsxs)(s,{open:e,onClose:t,wide:!0,height:`tall`,children:[(0,O.jsx)(`div`,{className:`-mt-2 -mr-2 sticky top-0 z-10 flex h-0 justify-end`,children:(0,O.jsx)(i,{label:r(`common.close`),onClick:t,children:(0,O.jsx)(l,{className:`size-4`})})}),(0,O.jsxs)(`div`,{className:`flex flex-col items-center pt-4 text-center`,children:[(0,O.jsx)(h,{size:96}),(0,O.jsxs)(`div`,{className:`mt-4 font-display font-semibold text-[1.5rem] tracking-tight`,children:[`engenty`,(0,O.jsx)(`span`,{className:`text-ember`,children:`.`}),(0,O.jsx)(`span`,{className:`ml-1.5 font-normal text-ink-3`,children:`wizards`})]}),(0,O.jsxs)(`div`,{className:`mt-1 text-[0.9375rem] text-ink-3 tabular-nums`,children:[r(`about.version`,{v:g}),R?` · ${r(`about.kind.${R}`)}`:``]})]}),a?(0,O.jsx)(`div`,{className:`mt-5`,children:(0,O.jsx)(v,{enabled:e})}):null,(0,O.jsx)(`div`,{className:`mt-6 flex justify-center`,children:(0,O.jsx)(d,{value:D,onChange:k,options:F.map(e=>({id:e,label:I(e)})),label:r(`about.title`)})}),(0,O.jsxs)(`div`,{className:o(`mt-5`,y(A)),children:[D===`new`?m===null?(0,O.jsx)(`div`,{className:`flex justify-center py-6 text-ink-3`,children:(0,O.jsx)(u,{})}):M?(0,O.jsxs)(O.Fragment,{children:[(0,O.jsxs)(`h3`,{className:`flex items-baseline gap-3 border-border-soft border-b pb-2 font-display font-semibold text-[1rem]`,children:[w(M),(0,O.jsx)(`span`,{className:`font-normal font-sans text-[0.8125rem] text-ink-3 tabular-nums`,children:C(M)})]}),(0,O.jsx)(`div`,{className:`mt-3`,children:(0,O.jsx)(x,{release:M})})]}):(0,O.jsx)(`p`,{className:`text-[0.875rem] text-ink-3`,children:r(`about.changelogEmpty`)}):null,D===`earlier`?(0,O.jsx)(`div`,{className:`flex flex-col divide-y divide-border-soft`,children:N.map(e=>(0,O.jsxs)(`details`,{className:`group/r py-2`,children:[(0,O.jsxs)(`summary`,{className:`flex cursor-pointer list-none items-baseline gap-3 text-[0.875rem] [&::-webkit-details-marker]:hidden`,children:[(0,O.jsx)(f,{className:`size-3.5 shrink-0 self-center text-ink-4 transition group-open/r:rotate-90`}),(0,O.jsx)(`span`,{className:`font-medium text-ink tabular-nums`,children:w(e)}),(0,O.jsx)(`span`,{className:`text-[0.8125rem] text-ink-3 tabular-nums`,children:C(e)}),(0,O.jsx)(`span`,{className:`ml-auto text-[0.8125rem] text-ink-4`,children:L(e.commits.length)})]}),(0,O.jsx)(`div`,{className:`mt-2 pl-6`,children:(0,O.jsx)(x,{release:e})})]},e.version??`unreleased`))}):null,D===`credits`?(0,O.jsx)(P,{active:!0}):null]},D)]})}export{R as AboutDialog};
@@ -1 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-BNakU3Ej.js";import{$t as r,It as i,Kt as a,Nt as o,Pt as s,Vt as c}from"./ui-DQ4L2npj.js";import{t as l}from"./preload-helper-CNEI7N0N.js";var u=e(t(),1),d=e(n(),1);function f(e){switch(e.group){case`Added`:return{label:`NEW`,dot:`bg-moss`};case`Fixed`:return{label:`FIXED`,dot:`bg-amber`};case`Changed`:return{label:`CHANGED`,dot:`bg-cobalt`};case`Performance`:return{label:`PERFORMANCE`,dot:`bg-ember`};case`Deploy`:return{label:`DEPLOY`,dot:`bg-ink-4`};case`Docs`:return{label:`DOCS`,dot:`bg-ink-4`};default:return{label:`OTHER`,dot:`bg-ink-4`}}}var p=e=>e.version?e.version.replace(/^v/,``):r(`about.unreleased`),m=e=>e.timestamp?new Date(e.timestamp*1e3).toISOString().slice(0,10):``,h=e=>e.charAt(0).toUpperCase()+e.slice(1);function g(e,t){let n=t.trim().toLowerCase();if(!n)return e;let r=[];for(let t of e){if(`${p(t)} ${m(t)}`.toLowerCase().includes(n)){r.push(t);continue}let e=t.commits.filter(e=>`${f(e).label} ${e.scope??``} ${e.message}`.toLowerCase().includes(n));e.length>0&&r.push({...t,commits:e})}return r}async function _(e){if(e)try{let t=await fetch(`https://raw.githubusercontent.com/engenty/engenty-wizards/v${e}/apps/web/src/about/changelog.json`,{signal:AbortSignal.timeout(5e3)});if(t.ok)return await t.json()}catch{}return(await l(async()=>{let{default:e}=await import(`./changelog-CO9vKjV0.js`);return{default:e}},[])).default}function v({release:e}){return(0,d.jsx)(`ul`,{className:`flex flex-col gap-2`,children:e.commits.map(e=>{let t=f(e);return(0,d.jsxs)(`li`,{className:`flex items-start gap-2.5 text-[0.875rem]`,children:[(0,d.jsx)(`span`,{className:a(`mt-[7px] size-1.5 shrink-0 rounded-full`,t.dot)}),(0,d.jsxs)(`span`,{className:`min-w-0 text-ink-2`,children:[(0,d.jsxs)(`span`,{className:`font-semibold text-[0.75rem] text-ink tracking-wide`,children:[t.label,e.scope?` [${e.scope}]`:``]}),` `,h(e.message),e.breaking?(0,d.jsx)(`span`,{className:`ml-1.5 rounded-full bg-rose-tint px-1.5 py-0.5 font-medium text-[0.75rem] text-rose`,children:r(`about.breaking`)}):null]})]},e.id)})})}function y({open:e,onClose:t,version:n}){let[a,l]=(0,u.useState)(null),[f,h]=(0,u.useState)(``);(0,u.useEffect)(()=>{if(!e||a)return;let t=!1;return _(n).then(e=>{t||l(e)}),()=>{t=!0}},[e,a,n]),(0,u.useEffect)(()=>{e||h(``)},[e]);let y=a?g(a,f):[];return(0,d.jsxs)(o,{open:e,onClose:t,title:r(`about.changelog`),wide:!0,height:`tall`,children:[(0,d.jsx)(`p`,{className:`-mt-3 mb-4 text-[0.875rem] text-ink-3`,children:r(`about.changelogHint`)}),a===null?(0,d.jsx)(`div`,{className:`flex justify-center py-10 text-ink-3`,children:(0,d.jsx)(c,{})}):a.length===0?(0,d.jsx)(s,{children:r(`about.changelogEmpty`)}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(i,{type:`search`,value:f,placeholder:r(`about.search`),onChange:e=>h(e.target.value)}),y.length===0?(0,d.jsx)(s,{children:r(`about.noMatches`)}):null,y.map(e=>(0,d.jsxs)(`section`,{className:`mt-6`,children:[(0,d.jsxs)(`h3`,{className:`flex items-baseline gap-3 border-border-soft border-b pb-2 font-display font-semibold text-[1rem]`,children:[p(e),(0,d.jsx)(`span`,{className:`font-normal font-sans text-[0.8125rem] text-ink-3 tabular-nums`,children:m(e)})]}),(0,d.jsx)(`div`,{className:`mt-3`,children:(0,d.jsx)(v,{release:e})})]},e.version??`unreleased`))]})]})}export{y as ChangelogDialog,v as ReleaseNotes,_ as loadReleases,m as releaseDate,p as releaseLabel};
@@ -1,10 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-BNakU3Ej.js";import{$ as r,$n as i,$t as a,Bn as o,Cr as s,Dr as c,Ft as l,Gn as u,Gt as d,Hn as f,Jt as p,Kn as m,Kt as h,Pn as g,Rr as _,Rt as v,Vt as y,W as b,Wn as x,Yn as S,br as C,bt as w,dt as T,ft as E,ir as D,lt as O,m as k,mt as A,nn as j,nr as M,nt as N,pt as P,qt as F,rt as I,st as L,tt as ee,un as R,ut as z,vt as B,wn as te,xt as ne,yt as re}from"./ui-DQ4L2npj.js";import{t as ie}from"./phone-CXXHXYnA.js";import{Ft as ae,Ot as oe,Wt as se,dt as ce,lt as le,qt as ue,t as de,ut as fe}from"./index-DlDsr9Lc.js";import{n as pe}from"./RunnerView-DInSK0VZ.js";var me={name:`hand`,size:24,node:[[`path`,{d:`M18 11V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2`,key:`1fvzgz`}],[`path`,{d:`M14 10V4a2 2 0 0 0-2-2a2 2 0 0 0-2 2v2`,key:`1kc0my`}],[`path`,{d:`M10 10.5V6a2 2 0 0 0-2-2a2 2 0 0 0-2 2v8`,key:`10h0bg`}],[`path`,{d:`M18 8a2 2 0 1 1 4 0v6a8 8 0 0 1-8 8h-2c-2.8 0-4.5-.86-5.99-2.34l-3.6-3.6a2 2 0 0 1 2.83-2.82L7 15`,key:`1s1gnw`}]]};me.node;var he=c(me),ge={name:`undo-2`,size:24,node:[[`path`,{d:`M9 14 4 9l5-5`,key:`102s5s`}],[`path`,{d:`M4 9h10.5a5.5 5.5 0 0 1 5.5 5.5a5.5 5.5 0 0 1-5.5 5.5H11`,key:`f3b9sd`}]]};ge.node;var _e=c(ge),ve={name:`video-off`,size:24,node:[[`path`,{d:`M10.66 6H14a2 2 0 0 1 2 2v2.5l5.248-3.062A.5.5 0 0 1 22 7.87v8.196`,key:`w8jjjt`}],[`path`,{d:`M16 16a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h2`,key:`1xawa7`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}]]};ve.node;var V=c(ve),ye={name:`volume-x`,size:24,node:[[`path`,{d:`M11 4.702a.7.7 0 0 0-1.203-.498L6.413 7.587A1.4 1.4 0 0 1 5.416 8H3a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2.416a1.4 1.4 0 0 1 .997.413l3.383 3.384A.7.7 0 0 0 11 19.298z`,key:`1p7khw`}],[`path`,{d:`m16.5 14.5 5-5`,key:`cul3yw`}],[`path`,{d:`m16.5 9.5 5 5`,key:`1akey5`}]]};ye.node;var be=c(ye),xe=_(),H=e(t(),1),U=e(n(),1),Se=typeof window<`u`&&window.matchMedia(`(pointer: coarse)`).matches;function Ce({since:e}){let[t,n]=(0,H.useState)(Date.now());if((0,H.useEffect)(()=>{if(!e)return;let t=setInterval(()=>n(Date.now()),1e3);return()=>clearInterval(t)},[e]),!e)return null;let r=Math.max(0,Math.floor((t-e)/1e3)),i=String(Math.floor(r/60)).padStart(2,`0`),a=String(r%60).padStart(2,`0`);return(0,U.jsxs)(`span`,{className:`font-mono text-[0.8125rem] text-white/60 tabular-nums`,children:[i,`:`,a]})}function W({label:e,on:t,danger:n,busy:r,onClick:i,children:a}){return(0,U.jsx)(`button`,{type:`button`,"aria-label":e,title:e,"aria-pressed":t,disabled:r,onClick:i,className:h(`flex size-12 items-center justify-center rounded-full transition disabled:opacity-50`,n?`bg-rose text-white hover:brightness-110`:t===!1?`bg-white text-neutral-900 hover:bg-white/90`:`bg-white/15 text-white hover:bg-white/25`),children:r?(0,U.jsx)(y,{className:`size-5`}):a})}function we({voice:e}){let t=(0,H.useRef)(null),{captions:n}=e;return(0,H.useEffect)(()=>{n.length&&t.current?.scrollIntoView({block:`end`})},[n]),n.length?(0,U.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-4 sm:px-5`,children:(0,U.jsxs)(`ol`,{className:`mx-auto flex max-w-[720px] flex-col gap-2 py-2`,children:[n.map(e=>(0,U.jsx)(`li`,{className:h(`text-[0.9375rem] leading-snug`,e.who===`bot`?`text-white/95`:`text-right text-white/50`),children:e.text},e.id)),(0,U.jsx)(`div`,{ref:t})]})}):null}function Te({voice:e,view:t,video:n,className:r}){let i=e.state===`live`,o=e.state===`connecting`,[s,c]=(0,H.useState)(null),[l,u]=(0,H.useState)(!1);(0,H.useEffect)(()=>{c(i?Date.now():null)},[i]);let d=async()=>{u(!1),await e.start(),n&&await e.startCamera()},p=()=>{e.stop(),u(!0)},m=n||e.camera,g=[...e.captions].reverse().find(e=>e.who===`bot`),_=[...e.captions].reverse().find(e=>e.who===`me`),v=e.speaking?a(`talk.speaking`):e.listening?a(`talk.listening`):i?a(`talk.live`):o?a(`talk.connecting`):l?a(`video.ended`):``;return(0,U.jsxs)(`section`,{className:h(`relative flex min-h-0 flex-col bg-neutral-950 text-white`,`safe-top`,r),children:[(0,U.jsxs)(`div`,{className:`flex h-14 shrink-0 items-center gap-3 px-4 sm:px-5`,children:[(0,U.jsx)(`div`,{className:`min-w-0 flex-1 truncate font-display font-semibold text-[1rem] tracking-tight`,children:t?.wizard.title??``}),v?(0,U.jsxs)(`span`,{className:`flex items-center gap-1.5 text-[0.8125rem] text-white/70`,children:[i?(0,U.jsx)(`span`,{className:h(`size-2 rounded-full`,e.speaking?`animate-pulse-dot bg-emerald-400`:`bg-rose`)}):null,v]}):null,(0,U.jsx)(Ce,{since:s})]}),(0,U.jsxs)(`div`,{className:h(`grid min-h-0 gap-2 px-3 pb-2 sm:px-4`,m?`flex-1 grid-cols-1 sm:grid-cols-2`:`shrink-0 grid-cols-1`,!m&&i&&e.captions.length?`h-[38%]`:m?``:`flex-1`),children:[(0,U.jsxs)(`div`,{className:h(`relative min-h-0 overflow-hidden rounded-2xl bg-neutral-900`,!m&&`hidden`),children:[(0,U.jsx)(`video`,{ref:e.video,muted:!0,playsInline:!0,autoPlay:!0,className:h(`absolute inset-0 h-full w-full object-cover`,e.facing===`user`&&`-scale-x-100`,e.camera?`block`:`hidden`)}),e.camera?null:(0,U.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-2 text-white/50`,children:[(0,U.jsx)(V,{className:`size-8`}),(0,U.jsx)(`span`,{className:`text-[0.8125rem]`,children:a(`video.cameraOff`)})]}),(0,U.jsxs)(`span`,{className:`absolute bottom-2 left-3 rounded-md bg-black/50 px-2 py-0.5 text-[0.75rem]`,children:[a(`video.you`),e.muted?(0,U.jsx)(ue,{className:`ml-1.5 inline size-3`}):null]})]}),(0,U.jsxs)(`div`,{className:h(`relative flex min-h-0 items-center justify-center overflow-hidden rounded-2xl transition-shadow`,m?`bg-neutral-900`:`bg-transparent`,m&&e.speaking&&`ring-2 ring-emerald-400/70`),children:[(0,U.jsx)(`div`,{className:h(`rounded-full transition-shadow duration-500`,!m&&e.listening&&`shadow-[0_0_80px_20px_rgba(244,63,94,0.25)]`,!m&&e.speaking&&`shadow-[0_0_80px_20px_rgba(52,211,153,0.3)]`,e.speaking&&`animate-breathe`),children:(0,U.jsx)(oe,{kind:t?.wizard.avatar??`round`,size:m?140:200,fluffy:!0,interactive:!1})}),m?(0,U.jsx)(`span`,{className:`absolute bottom-2 left-3 max-w-[85%] truncate rounded-md bg-black/50 px-2 py-0.5 text-[0.75rem]`,children:t?.wizard.title??``}):null]})]}),i&&!m?(0,U.jsx)(we,{voice:e}):i&&(g||_)?(0,U.jsx)(`div`,{className:`shrink-0 px-4 pb-2 sm:px-5`,children:(0,U.jsxs)(`div`,{className:`mx-auto max-w-[720px] space-y-1 text-center`,children:[_?(0,U.jsx)(`p`,{className:`line-clamp-1 text-[0.8125rem] text-white/50`,children:_.text}):null,g?(0,U.jsx)(`p`,{className:`line-clamp-3 text-[0.9375rem] text-white/95 leading-snug`,children:g.text}):null]})}):null,e.error?(0,U.jsx)(`p`,{className:`shrink-0 px-5 pb-2 text-center text-[0.8125rem] text-rose`,children:e.error}):null,(0,U.jsx)(`div`,{className:`flex shrink-0 items-center justify-center gap-3 px-4 pt-1 pb-4`,children:i?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(W,{label:a(e.muted?`video.unmute`:`video.mute`),on:!e.muted,onClick:e.toggleMute,children:e.muted?(0,U.jsx)(ue,{className:`size-5`}):(0,U.jsx)(D,{className:`size-5`})}),(0,U.jsx)(W,{label:a(e.camera?`talk.cameraOff`:`talk.camera`),on:e.camera,onClick:()=>e.camera?e.stopCamera():void e.startCamera(),children:e.camera?(0,U.jsx)(f,{className:`size-5`}):(0,U.jsx)(V,{className:`size-5`})}),e.camera&&Se?(0,U.jsx)(W,{label:a(`video.flip`),onClick:()=>void e.flipCamera(),children:(0,U.jsx)(x,{className:`size-5`})}):null,(0,U.jsx)(W,{label:a(`video.leave`),danger:!0,onClick:p,children:(0,U.jsx)(se,{className:`size-5`})})]}):(0,U.jsxs)(`div`,{className:`flex flex-col items-center gap-2`,children:[(0,U.jsxs)(`button`,{type:`button`,disabled:o||!t?.talk,onClick:()=>void d(),className:`flex h-12 items-center gap-2 rounded-full bg-emerald-500 px-6 font-medium text-[0.9375rem] text-white transition hover:brightness-110 disabled:opacity-50`,children:[o?(0,U.jsx)(y,{className:`size-4`}):n?(0,U.jsx)(f,{className:`size-5`}):(0,U.jsx)(D,{className:`size-5`}),a(l?`video.rejoin`:n?`video.join`:`talk.start`)]}),!l&&!e.error?(0,U.jsx)(`p`,{className:`max-w-sm text-center text-[0.75rem] text-white/50`,children:a(n?`video.hint`:`talk.joinHint`)}):null]})})]})}var Ee=e=>R[e.kind]!==`device`,De=1024,Oe=4e3;function ke(e,t){return e?e.length>t?`${e.slice(0,t)} …`:e:``}function Ae(e,t,n=!1){let r=[`status: ${e.status}`,`camera: ${n?`on`:`off`}`];if(e.ask)return r.push(e.ask.kind===`confirm`?`question: the step wants to "${e.ask.action.summary}" in ${e.ask.service}; answer_ask allows or skips it`:`question: a sign-in at ${e.ask.site.host}; the person types it on the screen, wait`),r.join(`
2
- `);if(e.status===`running`){let t=[...e.events].reverse().find(e=>e.type===`tool`||e.type===`info`||e.type===`step_started`);return r.push(`working on: ${e.step?.title??``}`),t&&r.push(`doing: ${F(t)}`),r.join(`
3
- `)}if(e.status===`done`){r.push(`done. made:`);for(let{step:t,output:n}of e.shown)r.push(`- ${t.title}: ${ke(n?.text,400)||`(a file, on the screen)`}`);return r.join(`
4
- `)}if(e.status===`failed`)return r.push(`failed: ${e.error??``}; go_back or the person retries on the screen`),r.join(`
5
- `);if(t){r.push(`page: ${t.step.title}`);for(let e of t.fields){let n=t.values[e.id],i=n!=null&&n!==``,a=Ee(e)?`by voice`:e.kind===`image`?`with the camera (take_photo) or on the screen`:`on the screen only`,o=e.options?.length?`; options: ${e.options.join(` | `)}`:``;r.push(`- field ${e.id} (${e.kind}${e.required?`, required`:``}, ${a}): ${e.label}${e.help?` – ${e.help}`:``}${o}${i?` = ${ke(String(Array.isArray(n)?n.join(`, `):n),120)}`:` = (open)`}`)}return r.join(`
6
- `)}if(e.step?.type===`review`){r.push(`review: ${e.step.title}`);for(let{step:t,output:n}of e.shown)r.push(`- ${t.id} "${t.title}": ${ke(n?.text,600)||`(a picture or file, on the screen)`}`);return r.push(`regenerate allowed: ${e.step.regenerate?`yes`:`no`}`),r.join(`
7
- `)}return r.push(`step: ${e.step?.title??``}`),r.join(`
8
- `)}function je(e,t,n,r){let[i,o]=(0,H.useState)(`off`),[s,c]=(0,H.useState)(null),[l,u]=(0,H.useState)(!1),[d,f]=(0,H.useState)(!1),[p,m]=(0,H.useState)(!1),[h,g]=(0,H.useState)(`environment`),[_,v]=(0,H.useState)(!1),[y,x]=(0,H.useState)([]),S=(0,H.useRef)(null),C=(0,H.useRef)(null),w=(0,H.useRef)(0),T=(0,H.useRef)(!1);T.current=p;let E=(0,H.useRef)(null),D=(0,H.useRef)(null),O=(0,H.useRef)(null),k=(0,H.useRef)(null),A=(0,H.useRef)(t);A.current=t;let j=(0,H.useRef)(r);j.current=r;let M=(0,H.useRef)(n);M.current=n;let N=(0,H.useRef)(``),P=(0,H.useCallback)(e=>{let t=D.current;t&&t.readyState===`open`&&t.send(JSON.stringify(e))},[]),F=(0,H.useCallback)(()=>{let e=S.current;if(!T.current||!e||e.videoWidth===0)return null;let t=Math.min(1,De/e.videoWidth),n=document.createElement(`canvas`);return n.width=Math.round(e.videoWidth*t),n.height=Math.round(e.videoHeight*t),n.getContext(`2d`)?.drawImage(e,0,0,n.width,n.height),n.toDataURL(`image/jpeg`,.75)},[]),I=(0,H.useCallback)(()=>{for(let e of C.current?.getTracks()??[])e.stop();C.current=null,S.current&&(S.current.srcObject=null),m(!1)},[]),L=(0,H.useCallback)(async e=>{if(C.current)return;let t=e??`environment`;try{let e=await navigator.mediaDevices.getUserMedia({video:{facingMode:{ideal:t},width:{ideal:1280}},audio:!1});C.current=e;let n=e.getVideoTracks()[0]?.getSettings().facingMode;g(n===`user`||n===`environment`?n:t),S.current&&(S.current.srcObject=e,await S.current.play().catch(()=>void 0)),m(!0)}catch(e){c(e.name===`NotAllowedError`?a(`talk.cameraDenied`):e.message)}},[]),ee=(0,H.useCallback)(async()=>{let e=h===`user`?`environment`:`user`;I(),await L(e)},[h,I,L]),R=(0,H.useCallback)(()=>{v(e=>{for(let t of k.current?.getAudioTracks()??[])t.enabled=e;return!e})},[]),z=(0,H.useCallback)(()=>{I(),D.current?.close(),D.current=null,E.current?.close(),E.current=null;for(let e of k.current?.getTracks()??[])e.stop();k.current=null,O.current&&=(O.current.srcObject=null,O.current.remove(),null),N.current=``,u(!1),f(!1),v(!1),o(`off`)},[I]);(0,H.useEffect)(()=>()=>z(),[z]);let B=(0,H.useCallback)(async(t,n)=>{let r=A.current,i=j.current,a=M.current;switch(t){case`get_state`:return r?Ae(r,i,T.current):`no run`;case`look`:{let e=F();return e?(P({type:`conversation.item.create`,item:{type:`message`,role:`user`,content:[{type:`input_text`,text:`[camera] what the person shows right now`},{type:`input_image`,image_url:e}]}}),`a picture arrived as the next message`):`the camera is off; ask the person to switch it on`}case`take_photo`:{if(!i)return`no page is open`;let t=i.fields.find(e=>e.id===String(n.field??``));if(t?.kind!==`image`)return`no such photo field on this page`;let r=F();if(!r)return`the camera is off; ask the person to switch it on`;try{let n=await(await fetch(r)).blob(),a=new File([n],`photo-${Date.now()}.jpg`,{type:`image/jpeg`}),o=await b.upload(`/api/runs/${e}/uploads`,a),s=i.values[t.id],c=t.multiple?[...Array.isArray(s)?s:s?[s]:[],o.id]:o.id,l=i.setField(t.id,c);return l?`refused: ${l}`:`the photo is in the field`}catch(e){return`failed: ${e.message}`}}case`set_field`:{if(!i)return`no page is open`;let e=i.setField(String(n.field??``),n.value);return e?`refused: ${e}`:`kept`}case`submit_page`:{if(!i)return`no page is open`;let e=i.fields.filter(e=>e.required&&Ee(e)&&e.kind!==`toggle`&&(i.values[e.id]===void 0||i.values[e.id]===null||i.values[e.id]===``));return e.length?`still open: ${e.map(e=>e.id).join(`, `)}`:(i.submit(),`sent; wait for the next state`)}case`accept_review`:return r?.step?.type===`review`?await a.accept(r.step.id)?`accepted`:a.error??`refused`:`no review is open`;case`regenerate`:return r?.step?.type===`review`?await a.regenerate(r.step.id,String(n.target??``),String(n.note??``))?`the wizard makes it again; wait`:a.error??`refused`:`no review is open`;case`answer_ask`:if(!r?.ask)return`no question is open`;try{return await b.post(`/api/runs/${e}/ask/${r.ask.id}`,{type:n.allow?`done`:`skip`}),n.allow?`allowed`:`skipped`}catch(e){return`refused: ${e.message}`}case`go_back`:return await a.back()?`went back; wait for the state`:a.error??`refused`;default:return`unknown tool ${t}`}},[e,F,P]),te=(0,H.useCallback)(async()=>{if(!E.current){c(null),x([]),o(`connecting`);try{let t=await b.post(`/api/runs/${e}/talk`),n=await navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}});k.current=n;let r=new RTCPeerConnection;E.current=r;let i=document.createElement(`audio`);i.autoplay=!0,i.setAttribute(`playsinline`,``),document.body.append(i),O.current=i,r.ontrack=e=>{i.srcObject=e.streams[0]};for(let e of n.getTracks())r.addTrack(e,n);let s=r.createDataChannel(`oai-events`);D.current=s,s.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}switch(t.type){case`output_audio_buffer.started`:u(!0);break;case`output_audio_buffer.stopped`:case`output_audio_buffer.cleared`:u(!1);break;case`input_audio_buffer.speech_started`:{f(!0);let e=Date.now()-w.current>Oe?F():null;e&&(w.current=Date.now(),P({type:`conversation.item.create`,item:{type:`message`,role:`user`,content:[{type:`input_text`,text:`[camera] what the person shows while speaking`},{type:`input_image`,image_url:e}]}}));break}case`input_audio_buffer.speech_stopped`:f(!1);break;case`response.output_audio_transcript.done`:case`conversation.item.input_audio_transcription.completed`:{let e=String(t.transcript??``).trim();if(e){let n=t.type===`response.output_audio_transcript.done`?`bot`:`me`;x(t=>[...t.slice(-199),{id:`${Date.now()}:${n}`,who:n,text:e}])}break}case`response.function_call_arguments.done`:{let e=String(t.name??``),n=String(t.call_id??``),r={};try{r=JSON.parse(String(t.arguments??`{}`))}catch{}B(e,r).then(e=>{P({type:`conversation.item.create`,item:{type:`function_call_output`,call_id:n,output:e}}),P({type:`response.create`})});break}case`error`:c(String(t.error?.message??`error`))}},s.onopen=()=>{o(`live`);let e=A.current;e&&(N.current=Ae(e,j.current,T.current),P({type:`conversation.item.create`,item:{type:`message`,role:`user`,content:[{type:`input_text`,text:`[state]\n${N.current}\n\nGreet the person in one sentence and ask the first open field.`}]}}),P({type:`response.create`}))},s.onclose=()=>{E.current===r&&z()};let l=await r.createOffer();await r.setLocalDescription(l);let d=await fetch(t.endpoint,{method:`POST`,headers:{authorization:`Bearer ${t.clientSecret}`,"content-type":`application/sdp`},body:l.sdp});if(!d.ok)throw Error(`${a(`talk.failed`)} (${d.status})`);await r.setRemoteDescription({type:`answer`,sdp:await d.text()})}catch(e){z(),c(e.name===`NotAllowedError`?a(`chat.micDenied`):e.message),o(`error`)}}},[e,B,F,P,z]);return(0,H.useEffect)(()=>{if(i!==`live`||!t)return;let e=Ae(t,r,p);if(e===N.current)return;let n=N.current;N.current=e,P({type:`conversation.item.create`,item:{type:`message`,role:`user`,content:[{type:`input_text`,text:`[state]\n${e}`}]}}),(t.status===`running`&&n.startsWith(`status: running`)&&!n.includes(`working on: `)||t.status!==`running`||n.split(`
9
- `)[1]!==e.split(`
10
- `)[1])&&P({type:`response.create`})},[i,t,r,p,P]),{state:i,error:s,speaking:l,listening:d,start:te,stop:z,camera:p,facing:h,startCamera:L,stopCamera:I,flipCamera:ee,muted:_,toggleMute:R,captions:y,video:S}}var G=(e,t,n)=>({key:e,who:`bot`,node:t,...n}),K=(e,t,n)=>({key:e,who:`me`,node:t,...n}),Me=(0,H.createContext)(null),q=(0,H.createContext)(null);function Ne(){return(0,H.useContext)(q)?.voice??null}function Pe({children:e}){let t=(0,H.useContext)(Me);return t?(0,xe.createPortal)(e,t):null}function Fe({header:e,footer:t,children:n}){let[r,i]=(0,H.useState)(null),a=(0,H.useRef)(null),o=(0,H.useRef)(null),s=(0,H.useRef)(!0);return(0,H.useLayoutEffect)(()=>{let e=a.current,t=o.current;if(!e||!t)return;let n=e.scrollTop,r=()=>{e.scrollHeight-e.scrollTop-e.clientHeight<120?s.current=!0:e.scrollTop<n&&(s.current=!1),n=e.scrollTop},i=null,c=new ResizeObserver(()=>{let r=t.querySelector(`[data-anchor]`);r&&r!==i?(i=r,e.scrollTop+=r.getBoundingClientRect().top-e.getBoundingClientRect().top-12,s.current=!1,n=e.scrollTop):s.current&&(e.scrollTop=e.scrollHeight)});return e.scrollTop=e.scrollHeight,e.addEventListener(`scroll`,r,{passive:!0}),c.observe(t),c.observe(e),()=>{c.disconnect(),e.removeEventListener(`scroll`,r)}},[]),(0,U.jsx)(Me.Provider,{value:r,children:(0,U.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[e,(0,U.jsx)(`div`,{ref:a,className:`min-h-0 flex-1 overflow-y-auto overscroll-contain`,children:(0,U.jsx)(`div`,{ref:o,className:`mx-auto flex w-full max-w-[760px] flex-col gap-3 px-3 pt-5 pb-4 sm:px-6`,children:n})}),(0,U.jsxs)(`div`,{className:`shrink-0 border-border-soft border-t bg-background`,onPointerDownCapture:()=>{s.current=!0},onKeyDownCapture:()=>{s.current=!0},children:[(0,U.jsx)(`div`,{ref:i,className:`mx-auto w-full max-w-[760px] px-3 pt-3 sm:px-6`}),t]})]})})}function J({avatar:e,lines:t}){let n=(0,H.useContext)(q),r=(0,H.useMemo)(()=>t.map(e=>({key:e.key,who:e.who,spoken:!e.bare&&!e.wide})),[t]),o=(0,H.useCallback)(e=>{let t=document.querySelector(`[data-say="${CSS.escape(e)}"]`);return t?.querySelector(`[data-say-text]`)?.getAttribute(`data-say-text`)??t?.innerText??null},[]);ce(!!n?.readAloud,n?.lang??p,r,o);let s=[];for(let e of t){let t=s.at(-1);t&&t.who===`bot`&&e.who===`bot`?t.lines.push(e):s.push({who:e.who,lines:[e]})}return s.map((t,n)=>t.who===`bot`?(0,U.jsxs)(`div`,{className:`flex items-start gap-2.5`,children:[(0,U.jsx)(`div`,{className:`sticky top-1 shrink-0 pt-0.5`,children:(0,U.jsx)(oe,{kind:e,size:30,interactive:n>=s.length-2})}),(0,U.jsx)(`div`,{className:`flex min-w-0 flex-1 flex-col items-start gap-1.5`,children:t.lines.map(e=>(0,U.jsx)(`div`,{"data-anchor":e.anchor?``:void 0,"data-say":e.key,className:h(`animate-rise`,e.bare?`w-full pt-1`:`rounded-2xl rounded-tl-md text-[0.9375rem] text-ink leading-relaxed`,!e.bare&&(e.wide?h(`w-full bg-card p-4 shadow-soft ring-1 ring-border-soft`,e.wide===`most`&&`md:w-4/5`):`max-w-[min(36rem,100%)] bg-card px-4 py-2.5 shadow-soft ring-1 ring-border-soft`),e.tone===`error`&&`bg-rose-tint text-rose shadow-none ring-0`),children:e.node},e.key))})]},t.lines[0].key):t.lines.map(e=>(0,U.jsxs)(`div`,{className:`flex animate-rise flex-col items-end gap-1 pl-10`,children:[(0,U.jsx)(`div`,{className:`max-w-[min(32rem,100%)] whitespace-pre-wrap break-words rounded-2xl rounded-br-md bg-primary px-4 py-2.5 text-[0.9375rem] text-primary-foreground leading-relaxed`,children:e.node}),e.onEdit?(0,U.jsxs)(`button`,{type:`button`,onClick:e.onEdit,className:`inline-flex items-center gap-1 px-1 text-[0.75rem] text-ink-4 transition hover:text-ink-2 coarse:min-h-9`,children:[(0,U.jsx)(i,{className:`size-3`}),` `,a(`chat.change`)]}):null]},e.key)))}function Ie(){return(0,U.jsx)(`span`,{className:`inline-flex items-center gap-1 py-1.5`,role:`status`,"aria-label":a(`run.working`),children:[0,1,2].map(e=>(0,U.jsx)(`span`,{className:`size-1.5 animate-typing rounded-full bg-ink-3`,style:{animationDelay:`${e*160}ms`}},e))})}function Y({children:e}){return(0,U.jsx)(`div`,{className:`flex flex-wrap items-center gap-2`,children:e})}var X=(e,t)=>G(e,(0,U.jsx)(Y,{children:t}),{bare:!0});function Z({onClick:e,children:t,primary:n,on:r,disabled:i,busy:a}){return(0,U.jsxs)(`button`,{type:`button`,"aria-pressed":r,disabled:i||a,onClick:e,className:h(`inline-flex h-10 items-center gap-1.5 rounded-full px-4 font-medium text-[0.875rem] transition active:scale-[0.98] disabled:pointer-events-none disabled:opacity-50 coarse:h-11`,n?`bg-primary text-primary-foreground hover:brightness-[1.06]`:r?`bg-ember-tint text-ink ring-1 ring-ember`:`bg-card text-ink-2 ring-1 ring-input hover:text-ink hover:ring-ink-4`),children:[a?(0,U.jsx)(y,{className:`size-4`}):null,t]})}function Le({initial:e=``,placeholder:t,multiline:n,inputProps:r,busy:i,disabled:o,inputRef:c,onSend:p}){let[m,g]=(0,H.useState)(e),_=(0,H.useRef)(null),v=c??_,b=(0,H.useContext)(q),x=k(m,g,{endpoint:b?`/api/runs/${b.runId}/transcribe`:void 0}),S=!!b&&x.supported&&!o;(0,H.useEffect)(()=>{if(!S)return;let e=e=>{(e.metaKey||e.ctrlKey)&&e.shiftKey&&e.key.toLowerCase()===`m`&&(e.preventDefault(),x.toggle())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[S,x.toggle]),(0,H.useEffect)(()=>{!B&&!o&&v.current?.focus()},[o,v]);let C=()=>{i||o||(x.listening&&x.toggle(),p(m)!==!1&&g(``))},w=x.listening?a(`chat.listening`):x.processing?a(`chat.transcribing`):t,T=b?.voice??null,E=!!b?.call,O=b&&!E&&(le||S||T)?(0,U.jsxs)(`div`,{className:`mb-1 flex shrink-0 items-center`,children:[T?(0,U.jsx)(l,{label:a(T.state===`live`?`talk.stop`:T.state===`connecting`?`talk.connecting`:`talk.start`),"aria-pressed":T.state===`live`,disabled:T.state===`connecting`,onClick:()=>T.state===`live`?T.stop():void T.start(),className:h(`size-9`,T.state===`live`&&`bg-rose-tint text-rose hover:bg-rose-tint hover:text-rose`,T.state===`off`&&b.talk&&`bg-primary text-primary-foreground hover:bg-primary`),children:T.state===`connecting`?(0,U.jsx)(y,{className:`size-4`}):T.state===`live`?(0,U.jsx)(se,{className:`size-4`}):(0,U.jsx)(ie,{className:`size-4`})}):null,T?.state===`live`?(0,U.jsx)(l,{label:a(T.camera?`talk.cameraOff`:`talk.camera`),"aria-pressed":T.camera,onClick:()=>T.camera?T.stopCamera():void T.startCamera(),className:h(`size-9`,T.camera&&`text-ink`),children:T.camera?(0,U.jsx)(f,{className:`size-4`}):(0,U.jsx)(V,{className:`size-4`})}):null,le?(0,U.jsx)(l,{label:a(b.readAloud?`chat.readAloudOff`:`chat.readAloud`),"aria-pressed":b.readAloud,onClick:()=>b.setReadAloud(!b.readAloud),className:h(`size-9`,b.readAloud&&`text-ink`),children:b.readAloud?(0,U.jsx)(ae,{className:`size-4`}):(0,U.jsx)(be,{className:`size-4`})}):null,S?(0,U.jsx)(l,{label:a(x.listening?`chat.dictateStop`:`chat.dictate`),"aria-pressed":x.listening,disabled:x.processing,onClick:x.toggle,className:h(`size-9`,x.listening&&`bg-rose-tint text-rose hover:bg-rose-tint hover:text-rose`),children:x.processing?(0,U.jsx)(y,{className:`size-4`}):x.listening?(0,U.jsx)(u,{className:`size-3.5 animate-pulse-dot fill-current`}):(0,U.jsx)(D,{className:`size-4`})}):null]}):null;return(0,U.jsxs)(`form`,{className:`pb-3`,onSubmit:e=>{e.preventDefault(),C()},children:[T&&!E?(0,U.jsx)(`video`,{ref:T.video,muted:!0,playsInline:!0,autoPlay:!0,className:h(`mb-2 ml-auto w-32 rounded-xl bg-black object-cover shadow-soft ring-1 ring-border-soft`,T.camera?`block`:`hidden`)}):null,(0,U.jsxs)(`div`,{className:h(`flex items-end gap-1 rounded-[1.375rem] border border-input bg-card pr-1.5 pl-1 transition focus-within:border-focus focus-within:ring-4 focus-within:ring-focus-glow`,o&&`opacity-60`),children:[O,n?(0,U.jsx)(d,{ref:v,minRows:1,maxRows:6,value:m,disabled:o,placeholder:w,autoCapitalize:`sentences`,onChange:e=>g(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&!B&&!e.nativeEvent.isComposing&&(e.preventDefault(),C())},className:`min-h-11 border-0 bg-transparent py-2.5 shadow-none focus:ring-0`}):(0,U.jsx)(`input`,{ref:v,...r,value:m,disabled:o,placeholder:w,enterKeyHint:`send`,onChange:e=>g(e.target.value),className:`h-11 min-w-0 flex-1 bg-transparent px-3 text-[0.9375rem] text-ink outline-none placeholder:text-ink-4`}),(0,U.jsx)(`button`,{type:`submit`,"aria-label":a(`chat.send`),title:a(`chat.send`),disabled:i||o,className:`mb-1 flex size-9 shrink-0 items-center justify-center rounded-full bg-primary text-primary-foreground transition hover:brightness-[1.06] disabled:opacity-40`,children:i?(0,U.jsx)(y,{className:`size-4`}):(0,U.jsx)(s,{className:`size-4`})})]}),x.error?(0,U.jsx)(`p`,{className:`mt-1.5 px-3 text-[0.75rem] text-rose`,children:x.error===`denied`?a(`chat.micDenied`):x.error}):E?null:T?.error?(0,U.jsx)(`p`,{className:`mt-1.5 px-3 text-[0.75rem] text-rose`,children:T.error}):T?.state===`live`?(0,U.jsx)(`p`,{className:`mt-1.5 px-3 text-[0.75rem] text-ink-3`,children:T.speaking?a(`talk.speaking`):T.listening?a(`talk.listening`):a(`talk.live`)}):b?.talk&&T?.state===`off`?(0,U.jsx)(`p`,{className:`mt-1.5 px-3 text-[0.75rem] text-ink-3`,children:a(`talk.hint`)}):null]})}function Q({placeholder:e=a(`chat.above`)}){return(0,U.jsx)(Pe,{children:(0,U.jsx)(Le,{disabled:!0,placeholder:e,onSend:()=>!1})})}function Re(e){let t=R[e.kind];return t===`typed`&&!e.scan?`typed`:t===`tapped`?`tapped`:`control`}var ze=e=>e==null||e===``||Array.isArray(e)&&e.length===0;function Be(e,t){let n=e.kind===`toggle`||e.kind===`connection`||e.kind===`list`;if(ze(t))return e.required&&!n?a(`chat.required`):null;let r=String(t).trim();if(e.kind===`email`&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(r))return a(`chat.badEmail`);if(e.kind===`url`)try{new URL(r)}catch{return a(`chat.badUrl`)}return e.kind===`number`&&o(r)===null?a(`chat.badNumber`):Array.isArray(t)&&e.multiple&&e.min&&t.length<e.min?a(`run.filesMin`,{n:t.length,min:e.min}):null}function Ve(e,t){let n=e.kind===`textarea`?t.replace(/\s+$/,``):t.trim();if(n)return e.kind===`url`&&!/^[a-z][a-z0-9+.-]*:/i.test(n)?`https://${n}`:n}function He({field:e}){return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`span`,{className:`font-medium`,children:e.label}),e.help?(0,U.jsx)(`span`,{className:`mt-0.5 block text-[0.8125rem] text-ink-3`,children:e.help}):null]})}function Ue({step:e,only:t}){return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`span`,{className:`font-medium`,children:e.title}),e.description?(0,U.jsx)(`span`,{className:`mt-0.5 block text-ink-2`,children:e.description}):null,t?.help?(0,U.jsx)(`span`,{className:`mt-1 block text-[0.8125rem] text-ink-3`,children:t.help}):null]})}function We({field:e,value:t,runId:n}){if(e.kind===`connection`)return(0,U.jsx)(U.Fragment,{children:typeof t==`string`&&t?t:a(`chat.connected`)});if(e.kind===`list`)return(0,U.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,U.jsx)(C,{className:`size-4`}),` `,a(`chat.checked`)]});if(e.kind===`toggle`)return(0,U.jsx)(U.Fragment,{children:a(t===!0?`run.yes`:`run.no`)});if(ze(t))return(0,U.jsx)(`span`,{className:`italic opacity-80`,children:a(`chat.skipped`)});switch(e.kind){case`multiselect`:return(0,U.jsx)(U.Fragment,{children:t.map(j).join(`, `)});case`select`:return(0,U.jsx)(U.Fragment,{children:j(String(t))});case`date`:{let e=new Date(`${String(t)}T00:00`);return(0,U.jsx)(U.Fragment,{children:Number.isNaN(e.getTime())?String(t):new Intl.DateTimeFormat(p,{dateStyle:`long`}).format(e)})}case`color`:return(0,U.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,U.jsx)(`span`,{className:`size-4 rounded-full ring-1 ring-white/50`,style:{background:String(t)}}),String(t)]});case`image`:case`signature`:return(0,U.jsx)(`span`,{className:`-mx-1.5 flex flex-wrap gap-1.5`,children:(Array.isArray(t)?t:[String(t)]).map(t=>(0,U.jsx)(`img`,{src:r(`/api/runs/${n}/assets/${t}`),alt:``,className:h(`h-16 rounded-lg bg-white`,e.kind===`image`?`w-16 object-cover`:`object-contain px-1`)},t))});case`file`:{let e=Array.isArray(t)?t.length:1;return(0,U.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,U.jsx)(M,{className:`size-4`}),` `,a(e===1?`chat.file`:`chat.files`,{n:e})]})}case`audio`:{let e=t.seconds;return(0,U.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,U.jsx)(D,{className:`size-4`}),` `,a(`chat.voice`),e?` · ${Math.round(e)} s`:``]})}case`location`:{let e=t;return(0,U.jsx)(U.Fragment,{children:e.label||`${e.lat?.toFixed(5)}, ${e.lng?.toFixed(5)}`})}case`items`:return(0,U.jsx)(U.Fragment,{children:a(`chat.rows`,{n:Array.isArray(t)?t.length:0})});default:return(0,U.jsx)(U.Fragment,{children:String(t)})}}function Ge(e,t,n,r,i,a){let o=[G(t,(0,U.jsx)(Ue,{step:e,only:a}))];for(let e of i)a||o.push(G(`${t}:${e.id}`,(0,U.jsx)(He,{field:e}))),o.push(K(`${t}:${e.id}:a`,(0,U.jsx)(We,{field:e,value:n[e.id],runId:r})));return o}var Ke=(e,t)=>e.fields.filter(e=>!e.when&&!te(e)||t[e.id]!==void 0&&t[e.id]!==null);function qe(e,t){let n=[];e.wizard.description&&n.push(G(`hello`,e.wizard.description)),e.wizard.intro&&n.push(G(`intro`,e.wizard.intro));for(let[t,r]of e.answered.entries()){let i=`${t}:${r.id}`;if(r.type===`page`){let t=r.fields.length===1?r.fields[0]:void 0;n.push(...Ge(r,i,e.values,e.id,Ke(r,e.values),t))}else r.type===`review`&&(n.push(G(i,(0,U.jsx)(`span`,{className:`font-medium`,children:r.title}))),n.push(K(`${i}:a`,a(`run.accept`))))}let r=n.at(-1);return t&&r?.who===`me`&&(n[n.length-1]={...r,onEdit:t}),n}function Je(e,t){return e.fields.filter(e=>!te(e)||t.decidedFields?.includes(e.id)).map(e=>t.options?.[e.id]?.length?{...e,options:t.options[e.id]}:e)}function Ye({view:e,run:t,step:n,before:r}){let i=(0,H.useMemo)(()=>Je(n,e),[n,e]),o=e.known??{},[s,c]=(0,H.useState)(()=>ee(n,e)),[l,u]=(0,H.useState)(()=>n.fields.some(t=>e.values[t.id]!==void 0)?g(Je(n,e),e.known??{},ee(n,e)).slice(0,-1).map(e=>e.id):[]),[d,f]=(0,H.useState)({}),[p,m]=(0,H.useState)(!1),[h,_]=(0,H.useState)(!1),v=g(i,o,s),y=v.filter(e=>l.includes(e.id)),b=v.find(e=>!l.includes(e.id)),x=i.length===1?i[0]:void 0,S=y.at(-1),C=S?()=>u(e=>e.filter(e=>e!==S.id)):void 0;(0,H.useEffect)(()=>{let e=Object.keys(t.fieldErrors),n=g(i,o,s),r=n.findIndex(t=>e.includes(t.id));r>=0&&(u(n.slice(0,r).map(e=>e.id)),f(t.fieldErrors))},[t.fieldErrors]);let w=e=>{t.submitPage(n.id,e).then(_)},T=(0,H.useContext)(q),E=(0,H.useRef)(s);E.current=s;let D=T?.bindPage,k=(0,H.useRef)(w);k.current=w,(0,H.useEffect)(()=>{if(!D)return;let e=g(i,o,s);return D({step:n,fields:e,values:s,setField:(t,n)=>{let r=e.find(e=>e.id===t);return r?Be(r,n)||(c(e=>({...e,[t]:n})),u(e=>e.includes(t)?e:[...e,t]),f({}),null):`no such field on this page`},submit:()=>k.current(E.current)}),()=>D(null)},[D,n,i,o,s]);let A=e=>{if(!b)return!1;let t=Be(b,e);if(t)return f({[b.id]:t}),!1;let n={...s,[b.id]:e},r=[...l,b.id];return c(n),u(r),f({}),g(i,o,n).some(e=>!r.includes(e.id))||w(n),!0},j=[...r.map(e=>l.length?{...e,onEdit:void 0}:e),...Ge(n,`now:${n.id}`,s,e.id,y,x).map((e,t,n)=>t===n.length-1&&e.who===`me`&&b?{...e,onEdit:C}:e)];b?(Re(b)===`control`?j.push(G(`now:${n.id}:${b.id}:control`,(0,U.jsx)(O,{field:b,value:s[b.id],values:s,runId:e.id,view:e,closed:e.closed?.[b.id],onChange:e=>c(t=>({...t,[b.id]:e})),onBusy:m}),{wide:!0})):x||j.push(G(`now:${n.id}:${b.id}`,(0,U.jsx)(He,{field:b}))),d[b.id]&&j.push(G(`now:${n.id}:${b.id}:error`,d[b.id],{tone:`error`}))):t.busy||h?j.push(G(`sending`,(0,U.jsx)(Ie,{}))):t.error&&j.push(G(`send-error`,t.error,{tone:`error`}));let M=(0,U.jsx)(Q,{});if(h||!b&&l.length>0&&t.busy)M=(0,U.jsx)(Q,{placeholder:a(`run.working`)});else if(!b)j.push(X(`now:${n.id}:go`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(Z,{primary:!0,busy:t.busy,onClick:()=>w(s),children:n.cta||a(`run.next`)}),C?(0,U.jsx)(Z,{onClick:C,disabled:t.busy,children:a(`run.back`)}):null]})));else{let r=Re(b),i=!b.required&&b.kind!==`connection`&&b.kind!==`list`?(0,U.jsx)(Z,{onClick:()=>A(void 0),children:a(`chat.skip`)}):null;if(r===`typed`){i&&j.push(X(`now:${n.id}:${b.id}:replies`,i));let e=s[b.id];M=(0,U.jsx)(Pe,{children:(0,U.jsx)(Le,{initial:ze(e)?``:String(e),multiline:b.kind===`textarea`,placeholder:b.placeholder||(x?b.label:a(`chat.placeholder`)),inputProps:Xe(b),busy:t.busy,onSend:e=>A(Ve(b,e))},b.id)})}else if(r===`tapped`)j.push(G(`now:${n.id}:${b.id}:replies`,(0,U.jsx)(Ze,{field:b,view:e,value:s[b.id],onAnswer:A}),{bare:!0}));else{let e=v.filter(e=>!l.includes(e.id)).length===1;j.push(X(`now:${n.id}:${b.id}:replies`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(Z,{primary:!0,disabled:p,onClick:()=>A(s[b.id]),children:e&&n.cta?n.cta:a(`chat.send`)}),i]})))}}return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:e.wizard.avatar,lines:j}),M]})}function Xe(e){switch(e.kind){case`number`:return{inputMode:`decimal`,autoComplete:`off`};case`email`:return{type:`email`,inputMode:`email`,autoComplete:`email`,autoCapitalize:`off`,autoCorrect:`off`,spellCheck:!1};case`url`:return{inputMode:`url`,autoComplete:`url`,autoCapitalize:`off`,autoCorrect:`off`,spellCheck:!1};case`date`:return{type:`date`};default:return z(e)}}function Ze({field:e,view:t,value:n,onAnswer:r}){let i=new Set(t.closed?.[e.id]?.values.map(String)),[o,s]=(0,H.useState)(Array.isArray(n)?n:[]);if(e.kind===`toggle`)return(0,U.jsxs)(Y,{children:[(0,U.jsx)(Z,{on:n===!1,disabled:i.has(`false`),onClick:()=>r(!1),children:a(`run.no`)}),(0,U.jsx)(Z,{on:n===!0,disabled:i.has(`true`),onClick:()=>r(!0),children:a(`run.yes`)})]});let c=e.options??[];return e.kind===`multiselect`?(0,U.jsxs)(Y,{children:[c.map(e=>(0,U.jsx)(Z,{on:o.includes(e),onClick:()=>s(t=>t.includes(e)?t.filter(t=>t!==e):c.filter(n=>n===e||t.includes(n))),children:j(e)},e)),(0,U.jsx)(Z,{primary:!0,disabled:e.required&&!o.length,onClick:()=>r(o),children:o.length||e.required?a(`chat.send`):a(`chat.skip`)})]}):(0,U.jsxs)(Y,{children:[c.map(e=>(0,U.jsx)(Z,{on:n===e,disabled:i.has(e),onClick:()=>r(e),children:j(e)},e)),e.required?null:(0,U.jsx)(Z,{onClick:()=>r(void 0),children:a(`chat.skip`)})]})}function Qe({view:e}){let t=(0,H.useMemo)(()=>[...e.events].reverse().find(t=>t.type===`step_started`&&t.stepId===e.step?.id),[e.events,e.step?.id]),n=t?new Date(t.at).getTime():Date.now(),[i,o]=(0,H.useState)(Date.now());(0,H.useEffect)(()=>{let e=setInterval(()=>o(Date.now()),1e3);return()=>clearInterval(e)},[]);let s=e.events.filter(e=>(e.type===`tool`||e.type===`info`)&&new Date(e.at).getTime()>=n-500),c=s.at(-1),l=[...s].reverse().find(et),u=[...new Set(s.map(e=>e.asset).filter(e=>!!e))];return(0,U.jsxs)(`div`,{className:h(`flex max-w-full flex-col gap-1`,l?`w-full`:`w-96`),"data-say-text":t?.message??e.step?.title??a(`run.working`),children:[(0,U.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,U.jsx)(Ie,{}),(0,U.jsx)(`span`,{className:`font-medium`,children:t?.message??e.step?.title??a(`run.working`)}),(0,U.jsx)(`span`,{className:`text-[0.75rem] text-ink-4 tabular-nums`,children:a(`run.elapsed`,{s:Math.max(0,Math.round((i-n)/1e3))})})]}),c&&c!==l?(0,U.jsxs)(`div`,{className:`flex items-center gap-1.5 text-[0.8125rem] text-ink-3`,children:[(0,U.jsx)(m,{className:`size-3.5 shrink-0 animate-breathe text-ember`}),(0,U.jsx)(`span`,{className:`truncate`,children:F(c)})]}):null,l&&e.status===`running`?(0,U.jsx)(nt,{runId:e.id,event:l}):null,u.length?(0,U.jsx)(`div`,{className:`mt-1.5 flex flex-wrap gap-1.5`,children:u.slice(-6).map(t=>(0,U.jsx)(`img`,{src:r(`/api/runs/${e.id}/assets/${t}`),alt:``,className:`size-14 rounded-lg bg-paper-2 object-cover ring-1 ring-border-soft`},t))}):null]})}var $e=new Set([`opens`,`clicks`,`clicksOn`,`types`,`typesText`,`selects`,`scrolls`,`presses`,`goesBack`,`waitsForPage`,`fastLoop`,`looksAtPage`,`personDrives`,`agentDrives`]);function et(e){return!!e.note&&$e.has(e.note.code)}var tt=1e4;function nt({runId:e,event:t}){let[n,r]=(0,H.useState)(null),[i,o]=(0,H.useState)(`agent`),[s,c]=(0,H.useState)(!1),l=t.note?.code;if((0,H.useEffect)(()=>{l===`personDrives`?o(`person`):l===`agentDrives`&&o(`agent`)},[l]),(0,H.useEffect)(()=>{let t=()=>b.get(`/api/runs/${e}/browser/seat`).then(e=>o(e.seat)).catch(()=>void 0);if(t(),i!==`person`)return;let n=setInterval(t,tt);return()=>clearInterval(n)},[e,i]),n!==null&&n>=t.id)return null;let u=i===`person`,d=async()=>{c(!0);try{let t=await b.post(`/api/runs/${e}/browser/seat`,{to:u?`agent`:`person`});o(t.seat)}catch{}finally{c(!1)}};return(0,U.jsx)(ne,{runId:e,driving:u,caption:F(t),hint:a(`browser.driving`),onBroken:()=>r(t.id),className:`mt-1.5`,action:(0,U.jsxs)(`button`,{type:`button`,disabled:s,onClick:()=>void d(),className:h(`flex h-8 items-center gap-1.5 rounded-full px-3 font-medium text-[0.8125rem] shadow-soft transition-colors disabled:opacity-60`,u?`bg-primary text-primary-foreground hover:bg-primary/90`:`bg-card/90 text-ink ring-1 ring-border-soft backdrop-blur hover:bg-card`),children:[u?(0,U.jsx)(_e,{className:`size-3.5`}):(0,U.jsx)(he,{className:`size-3.5`}),a(u?`browser.handBack`:`browser.takeOver`)]})},n??0)}function $({children:e,end:t}){return(0,U.jsxs)(`div`,{className:`mb-3 flex flex-wrap items-center justify-between gap-2`,children:[(0,U.jsx)(`h3`,{className:`font-display font-semibold text-[1rem]`,children:e}),t]})}function rt({view:e,run:t,step:n,before:r,asked:i,onNote:o}){let s=e.shown.filter(e=>e.output),[c,l]=(0,H.useState)(s.length===1?s[0].step.id:null),u=(0,H.useRef)(null),d=[...r,...i.map((e,t)=>K(`review:${n.id}:asked:${t}`,e)),G(`review:${n.id}`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`span`,{className:`font-medium`,children:n.title}),n.description?(0,U.jsx)(`span`,{className:`mt-0.5 block text-ink-2`,children:n.description}):null]}),{anchor:!0}),...s.map(({step:t,output:r})=>G(`review:${n.id}:${t.id}`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)($,{children:t.title}),(0,U.jsx)(L,{base:`/api/runs/${e.id}`,step:t,output:r,onSurfaceAction:n.regenerate?()=>{l(t.id),u.current?.focus()}:void 0})]}),{wide:!0})),...e.lists.map(t=>G(`review:${n.id}:list:${t.def.id}`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)($,{children:t.def.title}),t.def.check?(0,U.jsx)(T,{runId:e.id,list:t}):(0,U.jsx)(P,{runId:e.id,list:t,editable:!0})]}),{wide:!0}))];t.error&&d.push(G(`review-error`,t.error,{tone:`error`}));let f=n.regenerate&&s.length>0;return d.push(X(`review:${n.id}:replies`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(Z,{primary:!0,busy:t.busy,onClick:()=>void t.accept(n.id),children:[(0,U.jsx)(C,{className:`size-4`}),` `,a(`run.accept`)]}),f&&s.length>1?s.map(({step:e})=>(0,U.jsx)(Z,{on:c===e.id,onClick:()=>l(e.id),children:e.title},e.id)):null]}))),(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:e.wizard.avatar,lines:d}),f?(0,U.jsx)(Pe,{children:(0,U.jsx)(Le,{multiline:!0,inputRef:u,busy:t.busy,placeholder:s.length>1&&!c?a(`run.feedbackPick`):a(`run.feedbackPlaceholder`),disabled:!c,onSend:e=>{let r=e.trim();return!r||!c?!1:(o(r),t.regenerate(n.id,c,r),!0)}})}):(0,U.jsx)(Q,{})]})}function it({view:e,run:t,step:n,before:r,onRestart:i}){let o=e.shown.filter(e=>e.output),s=`/api/runs/${e.id}`,c=[...r,G(`result:${n.id}`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`span`,{className:`font-display font-semibold text-[1.0625rem]`,children:n.title}),n.message?(0,U.jsx)(`span`,{className:`mt-0.5 block text-ink-2`,children:n.message}):null]}),{anchor:!0}),...o.map(({step:e,output:t,formats:n,label:r})=>G(`result:${e.id}`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)($,{end:(0,U.jsx)(I,{base:s,stepId:e.id,formats:n,title:r??e.title}),children:r??e.title}),(0,U.jsx)(L,{base:s,step:e,output:t}),t?.assets?.some(e=>e.ai)?(0,U.jsx)(`p`,{className:`mt-3 text-[0.75rem] text-ink-3 leading-relaxed`,children:a(`ai.publish`)}):null]}),{wide:!0})),...e.lists.map(t=>G(`result:list:${t.def.id}`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)($,{end:(0,U.jsx)(E,{runId:e.id,list:t}),children:t.label??t.def.title}),(0,U.jsx)(P,{runId:e.id,list:t,editable:!0})]}),{wide:!0}))];return c.push(X(`result:replies`,(0,U.jsxs)(U.Fragment,{children:[o.length?(0,U.jsx)(de,{runId:e.id,title:`${n.title} · ${e.wizard.title}`,initial:e.shareUrl?{url:e.shareUrl,expiresAt:e.expiresAt}:null}):null,i?(0,U.jsxs)(Z,{onClick:i,children:[(0,U.jsx)(S,{className:`size-4`}),` `,a(`run.again`)]}):null,e.canBack?(0,U.jsx)(Z,{onClick:()=>void t.back(),disabled:t.busy,children:a(`run.back`)}):null,e.keeps?(0,U.jsx)(`span`,{className:`ml-1`,children:(0,U.jsx)(A,{runId:e.id})}):null]}))),(0,U.jsx)(J,{avatar:e.wizard.avatar,lines:c})}function at({runId:e,onRestart:t,onView:n,header:r,footer:i,talk:o=!1,call:s=!1}){let c=pe(e),{view:l}=c,[u,d]=(0,H.useState)(null),f=je(e,l,c,u);(0,H.useEffect)(()=>{n?.(l)},[l,n]);let[m,h]=fe(),g=(0,H.useMemo)(()=>({runId:e,lang:l?.lang??p,readAloud:m,setReadAloud:h,voice:l?.talk?f:null,talk:o,call:!!s,bindPage:d}),[e,l?.lang,l?.talk,m,h,f,o,s]);re(l?.status===`running`&&!l.ask),N(l);let[_,b]=(0,H.useState)({}),[x,C]=(0,H.useState)(null);(0,H.useEffect)(()=>{l&&l.status!==`running`&&C(null)},[l]);let T;if(c.notFound)T=(0,U.jsx)(`div`,{className:`py-24 text-center text-ink-3`,children:a(`run.notFound`)});else if(!l)T=(0,U.jsx)(`div`,{className:`flex justify-center py-24 text-ink-4`,children:(0,U.jsx)(y,{})});else{let e=l.step,n=l.status===`waiting_input`,r=qe(l,l.canBack&&n&&!c.busy?()=>void c.back():void 0);if(l.status===`running`&&l.ask)T=(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:l.wizard.avatar,lines:[...r,G(`ask:${l.ask.id}`,(0,U.jsx)(w,{runId:l.id,ask:l.ask}),{wide:!0})]}),(0,U.jsx)(Q,{})]});else if(l.status===`running`)T=(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:l.wizard.avatar,lines:[...r,...x?[K(`note`,x)]:[],G(`working:${e?.id}`,(0,U.jsx)(Qe,{view:l}),{wide:l.events.some(t=>t.stepId===e?.id&&et(t))?`most`:void 0})]}),(0,U.jsx)(Q,{placeholder:a(`run.working`)})]});else if(l.status===`failed`)T=(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:l.wizard.avatar,lines:[...r,G(`failed`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`span`,{className:`font-medium`,children:a(`run.failed`)}),l.error?(0,U.jsx)(`span`,{className:`mt-0.5 block`,children:(0,U.jsx)(v,{text:l.error})}):null]}),{tone:`error`}),X(`failed:replies`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(Z,{primary:!0,busy:c.busy,onClick:()=>void c.retry(),children:[(0,U.jsx)(S,{className:`size-4`}),` `,a(`run.retry`)]}),l.canBack?(0,U.jsx)(Z,{onClick:()=>void c.back(),disabled:c.busy,children:a(`run.back`)}):null]}))]}),(0,U.jsx)(Q,{})]});else if(l.status===`cancelled`)T=(0,U.jsx)(J,{avatar:l.wizard.avatar,lines:[...r,G(`cancelled`,a(`run.cancelled`)),...t?[X(`cancelled:replies`,(0,U.jsxs)(Z,{primary:!0,onClick:t,children:[(0,U.jsx)(S,{className:`size-4`}),` `,a(`run.again`)]}))]:[]]});else if(e?.type===`page`)T=(0,U.jsx)(Ye,{view:l,run:c,step:e,before:r},e.id);else if(e?.type===`review`){let t=l.shown.map(e=>e.output?.at??``).join(`|`);T=(0,U.jsx)(rt,{view:l,run:c,step:e,before:r,asked:_[e.id]??[],onNote:t=>{C(t),b(n=>({...n,[e.id]:[...n[e.id]??[],t]}))}},`${e.id}:${t}`)}else T=e?.type===`result`?(0,U.jsx)(it,{view:l,run:c,step:e,before:r,onRestart:t}):(0,U.jsx)(J,{avatar:l.wizard.avatar,lines:r})}return s?(0,U.jsx)(q.Provider,{value:g,children:(0,U.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col lg:flex-row`,children:[(0,U.jsx)(Te,{voice:f,view:l,video:s===`video`,className:`h-[46dvh] shrink-0 lg:h-auto lg:min-h-0 lg:flex-1`}),(0,U.jsx)(`aside`,{className:`flex min-h-0 flex-1 flex-col border-border-soft border-t lg:w-[420px] lg:flex-none lg:border-t-0 lg:border-l`,children:(0,U.jsx)(Fe,{footer:i,children:T})})]})}):(0,U.jsx)(q.Provider,{value:g,children:(0,U.jsx)(Fe,{header:r,footer:i,children:T})})}export{J as a,Z as i,Fe as n,X as o,Q as r,Ne as s,at as t};