@engenty/wizards-runtime 0.7.10 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE-FIGURES +37 -0
- package/README.md +8 -2
- package/TRADEMARKS.md +47 -0
- package/apps/runtime/dist/authoring/guide.js +14 -2
- package/apps/runtime/dist/cli/exec.js +4 -1
- package/apps/runtime/dist/connectors/builtin.js +4 -2
- package/apps/runtime/dist/connectors/index.js +35 -4
- package/apps/runtime/dist/connectors/smtp.js +221 -0
- package/apps/runtime/dist/db/migrations/tenant/0018_share_job.sql +18 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/0018_snapshot.json +3460 -0
- package/apps/runtime/dist/db/migrations/tenant/meta/_journal.json +7 -0
- package/apps/runtime/dist/db/schema.js +19 -0
- package/apps/runtime/dist/docs/dev/index.md +25 -13
- package/apps/runtime/dist/docs/dev/meta.json +8 -2
- package/apps/runtime/dist/docs/dev/wizard-format/agent-steps.md +112 -0
- package/apps/runtime/dist/docs/dev/wizard-format/branches.md +63 -0
- package/apps/runtime/dist/docs/dev/wizard-format/film-steps.md +47 -0
- package/apps/runtime/dist/docs/dev/wizard-format/generate-steps.md +57 -0
- package/apps/runtime/dist/docs/dev/wizard-format/index.md +188 -0
- package/apps/runtime/dist/docs/dev/wizard-format/lists-and-connections.md +65 -0
- package/apps/runtime/dist/docs/dev/wizard-format/meta.json +19 -0
- package/apps/runtime/dist/docs/dev/wizard-format/pages-and-fields.md +102 -0
- package/apps/runtime/dist/docs/dev/wizard-format/review-and-result.md +64 -0
- package/apps/runtime/dist/docs/dev/wizard-format/templates.md +57 -0
- package/apps/runtime/dist/docs/dev/wizard-format/validate.md +63 -0
- package/apps/runtime/dist/docs/dev/wizard-format/views-and-widgets.md +103 -0
- package/apps/runtime/dist/docs/dev/wizard-format/wizard-file.md +147 -0
- package/apps/runtime/dist/docs/user/run.md +21 -4
- package/apps/runtime/dist/docs/user/steps.md +26 -1
- package/apps/runtime/dist/docs/user/test-and-share.md +3 -2
- package/apps/runtime/dist/engine/requirements.js +22 -7
- package/apps/runtime/dist/engine/runner.js +17 -8
- package/apps/runtime/dist/env.js +5 -0
- package/apps/runtime/dist/harness/antigravity.js +2 -10
- package/apps/runtime/dist/harness/claude.js +2 -10
- package/apps/runtime/dist/harness/codex.js +5 -11
- package/apps/runtime/dist/harness/cursor.js +2 -10
- package/apps/runtime/dist/harness/env.js +23 -0
- package/apps/runtime/dist/harness/index.js +6 -3
- package/apps/runtime/dist/routes/runs.js +106 -6
- package/apps/runtime/dist/routes/studio.js +12 -0
- package/apps/runtime/dist/services/engenty-shapes.js +3 -2
- package/apps/runtime/dist/sharing/agent.js +65 -0
- package/apps/runtime/dist/sharing/files.js +121 -0
- package/apps/runtime/dist/sharing/index.js +298 -0
- package/apps/runtime/dist/sharing/jobs.js +186 -0
- package/apps/runtime/dist/sharing/state.js +116 -0
- package/apps/runtime/dist/sharing/targets/browser.js +131 -0
- package/apps/runtime/dist/sharing/targets/connector.js +63 -0
- package/apps/runtime/dist/sharing/targets/email.js +98 -0
- package/apps/runtime/dist/sharing/targets/slack.js +54 -0
- package/apps/runtime/dist/sharing/targets/storage.js +164 -0
- package/apps/runtime/dist/sharing/types.js +13 -0
- package/apps/runtime/dist/texts.js +108 -0
- package/apps/runtime/dist/tools/browser.js +48 -0
- package/apps/runtime/dist/tools/connector.js +3 -2
- package/apps/runtime/dist/tools/store.js +18 -1
- package/apps/web/dist/assets/AboutDialog-CiiSwL4t.js +1 -0
- package/apps/web/dist/assets/{ChangelogDialog-B0lS0BdL.js → ChangelogDialog-BEyz7LNE.js} +1 -1
- package/apps/web/dist/assets/ChatView-9RkWts5F.js +10 -0
- package/apps/web/dist/assets/EditorPage-CCsKKcYo.js +4 -0
- package/apps/web/dist/assets/{FlowPreview-oX_Emm7u.js → FlowPreview-CLf8WHiG.js} +1 -1
- package/apps/web/dist/assets/{Harness-Dv9ln5xB.js → Harness-jc3jpWvI.js} +2 -2
- package/apps/web/dist/assets/NewWizardChannels-BPGZ4pfP.js +1 -0
- package/apps/web/dist/assets/NewWizardPage-tidycL7Y.js +7 -0
- package/apps/web/dist/assets/OnboardingPage-DtVuaIuv.js +1 -0
- package/apps/web/dist/assets/ProjectPage-BsWgCP5z.js +1 -0
- package/apps/web/dist/assets/PublicRunner-CkA_etKX.js +1 -0
- package/apps/web/dist/assets/{ReadOnly-S9vGVQHr.js → ReadOnly-BVwbqvpi.js} +1 -1
- package/apps/web/dist/assets/RunDrawer-CkFpnWCC.js +4 -0
- package/apps/web/dist/assets/{RunnerView-BW1h4x63.js → RunnerView-CxTFM-lx.js} +1 -1
- package/apps/web/dist/assets/SettingsPage-DM1wNAE7.js +1 -0
- package/apps/web/dist/assets/SetupPage-BKnQqiab.js +1 -0
- package/apps/web/dist/assets/{SharePage-ktqm-jWI.js → SharePage-CTTSudtp.js} +1 -1
- package/apps/web/dist/assets/changelog-DBEwyB1f.js +1 -0
- package/apps/web/dist/assets/engenty-Cko4qGFV.js +1 -0
- package/apps/web/dist/assets/{esm-C-ZWeuhU.js → esm-DtNAg8uF.js} +1 -1
- package/apps/web/dist/assets/fluffy-engenty-Db7agOjV.js +520 -0
- package/apps/web/dist/assets/index-V1M59Yez.css +1 -0
- package/apps/web/dist/assets/index-xIz8znhq.js +14 -0
- package/apps/web/dist/assets/{oss-credits-Bc05Qv5H.js → oss-credits-BWE03Xax.js} +1 -1
- package/apps/web/dist/assets/{phone-BjmhIKuT.js → phone-5SYD9OrJ.js} +1 -1
- package/apps/web/dist/assets/{settings-menu-Dpkp3f56.js → settings-menu-Bn5-7Lqk.js} +1 -1
- package/apps/web/dist/assets/ui-s39eGOtW.js +137 -0
- package/apps/web/dist/assets/{upload-JX9BcMTq.js → upload-Bevcvx5V.js} +1 -1
- package/apps/web/dist/assets/{wrench-BSxnPs2_.js → wrench-ZD5SCsz9.js} +1 -1
- package/apps/web/dist/favicon.svg +2 -1
- package/apps/web/dist/icons/apple-touch-icon.png +0 -0
- package/apps/web/dist/icons/icon-192.png +0 -0
- package/apps/web/dist/icons/icon-512.png +0 -0
- package/apps/web/dist/icons/icon-maskable-512.png +0 -0
- package/apps/web/dist/index.html +4 -4
- package/apps/web/dist/mcp/flow.html +65 -120
- package/node_modules/@engenty-wizards/shared/dist/definition.d.ts +22 -0
- package/node_modules/@engenty-wizards/shared/dist/definition.js +26 -0
- package/node_modules/@engenty-wizards/shared/dist/run.d.ts +6 -0
- package/node_modules/@engenty-wizards/shared/dist/run.js +2 -0
- package/node_modules/@engenty-wizards/shared/dist/sharing.d.ts +135 -0
- package/node_modules/@engenty-wizards/shared/dist/sharing.js +11 -0
- package/node_modules/@engenty-wizards/shared/dist/store.d.ts +8 -0
- package/package.json +6 -3
- package/plugin/.claude-plugin/plugin.json +1 -1
- package/plugin/hooks/engenty.ts +3 -2
- package/apps/runtime/dist/docs/dev/wizard-format.md +0 -125
- package/apps/web/dist/assets/AboutDialog-B2LuZ_mC.js +0 -1
- package/apps/web/dist/assets/ChatView-BcPDcU2d.js +0 -10
- package/apps/web/dist/assets/EditorPage-erduYKNM.js +0 -4
- package/apps/web/dist/assets/NewWizardChannels-JveYyh-U.js +0 -1
- package/apps/web/dist/assets/NewWizardPage-Dfk-WOhX.js +0 -7
- package/apps/web/dist/assets/OnboardingPage-CT9dL4ke.js +0 -1
- package/apps/web/dist/assets/ProjectPage-5_Wsk9Hv.js +0 -1
- package/apps/web/dist/assets/PublicRunner-Cw1WzTze.js +0 -1
- package/apps/web/dist/assets/RunDrawer-O4rEFCL8.js +0 -4
- package/apps/web/dist/assets/SettingsPage-DmhN7OTy.js +0 -1
- package/apps/web/dist/assets/SetupPage-BlWd7Uln.js +0 -1
- package/apps/web/dist/assets/changelog-FJJS0Tpt.js +0 -1
- package/apps/web/dist/assets/engenty-WpMi3xwq.js +0 -1
- package/apps/web/dist/assets/fluffy-engenty-DPNHytrz.js +0 -575
- package/apps/web/dist/assets/index-C4aHMcg9.css +0 -1
- package/apps/web/dist/assets/index-xH9uN8Nh.js +0 -14
- package/apps/web/dist/assets/ui-DMmT-cSO.js +0 -137
|
@@ -101,6 +101,60 @@ const EN = {
|
|
|
101
101
|
ownKeysNotInPlan: "Your own API keys aren’t part of the {plan} plan.",
|
|
102
102
|
ownKeysNotInTeamPlan: "Your own API keys aren’t part of the team’s plan.",
|
|
103
103
|
planUnavailable: "The team’s plan can’t be checked right now. Try again later.",
|
|
104
|
+
shareEmailName: "Email",
|
|
105
|
+
shareEmailDescription: "As attachments to one or more addresses",
|
|
106
|
+
shareTo: "To",
|
|
107
|
+
shareToPlaceholder: "name@company.com, second@address.com",
|
|
108
|
+
shareSubject: "Subject",
|
|
109
|
+
shareMessage: "Message",
|
|
110
|
+
shareNotAnAddress: "“{address}” is not an email address.",
|
|
111
|
+
shareNoAddress: "Give at least one address.",
|
|
112
|
+
shareTooManyAddresses: "At most {max} addresses per email.",
|
|
113
|
+
shareAttachmentsTooLarge: "The attachments are {size} – too large for an email. Choose fewer files or share the link.",
|
|
114
|
+
shareMailboxLimit: "The attachments are too large for this mailbox (at most 3 MB). Choose fewer files or share the link.",
|
|
115
|
+
shareVisitorMails: "From here, one run sends {mails} emails to at most {recipients} addresses each.",
|
|
116
|
+
shareConnectMailbox: "Connect a mailbox first.",
|
|
117
|
+
shareSendingFrom: "Sending from {account}",
|
|
118
|
+
shareSentTo: "Sent to {to}",
|
|
119
|
+
shareSlackDescription: "As a message in a channel",
|
|
120
|
+
shareChannel: "Channel",
|
|
121
|
+
shareConnectFirst: "Connect {name} first.",
|
|
122
|
+
sharePostingAs: "Posting as {account}",
|
|
123
|
+
sharePostedSlack: "Posted to Slack",
|
|
124
|
+
shareStorageDescription: "Save the files into a folder",
|
|
125
|
+
shareFolder: "Folder",
|
|
126
|
+
shareFolderPlaceholder: "e.g. Reports/2026",
|
|
127
|
+
shareFolderHelp: "Created if it doesn’t exist yet. Empty = the top level.",
|
|
128
|
+
shareUploading: "Uploading {name}",
|
|
129
|
+
shareSavedFiles: {
|
|
130
|
+
one: "{count} file saved to {where}",
|
|
131
|
+
other: "{count} files saved to {where}",
|
|
132
|
+
},
|
|
133
|
+
shareConnectorDescription: "The wizard does it in your account and asks before every change",
|
|
134
|
+
shareWhatHappens: "What should happen with it?",
|
|
135
|
+
shareWhatHappensPlaceholder: "e.g. Create a new page under Marketing and put the text in.",
|
|
136
|
+
shareWebsiteDescription: "The wizard posts it in the browser – you sign in yourself",
|
|
137
|
+
shareWebsiteAddress: "Address of the website",
|
|
138
|
+
shareWhatThere: "What should happen there?",
|
|
139
|
+
shareWhatTherePlaceholder: "e.g. Create a new blog post as a draft: title, text and the image as cover.",
|
|
140
|
+
sharePostInstructions: "Create a new post with the result’s text and attach the files.",
|
|
141
|
+
shareAdInstructions: "Create a new ad as a draft: the result’s text as the ad copy, the image as its creative. Don’t publish it.",
|
|
142
|
+
shareNoCredits: "This wizard has no credits left right now. Try again later.",
|
|
143
|
+
shareNoReport: "The wizard didn’t say whether it worked.",
|
|
144
|
+
shareCheckInput: "Check what you entered.",
|
|
145
|
+
shareRequired: "Fill this in.",
|
|
146
|
+
shareNeedsHttps: "Give an https:// address.",
|
|
147
|
+
sharePickFile: "Choose at least one file.",
|
|
148
|
+
shareConnectAccount: "Connect the account first.",
|
|
149
|
+
sharePreparing: "Preparing the files",
|
|
150
|
+
shareFailed: "That didn’t work",
|
|
151
|
+
shareTargetUnknown: "This result has no such target.",
|
|
152
|
+
shareOnlyDone: "Only finished results can be shared.",
|
|
153
|
+
shareBusy: "Something is being sent right now.",
|
|
154
|
+
shareTooOften: "This run has sent very often already.",
|
|
155
|
+
shareInterrupted: "Sending was interrupted. Try again.",
|
|
156
|
+
shareNotInResult: "“{name}” ({format}) is not part of this result.",
|
|
157
|
+
shareCannotRender: "“{name}” couldn’t be made as {format}. Choose another format.",
|
|
104
158
|
};
|
|
105
159
|
const DE = {
|
|
106
160
|
keyUnknown: "Der Anbieter kennt diesen API-Key nicht.",
|
|
@@ -199,6 +253,60 @@ const DE = {
|
|
|
199
253
|
ownKeysNotInPlan: "Eigene API-Keys gibt es nicht im Paket {plan}.",
|
|
200
254
|
ownKeysNotInTeamPlan: "Eigene API-Keys gibt es nicht im Paket des Teams.",
|
|
201
255
|
planUnavailable: "Das Paket des Teams lässt sich gerade nicht prüfen. Versuch es später noch einmal.",
|
|
256
|
+
shareEmailName: "E-Mail",
|
|
257
|
+
shareEmailDescription: "Als Anhang an eine oder mehrere Adressen",
|
|
258
|
+
shareTo: "An",
|
|
259
|
+
shareToPlaceholder: "name@firma.at, zweite@adresse.at",
|
|
260
|
+
shareSubject: "Betreff",
|
|
261
|
+
shareMessage: "Nachricht",
|
|
262
|
+
shareNotAnAddress: "„{address}“ ist keine E-Mail-Adresse.",
|
|
263
|
+
shareNoAddress: "Gib mindestens eine Adresse an.",
|
|
264
|
+
shareTooManyAddresses: "Höchstens {max} Adressen pro E-Mail.",
|
|
265
|
+
shareAttachmentsTooLarge: "Die Anhänge sind mit {size} zu groß für eine E-Mail. Wähle weniger Dateien oder teile den Link.",
|
|
266
|
+
shareMailboxLimit: "Die Anhänge sind zu groß für dieses Postfach (höchstens 3 MB). Wähle weniger Dateien oder teile den Link.",
|
|
267
|
+
shareVisitorMails: "Von hier gehen pro Lauf {mails} E-Mails an je höchstens {recipients} Adressen.",
|
|
268
|
+
shareConnectMailbox: "Verbinde zuerst ein Postfach.",
|
|
269
|
+
shareSendingFrom: "Sendet von {account}",
|
|
270
|
+
shareSentTo: "Gesendet an {to}",
|
|
271
|
+
shareSlackDescription: "Als Nachricht in einen Kanal",
|
|
272
|
+
shareChannel: "Kanal",
|
|
273
|
+
shareConnectFirst: "Verbinde zuerst {name}.",
|
|
274
|
+
sharePostingAs: "Postet als {account}",
|
|
275
|
+
sharePostedSlack: "In Slack gepostet",
|
|
276
|
+
shareStorageDescription: "Dateien in einen Ordner legen",
|
|
277
|
+
shareFolder: "Ordner",
|
|
278
|
+
shareFolderPlaceholder: "z. B. Berichte/2026",
|
|
279
|
+
shareFolderHelp: "Wird angelegt, wenn es ihn noch nicht gibt. Leer = oberste Ebene.",
|
|
280
|
+
shareUploading: "Lädt {name} hoch",
|
|
281
|
+
shareSavedFiles: {
|
|
282
|
+
one: "{count} Datei in {where} gespeichert",
|
|
283
|
+
other: "{count} Dateien in {where} gespeichert",
|
|
284
|
+
},
|
|
285
|
+
shareConnectorDescription: "Der Wizard erledigt es in deinem Konto und fragt vor jeder Änderung",
|
|
286
|
+
shareWhatHappens: "Was soll damit passieren?",
|
|
287
|
+
shareWhatHappensPlaceholder: "z. B. Lege eine neue Seite im Bereich Marketing an und füge den Text ein.",
|
|
288
|
+
shareWebsiteDescription: "Der Wizard postet es im Browser – du meldest dich selbst an",
|
|
289
|
+
shareWebsiteAddress: "Adresse der Website",
|
|
290
|
+
shareWhatThere: "Was soll dort passieren?",
|
|
291
|
+
shareWhatTherePlaceholder: "z. B. Lege einen neuen Blog-Beitrag als Entwurf an: Titel, Text und das Bild als Titelbild.",
|
|
292
|
+
sharePostInstructions: "Erstelle einen neuen Beitrag mit dem Text des Ergebnisses und hänge die Dateien an.",
|
|
293
|
+
shareAdInstructions: "Lege eine neue Anzeige als Entwurf an: der Text des Ergebnisses als Anzeigentext, das Bild als Motiv. Nicht veröffentlichen.",
|
|
294
|
+
shareNoCredits: "Dieser Wizard hat gerade kein Guthaben mehr. Versuch es später noch einmal.",
|
|
295
|
+
shareNoReport: "Der Wizard hat nicht gemeldet, ob es geklappt hat.",
|
|
296
|
+
shareCheckInput: "Prüfe deine Angaben.",
|
|
297
|
+
shareRequired: "Fülle das aus.",
|
|
298
|
+
shareNeedsHttps: "Gib eine Adresse mit https:// an.",
|
|
299
|
+
sharePickFile: "Wähle mindestens eine Datei.",
|
|
300
|
+
shareConnectAccount: "Verbinde zuerst das Konto.",
|
|
301
|
+
sharePreparing: "Bereitet die Dateien vor",
|
|
302
|
+
shareFailed: "Das hat nicht geklappt",
|
|
303
|
+
shareTargetUnknown: "Dieses Ziel gibt es für dieses Ergebnis nicht.",
|
|
304
|
+
shareOnlyDone: "Nur fertige Ergebnisse lassen sich teilen.",
|
|
305
|
+
shareBusy: "Es wird gerade schon etwas gesendet.",
|
|
306
|
+
shareTooOften: "Dieser Lauf hat schon sehr oft gesendet.",
|
|
307
|
+
shareInterrupted: "Das Senden wurde unterbrochen. Versuch es noch einmal.",
|
|
308
|
+
shareNotInResult: "„{name}“ ({format}) gehört nicht zu diesem Ergebnis.",
|
|
309
|
+
shareCannotRender: "„{name}“ ließ sich nicht als {format} erstellen. Wähle ein anderes Format.",
|
|
202
310
|
};
|
|
203
311
|
export const SERVER_TEXTS = { en: EN, de: DE };
|
|
204
312
|
/** A line of the server's table in a language; English where the language lacks it. */
|
|
@@ -10,6 +10,7 @@ import { env } from "../env.js";
|
|
|
10
10
|
import { costOf, textModel } from "../models.js";
|
|
11
11
|
import { assertPublicUrl } from "./net-guard.js";
|
|
12
12
|
import { attempt, imageOutput } from "./shared.js";
|
|
13
|
+
import { resolveFile } from "./store.js";
|
|
13
14
|
/** The page as an agent step reads it; retried while the page is between two documents. */
|
|
14
15
|
export async function readPage(page) {
|
|
15
16
|
for (let attempt = 0; attempt < 5; attempt++) {
|
|
@@ -564,6 +565,53 @@ export async function browserTools(ctx, assets, files) {
|
|
|
564
565
|
}),
|
|
565
566
|
execute: ({ reason }) => acting(() => handOver({ reason, fields: [] })),
|
|
566
567
|
});
|
|
568
|
+
tools.browser_upload = createTool({
|
|
569
|
+
id: "browser_upload",
|
|
570
|
+
description: 'Attach a file to the page: give the [number] of the file input, or of the button that opens the file picker ("Add photo", "Upload"). The file is one the person gave (`upload:<id>`), a result of this run (`result:<step>.<format>`) or a kept file\'s path.',
|
|
571
|
+
inputSchema: z.object({
|
|
572
|
+
ref: z.number().describe("[number] of the file input or the upload button."),
|
|
573
|
+
file: z.string().describe("upload:<id>, result:<step>.<format>, or a kept file's path."),
|
|
574
|
+
}),
|
|
575
|
+
execute: ({ ref: n, file }) => acting(async () => {
|
|
576
|
+
const p = await page();
|
|
577
|
+
const target = await atRef(p, n);
|
|
578
|
+
if ("error" in target) {
|
|
579
|
+
return target;
|
|
580
|
+
}
|
|
581
|
+
const el = await handleOf(p, n);
|
|
582
|
+
if (!el) {
|
|
583
|
+
return { error: targetError(n, { error: "gone" }), page: await read(p) };
|
|
584
|
+
}
|
|
585
|
+
const found = await resolveFile(ctx, file);
|
|
586
|
+
const payload = { name: found.name, mimeType: found.mime, buffer: Buffer.from(found.data) };
|
|
587
|
+
await ctx.emit("tool", { code: "attaches", params: { name: found.name } });
|
|
588
|
+
const isFileInput = await el
|
|
589
|
+
.evaluate((node) => node.type === "file")
|
|
590
|
+
.catch(() => false);
|
|
591
|
+
if (isFileInput) {
|
|
592
|
+
await el.setInputFiles(payload, { timeout: 15_000 });
|
|
593
|
+
}
|
|
594
|
+
else {
|
|
595
|
+
// The button opens the browser's file picker; a page that keeps its input hidden
|
|
596
|
+
// and opens no picker takes the file through that input.
|
|
597
|
+
const chooser = p.waitForEvent("filechooser", { timeout: 6000 }).catch(() => null);
|
|
598
|
+
await el.click({ timeout: 10_000 });
|
|
599
|
+
const opened = await chooser;
|
|
600
|
+
if (opened) {
|
|
601
|
+
await opened.setFiles(payload);
|
|
602
|
+
}
|
|
603
|
+
else {
|
|
604
|
+
const hidden = p.locator("input[type=file]").first();
|
|
605
|
+
if (!(await hidden.count())) {
|
|
606
|
+
return { error: "No file picker opened.", page: await read(p) };
|
|
607
|
+
}
|
|
608
|
+
await hidden.setInputFiles(payload, { timeout: 15_000 });
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
await settle(p);
|
|
612
|
+
return { attached: found.name, page: await read(ctx.resources.openPage() ?? p) };
|
|
613
|
+
}),
|
|
614
|
+
});
|
|
567
615
|
tools.browser_download = createTool({
|
|
568
616
|
id: "browser_download",
|
|
569
617
|
description: "Download a file (an invoice PDF, an export) with the browser's sign-in and keep it: click the element with this [number], or fetch this URL. The file is stored under `path` in the wizard's files and added to this step's result.",
|
|
@@ -5,7 +5,7 @@ import { connectionContext } from "../connectors/index.js";
|
|
|
5
5
|
import { inProgram } from "./code.js";
|
|
6
6
|
import { attempt, clip } from "./shared.js";
|
|
7
7
|
import { resolveFile } from "./store.js";
|
|
8
|
-
const FILE_NOTE = " File content never passes through you: returned content is kept as a file and you get its path; to send a
|
|
8
|
+
const FILE_NOTE = " File content never passes through you: returned content is kept as a file and you get its path; to send a file, give `file:<path>` of a kept file or `file:result:<step>.<format>` of a result where an input asks for `*_base64`.";
|
|
9
9
|
/** Above this many actions a connector is offered as "find an action, then call it". */
|
|
10
10
|
const DIRECT_TOOLS = 24;
|
|
11
11
|
const TOOL_NAME = /^[a-zA-Z0-9_-]{1,64}$/;
|
|
@@ -87,7 +87,8 @@ function asks(connection, action) {
|
|
|
87
87
|
}
|
|
88
88
|
return (connection.policy?.[action.id] ?? (action.group === "read" ? "allow" : "ask")) === "ask";
|
|
89
89
|
}
|
|
90
|
-
|
|
90
|
+
/** One connection's actions as tools — for a step that lists it, or a share job that sends through it. */
|
|
91
|
+
export async function toolsOf(connection, ctx, files) {
|
|
91
92
|
const projectId = ctx.project.id;
|
|
92
93
|
const id = connection.connector ?? "";
|
|
93
94
|
let resolved = await resolveConnector(projectId, id);
|
|
@@ -6,6 +6,7 @@ import { z } from "zod";
|
|
|
6
6
|
import { db, schema } from "../db/client.js";
|
|
7
7
|
import { parseDocument, scanDocument } from "../documents/parse.js";
|
|
8
8
|
import { loadAsset } from "../files/storage.js";
|
|
9
|
+
import { parseResultRef, resultFile } from "../sharing/files.js";
|
|
9
10
|
import { deleteRows, listRows, readStoreFile, saveRows, storeFiles } from "../store/index.js";
|
|
10
11
|
import { attempt, clip } from "./shared.js";
|
|
11
12
|
/** Files the person gave on earlier pages: `upload:<id>` is how tools address them. */
|
|
@@ -26,8 +27,24 @@ export async function personUploads(ctx) {
|
|
|
26
27
|
}
|
|
27
28
|
return out;
|
|
28
29
|
}
|
|
29
|
-
/**
|
|
30
|
+
/**
|
|
31
|
+
* A file by the name agents use: `upload:<id>` (given by the person), `result:<step>.<format>`
|
|
32
|
+
* (an output of this run, rendered) or a path in the store.
|
|
33
|
+
*/
|
|
30
34
|
export async function resolveFile(ctx, file) {
|
|
35
|
+
const result = parseResultRef(file);
|
|
36
|
+
if (result) {
|
|
37
|
+
const found = await resultFile({ def: ctx.def, state: ctx.state, store: ctx.store }, result.from, result.format);
|
|
38
|
+
if (!found) {
|
|
39
|
+
throw new Error(`No result ${file}.`);
|
|
40
|
+
}
|
|
41
|
+
const { data, filename, mime } = found.download;
|
|
42
|
+
return {
|
|
43
|
+
data: typeof data === "string" ? new TextEncoder().encode(data) : data,
|
|
44
|
+
name: filename,
|
|
45
|
+
mime,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
31
48
|
if (file.startsWith("upload:")) {
|
|
32
49
|
const found = await loadAsset(file.slice("upload:".length));
|
|
33
50
|
if (!found || found.row.runId !== ctx.runId) {
|
|
@@ -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,Bt as i,Ht as a,Jn as o,Jt as s,Tr as c,Ut as l,Vt as u,Zt as d,on as f,yr as p}from"./ui-s39eGOtW.js";import{t as m}from"./preload-helper-CNEI7N0N.js";import{Nt as h,nt as g,rt as _,tt as v}from"./index-xIz8znhq.js";import{c as y,f as b}from"./settings-menu-Bn5-7Lqk.js";import{ReleaseNotes as x,loadReleases as S,releaseDate as C,releaseLabel as w}from"./ChangelogDialog-BEyz7LNE.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:f(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),[r,i]=(0,T.useState)(``);(0,T.useEffect)(()=>{if(!e||t)return;let r=!1;return m(()=>import(`./oss-credits-BWE03Xax.js`).then(e=>{r||n(e.default)}),[]),()=>{r=!0}},[e,t]),(0,T.useEffect)(()=>{e||i(``)},[e]);let a=r.trim().toLowerCase(),o=e=>a?e.filter(e=>k(a,e.name,e.license,f(e.description))):e,c=e=>a?e.filter(e=>k(a,e.name,e.license,e.version)):e,d=o(E),p=o(D),h=t?[{id:`shared`,label:f(`about.creditsShared`),packages:c(t.shared)},...t.groups.map(e=>({id:e.id,label:e.label,packages:c(e.packages)}))].filter(e=>e.packages.length>0):[],g=d.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:f(`about.creditsHint`)}),(0,O.jsx)(l,{type:`search`,value:r,placeholder:f(`about.search`),onChange:e=>i(e.target.value)}),d.length>0?(0,O.jsx)(j,{title:f(`about.creditsProduct`),children:(0,O.jsx)(M,{credits:d})}):null,p.length>0?(0,O.jsx)(j,{title:f(`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)(s,{})}):h.length>0?(0,O.jsx)(j,{title:f(`about.creditsDeps`),hint:a?void 0:f(`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)(u,{children:f(`about.noMatches`)}):null]})}var F=[`new`,`earlier`,`credits`],I=e=>f(e===`new`?`about.tab.new`:e===`earlier`?`about.tab.earlier`:`about.credits`),L=e=>e===1?f(`about.change`):f(`about.changes`,{n:e});function R({open:e,onClose:t,me:n}){let l=n?.mode===`local`,{data:u,latest:p}=_(l&&e),[m,E]=(0,T.useState)(null),[D,k]=(0,T.useState)(`new`),A=b(F.indexOf(D)),j=u?.newer&&p?p:g;(0,T.useEffect)(()=>{if(!e)return;let t=!1;return E(null),S(j===`0.8.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=l?u?.kind??null:`cloud`;return(0,O.jsxs)(i,{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)(a,{label:f(`common.close`),onClick:t,children:(0,O.jsx)(o,{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:[f(`about.version`,{v:g}),R?` · ${f(`about.kind.${R}`)}`:``]})]}),l?(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:f(`about.title`)})}),(0,O.jsxs)(`div`,{className:r(`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)(s,{})}):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:f(`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)(c,{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{
|
|
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,Bt as i,Jt as a,Ut as o,Vt as s,on as c}from"./ui-s39eGOtW.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/,``):c(`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/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-DBEwyB1f.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:r(`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:c(`about.breaking`)}):null]})]},e.id)})})}function y({open:e,onClose:t,version:n}){let[r,l]=(0,u.useState)(null),[f,h]=(0,u.useState)(``);(0,u.useEffect)(()=>{if(!e||r)return;let t=!1;return _(n).then(e=>{t||l(e)}),()=>{t=!0}},[e,r,n]),(0,u.useEffect)(()=>{e||h(``)},[e]);let y=r?g(r,f):[];return(0,d.jsxs)(i,{open:e,onClose:t,title:c(`about.changelog`),wide:!0,height:`tall`,children:[(0,d.jsx)(`p`,{className:`-mt-3 mb-4 text-[0.875rem] text-ink-3`,children:c(`about.changelogHint`)}),r===null?(0,d.jsx)(`div`,{className:`flex justify-center py-10 text-ink-3`,children:(0,d.jsx)(a,{})}):r.length===0?(0,d.jsx)(s,{children:c(`about.changelogEmpty`)}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(o,{type:`search`,value:f,placeholder:c(`about.search`),onChange:e=>h(e.target.value)}),y.length===0?(0,d.jsx)(s,{children:c(`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,Dt as o,Et as s,Fr as c,Gt as l,Ht as u,Jt as d,Kr as f,Or as p,Ot as m,Qn as h,Qt as g,Tt as _,Vn as v,W as y,Yn as b,_n as x,bt as S,ct as C,en as w,er as T,fr as E,gt as D,ht as O,jn as k,jr as A,ln as j,lt as M,m as N,on as P,pt as F,qn as I,rr as L,sr as ee,st as R,tn as z,ur as B,vt as te,xt as ne,yt as re}from"./ui-s39eGOtW.js";import{t as ie}from"./phone-5SYD9OrJ.js";import{Ft as ae,Kt as oe,Ot as se,Yt as ce,dt as le,lt as ue,t as de,ut as fe}from"./index-xIz8znhq.js";import{n as pe}from"./RunnerView-CxTFM-lx.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=f(),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:o}){return(0,U.jsx)(`button`,{type:`button`,"aria-label":e,title:e,"aria-pressed":t,disabled:r,onClick:i,className:a(`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)(d,{className:`size-5`}):o})}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:a(`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 f=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?P(`talk.speaking`):e.listening?P(`talk.listening`):i?P(`talk.live`):o?P(`talk.connecting`):l?P(`video.ended`):``;return(0,U.jsxs)(`section`,{className:a(`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:a(`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:a(`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:a(`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:a(`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:P(`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:[P(`video.you`),e.muted?(0,U.jsx)(ce,{className:`ml-1.5 inline size-3`}):null]})]}),(0,U.jsxs)(`div`,{className:a(`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:a(`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)(se,{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:P(e.muted?`video.unmute`:`video.mute`),on:!e.muted,onClick:e.toggleMute,children:e.muted?(0,U.jsx)(ce,{className:`size-5`}):(0,U.jsx)(E,{className:`size-5`})}),(0,U.jsx)(W,{label:P(e.camera?`talk.cameraOff`:`talk.camera`),on:e.camera,onClick:()=>e.camera?e.stopCamera():void e.startCamera(),children:e.camera?(0,U.jsx)(b,{className:`size-5`}):(0,U.jsx)(V,{className:`size-5`})}),e.camera&&Se?(0,U.jsx)(W,{label:P(`video.flip`),onClick:()=>void e.flipCamera(),children:(0,U.jsx)(h,{className:`size-5`})}):null,(0,U.jsx)(W,{label:P(`video.leave`),danger:!0,onClick:p,children:(0,U.jsx)(oe,{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 f(),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)(d,{className:`size-4`}):n?(0,U.jsx)(b,{className:`size-5`}):(0,U.jsx)(E,{className:`size-5`}),P(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:P(n?`video.hint`:`talk.joinHint`)}):null]})})]})}var Ee=e=>x[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: ${w(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,a]=(0,H.useState)(`off`),[o,s]=(0,H.useState)(null),[c,l]=(0,H.useState)(!1),[u,d]=(0,H.useState)(!1),[f,p]=(0,H.useState)(!1),[m,h]=(0,H.useState)(`environment`),[g,_]=(0,H.useState)(!1),[v,b]=(0,H.useState)([]),x=(0,H.useRef)(null),S=(0,H.useRef)(null),C=(0,H.useRef)(0),w=(0,H.useRef)(!1);w.current=f;let T=(0,H.useRef)(null),E=(0,H.useRef)(null),D=(0,H.useRef)(null),O=(0,H.useRef)(null),k=(0,H.useRef)(t);k.current=t;let A=(0,H.useRef)(r);A.current=r;let j=(0,H.useRef)(n);j.current=n;let M=(0,H.useRef)(``),N=(0,H.useCallback)(e=>{let t=E.current;t&&t.readyState===`open`&&t.send(JSON.stringify(e))},[]),F=(0,H.useCallback)(()=>{let e=x.current;if(!w.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 S.current?.getTracks()??[])e.stop();S.current=null,x.current&&(x.current.srcObject=null),p(!1)},[]),L=(0,H.useCallback)(async e=>{if(S.current)return;let t=e??`environment`;try{let e=await navigator.mediaDevices.getUserMedia({video:{facingMode:{ideal:t},width:{ideal:1280}},audio:!1});S.current=e;let n=e.getVideoTracks()[0]?.getSettings().facingMode;h(n===`user`||n===`environment`?n:t),x.current&&(x.current.srcObject=e,await x.current.play().catch(()=>void 0)),p(!0)}catch(e){s(e.name===`NotAllowedError`?P(`talk.cameraDenied`):e.message)}},[]),ee=(0,H.useCallback)(async()=>{let e=m===`user`?`environment`:`user`;I(),await L(e)},[m,I,L]),R=(0,H.useCallback)(()=>{_(e=>{for(let t of O.current?.getAudioTracks()??[])t.enabled=e;return!e})},[]),z=(0,H.useCallback)(()=>{I(),E.current?.close(),E.current=null,T.current?.close(),T.current=null;for(let e of O.current?.getTracks()??[])e.stop();O.current=null,D.current&&=(D.current.srcObject=null,D.current.remove(),null),M.current=``,l(!1),d(!1),_(!1),a(`off`)},[I]);(0,H.useEffect)(()=>()=>z(),[z]);let B=(0,H.useCallback)(async(t,n)=>{let r=k.current,i=A.current,a=j.current;switch(t){case`get_state`:return r?Ae(r,i,w.current):`no run`;case`look`:{let e=F();return e?(N({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&&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 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,N]),te=(0,H.useCallback)(async()=>{if(!T.current){s(null),b([]),a(`connecting`);try{let t=await y.post(`/api/runs/${e}/talk`),n=await navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}});O.current=n;let r=new RTCPeerConnection;T.current=r;let i=document.createElement(`audio`);i.autoplay=!0,i.setAttribute(`playsinline`,``),document.body.append(i),D.current=i,r.ontrack=e=>{i.srcObject=e.streams[0]};for(let e of n.getTracks())r.addTrack(e,n);let o=r.createDataChannel(`oai-events`);E.current=o,o.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}switch(t.type){case`output_audio_buffer.started`:l(!0);break;case`output_audio_buffer.stopped`:case`output_audio_buffer.cleared`:l(!1);break;case`input_audio_buffer.speech_started`:{d(!0);let e=Date.now()-C.current>Oe?F():null;e&&(C.current=Date.now(),N({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`:d(!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`;b(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=>{N({type:`conversation.item.create`,item:{type:`function_call_output`,call_id:n,output:e}}),N({type:`response.create`})});break}case`error`:s(String(t.error?.message??`error`))}},o.onopen=()=>{a(`live`);let e=k.current;e&&(M.current=Ae(e,A.current,w.current),N({type:`conversation.item.create`,item:{type:`message`,role:`user`,content:[{type:`input_text`,text:`[state]\n${M.current}\n\nGreet the person in one sentence and ask the first open field.`}]}}),N({type:`response.create`}))},o.onclose=()=>{T.current===r&&z()};let c=await r.createOffer();await r.setLocalDescription(c);let u=await fetch(t.endpoint,{method:`POST`,headers:{authorization:`Bearer ${t.clientSecret}`,"content-type":`application/sdp`},body:c.sdp});if(!u.ok)throw Error(`${P(`talk.failed`)} (${u.status})`);await r.setRemoteDescription({type:`answer`,sdp:await u.text()})}catch(e){z(),s(e.name===`NotAllowedError`?P(`chat.micDenied`):e.message),a(`error`)}}},[e,B,F,N,z]);return(0,H.useEffect)(()=>{if(i!==`live`||!t)return;let e=Ae(t,r,f);if(e===M.current)return;let n=M.current;M.current=e,N({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])&&N({type:`response.create`})},[i,t,r,f,N]),{state:i,error:o,speaking:c,listening:u,start:te,stop:z,camera:f,facing:m,startCamera:L,stopCamera:I,flipCamera:ee,muted:g,toggleMute:R,captions:v,video:x}}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]),i=(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},[]);le(!!n?.readAloud,n?.lang??z,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,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)(se,{kind:e,size:30,interactive:n>=o.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:a(`animate-rise`,e.bare?`w-full pt-1`:`rounded-2xl rounded-tl-md text-[0.9375rem] text-ink leading-relaxed`,!e.bare&&(e.wide?a(`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)(ee,{className:`size-3`}),` `,P(`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":P(`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:o}){return(0,U.jsxs)(`button`,{type:`button`,"aria-pressed":r,disabled:i||o,onClick:e,className:a(`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:[o?(0,U.jsx)(d,{className:`size-4`}):null,t]})}function Le({initial:e=``,placeholder:t,multiline:n,inputProps:r,busy:o,disabled:s,inputRef:c,onSend:l}){let[f,p]=(0,H.useState)(e),m=(0,H.useRef)(null),h=c??m,v=(0,H.useContext)(q),y=N(f,p,{endpoint:v?`/api/runs/${v.runId}/transcribe`:void 0}),x=!!v&&y.supported&&!s;(0,H.useEffect)(()=>{if(!x)return;let e=e=>{(e.metaKey||e.ctrlKey)&&e.shiftKey&&e.key.toLowerCase()===`m`&&(e.preventDefault(),y.toggle())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[x,y.toggle]),(0,H.useEffect)(()=>{!_&&!s&&h.current?.focus()},[s,h]);let S=()=>{o||s||(y.listening&&y.toggle(),l(f)!==!1&&p(``))},C=y.listening?P(`chat.listening`):y.processing?P(`chat.transcribing`):t,w=v?.voice??null,T=!!v?.call,D=v&&!T&&(ue||x||w)?(0,U.jsxs)(`div`,{className:`mb-1 flex shrink-0 items-center`,children:[w?(0,U.jsx)(u,{label:P(w.state===`live`?`talk.stop`:w.state===`connecting`?`talk.connecting`:`talk.start`),"aria-pressed":w.state===`live`,disabled:w.state===`connecting`,onClick:()=>w.state===`live`?w.stop():void w.start(),className:a(`size-9`,w.state===`live`&&`bg-rose-tint text-rose hover:bg-rose-tint hover:text-rose`,w.state===`off`&&v.talk&&`bg-primary text-primary-foreground hover:bg-primary`),children:w.state===`connecting`?(0,U.jsx)(d,{className:`size-4`}):w.state===`live`?(0,U.jsx)(oe,{className:`size-4`}):(0,U.jsx)(ie,{className:`size-4`})}):null,w?.state===`live`?(0,U.jsx)(u,{label:P(w.camera?`talk.cameraOff`:`talk.camera`),"aria-pressed":w.camera,onClick:()=>w.camera?w.stopCamera():void w.startCamera(),className:a(`size-9`,w.camera&&`text-ink`),children:w.camera?(0,U.jsx)(b,{className:`size-4`}):(0,U.jsx)(V,{className:`size-4`})}):null,ue?(0,U.jsx)(u,{label:P(v.readAloud?`chat.readAloudOff`:`chat.readAloud`),"aria-pressed":v.readAloud,onClick:()=>v.setReadAloud(!v.readAloud),className:a(`size-9`,v.readAloud&&`text-ink`),children:v.readAloud?(0,U.jsx)(ae,{className:`size-4`}):(0,U.jsx)(be,{className:`size-4`})}):null,x?(0,U.jsx)(u,{label:P(y.listening?`chat.dictateStop`:`chat.dictate`),"aria-pressed":y.listening,disabled:y.processing,onClick:y.toggle,className:a(`size-9`,y.listening&&`bg-rose-tint text-rose hover:bg-rose-tint hover:text-rose`),children:y.processing?(0,U.jsx)(d,{className:`size-4`}):y.listening?(0,U.jsx)(i,{className:`size-3.5 animate-pulse-dot fill-current`}):(0,U.jsx)(E,{className:`size-4`})}):null]}):null;return(0,U.jsxs)(`form`,{className:`pb-3`,onSubmit:e=>{e.preventDefault(),S()},children:[w&&!T?(0,U.jsx)(`video`,{ref:w.video,muted:!0,playsInline:!0,autoPlay:!0,className:a(`mb-2 ml-auto w-32 rounded-xl bg-black object-cover shadow-soft ring-1 ring-border-soft`,w.camera?`block`:`hidden`)}):null,(0,U.jsxs)(`div`,{className:a(`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`,s&&`opacity-60`),children:[D,n?(0,U.jsx)(g,{ref:h,minRows:1,maxRows:6,value:f,disabled:s,placeholder:C,autoCapitalize:`sentences`,onChange:e=>p(e.target.value),onKeyDown:e=>{e.key===`Enter`&&!e.shiftKey&&!_&&!e.nativeEvent.isComposing&&(e.preventDefault(),S())},className:`min-h-11 border-0 bg-transparent py-2.5 shadow-none focus:ring-0`}):(0,U.jsx)(`input`,{ref:h,...r,value:f,disabled:s,placeholder:C,enterKeyHint:`send`,onChange:e=>p(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":P(`chat.send`),title:P(`chat.send`),disabled:o||s,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:o?(0,U.jsx)(d,{className:`size-4`}):(0,U.jsx)(A,{className:`size-4`})})]}),y.error?(0,U.jsx)(`p`,{className:`mt-1.5 px-3 text-[0.75rem] text-rose`,children:y.error===`denied`?P(`chat.micDenied`):y.error}):T?null:w?.error?(0,U.jsx)(`p`,{className:`mt-1.5 px-3 text-[0.75rem] text-rose`,children:w.error}):w?.state===`live`?(0,U.jsx)(`p`,{className:`mt-1.5 px-3 text-[0.75rem] text-ink-3`,children:w.speaking?P(`talk.speaking`):w.listening?P(`talk.listening`):P(`talk.live`)}):v?.talk&&w?.state===`off`?(0,U.jsx)(`p`,{className:`mt-1.5 px-3 text-[0.75rem] text-ink-3`,children:P(`talk.hint`)}):null]})}function Q({placeholder:e=P(`chat.above`)}){return(0,U.jsx)(Pe,{children:(0,U.jsx)(Le,{disabled:!0,placeholder:e,onSend:()=>!1})})}function Re(e){let t=x[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?P(`chat.required`):null;let r=String(t).trim();if(e.kind===`email`&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(r))return P(`chat.badEmail`);if(e.kind===`url`)try{new URL(r)}catch{return P(`chat.badUrl`)}return e.kind===`number`&&I(r)===null?P(`chat.badNumber`):Array.isArray(t)&&e.multiple&&e.min&&t.length<e.min?P(`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:P(`chat.connected`)});if(e.kind===`list`)return(0,U.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,U.jsx)(p,{className:`size-4`}),` `,P(`chat.checked`)]});if(e.kind===`toggle`)return(0,U.jsx)(U.Fragment,{children:P(t===!0?`run.yes`:`run.no`)});if(ze(t))return(0,U.jsx)(`span`,{className:`italic opacity-80`,children:P(`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(z,{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:a(`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)(B,{className:`size-4`}),` `,P(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)(E,{className:`size-4`}),` `,P(`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:P(`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&&!k(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`,P(`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=>!k(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]),a=e.known??{},[o,s]=(0,H.useState)(()=>R(n,e)),[c,l]=(0,H.useState)(()=>n.fields.some(t=>e.values[t.id]!==void 0)?v(Je(n,e),e.known??{},R(n,e)).slice(0,-1).map(e=>e.id):[]),[u,d]=(0,H.useState)({}),[f,p]=(0,H.useState)(!1),[m,h]=(0,H.useState)(!1),g=v(i,a,o),_=g.filter(e=>c.includes(e.id)),y=g.find(e=>!c.includes(e.id)),b=i.length===1?i[0]:void 0,x=_.at(-1),S=x?()=>l(e=>e.filter(e=>e!==x.id)):void 0;(0,H.useEffect)(()=>{let e=Object.keys(t.fieldErrors),n=v(i,a,o),r=n.findIndex(t=>e.includes(t.id));r>=0&&(l(n.slice(0,r).map(e=>e.id)),d(t.fieldErrors))},[t.fieldErrors]);let C=e=>{t.submitPage(n.id,e).then(h)},w=(0,H.useContext)(q),T=(0,H.useRef)(o);T.current=o;let E=w?.bindPage,D=(0,H.useRef)(C);D.current=C,(0,H.useEffect)(()=>{if(!E)return;let e=v(i,a,o);return E({step:n,fields:e,values:o,setField:(t,n)=>{let r=e.find(e=>e.id===t);return r?Be(r,n)||(s(e=>({...e,[t]:n})),l(e=>e.includes(t)?e:[...e,t]),d({}),null):`no such field on this page`},submit:()=>D.current(T.current)}),()=>E(null)},[E,n,i,a,o]);let k=e=>{if(!y)return!1;let t=Be(y,e);if(t)return d({[y.id]:t}),!1;let n={...o,[y.id]:e},r=[...c,y.id];return s(n),l(r),d({}),v(i,a,n).some(e=>!r.includes(e.id))||C(n),!0},A=[...r.map(e=>c.length?{...e,onEdit:void 0}:e),...Ge(n,`now:${n.id}`,o,e.id,_,b).map((e,t,n)=>t===n.length-1&&e.who===`me`&&y?{...e,onEdit:S}:e)];y?(Re(y)===`control`?A.push(G(`now:${n.id}:${y.id}:control`,(0,U.jsx)(O,{field:y,value:o[y.id],values:o,runId:e.id,view:e,closed:e.closed?.[y.id],onChange:e=>s(t=>({...t,[y.id]:e})),onBusy:p}),{wide:!0})):b||A.push(G(`now:${n.id}:${y.id}`,(0,U.jsx)(He,{field:y}))),u[y.id]&&A.push(G(`now:${n.id}:${y.id}:error`,u[y.id],{tone:`error`}))):t.busy||m?A.push(G(`sending`,(0,U.jsx)(Ie,{}))):t.error&&A.push(G(`send-error`,t.error,{tone:`error`}));let j=(0,U.jsx)(Q,{});if(m||!y&&c.length>0&&t.busy)j=(0,U.jsx)(Q,{placeholder:P(`run.working`)});else if(!y)A.push(X(`now:${n.id}:go`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(Z,{primary:!0,busy:t.busy,onClick:()=>C(o),children:n.cta||P(`run.next`)}),S?(0,U.jsx)(Z,{onClick:S,disabled:t.busy,children:P(`run.back`)}):null]})));else{let r=Re(y),i=!y.required&&y.kind!==`connection`&&y.kind!==`list`?(0,U.jsx)(Z,{onClick:()=>k(void 0),children:P(`chat.skip`)}):null;if(r===`typed`){i&&A.push(X(`now:${n.id}:${y.id}:replies`,i));let e=o[y.id];j=(0,U.jsx)(Pe,{children:(0,U.jsx)(Le,{initial:ze(e)?``:String(e),multiline:y.kind===`textarea`,placeholder:y.placeholder||(b?y.label:P(`chat.placeholder`)),inputProps:Xe(y),busy:t.busy,onSend:e=>k(Ve(y,e))},y.id)})}else if(r===`tapped`)A.push(G(`now:${n.id}:${y.id}:replies`,(0,U.jsx)(Ze,{field:y,view:e,value:o[y.id],onAnswer:k}),{bare:!0}));else{let e=g.filter(e=>!c.includes(e.id)).length===1;A.push(X(`now:${n.id}:${y.id}:replies`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(Z,{primary:!0,disabled:f,onClick:()=>k(o[y.id]),children:e&&n.cta?n.cta:P(`chat.send`)}),i]})))}}return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:e.wizard.avatar,lines:A}),j]})}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 D(e)}}function Ze({field:e,view:t,value:n,onAnswer:r}){let i=new Set(t.closed?.[e.id]?.values.map(String)),[a,o]=(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:P(`run.no`)}),(0,U.jsx)(Z,{on:n===!0,disabled:i.has(`true`),onClick:()=>r(!0),children:P(`run.yes`)})]});let s=e.options??[];return e.kind===`multiselect`?(0,U.jsxs)(Y,{children:[s.map(e=>(0,U.jsx)(Z,{on:a.includes(e),onClick:()=>o(t=>t.includes(e)?t.filter(t=>t!==e):s.filter(n=>n===e||t.includes(n))),children:j(e)},e)),(0,U.jsx)(Z,{primary:!0,disabled:e.required&&!a.length,onClick:()=>r(a),children:a.length||e.required?P(`chat.send`):P(`chat.skip`)})]}):(0,U.jsxs)(Y,{children:[s.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:P(`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:a(`flex max-w-full flex-col gap-1`,l?`w-full`:`w-96`),"data-say-text":t?.message??e.step?.title??P(`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??P(`run.working`)}),(0,U.jsx)(`span`,{className:`text-[0.75rem] text-ink-4 tabular-nums`,children:P(`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)(T,{className:`size-3.5 shrink-0 animate-breathe text-ember`}),(0,U.jsx)(`span`,{className:`truncate`,children:w(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=()=>y.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 y.post(`/api/runs/${e}/browser/seat`,{to:u?`agent`:`person`});o(t.seat)}catch{}finally{c(!1)}};return(0,U.jsx)(m,{runId:e,driving:u,caption:w(t),hint:P(`browser.driving`),onBroken:()=>r(t.id),className:`mt-1.5`,action:(0,U.jsxs)(`button`,{type:`button`,disabled:s,onClick:()=>void d(),className:a(`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`}),P(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:a}){let o=e.shown.filter(e=>e.output),[s,c]=(0,H.useState)(o.length===1?o[0].step.id:null),l=(0,H.useRef)(null),u=[...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}),...o.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)(F,{base:`/api/runs/${e.id}`,step:t,output:r,onSurfaceAction:n.regenerate?()=>{c(t.id),l.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)(te,{runId:e.id,list:t}):(0,U.jsx)(S,{runId:e.id,list:t,editable:!0})]}),{wide:!0}))];t.error&&u.push(G(`review-error`,t.error,{tone:`error`}));let d=n.regenerate&&o.length>0;return u.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)(p,{className:`size-4`}),` `,P(`run.accept`)]}),d&&o.length>1?o.map(({step:e})=>(0,U.jsx)(Z,{on:s===e.id,onClick:()=>c(e.id),children:e.title},e.id)):null]}))),(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:e.wizard.avatar,lines:u}),d?(0,U.jsx)(Pe,{children:(0,U.jsx)(Le,{multiline:!0,inputRef:l,busy:t.busy,placeholder:o.length>1&&!s?P(`run.feedbackPick`):P(`run.feedbackPlaceholder`),disabled:!s,onSend:e=>{let r=e.trim();return!r||!s?!1:(a(r),t.regenerate(n.id,s,r),!0)}})}):(0,U.jsx)(Q,{})]})}function it({view:e,run:t,step:n,before:r,onRestart:i}){let a=e.shown.filter(e=>e.output),o=`/api/runs/${e.id}`,s=[...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}),...a.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)(M,{base:o,stepId:e.id,formats:n,title:r??e.title}),children:r??e.title}),(0,U.jsx)(F,{base:o,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:P(`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)(re,{runId:e.id,list:t}),children:t.label??t.def.title}),(0,U.jsx)(S,{runId:e.id,list:t,editable:!0})]}),{wide:!0}))];return s.push(X(`result:replies`,(0,U.jsxs)(U.Fragment,{children:[a.length?(0,U.jsx)(de,{view:e,title:`${n.title} · ${e.wizard.title}`}):null,i?(0,U.jsxs)(Z,{onClick:i,children:[(0,U.jsx)(L,{className:`size-4`}),` `,P(`run.again`)]}):null,e.canBack?(0,U.jsx)(Z,{onClick:()=>void t.back(),disabled:t.busy,children:P(`run.back`)}):null,e.keeps?(0,U.jsx)(`span`,{className:`ml-1`,children:(0,U.jsx)(ne,{runId:e.id})}):null]}))),(0,U.jsx)(J,{avatar:e.wizard.avatar,lines:s})}function at({runId:e,onRestart:t,onView:n,header:r,footer:i,talk:a=!1,call:c=!1}){let u=pe(e),{view:f}=u,[p,m]=(0,H.useState)(null),h=je(e,f,u,p);(0,H.useEffect)(()=>{n?.(f)},[f,n]);let[g,_]=fe(),v=(0,H.useMemo)(()=>({runId:e,lang:f?.lang??z,readAloud:g,setReadAloud:_,voice:f?.talk?h:null,talk:a,call:!!c,bindPage:m}),[e,f?.lang,f?.talk,g,_,h,a,c]);s(f?.status===`running`&&!f.ask),C(f);let[y,b]=(0,H.useState)({}),[x,S]=(0,H.useState)(null);(0,H.useEffect)(()=>{f&&f.status!==`running`&&S(null)},[f]);let w;if(u.notFound)w=(0,U.jsx)(`div`,{className:`py-24 text-center text-ink-3`,children:P(`run.notFound`)});else if(!f)w=(0,U.jsx)(`div`,{className:`flex justify-center py-24 text-ink-4`,children:(0,U.jsx)(d,{})});else{let e=f.step,n=f.status===`waiting_input`,r=qe(f,f.canBack&&n&&!u.busy?()=>void u.back():void 0);if(f.status===`running`&&f.ask)w=(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:f.wizard.avatar,lines:[...r,G(`ask:${f.ask.id}`,(0,U.jsx)(o,{runId:f.id,ask:f.ask}),{wide:!0})]}),(0,U.jsx)(Q,{})]});else if(f.status===`running`)w=(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:f.wizard.avatar,lines:[...r,...x?[K(`note`,x)]:[],G(`working:${e?.id}`,(0,U.jsx)(Qe,{view:f}),{wide:f.events.some(t=>t.stepId===e?.id&&et(t))?`most`:void 0})]}),(0,U.jsx)(Q,{placeholder:P(`run.working`)})]});else if(f.status===`failed`)w=(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:f.wizard.avatar,lines:[...r,G(`failed`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`span`,{className:`font-medium`,children:P(`run.failed`)}),f.error?(0,U.jsx)(`span`,{className:`mt-0.5 block`,children:(0,U.jsx)(l,{text:f.error})}):null]}),{tone:`error`}),X(`failed:replies`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(Z,{primary:!0,busy:u.busy,onClick:()=>void u.retry(),children:[(0,U.jsx)(L,{className:`size-4`}),` `,P(`run.retry`)]}),f.canBack?(0,U.jsx)(Z,{onClick:()=>void u.back(),disabled:u.busy,children:P(`run.back`)}):null]}))]}),(0,U.jsx)(Q,{})]});else if(f.status===`cancelled`)w=(0,U.jsx)(J,{avatar:f.wizard.avatar,lines:[...r,G(`cancelled`,P(`run.cancelled`)),...t?[X(`cancelled:replies`,(0,U.jsxs)(Z,{primary:!0,onClick:t,children:[(0,U.jsx)(L,{className:`size-4`}),` `,P(`run.again`)]}))]:[]]});else if(e?.type===`page`)w=(0,U.jsx)(Ye,{view:f,run:u,step:e,before:r},e.id);else if(e?.type===`review`){let t=f.shown.map(e=>e.output?.at??``).join(`|`);w=(0,U.jsx)(rt,{view:f,run:u,step:e,before:r,asked:y[e.id]??[],onNote:t=>{S(t),b(n=>({...n,[e.id]:[...n[e.id]??[],t]}))}},`${e.id}:${t}`)}else w=e?.type===`result`?(0,U.jsx)(it,{view:f,run:u,step:e,before:r,onRestart:t}):(0,U.jsx)(J,{avatar:f.wizard.avatar,lines:r})}return c?(0,U.jsx)(q.Provider,{value:v,children:(0,U.jsxs)(`div`,{className:`flex h-full min-h-0 flex-col lg:flex-row`,children:[(0,U.jsx)(Te,{voice:h,view:f,video:c===`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:w})})]})}):(0,U.jsx)(q.Provider,{value:v,children:(0,U.jsx)(Fe,{header:r,footer:i,children:w})})}export{J as a,Z as i,Fe as n,X as o,Q as r,Ne as s,at as t};
|