wizards 0.6.2 → 0.7.1
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/README.md +6 -2
- package/apps/runtime/dist/agents/architect.js +7 -29
- package/apps/runtime/dist/agents/studio-assistant.js +7 -24
- package/apps/runtime/dist/cli/autostart.js +58 -12
- package/apps/runtime/dist/cli/autoupdate.js +221 -0
- package/apps/runtime/dist/cli/connect.js +6 -2
- package/apps/runtime/dist/cli/environment.js +5 -0
- package/apps/runtime/dist/cli/machine.js +7 -3
- package/apps/runtime/dist/cli/main.js +10 -3
- package/apps/runtime/dist/cli/menu.js +27 -8
- package/apps/runtime/dist/cli/processes.js +72 -0
- package/apps/runtime/dist/cli/setup.js +26 -26
- package/apps/runtime/dist/cli/start.js +18 -1
- package/apps/runtime/dist/cli/status.js +51 -17
- package/apps/runtime/dist/cli/uninstall-main.js +20 -0
- package/apps/runtime/dist/cli/uninstall.js +231 -0
- package/apps/runtime/dist/cli/update.js +25 -2
- package/apps/runtime/dist/cli/versions.js +106 -0
- package/apps/runtime/dist/docs/user/command-line.md +3 -2
- package/apps/runtime/dist/docs/user/data.md +1 -1
- package/apps/runtime/dist/docs/user/install.md +29 -6
- package/apps/runtime/dist/engine/input.js +4 -5
- package/apps/runtime/dist/engine/steps.js +3 -3
- package/apps/runtime/dist/engine/template.js +8 -13
- package/apps/runtime/dist/env.js +3 -20
- package/apps/runtime/dist/features.js +2 -2
- package/apps/runtime/dist/index.js +3 -1
- package/apps/runtime/dist/manage.js +7 -0
- package/apps/runtime/dist/models.js +12 -0
- package/apps/runtime/dist/sandbox/docker.js +0 -2
- package/apps/runtime/dist/sandbox/index.js +3 -10
- package/apps/runtime/dist/services/space-categories.js +3 -25
- package/apps/runtime/dist/tools/browser.js +2 -14
- package/apps/runtime/dist/tools/index.js +1 -19
- package/apps/runtime/dist/tools/mail.js +1 -4
- package/apps/runtime/dist/tools/shared.js +30 -3
- package/apps/runtime/dist/update.js +10 -19
- package/apps/web/dist/assets/AboutDialog-BJALish1.js +1 -0
- package/apps/web/dist/assets/{ChangelogDialog-BRiSYyIn.js → ChangelogDialog-CxmHNvq1.js} +1 -1
- package/apps/web/dist/assets/ChatView-C9ASPVJj.js +10 -0
- package/apps/web/dist/assets/EditorPage-BHhNEiKa.js +3 -0
- package/apps/web/dist/assets/{FlowPreview-CUOEzoeJ.js → FlowPreview-DvpjuQdC.js} +1 -1
- package/apps/web/dist/assets/{Harness-D3kTVsF5.js → Harness-Duq0wpfg.js} +2 -2
- package/apps/web/dist/assets/{NewWizardChannels-C3PGe_Zd.js → NewWizardChannels-CGFy67jk.js} +1 -1
- package/apps/web/dist/assets/NewWizardPage-DwBcRWJj.js +7 -0
- package/apps/web/dist/assets/{OnboardingPage-pOPB5TVZ.js → OnboardingPage-YwKzupPI.js} +1 -1
- package/apps/web/dist/assets/ProjectPage-DP1xMjbe.js +1 -0
- package/apps/web/dist/assets/PublicRunner-CECAuP0g.js +1 -0
- package/apps/web/dist/assets/{ReadOnly-CCxZvYrT.js → ReadOnly-BnnGcLWU.js} +1 -1
- package/apps/web/dist/assets/RunDrawer-C0vf8QAc.js +4 -0
- package/apps/web/dist/assets/{RunnerView-pKik3sdE.js → RunnerView-CBrZpjt5.js} +1 -1
- package/apps/web/dist/assets/SettingsPage-C0-mVcs5.js +1 -0
- package/apps/web/dist/assets/SetupPage-BGlYQREU.js +1 -0
- package/apps/web/dist/assets/{SharePage-CZQqp5JM.js → SharePage-IwxlV6WC.js} +1 -1
- package/apps/web/dist/assets/changelog-CPNPseoQ.js +1 -0
- package/apps/web/dist/assets/{esm-D4pSRQgT.js → esm-6TNBQNCD.js} +1 -1
- package/apps/web/dist/assets/index-DU-Onx-c.js +14 -0
- package/apps/web/dist/assets/{lock-DYnHCyRg.js → lock-HLZib0u9.js} +1 -1
- package/apps/web/dist/assets/{phone-DJawY1RF.js → phone-DsxbIcWi.js} +1 -1
- package/apps/web/dist/assets/settings-menu-BMMkIVP1.js +1 -0
- package/apps/web/dist/assets/ui-Brg2qM1A.js +137 -0
- package/apps/web/dist/assets/{upload-DL6NRa4h.js → upload-BaGy0ppG.js} +1 -1
- package/apps/web/dist/index.html +2 -2
- package/apps/web/dist/install.sh +30 -12
- package/apps/web/dist/mcp/flow.html +11 -11
- package/bin/wizards.mjs +17 -3
- package/node_modules/@engenty-wizards/shared/dist/definition.js +6 -17
- package/node_modules/@engenty-wizards/shared/dist/features.d.ts +6 -0
- package/node_modules/@engenty-wizards/shared/dist/features.js +12 -0
- package/node_modules/@engenty-wizards/shared/dist/numbers.d.ts +24 -0
- package/node_modules/@engenty-wizards/shared/dist/numbers.js +54 -0
- package/node_modules/@engenty-wizards/shared/dist/store.d.ts +7 -0
- package/node_modules/@engenty-wizards/shared/dist/store.js +28 -0
- package/package.json +1 -1
- package/apps/runtime/dist/sandbox/agentos.js +0 -191
- package/apps/web/dist/assets/AboutDialog-BrfbtjmR.js +0 -1
- package/apps/web/dist/assets/ChatView-_dYvuuUY.js +0 -10
- package/apps/web/dist/assets/EditorPage-CkRjTRMg.js +0 -3
- package/apps/web/dist/assets/NewWizardPage-B3ol4K43.js +0 -7
- package/apps/web/dist/assets/ProjectPage-Boyptzz_.js +0 -1
- package/apps/web/dist/assets/PublicRunner-DcETj9_E.js +0 -1
- package/apps/web/dist/assets/RunDrawer-hwruVTDG.js +0 -4
- package/apps/web/dist/assets/SettingsPage-BOe6NgFg.js +0 -1
- package/apps/web/dist/assets/SetupPage-81QxPnfE.js +0 -1
- package/apps/web/dist/assets/changelog-CtyrKHAc.js +0 -1
- package/apps/web/dist/assets/index-DnIvQFIg.js +0 -14
- package/apps/web/dist/assets/settings-menu-B_-_EAmK.js +0 -1
- package/apps/web/dist/assets/ui-rh8TaWvT.js +0 -137
|
@@ -202,6 +202,13 @@ export async function tenantChannels(id) {
|
|
|
202
202
|
channels.set(id, { at: Date.now(), value });
|
|
203
203
|
return value;
|
|
204
204
|
}
|
|
205
|
+
/**
|
|
206
|
+
* Forgets what the Manage-App said of the tenant's numbers: the next `tenantChannels` asks.
|
|
207
|
+
* The runtime tests of the Manage-App's channel plugins (sms, calls, whatsapp) call it.
|
|
208
|
+
*/
|
|
209
|
+
export function forgetChannels(id) {
|
|
210
|
+
channels.delete(id);
|
|
211
|
+
}
|
|
205
212
|
/** A person of the tenant asks for its number; what the Manage-App answers with is the request. */
|
|
206
213
|
export async function requestChannelNumber(id, input) {
|
|
207
214
|
channels.delete(id);
|
|
@@ -1042,6 +1042,18 @@ export function usageOf(u) {
|
|
|
1042
1042
|
cachedInputTokens: u?.cachedInputTokens ?? u?.inputTokenDetails?.cacheReadTokens ?? 0,
|
|
1043
1043
|
};
|
|
1044
1044
|
}
|
|
1045
|
+
/** A class's model as Mastra's `Agent` takes it: the AI SDK's model, typed by Mastra's own copy of it. */
|
|
1046
|
+
export function agentModel(resolved) {
|
|
1047
|
+
return resolved.model;
|
|
1048
|
+
}
|
|
1049
|
+
/**
|
|
1050
|
+
* What an agent's call used over all its steps: `totalUsage` where Mastra's result has it, else
|
|
1051
|
+
* `usage`. Takes a stream's promises and a finished call's values alike.
|
|
1052
|
+
*/
|
|
1053
|
+
export async function totalUsage(out) {
|
|
1054
|
+
const result = out;
|
|
1055
|
+
return (await result.totalUsage) ?? (await result.usage);
|
|
1056
|
+
}
|
|
1045
1057
|
/** Provider cost of a text call a runtime that runs alone made; the gateway books the others itself. */
|
|
1046
1058
|
export function costOf(resolved, usage) {
|
|
1047
1059
|
// An installed client answers on its subscription: nothing to book.
|
|
@@ -6,8 +6,6 @@ const WRITE_CHUNK = 48 * 1024;
|
|
|
6
6
|
/** What the engenty-sandbox image carries. The container sits on Docker's default bridge. */
|
|
7
7
|
export const DOCKER_CAPABILITIES = {
|
|
8
8
|
commands: ["bash", "python3", "pip", "uv", "node", "npm", "bun", "jq", "curl", "git", "unzip"],
|
|
9
|
-
python: "shell",
|
|
10
|
-
pythonPackages: "install what you need with pip or uv",
|
|
11
9
|
network: "open internet",
|
|
12
10
|
uses: "calculations, charts or file conversion",
|
|
13
11
|
workdir: WORKDIR,
|
|
@@ -1,27 +1,20 @@
|
|
|
1
1
|
import { env } from "../env.js";
|
|
2
|
-
import { AGENTOS_CAPABILITIES, AgentOsSandbox } from "./agentos.js";
|
|
3
2
|
import { DOCKER_CAPABILITIES, DockerRunSandbox } from "./docker.js";
|
|
4
3
|
/** What this server's sandbox runs, or null when it is switched off. */
|
|
5
4
|
export function sandboxCapabilities() {
|
|
6
5
|
if (env.sandbox === "off") {
|
|
7
6
|
return null;
|
|
8
7
|
}
|
|
9
|
-
return
|
|
8
|
+
return DOCKER_CAPABILITIES;
|
|
10
9
|
}
|
|
11
10
|
export function createSandbox(runId) {
|
|
12
11
|
if (env.sandbox === "off") {
|
|
13
12
|
throw new Error("The sandbox is switched off on this server.");
|
|
14
13
|
}
|
|
15
|
-
return env.
|
|
16
|
-
? new AgentOsSandbox()
|
|
17
|
-
: new DockerRunSandbox(runId, env.sandboxImage);
|
|
14
|
+
return new DockerRunSandbox(runId, env.sandboxImage);
|
|
18
15
|
}
|
|
19
16
|
export function shellToolDescription(caps) {
|
|
20
|
-
|
|
21
|
-
return `Run a shell command in a private Linux sandbox (${caps.commands.join(", ")}). Working directory ${caps.workdir}. Network: ${caps.network}.${python}`;
|
|
22
|
-
}
|
|
23
|
-
export function pythonToolDescription(caps) {
|
|
24
|
-
return `Run Python code in the sandbox (${caps.pythonPackages}). Working directory ${caps.workdir}, shared with run_command and export_file.`;
|
|
17
|
+
return `Run a shell command in a private Linux sandbox (${caps.commands.join(", ")}). Working directory ${caps.workdir}. Network: ${caps.network}.`;
|
|
25
18
|
}
|
|
26
19
|
/** The authoring guide's line about the sandbox tool. */
|
|
27
20
|
export function sandboxGuideLine() {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CATEGORY_TYPES, dayOf, } from "@engenty-wizards/shared/knowledge";
|
|
2
|
+
import { readNumber } from "@engenty-wizards/shared/numbers";
|
|
2
3
|
import { note } from "@engenty-wizards/shared/run";
|
|
3
4
|
import { and, asc, eq, inArray, isNotNull, or, sql } from "drizzle-orm";
|
|
4
5
|
import { nanoid } from "nanoid";
|
|
@@ -42,32 +43,9 @@ function refWhere(ref) {
|
|
|
42
43
|
return eq(t.fileId, ref.fileId);
|
|
43
44
|
}
|
|
44
45
|
// --- typed values ---------------------------------------------------------------
|
|
45
|
-
/** A number as
|
|
46
|
+
/** A number with what stands around it, as `readNumber` reads it: `38 h`, `19 %`, `1,5`. */
|
|
46
47
|
export function numberOf(value) {
|
|
47
|
-
|
|
48
|
-
return Number.isFinite(value) ? value : null;
|
|
49
|
-
}
|
|
50
|
-
if (typeof value !== "string") {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
let s = value.replace(/[^\d,.-]/g, "");
|
|
54
|
-
if (!/\d/.test(s)) {
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
if (s.includes(",") && s.includes(".")) {
|
|
58
|
-
s =
|
|
59
|
-
s.lastIndexOf(",") > s.lastIndexOf(".")
|
|
60
|
-
? s.replace(/\./g, "").replace(",", ".")
|
|
61
|
-
: s.replace(/,/g, "");
|
|
62
|
-
}
|
|
63
|
-
else if (s.includes(",")) {
|
|
64
|
-
s = /^-?\d{1,3}(,\d{3}){2,}$/.test(s) ? s.replace(/,/g, "") : s.replace(",", ".");
|
|
65
|
-
}
|
|
66
|
-
else if (/^-?\d{1,3}(\.\d{3})+$/.test(s)) {
|
|
67
|
-
s = s.replace(/\./g, "");
|
|
68
|
-
}
|
|
69
|
-
const n = Number(s);
|
|
70
|
-
return Number.isFinite(n) ? n : null;
|
|
48
|
+
return readNumber(value, { units: true });
|
|
71
49
|
}
|
|
72
50
|
/** A day, or a day and a time, as milliseconds (UTC, as written: no time zone is applied). */
|
|
73
51
|
export function dateOf(value) {
|
|
@@ -9,7 +9,7 @@ import { nodeScript, PAGE_SCRIPT, settleScript, targetScript, } from "../browser
|
|
|
9
9
|
import { env } from "../env.js";
|
|
10
10
|
import { costOf, textModel } from "../models.js";
|
|
11
11
|
import { assertPublicUrl } from "./net-guard.js";
|
|
12
|
-
import { attempt } from "./shared.js";
|
|
12
|
+
import { attempt, imageOutput } from "./shared.js";
|
|
13
13
|
/** The page as an agent step reads it; retried while the page is between two documents. */
|
|
14
14
|
export async function readPage(page) {
|
|
15
15
|
for (let attempt = 0; attempt < 5; attempt++) {
|
|
@@ -473,19 +473,7 @@ export async function browserTools(ctx, assets, files) {
|
|
|
473
473
|
}
|
|
474
474
|
return { url: p.url(), saved, screenshot: Buffer.from(png).toString("base64") };
|
|
475
475
|
}),
|
|
476
|
-
toModelOutput: (
|
|
477
|
-
if (!out?.screenshot) {
|
|
478
|
-
return { type: "json", value: out };
|
|
479
|
-
}
|
|
480
|
-
const { screenshot, ...rest } = out;
|
|
481
|
-
return {
|
|
482
|
-
type: "content",
|
|
483
|
-
value: [
|
|
484
|
-
{ type: "text", text: JSON.stringify(rest) },
|
|
485
|
-
{ type: "image-data", data: screenshot, mediaType: "image/png" },
|
|
486
|
-
],
|
|
487
|
-
};
|
|
488
|
-
},
|
|
476
|
+
toModelOutput: imageOutput("screenshot"),
|
|
489
477
|
});
|
|
490
478
|
const handOver = async (input) => {
|
|
491
479
|
const p = await page();
|
|
@@ -8,7 +8,7 @@ import { generateImageMedia } from "../media/generate.js";
|
|
|
8
8
|
import { markMedia } from "../media/marking.js";
|
|
9
9
|
import { gatewayTools, isHarnessVendor } from "../models.js";
|
|
10
10
|
import { htmlToMarkdown } from "../render/convert.js";
|
|
11
|
-
import {
|
|
11
|
+
import { sandboxCapabilities, shellToolDescription } from "../sandbox/index.js";
|
|
12
12
|
import { snapshotFile } from "../services/files.js";
|
|
13
13
|
import { hasStoreFiles } from "../store/index.js";
|
|
14
14
|
import { browserTools } from "./browser.js";
|
|
@@ -183,24 +183,6 @@ export async function buildStepTools(step, ctx, resolved, uploads) {
|
|
|
183
183
|
.exec(command, { timeoutMs: timeoutMs(timeoutSeconds) }));
|
|
184
184
|
},
|
|
185
185
|
});
|
|
186
|
-
if (sandbox.python === "tool") {
|
|
187
|
-
tools.run_python = createTool({
|
|
188
|
-
id: "run_python",
|
|
189
|
-
description: pythonToolDescription(sandbox),
|
|
190
|
-
inputSchema: z.object({
|
|
191
|
-
code: z.string(),
|
|
192
|
-
packages: z.array(z.string()).optional().describe("PyPI packages the code imports"),
|
|
193
|
-
timeoutSeconds: z.number().optional(),
|
|
194
|
-
}),
|
|
195
|
-
execute: async ({ code, packages, timeoutSeconds }) => {
|
|
196
|
-
await ctx.emit("tool", { code: "python" });
|
|
197
|
-
return report(await ctx.resources.sandboxHandle().runPython(code, {
|
|
198
|
-
packages,
|
|
199
|
-
timeoutMs: timeoutMs(timeoutSeconds),
|
|
200
|
-
}));
|
|
201
|
-
},
|
|
202
|
-
});
|
|
203
|
-
}
|
|
204
186
|
tools.export_file = createTool({
|
|
205
187
|
id: "export_file",
|
|
206
188
|
description: "Hand a file from the sandbox to the person as a result (e.g. a chart PNG, a CSV).",
|
|
@@ -2,7 +2,7 @@ import { createTool } from "@mastra/core/tools";
|
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
import { connectionContext } from "../connectors/index.js";
|
|
4
4
|
import { mailAction, mailSearchInput, } from "../connectors/mail.js";
|
|
5
|
-
import { htmlToPdf } from "../render/convert.js";
|
|
5
|
+
import { escapeHtml, htmlToPdf } from "../render/convert.js";
|
|
6
6
|
import { guardHtml } from "../render/guard.js";
|
|
7
7
|
import { attempt, clip } from "./shared.js";
|
|
8
8
|
const NOT_CONNECTED = "The person has not connected a mailbox. Go on without mail and say in your result that the mailbox is not connected.";
|
|
@@ -102,6 +102,3 @@ export function mailTools(step, ctx, files) {
|
|
|
102
102
|
});
|
|
103
103
|
return tools;
|
|
104
104
|
}
|
|
105
|
-
function escapeHtml(s) {
|
|
106
|
-
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
107
|
-
}
|
|
@@ -1,17 +1,44 @@
|
|
|
1
|
+
import { ServiceError } from "../services/errors.js";
|
|
1
2
|
import { writeStoreFile } from "../store/index.js";
|
|
2
3
|
export const TEXT_LIMIT = 8000;
|
|
3
4
|
export function clip(s, limit = TEXT_LIMIT) {
|
|
4
5
|
return s.length > limit ? `${s.slice(0, limit)}\n…[truncated ${s.length - limit} chars]` : s;
|
|
5
6
|
}
|
|
6
|
-
/**
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* A tool failure is something the model reads and reacts to, never a crashed step or turn. A
|
|
9
|
+
* service's refusal brings its data along (`issues`, `fields`, `column`), so the model can fix
|
|
10
|
+
* what it sent. The message is clipped to `limit` characters (400): a site or an API can answer
|
|
11
|
+
* with a whole page; the studio's agents, whose failures are the runtime's own, pass `Infinity`.
|
|
12
|
+
*/
|
|
13
|
+
export async function attempt(run, { limit = 400 } = {}) {
|
|
8
14
|
try {
|
|
9
15
|
return await run();
|
|
10
16
|
}
|
|
11
17
|
catch (err) {
|
|
12
|
-
|
|
18
|
+
const error = String(err?.message ?? err).slice(0, limit);
|
|
19
|
+
return err instanceof ServiceError ? { error, ...err.data } : { error };
|
|
13
20
|
}
|
|
14
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* A tool's `toModelOutput` for a result that carries a picture: the base64 under `key` goes to the
|
|
24
|
+
* model as an image (of `mime`, else PNG), the rest as text beside it – as JSON, or as `text`
|
|
25
|
+
* makes it. A result without the picture, a failure among them, goes as JSON.
|
|
26
|
+
*/
|
|
27
|
+
export function imageOutput(key, text = (rest) => JSON.stringify(rest)) {
|
|
28
|
+
return (out) => {
|
|
29
|
+
if (!out || out.error || typeof out[key] !== "string" || !out[key]) {
|
|
30
|
+
return { type: "json", value: out };
|
|
31
|
+
}
|
|
32
|
+
const { [key]: data, mime, ...rest } = out;
|
|
33
|
+
return {
|
|
34
|
+
type: "content",
|
|
35
|
+
value: [
|
|
36
|
+
{ type: "text", text: text(rest) },
|
|
37
|
+
{ type: "image-data", data, mediaType: mime ?? "image/png" },
|
|
38
|
+
],
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
}
|
|
15
42
|
/**
|
|
16
43
|
* Files a step collects go two places: the wizard's store (kept for next time) and the step's
|
|
17
44
|
* result (this run's download). One keeper per step, so a file saved twice is one result.
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { mkdirSync, openSync } from "node:fs";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
+
import { autoUpdatePolicy, isNewer, scheduleUpdateChecks, updateNotice, } from "./cli/autoupdate.js";
|
|
4
5
|
import { installedByScript, isCheckout, layout, packageRoot, packageVersion } from "./cli/home.js";
|
|
6
|
+
export { isNewer };
|
|
5
7
|
const RELEASES_URL = process.env.ENGENTY_WIZARDS_RELEASES_URL?.trim() ||
|
|
6
8
|
"https://api.github.com/repos/engenty/wizards/releases/latest";
|
|
7
9
|
/** How long an answer from GitHub holds, found or not, before the runtime asks again. */
|
|
@@ -23,25 +25,6 @@ export function onRestart(shutdown) {
|
|
|
23
25
|
function restarts() {
|
|
24
26
|
return process.env[RESTARTS] === "1" && restart !== null;
|
|
25
27
|
}
|
|
26
|
-
/** `0.2.0` or `v0.2.0` as numbers; anything after a `-` (a pre-release) is ignored. */
|
|
27
|
-
function numbers(version) {
|
|
28
|
-
return version
|
|
29
|
-
.replace(/^v/, "")
|
|
30
|
-
.split("-")[0]
|
|
31
|
-
.split(".")
|
|
32
|
-
.map((part) => Number.parseInt(part, 10) || 0);
|
|
33
|
-
}
|
|
34
|
-
export function isNewer(latest, current) {
|
|
35
|
-
const a = numbers(latest);
|
|
36
|
-
const b = numbers(current);
|
|
37
|
-
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
38
|
-
const diff = (a[i] ?? 0) - (b[i] ?? 0);
|
|
39
|
-
if (diff !== 0) {
|
|
40
|
-
return diff > 0;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
28
|
const enabled = () => !process.env.ENGENTY_WIZARDS_NO_UPDATE_CHECK;
|
|
46
29
|
/** The newest release GitHub knows; `fresh` asks again although the last answer still holds. */
|
|
47
30
|
async function newestRelease(fresh = false) {
|
|
@@ -78,6 +61,8 @@ export async function updateStatus(fresh = false) {
|
|
|
78
61
|
const current = packageVersion();
|
|
79
62
|
const { latest, url } = await newestRelease(fresh);
|
|
80
63
|
const kind = installKind();
|
|
64
|
+
const paths = layout();
|
|
65
|
+
const notice = kind === "script" ? updateNotice(paths, current) : { updated: null, pending: null };
|
|
81
66
|
return {
|
|
82
67
|
current,
|
|
83
68
|
latest,
|
|
@@ -89,8 +74,14 @@ export async function updateStatus(fresh = false) {
|
|
|
89
74
|
applying,
|
|
90
75
|
checkedAt: cached?.at ?? null,
|
|
91
76
|
enabled: enabled(),
|
|
77
|
+
...notice,
|
|
92
78
|
};
|
|
93
79
|
}
|
|
80
|
+
const autoPolicy = () => autoUpdatePolicy(layout(), { installed: installKind() === "script" });
|
|
81
|
+
/** The runtime looks for an update when it starts and once a day; it switches nothing itself. */
|
|
82
|
+
export function startUpdateChecks() {
|
|
83
|
+
scheduleUpdateChecks(layout(), autoPolicy);
|
|
84
|
+
}
|
|
94
85
|
/**
|
|
95
86
|
* Runs `wizards update` in the background, the same steps as in a terminal. Afterwards a
|
|
96
87
|
* runtime started by the command restarts into the new version; any other keeps running the old
|
|
@@ -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,Hn as a,It as o,Kt as s,Nt as c,Pt as l,Vt as u,Wt as d,fr as f,vr as p}from"./ui-Brg2qM1A.js";import{t as m}from"./preload-helper-CNEI7N0N.js";import{G as h,U as g,W as _,xt as v}from"./index-DU-Onx-c.js";import{c as y,f as b}from"./settings-menu-BMMkIVP1.js";import{ReleaseNotes as x,loadReleases as S,releaseDate as C,releaseLabel as w}from"./ChangelogDialog-CxmHNvq1.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)(f,{"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:f}=h(o&&e),[m,E]=(0,T.useState)(null),[D,k]=(0,T.useState)(`new`),A=b(F.indexOf(D)),j=l?.newer&&f?f:_;(0,T.useEffect)(()=>{if(!e)return;let t=!1;return E(null),S(j===`0.7.1`?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)(p,{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{$t as r,It as i,Kt as a,Nt as o,Pt as s,Vt as c}from"./ui-
|
|
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-Brg2qM1A.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-CPNPseoQ.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,$t as i,Fn as a,Ft as o,Gn as s,Gt as c,Jt as l,Kn as u,Kt as d,Or as f,Rt as p,Tn as m,Un as h,Vn as g,Vt as _,W as v,Xn as y,ar as b,bt as x,dt as S,er as C,ft as w,lt as T,m as E,mt as D,nn as O,nt as k,pt as A,qn as j,qt as M,rr as N,rt as P,st as F,tt as I,un as L,ut as ee,vt as R,wr as z,xr as B,xt as te,yt as ne,zr as re}from"./ui-Brg2qM1A.js";import{t as ie}from"./phone-DsxbIcWi.js";import{$ as ae,Ct as oe,Ft as se,Mt as ce,Q as le,Z as ue,gt as de,t as fe}from"./index-DU-Onx-c.js";import{n as pe}from"./RunnerView-CBrZpjt5.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=f(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=f(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=f(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=f(ye),xe=re(),H=e(t(),1),U=e(n(),1),Se=typeof window<`u`&&window.matchMedia(`(pointer: coarse)`).matches;function Ce({since:e}){let[t,n]=(0,H.useState)(Date.now());if((0,H.useEffect)(()=>{if(!e)return;let t=setInterval(()=>n(Date.now()),1e3);return()=>clearInterval(t)},[e]),!e)return null;let r=Math.max(0,Math.floor((t-e)/1e3)),i=String(Math.floor(r/60)).padStart(2,`0`),a=String(r%60).padStart(2,`0`);return(0,U.jsxs)(`span`,{className:`font-mono text-[0.8125rem] text-white/60 tabular-nums`,children:[i,`:`,a]})}function W({label:e,on:t,danger:n,busy:r,onClick:i,children:a}){return(0,U.jsx)(`button`,{type:`button`,"aria-label":e,title:e,"aria-pressed":t,disabled:r,onClick:i,className: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,U.jsx)(_,{className:`size-5`}):a})}function we({voice:e}){let t=(0,H.useRef)(null),{captions:n}=e;return(0,H.useEffect)(()=>{n.length&&t.current?.scrollIntoView({block:`end`})},[n]),n.length?(0,U.jsx)(`div`,{className:`min-h-0 flex-1 overflow-y-auto px-4 sm:px-5`,children:(0,U.jsxs)(`ol`,{className:`mx-auto flex max-w-[720px] flex-col gap-2 py-2`,children:[n.map(e=>(0,U.jsx)(`li`,{className:d(`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 a=e.state===`live`,o=e.state===`connecting`,[c,l]=(0,H.useState)(null),[u,f]=(0,H.useState)(!1);(0,H.useEffect)(()=>{l(a?Date.now():null)},[a]);let p=async()=>{f(!1),await e.start(),n&&await e.startCamera()},m=()=>{e.stop(),f(!0)},g=n||e.camera,v=[...e.captions].reverse().find(e=>e.who===`bot`),y=[...e.captions].reverse().find(e=>e.who===`me`),x=e.speaking?i(`talk.speaking`):e.listening?i(`talk.listening`):a?i(`talk.live`):o?i(`talk.connecting`):u?i(`video.ended`):``;return(0,U.jsxs)(`section`,{className:d(`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??``}),x?(0,U.jsxs)(`span`,{className:`flex items-center gap-1.5 text-[0.8125rem] text-white/70`,children:[a?(0,U.jsx)(`span`,{className:d(`size-2 rounded-full`,e.speaking?`animate-pulse-dot bg-emerald-400`:`bg-rose`)}):null,x]}):null,(0,U.jsx)(Ce,{since:c})]}),(0,U.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&&a&&e.captions.length?`h-[38%]`:g?``:`flex-1`),children:[(0,U.jsxs)(`div`,{className:d(`relative min-h-0 overflow-hidden rounded-2xl bg-neutral-900`,!g&&`hidden`),children:[(0,U.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,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:i(`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:[i(`video.you`),e.muted?(0,U.jsx)(se,{className:`ml-1.5 inline size-3`}):null]})]}),(0,U.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,U.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,U.jsx)(de,{kind:t?.wizard.avatar??`round`,size:g?140:200,fluffy:!0,interactive:!1})}),g?(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]})]}),a&&!g?(0,U.jsx)(we,{voice:e}):a&&(v||y)?(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:[y?(0,U.jsx)(`p`,{className:`line-clamp-1 text-[0.8125rem] text-white/50`,children:y.text}):null,v?(0,U.jsx)(`p`,{className:`line-clamp-3 text-[0.9375rem] text-white/95 leading-snug`,children:v.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:a?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(W,{label:i(e.muted?`video.unmute`:`video.mute`),on:!e.muted,onClick:e.toggleMute,children:e.muted?(0,U.jsx)(se,{className:`size-5`}):(0,U.jsx)(b,{className:`size-5`})}),(0,U.jsx)(W,{label:i(e.camera?`talk.cameraOff`:`talk.camera`),on:e.camera,onClick:()=>e.camera?e.stopCamera():void e.startCamera(),children:e.camera?(0,U.jsx)(h,{className:`size-5`}):(0,U.jsx)(V,{className:`size-5`})}),e.camera&&Se?(0,U.jsx)(W,{label:i(`video.flip`),onClick:()=>void e.flipCamera(),children:(0,U.jsx)(s,{className:`size-5`})}):null,(0,U.jsx)(W,{label:i(`video.leave`),danger:!0,onClick:m,children:(0,U.jsx)(ce,{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 p(),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)(_,{className:`size-4`}):n?(0,U.jsx)(h,{className:`size-5`}):(0,U.jsx)(b,{className:`size-5`}),i(u?`video.rejoin`:n?`video.join`:`talk.start`)]}),!u&&!e.error?(0,U.jsx)(`p`,{className:`max-w-sm text-center text-[0.75rem] text-white/50`,children:i(n?`video.hint`:`talk.joinHint`)}):null]})})]})}var Ee=e=>L[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: ${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}: ${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[a,o]=(0,H.useState)(`off`),[s,c]=(0,H.useState)(null),[l,u]=(0,H.useState)(!1),[d,f]=(0,H.useState)(!1),[p,m]=(0,H.useState)(!1),[h,g]=(0,H.useState)(`environment`),[_,y]=(0,H.useState)(!1),[b,x]=(0,H.useState)([]),S=(0,H.useRef)(null),C=(0,H.useRef)(null),w=(0,H.useRef)(0),T=(0,H.useRef)(!1);T.current=p;let E=(0,H.useRef)(null),D=(0,H.useRef)(null),O=(0,H.useRef)(null),k=(0,H.useRef)(null),A=(0,H.useRef)(t);A.current=t;let j=(0,H.useRef)(r);j.current=r;let M=(0,H.useRef)(n);M.current=n;let N=(0,H.useRef)(``),P=(0,H.useCallback)(e=>{let t=D.current;t&&t.readyState===`open`&&t.send(JSON.stringify(e))},[]),F=(0,H.useCallback)(()=>{let e=S.current;if(!T.current||!e||e.videoWidth===0)return null;let t=Math.min(1,De/e.videoWidth),n=document.createElement(`canvas`);return n.width=Math.round(e.videoWidth*t),n.height=Math.round(e.videoHeight*t),n.getContext(`2d`)?.drawImage(e,0,0,n.width,n.height),n.toDataURL(`image/jpeg`,.75)},[]),I=(0,H.useCallback)(()=>{for(let e of C.current?.getTracks()??[])e.stop();C.current=null,S.current&&(S.current.srcObject=null),m(!1)},[]),L=(0,H.useCallback)(async e=>{if(C.current)return;let t=e??`environment`;try{let e=await navigator.mediaDevices.getUserMedia({video:{facingMode:{ideal:t},width:{ideal:1280}},audio:!1});C.current=e;let n=e.getVideoTracks()[0]?.getSettings().facingMode;g(n===`user`||n===`environment`?n:t),S.current&&(S.current.srcObject=e,await S.current.play().catch(()=>void 0)),m(!0)}catch(e){c(e.name===`NotAllowedError`?i(`talk.cameraDenied`):e.message)}},[]),ee=(0,H.useCallback)(async()=>{let e=h===`user`?`environment`:`user`;I(),await L(e)},[h,I,L]),R=(0,H.useCallback)(()=>{y(e=>{for(let t of k.current?.getAudioTracks()??[])t.enabled=e;return!e})},[]),z=(0,H.useCallback)(()=>{I(),D.current?.close(),D.current=null,E.current?.close(),E.current=null;for(let e of k.current?.getTracks()??[])e.stop();k.current=null,O.current&&=(O.current.srcObject=null,O.current.remove(),null),N.current=``,u(!1),f(!1),y(!1),o(`off`)},[I]);(0,H.useEffect)(()=>()=>z(),[z]);let B=(0,H.useCallback)(async(t,n)=>{let r=A.current,i=j.current,a=M.current;switch(t){case`get_state`:return r?Ae(r,i,T.current):`no run`;case`look`:{let e=F();return e?(P({type:`conversation.item.create`,item:{type:`message`,role:`user`,content:[{type:`input_text`,text:`[camera] what the person shows right now`},{type:`input_image`,image_url:e}]}}),`a picture arrived as the next message`):`the camera is off; ask the person to switch it on`}case`take_photo`:{if(!i)return`no page is open`;let t=i.fields.find(e=>e.id===String(n.field??``));if(t?.kind!==`image`)return`no such photo field on this page`;let r=F();if(!r)return`the camera is off; ask the person to switch it on`;try{let n=await(await fetch(r)).blob(),a=new File([n],`photo-${Date.now()}.jpg`,{type:`image/jpeg`}),o=await v.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 v.post(`/api/runs/${e}/ask/${r.ask.id}`,{type:n.allow?`done`:`skip`}),n.allow?`allowed`:`skipped`}catch(e){return`refused: ${e.message}`}case`go_back`:return await a.back()?`went back; wait for the state`:a.error??`refused`;default:return`unknown tool ${t}`}},[e,F,P]),te=(0,H.useCallback)(async()=>{if(!E.current){c(null),x([]),o(`connecting`);try{let t=await v.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 a=document.createElement(`audio`);a.autoplay=!0,a.setAttribute(`playsinline`,``),document.body.append(a),O.current=a,r.ontrack=e=>{a.srcObject=e.streams[0]};for(let e of n.getTracks())r.addTrack(e,n);let s=r.createDataChannel(`oai-events`);D.current=s,s.onmessage=e=>{let t;try{t=JSON.parse(e.data)}catch{return}switch(t.type){case`output_audio_buffer.started`:u(!0);break;case`output_audio_buffer.stopped`:case`output_audio_buffer.cleared`:u(!1);break;case`input_audio_buffer.speech_started`:{f(!0);let e=Date.now()-w.current>Oe?F():null;e&&(w.current=Date.now(),P({type:`conversation.item.create`,item:{type:`message`,role:`user`,content:[{type:`input_text`,text:`[camera] what the person shows while speaking`},{type:`input_image`,image_url:e}]}}));break}case`input_audio_buffer.speech_stopped`:f(!1);break;case`response.output_audio_transcript.done`:case`conversation.item.input_audio_transcription.completed`:{let e=String(t.transcript??``).trim();if(e){let n=t.type===`response.output_audio_transcript.done`?`bot`:`me`;x(t=>[...t.slice(-199),{id:`${Date.now()}:${n}`,who:n,text:e}])}break}case`response.function_call_arguments.done`:{let e=String(t.name??``),n=String(t.call_id??``),r={};try{r=JSON.parse(String(t.arguments??`{}`))}catch{}B(e,r).then(e=>{P({type:`conversation.item.create`,item:{type:`function_call_output`,call_id:n,output:e}}),P({type:`response.create`})});break}case`error`:c(String(t.error?.message??`error`))}},s.onopen=()=>{o(`live`);let e=A.current;e&&(N.current=Ae(e,j.current,T.current),P({type:`conversation.item.create`,item:{type:`message`,role:`user`,content:[{type:`input_text`,text:`[state]\n${N.current}\n\nGreet the person in one sentence and ask the first open field.`}]}}),P({type:`response.create`}))},s.onclose=()=>{E.current===r&&z()};let l=await r.createOffer();await r.setLocalDescription(l);let d=await fetch(t.endpoint,{method:`POST`,headers:{authorization:`Bearer ${t.clientSecret}`,"content-type":`application/sdp`},body:l.sdp});if(!d.ok)throw Error(`${i(`talk.failed`)} (${d.status})`);await r.setRemoteDescription({type:`answer`,sdp:await d.text()})}catch(e){z(),c(e.name===`NotAllowedError`?i(`chat.micDenied`):e.message),o(`error`)}}},[e,B,F,P,z]);return(0,H.useEffect)(()=>{if(a!==`live`||!t)return;let e=Ae(t,r,p);if(e===N.current)return;let n=N.current;N.current=e,P({type:`conversation.item.create`,item:{type:`message`,role:`user`,content:[{type:`input_text`,text:`[state]\n${e}`}]}}),(t.status===`running`&&n.startsWith(`status: running`)&&!n.includes(`working on: `)||t.status!==`running`||n.split(`
|
|
9
|
+
`)[1]!==e.split(`
|
|
10
|
+
`)[1])&&P({type:`response.create`})},[a,t,r,p,P]),{state:a,error:s,speaking:l,listening:d,start:te,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}),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]),a=(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},[]);ae(!!n?.readAloud,n?.lang??l,r,a);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)(de,{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: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,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)(C,{className:`size-3`}),` `,i(`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":i(`run.working`),children:[0,1,2].map(e=>(0,U.jsx)(`span`,{className:`size-1.5 animate-typing rounded-full bg-ink-3`,style:{animationDelay:`${e*160}ms`}},e))})}function Y({children:e}){return(0,U.jsx)(`div`,{className:`flex flex-wrap items-center gap-2`,children:e})}var X=(e,t)=>G(e,(0,U.jsx)(Y,{children:t}),{bare:!0});function Z({onClick:e,children:t,primary:n,on:r,disabled:i,busy:a}){return(0,U.jsxs)(`button`,{type:`button`,"aria-pressed":r,disabled:i||a,onClick:e,className: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,U.jsx)(_,{className:`size-4`}):null,t]})}function Le({initial:e=``,placeholder:t,multiline:n,inputProps:r,busy:a,disabled:s,inputRef:l,onSend:f}){let[p,m]=(0,H.useState)(e),g=(0,H.useRef)(null),v=l??g,y=(0,H.useContext)(q),x=E(p,m,{endpoint:y?`/api/runs/${y.runId}/transcribe`:void 0}),S=!!y&&x.supported&&!s;(0,H.useEffect)(()=>{if(!S)return;let e=e=>{(e.metaKey||e.ctrlKey)&&e.shiftKey&&e.key.toLowerCase()===`m`&&(e.preventDefault(),x.toggle())};return window.addEventListener(`keydown`,e),()=>window.removeEventListener(`keydown`,e)},[S,x.toggle]),(0,H.useEffect)(()=>{!R&&!s&&v.current?.focus()},[s,v]);let C=()=>{a||s||(x.listening&&x.toggle(),f(p)!==!1&&m(``))},w=x.listening?i(`chat.listening`):x.processing?i(`chat.transcribing`):t,T=y?.voice??null,D=!!y?.call,O=y&&!D&&(ue||S||T)?(0,U.jsxs)(`div`,{className:`mb-1 flex shrink-0 items-center`,children:[T?(0,U.jsx)(o,{label:i(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`&&y.talk&&`bg-primary text-primary-foreground hover:bg-primary`),children:T.state===`connecting`?(0,U.jsx)(_,{className:`size-4`}):T.state===`live`?(0,U.jsx)(ce,{className:`size-4`}):(0,U.jsx)(ie,{className:`size-4`})}):null,T?.state===`live`?(0,U.jsx)(o,{label:i(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,U.jsx)(h,{className:`size-4`}):(0,U.jsx)(V,{className:`size-4`})}):null,ue?(0,U.jsx)(o,{label:i(y.readAloud?`chat.readAloudOff`:`chat.readAloud`),"aria-pressed":y.readAloud,onClick:()=>y.setReadAloud(!y.readAloud),className:d(`size-9`,y.readAloud&&`text-ink`),children:y.readAloud?(0,U.jsx)(oe,{className:`size-4`}):(0,U.jsx)(be,{className:`size-4`})}):null,S?(0,U.jsx)(o,{label:i(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,U.jsx)(_,{className:`size-4`}):x.listening?(0,U.jsx)(u,{className:`size-3.5 animate-pulse-dot fill-current`}):(0,U.jsx)(b,{className:`size-4`})}):null]}):null;return(0,U.jsxs)(`form`,{className:`pb-3`,onSubmit:e=>{e.preventDefault(),C()},children:[T&&!D?(0,U.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,U.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`,s&&`opacity-60`),children:[O,n?(0,U.jsx)(c,{ref:v,minRows:1,maxRows:6,value:p,disabled:s,placeholder:w,autoCapitalize:`sentences`,onChange:e=>m(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,U.jsx)(`input`,{ref:v,...r,value:p,disabled:s,placeholder:w,enterKeyHint:`send`,onChange:e=>m(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":i(`chat.send`),title:i(`chat.send`),disabled:a||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:a?(0,U.jsx)(_,{className:`size-4`}):(0,U.jsx)(z,{className:`size-4`})})]}),x.error?(0,U.jsx)(`p`,{className:`mt-1.5 px-3 text-[0.75rem] text-rose`,children:x.error===`denied`?i(`chat.micDenied`):x.error}):D?null:T?.error?(0,U.jsx)(`p`,{className:`mt-1.5 px-3 text-[0.75rem] text-rose`,children:T.error}):T?.state===`live`?(0,U.jsx)(`p`,{className:`mt-1.5 px-3 text-[0.75rem] text-ink-3`,children:T.speaking?i(`talk.speaking`):T.listening?i(`talk.listening`):i(`talk.live`)}):y?.talk&&T?.state===`off`?(0,U.jsx)(`p`,{className:`mt-1.5 px-3 text-[0.75rem] text-ink-3`,children:i(`talk.hint`)}):null]})}function Q({placeholder:e=i(`chat.above`)}){return(0,U.jsx)(Pe,{children:(0,U.jsx)(Le,{disabled:!0,placeholder:e,onSend:()=>!1})})}function Re(e){let t=L[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?i(`chat.required`):null;let r=String(t).trim();if(e.kind===`email`&&!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(r))return i(`chat.badEmail`);if(e.kind===`url`)try{new URL(r)}catch{return i(`chat.badUrl`)}return e.kind===`number`&&g(r)===null?i(`chat.badNumber`):Array.isArray(t)&&e.multiple&&e.min&&t.length<e.min?i(`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:i(`chat.connected`)});if(e.kind===`list`)return(0,U.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,U.jsx)(B,{className:`size-4`}),` `,i(`chat.checked`)]});if(e.kind===`toggle`)return(0,U.jsx)(U.Fragment,{children:i(t===!0?`run.yes`:`run.no`)});if(ze(t))return(0,U.jsx)(`span`,{className:`italic opacity-80`,children:i(`chat.skipped`)});switch(e.kind){case`multiselect`:return(0,U.jsx)(U.Fragment,{children:t.map(O).join(`, `)});case`select`:return(0,U.jsx)(U.Fragment,{children:O(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(l,{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: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,U.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,U.jsx)(N,{className:`size-4`}),` `,i(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)(b,{className:`size-4`}),` `,i(`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:i(`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&&!m(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 a=`${t}:${r.id}`;if(r.type===`page`){let t=r.fields.length===1?r.fields[0]:void 0;n.push(...Ge(r,a,e.values,e.id,Ke(r,e.values),t))}else r.type===`review`&&(n.push(G(a,(0,U.jsx)(`span`,{className:`font-medium`,children:r.title}))),n.push(K(`${a}:a`,i(`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=>!m(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 o=(0,H.useMemo)(()=>Je(n,e),[n,e]),s=e.known??{},[c,l]=(0,H.useState)(()=>I(n,e)),[u,d]=(0,H.useState)(()=>n.fields.some(t=>e.values[t.id]!==void 0)?a(Je(n,e),e.known??{},I(n,e)).slice(0,-1).map(e=>e.id):[]),[f,p]=(0,H.useState)({}),[m,h]=(0,H.useState)(!1),[g,_]=(0,H.useState)(!1),v=a(o,s,c),y=v.filter(e=>u.includes(e.id)),b=v.find(e=>!u.includes(e.id)),x=o.length===1?o[0]:void 0,S=y.at(-1),C=S?()=>d(e=>e.filter(e=>e!==S.id)):void 0;(0,H.useEffect)(()=>{let e=Object.keys(t.fieldErrors),n=a(o,s,c),r=n.findIndex(t=>e.includes(t.id));r>=0&&(d(n.slice(0,r).map(e=>e.id)),p(t.fieldErrors))},[t.fieldErrors]);let w=e=>{t.submitPage(n.id,e).then(_)},E=(0,H.useContext)(q),D=(0,H.useRef)(c);D.current=c;let O=E?.bindPage,k=(0,H.useRef)(w);k.current=w,(0,H.useEffect)(()=>{if(!O)return;let e=a(o,s,c);return O({step:n,fields:e,values:c,setField:(t,n)=>{let r=e.find(e=>e.id===t);return r?Be(r,n)||(l(e=>({...e,[t]:n})),d(e=>e.includes(t)?e:[...e,t]),p({}),null):`no such field on this page`},submit:()=>k.current(D.current)}),()=>O(null)},[O,n,o,s,c]);let A=e=>{if(!b)return!1;let t=Be(b,e);if(t)return p({[b.id]:t}),!1;let n={...c,[b.id]:e},r=[...u,b.id];return l(n),d(r),p({}),a(o,s,n).some(e=>!r.includes(e.id))||w(n),!0},j=[...r.map(e=>u.length?{...e,onEdit:void 0}:e),...Ge(n,`now:${n.id}`,c,e.id,y,x).map((e,t,n)=>t===n.length-1&&e.who===`me`&&b?{...e,onEdit:C}:e)];b?(Re(b)===`control`?j.push(G(`now:${n.id}:${b.id}:control`,(0,U.jsx)(T,{field:b,value:c[b.id],values:c,runId:e.id,view:e,closed:e.closed?.[b.id],onChange:e=>l(t=>({...t,[b.id]:e})),onBusy:h}),{wide:!0})):x||j.push(G(`now:${n.id}:${b.id}`,(0,U.jsx)(He,{field:b}))),f[b.id]&&j.push(G(`now:${n.id}:${b.id}:error`,f[b.id],{tone:`error`}))):t.busy||g?j.push(G(`sending`,(0,U.jsx)(Ie,{}))):t.error&&j.push(G(`send-error`,t.error,{tone:`error`}));let M=(0,U.jsx)(Q,{});if(g||!b&&u.length>0&&t.busy)M=(0,U.jsx)(Q,{placeholder:i(`run.working`)});else if(!b)j.push(X(`now:${n.id}:go`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(Z,{primary:!0,busy:t.busy,onClick:()=>w(c),children:n.cta||i(`run.next`)}),C?(0,U.jsx)(Z,{onClick:C,disabled:t.busy,children:i(`run.back`)}):null]})));else{let r=Re(b),a=!b.required&&b.kind!==`connection`&&b.kind!==`list`?(0,U.jsx)(Z,{onClick:()=>A(void 0),children:i(`chat.skip`)}):null;if(r===`typed`){a&&j.push(X(`now:${n.id}:${b.id}:replies`,a));let e=c[b.id];M=(0,U.jsx)(Pe,{children:(0,U.jsx)(Le,{initial:ze(e)?``:String(e),multiline:b.kind===`textarea`,placeholder:b.placeholder||(x?b.label:i(`chat.placeholder`)),inputProps:Xe(b),busy:t.busy,onSend:e=>A(Ve(b,e))},b.id)})}else if(r===`tapped`)j.push(G(`now:${n.id}:${b.id}:replies`,(0,U.jsx)(Ze,{field:b,view:e,value:c[b.id],onAnswer:A}),{bare:!0}));else{let e=v.filter(e=>!u.includes(e.id)).length===1;j.push(X(`now:${n.id}:${b.id}:replies`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(Z,{primary:!0,disabled:m,onClick:()=>A(c[b.id]),children:e&&n.cta?n.cta:i(`chat.send`)}),a]})))}}return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:e.wizard.avatar,lines:j}),M]})}function Xe(e){switch(e.kind){case`number`:return{inputMode:`decimal`,autoComplete:`off`};case`email`:return{type:`email`,inputMode:`email`,autoComplete:`email`,autoCapitalize:`off`,autoCorrect:`off`,spellCheck:!1};case`url`:return{inputMode:`url`,autoComplete:`url`,autoCapitalize:`off`,autoCorrect:`off`,spellCheck:!1};case`date`:return{type:`date`};default:return ee(e)}}function Ze({field:e,view:t,value:n,onAnswer:r}){let a=new Set(t.closed?.[e.id]?.values.map(String)),[o,s]=(0,H.useState)(Array.isArray(n)?n:[]);if(e.kind===`toggle`)return(0,U.jsxs)(Y,{children:[(0,U.jsx)(Z,{on:n===!1,disabled:a.has(`false`),onClick:()=>r(!1),children:i(`run.no`)}),(0,U.jsx)(Z,{on:n===!0,disabled:a.has(`true`),onClick:()=>r(!0),children:i(`run.yes`)})]});let c=e.options??[];return e.kind===`multiselect`?(0,U.jsxs)(Y,{children:[c.map(e=>(0,U.jsx)(Z,{on:o.includes(e),onClick:()=>s(t=>t.includes(e)?t.filter(t=>t!==e):c.filter(n=>n===e||t.includes(n))),children:O(e)},e)),(0,U.jsx)(Z,{primary:!0,disabled:e.required&&!o.length,onClick:()=>r(o),children:o.length||e.required?i(`chat.send`):i(`chat.skip`)})]}):(0,U.jsxs)(Y,{children:[c.map(e=>(0,U.jsx)(Z,{on:n===e,disabled:a.has(e),onClick:()=>r(e),children:O(e)},e)),e.required?null:(0,U.jsx)(Z,{onClick:()=>r(void 0),children:i(`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(),[a,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:d(`flex max-w-full flex-col gap-1`,l?`w-full`:`w-96`),"data-say-text":t?.message??e.step?.title??i(`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??i(`run.working`)}),(0,U.jsx)(`span`,{className:`text-[0.75rem] text-ink-4 tabular-nums`,children:i(`run.elapsed`,{s:Math.max(0,Math.round((a-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)(j,{className:`size-3.5 shrink-0 animate-breathe text-ember`}),(0,U.jsx)(`span`,{className:`truncate`,children:M(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),[a,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=()=>v.get(`/api/runs/${e}/browser/seat`).then(e=>o(e.seat)).catch(()=>void 0);if(t(),a!==`person`)return;let n=setInterval(t,tt);return()=>clearInterval(n)},[e,a]),n!==null&&n>=t.id)return null;let u=a===`person`,f=async()=>{c(!0);try{let t=await v.post(`/api/runs/${e}/browser/seat`,{to:u?`agent`:`person`});o(t.seat)}catch{}finally{c(!1)}};return(0,U.jsx)(te,{runId:e,driving:u,caption:M(t),hint:i(`browser.driving`),onBroken:()=>r(t.id),className:`mt-1.5`,action:(0,U.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,U.jsx)(_e,{className:`size-3.5`}):(0,U.jsx)(he,{className:`size-3.5`}),i(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:a,onNote:o}){let s=e.shown.filter(e=>e.output),[c,l]=(0,H.useState)(s.length===1?s[0].step.id:null),u=(0,H.useRef)(null),d=[...r,...a.map((e,t)=>K(`review:${n.id}:asked:${t}`,e)),G(`review:${n.id}`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`span`,{className:`font-medium`,children:n.title}),n.description?(0,U.jsx)(`span`,{className:`mt-0.5 block text-ink-2`,children:n.description}):null]}),{anchor:!0}),...s.map(({step:t,output:r})=>G(`review:${n.id}:${t.id}`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)($,{children:t.title}),(0,U.jsx)(F,{base:`/api/runs/${e.id}`,step:t,output:r,onSurfaceAction:n.regenerate?()=>{l(t.id),u.current?.focus()}:void 0})]}),{wide:!0})),...e.lists.map(t=>G(`review:${n.id}:list:${t.def.id}`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)($,{children:t.def.title}),t.def.check?(0,U.jsx)(S,{runId:e.id,list:t}):(0,U.jsx)(A,{runId:e.id,list:t,editable:!0})]}),{wide:!0}))];t.error&&d.push(G(`review-error`,t.error,{tone:`error`}));let f=n.regenerate&&s.length>0;return d.push(X(`review:${n.id}:replies`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(Z,{primary:!0,busy:t.busy,onClick:()=>void t.accept(n.id),children:[(0,U.jsx)(B,{className:`size-4`}),` `,i(`run.accept`)]}),f&&s.length>1?s.map(({step:e})=>(0,U.jsx)(Z,{on:c===e.id,onClick:()=>l(e.id),children:e.title},e.id)):null]}))),(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:e.wizard.avatar,lines:d}),f?(0,U.jsx)(Pe,{children:(0,U.jsx)(Le,{multiline:!0,inputRef:u,busy:t.busy,placeholder:s.length>1&&!c?i(`run.feedbackPick`):i(`run.feedbackPlaceholder`),disabled:!c,onSend:e=>{let r=e.trim();return!r||!c?!1:(o(r),t.regenerate(n.id,c,r),!0)}})}):(0,U.jsx)(Q,{})]})}function it({view:e,run:t,step:n,before:r,onRestart:a}){let o=e.shown.filter(e=>e.output),s=`/api/runs/${e.id}`,c=[...r,G(`result:${n.id}`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`span`,{className:`font-display font-semibold text-[1.0625rem]`,children:n.title}),n.message?(0,U.jsx)(`span`,{className:`mt-0.5 block text-ink-2`,children:n.message}):null]}),{anchor:!0}),...o.map(({step:e,output:t,formats:n,label:r})=>G(`result:${e.id}`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)($,{end:(0,U.jsx)(P,{base:s,stepId:e.id,formats:n,title:r??e.title}),children:r??e.title}),(0,U.jsx)(F,{base:s,step:e,output:t}),t?.assets?.some(e=>e.ai)?(0,U.jsx)(`p`,{className:`mt-3 text-[0.75rem] text-ink-3 leading-relaxed`,children:i(`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)(w,{runId:e.id,list:t}),children:t.label??t.def.title}),(0,U.jsx)(A,{runId:e.id,list:t,editable:!0})]}),{wide:!0}))];return c.push(X(`result:replies`,(0,U.jsxs)(U.Fragment,{children:[o.length?(0,U.jsx)(fe,{runId:e.id,title:`${n.title} · ${e.wizard.title}`,initial:e.shareUrl?{url:e.shareUrl,expiresAt:e.expiresAt}:null}):null,a?(0,U.jsxs)(Z,{onClick:a,children:[(0,U.jsx)(y,{className:`size-4`}),` `,i(`run.again`)]}):null,e.canBack?(0,U.jsx)(Z,{onClick:()=>void t.back(),disabled:t.busy,children:i(`run.back`)}):null,e.keeps?(0,U.jsx)(`span`,{className:`ml-1`,children:(0,U.jsx)(D,{runId:e.id})}):null]}))),(0,U.jsx)(J,{avatar:e.wizard.avatar,lines:c})}function at({runId:e,onRestart:t,onView:n,header:r,footer:a,talk:o=!1,call:s=!1}){let c=pe(e),{view:u}=c,[d,f]=(0,H.useState)(null),m=je(e,u,c,d);(0,H.useEffect)(()=>{n?.(u)},[u,n]);let[h,g]=le(),v=(0,H.useMemo)(()=>({runId:e,lang:u?.lang??l,readAloud:h,setReadAloud:g,voice:u?.talk?m:null,talk:o,call:!!s,bindPage:f}),[e,u?.lang,u?.talk,h,g,m,o,s]);ne(u?.status===`running`&&!u.ask),k(u);let[b,S]=(0,H.useState)({}),[C,w]=(0,H.useState)(null);(0,H.useEffect)(()=>{u&&u.status!==`running`&&w(null)},[u]);let T;if(c.notFound)T=(0,U.jsx)(`div`,{className:`py-24 text-center text-ink-3`,children:i(`run.notFound`)});else if(!u)T=(0,U.jsx)(`div`,{className:`flex justify-center py-24 text-ink-4`,children:(0,U.jsx)(_,{})});else{let e=u.step,n=u.status===`waiting_input`,r=qe(u,u.canBack&&n&&!c.busy?()=>void c.back():void 0);if(u.status===`running`&&u.ask)T=(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:u.wizard.avatar,lines:[...r,G(`ask:${u.ask.id}`,(0,U.jsx)(x,{runId:u.id,ask:u.ask}),{wide:!0})]}),(0,U.jsx)(Q,{})]});else if(u.status===`running`)T=(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:u.wizard.avatar,lines:[...r,...C?[K(`note`,C)]:[],G(`working:${e?.id}`,(0,U.jsx)(Qe,{view:u}),{wide:u.events.some(t=>t.stepId===e?.id&&et(t))?`most`:void 0})]}),(0,U.jsx)(Q,{placeholder:i(`run.working`)})]});else if(u.status===`failed`)T=(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(J,{avatar:u.wizard.avatar,lines:[...r,G(`failed`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`span`,{className:`font-medium`,children:i(`run.failed`)}),u.error?(0,U.jsx)(`span`,{className:`mt-0.5 block`,children:(0,U.jsx)(p,{text:u.error})}):null]}),{tone:`error`}),X(`failed:replies`,(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(Z,{primary:!0,busy:c.busy,onClick:()=>void c.retry(),children:[(0,U.jsx)(y,{className:`size-4`}),` `,i(`run.retry`)]}),u.canBack?(0,U.jsx)(Z,{onClick:()=>void c.back(),disabled:c.busy,children:i(`run.back`)}):null]}))]}),(0,U.jsx)(Q,{})]});else if(u.status===`cancelled`)T=(0,U.jsx)(J,{avatar:u.wizard.avatar,lines:[...r,G(`cancelled`,i(`run.cancelled`)),...t?[X(`cancelled:replies`,(0,U.jsxs)(Z,{primary:!0,onClick:t,children:[(0,U.jsx)(y,{className:`size-4`}),` `,i(`run.again`)]}))]:[]]});else if(e?.type===`page`)T=(0,U.jsx)(Ye,{view:u,run:c,step:e,before:r},e.id);else if(e?.type===`review`){let t=u.shown.map(e=>e.output?.at??``).join(`|`);T=(0,U.jsx)(rt,{view:u,run:c,step:e,before:r,asked:b[e.id]??[],onNote:t=>{w(t),S(n=>({...n,[e.id]:[...n[e.id]??[],t]}))}},`${e.id}:${t}`)}else T=e?.type===`result`?(0,U.jsx)(it,{view:u,run:c,step:e,before:r,onRestart:t}):(0,U.jsx)(J,{avatar:u.wizard.avatar,lines:r})}return s?(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:m,view:u,video:s===`video`,className:`h-[46dvh] shrink-0 lg:h-auto lg:min-h-0 lg:flex-1`}),(0,U.jsx)(`aside`,{className:`flex min-h-0 flex-1 flex-col border-border-soft border-t lg:w-[420px] lg:flex-none lg:border-t-0 lg:border-l`,children:(0,U.jsx)(Fe,{footer:a,children:T})})]})}):(0,U.jsx)(q.Provider,{value:v,children:(0,U.jsx)(Fe,{header:r,footer:a,children:T})})}export{J as a,Z as i,Fe as n,X as o,Q as r,Ne as s,at as t};
|