wizards 0.5.13 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/apps/runtime/dist/authoring/guide.js +63 -7
  2. package/apps/runtime/dist/credits/estimate.js +1 -1
  3. package/apps/runtime/dist/engine/requirements.js +1 -1
  4. package/apps/runtime/dist/engine/runner.js +53 -4
  5. package/apps/runtime/dist/engine/steps.js +155 -123
  6. package/apps/runtime/dist/render/downloads.js +16 -3
  7. package/apps/runtime/dist/render/shaped.js +137 -0
  8. package/apps/runtime/dist/routes/runs.js +58 -2
  9. package/apps/runtime/dist/services/brand.js +2 -1
  10. package/apps/runtime/dist/widgets/runtime.js +25 -2
  11. package/apps/runtime/dist/widgets/step.js +2 -0
  12. package/apps/web/dist/assets/AboutDialog-xOyf_juP.js +1 -0
  13. package/apps/web/dist/assets/{ChangelogDialog-BCS3WIRA.js → ChangelogDialog-vNG0Smoo.js} +1 -1
  14. package/apps/web/dist/assets/ChatView-BrDkurRe.js +10 -0
  15. package/apps/web/dist/assets/EditorPage-97U-JYKn.js +3 -0
  16. package/apps/web/dist/assets/{FlowPreview-D2haAZwo.js → FlowPreview-DA0sHtr7.js} +1 -1
  17. package/apps/web/dist/assets/{Harness-CGI6ZMTA.js → Harness-Y9E7o83r.js} +2 -2
  18. package/apps/web/dist/assets/{NewWizardChannels-C4b_phHw.js → NewWizardChannels-D6v1iDOo.js} +1 -1
  19. package/apps/web/dist/assets/NewWizardPage-BzaAPMUK.js +7 -0
  20. package/apps/web/dist/assets/{OnboardingPage-DgySdBgo.js → OnboardingPage-9xZAkhuO.js} +1 -1
  21. package/apps/web/dist/assets/ProjectPage-dQ7wwxD2.js +1 -0
  22. package/apps/web/dist/assets/PublicRunner-CKa8M0Qd.js +1 -0
  23. package/apps/web/dist/assets/{ReadOnly-B-4l3bVt.js → ReadOnly-Bqk14yPD.js} +1 -1
  24. package/apps/web/dist/assets/RunDrawer-DsfZUojZ.js +4 -0
  25. package/apps/web/dist/assets/{RunnerView-BZ83HUnO.js → RunnerView-D0JQ1fgM.js} +1 -1
  26. package/apps/web/dist/assets/SettingsPage-Dzu6Fl6b.js +1 -0
  27. package/apps/web/dist/assets/SetupPage-D2Kl-8NR.js +1 -0
  28. package/apps/web/dist/assets/SharePage-QSZxUlPt.js +1 -0
  29. package/apps/web/dist/assets/changelog-XlAAw5Gv.js +1 -0
  30. package/apps/web/dist/assets/{esm-BqbWrbsa.js → esm-DqRvG-PU.js} +1 -1
  31. package/apps/web/dist/assets/index-BhVJwBz7.css +1 -0
  32. package/apps/web/dist/assets/index-mwmrgVFT.js +14 -0
  33. package/apps/web/dist/assets/{lock-BkN0Fai6.js → lock-D_KjsGfU.js} +1 -1
  34. package/apps/web/dist/assets/{phone-Dip_wSUZ.js → phone-YRxkPQk6.js} +1 -1
  35. package/apps/web/dist/assets/{settings-menu-B7eXkvba.js → settings-menu-CQgehwEX.js} +1 -1
  36. package/apps/web/dist/assets/ui-DDUCc_4v.js +137 -0
  37. package/apps/web/dist/assets/{upload-DPQ4pwnl.js → upload-DDo14e2p.js} +1 -1
  38. package/apps/web/dist/index.html +3 -3
  39. package/apps/web/dist/mcp/flow.html +58 -55
  40. package/node_modules/@engenty-wizards/plugin-sdk/dist/index.d.ts +5 -2
  41. package/node_modules/@engenty-wizards/shared/dist/definition.d.ts +187 -3
  42. package/node_modules/@engenty-wizards/shared/dist/definition.js +89 -18
  43. package/node_modules/@engenty-wizards/shared/dist/projects.d.ts +11 -0
  44. package/node_modules/@engenty-wizards/shared/dist/projects.js +54 -0
  45. package/node_modules/@engenty-wizards/shared/dist/run.d.ts +22 -0
  46. package/node_modules/@engenty-wizards/shared/dist/run.js +3 -0
  47. package/node_modules/@engenty-wizards/shared/dist/runner-texts.d.ts +41 -1
  48. package/node_modules/@engenty-wizards/shared/dist/runner-texts.js +40 -0
  49. package/node_modules/@engenty-wizards/shared/dist/runners.js +1 -1
  50. package/node_modules/@engenty-wizards/shared/dist/shape.d.ts +102 -0
  51. package/node_modules/@engenty-wizards/shared/dist/shape.js +318 -0
  52. package/node_modules/@engenty-wizards/shared/dist/surface.d.ts +33 -7
  53. package/node_modules/@engenty-wizards/shared/dist/surface.js +263 -20
  54. package/package.json +1 -1
  55. package/apps/web/dist/assets/AboutDialog-CkE7uZNL.js +0 -1
  56. package/apps/web/dist/assets/ChatView-DClGzMte.js +0 -10
  57. package/apps/web/dist/assets/EditorPage-Dg27sIZ7.js +0 -3
  58. package/apps/web/dist/assets/NewWizardPage-DhDXrjKX.js +0 -7
  59. package/apps/web/dist/assets/ProjectPage-dvtJn_3c.js +0 -1
  60. package/apps/web/dist/assets/PublicRunner-lP4sVF1q.js +0 -1
  61. package/apps/web/dist/assets/RunDrawer-B2bsB9Z6.js +0 -4
  62. package/apps/web/dist/assets/SettingsPage-C0_wAa_j.js +0 -1
  63. package/apps/web/dist/assets/SetupPage-kuvBk0G0.js +0 -1
  64. package/apps/web/dist/assets/SharePage-COLVxXMI.js +0 -1
  65. package/apps/web/dist/assets/changelog-CIYdRaa5.js +0 -1
  66. package/apps/web/dist/assets/index-Da9Pvzpj.js +0 -14
  67. package/apps/web/dist/assets/index-DaKjB676.css +0 -1
  68. package/apps/web/dist/assets/ui-B9AOCT0v.js +0 -134
@@ -7,6 +7,7 @@ import { extFor, inlineAssetRefs, loadAsset, loadAssetText, saveAsset } from "..
7
7
  import { widgetMp4, widgetPdf, widgetPng } from "../widgets/render.js";
8
8
  import { allTables, firstTable, htmlToDocx, htmlToMarkdown, htmlToPdf, htmlToPng, jsonToMarkdown, MIME, markdownToHtml, tablesToXlsx, tableToCsv, } from "./convert.js";
9
9
  import { guardHtml } from "./guard.js";
10
+ import { shapedCsvRows, shapedMarkdown, shapedTables } from "./shaped.js";
10
11
  export function slug(s) {
11
12
  return (s
12
13
  .toLowerCase()
@@ -155,8 +156,14 @@ export async function renderDownload(step, output, format, baseName) {
155
156
  }
156
157
  const text = output.text ?? "";
157
158
  if (step.output.format === "json") {
158
- const rows = firstTable(output.json);
159
- const tables = allTables(output.json);
159
+ // A step with a schema: its lists by their labels, the tree as headings.
160
+ const shape = step.output.schema;
161
+ const data = (output.json ?? {});
162
+ const rows = shape ? shapedCsvRows(shape, data) : firstTable(output.json);
163
+ const tables = shape ? shapedTables(shape, data) : allTables(output.json);
164
+ const md = shape
165
+ ? `# ${baseName}\n\n${shapedMarkdown(shape, data)}`
166
+ : jsonAsMarkdown(output.json);
160
167
  switch (format) {
161
168
  case "json":
162
169
  return {
@@ -171,7 +178,13 @@ export async function renderDownload(step, output, format, baseName) {
171
178
  ? { data: await tablesToXlsx(tables), mime: MIME.xlsx, filename: file("xlsx") }
172
179
  : null;
173
180
  case "md":
174
- return { data: jsonAsMarkdown(output.json), mime: MIME.md, filename: file("md") };
181
+ return { data: md, mime: MIME.md, filename: file("md") };
182
+ case "pdf":
183
+ return {
184
+ data: await htmlToPdf(markdownToHtml(md, baseName)),
185
+ mime: MIME.pdf,
186
+ filename: file("pdf"),
187
+ };
175
188
  default:
176
189
  return null;
177
190
  }
@@ -0,0 +1,137 @@
1
+ import { labelOf, titleKey, } from "@engenty-wizards/shared/shape";
2
+ const isEntry = (v) => Boolean(v) && typeof v === "object" && !Array.isArray(v);
3
+ /** A value that fits in a cell or a line: no lists of entries, no objects. */
4
+ const flat = (s) => s.kind !== "object" && s.kind !== "table" && !(s.kind === "list" && s.of.kind === "object");
5
+ /** An entry's title: its first short text. */
6
+ function titleOf(shape, entry) {
7
+ const key = titleKey(shape);
8
+ return key ? String(entry[key] ?? "") : "";
9
+ }
10
+ /** A flat value as words. */
11
+ function words(s, value, root, data) {
12
+ if (value === null || value === undefined) {
13
+ return "";
14
+ }
15
+ switch (s.kind) {
16
+ case "yesno":
17
+ return value ? (s.yes ?? "✓") : (s.no ?? "–");
18
+ case "number":
19
+ return `${value}${s.unit ? ` ${s.unit}` : ""}`;
20
+ case "ref": {
21
+ const target = root.fields[s.to];
22
+ const list = Array.isArray(data[s.to]) ? data[s.to] : [];
23
+ const hit = list.find((e) => isEntry(e) && e.id === value);
24
+ return target?.kind === "list" && target.of.kind === "object" && isEntry(hit)
25
+ ? titleOf(target.of, hit) || String(value)
26
+ : String(value);
27
+ }
28
+ case "list":
29
+ return Array.isArray(value) ? value.map((v) => words(s.of, v, root, data)).join(", ") : "";
30
+ default:
31
+ return typeof value === "object" ? JSON.stringify(value) : String(value);
32
+ }
33
+ }
34
+ /** One row of a sheet: flat values by label; a list of entries as their titles. */
35
+ function rowOf(shape, entry, root, data) {
36
+ const row = {};
37
+ for (const [k, f] of Object.entries(shape.fields)) {
38
+ const v = entry[k];
39
+ if (f.kind === "list" && f.of.kind === "object") {
40
+ const of = f.of;
41
+ row[labelOf(k, f)] = Array.isArray(v)
42
+ ? v
43
+ .map((e) => (isEntry(e) ? titleOf(of, e) : ""))
44
+ .filter(Boolean)
45
+ .join("; ")
46
+ : "";
47
+ }
48
+ else if (f.kind === "number" && typeof v === "number") {
49
+ row[labelOf(k, f)] = v;
50
+ }
51
+ else if (flat(f)) {
52
+ row[labelOf(k, f)] = words(f, v, root, data);
53
+ }
54
+ }
55
+ return row;
56
+ }
57
+ /** One sheet per top-level list, named by its label. */
58
+ export function shapedTables(shape, data) {
59
+ const out = [];
60
+ for (const [k, f] of Object.entries(shape.fields)) {
61
+ const value = Array.isArray(data[k]) ? data[k] : [];
62
+ if (f.kind !== "list" || !value.length) {
63
+ continue;
64
+ }
65
+ const of = f.of;
66
+ const rows = of.kind === "object"
67
+ ? value.filter(isEntry).map((e) => rowOf(of, e, shape, data))
68
+ : value.map((v) => ({ [labelOf(k, f)]: words(of, v, shape, data) }));
69
+ out.push({ name: labelOf(k, f), rows });
70
+ }
71
+ return out;
72
+ }
73
+ /** The rows of the first top-level list whose entries are flat: what a CSV holds. */
74
+ export function shapedCsvRows(shape, data) {
75
+ for (const [k, f] of Object.entries(shape.fields)) {
76
+ if (f.kind === "list" &&
77
+ f.of.kind === "object" &&
78
+ Object.values(f.of.fields).every(flat) &&
79
+ Array.isArray(data[k])) {
80
+ const of = f.of;
81
+ return data[k].filter(isEntry).map((e) => rowOf(of, e, shape, data));
82
+ }
83
+ }
84
+ return null;
85
+ }
86
+ const cellText = (v) => String(v ?? "")
87
+ .replace(/\|/g, "\\|")
88
+ .replace(/\n/g, " ");
89
+ /** The tree as Markdown: a heading per part and per entry with lists of its own, tables for flat entries. */
90
+ export function shapedMarkdown(shape, data) {
91
+ return objectMarkdown(shape, data, 2, shape, data);
92
+ }
93
+ const h = (n) => "#".repeat(Math.min(6, n));
94
+ function objectMarkdown(shape, value, depth, root, data) {
95
+ const parts = [];
96
+ const short = [];
97
+ // An entry under its title as a heading says neither the title nor its id again.
98
+ const skip = shape === root ? [] : ["id", titleKey(shape)];
99
+ for (const [k, f] of Object.entries(shape.fields)) {
100
+ const v = value[k];
101
+ const label = labelOf(k, f);
102
+ if (v === undefined || v === null || v === "" || skip.includes(k)) {
103
+ continue;
104
+ }
105
+ if (f.kind === "text" && f.long) {
106
+ parts.push(`${h(depth)} ${label}\n\n${String(v)}`);
107
+ }
108
+ else if (f.kind === "list" && Array.isArray(v)) {
109
+ parts.push(`${h(depth)} ${label}\n\n${listMarkdown(f, v, depth + 1, root, data)}`);
110
+ }
111
+ else if (flat(f)) {
112
+ short.push(`**${label}:** ${words(f, v, root, data)}`);
113
+ }
114
+ }
115
+ return [short.join(" \n"), ...parts].filter(Boolean).join("\n\n");
116
+ }
117
+ function listMarkdown(f, value, depth, root, data) {
118
+ const of = f.of;
119
+ if (of.kind !== "object") {
120
+ return value.map((v) => `- ${words(of, v, root, data)}`).join("\n");
121
+ }
122
+ const entries = value.filter(isEntry);
123
+ if (Object.values(of.fields).every(flat)) {
124
+ const cols = Object.entries(of.fields);
125
+ return [
126
+ `| ${cols.map(([c, s]) => cellText(labelOf(c, s))).join(" | ")} |`,
127
+ `| ${cols.map(() => "---").join(" | ")} |`,
128
+ ...entries.map((e) => `| ${cols.map(([c, s]) => cellText(words(s, e[c], root, data))).join(" | ")} |`),
129
+ ].join("\n");
130
+ }
131
+ return entries
132
+ .map((e, i) => {
133
+ const title = titleOf(of, e) || `${of.label ?? f.label ?? ""} ${i + 1}`.trim();
134
+ return `${h(depth)} ${title}\n\n${objectMarkdown(of, e, depth + 1, root, data)}`;
135
+ })
136
+ .join("\n\n");
137
+ }
@@ -21,7 +21,7 @@ import { fieldErrorsIn } from "../engine/input.js";
21
21
  import { fromOwner } from "../engine/owner.js";
22
22
  import { pushAvailable, setPushDevice } from "../engine/push.js";
23
23
  import { liveResources } from "../engine/resources.js";
24
- import { cancel, createRun, goBack, NoCreditsError, projectIdOf, RunConflict, RunInputError, retry, reviewStep, runView, submitPage, talkAllowed, } from "../engine/runner.js";
24
+ import { cancel, createRun, editOutput, goBack, NoCreditsError, projectIdOf, RunConflict, RunInputError, retry, reviewStep, runView, submitPage, talkAllowed, } from "../engine/runner.js";
25
25
  import { basePath, env } from "../env.js";
26
26
  import { loadAsset, saveAsset } from "../files/storage.js";
27
27
  import { reverseGeocode } from "../geocode.js";
@@ -110,6 +110,8 @@ function visitorId(c, create, embedded = false) {
110
110
  * the owner's AI app with its run ticket, or — on the read-only file routes — a signed link
111
111
  * handed out to the owner's MCP client.
112
112
  */
113
+ /** A view's kept state stays small: ticks and choices, not data. */
114
+ const MAX_VIEW_STATE = 32_000;
113
115
  async function accessibleRun(c, runId, opts = {}) {
114
116
  const run = await db.query.run.findFirst({ where: eq(schema.run.id, runId) });
115
117
  if (!run) {
@@ -560,6 +562,54 @@ export const runRoutes = new Hono()
560
562
  catch (err) {
561
563
  return commandError(c, err);
562
564
  }
565
+ })
566
+ // What the person did in a step's view — a checklist's ticks, a widget's state — kept with the
567
+ // run, so the next visit shows it. Only while the run waits or is done: a running step owns
568
+ // the state then.
569
+ .put("/:id/views/:stepId", async (c) => {
570
+ const run = await accessibleRun(c, c.req.param("id"));
571
+ const stepId = c.req.param("stepId");
572
+ const output = run?.state.outputs[stepId];
573
+ if (!run || !output) {
574
+ return c.json(notFoundAnswer(c), 404);
575
+ }
576
+ if (run.status !== "waiting_input" && run.status !== "done") {
577
+ return c.json({ error: "busy" }, 409);
578
+ }
579
+ const { state } = z
580
+ .object({ state: z.record(z.string(), z.unknown()) })
581
+ .parse(await c.req.json());
582
+ if (JSON.stringify(state).length > MAX_VIEW_STATE) {
583
+ return c.json({ error: "too large" }, 413);
584
+ }
585
+ await db
586
+ .update(schema.run)
587
+ .set({
588
+ state: {
589
+ ...run.state,
590
+ outputs: { ...run.state.outputs, [stepId]: { ...output, view: state } },
591
+ },
592
+ })
593
+ .where(eq(schema.run.id, run.id));
594
+ return c.json({ ok: true });
595
+ })
596
+ // A json step's data, edited in the studio by someone of the team the run belongs to.
597
+ .put("/:id/outputs/:stepId", async (c) => {
598
+ const run = await accessibleRun(c, c.req.param("id"));
599
+ const user = await principalOf(c);
600
+ if (!run || !user || user.tenantId !== run.tenantId) {
601
+ return c.json(notFoundAnswer(c), 404);
602
+ }
603
+ const { json } = z
604
+ .object({ json: z.record(z.string(), z.unknown()) })
605
+ .parse(await c.req.json());
606
+ try {
607
+ await editOutput(run.id, c.req.param("stepId"), json);
608
+ return c.json({ ok: true });
609
+ }
610
+ catch (err) {
611
+ return commandError(c, err);
612
+ }
563
613
  })
564
614
  .post("/:id/reviews/:stepId", async (c) => {
565
615
  const run = await accessibleRun(c, c.req.param("id"));
@@ -568,7 +618,13 @@ export const runRoutes = new Hono()
568
618
  }
569
619
  const action = z
570
620
  .discriminatedUnion("type", [
571
- z.object({ type: z.literal("accept"), edits: z.record(z.string(), z.string()).optional() }),
621
+ z.object({
622
+ type: z.literal("accept"),
623
+ // A text, or the data of a json step (checked against its schema).
624
+ edits: z
625
+ .record(z.string(), z.union([z.string(), z.record(z.string(), z.unknown())]))
626
+ .optional(),
627
+ }),
572
628
  z.object({
573
629
  type: z.literal("regenerate"),
574
630
  target: z.string(),
@@ -1,4 +1,4 @@
1
- import { GRADIENT_TYPES, gradientCss, mainLogo, } from "@engenty-wizards/shared/projects";
1
+ import { GRADIENT_TYPES, gradientCss, mainLogo, runTheme, } from "@engenty-wizards/shared/projects";
2
2
  import { note } from "@engenty-wizards/shared/run";
3
3
  import { generateText, Output } from "ai";
4
4
  import { and, asc, eq } from "drizzle-orm";
@@ -24,6 +24,7 @@ export async function brandView(projectId) {
24
24
  name: p?.brand.name ?? "",
25
25
  accent: p?.brand.colors?.[0]?.value ?? null,
26
26
  logoUrl: logo ? `/api/public/logos/${logo}` : null,
27
+ theme: runTheme(p?.brand ?? {}),
27
28
  };
28
29
  }
29
30
  const HEX = /^#[0-9a-f]{6}$/i;
@@ -3,8 +3,12 @@
3
3
  * widget's own scripts; reads its payload from <script type="application/json" id="wizard-payload">.
4
4
  *
5
5
  * wizard.data the run's data (keys from the widget step's `data` map)
6
- * wizard.brand { name, accent, logo, colors, facts } — logo as a data URL or null,
7
- * colors [{ name, value }], facts { key: value }
6
+ * wizard.brand { name, accent, logo, colors, facts, theme } — logo as a data URL or
7
+ * null, colors [{ name, value }], facts { key: value }, theme { accent,
8
+ * second, background, display, body, dark } as the run page uses it
9
+ * wizard.state what the person did last time (ticks, an open tab), kept with the run
10
+ * wizard.save(state) keeps `state` with the run (small JSON); the next visit reads it
11
+ * wizard.share(text) hands text to the device's share sheet (or copies it)
8
12
  * wizard.ai "generated" | "edited" when the run's media in `data` was made or
9
13
  * changed by a model, else null — a film labels itself with it
10
14
  * wizard.mode "view" in the browser, "export" while a PNG/PDF/MP4 is rendered
@@ -62,6 +66,14 @@ export const WIDGET_RUNTIME = `(function () {
62
66
  if (!f) return "";
63
67
  return "data:" + f.mime + ";base64," + (f.b64 != null ? f.b64 : utf8ToB64(f.text));
64
68
  },
69
+ state: window.__WIZARD_STATE || {},
70
+ save: function (state) {
71
+ this.state = state;
72
+ if (parent !== window) parent.postMessage({ wizard: "state", state: state }, "*");
73
+ },
74
+ share: function (text) {
75
+ if (parent !== window) parent.postMessage({ wizard: "share", text: String(text) }, "*");
76
+ },
65
77
  ready: function () { resolveReady(); },
66
78
  timeline: function (t) {
67
79
  if (t && typeof t.seek === "function" && t.duration > 0) timeline = t;
@@ -73,6 +85,16 @@ export const WIDGET_RUNTIME = `(function () {
73
85
  // widgets that fit themselves to the window would stay at scale 0. Fire it for them.
74
86
  var lastW = innerWidth, lastH = innerHeight;
75
87
  addEventListener("resize", function () { lastW = innerWidth; lastH = innerHeight; });
88
+ // A widget laid out as part of the page tells the page how tall its content is.
89
+ var lastTall = 0;
90
+ function tell() {
91
+ var tall = Math.ceil(document.documentElement.scrollHeight);
92
+ if (parent !== window && tall !== lastTall) {
93
+ lastTall = tall;
94
+ parent.postMessage({ wizard: "height", height: tall }, "*");
95
+ }
96
+ }
97
+ addEventListener("load", tell);
76
98
  if (window.ResizeObserver) {
77
99
  new ResizeObserver(function () {
78
100
  if (innerWidth !== lastW || innerHeight !== lastH) {
@@ -80,6 +102,7 @@ export const WIDGET_RUNTIME = `(function () {
80
102
  lastH = innerHeight;
81
103
  dispatchEvent(new Event("resize"));
82
104
  }
105
+ tell();
83
106
  }).observe(document.documentElement);
84
107
  }
85
108
  })();`;
@@ -1,4 +1,5 @@
1
1
  import { allFields, dataRef, widgetSize, } from "@engenty-wizards/shared/definition";
2
+ import { runTheme } from "@engenty-wizards/shared/projects";
2
3
  import { note } from "@engenty-wizards/shared/run";
3
4
  import { resolveRef } from "../engine/template.js";
4
5
  import { StepError } from "../engine/types.js";
@@ -19,6 +20,7 @@ export async function widgetBrand(project) {
19
20
  logo: logo ? `data:${logo.row.mime};base64,${logo.data.toString("base64")}` : null,
20
21
  colors,
21
22
  facts: Object.fromEntries(project.facts.filter((f) => f.value.trim()).map((f) => [f.key, f.value])),
23
+ theme: runTheme(project.brand),
22
24
  };
23
25
  }
24
26
  /** A widget inlines media up to this size; a film gets its media from the renderer instead. */
@@ -0,0 +1 @@
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,In as a,It as o,Kt as s,Nt as c,Pt as l,Vt as u,Wt as d,fr as f,or as p}from"./ui-DDUCc_4v.js";import{t as m}from"./preload-helper-CNEI7N0N.js";import{G as h,U as g,W as _,bt as v}from"./index-mwmrgVFT.js";import{c as y,f as b}from"./settings-menu-CQgehwEX.js";import{ReleaseNotes as x,loadReleases as S,releaseDate as C,releaseLabel as w}from"./ChangelogDialog-vNG0Smoo.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:`agentOS`,description:`credit.agentos`,homepage:`https://github.com/rivet-dev/agentos`,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,a]=(0,T.useState)(``);(0,T.useEffect)(()=>{if(!e||t)return;let r=!1;return m(()=>import(`./oss-credits-BJrR7BR1.js`).then(e=>{r||n(e.default)}),[]),()=>{r=!0}},[e,t]),(0,T.useEffect)(()=>{e||a(``)},[e]);let s=i.trim().toLowerCase(),c=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=c(E),p=c(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)(o,{type:`search`,value:i,placeholder:r(`about.search`),onChange:e=>a(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)(l,{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 o=n?.mode===`local`,{data:l,latest:p}=h(o&&e),[m,E]=(0,T.useState)(null),[D,k]=(0,T.useState)(`new`),A=b(F.indexOf(D)),j=l?.newer&&p?p:_;(0,T.useEffect)(()=>{if(!e)return;let t=!1;return E(null),S(j===`0.6.0`?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=o?l?.kind??null:`cloud`;return(0,O.jsxs)(c,{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)(a,{className:`size-4`})})}),(0,O.jsxs)(`div`,{className:`flex flex-col items-center pt-4 text-center`,children:[(0,O.jsx)(v,{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:_}),R?` · ${r(`about.kind.${R}`)}`:``]})]}),o?(0,O.jsx)(`div`,{className:`mt-5`,children:(0,O.jsx)(g,{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:s(`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 +1 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-BNakU3Ej.js";import{At as r,Nt as i,Rt as a,Ut as o,Xt as s,jt as c}from"./ui-B9AOCT0v.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/,``):s(`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-CIYdRaa5.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:o(`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:s(`about.breaking`)}):null]})]},e.id)})})}function y({open:e,onClose:t,version:n}){let[o,l]=(0,u.useState)(null),[f,h]=(0,u.useState)(``);(0,u.useEffect)(()=>{if(!e||o)return;let t=!1;return _(n).then(e=>{t||l(e)}),()=>{t=!0}},[e,o,n]),(0,u.useEffect)(()=>{e||h(``)},[e]);let y=o?g(o,f):[];return(0,d.jsxs)(r,{open:e,onClose:t,title:s(`about.changelog`),wide:!0,height:`tall`,children:[(0,d.jsx)(`p`,{className:`-mt-3 mb-4 text-[0.875rem] text-ink-3`,children:s(`about.changelogHint`)}),o===null?(0,d.jsx)(`div`,{className:`flex justify-center py-10 text-ink-3`,children:(0,d.jsx)(a,{})}):o.length===0?(0,d.jsx)(c,{children:s(`about.changelogEmpty`)}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(i,{type:`search`,value:f,placeholder:s(`about.search`),onChange:e=>h(e.target.value)}),y.length===0?(0,d.jsx)(c,{children:s(`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
+ 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-DDUCc_4v.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-XlAAw5Gv.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};
@@ -0,0 +1,10 @@
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,Ft as s,Gt as c,Jn as l,Jt as u,Kt as d,Ln as f,Nn as p,Nr as m,Rt as h,Sr as g,Vn as _,Vt as v,W as y,Wn as b,Zn as x,bt as S,dt as C,ft as w,hr as T,lt as E,mt as D,nn as O,nt as k,p as A,pt as j,qt as M,rt as N,st as P,tt as F,un as I,ut as L,vr as ee,vt as R,wn as z,xt as te,yt as ne,zn as re}from"./ui-DDUCc_4v.js";import{t as ie}from"./phone-YRxkPQk6.js";import{$ as ae,Pt as oe,Q as se,St as ce,Z as le,ht as ue,jt as de,t as fe}from"./index-mwmrgVFT.js";import{n as pe}from"./RunnerView-D0JQ1fgM.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=g(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=g(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 ye=g(ve),be={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`}]]};be.node;var xe=g(be),Se=m(),B=e(t(),1),V=e(n(),1),Ce=typeof window<`u`&&window.matchMedia(`(pointer: coarse)`).matches;function we({since:e}){let[t,n]=(0,B.useState)(Date.now());if((0,B.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,V.jsxs)(`span`,{className:`font-mono text-[0.8125rem] text-white/60 tabular-nums`,children:[i,`:`,a]})}function H({label:e,on:t,danger:n,busy:r,onClick:i,children:a}){return(0,V.jsx)(`button`,{type:`button`,"aria-label":e,title:e,"aria-pressed":t,disabled:r,onClick:i,className:d(`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,V.jsx)(v,{className:`size-5`}):a})}function Te({voice:e}){let t=(0,B.useRef)(null),{captions:n}=e;return(0,B.useEffect)(()=>{n.length&&t.current?.scrollIntoView({block:`end`})},[n]),n.length?(0,V.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-4 sm:px-5`,children:(0,V.jsxs)(`ol`,{className:`mx-auto flex max-w-[720px] flex-col gap-2 py-2`,children:[n.map(e=>(0,V.jsx)(`li`,{className:d(`text-[0.9375rem] leading-snug`,e.who===`bot`?`text-white/95`:`text-right text-white/50`),children:e.text},e.id)),(0,V.jsx)(`div`,{ref:t})]})}):null}function Ee({voice:e,view:t,video:n,className:r}){let o=e.state===`live`,s=e.state===`connecting`,[c,l]=(0,B.useState)(null),[u,p]=(0,B.useState)(!1);(0,B.useEffect)(()=>{l(o?Date.now():null)},[o]);let m=async()=>{p(!1),await e.start(),n&&await e.startCamera()},h=()=>{e.stop(),p(!0)},g=n||e.camera,_=[...e.captions].reverse().find(e=>e.who===`bot`),y=[...e.captions].reverse().find(e=>e.who===`me`),b=e.speaking?a(`talk.speaking`):e.listening?a(`talk.listening`):o?a(`talk.live`):s?a(`talk.connecting`):u?a(`video.ended`):``;return(0,V.jsxs)(`section`,{className:d(`relative flex min-h-0 flex-col bg-neutral-950 text-white`,`safe-top`,r),children:[(0,V.jsxs)(`div`,{className:`flex h-14 shrink-0 items-center gap-3 px-4 sm:px-5`,children:[(0,V.jsx)(`div`,{className:`min-w-0 flex-1 truncate font-display font-semibold text-[1rem] tracking-tight`,children:t?.wizard.title??``}),b?(0,V.jsxs)(`span`,{className:`flex items-center gap-1.5 text-[0.8125rem] text-white/70`,children:[o?(0,V.jsx)(`span`,{className:d(`size-2 rounded-full`,e.speaking?`animate-pulse-dot bg-emerald-400`:`bg-rose`)}):null,b]}):null,(0,V.jsx)(we,{since:c})]}),(0,V.jsxs)(`div`,{className:d(`grid min-h-0 gap-2 px-3 pb-2 sm:px-4`,g?`flex-1 grid-cols-1 sm:grid-cols-2`:`shrink-0 grid-cols-1`,!g&&o&&e.captions.length?`h-[38%]`:g?``:`flex-1`),children:[(0,V.jsxs)(`div`,{className:d(`relative min-h-0 overflow-hidden rounded-2xl bg-neutral-900`,!g&&`hidden`),children:[(0,V.jsx)(`video`,{ref:e.video,muted:!0,playsInline:!0,autoPlay:!0,className:d(`absolute inset-0 h-full w-full object-cover`,e.facing===`user`&&`-scale-x-100`,e.camera?`block`:`hidden`)}),e.camera?null:(0,V.jsxs)(`div`,{className:`absolute inset-0 flex flex-col items-center justify-center gap-2 text-white/50`,children:[(0,V.jsx)(ye,{className:`size-8`}),(0,V.jsx)(`span`,{className:`text-[0.8125rem]`,children:a(`video.cameraOff`)})]}),(0,V.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,V.jsx)(oe,{className:`ml-1.5 inline size-3`}):null]})]}),(0,V.jsxs)(`div`,{className:d(`relative flex min-h-0 items-center justify-center overflow-hidden rounded-2xl transition-shadow`,g?`bg-neutral-900`:`bg-transparent`,g&&e.speaking&&`ring-2 ring-emerald-400/70`),children:[(0,V.jsx)(`div`,{className:d(`rounded-full transition-shadow duration-500`,!g&&e.listening&&`shadow-[0_0_80px_20px_rgba(244,63,94,0.25)]`,!g&&e.speaking&&`shadow-[0_0_80px_20px_rgba(52,211,153,0.3)]`,e.speaking&&`animate-breathe`),children:(0,V.jsx)(ue,{kind:t?.wizard.avatar??`round`,size:g?140:200,fluffy:!0,interactive:!1})}),g?(0,V.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]})]}),o&&!g?(0,V.jsx)(Te,{voice:e}):o&&(_||y)?(0,V.jsx)(`div`,{className:`shrink-0 px-4 pb-2 sm:px-5`,children:(0,V.jsxs)(`div`,{className:`mx-auto max-w-[720px] space-y-1 text-center`,children:[y?(0,V.jsx)(`p`,{className:`line-clamp-1 text-[0.8125rem] text-white/50`,children:y.text}):null,_?(0,V.jsx)(`p`,{className:`line-clamp-3 text-[0.9375rem] text-white/95 leading-snug`,children:_.text}):null]})}):null,e.error?(0,V.jsx)(`p`,{className:`shrink-0 px-5 pb-2 text-center text-[0.8125rem] text-rose`,children:e.error}):null,(0,V.jsx)(`div`,{className:`flex shrink-0 items-center justify-center gap-3 px-4 pt-1 pb-4`,children:o?(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(H,{label:a(e.muted?`video.unmute`:`video.mute`),on:!e.muted,onClick:e.toggleMute,children:e.muted?(0,V.jsx)(oe,{className:`size-5`}):(0,V.jsx)(i,{className:`size-5`})}),(0,V.jsx)(H,{label:a(e.camera?`talk.cameraOff`:`talk.camera`),on:e.camera,onClick:()=>e.camera?e.stopCamera():void e.startCamera(),children:e.camera?(0,V.jsx)(f,{className:`size-5`}):(0,V.jsx)(ye,{className:`size-5`})}),e.camera&&Ce?(0,V.jsx)(H,{label:a(`video.flip`),onClick:()=>void e.flipCamera(),children:(0,V.jsx)(re,{className:`size-5`})}):null,(0,V.jsx)(H,{label:a(`video.leave`),danger:!0,onClick:h,children:(0,V.jsx)(de,{className:`size-5`})})]}):(0,V.jsxs)(`div`,{className:`flex flex-col items-center gap-2`,children:[(0,V.jsxs)(`button`,{type:`button`,disabled:s||!t?.talk,onClick:()=>void m(),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:[s?(0,V.jsx)(v,{className:`size-4`}):n?(0,V.jsx)(f,{className:`size-5`}):(0,V.jsx)(i,{className:`size-5`}),a(u?`video.rejoin`:n?`video.join`:`talk.start`)]}),!u&&!e.error?(0,V.jsx)(`p`,{className:`max-w-sm text-center text-[0.75rem] text-white/50`,children:a(n?`video.hint`:`talk.joinHint`)}):null]})})]})}var De=e=>I[e.kind]!==`device`,Oe=1024,ke=4e3;function U(e,t){return e?e.length>t?`${e.slice(0,t)} …`:e:``}function W(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: ${M(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}: ${U(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=De(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?` = ${U(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}": ${U(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 Ae(e,t,n,r){let[i,o]=(0,B.useState)(`off`),[s,c]=(0,B.useState)(null),[l,u]=(0,B.useState)(!1),[d,f]=(0,B.useState)(!1),[p,m]=(0,B.useState)(!1),[h,g]=(0,B.useState)(`environment`),[_,v]=(0,B.useState)(!1),[b,x]=(0,B.useState)([]),S=(0,B.useRef)(null),C=(0,B.useRef)(null),w=(0,B.useRef)(0),T=(0,B.useRef)(!1);T.current=p;let E=(0,B.useRef)(null),D=(0,B.useRef)(null),O=(0,B.useRef)(null),k=(0,B.useRef)(null),A=(0,B.useRef)(t);A.current=t;let j=(0,B.useRef)(r);j.current=r;let M=(0,B.useRef)(n);M.current=n;let N=(0,B.useRef)(``),P=(0,B.useCallback)(e=>{let t=D.current;t&&t.readyState===`open`&&t.send(JSON.stringify(e))},[]),F=(0,B.useCallback)(()=>{let e=S.current;if(!T.current||!e||e.videoWidth===0)return null;let t=Math.min(1,Oe/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,B.useCallback)(()=>{for(let e of C.current?.getTracks()??[])e.stop();C.current=null,S.current&&(S.current.srcObject=null),m(!1)},[]),L=(0,B.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,B.useCallback)(async()=>{let e=h===`user`?`environment`:`user`;I(),await L(e)},[h,I,L]),R=(0,B.useCallback)(()=>{v(e=>{for(let t of k.current?.getAudioTracks()??[])t.enabled=e;return!e})},[]),z=(0,B.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,B.useEffect)(()=>()=>z(),[z]);let te=(0,B.useCallback)(async(t,n)=>{let r=A.current,i=j.current,a=M.current;switch(t){case`get_state`:return r?W(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 y.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&&De(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 y.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]),ne=(0,B.useCallback)(async()=>{if(!E.current){c(null),x([]),o(`connecting`);try{let t=await y.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>ke?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{}te(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=W(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,te,F,P,z]);return(0,B.useEffect)(()=>{if(i!==`live`||!t)return;let e=W(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:ne,stop:z,camera:p,facing:h,startCamera:L,stopCamera:I,flipCamera:ee,muted:_,toggleMute:R,captions:b,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}),je=(0,B.createContext)(null),q=(0,B.createContext)(null);function Me(){return(0,B.useContext)(q)?.voice??null}function Ne({children:e}){let t=(0,B.useContext)(je);return t?(0,Se.createPortal)(e,t):null}function Pe({header:e,footer:t,children:n}){let[r,i]=(0,B.useState)(null),a=(0,B.useRef)(null),o=(0,B.useRef)(null),s=(0,B.useRef)(!0);return(0,B.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,V.jsx)(je.Provider,{value:r,children:(0,V.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col`,children:[e,(0,V.jsx)(`div`,{ref:a,className:`min-h-0 flex-1 overflow-y-auto overscroll-contain`,children:(0,V.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,V.jsxs)(`div`,{className:`shrink-0 border-border-soft border-t bg-background`,onPointerDownCapture:()=>{s.current=!0},onKeyDownCapture:()=>{s.current=!0},children:[(0,V.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,B.useContext)(q),r=(0,B.useMemo)(()=>t.map(e=>({key:e.key,who:e.who,spoken:!e.bare&&!e.wide})),[t]),i=(0,B.useCallback)(e=>{let t=document.querySelector(`[data-say="${CSS.escape(e)}"]`);return t?.querySelector(`[data-say-text]`)?.getAttribute(`data-say-text`)??t?.innerText??null},[]);ae(!!n?.readAloud,n?.lang??u,r,i);let o=[];for(let e of t){let t=o.at(-1);t&&t.who===`bot`&&e.who===`bot`?t.lines.push(e):o.push({who:e.who,lines:[e]})}return o.map((t,n)=>t.who===`bot`?(0,V.jsxs)(`div`,{className:`flex items-start gap-2.5`,children:[(0,V.jsx)(`div`,{className:`sticky top-1 shrink-0 pt-0.5`,children:(0,V.jsx)(ue,{kind:e,size:30,interactive:n>=o.length-2})}),(0,V.jsx)(`div`,{className:`flex min-w-0 flex-1 flex-col items-start gap-1.5`,children:t.lines.map(e=>(0,V.jsx)(`div`,{"data-anchor":e.anchor?``:void 0,"data-say":e.key,className:d(`animate-rise`,e.bare?`w-full pt-1`:`rounded-2xl rounded-tl-md text-[0.9375rem] text-ink leading-relaxed`,!e.bare&&(e.wide?d(`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,V.jsxs)(`div`,{className:`flex animate-rise flex-col items-end gap-1 pl-10`,children:[(0,V.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,V.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,V.jsx)(l,{className:`size-3`}),` `,a(`chat.change`)]}):null]},e.key)))}function Fe(){return(0,V.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,V.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,V.jsx)(`div`,{className:`flex flex-wrap items-center gap-2`,children:e})}var X=(e,t)=>G(e,(0,V.jsx)(Y,{children:t}),{bare:!0});function Z({onClick:e,children:t,primary:n,on:r,disabled:i,busy:a}){return(0,V.jsxs)(`button`,{type:`button`,"aria-pressed":r,disabled:i||a,onClick:e,className:d(`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,V.jsx)(v,{className:`size-4`}):null,t]})}function Ie({initial:e=``,placeholder:t,multiline:n,inputProps:r,busy:l,disabled:u,inputRef:p,onSend:m}){let[h,g]=(0,B.useState)(e),_=(0,B.useRef)(null),y=p??_,b=(0,B.useContext)(q),x=A(h,g,{endpoint:b?`/api/runs/${b.runId}/transcribe`:void 0}),S=!!b&&x.supported&&!u;(0,B.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,B.useEffect)(()=>{!R&&!u&&y.current?.focus()},[u,y]);let C=()=>{l||u||(x.listening&&x.toggle(),m(h)!==!1&&g(``))},w=x.listening?a(`chat.listening`):x.processing?a(`chat.transcribing`):t,T=b?.voice??null,E=!!b?.call,D=b&&!E&&(le||S||T)?(0,V.jsxs)(`div`,{className:`mb-1 flex shrink-0 items-center`,children:[T?(0,V.jsx)(s,{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:d(`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,V.jsx)(v,{className:`size-4`}):T.state===`live`?(0,V.jsx)(de,{className:`size-4`}):(0,V.jsx)(ie,{className:`size-4`})}):null,T?.state===`live`?(0,V.jsx)(s,{label:a(T.camera?`talk.cameraOff`:`talk.camera`),"aria-pressed":T.camera,onClick:()=>T.camera?T.stopCamera():void T.startCamera(),className:d(`size-9`,T.camera&&`text-ink`),children:T.camera?(0,V.jsx)(f,{className:`size-4`}):(0,V.jsx)(ye,{className:`size-4`})}):null,le?(0,V.jsx)(s,{label:a(b.readAloud?`chat.readAloudOff`:`chat.readAloud`),"aria-pressed":b.readAloud,onClick:()=>b.setReadAloud(!b.readAloud),className:d(`size-9`,b.readAloud&&`text-ink`),children:b.readAloud?(0,V.jsx)(ce,{className:`size-4`}):(0,V.jsx)(xe,{className:`size-4`})}):null,S?(0,V.jsx)(s,{label:a(x.listening?`chat.dictateStop`:`chat.dictate`),"aria-pressed":x.listening,disabled:x.processing,onClick:x.toggle,className:d(`size-9`,x.listening&&`bg-rose-tint text-rose hover:bg-rose-tint hover:text-rose`),children:x.processing?(0,V.jsx)(v,{className:`size-4`}):x.listening?(0,V.jsx)(o,{className:`size-3.5 animate-pulse-dot fill-current`}):(0,V.jsx)(i,{className:`size-4`})}):null]}):null;return(0,V.jsxs)(`form`,{className:`pb-3`,onSubmit:e=>{e.preventDefault(),C()},children:[T&&!E?(0,V.jsx)(`video`,{ref:T.video,muted:!0,playsInline:!0,autoPlay:!0,className:d(`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,V.jsxs)(`div`,{className:d(`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`,u&&`opacity-60`),children:[D,n?(0,V.jsx)(c,{ref:y,minRows:1,maxRows:6,value:h,disabled:u,placeholder:w,autoCapitalize:`sentences`,onChange:e=>g(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&!R&&!e.nativeEvent.isComposing&&(e.preventDefault(),C())},className:`min-h-11 border-0 bg-transparent py-2.5 shadow-none focus:ring-0`}):(0,V.jsx)(`input`,{ref:y,...r,value:h,disabled:u,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,V.jsx)(`button`,{type:`submit`,"aria-label":a(`chat.send`),title:a(`chat.send`),disabled:l||u,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:l?(0,V.jsx)(v,{className:`size-4`}):(0,V.jsx)(ee,{className:`size-4`})})]}),x.error?(0,V.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,V.jsx)(`p`,{className:`mt-1.5 px-3 text-[0.75rem] text-rose`,children:T.error}):T?.state===`live`?(0,V.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,V.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,V.jsx)(Ne,{children:(0,V.jsx)(Ie,{disabled:!0,placeholder:e,onSend:()=>!1})})}function Le(e){let t=I[e.kind];return t===`typed`&&!e.scan?`typed`:t===`tapped`?`tapped`:`control`}var Re=e=>e==null||e===``||Array.isArray(e)&&e.length===0;function ze(e,t){let n=e.kind===`toggle`||e.kind===`connection`||e.kind===`list`;if(Re(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`&&!Number.isFinite(Number(r.replace(`,`,`.`)))?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 Be(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 Ve({field:e}){return(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`span`,{className:`font-medium`,children:e.label}),e.help?(0,V.jsx)(`span`,{className:`mt-0.5 block text-[0.8125rem] text-ink-3`,children:e.help}):null]})}function He({step:e,only:t}){return(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`span`,{className:`font-medium`,children:e.title}),e.description?(0,V.jsx)(`span`,{className:`mt-0.5 block text-ink-2`,children:e.description}):null,t?.help?(0,V.jsx)(`span`,{className:`mt-1 block text-[0.8125rem] text-ink-3`,children:t.help}):null]})}function Ue({field:e,value:t,runId:n}){if(e.kind===`connection`)return(0,V.jsx)(V.Fragment,{children:typeof t==`string`&&t?t:a(`chat.connected`)});if(e.kind===`list`)return(0,V.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,V.jsx)(T,{className:`size-4`}),` `,a(`chat.checked`)]});if(e.kind===`toggle`)return(0,V.jsx)(V.Fragment,{children:a(t===!0?`run.yes`:`run.no`)});if(Re(t))return(0,V.jsx)(`span`,{className:`italic opacity-80`,children:a(`chat.skipped`)});switch(e.kind){case`multiselect`:return(0,V.jsx)(V.Fragment,{children:t.map(O).join(`, `)});case`select`:return(0,V.jsx)(V.Fragment,{children:O(String(t))});case`date`:{let e=new Date(`${String(t)}T00:00`);return(0,V.jsx)(V.Fragment,{children:Number.isNaN(e.getTime())?String(t):new Intl.DateTimeFormat(u,{dateStyle:`long`}).format(e)})}case`color`:return(0,V.jsxs)(`span`,{className:`inline-flex items-center gap-2`,children:[(0,V.jsx)(`span`,{className:`size-4 rounded-full ring-1 ring-white/50`,style:{background:String(t)}}),String(t)]});case`image`:case`signature`:return(0,V.jsx)(`span`,{className:`-mx-1.5 flex flex-wrap gap-1.5`,children:(Array.isArray(t)?t:[String(t)]).map(t=>(0,V.jsx)(`img`,{src:r(`/api/runs/${n}/assets/${t}`),alt:``,className:d(`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,V.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,V.jsx)(x,{className:`size-4`}),` `,a(e===1?`chat.file`:`chat.files`,{n:e})]})}case`audio`:{let e=t.seconds;return(0,V.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,V.jsx)(i,{className:`size-4`}),` `,a(`chat.voice`),e?` · ${Math.round(e)} s`:``]})}case`location`:{let e=t;return(0,V.jsx)(V.Fragment,{children:e.label||`${e.lat?.toFixed(5)}, ${e.lng?.toFixed(5)}`})}case`items`:return(0,V.jsx)(V.Fragment,{children:a(`chat.rows`,{n:Array.isArray(t)?t.length:0})});default:return(0,V.jsx)(V.Fragment,{children:String(t)})}}function We(e,t,n,r,i,a){let o=[G(t,(0,V.jsx)(He,{step:e,only:a}))];for(let e of i)a||o.push(G(`${t}:${e.id}`,(0,V.jsx)(Ve,{field:e}))),o.push(K(`${t}:${e.id}:a`,(0,V.jsx)(Ue,{field:e,value:n[e.id],runId:r})));return o}var Ge=(e,t)=>e.fields.filter(e=>!e.when&&!z(e)||t[e.id]!==void 0&&t[e.id]!==null);function Ke(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(...We(r,i,e.values,e.id,Ge(r,e.values),t))}else r.type===`review`&&(n.push(G(i,(0,V.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 qe(e,t){return e.fields.filter(e=>!z(e)||t.decidedFields?.includes(e.id)).map(e=>t.options?.[e.id]?.length?{...e,options:t.options[e.id]}:e)}function Je({view:e,run:t,step:n,before:r}){let i=(0,B.useMemo)(()=>qe(n,e),[n,e]),o=e.known??{},[s,c]=(0,B.useState)(()=>F(n,e)),[l,u]=(0,B.useState)(()=>n.fields.some(t=>e.values[t.id]!==void 0)?p(qe(n,e),e.known??{},F(n,e)).slice(0,-1).map(e=>e.id):[]),[d,f]=(0,B.useState)({}),[m,h]=(0,B.useState)(!1),[g,_]=(0,B.useState)(!1),v=p(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,B.useEffect)(()=>{let e=Object.keys(t.fieldErrors),n=p(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,B.useContext)(q),D=(0,B.useRef)(s);D.current=s;let O=T?.bindPage,k=(0,B.useRef)(w);k.current=w,(0,B.useEffect)(()=>{if(!O)return;let e=p(i,o,s);return O({step:n,fields:e,values:s,setField:(t,n)=>{let r=e.find(e=>e.id===t);return r?ze(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(D.current)}),()=>O(null)},[O,n,i,o,s]);let A=e=>{if(!b)return!1;let t=ze(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({}),p(i,o,n).some(e=>!r.includes(e.id))||w(n),!0},j=[...r.map(e=>l.length?{...e,onEdit:void 0}:e),...We(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?(Le(b)===`control`?j.push(G(`now:${n.id}:${b.id}:control`,(0,V.jsx)(E,{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:h}),{wide:!0})):x||j.push(G(`now:${n.id}:${b.id}`,(0,V.jsx)(Ve,{field:b}))),d[b.id]&&j.push(G(`now:${n.id}:${b.id}:error`,d[b.id],{tone:`error`}))):t.busy||g?j.push(G(`sending`,(0,V.jsx)(Fe,{}))):t.error&&j.push(G(`send-error`,t.error,{tone:`error`}));let M=(0,V.jsx)(Q,{});if(g||!b&&l.length>0&&t.busy)M=(0,V.jsx)(Q,{placeholder:a(`run.working`)});else if(!b)j.push(X(`now:${n.id}:go`,(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(Z,{primary:!0,busy:t.busy,onClick:()=>w(s),children:n.cta||a(`run.next`)}),C?(0,V.jsx)(Z,{onClick:C,disabled:t.busy,children:a(`run.back`)}):null]})));else{let r=Le(b),i=!b.required&&b.kind!==`connection`&&b.kind!==`list`?(0,V.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,V.jsx)(Ne,{children:(0,V.jsx)(Ie,{initial:Re(e)?``:String(e),multiline:b.kind===`textarea`,placeholder:b.placeholder||(x?b.label:a(`chat.placeholder`)),inputProps:Ye(b),busy:t.busy,onSend:e=>A(Be(b,e))},b.id)})}else if(r===`tapped`)j.push(G(`now:${n.id}:${b.id}:replies`,(0,V.jsx)(Xe,{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,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(Z,{primary:!0,disabled:m,onClick:()=>A(s[b.id]),children:e&&n.cta?n.cta:a(`chat.send`)}),i]})))}}return(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(J,{avatar:e.wizard.avatar,lines:j}),M]})}function Ye(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 L(e)}}function Xe({field:e,view:t,value:n,onAnswer:r}){let i=new Set(t.closed?.[e.id]?.values.map(String)),[o,s]=(0,B.useState)(Array.isArray(n)?n:[]);if(e.kind===`toggle`)return(0,V.jsxs)(Y,{children:[(0,V.jsx)(Z,{on:n===!1,disabled:i.has(`false`),onClick:()=>r(!1),children:a(`run.no`)}),(0,V.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,V.jsxs)(Y,{children:[c.map(e=>(0,V.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:O(e)},e)),(0,V.jsx)(Z,{primary:!0,disabled:e.required&&!o.length,onClick:()=>r(o),children:o.length||e.required?a(`chat.send`):a(`chat.skip`)})]}):(0,V.jsxs)(Y,{children:[c.map(e=>(0,V.jsx)(Z,{on:n===e,disabled:i.has(e),onClick:()=>r(e),children:O(e)},e)),e.required?null:(0,V.jsx)(Z,{onClick:()=>r(void 0),children:a(`chat.skip`)})]})}function Ze({view:e}){let t=(0,B.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,B.useState)(Date.now());(0,B.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($e),u=[...new Set(s.map(e=>e.asset).filter(e=>!!e))];return(0,V.jsxs)(`div`,{className:d(`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,V.jsxs)(`div`,{className:`flex items-center gap-3`,children:[(0,V.jsx)(Fe,{}),(0,V.jsx)(`span`,{className:`font-medium`,children:t?.message??e.step?.title??a(`run.working`)}),(0,V.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,V.jsxs)(`div`,{className:`flex items-center gap-1.5 text-[0.8125rem] text-ink-3`,children:[(0,V.jsx)(_,{className:`size-3.5 shrink-0 animate-breathe text-ember`}),(0,V.jsx)(`span`,{className:`truncate`,children:M(c)})]}):null,l&&e.status===`running`?(0,V.jsx)(tt,{runId:e.id,event:l}):null,u.length?(0,V.jsx)(`div`,{className:`mt-1.5 flex flex-wrap gap-1.5`,children:u.slice(-6).map(t=>(0,V.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 Qe=new Set([`opens`,`clicks`,`clicksOn`,`types`,`typesText`,`selects`,`scrolls`,`presses`,`goesBack`,`waitsForPage`,`fastLoop`,`looksAtPage`,`personDrives`,`agentDrives`]);function $e(e){return!!e.note&&Qe.has(e.note.code)}var et=1e4;function tt({runId:e,event:t}){let[n,r]=(0,B.useState)(null),[i,o]=(0,B.useState)(`agent`),[s,c]=(0,B.useState)(!1),l=t.note?.code;if((0,B.useEffect)(()=>{l===`personDrives`?o(`person`):l===`agentDrives`&&o(`agent`)},[l]),(0,B.useEffect)(()=>{let t=()=>y.get(`/api/runs/${e}/browser/seat`).then(e=>o(e.seat)).catch(()=>void 0);if(t(),i!==`person`)return;let n=setInterval(t,et);return()=>clearInterval(n)},[e,i]),n!==null&&n>=t.id)return null;let u=i===`person`,f=async()=>{c(!0);try{let t=await y.post(`/api/runs/${e}/browser/seat`,{to:u?`agent`:`person`});o(t.seat)}catch{}finally{c(!1)}};return(0,V.jsx)(te,{runId:e,driving:u,caption:M(t),hint:a(`browser.driving`),onBroken:()=>r(t.id),className:`mt-1.5`,action:(0,V.jsxs)(`button`,{type:`button`,disabled:s,onClick:()=>void f(),className:d(`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,V.jsx)(_e,{className:`size-3.5`}):(0,V.jsx)(he,{className:`size-3.5`}),a(u?`browser.handBack`:`browser.takeOver`)]})},n??0)}function $({children:e,end:t}){return(0,V.jsxs)(`div`,{className:`mb-3 flex flex-wrap items-center justify-between gap-2`,children:[(0,V.jsx)(`h3`,{className:`font-display font-semibold text-[1rem]`,children:e}),t]})}function nt({view:e,run:t,step:n,before:r,asked:i,onNote:o}){let s=e.shown.filter(e=>e.output),[c,l]=(0,B.useState)(s.length===1?s[0].step.id:null),u=(0,B.useRef)(null),d=[...r,...i.map((e,t)=>K(`review:${n.id}:asked:${t}`,e)),G(`review:${n.id}`,(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`span`,{className:`font-medium`,children:n.title}),n.description?(0,V.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,V.jsxs)(V.Fragment,{children:[(0,V.jsx)($,{children:t.title}),(0,V.jsx)(P,{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,V.jsxs)(V.Fragment,{children:[(0,V.jsx)($,{children:t.def.title}),t.def.check?(0,V.jsx)(C,{runId:e.id,list:t}):(0,V.jsx)(j,{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,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(Z,{primary:!0,busy:t.busy,onClick:()=>void t.accept(n.id),children:[(0,V.jsx)(T,{className:`size-4`}),` `,a(`run.accept`)]}),f&&s.length>1?s.map(({step:e})=>(0,V.jsx)(Z,{on:c===e.id,onClick:()=>l(e.id),children:e.title},e.id)):null]}))),(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(J,{avatar:e.wizard.avatar,lines:d}),f?(0,V.jsx)(Ne,{children:(0,V.jsx)(Ie,{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,V.jsx)(Q,{})]})}function rt({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,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`span`,{className:`font-display font-semibold text-[1.0625rem]`,children:n.title}),n.message?(0,V.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,V.jsxs)(V.Fragment,{children:[(0,V.jsx)($,{end:(0,V.jsx)(N,{base:s,stepId:e.id,formats:n,title:r??e.title}),children:r??e.title}),(0,V.jsx)(P,{base:s,step:e,output:t}),t?.assets?.some(e=>e.ai)?(0,V.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,V.jsxs)(V.Fragment,{children:[(0,V.jsx)($,{end:(0,V.jsx)(w,{runId:e.id,list:t}),children:t.label??t.def.title}),(0,V.jsx)(j,{runId:e.id,list:t,editable:!0})]}),{wide:!0}))];return c.push(X(`result:replies`,(0,V.jsxs)(V.Fragment,{children:[o.length?(0,V.jsx)(fe,{runId:e.id,title:`${n.title} · ${e.wizard.title}`,initial:e.shareUrl?{url:e.shareUrl,expiresAt:e.expiresAt}:null}):null,i?(0,V.jsxs)(Z,{onClick:i,children:[(0,V.jsx)(b,{className:`size-4`}),` `,a(`run.again`)]}):null,e.canBack?(0,V.jsx)(Z,{onClick:()=>void t.back(),disabled:t.busy,children:a(`run.back`)}):null,e.keeps?(0,V.jsx)(`span`,{className:`ml-1`,children:(0,V.jsx)(D,{runId:e.id})}):null]}))),(0,V.jsx)(J,{avatar:e.wizard.avatar,lines:c})}function it({runId:e,onRestart:t,onView:n,header:r,footer:i,talk:o=!1,call:s=!1}){let c=pe(e),{view:l}=c,[d,f]=(0,B.useState)(null),p=Ae(e,l,c,d);(0,B.useEffect)(()=>{n?.(l)},[l,n]);let[m,g]=se(),_=(0,B.useMemo)(()=>({runId:e,lang:l?.lang??u,readAloud:m,setReadAloud:g,voice:l?.talk?p:null,talk:o,call:!!s,bindPage:f}),[e,l?.lang,l?.talk,m,g,p,o,s]);ne(l?.status===`running`&&!l.ask),k(l);let[y,x]=(0,B.useState)({}),[C,w]=(0,B.useState)(null);(0,B.useEffect)(()=>{l&&l.status!==`running`&&w(null)},[l]);let T;if(c.notFound)T=(0,V.jsx)(`div`,{className:`py-24 text-center text-ink-3`,children:a(`run.notFound`)});else if(!l)T=(0,V.jsx)(`div`,{className:`flex justify-center py-24 text-ink-4`,children:(0,V.jsx)(v,{})});else{let e=l.step,n=l.status===`waiting_input`,r=Ke(l,l.canBack&&n&&!c.busy?()=>void c.back():void 0);if(l.status===`running`&&l.ask)T=(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(J,{avatar:l.wizard.avatar,lines:[...r,G(`ask:${l.ask.id}`,(0,V.jsx)(S,{runId:l.id,ask:l.ask}),{wide:!0})]}),(0,V.jsx)(Q,{})]});else if(l.status===`running`)T=(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(J,{avatar:l.wizard.avatar,lines:[...r,...C?[K(`note`,C)]:[],G(`working:${e?.id}`,(0,V.jsx)(Ze,{view:l}),{wide:l.events.some(t=>t.stepId===e?.id&&$e(t))?`most`:void 0})]}),(0,V.jsx)(Q,{placeholder:a(`run.working`)})]});else if(l.status===`failed`)T=(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(J,{avatar:l.wizard.avatar,lines:[...r,G(`failed`,(0,V.jsxs)(V.Fragment,{children:[(0,V.jsx)(`span`,{className:`font-medium`,children:a(`run.failed`)}),l.error?(0,V.jsx)(`span`,{className:`mt-0.5 block`,children:(0,V.jsx)(h,{text:l.error})}):null]}),{tone:`error`}),X(`failed:replies`,(0,V.jsxs)(V.Fragment,{children:[(0,V.jsxs)(Z,{primary:!0,busy:c.busy,onClick:()=>void c.retry(),children:[(0,V.jsx)(b,{className:`size-4`}),` `,a(`run.retry`)]}),l.canBack?(0,V.jsx)(Z,{onClick:()=>void c.back(),disabled:c.busy,children:a(`run.back`)}):null]}))]}),(0,V.jsx)(Q,{})]});else if(l.status===`cancelled`)T=(0,V.jsx)(J,{avatar:l.wizard.avatar,lines:[...r,G(`cancelled`,a(`run.cancelled`)),...t?[X(`cancelled:replies`,(0,V.jsxs)(Z,{primary:!0,onClick:t,children:[(0,V.jsx)(b,{className:`size-4`}),` `,a(`run.again`)]}))]:[]]});else if(e?.type===`page`)T=(0,V.jsx)(Je,{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,V.jsx)(nt,{view:l,run:c,step:e,before:r,asked:y[e.id]??[],onNote:t=>{w(t),x(n=>({...n,[e.id]:[...n[e.id]??[],t]}))}},`${e.id}:${t}`)}else T=e?.type===`result`?(0,V.jsx)(rt,{view:l,run:c,step:e,before:r,onRestart:t}):(0,V.jsx)(J,{avatar:l.wizard.avatar,lines:r})}return s?(0,V.jsx)(q.Provider,{value:_,children:(0,V.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col lg:flex-row`,children:[(0,V.jsx)(Ee,{voice:p,view:l,video:s===`video`,className:`h-[46dvh] shrink-0 lg:h-auto lg:min-h-0 lg:flex-1`}),(0,V.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,V.jsx)(Pe,{footer:i,children:T})})]})}):(0,V.jsx)(q.Provider,{value:_,children:(0,V.jsx)(Pe,{header:r,footer:i,children:T})})}export{J as a,Z as i,Pe as n,X as o,Q as r,Me as s,it as t};